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

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

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: 函数首先调用PacketPopulateAdaptersInfoList()函数创建适配器链表g_AdaptersInfoList,接着开始给pStr中填充适配器的名称与描述两个列表,深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(2)(5),在填充的过程中,需要遍历g_Adap

函数首先调用PacketPopulateAdaptersInfoList()函数创建适配器链表g_AdaptersInfoList。接着开始给pStr中填充适配器的名称与描述两个列表,在填充的过程中,需要遍历g_AdaptersInfoList两次,第一次遍历是为了计算第二个列表开始的偏移与检查缓冲区的大小,第二次遍历是为了复制适配器的名称与描述信息。复制数据结束后,在两个列表之间加入分隔符’\0’,并在第二个列表之后添加一个’\0’结束列表。

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 2 3 4 5 6  下一页

Tags:深度 剖析 WinPcap

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