1

LoadLibraryを使用してiphlpapi.dllをロードすると、スタックバッファがオーバーランします。どうすればこの問題を解決できますか?!

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

4

2 に答える 2

3

呼び出し規約を指定する必要があります。

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

VSのデフォルトの呼び出し規約はです__cdecl。WindowsAPIにはが必要__stdcallです。これらは、引数のスタックの処理方法が異なります。特に__cdecl、呼び出し元がクリーンアップする__stdcall必要があるのに対し、呼び出された関数はクリーンアップする必要があります。

WINAPIと定義されている__stdcall

たとえば、謎解きされた呼び出し規約を参照してください

于 2011-03-10T12:06:43.757 に答える
0

私の最初の推測では、ライブラリの関数に間違った呼び出し規約を使用しているため、スタックが破損する可能性があります(呼び出しが行われた後にのみ発生する可能性のある他の奇妙な問題の中でも)。関数プロトタイプで__stdcallなどを使用する必要がないかどうかを確認してください。

于 2011-03-10T12:08:37.800 に答える