动态加载驱动 DDK

    技术2022-05-19  40

    转自:http://laokaddk.blog.51cto.com/368606/411887

     

    以服务的方式,动态加载驱动

    以后就是两个实现这两个功能的函数. //================================================================= //函数名:StopDriver //功能:  暂停驱动 //参数: //  IN strDriverName  驱动名 //  IN strServiceName 服务名 //返回值: //  TRUE  成功 //  FALSE 失败 //================================================================= BOOL StopDriver(IN LPCSTR strDriverName,     IN LPCSTR strServiceName) {  SC_HANDLE hMangerHandle = NULL;  SC_HANDLE hCreateServiceHandle = NULL;  SC_HANDLE hOpenServiceHandle = NULL;  SERVICE_STATUS sStatus ;  DWORD dwErrCode = 0;  BOOL bRet = TRUE;

     do   {   //1.打开服务控制管理器   hMangerHandle = ::OpenSCManager(NULL,    NULL,    SC_MANAGER_ALL_ACCESS);   if(!hMangerHandle)   {    bRet = FALSE;    break;   }

     

      //2. 打开service   hOpenServiceHandle = OpenService(hMangerHandle, strServiceName,    SERVICE_START | DELETE | SERVICE_STOP);   if (!hOpenServiceHandle)   {    dwErrCode = ::GetLastError();    bRet = FALSE;    break;   }

      //4.启动服务程序   bRet = ControlService(hOpenServiceHandle, SERVICE_CONTROL_STOP, &sStatus);   if (!bRet)   {    bRet = FALSE;    break;   }

      //删除服务   bRet = DeleteService(hOpenServiceHandle);

     

     } while (0);

     if (hOpenServiceHandle)  {   CloseServiceHandle(hOpenServiceHandle);   hOpenServiceHandle = NULL;  }  if (hCreateServiceHandle)  {   CloseServiceHandle(hCreateServiceHandle);   hCreateServiceHandle = NULL;  }  if (hMangerHandle)  {   CloseServiceHandle(hMangerHandle);   hMangerHandle = NULL;  }

     return bRet; }

    //加载驱动 //================================================================= //函数名:StartDriver //功能:  以服务的方式启动驱动 //参数: //  IN strDriverName  驱动名 //  IN strServiceName 服务名 //  IN strDriverFilePath  文件路径 //返回值: //  TRUE  成功 //  FALSE 失败 //=================================================================

    BOOL StartDriver(IN LPCSTR strDriverName,      IN LPCSTR strServiceName,      IN LPCSTR strDriverFilePath) {  SC_HANDLE hMangerHandle = NULL;  SC_HANDLE hCreateServiceHandle = NULL;  SC_HANDLE hOpenServiceHandle = NULL;  SERVICE_STATUS sStatus ;  DWORD dwErrCode = 0;  BOOL bRet = TRUE;

     do   {   //1.打开服务控制管理器   hMangerHandle = ::OpenSCManager(NULL,           NULL,           SC_MANAGER_ALL_ACCESS);   if(!hMangerHandle)   {    bRet = FALSE;    break;   }

      //2. 创建service   hCreateServiceHandle = CreateService(hMangerHandle,             strServiceName,             strDriverName,             SERVICE_ALL_ACCESS,             SERVICE_KERNEL_DRIVER,//SERVICE_FILE_SYSTEM_DRIVER             SERVICE_DEMAND_START,             SERVICE_ERROR_IGNORE,             strDriverFilePath,             NULL,             NULL,             NULL,             NULL,             NULL);   if (!hCreateServiceHandle)   {    dwErrCode = ::GetLastError();    if (ERROR_SERVICE_EXISTS != dwErrCode)    {     bRet = FALSE;     break;    }

      }

      //3. 打开service   hOpenServiceHandle = OpenService(hMangerHandle, strServiceName,    SERVICE_START | DELETE | SERVICE_STOP);   if (!hOpenServiceHandle)   {    dwErrCode = ::GetLastError();    bRet = FALSE;    break;   }

      //4.启动服务程序   bRet = StartService(hOpenServiceHandle,NULL, NULL);   if (FALSE == bRet)   {    dwErrCode = ::GetLastError();    bRet = FALSE;    break;   }

     } while (0);

     if (hOpenServiceHandle)  {   CloseServiceHandle(hOpenServiceHandle);   hOpenServiceHandle = NULL;  }  if (hCreateServiceHandle)  {   CloseServiceHandle(hCreateServiceHandle);   hCreateServiceHandle = NULL;  }  if (hMangerHandle)  {   CloseServiceHandle(hMangerHandle);   hMangerHandle = NULL;  }

     

     return bRet; }


    最新回复(0)