本文转自http://eslxf.blog.51cto.com/918801/198589
st1/:*{behavior:url(#ieooui) }
1.4.2.1 PacketPopulateAdaptersInfoList函数
函数PacketPopulateAdaptersInfoList()创建适配器的链表g_AdaptersInfoList。该函数先释放掉g_AdaptersInfoList中旧的内容,然后调用PacketGetAdaptersNPF()函数用新的信息填充该链表。
其主要代码如下所示:
void PacketPopulateAdaptersInfoList()
{
…
/*获得g_AdaptersInfoMutex互斥信号*/
WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);
/*释放g_AdaptersInfoList中旧的内容*/
if(g_AdaptersInfoList)
{
TAdInfo = g_AdaptersInfoList;
while(TAdInfo != NULL) //遍历链表
{
PNPF_IF_ADDRESS_ITEM pItem, pCursor;
Mem2 = TAdInfo;
pCursor = TAdInfo->pNetworkAddresses;
TAdInfo = TAdInfo->Next;
while(pCursor != NULL)
{
pItem = pCursor->Next;
GlobalFreePtr(pCursor); //释放内存
pCursor = pItem;
}
GlobalFreePtr(Mem2); //释放内存
}
g_AdaptersInfoList = NULL;
}
/*用新的信息填充链表*/
if(!PacketGetAdaptersNPF())
{ //失败
…
}
…
//释放g_AdaptersInfoMutex互斥信号
ReleaseMutex(g_AdaptersInfoMutex);
}
1.4.2.2 PacketGetAdaptersNPF函数
函数PacketGetAdaptersNPF()通过查询注册表的"SYSTEM//CurrentControlSet//Control//Class//{4D36E972-E325-11CE-BFC1-08002BE10318}"条目获得适配器的名称,并调用PacketAddAdapterNPF()函数来更新适配器链表g_AdaptersInfoList的内容。如果函数成功则返回非0值。
其主要代码如下所示:
static BOOLEAN PacketGetAdaptersNPF()
{
…
/*打开注册表*/
Status=RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM//CurrentControlSet//Control//Class//{4D36E972-E325-11CE-BFC1-08002BE10318}"),
0,
KEY_READ,
&AdapKey);
if ( Status != ERROR_SUCCESS ){
//打开注册表{4D36E972-E325-11CE-BFC1-08002BE10318}条目失败
goto tcpip_linkage;
}
i = 0;
/*遍历{4D36E972-E325-11CE-BFC1-08002BE10318}键,获取适配器的名称*/
while((Result = RegEnumKey(AdapKey, i, AdapName, sizeof(AdapName)/2))
== ERROR_SUCCESS)
{
i++;
FireWireFlag = 0;
//从注册表键中获取适配器的名称
Status=RegOpenKeyEx(AdapKey, AdapName, 0, KEY_READ, &OneAdapKey);
if ( Status != ERROR_SUCCESS )
{//失败
continue;
}
/*
*检查该适配器是否为火线(FireWire)适配器,
*通过在ComponentId中查找“1394”字符串判断。防止列出火线适配器,
*因为WinPcap能够打开它们,但是它们与操作系统的接口被断开了,
*打开它们会导致蓝屏。
*/
dim = sizeof(TName);
Status = RegQueryValueEx(OneAdapKey,
TEXT("ComponentId"),
NULL,
NULL,
(PBYTE)TName,
&dim);
if(Status == ERROR_SUCCESS)
{
if(IsFireWire(TName))
{
FireWireFlag = INFO_FLAG_DONT_EXPORT;//设置不导出标志
}
}
Status=RegOpenKeyEx(OneAdapKey, TEXT("Linkage"), 0, KEY_READ,
&LinkageKey);
if (Status != ERROR_SUCCESS)
{ //失败
RegCloseKey(OneAdapKey);
continue;
}
dim = sizeof(DeviceGuidName);
Status=RegQueryValueExA(LinkageKey,
"Export",
NULL,
NULL,
(PBYTE)DeviceGuidName,
&dim);
if(Status != ERROR_SUCCESS)
{
RegCloseKey(OneAdapKey);
RegCloseKey(LinkageKey);
continue;
}
if (strlen(DeviceGuidName) >= strlen("//Device//"))
{
// 把/Device/NPF_ 字符串放置到名称的开始
StringCchPrintfA(TAName, sizeof(TAName), "%s%s",
npfCompleteDriverPrefix,
DeviceGuidName + strlen("//Device//"));
}
else
continue;
//给TAName最后一个字符设为结束符’/0’,为了以防万一
TAName[sizeof(TAName) - 1] = '/0';
//成功获取适配器的信息,把给适配器的信息添加到全局适配器链表
PacketAddAdapterNPF(TAName, FireWireFlag);
RegCloseKey(OneAdapKey);
RegCloseKey(LinkageKey);
}
RegCloseKey(AdapKey);
/*
*如果在{4D36E972-E325-11CE-BFC1-08002BE10318}没找到适配器,
*这在Windows NT 4下可能性很大,
*因此试图查找tcpip绑定来获得适配器的信息
*/
tcpip_linkage:
…
return TRUE;
}
深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(6)相关推荐
- 深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(5)
1.4.2 PacketGetAdapterNames函数 函数PacketGetAdapterNames获取可用网络适配器的一个列表与它们的描述. 参数pStr是用户分配的字符串,用来存 ...
- WinPcap笔记(2):获取设备列表
通常,编写基于WinPcap应用程序的第一件事情,就是获得已连接的网络适配器列表.WinPcap提供了pcap_findalldevs_ex()函数来实现这个功能:返回一个pcap_if结构的链表,这 ...
- 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(1)
工欲善其事,必先利其器.为了有利于深入了解WinPcap的内部机制,我们需要对网络分析与嗅探.网络模型与硬件基础作必要了解. 1.1 什么是网络分析与嗅探 网络分析(Network analysis) ...
- producer send源码_Kafka源码深度剖析系列(七)——Producer核心流程初探
本次内容我们有两个目标:第一个初探Producer发送消息的流程第二个我们学习一下Kafka是如何构造异常体系的一.代码分析Producer核心流程初探 //因为生产中开发使用的是异步的方式发送的消息 ...
- 深度剖析WinPcap之(九)——数据包的发送过程(8)
1.7.3 发送队列方式的接口实现 1.7.3.1 PacketSendPackets函数 函数发送数据包队列到网络,函数原型如下: INT PacketSendPack ...
- 深度剖析WinPcap之(四)——WinPcap的体系架构(2)
1.3 WinPcap驱动内部说明 WinPcap的结构如图2-4所示,NPF是WinPcap的组件,用来处理网络上传输的数据包,并对用户层导出数据包捕获.发送与分析的能力.下面将描述NPF与操作系统 ...
- 深度剖析WinPcap之(九)——数据包的发送过程(12)
1.8.3 发送队列方式的接口实现 1.8.3.1 NPF_IoControl函数 用户层应用程序执行DeviceIoControl系统调用,通过BIOCSENDPACKETSSY ...
- 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(4)
1.3.3 CSMA/CD 以太网使用载波监听多点接入/冲突检测(CSMA/CD)协议,为了设备在网络上家交换数据.多点接入这个术语指许多网络设备连接到同一个网段 有发送的机会. 每个设备赋予等同的 ...
- vc6可编译的 linux 源码,winpcap+vc6编译环境配置,以及获取网络设备列表的源代码...
winpcap学习手记 (By 风色鸟) winpcap要使用VC6 第一次使用VC6,真的觉得配置很烦,而且觉得不可见.不可控.相比,还是喜欢linux下面的makefile. 尽管如此,还是需要把 ...
最新文章
- 企业环境下如何把ubuntu的dhcp改为静态IP
- 【开发工具】盘点IDEA那些超级实用插件
- 七.(一)oc通知-NSNotification(通知中心-NSNotificationCenter)
- Servlet 实现訪问量的统计小案例
- 2018 n1ctf easy_hard_php 攻击流程图
- 杨晓峰-Java核心技术-9 HashMap Hashtable TreeMap MD
- Python数据分析案例-消费者用户画像
- 嵌入式系统的开发概述(三星s5p6818系统为例)
- ROMS简单应用——绘制区域温度图
- Keil5改黑色炫酷背景
- 人工智能实验--汉诺塔规约图(四个盘子)
- 有没有人拼团csdn学习会员~~
- 初识dubbo(随笔)
- 计算机控制系统2017模拟题,计算机控制系统模拟试题.doc
- Python爬取房价
- 如何以HTML显示Base64图像?
- 家居:在线云设计与图纸转工厂生产数据建模数据
- excel学习-基础日期函数(today+now+year+month+day+date+本月最后一天)
- 多功能超级计算机,联合Fermi与Bulldozer,Cray推出新世代超级计算机XK6
- iOS 实现在App内打开某个App的AppStore宣传页面
热门文章
- 十分钟了解vite如何支持react
- 电商黑马,集体倒在2019!
- 京瓷Kyocera ECOSYS M8130cidn 一体机驱动
- spring中读取配置文件的方式,以及配置文件如何写
- 超级文本编辑器Sublime Text3
- 一个好玩的OLE 导出Excel
- python的idle无法输入中文_一条命令解决mac版本python IDLE不能输入中文问题
- PCA变换与KL变换
- 计算机图形学基础学习笔记-其一:向量与线性代数
- 2021-03-29 单帧红外小目标数据集 | SIRST