深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(3)
2009-09-11 00:00:00 来源:WEB开发网函数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
);
- ››深度解释攻击linux服务器的四种级别
- ››剖析java.util.concurrent锁
- ››剖析Android智能手机系统的更多功能
- ››深度分析地方社区网站的内容定位
- ››剖析Windows Azure Platform框架与组成
- ››剖析使用 ObjectOutputStream 可能引起的内存泄漏...
- ››剖析EWebEditor编辑器漏洞攻击案例
- ››剖析开源云:构建 Infrastructure as a Service 块...
- ››深度剖析 Android 和 iPhone OS
- ››深度分析:HTML5能否成为Flash终结者
- ››深度挖掘 更多Windows 7快捷模式
- ››深度挖掘 Windows 7快捷模式
更多精彩
赞助商链接