GetAdaptersInfo崩溃

Nic*_*s M 3 c++ crash winapi hwid

我正在尝试为我的一个朋友做一些硬件生成,我注意到GetAdaptersInfo有点奇怪.根据MSDN, pOutBufLen应该指向一个保持值为sizeof(IP_ADAPTER_INFO)(640)的变量.但是当我使用该值时,它返回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;
}
Run Code Online (Sandbox Code Playgroud)

不知道这是否重要,但64位Windows 8在这里.

Dav*_*nan 5

GetAdaptersInfo(nullptr, &outBufLen);
Run Code Online (Sandbox Code Playgroud)

在此之后返回一个值,outBufLen您应该在后续调用中传递该长度的缓冲区.你不这样做,因此运行时错误.

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

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
Run Code Online (Sandbox Code Playgroud)

我已经malloc在这里使用了C风格,但你可能更喜欢使用new和C++风格的演员.我没有通过自己缺乏熟悉来做到这一点.

显然,当你完成它时你需要释放内存.