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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно читать реестр из драйвера?  (Прочитано 5909 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Detsel
Гость
« : 22-09-2004 13:03 » 

Доброго времени суток! Подскажите пожалуйста, что делаю не так! В DriverEntry пытаюсь читать из реестра. Читаю ключ тип которого REG_SZ. Делаю это следующим образом
UNICODE_STRING         tmpUnicode, ValueName;
OBJECT_ATTRIBUTES   ObjectAttributes;
HANDLE KeyHandle;
KEY_VALUE_PARTIAL_INFORMATION *pInformation;
ULONG uSize, retSize;
char* Data;


....................................................................


RtlInitUnicodeString(&tmpUnicode, L"\\REGISTRY\\MACHINE\\SYSTEM\\ControlSet001\\Services\\DrvFltIp");
   RtlInitUnicodeString(&ValueName, L"Setup_Path");
   InitializeObjectAttributes(&ObjectAttributes,
                               &tmpUnicode,
                               0 ,
                               NULL,
                               NULL);
   ntStatus=ZwOpenKey(&KeyHandle, KEY_QUERY_VALUE | KEY_READ,&ObjectAttributes );
   if(!NT_SUCCESS(ntStatus))
   {
      if(ntStatus==STATUS_INVALID_HANDLE)
         dprintf("STATUS_INVALID_HANDLE");
      if(ntStatus==STATUS_ACCESS_DENIED)
         dprintf("STATUS_ACCESS_DENIED");
   }
      


   uSize=sizeof(KEY_VALUE_PARTIAL_INFORMATION)+4096;
   pInformation=ExAllocatePool(PagedPool,sizeof(KEY_VALUE_PARTIAL_INFORMATION));
   RtlZeroMemory(pInformation,sizeof(KEY_VALUE_PARTIAL_INFORMATION));
   
   ntStatus=ZwQueryValueKey(KeyHandle, &ValueName,KeyValuePartialInformation, pInformation,uSize,&retSize);
   if(!NT_SUCCESS(ntStatus))
   {
      if(ntStatus==STATUS_BUFFER_TOO_SMALL)
         dprintf("STATUS_BUFFER_TOO_SMALL");
      if(ntStatus==STATUS_INVALID_PARAMETER)
         dprintf("STATUS_INVALID_PARAMETER");
      if(ntStatus==STATUS_OBJECT_NAME_NOT_FOUND)
         dprintf("STATUS_OBJECT_NAME_NOT_FOUND");
   }
   ZwClose(KeyHandle);
   Data=ExAllocatePool(PagedPool,pInformation->DataLength);
   RtlZeroMemory(Data,pInformation->DataLength);
   sprintf(Data,pInformation->Data);

   dprintf("%s",Data);
   ExFreePool(pInformation);
   ExFreePool(Data);


После всего получаю в Data "\" и все! То есть один символ того что пытаюсь прочитать! Скажите пожалуйста что делаю неправильно! Заранее большой Thanks!
Записан
Серж
Гость
« Ответ #1 : 22-09-2004 13:29 » 

Detsel,  проблемы с настройками Юникода.
pInformation->Data - строка в Юникоде, а sprintf поступает с ней, как с обычной строкой. Коптрует первый символ '\',  а второй ноль воспринимает, как конец строки.
Записан
Detsel
Гость
« Ответ #2 : 22-09-2004 20:28 » 

Тогда подскажите мне как получить эти долбанные данные=) pInformation->Data это uchar а мне нужно либо wchar_t либо на крайний случай char! Я уже мозг себе сломал(или он уже сломан и поэтому не получается) постоянно BSOD. PLEASEEEEEE!!!!
Записан
Серж
Гость
« Ответ #3 : 23-09-2004 06:50 » 

Detsel, попробуй заменить sprintf на RtlMoveMemory
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines