qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 NT式驱动的安装

  •       A、OpenSCManager
  •       B、CreateService
  •       C、OpenService
  •       D、StartService
  •       E、CloseServiceHandle
  •       F、集成到loadNTDriver函数

 

#include <winsvc.h> 

正常加载驱动的步骤如下:

 1、调用OpenSCManager,打开SCM管理器。如果返回NULL,则返回失败,否则继续下一步;

 2、调用CreateService创建服务,如果用GetLastError获取的返回值为ERROR_IO_PENDING,说明服务已经创建过,此时用OpenService打开此服务.

 3、调用StartService开启服务

SC_HANDLE OpenSCManager(
 LPCTSTR lpMachineName, // 指向计算机名称,此处为NULL表示指向本机  
 LPCTSTR lpDatabaseName, // SCM数据库名称,此用为NULL表示使用默认
 DWORD dwDesiredAccess   // 使用权限 一般设置为SC_MANAGER_ALL_ACCESS表示有所有使用权限
);
BOOL CloseServiceHandle(   
SC_HANDLE hSCObject   // 要关闭的SCM句柄 
);
//打开服务控制管理器
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
//创建驱动所对应的服务
hServiceDDK = CreateService( hServiceMgr,//SCM管理器句柄 
    lpszDriverName, //驱动程序的在注册表中的名字  
    lpszDriverName, // 注册表驱动程序的 DisplayName 值  
    SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限  
    SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序  
    SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值  
    SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值  
    szDriverImagePath, // 注册表驱动程序的 ImagePath 值  
    NULL,              //要开启服务的 用户组
    NULL,  //输出验证标签
    NULL,   //所依赖的服务的名称
    NULL,   //用户账户名称
    NULL);  //用户口令
// 驱动程序已经加载,只需要打开  
hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );
//开启此项服务
bRet= StartService( hServiceDDK, NULL, NULL ); 

 

 集成到loadNTDriver函数

//装载NT驱动程序
BOOL LoadNTDriver(char* lpDriverName,char* lpDriverPathName)
{
   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失败
    TRACE( "OpenSCManager() Faild %d ! \n", GetLastError() );
    bRet = FALSE;
    goto BExit;
  }
  else
  {
    //OpenSCManager成功
    TRACE( "OpenSCManager() ok ! \n" );  
  }

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

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

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

  //开启此项服务
  bRet= StartService( hServiceDDK, NULL, NULL );  
  if( !bRet )  //开启服务不成功
  {  
    TRACE( "StartService() 失败 服务可能已经开启%d ! \n", dwRtn );  
  }

  bRet = TRUE;

//离开前关闭句柄
BExit:   if(hServiceDDK)   {     CloseServiceHandle(hServiceDDK);   }   if(hServiceMgr)   {     CloseServiceHandle(hServiceMgr);   }   return bRet; }
posted on 2013-03-09 14:23  qintangtao  阅读(1945)  评论(0编辑  收藏  举报