zoukankan      html  css  js  c++  java
  • 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; }
  • 相关阅读:
    单点登录原理与简单实现
    关系型数据库中的关键字、主关键字和候选关键字
    无向图的顶点连通度
    memcmp()直接比较两个数组的大小
    静态字典树
    动态字典树
    poj 1149
    poj 2112 floyd+Dinic最大流+二分最小值
    POJ 1698 (二分图的多重匹配)
    网络流算法
  • 原文地址:https://www.cnblogs.com/qintangtao/p/2951528.html
Copyright © 2011-2022 走看看