内部 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) の便利な「定義へ移動」機能を使用したところ、宣言内の NTAPI が __stdcall として定義されていることがわかりました。
残念ながら、宣言から NTAPI を削除すると、次のようになります。
typedef NTSTATUS (*_NtOpenProcess) (
OUT PHANDLE,
IN ACCESS_MASK,
IN POBJECT_ATTRIBUTES,
IN PCLIENT_ID OPTIONAL);
別のエラーが発生します。
エラー C2065: '_NtOpenProcess': 宣言されていない識別子
この時点で、私は「もちろん未定義です。だから typedef なのです!」と言っています。
宣言に私のエラーが表示されますか?