minifilter驱动服务管理

Posted endenvor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了minifilter驱动服务管理相关的知识,希望对你有一定的参考价值。

技术分享图片
  1 // encryptServiceManage.cpp: 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <Windows.h>
  6 #include <winsvc.h>
  7 #include <winioctl.h>
  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 < argc; i++)
 26     {
 27         printf("argv[%d] = %ls
", i, argv[i]);
 28     }
 29     printf("
");
 30     if (argc == 4)
 31     {
 32         if (0 != lstrcmp(argv[1], TEXT("install")))
 33         {
 34             printf("Usage: argv[0] install ServiceName Altitude
");
 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("服务安装成功!
");
 43         }
 44         else {
 45             printf("服务安装失败
");
 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
");
 57             return 3;
 58         }
 59         if (0 == lstrcmp(argv[1], TEXT("start")))
 60         {
 61             if (StartDriver(argv[2]))
 62             {
 63                 printf("服务启动成功!
");
 64             }
 65             else {
 66                 printf("服务启动失败
");
 67                 return 4;
 68             }
 69         }
 70         else if (0 == lstrcmp(argv[1], TEXT("stop")))
 71         {
 72             if (StopDriver(argv[2]))
 73             {
 74                 printf("服务关闭成功!
");
 75             }
 76             else {
 77                 printf("服务关闭失败
");
 78                 return 5;
 79             }
 80         }
 81         else if((0 == lstrcmp(argv[1], TEXT("delete"))))
 82         {
 83             if (DeleteDriver(argv[2]))
 84             {
 85                 printf("服务卸载成功!
");
 86             }
 87             else {
 88                 printf("服务卸载失败
");
 89                 return 6;
 90             }
 91         }
 92     }
 93     else {
 94         printf("unknown command
");
 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
", szDriverImagePath);
131         printf("szDriverSysImagePath = %ls
", szDriverSysImagePath);
132         printf("copy failure!
");
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
", 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驱动服务管理的主要内容,如果未能解决你的问题,请参考以下文章

文件系统Minifilter驱动

windows驱动

如何开始编写 Windows minifilter 驱动程序? [关闭]

如何在Minifilter驱动的IRP中获取操作文件路径?

[内核驱动]Minifilter实现指定扩展名文件拒绝访问

minifilter微过滤驱动怎么过滤内存映射的文件比如notepad读txt文件