我试图调用内部Windows NT API函数NtOpenProcess.我知道调用内部API可能是一个坏主意,但对于这个特定的工具,我需要这个API提供的低级访问.
我的问题是,要使用这样的内部API,我需要使用运行时动态链接,如本文所述
为此,我需要定义一个指向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!"
有没有人在声明中看到我的错误?
你有"ntdef.h"和"ntstatus.h"吗?编译器可能无法理解NTSTATUS.