質問
私は、内部のWindows NT API関数を呼び出すNtOpenProcessしようとしています。私は悪いアイデアをすることができ、内部APIを呼び出す知っているが、この特定のツールのために、私は、このAPIが提供する低レベルのアクセスを必要とします。
私の問題は、このような内部APIを使用することで、私は<のhref = "http://msdn.microsoft.com/en-us/library/ms686944(VSに指定されているように、ランタイム動的リンクを使用する必要があります。 85)の.aspx」REL = "noreferrer">この記事
これを行うには、私は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のだ理由です、もちろんそれは未定義だ!」と言っています。
誰もが宣言の中で、私のエラーが表示されていますか?
解決
あなたが "ntdef.h" と "ntstatus.h" が含まれていましたか? コンパイラは、おそらくNTSTATUSを理解カントます。