当我用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
答案 0 :(得分:3)
您需要指定调用约定:
typedef DWORD (WINAPI * GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG);
VS中的默认调用约定为__cdecl
,Windows API需要__stdcall
。这些参数的堆栈处理方式不同,最值得注意的是__cdecl
需要调用者清理而__stdcall
需要调用的函数来清理。
WINAPI
定义为__stdcall
答案 1 :(得分:0)
我的第一个猜测是你对库的功能使用了错误的调用约定,这可能导致堆栈损坏(在调用之后可能稍后出现的其他奇怪问题)。 检查您是否不需要在函数原型中使用__stdcall或其他内容。