我从 Ntdll.dll 调用导出的方法有些麻烦
在 VS2012 的调试模式下,我得到:
运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果
这是我使用的代码(x86 平台,Windows 7)。
#include "stdafx.h"
#include <Windows.h>
typedef NTSTATUS (* NTAPI ZwClose)(HANDLE handle);
int _tmain(int argc, _TCHAR* argv[])
{
ZwClose close = (ZwClose) ::GetProcAddress(GetModuleHandle(L"ntdll.dll"), "ZwClose");
close(INVALID_HANDLE_VALUE); // Error happens here
return -1;
}
根据我的阅读,它应该可以工作。我也尝试过 __cdecl 和 __fastcall 作为备用调用约定,但没有任何效果。