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

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

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: 函数首先对适配器的名称AdapterName 考虑兼容性,必要时提供Unicode字符串到ASCII码字符串的转换,深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(3)(5),接着在一个类型为ADAPTER_INFO的全局链表 g_AdaptersInfoList中更新该适配器的

函数首先对适配器的名称AdapterName 考虑兼容性,必要时提供Unicode字符串到ASCII码字符串的转换。接着在一个类型为ADAPTER_INFO的全局链表 g_AdaptersInfoList中更新该适配器的信息。然后在该链表中查找与该适配器关联的PADAPTER_INFO结构体,如果查找成功,则给 buffer存储npf_if_addr类型的数据,并返回。

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

BOOLEAN PacketGetNetInfoEx(PCHAR AdapterName, npf_if_addr* buffer, PLONG NEntries)
{
    PADAPTER_INFO TAdInfo;
    PCHAR Tname;
    BOOLEAN Res, FreeBuff;
  
    /*提供字符串转换,为了后向兼容。
*WChar2SChar函数把一个Unicode字符串转换为一个ASCII码字符串, *WChar2SChar函数为执行转换分配了新的内存空间,内存需要释放
*/
    if(AdapterName[1] != 0)
    { //ASCII字符串
        Tname = AdapterName;
        FreeBuff = FALSE;
    }
    else
    {
        Tname = WChar2SChar((PWCHAR)AdapterName);
        FreeBuff = TRUE; //内存需要释放
    }
 
/*
    *更新该适配器的信息。
    *PacketUpdateAdInfo函数在一个全局ADAPTER_INFO类型的链表*g_AdaptersInfoList中更新一个适配器的信息。
*/
    if(!PacketUpdateAdInfo(Tname))
    {
        //更新失败,函数返回
        if(FreeBuff)
            GlobalFreePtr(Tname);
        return FALSE;
    }
 
/*获得g_AdaptersInfoMutex互斥信号*/
    WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);
    /*
*在全局的ADAPTER_INFO链表查找与适配器关联的PADAPTER_INFO结构体
*/
TAdInfo = PacketFindAdInfo(Tname);
    if(TAdInfo != NULL)
    {//查找成功
        LONG numEntries = 0, i;
        PNPF_IF_ADDRESS_ITEM pCursor;
 
        //获取该适配器的npf_if_addr类型的地址链表
        pCursor = TAdInfo->pNetworkAddresses;
        //计算地址链表的元素个数numEntries,
        while(pCursor != NULL)
        {
            numEntries ++;
            pCursor = pCursor->Next;
        }
//且NEntries=min(numEntries, NEntries)
        if (numEntries < *NEntries)
        {
            *NEntries = numEntries;
        }
//给buffer存储npf_if_addr类型的数据
        pCursor = TAdInfo->pNetworkAddresses;
        for (i = 0; (i < *NEntries) && (pCursor != NULL); i++)
        {
            buffer[i] = pCursor->Addr;
            pCursor = pCursor->Next;
        }
 
        Res = TRUE;
    }
    else
    {//查找失败
        TRACE_PRINT("PacketGetNetInfoEx: Adapter not found");
        Res = FALSE;
    }
 
/*释放g_AdaptersInfoMutex互斥信号*/
    ReleaseMutex(g_AdaptersInfoMutex);
  
    if(FreeBuff)
GlobalFreePtr(Tname);
  
    return Res;
}

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

Tags:深度 剖析 WinPcap

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