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;
}