GetAdaptersInfo 崩溃

GetAdaptersInfo crashing

我目前正在尝试为我的一个朋友生成一些硬件,我注意到 GetAdaptersInfo 的行为有点奇怪。根据 MSDN,pOutBufLen 应该指向一个变量,其中包含 sizeof(IP_ADAPTER_INFO) (640) 的值。但是,当我使用该值 returns 111 (ERROR_BUFFER_OVERFLOW) 并将 outBufLen 设置为 2560 时。当调用 outBufLen 设置为 2560 的函数时,它会崩溃。

最小复制代码:

#include <windows.h>
#include <Iphlpapi.h>

int main()
{
    IP_ADAPTER_INFO adapter_inf;
    unsigned long int outBufLen = sizeof(IP_ADAPTER_INFO);

    GetAdaptersInfo(nullptr, &outBufLen); // returning 111 (ERROR_BUFFER_OVERFLOW) and setting outBufLen to 2560
    GetAdaptersInfo(&adapter_inf, &outBufLen); // crash during this call

    return 0;
}

不知道这是否重要,但 64 位 Windows 此处为 8。

GetAdaptersInfo(nullptr, &outBufLen);

在此 returns 中的一个值之后 outBufLen 您应该在后续调用中传递该长度的缓冲区。您不这样做,因此会出现运行时错误。

您需要使用 outBufLen 中返回的长度动态分配 pAdapterInfo

ULONG outBufLen = 0;
if (GetAdaptersInfo(nullptr, &outBufLen) != ERROR_BUFFER_OVERFLOW)
    // handle error
PIP_ADAPTER_INFO pAdapterInfo = (PIP_ADAPTER_INFO) malloc(outBufLen);
if (GetAdaptersInfo(pAdapterInfo, &outBufLen) != ERROR_SUCCESS)
    // handle error

我在这里使用了 malloc 和 C 风格转换,但您可能更喜欢使用 new 和 C++ 风格转换。我没有这样做是因为我自己不熟悉。

显然你需要在用完后释放内存。