Запрашиваю хэндлы в XP SP2. Вот таким образом: Код (Text): ULONG Length = 0; NTSTATUS tmp = ZwQuerySystemInformation(SystemHandleInformation, NULL, 0, &Length); if (Length > 0) { PSYSTEM_HANDLE_INFORMATION Info = (PSYSTEM_HANDLE_INFORMATION)ExAllocatePoolWithTag(PagedPool, Length, 'ofnI'); if (Info != NULL) { st = ZwQuerySystemInformation(SystemHandleInformation, Info, Length, &Length); Логично, что tmp равно STATUS_INFO_LENGTH_MISMATCH после первого вызова. А вот то, что Length равно 0, нелогично. Дело в том, что абсолютно аналогичный код работает как надо: Код (Text): ULONG Length = 0; PSYSTEM_MODULE_INFORMATION InfoPtr = NULL; st = ZwQuerySystemInformation(SystemModuleInformation, InfoPtr, 0, &Length); if (Length > 0) { InfoPtr = (PSYSTEM_MODULE_INFORMATION)ExAllocatePoolWithTag(PagedPool, Length, 'sldM'); if (InfoPtr != NULL) { st = ZwQuerySystemInformation(SystemModuleInformation, InfoPtr, Length, &Length); Вызываются оба фрагмента абсолютно одинаково. Есть клиент, который вызывает DeviceIoControl, а мой драйвер обрабатывает несколько различных IOCTL, оба фрагмента находятся в начале соответствующих обработчиков. Буду благодарен за любые советы (ну, увеличение буфера в два раза в цикле - это понятно, но хочется сделать красиво).
SoftCreator Это и есть красиво, т.к. единственный вариант. Возврат требуемой длины для большинства инфоклассов не предусмотрен.
Код (Text): case SystemHandleInformation: if (SystemInformationLength < sizeof( SYSTEM_HANDLE_INFORMATION )) { return STATUS_INFO_LENGTH_MISMATCH; } if (!POINTER_IS_ALIGNED (SystemInformation, TYPE_ALIGNMENT (SYSTEM_HANDLE_INFORMATION))) { return STATUS_DATATYPE_MISALIGNMENT; } Status = ExpGetHandleInformation( SystemInformation, SystemInformationLength, &Length ); if (ARGUMENT_PRESENT( ReturnLength )) { *ReturnLength = Length; } break;
wasm@conference.jabber.ru Код (Text): [20:31:01] <l_inc> Indy: Вы не могли бы пояснить свой комментарий в этой теме? http://www.wasm.ru/forum/viewtopic.php?id=38579 Никак не догоню, к чему это. [20:32:27] <Indy> l_inc: лучший ответ в данном случае это часть хэндлера [20:35:17] <l_inc> Indy: Так она разве что-то поясняет? [20:39:30] <Indy> да [20:39:42] <dfrsa> мин размер нужно давать как размепър структуры, а не ноль [20:39:44] <Indy> Этоже хэндлер. [20:39:51] <Indy> Угу [20:40:38] <Indy> Точнее нужно передать размер одного входа в слепке [20:40:46] <Indy> if (SystemInformationLength < sizeof( SYSTEM_HANDLE_INFORMATION )) { return STATUS_INFO_LENGTH_MISMATCH; } [20:40:56] <Indy> Чтоб вызов прошёл и возвратился размер. [20:41:30] <l_inc> Ну и что? Можно подумать, что если передать стартовый размер в две структуры, так мне вернётся ненулевой требуемый. [20:41:42] <Indy> да так и будет [20:42:13] <l_inc> Не проверял, но думаю, ExpGetHandleInformation вернёт нуль. [20:42:19] <Indy> неа [20:42:36] <l_inc> В смысле не в статус, а в Length. [20:42:45] <Indy> Возвращает. [20:42:50] <Indy> размер [20:43:21] <l_inc> Лан. Поверим на слово, но позже проверю. [20:44:10] <Indy> Тока буфер не забудьте передать [20:44:16] <l_inc> :-) [20:44:18] <Indy> Хотябы размером в один вход [20:44:36] <Indy> Ну это само собой понятно, так как вызов немного не стандартный. [20:44:54] <Indy> А вобще ваш вопрос к чему был ? [20:45:53] <l_inc> К тому что часто вижу от Вас ответы, которые по-моему мнению ни разу не в тему. [20:46:04] <Indy> хм [20:46:29] <Indy> Или вы не понимаете ответа, также как и в данном случае [20:46:42] <l_inc> Особенно если это кусок кода без каких-либо пояснений о том, что же имелось в виду. [20:46:48] <Indy> Тоесть нужно было автору дать к приведённому коду псевдокод ? [20:47:18] <Indy> Нех наглеть, пусть сам придёт к решению. Там всегото пройти проверку поинтера на буфер. [20:47:50] <only> правильно [20:47:58] <only> за наглость еще и бан надо было [20:48:04] <only> добрый ты [20:48:05] <Indy> ) [20:48:29] <l_inc> Ну да. Но ИМХО не помешали бы одно-два предложения текстом. [20:49:40] <only> можно даже это было бы написать как причину бана [20:49:45] <l_inc> А в общем ладно. Это только моё скромное мнение. [20:49:49] <only> ответ на вопрос и бан на месяц