Кто-нибудь знаком с недокументированной функцией ядра Windows ObReferenceObjectByName? - PullRequest
2 голосов
/ 19 февраля 2010

Я прочитал очень увлекательную статью о программировании драйверов с использованием wdk, и одна из функций, которую он использовал, называется ObReferenceObjectByName. Эта функция доставила мне много головной боли. Первая плохая вещь - то, что это не зарегистрировано Microsoft. Второе, это то, что языком, использованным в статье, был 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, я пытался изменить соглашение о вызовах, я пытался изменить включения ... Я всегда получаю сообщение об ошибке "неразрешенный внешний символ ...".

Я абсолютно в замешательстве, поэтому, если кто-нибудь сможет дать какой-нибудь совет, я буду благодарен. Спасибо.

Ответы [ 3 ]

1 голос
/ 19 февраля 2010

Вы бы не читали http://www.codeproject.com/KB/recipes/keystroke-hook.aspx и не пытались бы создать свой собственный Keyboard Logger?

В любом случае, вместо использования, вместо этого вызовите ZwCreateFile, а затем ObReferenceObjectByHandle.

1 голос
/ 19 февраля 2010

Вот тестовый код 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;
}
0 голосов
/ 19 февраля 2010

Я не знаю этого API, но могу дать вам хитрость, которая может помочь вам диагностировать проблему.

в командной строке с указанием инструментов MSVC в пути

link /dump /exports ???.dll

где ???. Dll - это dll, где вы ожидали, что эта функция будет. Это даст вам полный список экспортированных имен символов и скажет вам две вещи. 1) есть ли там символ? и 2) он украшен так же, как ваш пробный прототип.

Для 32-битного ядра вы должны ожидать, что это будет называться _ObReferenceObjectByName@64,

...