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_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, //二进制文件名


  

    __out_opt  LPDWORD   lpdwTagId,    //lpLoadOrderGroup中的标签标识


  

    __in_opt   LPCSTR    lpServiceStartName,//账户名

    __in_opt   LPCSTR    lpPassword         //账户密码

    );

函数CreateServiceA如果成功返回指向该服务的句柄,该句柄通过调用CloseServiceHandle函数关闭。

本文出自 “千江月” 博客,请务必保留此出处http://eslxf.blog.51cto.com/918801/206426