2010-10-13 3 views
1

В течение жизни я не могу понять, как разрешить объявленное значение NTQueryKey в драйвере устройства. Я искал форум драйверов устройств, но не нашел его.Как подключиться к NTQueryKey в режиме ядра

Может ли кто-нибудь указать мне нужное место? OSR не очень отзывчива с глупыми вопросами, например, как ссылаться на NTQueryKey.

Вот мой прототип:

NTSYSAPI NTSTATUS NTAPI NtQueryKey(HANDLE, KEY_INFORMATION_CLASS, PVOID, ULONG, ULONG *); 

и отлично компилируется, но компоновщик не нравится.

Благодаря

+0

Не могли бы вы привести пример кода, который не выполняется при вызове ZwQueryKey? –

ответ

0

В режиме ядра вы связываете к .... эквивалентным функциям Zw. See Here. Функции NT .... вызываются из пользовательского режима (например, подсистема Win32 будет вызывать функции NT ...).

+0

Я пытаюсь использовать ZwQueryKey, но я получаю STATUS_INVALID_HANDLE. Все, что я пытаюсь сделать, это получить имя ключа на компьютере под управлением Windows 2003 в процедуре PostCreateOpenKeyEx. – Iunknown

+0

Для полноты полного обсуждения различий между вариантами Nt и Zw можно найти здесь: http://www.osronline.com/article.cfm?id=257. – snoone

2

Функции NtXXXX не должны вызываться из режима ядра. Вместо этого используйте функции ZwXXXX. В вашем случае вы хотите ZwQueryKey. Он имеет ту же подпись, что и NtQueryKey, но выполняет действия на x86, необходимые для разговора с режимом ядра, и он предоставляется ntoskrnl.exe, а не ntdll.dll.

+0

Проблема у меня есть, я пытаюсь открыть ключ режима пользователя. Сначала я пытаюсь ZwQueryKey, и я получаю ошибку Invalid Handle, которая, как я понял, означает, что мне нужно использовать NTQueryKey. – Iunknown

+0

@kunknown: Что вы подразумеваете под клавишей режима пользователя? ZwQueryKey - это то же самое, что и NtQueryKey в отношении того, как он работает. Единственное различие заключается в том, что NtQueryKey делает кучу syscall crap. –

+0

С небольшой помощью от OSR я думаю, что нашел проблему. Я неправильно понял a «Указатель на объект ключа реестра» не является указателем на дескриптор. Теперь попробуйте ObOpenObjectByPointer. – Iunknown