Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка чтения параметра из реестра  (Прочитано 6101 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Игорь98
Новенький

ru
Offline Offline

« : 19-10-2011 13:32 » 

Здравствуйте уважаемые программисты. Хочу научиться программировать драйвера. Вот учусь Улыбаюсь Возникли вопросы, с которыми мне одному не разобраться. Необходимо прочитать параметр из реестра. Вот мои наработки:
Код: (C++)
#include <ntddk.h>

VOID ReadUserinit()
{
        UNICODE_STRING key;
        UNICODE_STRING param;
        OBJECT_ATTRIBUTES ObjAtr;
        HANDLE hKey;
        NTSTATUS opn, rd;
        PKEY_VALUE_PARTIAL_INFORMATION info;
        LONG size;
       
        DbgPrint("Start");
       
        RtlInitUnicodeString(&key, L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
        RtlInitUnicodeString(&param, L"Userinit");
                       
        InitializeObjectAttributes(&ObjAtr, &key, OBJ_CASE_INSENSITIVE, NULL, NULL);
       
        opn = ZwOpenKey(&hKey, KEY_QUERY_VALUE, &ObjAtr);
       
        if(opn == STATUS_SUCCESS)
        {
                DbgPrint("ZwOpenKey()...YES");
                rd = ZwQueryValueKey(hKey, &param, KeyValuePartialInformation, NULL, 0, &size);
                if(rd == STATUS_SUCCESS)
                {
                        DbgPrint("ZwQueryValueKey(1)...YES");
                        info = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(PagedPool, size);
                        rd = ZwQueryValueKey(hKey, &param, KeyValuePartialInformation, info, sizeof(KEY_VALUE_PARTIAL_INFORMATION), &size);
                        if(rd = STATUS_SUCCESS)
                        {
                                DbgPrint("ZwQueryValueKey(2)...YES");
                                DbgPrint("Parametr: %s", info);
                        }
                        else
                        {
                                DbgPrint("ZwQueryValueKey(2)...NO");
                        }
                        ExFreePool(info);
                }
                else
                {
                        DbgPrint("ZwQueryValueKey(1)...NO");
                }
                ZwClose(hKey);
        }
        else
        {
                DbgPrint("ZwOpenKey()...NO");
        }
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
    DbgPrint("Loaded");
    ReadUserinit();    
    return STATUS_DEVICE_CONFIGURATION_ERROR;
}
При запуске драйвера и отладке программой DbgView, выполнение драйвера прекращается при первом вызове функции ZwQueryValueKey() т. е. DbgView выводит "ZwQueryValueKey(1)...NO" и далее, разумеется, ничего не работает. Прошу объяснить мне, где я не прав.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-10-2011 13:51 » 

попробуйте сделать как тут, если не получится снова - тогда будем копать)
https://forum.shelek.ru/index.php/topic,4628.0.html
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
zubr
Гость
« Ответ #2 : 19-10-2011 14:17 » 

Игорь98, буфер под KeyValuePartialInformation надо сразу выделять.
Примерно так:
Код:
buflen = MAX_PATH * sizeof(WCHAR) + 3 * sizeof(ULONG);
buf = ExAllocatePoolWithTag(PagedPool, buflen, DRIVER_TAG);
   
status = ZwQueryValueKey(hKey, &param, KeyValuePartialInformation,  (PVOID)buf,  buflen, &size);
И если из драйвера функция вызывается, то InitializeObjectAttributes надо с флагом OBJ_KERNEL_HANDLE вызывать:
Код:
InitializeObjectAttributes(&ObjAtr, &key, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines