首页
社区
课程
招聘
[求助]动态加载驱动的问题,请大家帮忙,我是菜鸟
发表于: 2008-9-6 23:17 6535

[求助]动态加载驱动的问题,请大家帮忙,我是菜鸟

2008-9-6 23:17
6535
下面是一段加载驱动的代码,这段代码可以实现驱动的加载,但是现在出现一个问题就是,我把SERVICE_DEMAND_START 改成 SERVICE_BOOT_START 之后,重启系统,该驱动不能自动加载,请问,如果动态加载之后,可以在系统重新启动之后,让驱动自动加载,请大家帮忙!

BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)
{
        char szDriverImagePath[256];
        //得到完整的驱动路径
        //GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);
        GetSystemDirectory(szDriverImagePath,sizeof(szDriverImagePath));
        strcat(szDriverImagePath,"\\drivers\\Cyber02Hide.sys");
        BOOL bRet = FALSE;

        SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
        SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄

        //打开服务控制管理器
        hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

        if( hServiceMgr == NULL )  
        {
                //OpenSCManager失败
                printf( "OpenSCManager() Faild %d ! \n", GetLastError() );
                bRet = FALSE;
                goto BeforeLeave;
        }
        else
        {
                ////OpenSCManager成功
                printf( "OpenSCManager() ok ! \n" );  
        }

        //创建驱动所对应的服务
        hServiceDDK = CreateService( hServiceMgr,
                lpszDriverName, //驱动程序的在注册表中的名字  
                lpszDriverName, // 注册表驱动程序的 DisplayName 值  
                SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限  
                SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序  
                //SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值  
                SERVICE_BOOT_START, //系统启动时启动该驱动
                SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值  
                szDriverImagePath, // 注册表驱动程序的 ImagePath 值  
                NULL,  
                NULL,  
                NULL,  
                NULL,  
                NULL);  

        DWORD dwRtn;
        //判断服务是否失败
        if( hServiceDDK == NULL )  
        {  
                dwRtn = GetLastError();
                if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )  
                {  
                        //由于其他原因创建服务失败
                        printf( "CreateService() Faild %d ! \n", dwRtn );  
                        bRet = FALSE;
                        goto BeforeLeave;
                }  
                else  
                {
                        //服务创建失败,是由于服务已经创立过
                        printf( "CreateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );  
                }

                // 驱动程序已经加载,只需要打开  
                hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );  
                if( hServiceDDK == NULL )  
                {
                        //如果打开服务也失败,则意味错误
                        dwRtn = GetLastError();  
                        printf( "OpenService() Faild %d ! \n", dwRtn );  
                        bRet = FALSE;
                        goto BeforeLeave;
                }  
                else
                {
                        printf( "OpenService() ok ! \n" );
                }
        }  
        else  
        {
                printf( "CreateService() ok ! \n" );
        }

        //开启此项服务
        bRet= StartService(hServiceDDK, NULL, NULL );  
        if( !bRet )  
        {  
                DWORD dwRtn = GetLastError();  
                if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )  
                {  
                        printf( "StartService() Faild %d ! \n", dwRtn );  
                        bRet = FALSE;
                        goto BeforeLeave;
                }  
                else  
                {  
                        if( dwRtn == ERROR_IO_PENDING )  
                        {  
                                //设备被挂住
                                printf( "StartService() Faild ERROR_IO_PENDING ! \n");
                                bRet = FALSE;
                                goto BeforeLeave;
                        }  
                        else  
                        {  
                                //服务已经开启
                                printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
                                bRet = TRUE;
                                goto BeforeLeave;
                        }  
                }  
        }
        bRet = TRUE;
//离开前关闭句柄
BeforeLeave:
        if(hServiceDDK)
        {
                CloseServiceHandle(hServiceDDK);
        }
        if(hServiceMgr)
        {
                CloseServiceHandle(hServiceMgr);
        }
        return bRet;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没有人知道吗?
2008-9-7 10:52
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
如果代码没错,可能跟你的驱动类型有关系,不是所有的驱动都可以在boot时加载
2008-9-7 10:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我的驱动是文件驱动的,什么驱动类型不能启动时加载呢,而且如果我用一个inf 文件安装的话,该驱动是可以在启动的时候加载的,有没有其他代码可以加载驱动,让他在启动时加载呢
2008-9-7 12:17
0
游客
登录 | 注册 方可回帖
返回
//