0

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

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

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

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

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

4

2 回答 2

2

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

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

于 2013-03-26T16:25:06.100 回答
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);

这样的事情会奏效吗?

于 2013-03-26T16:52:21.573 回答