1.5.2.1.1.1 PacketInstallDriver函数
函数PacketInstallDriver()把驱动程序Windows\system32\drivers\npf.sys安装到操作系统。如果函数成功返回非0值。
主要代码如下:
BOOLEAN PacketInstallDriver()
{
…
CHAR driverName[MAX_WINPCAP_KEY_CHARS] = NPF_DRIVER_NAME;
CHAR driverDesc[MAX_WINPCAP_KEY_CHARS] = NPF_SERVICE_DESC;
CHAR driverLocation[MAX_WINPCAP_KEY_CHARS] =
NPF_DRIVER_COMPLETE_PATH;
/*
连接到服务控制管理器*/
scmHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(scmHandle == NULL)
return FALSE;
/*
给操作系统安装驱动程序的服务*/
svcHandle = CreateServiceA(scmHandle,
driverName,
driverDesc,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
driverLocation,
NULL, NULL, NULL, NULL, NULL);
if (svcHandle == NULL)
{
err = GetLastError();
if (err == ERROR_SERVICE_EXISTS)
{
//npf.sys
的服务已经存在
err = 0;
result = TRUE;
}
}
else
{
//
给npf.sys成功创建了服务
result = TRUE;
}
/*
安装完毕,释放资源*/
if (svcHandle != NULL)
CloseServiceHandle(svcHandle);
…
CloseServiceHandle(scmHandle);
SetLastError(err);
return result;
其中
NPF_DRIVER_NAME
、NPF_SERVICE_DESC与NPF_DRIVER_COMPLETE_PATH的定义如下:
#define NPF_DRIVER_NAME "NPF"
#define NPF_SERVICE_DESC "WinPcap Packet Driver (" NPF_DRIVER_NAME ")"
#define NPF_DRIVER_COMPLETE_PATH
"system32\\drivers\\" NPF_DRIVER_NAME ".sys"
函数使用CreateServiceA系统函数给操作系统安装驱动程序的服务。函数CreateServiceA创建一个服务对象,通过在在注册表
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services
下创建与服务同名的键值,把该服务安装到特定的服务控制管理器(SCM)的数据库中。其函数原型如下:
WINADVAPI
SC_HANDLE
WINAPI
CreateServiceA(
__in SC_HANDLE hSCManager, //
指向SCM的句柄
__in LPCSTR lpServiceName, //
开始的服务名称
__in_opt LPCSTR lpDisplayName, //
显示名称
__in DWORD dwDesiredAccess, //
服务访问类型
__in DWORD dwServiceType, //
服务类型
__in DWORD dwStartType, //
什么时候开始服务
__in DWORD dwErrorControl, //
服务失败的严重程度
__in_opt LPCSTR lpBinaryPathName, //
二进制文件名
__in_opt LPCSTR lpLoadOrderGroup, //服务群的加载顺序
__out_opt LPDWORD lpdwTagId, //
lpLoadOrderGroup
中的
标签标识
__in_opt LPCSTR lpDependencies,//启动服务所依赖的其它服务的名称
__in_opt LPCSTR lpServiceStartName,//
账户名
__in_opt LPCSTR lpPassword //
账户密码
函数CreateServiceA如果成功返回指向该服务的句柄,该句柄通过调用CloseServiceHandle函数关闭。