动态加载驱动 DDK

转自: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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值