热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

minifilter驱动服务管理

1encryptServiceManage.cpp:定义控制台应用程序的入口点。234#includestdafx.h5#include6#include
技术分享图片技术分享图片
  1 // encryptServiceManage.cpp: 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include 
  6 #include 
  7 #include 
  8 
  9 
 10 #define DRIVER_NAME "HelloDDK"
 11 #define DRIVER_PATH ".\\HelloDDK.sys"
 12 
 13 //typedef bool BOOL;
 14 
 15 BOOL InstallDriver(LPCTSTR lpszDriverName, LPCTSTR lpszDriverPath, LPCTSTR lpszAltitude);
 16 
 17 BOOL StartDriver(LPCTSTR lpszDriverName);
 18 
 19 BOOL StopDriver(LPCTSTR lpszDriverName);
 20 
 21 BOOL DeleteDriver(LPCTSTR lpszDriverName);
 22 
 23 int _tmain(DWORD argc, PWCHAR* argv)
 24 {
 25     for (DWORD i = 0; i )
 26     {
 27         printf("argv[%d] = %ls\n", i, argv[i]);
 28     }
 29     printf("\n");
 30     if (argc == 4)
 31     {
 32         if (0 != lstrcmp(argv[1], TEXT("install")))
 33         {
 34             printf("Usage: argv[0] install ServiceName Altitude\n");
 35             return 1;
 36         }
 37         TCHAR imageName[MAX_PATH] = { 0 };
 38         lstrcpy(imageName, argv[2]);
 39         lstrcat(imageName, TEXT(".sys"));
 40         if (InstallDriver(argv[2], imageName, TEXT("145120")))
 41         {
 42             printf("服务安装成功!\n");
 43         }
 44         else {
 45             printf("服务安装失败\n");
 46             return 2;
 47         }    
 48     }
 49 
 50     else if (argc == 3)
 51     {
 52         if (0 != lstrcmp(argv[1], TEXT("start")) && 
 53             0 != lstrcmp(argv[1], TEXT("stop")) &&
 54             0 != lstrcmp(argv[1], TEXT("delete")))
 55         {
 56             printf("Usage: argv[0] start|stop|delete ServiceName\n");
 57             return 3;
 58         }
 59         if (0 == lstrcmp(argv[1], TEXT("start")))
 60         {
 61             if (StartDriver(argv[2]))
 62             {
 63                 printf("服务启动成功!\n");
 64             }
 65             else {
 66                 printf("服务启动失败\n");
 67                 return 4;
 68             }
 69         }
 70         else if (0 == lstrcmp(argv[1], TEXT("stop")))
 71         {
 72             if (StopDriver(argv[2]))
 73             {
 74                 printf("服务关闭成功!\n");
 75             }
 76             else {
 77                 printf("服务关闭失败\n");
 78                 return 5;
 79             }
 80         }
 81         else if((0 == lstrcmp(argv[1], TEXT("delete"))))
 82         {
 83             if (DeleteDriver(argv[2]))
 84             {
 85                 printf("服务卸载成功!\n");
 86             }
 87             else {
 88                 printf("服务卸载失败\n");
 89                 return 6;
 90             }
 91         }
 92     }
 93     else {
 94         printf("unknown command\n");
 95     }
 96 
 97     return 0;
 98 }
 99 
