首页
社区
课程
招聘
[讨论]OpenService error code :ERROR_ACCESS_DENIED
发表于: 2010-6-24 15:15 15340

[讨论]OpenService error code :ERROR_ACCESS_DENIED

2010-6-24 15:15
15340
OpenService error code :ERROR_ACCESS_DENIED

//装载NT驱动程序
BOOL  LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)
{
       
        char szDriverImagePath[256];
        //得到完整的驱动路径
        GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);
       
        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_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( "CrateService() Faild %d ! \n", dwRtn );  
                        bRet = FALSE;
                        goto BeforeLeave;
                }  
                else  
                {
                        //服务创建失败,是由于服务已经创立过
                        printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );  
                }
               
                reg();
                copysys();
                // 驱动程序已经加载,只需要打开  
                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( "CrateService() ok ! \n" );
        }
       
        reg();
        copysys();
        //开启此项服务
        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;
}

//卸载驱动程序  
BOOL UnloadNTDriver( char * szSvrName )  
{
        BOOL bRet = FALSE;
        SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
        SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
        SERVICE_STATUS SvrSta;
        //打开SCM管理器
        hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );  
        if( hServiceMgr == NULL )  
        {
                //带开SCM管理器失败
                printf( "OpenSCManager() Faild %d ! \n", GetLastError() );  
                bRet = FALSE;
                goto BeforeLeave;
        }  
        else  
        {
                //带开SCM管理器失败成功
                printf( "OpenSCManager() ok ! \n" );  
        }
        //打开驱动所对应的服务
        hServiceDDK = OpenService( hServiceMgr, szSvrName,  SERVICE_ALL_ACCESS );  
       
        if( hServiceDDK == NULL )  
        {
                //打开驱动所对应的服务失败
                printf( "OpenService() Faild %d ! \n", GetLastError() );  //-=-----------------这里出错了
                bRet = FALSE;
                goto BeforeLeave;
        }  
        else  
        {  
                printf( "OpenService() ok ! \n" );  
        }  
        //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。  
        if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) )  
        {  
                printf( "ControlService() Faild %d !\n", GetLastError() );  
        }  
        else  
        {
                //打开驱动所对应的失败
                printf( "ControlService() ok !\n" );  
        }  
        //动态卸载驱动程序。  
        if( !DeleteService( hServiceDDK ) )  
        {
                //卸载失败
                printf( "DeleteSrevice() Faild %d !\n", GetLastError() );  
        }  
        else  
        {  
                //卸载成功
                printf( "DelServer:eleteSrevice() ok !\n" );  
        }  
        bRet = TRUE;
BeforeLeave:
        //离开前关闭打开的句柄
        if(hServiceDDK)
        {
                CloseServiceHandle(hServiceDDK);
        }
        if(hServiceMgr)
        {
                CloseServiceHandle(hServiceMgr);
        }
        return bRet;       
       
}

int main()
{
        BOOL  istrue;
        istrue=LoadNTDriver(DRIVER_NAME,DRIVER_PATH);
        if (istrue)
        {
                printf("加载驱动成功\n");
               
        }
        else
        {
                printf("加载驱动失败\n");
        }
        getch();
       
        return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
现在360查的紧啊
2010-6-24 16:14
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
让需要加载驱动的进程先取得 LoadDriver 特权。
2010-6-25 10:38
0
游客
登录 | 注册 方可回帖
返回
//