2017-01-30 9 views
3

В настоящее время я пытаюсь создать некоторое оборудование для своего друга, и я заметил, что GetAdaptersInfo kinda ведет себя странно. Согласно MSDN pOutBufLen должен указывать на переменную, содержащую значение sizeof(IP_ADAPTER_INFO) (640). Но когда я использую это значение, он возвращает 111 (ERROR_BUFFER_OVERFLOW) и устанавливает outBufLen на 2560. При вызове функции с outBufLen, установленной на 2560, он просто сработает.GetAdaptersInfo crashing

Минимальный код воспроизводства:

#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 здесь.

ответ

5
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 

Я использовал malloc здесь, и литая стиль C, но вы можете предпочесть использовать new и C++ стиль актеров. Я не делал этого из-за своего собственного незнания.

Очевидно, что вам необходимо освободить память, когда вы закончите с ней.

+0

Просто случайно ненавидя себя после 3 часов депрессии. Спасибо. –

+0

Значит ли это, что структура IP_ADAPTER_INFO меньше длины, возвращаемой первым вызовом? –

+0

@ OtávioDécio Да. –