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;
win4
最新推荐文章于 2024-07-11 03:29:05 发布