STATUS_STACK_BUFFER_OVERRUN с LoadLibrary - PullRequest
0 голосов
/ 10 марта 2011

Когда я загружаю iphlpapi.dll с помощью LoadLibrary, мой буфер стека переполняется!Как я могу решить эту проблему?!

typedef DWORD (*GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG);   
GetExtendedTcpTable _GetExtendedTcpTable;

// load function at runtime 
HINSTANCE hstLibrary = LoadLibrary("C:\\Windows\\System32\\Iphlpapi.dll");

if(!hstLibrary)
{
    ::MessageBox(NULL,"Can't load Iphlpapi.dll!\n","Error",
            MB_OK + MB_ICONEXCLAMATION + MB_TASKMODAL);

    FreeLibrary(hstLibrary); // free memory

    exit(0);
}

// load function address from dll
_GetExtendedTcpTable = (GetExtendedTcpTable)GetProcAddress(hstLibrary, "GetExtendedTcpTable");

Загрузка функции lib и ее выполнение работают нормально, но в какой-то момент моя программа выдает исключение STATUS_STACK_BUFFER_OVERRUN!(некоторый момент: когда я комментирую строковую операцию, ошибка происходит несколькими строками позже)

Когда я не использую LoadLibrary и GetProcAddress (статическое связывание) -> переполнение буфера отсутствует!

Спасибо и привет,

leon22

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Вам необходимо указать соглашение о вызовах:

typedef DWORD (WINAPI * GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG);   

Соглашение о вызовах по умолчанию в VS: __cdecl, для Windows API требуется __stdcall. Они отличаются в том, как обрабатывается стек для аргументов, в частности, __cdecl требует, чтобы вызывающая сторона очистила, тогда как __stdcall требует, чтобы вызываемая функция очистила.

WINAPI определяется как __stdcall

Смотри, например, Соглашение о вызове демистифицировано

0 голосов
/ 10 марта 2011

Мое первое предположение состоит в том, что вы используете неправильное соглашение о вызовах для функции библиотеки, которая может затем привести к повреждению стека (среди других странных проблем, которые могут появиться только позже, после того, как вызов был сделан).Проверьте, не нужно ли использовать __stdcall или что-то еще в прототипе вашей функции ..

...