VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 512|回复: 1

[转载] Minifilter的动态安装、加载及卸载

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-1 11:21:25 | 显示全部楼层 |阅读模式
MINIFILTER框架的文件系统过滤驱动,无法使用的CreateService和OpenService进行动态加载。
看了一下,使用Inf文件安装Minifilter驱动的方式是在注册表驱动服务项下比传统驱动多创建了Instances子键,然后读取DefaultInstance值,这个值标明了Instance选项,然后,再去读指定的Instance的Altitude和Flags值。

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

知道两者区别后就很容易通过些注册表的方式进行Minifilter的动态安装。下面是实现代码

头文件实现:
  1. #include <winsvc.h>
  2. #include <winioctl.h>

  3. #define DRIVER_NAME "HelloDDK"
  4. #define DRIVER_PATH ".\\HelloDDK.sys"

  5. BOOL InstallDriver(const char* lpszDriverName,const char* lpszDriverPath,const char* lpszAltitude);
  6. BOOL StartDriver(const char* lpszDriverName);
  7. BOOL StopDriver(const char* lpszDriverName);
  8. BOOL DeleteDriver(const char* lpszDriverName);
复制代码


CPP文件实现:

  1. #include "stdafx.h"
  2. #include "SysLoader.h"

  3. //======================================== 动态加载/卸载sys驱动 ======================================
  4. // SYS文件跟程序放在同个目录下
  5. // 如果产生的SYS名为HelloDDK.sys,那么安装驱动InstallDriver("HelloDDK",".\\HelloDDK.sys","370030"/*Altitude*/);
  6. // 启动驱动服务 StartDriver("HelloDDK");
  7. // 停止驱动服务 StopDriver("HelloDDK");
  8. // 卸载SYS也是类似的调用过程, DeleteDriver("HelloDDK");
  9. //====================================================================================================

  10. BOOL InstallDriver(const char* lpszDriverName,const char* lpszDriverPath,const char* lpszAltitude)
  11. {
  12.     char    szTempStr[MAX_PATH];
  13.     HKEY    hKey;
  14.     DWORD    dwData;
  15.     char    szDriverImagePath[MAX_PATH];   

  16.     if( NULL==lpszDriverName || NULL==lpszDriverPath )
  17.     {
  18.         return FALSE;
  19.     }
  20.     //得到完整的驱动路径
  21.     GetFullPathName(lpszDriverPath, MAX_PATH, szDriverImagePath, NULL);

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

  24.     //打开服务控制管理器
  25.     hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
  26.     if( hServiceMgr == NULL )
  27.     {
  28.         // OpenSCManager失败
  29.         CloseServiceHandle(hServiceMgr);
  30.         return FALSE;        
  31.     }

  32.     // OpenSCManager成功  

  33.     //创建驱动所对应的服务
  34.     hService = CreateService( hServiceMgr,
  35.         lpszDriverName,             // 驱动程序的在注册表中的名字
  36.         lpszDriverName,             // 注册表驱动程序的DisplayName 值
  37.         SERVICE_ALL_ACCESS,         // 加载驱动程序的访问权限
  38.         SERVICE_FILE_SYSTEM_DRIVER, // 表示加载的服务是文件系统驱动程序
  39.         SERVICE_DEMAND_START,       // 注册表驱动程序的Start 值
  40.         SERVICE_ERROR_IGNORE,       // 注册表驱动程序的ErrorControl 值
  41.         szDriverImagePath,          // 注册表驱动程序的ImagePath 值
  42.         "FSFilter Activity Monitor",// 注册表驱动程序的Group 值
  43.         NULL,
  44.         "FltMgr",                   // 注册表驱动程序的DependOnService 值
  45.         NULL,
  46.         NULL);

  47.     if( hService == NULL )
  48.     {        
  49.         if( GetLastError() == ERROR_SERVICE_EXISTS )
  50.         {
  51.             //服务创建失败,是由于服务已经创立过
  52.             CloseServiceHandle(hService);       // 服务句柄
  53.             CloseServiceHandle(hServiceMgr);    // SCM句柄
  54.             return TRUE;
  55.         }
  56.         else
  57.         {
  58.             CloseServiceHandle(hService);       // 服务句柄
  59.             CloseServiceHandle(hServiceMgr);    // SCM句柄
  60.             return FALSE;
  61.         }
  62.     }
  63.     CloseServiceHandle(hService);       // 服务句柄
  64.     CloseServiceHandle(hServiceMgr);    // SCM句柄

  65.     //-------------------------------------------------------------------------------------------------------
  66.     // SYSTEM\\CurrentControlSet\\Services\\DriverName\\Instances子健下的键值项
  67.     //-------------------------------------------------------------------------------------------------------
  68.     strcpy(szTempStr,"SYSTEM\\CurrentControlSet\\Services\");
  69.     strcat(szTempStr,lpszDriverName);
  70.     strcat(szTempStr,"\\Instances");
  71.     if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,szTempStr,0,"",TRUE,KEY_ALL_ACCESS,NULL,&hKey,(LPDWORD)&dwData)!=ERROR_SUCCESS)
  72.     {
  73.         return FALSE;
  74.     }
  75.     // 注册表驱动程序的DefaultInstance 值
  76.     strcpy(szTempStr,lpszDriverName);
  77.     strcat(szTempStr," Instance");
  78.     if(RegSetValueEx(hKey,"DefaultInstance",0,REG_SZ,(CONST BYTE*)szTempStr,(DWORD)strlen(szTempStr))!=ERROR_SUCCESS)
  79.     {
  80.         return FALSE;
  81.     }
  82.     RegFlushKey(hKey);//刷新注册表
  83.     RegCloseKey(hKey);
  84.     //-------------------------------------------------------------------------------------------------------

  85.     //-------------------------------------------------------------------------------------------------------
  86.     // SYSTEM\\CurrentControlSet\\Services\\DriverName\\Instances\\DriverName Instance子健下的键值项
  87.     //-------------------------------------------------------------------------------------------------------
  88.     strcpy(szTempStr,"SYSTEM\\CurrentControlSet\\Services\");
  89.     strcat(szTempStr,lpszDriverName);
  90.     strcat(szTempStr,"\\Instances\");
  91.     strcat(szTempStr,lpszDriverName);
  92.     strcat(szTempStr," Instance");
  93.     if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,szTempStr,0,"",TRUE,KEY_ALL_ACCESS,NULL,&hKey,(LPDWORD)&dwData)!=ERROR_SUCCESS)
  94.     {
  95.         return FALSE;
  96.     }
  97.     // 注册表驱动程序的Altitude 值
  98.     strcpy(szTempStr,lpszAltitude);
  99.     if(RegSetValueEx(hKey,"Altitude",0,REG_SZ,(CONST BYTE*)szTempStr,(DWORD)strlen(szTempStr))!=ERROR_SUCCESS)
  100.     {
  101.         return FALSE;
  102.     }
  103.     // 注册表驱动程序的Flags 值
  104.     dwData=0x0;
  105.     if(RegSetValueEx(hKey,"Flags",0,REG_DWORD,(CONST BYTE*)&dwData,sizeof(DWORD))!=ERROR_SUCCESS)
  106.     {
  107.         return FALSE;
  108.     }
  109.     RegFlushKey(hKey);//刷新注册表
  110.     RegCloseKey(hKey);
  111.     //-------------------------------------------------------------------------------------------------------

  112.     return TRUE;
  113. }

  114. BOOL StartDriver(const char* lpszDriverName)
  115. {
  116.     SC_HANDLE        schManager;
  117.     SC_HANDLE        schService;
  118.     SERVICE_STATUS    svcStatus;

  119.     if(NULL==lpszDriverName)
  120.     {
  121.         return FALSE;
  122.     }

  123.     schManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  124.     if(NULL==schManager)
  125.     {
  126.         CloseServiceHandle(schManager);
  127.         return FALSE;
  128.     }
  129.     schService=OpenService(schManager,lpszDriverName,SERVICE_ALL_ACCESS);
  130.     if(NULL==schService)
  131.     {
  132.         CloseServiceHandle(schService);
  133.         CloseServiceHandle(schManager);
  134.         return FALSE;
  135.     }

  136.     if(!StartService(schService,0,NULL))
  137.     {
  138.         CloseServiceHandle(schService);
  139.         CloseServiceHandle(schManager);
  140.         if( GetLastError() == ERROR_SERVICE_ALREADY_RUNNING )
  141.         {            
  142.             // 服务已经开启
  143.             return TRUE;
  144.         }
  145.         return FALSE;
  146.     }
  147.    
  148.     CloseServiceHandle(schService);
  149.     CloseServiceHandle(schManager);

  150.     return TRUE;
  151. }

  152. BOOL StopDriver(const char* lpszDriverName)
  153. {
  154.     SC_HANDLE        schManager;
  155.     SC_HANDLE        schService;
  156.     SERVICE_STATUS    svcStatus;
  157.     bool            bStopped=false;

  158.     schManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  159.     if(NULL==schManager)
  160.     {
  161.         return FALSE;
  162.     }
  163.     schService=OpenService(schManager,lpszDriverName,SERVICE_ALL_ACCESS);
  164.     if(NULL==schService)
  165.     {
  166.         CloseServiceHandle(schManager);
  167.         return FALSE;
  168.     }   
  169.     if(!ControlService(schService,SERVICE_CONTROL_STOP,&svcStatus) && (svcStatus.dwCurrentState!=SERVICE_STOPPED))
  170.     {
  171.         CloseServiceHandle(schService);
  172.         CloseServiceHandle(schManager);
  173.         return FALSE;
  174.     }
  175.    
  176.     CloseServiceHandle(schService);
  177.     CloseServiceHandle(schManager);

  178.     return TRUE;
  179. }

  180. BOOL DeleteDriver(const char* lpszDriverName)
  181. {
  182.     SC_HANDLE        schManager;
  183.     SC_HANDLE        schService;
  184.     SERVICE_STATUS    svcStatus;

  185.     schManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  186.     if(NULL==schManager)
  187.     {
  188.         return FALSE;
  189.     }
  190.     schService=OpenService(schManager,lpszDriverName,SERVICE_ALL_ACCESS);
  191.     if(NULL==schService)
  192.     {
  193.         CloseServiceHandle(schManager);
  194.         return FALSE;
  195.     }
  196.     ControlService(schService,SERVICE_CONTROL_STOP,&svcStatus);
  197.     if(!DeleteService(schService))
  198.     {
  199.         CloseServiceHandle(schService);
  200.         CloseServiceHandle(schManager);
  201.         return FALSE;
  202.     }
  203.     CloseServiceHandle(schService);
  204.     CloseServiceHandle(schManager);

  205.     return TRUE;
  206. }
复制代码




上一篇:驱动开发有前途吗
下一篇:驱动开发基础知识,很全面!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-11 05:07

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表