本文转自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)相关推荐

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

    1.4.2       PacketGetAdapterNames函数 函数PacketGetAdapterNames获取可用网络适配器的一个列表与它们的描述. 参数pStr是用户分配的字符串,用来存 ...

  2. WinPcap笔记(2):获取设备列表

    通常,编写基于WinPcap应用程序的第一件事情,就是获得已连接的网络适配器列表.WinPcap提供了pcap_findalldevs_ex()函数来实现这个功能:返回一个pcap_if结构的链表,这 ...

  3. 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(1)

    工欲善其事,必先利其器.为了有利于深入了解WinPcap的内部机制,我们需要对网络分析与嗅探.网络模型与硬件基础作必要了解. 1.1 什么是网络分析与嗅探 网络分析(Network analysis) ...

  4. producer send源码_Kafka源码深度剖析系列(七)——Producer核心流程初探

    本次内容我们有两个目标:第一个初探Producer发送消息的流程第二个我们学习一下Kafka是如何构造异常体系的一.代码分析Producer核心流程初探 //因为生产中开发使用的是异步的方式发送的消息 ...

  5. 深度剖析WinPcap之(九)——数据包的发送过程(8)

    1.7.3    发送队列方式的接口实现 1.7.3.1             PacketSendPackets函数 函数发送数据包队列到网络,函数原型如下: INT PacketSendPack ...

  6. 深度剖析WinPcap之(四)——WinPcap的体系架构(2)

    1.3 WinPcap驱动内部说明 WinPcap的结构如图2-4所示,NPF是WinPcap的组件,用来处理网络上传输的数据包,并对用户层导出数据包捕获.发送与分析的能力.下面将描述NPF与操作系统 ...

  7. 深度剖析WinPcap之(九)——数据包的发送过程(12)

    1.8.3 发送队列方式的接口实现 1.8.3.1 NPF_IoControl函数           用户层应用程序执行DeviceIoControl系统调用,通过BIOCSENDPACKETSSY ...

  8. 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(4)

    1.3.3  CSMA/CD 以太网使用载波监听多点接入/冲突检测(CSMA/CD)协议,为了设备在网络上家交换数据.多点接入这个术语指许多网络设备连接到同一个网段 有发送的机会. 每个设备赋予等同的 ...

  9. vc6可编译的 linux 源码,winpcap+vc6编译环境配置,以及获取网络设备列表的源代码...

    winpcap学习手记 (By 风色鸟) winpcap要使用VC6 第一次使用VC6,真的觉得配置很烦,而且觉得不可见.不可控.相比,还是喜欢linux下面的makefile. 尽管如此,还是需要把 ...

最新文章

  1. 企业环境下如何把ubuntu的dhcp改为静态IP
  2. 【开发工具】盘点IDEA那些超级实用插件
  3. 七.(一)oc通知-NSNotification(通知中心-NSNotificationCenter)
  4. Servlet 实现訪问量的统计小案例
  5. 2018 n1ctf easy_hard_php 攻击流程图
  6. 杨晓峰-Java核心技术-9 HashMap Hashtable TreeMap MD
  7. Python数据分析案例-消费者用户画像
  8. 嵌入式系统的开发概述(三星s5p6818系统为例)
  9. ROMS简单应用——绘制区域温度图
  10. Keil5改黑色炫酷背景
  11. 人工智能实验--汉诺塔规约图(四个盘子)
  12. 有没有人拼团csdn学习会员~~
  13. 初识dubbo(随笔)
  14. 计算机控制系统2017模拟题,计算机控制系统模拟试题.doc
  15. Python爬取房价
  16. 如何以HTML显示Base64图像?
  17. 家居:在线云设计与图纸转工厂生产数据建模数据
  18. excel学习-基础日期函数(today+now+year+month+day+date+本月最后一天)
  19. 多功能超级计算机,联合Fermi与Bulldozer,Cray推出新世代超级计算机XK6
  20. iOS 实现在App内打开某个App的AppStore宣传页面

热门文章

  1. 十分钟了解vite如何支持react
  2. 电商黑马,集体倒在2019!
  3. 京瓷Kyocera ECOSYS M8130cidn 一体机驱动
  4. spring中读取配置文件的方式,以及配置文件如何写
  5. 超级文本编辑器Sublime Text3
  6. 一个好玩的OLE 导出Excel
  7. python的idle无法输入中文_一条命令解决mac版本python IDLE不能输入中文问题
  8. PCA变换与KL变换
  9. 计算机图形学基础学习笔记-其一:向量与线性代数
  10. 2021-03-29 单帧红外小目标数据集 | SIRST