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

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

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: 函数PacketGetNetInfoEx()主要调用了PacketUpdateAdInfo()与 PacketFindAdInfo()函数,1.4.3.1 PacketUpdateAdInfo函数函数PacketUpdateAdInfo()在一个全局链表g_AdaptersInfoList中更新

函数PacketGetNetInfoEx()主要调用了PacketUpdateAdInfo()与 PacketFindAdInfo()函数。

1.4.3.1 PacketUpdateAdInfo函数

函数PacketUpdateAdInfo()在一个全局链表g_AdaptersInfoList中更新一个适配器的信息。其原型如下:

BOOLEAN PacketUpdateAdInfo(PCHAR AdapterName);

参数AdapterName是所需更新信息的适配器名称。

如果函数成功返回TRUE,一个false值意味着适配器不可用或没有被连接。

函数PacketUpdateAdInfo()首先检查适配器AdapterNam节点在g_AdaptersInfoList链表中是否存在,如果存在则销毁该节点。然后获得适配器AdapterName的信息,并把该节点信息更新到g_AdaptersInfoList适配器链表中。

函数的主要代码实现如下:

BOOLEAN PacketUpdateAdInfo(PCHAR AdapterName)
{
    PADAPTER_INFO TAdInfo, PrevAdInfo;
  
/*获得g_AdaptersInfoMutex互斥信号*/
    WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);
 
    PrevAdInfo = TAdInfo = g_AdaptersInfoList;
 
    /*
*如果适配器AdapterNam节点在g_AdaptersInfoList链表中存在,
*则销毁该节点。
*/
    while(TAdInfo != NULL)
    {
       if(strcmp(TAdInfo->Name, AdapterName) == 0)
       {
           if(TAdInfo == g_AdaptersInfoList)
           {
              g_AdaptersInfoList = TAdInfo->Next;
           }
           else
           {
              PrevAdInfo->Next = TAdInfo->Next;
           }
 
           if (TAdInfo->pNetworkAddresses != NULL)
           {
              PNPF_IF_ADDRESS_ITEM pItem, pNext;
 
              pItem = TAdInfo->pNetworkAddresses;
              //释放网络地址链表
              while(pItem != NULL)
              {
                  pNext = pItem->Next;
 
                  GlobalFreePtr(pItem);
                  pItem = pNext;
              }
           }
         
           GlobalFreePtr(TAdInfo);//释放该适配器信息节点
 
           break;
       }
 
        PrevAdInfo = TAdInfo;
 
       TAdInfo = TAdInfo->Next;
    }
 
/*释放g_AdaptersInfoMutex互斥信号*/
    ReleaseMutex(g_AdaptersInfoMutex);
 
    /*
*获得适配器AdapterName的信息,
*并把该节点信息添加到g_AdaptersInfoList适配器链表中。
*/
    if(PacketAddAdapterNPF(AdapterName, 0) == TRUE)
    {
       //信息更新成功
       return TRUE;
    }
 
    return TRUE;
}

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

Tags:深度 剖析 WinPcap

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