100 
101 //======================================== 动态加载/卸载sys驱动 ======================================
102 // SYS文件跟程序放在同个目录下
103 // 如果产生的SYS名为HelloDDK.sys,那么安装驱动InstallDriver("HelloDDK",".\\HelloDDK.sys","370030"/*Altitude*/);
104 // 启动驱动服务 StartDriver("HelloDDK");
105 // 停止驱动服务 StopDriver("HelloDDK");
106 // 卸载SYS也是类似的调用过程, DeleteDriver("HelloDDK");
107 //====================================================================================================
108 
109 BOOL InstallDriver(LPCTSTR lpszDriverName, LPCTSTR lpszDriverPath, LPCTSTR lpszAltitude)
110 {
111     TCHAR   szTempStr[MAX_PATH] = {0};
112     HKEY    hKey = 0;
113     DWORD   dwData = 0;
114     TCHAR   szDriverImagePath[MAX_PATH] = {0};
115     TCHAR   szDriverSysImagePath[MAX_PATH] = { 0 };
116 
117     if (NULL == lpszDriverName || NULL == lpszDriverPath)
118     {
119         return FALSE;
120     }
121     //得到当前完整的驱动路径
122     GetFullPathName(lpszDriverPath, MAX_PATH, szDriverImagePath, NULL);
123     //得到系统驱动存放目录
124     lstrcpy(szDriverSysImagePath, TEXT("C:\\Windows\\System32\\drivers\\"));
125     lstrcat(szDriverSysImagePath, lpszDriverPath);
126 
127     //将当前驱动文件复制到系统驱动目录
128     if (!CopyFile(szDriverImagePath, szDriverSysImagePath, FALSE))
129     {
130         printf("szDriverImagePath = %ls\n", szDriverImagePath);
131         printf("szDriverSysImagePath = %ls\n", szDriverSysImagePath);
132         printf("copy failure!\n");
133         return 8;
134     }
135 
136     SC_HANDLE hServiceMgr = NULL;// SCM管理器的句柄
137     SC_HANDLE hService = NULL;// NT驱动程序的服务句柄
138     
139                               //打开服务控制管理器
140     hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
141     if (hServiceMgr == NULL)
142     {
143         // OpenSCManager失败
144         CloseServiceHandle(hServiceMgr);
145         return FALSE;
146     }
147 
148     // OpenSCManager成功  
149 
150     //创建驱动所对应的服务
151     hService = CreateService(hServiceMgr,
152         lpszDriverName,             // 驱动程序的在注册表中的名字
153         lpszDriverName,             // 注册表驱动程序的DisplayName 值
154         SERVICE_ALL_ACCESS,         // 加载驱动程序的访问权限
155         SERVICE_FILE_SYSTEM_DRIVER, // 表示加载的服务是文件系统驱动程序
156         SERVICE_DEMAND_START,       // 注册表驱动程序的Start 值
157         SERVICE_ERROR_IGNORE,       // 注册表驱动程序的ErrorControl 值
158         szDriverSysImagePath,          // 注册表驱动程序的ImagePath 值
159         TEXT("FSFilter Activity Monitor"),// 注册表驱动程序的Group 值
160         NULL,
161         TEXT("FltMgr"),                   // 注册表驱动程序的DependOnService 值
162         NULL,
163         NULL);
164 
165     if (hService == NULL)
166     {
167         if (GetLastError() == ERROR_SERVICE_EXISTS)
168         {
169             //服务创建失败,是由于服务已经创立过
170             CloseServiceHandle(hService);       // 服务句柄
171             CloseServiceHandle(hServiceMgr);    // SCM句柄
172             return TRUE;
173         }
174         else
175         {
176             CloseServiceHandle(hService);       // 服务句柄
177             CloseServiceHandle(hServiceMgr);    // SCM句柄
178             return FALSE;
179         }
180     }
181     CloseServiceHandle(hService);       // 服务句柄
182     CloseServiceHandle(hServiceMgr);    // SCM句柄
183 
184                                         //-------------------------------------------------------------------------------------------------------
185                                         // SYSTEM\\CurrentControlSet\\Services\\DriverName\\Instances子健下的键值项 
186                                         //-------------------------------------------------------------------------------------------------------
187     lstrcpy(szTempStr, TEXT("SYSTEM\\CurrentControlSet\\Services\\"));
188     lstrcat(szTempStr, lpszDriverName);
189     lstrcat(szTempStr, TEXT("\\Instances"));
190     if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, szTempStr, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, (LPDWORD)&dwData) != ERROR_SUCCESS)
191     {
192         return FALSE;
193     }
194     // 注册表驱动程序的DefaultInstance 值 
195     lstrcpy(szTempStr, lpszDriverName);
196     lstrcat(szTempStr, TEXT(" Instance"));
197     printf("%ls length = %d\n", szTempStr, lstrlen(szTempStr));
198     if (RegSetValueEx(hKey, TEXT("DefaultInstance"), 0, REG_SZ, (CONST BYTE*)szTempStr, (DWORD)lstrlen(szTempStr) * sizeof(TCHAR)) != ERROR_SUCCESS)
199     {
200         return FALSE;
201     }
202     RegFlushKey(hKey);//刷新注册表
203     RegCloseKey(hKey);
204     //-------------------------------------------------------------------------------------------------------
205 
206     //-------------------------------------------------------------------------------------------------------
207     // SYSTEM\\CurrentControlSet\\Services\\DriverName\\Instances\\DriverName Instance子健下的键值项 
208     //-------------------------------------------------------------------------------------------------------
209     lstrcpy(szTempStr, TEXT("SYSTEM\\CurrentControlSet\\Services\\"));
210     lstrcat(szTempStr, lpszDriverName);
211     lstrcat(szTempStr, TEXT("\\Instances\\"));
212     lstrcat(szTempStr, lpszDriverName);
213     lstrcat(szTempStr, TEXT(" Instance"));
214     if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, szTempStr, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, (LPDWORD)&dwData) != ERROR_SUCCESS)
215     {
216         return FALSE;
217     }
218     // 注册表驱动程序的Altitude 值
219     lstrcpy(szTempStr, lpszAltitude);
220     //注意此处最后一个参数指的是字节为单位的长度
221     if (RegSetValueEx(hKey, TEXT("Altitude"), 0, REG_SZ, (CONST BYTE*)szTempStr, (DWORD)lstrlen(szTempStr) * sizeof(TCHAR)) != ERROR_SUCCESS)
222     {
223         return FALSE;
224     }
225     // 注册表驱动程序的Flags 值
226     dwData = 0x0;
227     if (RegSetValueEx(hKey, TEXT("Flags"), 0, REG_DWORD, (CONST BYTE*)&dwData, sizeof(DWORD)) != ERROR_SUCCESS)
228     {
229         return FALSE;
230     }
231     RegFlushKey(hKey);//刷新注册表
232     RegCloseKey(hKey);
233     //-------------------------------------------------------------------------------------------------------
234 
235     return TRUE;
236 }
237 
238 BOOL StartDriver(LPCTSTR lpszDriverName)
239 {
240     SC_HANDLE        schManager;
241     SC_HANDLE        schService;
242 //    SERVICE_STATUS    svcStatus;
243 
244     if (NULL == lpszDriverName)
245     {
246         return FALSE;
247     }
248 
249     schManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
250     if (NULL == schManager)
251     {
252         CloseServiceHandle(schManager);
253         return FALSE;
254     }
255     schService = OpenService(schManager, lpszDriverName, SERVICE_ALL_ACCESS);
256     if (NULL == schService)
257     {
258         CloseServiceHandle(schService);
259         CloseServiceHandle(schManager);
260         return FALSE;
261     }
262 
263     if (!StartService(schService, 0, NULL))
264     {
265         CloseServiceHandle(schService);
266         CloseServiceHandle(schManager);
267         if (GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
268         {
269             // 服务已经开启
270             return TRUE;
271         }
272         return FALSE;
273     }
274 
275     CloseServiceHandle(schService);
276     CloseServiceHandle(schManager);
277 
278     return TRUE;
279 }
280 
281 BOOL StopDriver(LPCTSTR lpszDriverName)
282 {
283     SC_HANDLE        schManager;
284     SC_HANDLE        schService;
285     SERVICE_STATUS    svcStatus;
286     bool            bStopped = false;
287 
288     schManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
289     if (NULL == schManager)
290     {
291         return FALSE;
292     }
293     schService = OpenService(schManager, lpszDriverName, SERVICE_ALL_ACCESS);
294     if (NULL == schService)
295     {
296         CloseServiceHandle(schManager);
297         return FALSE;
298     }
299     if (!ControlService(schService, SERVICE_CONTROL_STOP, &svcStatus) && (svcStatus.dwCurrentState != SERVICE_STOPPED))
300     {
301         CloseServiceHandle(schService);
302         CloseServiceHandle(schManager);
303         return FALSE;
304     }
305 
306     CloseServiceHandle(schService);
307     CloseServiceHandle(schManager);
308 
309     return TRUE;
310 }
311 
312 BOOL DeleteDriver(LPCTSTR lpszDriverName)
313 {
314     SC_HANDLE        schManager;
315     SC_HANDLE        schService;
316     SERVICE_STATUS    svcStatus;
317 
318     schManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
319     if (NULL == schManager)
320     {
321         return FALSE;
322     }
323     schService = OpenService(schManager, lpszDriverName, SERVICE_ALL_ACCESS);
324     if (NULL == schService)
325     {
326         CloseServiceHandle(schManager);
327         return FALSE;
328     }
329     ControlService(schService, SERVICE_CONTROL_STOP, &svcStatus);
330     if (!DeleteService(schService))
331     {
332         CloseServiceHandle(schService);
333         CloseServiceHandle(schManager);
334         return FALSE;
335     }
336     CloseServiceHandle(schService);
337     CloseServiceHandle(schManager);
338 
339     //删除驱动文件
340     TCHAR imagePath[MAX_PATH] = { 0 };
341     lstrcpy(imagePath, TEXT("C:\\Windows\\System32\\drivers\\"));
342     lstrcat(imagePath, lpszDriverName);
343     lstrcat(imagePath, TEXT(".sys"));
344     DeleteFile(imagePath);
345     return TRUE;
346 }
DriverServiceManage

minifilter驱动服务管理


推荐阅读
  • 本文探讨了使用普通生成函数和指数生成函数解决组合与排列问题的方法,特别是在处理特定路径计数问题时的应用。文章通过详细分析和代码实现,展示了如何高效地计算在给定条件下不相邻相同元素的排列数量。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • 本文探讨了一种常见的C++面试题目——实现自己的String类。通过此过程,不仅能够检验开发者对C++基础知识的掌握程度,还能加深对其高级特性的理解。文章详细介绍了如何实现基本的功能,如构造函数、析构函数、拷贝构造函数及赋值运算符重载等。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文详细介绍了iOS应用的生命周期,包括各个状态及其转换过程中的关键方法调用。 ... [详细]
  • 项目风险管理策略与实践
    本文探讨了项目风险管理的关键环节,包括风险管理规划、风险识别、风险分析(定性和定量)、风险应对策略规划及风险控制。旨在通过系统的方法提升项目成功率,减少不确定因素对项目的影响。 ... [详细]
  • 探索AI智能机器人自动盈利系统的构建
    用户可通过支付198元押金及30元设备维护费租赁AI智能机器人,推荐他人加入可获得相应佣金。随着推荐人数的增加,用户将逐步解锁更高版本,享受更多收益。 ... [详细]
author-avatar
拍友2502883387
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有