Minifilter的动态安装、加载及卸载

MINIFILTER框架的文件系统过滤驱动,无法使用的CreateService和OpenService进行动态加载。
看了一下,使用Inf文件安装Minifilter驱动的方式是在注册表驱动服务项下比传统驱动 多创建了Instances子键,然后读取DefaultInstance值,这个值标明了Instance选项,然后,再去读指定的Instance的Altitude和Flags值。
 
 
 
 头文件代码:
#include < winsvc.h >
#include
< winioctl.h >
#define DRIVER_NAME "HelloDDK"
#define DRIVER_PATH ".\\HelloDDK.sys"

BOOL InstallDriver(
const char * lpszDriverName, const char *     lpszDriverPath, const char * lpszAltitude);
BOOL StartDriver(
const char * lpszDriverName);
BOOL StopDriver(
const char * lpszDriverName);
BOOL DeleteDriver(
const char * lpszDriverName);
      源文件代码:
      #include " stdafx.h "
      #include
      " SysLoader.h "

      // ================ 动态加载/卸载sys驱动 ======================
      // SYS文件跟程序放在同个目录下
      // 如果产生的SYS名为HelloDDK.sys,那么安装驱动InstallDriver("HelloDDK",".\\HelloDDK.sys","370030"/*Altitude*/);
      // 启动驱动服务 StartDriver("HelloDDK");
      // 停止驱动服务 StopDriver("HelloDDK");
      // 卸载SYS也是类似的调用过程, DeleteDriver("HelloDDK");
      // ==========================================================
      BOOL InstallDriver(
      const char * lpszDriverName, const char * lpszDriverPath, const char * lpszAltitude)
      {
         
      char     szTempStr[MAX_PATH];
          HKEY    hKey;
          DWORD    dwData;
         
      char     szDriverImagePath[MAX_PATH];   

         
      if ( NULL == lpszDriverName || NULL == lpszDriverPath )
          {
             
      return FALSE;
          }
         
      // 得到完整的驱动路径
          GetFullPathName(lpszDriverPath, MAX_PATH, szDriverImagePath, NULL);

          SC_HANDLE hServiceMgr
      = NULL; // SCM管理器的句柄
          SC_HANDLE hService = NULL; // NT驱动程序的服务句柄

         
      // 打开服务控制管理器
          hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
         
      if ( hServiceMgr == NULL )
          {
             
      // OpenSCManager失败
              CloseServiceHandle(hServiceMgr);
             
      return FALSE;       
          }

         
      // OpenSCManager成功 

         
      // 创建驱动所对应的服务
          hService = CreateService( hServiceMgr,
              lpszDriverName,            
      // 驱动程序的在注册表中的名字
              lpszDriverName,             // 注册表驱动程序的DisplayName 值
              SERVICE_ALL_ACCESS,         // 加载驱动程序的访问权限
              SERVICE_FILE_SYSTEM_DRIVER, // 表示加载的服务是文件系统驱动程序
              SERVICE_DEMAND_START,       // 注册表驱动程序的Start 值
              SERVICE_ERROR_IGNORE,       // 注册表驱动程序的ErrorControl 值
              szDriverImagePath,          // 注册表驱动程序的ImagePath 值
              " FSFilter Activity Monitor " , // 注册表驱动程序的Group 值
              NULL,
             
      " FltMgr " ,                   // 注册表驱动程序的DependOnService 值
              NULL,
              NULL);

         
      if ( hService == NULL )
          {       
             
      if ( GetLastError() == ERROR_SERVICE_EXISTS )
              {
                 
      // 服务创建失败,是由于服务已经创立过
                  CloseServiceHandle(hService);       // 服务句柄
                  CloseServiceHandle(hServiceMgr);    // SCM句柄
                  return TRUE;
              }
             
      else
              {
                  CloseServiceHandle(hService);      
      // 服务句柄
                  CloseServiceHandle(hServiceMgr);    // SCM句柄
                  return FALSE;
              }
          }
          CloseServiceHandle(hService);      
      // 服务句柄
          CloseServiceHandle(hServiceMgr);    // SCM句柄

         
      // ---------------------------------------------------------
         
      // SYSTEM\\CurrentControlSet\\Services\\DriverName\\Instances子健下的键值项
         
      // ---------------------------------------------------------
          strcpy(szTempStr, " SYSTEM\\CurrentControlSet\\Services\\ " );
          strcat(szTempStr,lpszDriverName);
          strcat(szTempStr,
      " \\Instances " );
         
      if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,szTempStr, 0 , "" ,TRUE,KEY_ALL_ACCESS,NULL, & hKey,(LPDWORD) & dwData) != ERROR_SUCCESS)
          {
             
      return FALSE;
          }
         
      // 注册表驱动程序的DefaultInstance 值
          strcpy(szTempStr,lpszDriverName);
          strcat(szTempStr,
      " Instance " );
         
      if (RegSetValueEx(hKey, " DefaultInstance " , 0 ,REG_SZ,(CONST BYTE * )szTempStr,(DWORD)strlen(szTempStr)) != ERROR_SUCCESS)
          {
             
      return FALSE;
          }
          RegFlushKey(hKey);
      // 刷新注册表
          RegCloseKey(hKey);
         
      // ---------------------------------------------------------

         
      // ---------------------------------------------------------
         
      // SYSTEM\\CurrentControlSet\\Services\\DriverName\\Instances\\DriverName Instance子健下的键值项
         
      // ---------------------------------------------------------
          strcpy(szTempStr, " SYSTEM\\CurrentControlSet\\Services\\ " );
          strcat(szTempStr,lpszDriverName);
          strcat(szTempStr,
      " \\Instances\\ " );
          strcat(szTempStr,lpszDriverName);
          strcat(szTempStr,
      " Instance " );
         
      if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,szTempStr, 0 , "" ,TRUE,KEY_ALL_ACCESS,NULL, & hKey,(LPDWORD) & dwData) != ERROR_SUCCESS)
          {
             
      return FALSE;
          }
         
      // 注册表驱动程序的Altitude 值
          strcpy(szTempStr,lpszAltitude);
         
      if (RegSetValueEx(hKey, " Altitude " , 0 ,REG_SZ,(CONST BYTE * )szTempStr,(DWORD)strlen(szTempStr)) != ERROR_SUCCESS)
          {
             
      return FALSE;
          }
         
      // 注册表驱动程序的Flags 值
          dwData = 0x0 ;
         
      if (RegSetValueEx(hKey, " Flags " , 0 ,REG_DWORD,(CONST BYTE * ) & dwData, sizeof (DWORD)) != ERROR_SUCCESS)
          {
             
      return FALSE;
          }
          RegFlushKey(hKey);
      // 刷新注册表
          RegCloseKey(hKey);
         
      // ---------------------------------------------------------

         
      return TRUE;
      }

      BOOL StartDriver(
      const char * lpszDriverName)
      {
          SC_HANDLE        schManager;
          SC_HANDLE        schService;
          SERVICE_STATUS    svcStatus;

         
      if (NULL == lpszDriverName)
          {
             
      return FALSE;
          }

          schManager
      = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
         
      if (NULL == schManager)
          {
              CloseServiceHandle(schManager);
             
      return FALSE;
          }
          schService
      = OpenService(schManager,lpszDriverName,SERVICE_ALL_ACCESS);
         
      if (NULL == schService)
          {
              CloseServiceHandle(schService);
              CloseServiceHandle(schManager);
             
      return FALSE;
          }

         
      if ( ! StartService(schService, 0 ,NULL))
          {
              CloseServiceHandle(schService);
              CloseServiceHandle(schManager);
             
      if ( GetLastError() == ERROR_SERVICE_ALREADY_RUNNING )
              {            
                 
      // 服务已经开启
                  return TRUE;
              }
             
      return FALSE;
          }
         
          CloseServiceHandle(schService);
          CloseServiceHandle(schManager);

         
      return TRUE;
      }

      BOOL StopDriver(
      const char * lpszDriverName)
      {
          SC_HANDLE        schManager;
          SC_HANDLE        schService;
          SERVICE_STATUS    svcStatus;
         
      bool             bStopped = false ;

          schManager
      = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
         
      if (NULL == schManager)
          {
             
      return FALSE;
          }
          schService
      = OpenService(schManager,lpszDriverName,SERVICE_ALL_ACCESS);
         
      if (NULL == schService)
          {
              CloseServiceHandle(schManager);
             
      return FALSE;
          }   
         
      if ( ! ControlService(schService,SERVICE_CONTROL_STOP, & svcStatus) && (svcStatus.dwCurrentState != SERVICE_STOPPED))
          {
              CloseServiceHandle(schService);
              CloseServiceHandle(schManager);
             
      return FALSE;
          }
         
          CloseServiceHandle(schService);
          CloseServiceHandle(schManager);

         
      return TRUE;
      }

      BOOL DeleteDriver(
      const char * lpszDriverName)
      {
          SC_HANDLE        schManager;
          SC_HANDLE        schService;
          SERVICE_STATUS    svcStatus;

          schManager
      = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
         
      if (NULL == schManager)
          {
             
      return FALSE;
          }
          schService
      = OpenService(schManager,lpszDriverName,SERVICE_ALL_ACCESS);
         
      if (NULL == schService)
          {
              CloseServiceHandle(schManager);
             
      return FALSE;
          }
          ControlService(schService,SERVICE_CONTROL_STOP,
      & svcStatus);
         
      if ( ! DeleteService(schService))
          {
              CloseServiceHandle(schService);
              CloseServiceHandle(schManager);
             
      return FALSE;
          }
          CloseServiceHandle(schService);
          CloseServiceHandle(schManager);

         
      return TRUE;
      }
       
      出自: http://www.cnblogs.com/js2854/archive/2011/04/03.html

      你可能感兴趣的:(加载,卸载,休闲,动态安装,minifilter)