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

本文转自http://eslxf.blog.51cto.com/918801/206426

 

.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_NAMENPF_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函数关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值