深度剖析WinPcap之(八)――打开与关闭适配器(10)

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_DESCNPF_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)的数据库中。其函数原型如下:
__checkReturn
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函数关闭。

你可能感兴趣的:(职场,休闲,winpcap)