内部Windows NT API関数NtOpenProcessを呼び出そうとしています。内部APIを呼び出すことは悪い考えですが、この特定のツールでは、このAPIが提供する低レベルのアクセスが必要です。関数ポインタの定義
私の問題は、それを行うにはthis article
に指定されているように、私は、実行時のダイナミックリンクを使用する必要があることは、このような内部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にエラーがあります。コンパイラが戻る:
私はIDEの便利なダンディ「定義に移動」機能(のVisual Studio 2008)を使用し、宣言でNTAPIが__stdcallとして定義されていることがわかりました。残念ながら
、それはこの作り、私の宣言からNTAPIを削除する:私は理由です、もちろんそれは未定義だ」と言っています。この時点で
error C2065: '_NtOpenProcess' : undeclared identifier
:別のエラーで
typedef NTSTATUS (*_NtOpenProcess) (
OUT PHANDLE,
IN ACCESS_MASK,
IN POBJECT_ATTRIBUTES,
IN PCLIENT_ID OPTIONAL);
結果それはtypedefだ! "
宣言に誰かが私のエラーを見ますか?
DDKからntdll.libを取得し、静的にリンクします。 –