热门标签 | 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驱动服务管理


推荐阅读
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • Qt中QSpinBox与QSlider的联动实现
    本文介绍如何在Qt框架下将QSpinBox和QSlider组件进行联动,使用户在拖动滑块或修改文本框中的数值时,两个组件能同步更新,从而提供更加直观和便捷的用户体验。 ... [详细]
  • 本文介绍了如何使用Java中的同步方法和同步代码块来实现两个线程的交替打印。一个线程负责打印1到52的数字,另一个线程负责打印A到Z的字母,确保输出顺序为12A34B...5152Z。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 探讨了在有序数列中实现多种查询和修改操作的高效数据结构设计,主要使用线段树与平衡树(Treap)结合的方法。 ... [详细]
  • Redis Hash 数据结构详解
    本文详细介绍了 Redis 中的 Hash 数据类型及其常用命令。Hash 类型用于存储键值对集合,支持多种操作如插入、查询、更新和删除字段值。此外,文章还探讨了 Hash 类型在实际业务场景中的应用,并提供了优化建议。 ... [详细]
  • 本文介绍了 Winter-1-C A + B II 问题的详细解题思路和测试数据。该问题要求计算两个大整数的和,并输出结果。我们将深入探讨如何处理大整数运算,确保在给定的时间和内存限制下正确求解。 ... [详细]
  • 哈密顿回路问题旨在寻找一个简单回路,该回路包含图中的每个顶点。本文将介绍如何判断给定的路径是否构成哈密顿回路。 ... [详细]
  • 本文探讨了在使用Selenium进行自动化测试时,由于webdriver对象实例化位置不同而导致浏览器闪退的问题,并提供了详细的代码示例和解决方案。 ... [详细]
  • 算法题解析:最短无序连续子数组
    本题探讨如何通过单调栈的方法,找到一个数组中最短的需要排序的连续子数组。通过正向和反向遍历,分别使用单调递增栈和单调递减栈来确定边界索引,从而定位出最小的无序子数组。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 回顾2014年,我经历了多个重要项目和学习阶段,取得了一定的成绩。新的一年即将到来,希望能在更多项目实践中继续成长。 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
  • 本文深入探讨了线性代数中向量的线性关系,包括线性相关性和极大线性无关组的概念。通过分析线性方程组和向量组的秩,帮助读者理解这些概念在实际问题中的应用。 ... [详细]
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社区 版权所有