7

内部 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 なのです!」と言っています。

宣言に私のエラーが表示されますか?

4

1 に答える 1

5

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

于 2009-03-25T01:32:25.813 に答える