NT式驱动的安装

 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; }

你可能感兴趣的:(安装)