WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(七)——获得与释放网络适配器设... 阅读

深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(1)

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: 函数pcap_findalldevs首先调用packet.dll中提供的PacketGetAdapterNames 函数,通过给第一个参数pStr传递NULL值,深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(1)(7),使第二个参数 BufferSize返回存储适配器列表所需的

函数pcap_findalldevs首先调用packet.dll中提供的PacketGetAdapterNames 函数,通过给第一个参数pStr传递NULL值,使第二个参数 BufferSize返回存储适配器列表所需的字节数。按该字节数分配空间AdaptersName以存储适配器列表。把第一个参数设为AdaptersName所指的内存空间,第二次调用PacketGetAdapterNames 函数,以获得适配器列表。

对所获的适配器列表进行解析,获得每个适配器的名称与描述,并调用pcap_add_if_win32函数把每个适配器的信息添加到适配器设备列表devlist中。为防止通过“标准”方式没有找到的设备被遗漏,调用依赖平台的函数 pcap_platform_finddevs查找余下的设备信息,并添加到适配器设备列表devlist中。

添加信息结束后,把devlist存放到alldevsp参数所指内存中,释放存储适配器列表的AdaptersName所指的内存空间,函数返回。

1.3.1.1     pcap_add_if_win32函数

函数pcap_add_if_win32()为一个适配器在devlist链表中添加一个节点。

函数原型如下:

static int pcap_add_if_win32(pcap_if_t **devlist,
char *name, const char *desc,char *errbuf)

参数devlist返回存储所有适配器详细信息的链表。参数name为适配器的名称,参数desc为该适配器的描述。参数errbuf返回错误信息。

函数成功返回0值,否则返回非0值。

函数的主要代码如下:

static int pcap_add_if_win32(pcap_if_t **devlist, char *name, const char *desc,
    char *errbuf)
{
    pcap_if_t *curdev;
    npf_if_addr if_addrs[MAX_NETWORK_ADDRESSES];
    LONG if_addr_size;
    int res = 0;
 
    if_addr_size = MAX_NETWORK_ADDRESSES;
 
    /*给devlist添加该接口节点,不带网络地址信息,curdev 返回该接口的节点*/
    if (add_or_find_if(&curdev, devlist, name, 0, desc, errbuf) == -1) {
        //添加失败,函数返回
        return (-1);
    }
  
//调用packet.dll提供的函数,返回一个适配器的所有网络地址信息
    if (!PacketGetNetInfoEx((void *)name, if_addrs, &if_addr_size)) {
     //失败,此处并不返回失败,而是返回一个空的地址链表。
//对于NdisWan接口,这种情况可能发生,同时希望提供这些接口,
//即使不能提供接口的网络地址。
        return (0);
    }
 
    /*现在向节点中添加网络地址信息链表*/
//"curdev" 是表示该接口的节点,对该节点添加它的网络地址链表
    while (if_addr_size-- > 0) {      
        if(curdev == NULL)
            break;
         //把接口一个网络地址的各种地址信息添加到curdev节点中
        res = add_addr_to_list(curdev,
            (struct sockaddr *)&if_addrs[if_addr_size].IPAddress,
            (struct sockaddr *)&if_addrs[if_addr_size].SubnetMask,
            (struct sockaddr *)&if_addrs[if_addr_size].Broadcast,
            NULL,
            errbuf);
        if (res == -1) {
            //失败
            break;
        }
    }
 
    return (res);
}

上一页  2 3 4 5 6 7 8  下一页

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接