GetAdaptersInfo崩溃

时间:2017-01-30 20:34:01

标签: c++ winapi crash hwid

我正在尝试为我的一个朋友做一些硬件生成,我注意到GetAdaptersInfo有点奇怪。根据{{​​3}},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;
}

不知道这是否重要,而是64位Windows 8。

1 个答案:

答案 0 :(得分:5)

eax

此后返回GetAdaptersInfo(nullptr, &outBufLen); 中的值,您需要在后续调用中传递该长度的缓冲区。你不这样做,因此运行时错误。

您需要使用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 和一个C风格的演员,但您可能更喜欢使用malloc和C ++样式演员。由于我自己缺乏熟悉,我没有做到这一点。

显然你需要在完成记忆后释放记忆。