解码由GetAdaptersAddresses Windows API函数返回到内存的IP_ADAPTER_ADDRESSES结构?

时间:2013-03-26 16:16:14

标签: c++ winapi memory-management msdn

我有一个AHK脚本,我需要获取有关特定网络接口的各种信息。为此,我为GetAdaptersAddresses函数调用IPHlpAPI库,该函数在我提供的地址返回IP_ADAPTER_ADDRESSES结构。然后我开始在该地址读取内存并解码结构的每个成员。

例如,对于IP_ADAPTER_INFO结构,如果我读取前4个字节,则得到下一个结构开始的地址。然后,如果我读取接下来的4个字节,我会得到ComboIndex值。然后,如果我读取下一个260字节并将其转换为ANSI字符串,我将获得适配器的名称。等等。这到目前为止工作。

但对于IP_ADAPTER_ADDRESSES结构,它似乎不起作用。我试过这个:我跳过了前8个字节,即Alignment,然后我跳过接下来的4个字节是结构的长度,然后我读取了应该是适配器索引的接下来的4个字节。但是这个数字是随机的大数字,它不对应任何适配器。其余数据也没有,除非我将内存的每个字节转换为ANSI字符,然后您可以看到AdapterName,Description和FriendlyName。

实际上我想要的只是FriendlyName,因为其他信息我已经从IP_ADAPTER_INFO结构获得了它。那么在什么地址我可以在IP_ADAPTER_ADDRESSES结构中找到FriendlyName?

我还在pastebin上发布了我得到的内存内容:
IP_ADAPTER_ADDRESSES structure - HEX
IP_ADAPTER_ADDRESSES structure - ANSI

2 个答案:

答案 0 :(得分:2)

前8个字节是联合,而不是结构。这意味着Alignment字段和Length / IfIndex字段存储在内存中的相同位置。结构的前4个字节将是长度,接下来的4个将是IfIndex。

是否有理由不能使用IPTypes.h中定义的结构?即使用myAddrPtr->FriendlyName获取名称myAddrPtrIP_ADAPTER_ADDRESSES *

答案 1 :(得分:1)

也许我不完全理解你的问题,我只是使用结构本身来获取友好名称 - 以下是来自非Unicode程序的缩写代码片段:

PIP_ADAPTER_ADDRESSES pCurrAddresses;
ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
GetAdaptersAddresses(family, flags, NULL, NULL, &outBufLen);
pCurrAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
dwRetVal = GetAdaptersAddresses(family, flags, NULL, pCurrAddresses, &outBufLen);
if (dwRetVal == NO_ERROR)
{    while (pCurrAddresses != NULL)
    {   printf("Description: %wS\n", pCurrAddresses->Description);
        printf("Friendly Name: %wS\n", pCurrAddresses->FriendlyName);
        pCurrAddresses = pCurrAddresses->Next;
    }
}
FREE(pAddresses);

这样的事情能做到吗?