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

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

 

1.4.3  PacketGetNetInfoEx函数

函数 PacketGetNetInfoEx 获得一个适配器的所有地址信息,函数使用结构体 npf_if_addr 返回与一个适配器相关联的地址信息。函数原型如下:
BOOLEAN PacketGetNetInfoEx(PCHAR AdapterName,
npf_if_addr* buffer, PLONG NEntries)
参数 AdapterName 字符串是适配器的名称;参数 buffer 是一个用户分配的 npf_if_addr 结构体类型的数组,该函数将填充此数组;参数 NEntries 是数组的大小 (npf_if_addr 类型计算大小 ) ,也就是所存储的 npf_if_addr 结构体的个数。
如果函数成功返回非 0 值,否则返回 0 值。
函数从注册表中获得一个接口的信息,诸如IP地址、网络掩码地址与广播地址。该buffer参数以npf_if_addr结构体来填充,每个结构体都含有一个单独地址的数据。如果buffer满了,余下的地址信息将被丢弃,因此如果只需第一个网络地址,把buffer的大小设为sizeof(npf_if_addr)即可。
函数首先对适配器的名称AdapterName考虑兼容性,必要时提供Unicode字符串到ASCII码字符串的转换。接着在一个类型为ADAPTER_INFO的全局链表g_AdaptersInfoList中更新该适配器的信息。然后在该链表中查找与该适配器关联的PADAPTER_INFO结构体,如果查找成功,则给buffer存储npf_if_addr类型的数据,并返回。
函数的主要代码实现如下:
BOOLEAN PacketGetNetInfoEx(PCHAR AdapterName, npf_if_addr* buffer, PLONG NEntries)
{
    PADAPTER_INFO TAdInfo;
    PCHAR Tname;
    BOOLEAN Res, FreeBuff;
   
    /*提供字符串转换,为了后向兼容。
*WChar2SChar函数把一个Unicode字符串转换为一个ASCII码字符串, *WChar2SChar函数为执行转换分配了新的内存空间,内存需要释放
*/
    if(AdapterName[1] != 0)
    { //ASCII字符串
        Tname = AdapterName;
        FreeBuff = FALSE;
    }
    else
    {
        Tname = WChar2SChar((PWCHAR)AdapterName);
        FreeBuff = TRUE; //内存需要释放
    }
 
/*
    *更新该适配器的信息。
    *PacketUpdateAdInfo函数在一个全局ADAPTER_INFO类型的链表*g_AdaptersInfoList中更新一个适配器的信息。
*/
    if(!PacketUpdateAdInfo(Tname))
    {
        //更新失败,函数返回
        if(FreeBuff)
            GlobalFreePtr(Tname);
        return FALSE;
    }
 
/*获得g_AdaptersInfoMutex互斥信号*/
    WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);
    /*
*在全局的ADAPTER_INFO链表查找与适配器关联的PADAPTER_INFO结构体
*/
TAdInfo = PacketFindAdInfo(Tname);
    if(TAdInfo != NULL)
    {//查找成功
        LONG numEntries = 0, i;
        PNPF_IF_ADDRESS_ITEM pCursor;
 
        //获取该适配器的npf_if_addr类型的地址链表
        pCursor = TAdInfo->pNetworkAddresses;
        //计算地址链表的元素个数numEntries,
        while(pCursor != NULL)
        {
            numEntries ++;
            pCursor = pCursor->Next;
        }
//且NEntries=min(numEntries, NEntries)
        if (numEntries < *NEntries)
        {
            *NEntries = numEntries;
        }
//给buffer存储npf_if_addr类型的数据
        pCursor = TAdInfo->pNetworkAddresses;
        for (i = 0; (i < *NEntries) && (pCursor != NULL); i++)
        {
            buffer[i] = pCursor->Addr;
            pCursor = pCursor->Next;
        }
 
        Res = TRUE;
    }
    else
    {//查找失败
        TRACE_PRINT("PacketGetNetInfoEx: Adapter not found");
        Res = FALSE;
    }
 
/*释放g_AdaptersInfoMutex互斥信号*/
    ReleaseMutex(g_AdaptersInfoMutex);
   
    if(FreeBuff)
GlobalFreePtr(Tname);
   
    return Res;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值