ZwQuerySystemInformation требует 0 байт памяти для буфера, что делать?

Тема в разделе "WASM.NT.KERNEL", создана пользователем SoftCreator, 9 сен 2010.

  1. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    Запрашиваю хэндлы в XP SP2. Вот таким образом:

    Код (Text):
    1.     ULONG Length = 0;
    2.     NTSTATUS tmp = ZwQuerySystemInformation(SystemHandleInformation, NULL, 0, &Length);
    3.     if (Length > 0)
    4.     {
    5.         PSYSTEM_HANDLE_INFORMATION Info = (PSYSTEM_HANDLE_INFORMATION)ExAllocatePoolWithTag(PagedPool, Length, 'ofnI');
    6.         if (Info != NULL)
    7.         {
    8.             st = ZwQuerySystemInformation(SystemHandleInformation, Info, Length, &Length);
    Логично, что tmp равно STATUS_INFO_LENGTH_MISMATCH после первого вызова. А вот то, что Length равно 0, нелогично.
    Дело в том, что абсолютно аналогичный код работает как надо:

    Код (Text):
    1.         ULONG Length = 0;
    2.     PSYSTEM_MODULE_INFORMATION InfoPtr = NULL;
    3.     st = ZwQuerySystemInformation(SystemModuleInformation, InfoPtr, 0, &Length);
    4.     if (Length > 0)
    5.     {
    6.         InfoPtr = (PSYSTEM_MODULE_INFORMATION)ExAllocatePoolWithTag(PagedPool, Length, 'sldM');
    7.         if (InfoPtr != NULL)
    8.         {
    9.             st = ZwQuerySystemInformation(SystemModuleInformation, InfoPtr, Length, &Length);
    Вызываются оба фрагмента абсолютно одинаково. Есть клиент, который вызывает DeviceIoControl, а мой драйвер обрабатывает несколько различных IOCTL, оба фрагмента находятся в начале соответствующих обработчиков.
    Буду благодарен за любые советы (ну, увеличение буфера в два раза в цикле - это понятно, но хочется сделать красиво).
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SoftCreator
    Это и есть красиво, т.к. единственный вариант. Возврат требуемой длины для большинства инфоклассов не предусмотрен.
     
  3. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    Спасибо, буду знать
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1.         case SystemHandleInformation:
    2.             if (SystemInformationLength < sizeof( SYSTEM_HANDLE_INFORMATION )) {
    3.                 return STATUS_INFO_LENGTH_MISMATCH;
    4.             }
    5.  
    6.             if (!POINTER_IS_ALIGNED (SystemInformation, TYPE_ALIGNMENT (SYSTEM_HANDLE_INFORMATION))) {
    7.                 return STATUS_DATATYPE_MISALIGNMENT;
    8.             }
    9.  
    10.             Status = ExpGetHandleInformation( SystemInformation,
    11.                                               SystemInformationLength,
    12.                                               &Length
    13.                                             );
    14.  
    15.             if (ARGUMENT_PRESENT( ReturnLength )) {
    16.                 *ReturnLength = Length;
    17.             }
    18.             break;
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    wasm@conference.jabber.ru
    Код (Text):
    1. [20:31:01] <l_inc> Indy: Вы не могли бы пояснить свой комментарий в этой теме?
    2. http://www.wasm.ru/forum/viewtopic.php?id=38579
    3. Никак не догоню, к чему это.
    4. [20:32:27] <Indy> l_inc: лучший ответ в данном случае это часть хэндлера
    5. [20:35:17] <l_inc> Indy: Так она разве что-то поясняет?
    6. [20:39:30] <Indy> да
    7. [20:39:42] <dfrsa> мин размер нужно давать как размепър структуры, а не ноль
    8. [20:39:44] <Indy> Этоже хэндлер.
    9. [20:39:51] <Indy> Угу
    10. [20:40:38] <Indy> Точнее нужно передать размер одного входа в слепке
    11. [20:40:46] <Indy> if (SystemInformationLength < sizeof( SYSTEM_HANDLE_INFORMATION )) {
    12.                 return STATUS_INFO_LENGTH_MISMATCH;
    13.             }
    14. [20:40:56] <Indy> Чтоб вызов прошёл и возвратился размер.
    15. [20:41:30] <l_inc> Ну и что? Можно подумать, что если передать стартовый размер в две структуры, так мне вернётся ненулевой требуемый.
    16. [20:41:42] <Indy> да так и будет
    17. [20:42:13] <l_inc> Не проверял, но думаю, ExpGetHandleInformation вернёт нуль.
    18. [20:42:19] <Indy> неа
    19. [20:42:36] <l_inc> В смысле не в статус, а в Length.
    20. [20:42:45] <Indy> Возвращает.
    21. [20:42:50] <Indy> размер
    22. [20:43:21] <l_inc> Лан. Поверим на слово, но позже проверю.
    23. [20:44:10] <Indy> Тока буфер не забудьте передать
    24. [20:44:16] <l_inc> :-)
    25. [20:44:18] <Indy> Хотябы размером в один вход
    26. [20:44:36] <Indy> Ну это само собой понятно, так как вызов немного не стандартный.
    27. [20:44:54] <Indy> А вобще ваш вопрос к чему был ?
    28. [20:45:53] <l_inc> К тому что часто вижу от Вас ответы, которые по-моему мнению ни разу не в тему.
    29. [20:46:04] <Indy> хм
    30. [20:46:29] <Indy> Или вы не понимаете ответа, также как и в данном случае
    31. [20:46:42] <l_inc> Особенно если это кусок кода без каких-либо пояснений о том, что же имелось в виду.
    32. [20:46:48] <Indy> Тоесть нужно было автору дать к приведённому коду псевдокод ?
    33. [20:47:18] <Indy> Нех наглеть, пусть сам придёт к решению. Там всегото пройти проверку поинтера на буфер.
    34. [20:47:50] <only> правильно
    35. [20:47:58] <only> за наглость еще и бан надо было
    36. [20:48:04] <only> добрый ты
    37. [20:48:05] <Indy> )
    38. [20:48:29] <l_inc> Ну да. Но ИМХО не помешали бы одно-два предложения текстом.
    39. [20:49:40] <only> можно даже это было бы написать как причину бана
    40. [20:49:45] <l_inc> А в общем ладно. Это только моё скромное мнение.
    41. [20:49:49] <only> ответ на вопрос и бан на месяц