我试图调用内部Windows NT API函数NtOpenProcess。我知道调用内部API可能是一个坏主意,但对于这个特定的工具,我需要这个API提供的低级访问。
我的问题是要使用这样的内部API,我需要使用this article
中指定的运行时动态链接为此,我需要定义一个指向NtOpenProcess的函数指针。这是我的宣言:
typedef NTSTATUS (NTAPI *_NtOpenProcess) (
OUT PHANDLE,
IN ACCESS_MASK,
IN POBJECT_ATTRIBUTES,
IN PCLIENT_ID OPTIONAL);
class procManager
{
HINSTANCE hNTDLL;
public:
procManager()
{
hNTDLL = LoadLibrary(L"ntdll.dll");
if (!hNTDLL)
throw std::runtime_error("NTDLL.DLL failure.");
_NtOpenProcess NtOpenProcess;
NtOpenProcess = reinterpret_cast <_NtOpenProcess> (GetProcAddress(hNTDLL, L"NtOpenProcess"));
if (!NtOpenProcess)
throw std::runtime_error("NtOpenProcess not found.");
//Use NTOpenProcess for stuff here
};
~procManager()
{
FreeLibrary(hNTDLL);
};
};
问题是,我的typedef上面显然有错误。编译器返回:
错误C2059:语法错误: '__stdcall'
我使用了IDE(Visual Studio 2008)的方便花花公子“Go To Definition”功能,发现声明中的NTAPI定义为__stdcall。
不幸的是,从我的声明中删除NTAPI,将其改为:
typedef NTSTATUS (*_NtOpenProcess) (
OUT PHANDLE,
IN ACCESS_MASK,
IN POBJECT_ATTRIBUTES,
IN PCLIENT_ID OPTIONAL);
导致另一个错误:
错误C2065:'_ NTOpenProcess': 未声明的标识符
此时我说“当然这是未定义的,这就是为什么它是一个typedef!”
有人在声明中看到我的错误吗?
答案 0 :(得分:5)
您是否包含“ntdef.h”和“ntstatus.h”? 编译器可能无法理解NTSTATUS。