我有一个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
答案 0 :(得分:2)
前8个字节是联合,而不是结构。这意味着Alignment字段和Length / IfIndex字段存储在内存中的相同位置。结构的前4个字节将是长度,接下来的4个将是IfIndex。
是否有理由不能使用IPTypes.h中定义的结构?即使用myAddrPtr->FriendlyName
获取名称myAddrPtr
为IP_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);
这样的事情能做到吗?