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

来源:互联网 发布:信封制作软件 编辑:程序博客网 时间:2024/05/20 10:22

本文转自http://eslxf.blog.51cto.com/918801/198595

 

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.4.3.2     PacketFindAdInfo函数

函数PacketFindAdInfo ()查找g_AdaptersInfoList全局链表,查找一个适配器的信息。其原型如下:
PADAPTER_INFO PacketFindAdInfo(PCHAR AdapterName)
参数AdapterName是所需获取信息的适配器名称
  如果函数成功,返回一个指向适配器信息的PADAPTER_INFO结构体指针,如果失败,返回NULL值。
函数的主要代码实现如下:
PADAPTER_INFO PacketFindAdInfo(PCHAR AdapterName)
{  
    PADAPTER_INFO TAdInfo;
 
    
 
    TAdInfo = g_AdaptersInfoList;
 
    /*查找适配器AdapterName*/
    while(TAdInfo != NULL)
    {
       if(strcmp(TAdInfo->Name, AdapterName) == 0)
       {
           //成功找到适配器AdapterName
           break;
       }
       TAdInfo = TAdInfo->Next;
    }
    
    return TAdInfo;
}
该函数需要返回一个PADAPTER_INF类型指针, 所以不需要获取g_AdaptersInfoMutex互斥信号,而是在PacketGetNetInfoEx()函数中调用该函数时提供互斥操作的保护。
 

1.5    NPF中对应的函数接口

NPF中由NPF_IoControl函数中的如下代码处理该操作。
NTSTATUS NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
switch (FunctionCode){
case BIOCSETOID:
        case BIOCQUERYOID:
            
}
}

原创粉丝点击