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

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

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: 函数PacketAddAdapterNPF()首先检查ADAPTER_INFO::Name成员是否有足够的空间存储适配器名称,然后获取g_AdaptersInfoMutex互斥信号,深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(3)(2),查看要添加的适配器名称是否已在适配器链

函数PacketAddAdapterNPF()首先检查ADAPTER_INFO::Name成员是否有足够的空间存储适配器名称。然后获取g_AdaptersInfoMutex互斥信号。

查看要添加的适配器名称是否已在适配器链表中存在,如是,则函数返回。否则试图打开该NPF适配器,查看它是否可用。如果可用将分配一个缓冲区,用来从驱动程序获得厂商的描述信息。

获得该适配器的PADAPTER_INFO 结构体中各成员的值。依次复制适配器名称,设备的描述,从注册表获得适配器的NetType结构体,查询NIC驱动程序,获取适配器的MAC地址,获取网络地址项PNPF_IF_ADDRESS_ITEM,并把它追加到链表TmpAdInfo->pNetworkAddresses的尾部。

最后更新g_AdaptersInfoList 链表,释放g_AdaptersInfoMutex互斥信号,函数成功返回。

函数调用了PacketRequest()、PacketGetLinkLayerFromRegistry()与PacketGetAddressesFromRegistry()函数。各函数的原型与作用分别如下:

函数PacketRequest()在驱动程序上执行一个查询/设置操作。函数原型如下:

BOOLEAN PacketRequest(LPADAPTER  AdapterObject,
BOOLEAN Set,PPACKET_OID_DATA  OidData)

参数AdapterObject指向一个_ADAPTER结构体。参数Set决定是设置(Set=TRUE)还是查询(Set=FALSE)操作。参数OidData是一个指向一个_PACKET_OID_DATA结构体的指针,该结构体包含了所接收的数据。

如果函数成功返回非0值。

注意并不是所有的网络适配器实现了所有的查询/设置功能。

该函数主要依赖于DeviceIoControl系统函数实现,如下面的调用

Result=(BOOLEAN)DeviceIoControl(
AdapterObject->hFile,
(DWORD) Set ? (DWORD)BIOCSETOID : (DWORD)BIOCQUERYOID,                           OidData,
sizeof(PACKET_OID_DATA)-1+OidData->Length,OidData,                       sizeof(PACKET_OID_DATA)-1+OidData->Length,&BytesReturned,NULL
);

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

Tags:深度 剖析 WinPcap

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