0

LoadLibrary로 iphlpapi.dll을로드 할 때 스택 버퍼 오버런이 발생합니다! 이 문제는 어떻게 해결할 수 있습니까?!STATUS_STACK_BUFFER_OVERRUN (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는

+0

라이브러리 헤더 파일에서'GetExtendedTcpTable()'의 정의는 무엇입니까? – sharptooth

답변

3

당신은 호출 규칙을 지정해야합니다

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

VS에서 호출 규칙을 기본 __cdecl이다는 윈도우 API는 __stdcall이 필요합니다. 인수 스택이 처리되는 방식이 다르므로 __cdecl은 호출자가 정리해야하지만 __stdcall은 호출 된 함수를 정리해야합니다.

WINAPI__stdcall

참조 예를 들어,로 정의된다 Calling Conventions Demystified

+0

감사합니다. 그것은 매력처럼 작동합니다 ;-) – leon22

0

내 생각 엔 라이브러리의 함수에 잘못된 호출 규칙을 사용하여 스택 손상 (나중에 발생한 다른 이상한 문제 중 호출이 발생한 후에 발생할 수 있음)이 발생할 수 있습니다. 함수 프로토 타입에서 __stdcall 또는 다른 것을 사용할 필요가 없는지 확인하십시오.