2

wdk を使用したドライバーのプログラミングに関する非常に興味深い記事を読みました。この記事で使用された関数の 1 つは、ObReferenceObjectByName と呼ばれます。この機能は私に多くの頭痛の種をもたらしました。最初の悪い点は、Microsoft によって文書化されていないことです。2 つ目は、この記事で使用されている言語は C++ であり、コードは単純な C のままにしておきたいということです。ほとんどの場合、これが問題にならないことはわかっていますが、実際にはそうではありません。私の人生 - この機能を含める方法を理解することができました.

この記事のコードは次のようになります。

extern "C"{

 #include <ntifs.h>


 NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName(PUNICODE_STRING ObjectName,

         ULONG Attributes,

         PACCESS_STATE AccessState,

         ACCESS_MASK DesiredAccess,

         POBJECT_TYPE ObjectType,

         KPROCESSOR_MODE AccessMode,

         PVOID ParseContext OPTIONAL,

         PVOID* Object);
}

これを何時間も再現しようとしてきました。「extern」キーワードなしで宣言しようとした、呼び出し規約を変更しようとした、インクルードを変​​更しようとした...常に「未解決の外部シンボル...」というエラーが発生します。

本当に困っているので、どなたかアドバイスいただけると助かります。ありがとう。

4

3 に答える 3

1

http://www.codeproject.com/KB/recipes/keystroke-hook.aspxを読んで、独自のキーボード ロガーを作成しようとすることはありませんか?

とにかく、これを使用する代わりに、代わりに ZwCreateFile を呼び出してから ObReferenceObjectByHandle を呼び出します。

于 2010-02-19T03:27:43.360 に答える
1

問題なくコンパイルおよびビルドされたテスト C コードを次に示します。

#include <ntddk.h>

NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName(
    PUNICODE_STRING ObjectName,
    ULONG Attributes,
    PACCESS_STATE AccessState,
    ACCESS_MASK DesiredAccess,
    POBJECT_TYPE ObjectType,
    KPROCESSOR_MODE AccessMode,
    PVOID ParseContext OPTIONAL,
    PVOID* Object
    );

NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
    ObReferenceObjectByName(0, 0, 0, 0, 0, 0, 0, 0);

    return STATUS_SUCCESS;
}
于 2010-02-19T07:26:14.603 に答える
0

私はこの API を知りませんが、問題の診断に役立つ可能性のあるトリックを提供できます。

パスに MSVC ツールがあるコマンド プロンプトで

link /dump /exports ???.dll

ここで、???.dll は、この関数が期待していた dll です。これにより、エクスポートされたシンボル名の完全なリストが得られ、2 つのことがわかります。1) シンボルはそこにありますか? 2) 試作品と同じように装飾されていますか。

32 ビット カーネルの場合、これが呼び出されることを期待する必要があります_ObReferenceObjectByName@64

于 2010-02-19T03:23:21.403 に答える