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

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

 

1.4    packet.dll对应的函数接口

1.4.1        关键结构体_ADAPTER_INFO

结构体_ADAPTER_INFO包含了系统上所安装适配器的可理解信息,包含用户所需的所有附加信息。该结构体的定义如下:
typedef  struct _ADAPTER_INFO 
{
    struct _ADAPTER_INFO *Next;             //指向链表中的下一个节点
    CHAR Name[ADAPTER_NAME_LENGTH + 1];     //描述该适配器的名字
    CHAR Description[ADAPTER_DESC_LENGTH + 1]; //适配器可理解的描述
UINT MacAddressLen;                     //链路层地址的长度
    UCHAR MacAddress[MAX_MAC_ADDR_LENGTH];  //链路层地址
    NetType LinkLayer;              //适配器的物理特性。该NetType结构体
//包含了该适配器得链路类型与速度
    PNPF_IF_ADDRESS_ITEM pNetworkAddresses;//指向一个网络地址链表,
//每一个节点描述该适配器的所有网络地址
    UINT Flags;         //适配器标识。使用Netmon API或dagc API,
//告诉该适配器是否用不同的方式对待。
}
ADAPTER_INFO, *PADAPTER_INFO;
 
packetNtx/Dll/AdInfo.c文件中声明了下列两个全局变量:
PADAPTER_INFO g_AdaptersInfoList = NULL;   
HANDLE g_AdaptersInfoMutex = NULL; 
其中g_AdaptersInfoList为全局适配器的链表,当应用程序连接packet.dll时创建该链表。g_AdaptersInfoMutex是保护g_AdaptersInfoList链表的互斥信号。
注意,把ADAPTER_INFO 作为一个参数的API,都假设获取了该互斥信号后再进行访问。换句话说,如果哪个API没有把ADAPTER_INFO 作为一个参数,那么对g_AdaptersInfoList的访问就需要先获得该互斥信号后再进行访问。示例代码如下所示:
void  PacketPopulateAdaptersInfoList()
{
    …
/*
*调用者不使用g_AdaptersInfoList作为参数,
*应该获得g_AdaptersInfoMutex互斥信号,
*/
    WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);
 
    /*访问g_AdaptersInfoList参数 */
    if(g_AdaptersInfoList)
    {
        …
}
/*释放g_AdaptersInfoMutex互斥信号*/
    ReleaseMutex(g_AdaptersInfoMutex);
    …
}
 
结构体_NPF_IF_ADDRESS_ITEM包含一个适配器所有网络地址节点的链表。该结构体定义如下:
typedef  struct _NPF_IF_ADDRESS_ITEM
{
    npf_if_addr Addr;                  //网络地址
    struct _NPF_IF_ADDRESS_ITEM *Next; //指向链表的下一个节点
}
NPF_IF_ADDRESS_ITEM, *PNPF_IF_ADDRESS_ITEM;
 
结构体 _NPF_IF_ADDRESS_ITEM中的成员npf_if_addr存储网络适配器的网络地址。函数PacketGetNetInfoEx()使用该结构体,以返回适配器的网络地址。该结构体定义如下:
typedef  struct npf_if_addr {
    struct sockaddr_storage IPAddress;  //IP地址
    struct sockaddr_storage SubnetMask; //网络掩码地址
    struct sockaddr_storage Broadcast;  //广播地址
}npf_if_addr;
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值