2009-03-25 22 views
6

内部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だ! "

宣言に誰かが私のエラーを見ますか?

+0

DDKからntdll.libを取得し、静的にリンクします。 –

答えて

4

「ntdef.h」と「ntstatus.h」を含めましたか? コンパイラはおそらくNTSTATUSを理解できません。

+0

私は大爆笑でしたと思った...しかし、ここでの問題だ - > NTSTATUS の#define LONG NTSTATUS #ifndefの #endifの私の周りLONGとNTSTATUSを切り替えます。 ありがとう! –