Windows文件过滤驱动sample中提供的例子,其驱动安装都是通过inf文件右键安装实现的。由于项目中希望实现程序安装,参考了网上的资料,通过服务控制管理器实现。
头文件:
#ifndef __H_FILTER_H__ #define __H_FILTER_H__ #include <windows.h> #include <winioctl.h> /************************************************************************** * 函数名:InstallDriver * 功 能:安装驱动 * 参 数:const char* lpszDriverName,驱动服务的名称 * const char* lpszDriverPath,驱动的全路径 * const char* lpszAltitude, 文件驱动的高度 * 返回值:BOOL ,TRUE为安装成功 **************************************************************************/ BOOL InstallDriver(const char* lpszDriverName, const char* lpszDriverPath, const char* lpszAltitude); /************************************************************************** * 函数名:StartDriver * 功 能:启动驱动服务 * 参 数:const char* lpszDriverName,驱动服务名称 * 返回值:BOOL , **************************************************************************/ BOOL StartDriver(const char* lpszDriverName); /************************************************************************** * 函数名:StopDriver * 功 能:停止驱动服务 * 参 数:const char* lpszDriverName,驱动服务名称 * 返回值:BOOL ,TRUE为成功 **************************************************************************/ BOOL StopDriver(const char* lpszDriverName); /************************************************************************** * 函数名:DeleteDriver * 功 能:卸载驱动服务 * 参 数:const char* lpszDriverName,驱动服务名称 * 返回值:BOOL ,TRUE为成功 **************************************************************************/ BOOL DeleteDriver(const char* lpszDriverName); #endif实现文件:
#include "stdafx.h" #include "FilterDriverInstall.h" LPSTR ConvertErrorCodeToString(DWORD ErrorCode) { HLOCAL LocalAddress=NULL; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, NULL,ErrorCode,0,(PTSTR)&LocalAddress,0,NULL); return (LPSTR)LocalAddress; } BOOL InstallDriver(const char* lpszDriverName, const char* lpszDriverPath, const char* lpszAltitude) { char szTempStr[MAX_PATH]; HKEY hKey; DWORD dwData; printf("lpszDriverName=%s, lpszDriverPath=%s\n", lpszDriverName, lpszDriverPath); if( NULL==lpszDriverName || NULL==lpszDriverPath ) { return FALSE; } SC_HANDLE hServiceMgr = NULL;// SCM管理器的句柄 SC_HANDLE hService = NULL; // 驱动程序的服务句柄 //打开服务控制管理器 hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if( hServiceMgr == NULL ) { CloseServiceHandle(hServiceMgr); return FALSE; } //创建驱动所对应的服务 hService = CreateService( hServiceMgr, lpszDriverName, // 驱动程序的在注册表中的名字 lpszDriverName, // 注册表驱动程序的DisplayName 值 SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限 SERVICE_FILE_SYSTEM_DRIVER, // 表示加载的服务是文件系统驱动程序 SERVICE_AUTO_START,//SERVICE_DEMAND_START,注册表驱动程序的Start 值 SERVICE_ERROR_IGNORE, // 注册表驱动程序的ErrorControl 值 lpszDriverPath, // 注册表驱动程序的ImagePath "FSFilter Activity Monitor",// 注册表驱动程序的Group 值 NULL, "FltMgr", // 驱动依赖的服务,注册表驱动程序的DependOnService值 NULL, NULL); if( hService == NULL ) { printf("CreateService failed:%d(%s)", GetLastError(), ConvertErrorCodeToString(GetLastError())); if( GetLastError() == ERROR_SERVICE_EXISTS ) { CloseServiceHandle(hService); CloseServiceHandle(hServiceMgr); return TRUE; } else { CloseServiceHandle(hService); CloseServiceHandle(hServiceMgr); return FALSE; } } CloseServiceHandle(hService); CloseServiceHandle(hServiceMgr); //------------------------------------------------------------------------------------------------------- // 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; }调用代码:
int _tmain(int argc, _TCHAR* argv[]) { BOOL bRet = InstallDriver("TestMiniFilter", "D:\\TestMiniFilter\\TestMiniFilter.sys", "370030"); if(bRet) { StartDriver("TestMiniFilter"); printf("driver install success!"); } else { printf("driver install failed!"); } return 0; }