Перечисление всех драйверов в системе
От: Vovik1982 Россия  
Дата: 02.12.07 19:29
Оценка:
Всем привет. Помогите, если кто знает. Мне надо получить PDRIVER_OBJECT для каждого работающего в системе драйвера.
Заранее благодарен.
Re: Перечисление всех драйверов в системе
От: Unmanaged Россия ICQ 476611995
Дата: 03.12.07 15:53
Оценка:
V>Всем привет.

Даова.

V>Помогите, если кто знает.


А кто не знает — тем что теперь делать?

V>Мне надо получить PDRIVER_OBJECT для каждого работающего в системе драйвера.


Драйвера находятся в папке \Driver.
Папка — имеется в виду объект — directory — Менеджера объектов ядра.
Объекты, находящиеся в папке \Driver, являются драйверами, т.е. имеют тип IoDriverObjectTypeDRIVER_OBJECT.
Для работы с папками ядра предназначены следующие экспорты ядра:

ZwOpenDirectoryObject()
ZwQueryDirectoryObject()
ZwClose()

Вызов ZwQueryDirectoryObject() на данный момент почему-то недокументирован, вот его описание:

NTSYSAPI 
NTSTATUS
NTAPI
ZwQueryDirectoryObject (
  IN HANDLE               DirectoryObjectHandle,
  OUT PDIRECTORY_OBJECT_INFORMATION DirectoryObjectInformation,
  IN ULONG                BufferLength,
  IN BOOLEAN              GetNextIndex,
  IN BOOLEAN              IgnoreInputIndex,
  IN OUT PULONG           ObjectIndex,
  OUT PULONG              DataWritten OPTIONAL);

typedef struct _DIRECTORY_OBJECT_INFORMATION
{
  UNICODE_STRING          ObjectName;
  UNICODE_STRING          ObjectTypeName;
  BYTE                    Data [1];
}
DIRECTORY_OBJECT_INFORMATION, *PDIRECTORY_OBJECT_INFORMATION;


Более подробно здесь — просто замените префикс Nt- на Zw-.
Ещё более подробно — в исходниках ядра Windows Server 2003.

V>Заранее благодарен.


$100
STATUS_INVALID_DEVICE_REQUEST
Re[2]: Перечисление всех драйверов в системе
От: Злость Россия  
Дата: 04.12.07 07:56
Оценка:
Здравствуйте, Unmanaged, Вы писали:

[skip]

U>Драйвера находятся в папке \Driver.

U>Папка — имеется в виду объект — directory — Менеджера объектов ядра.
U>Объекты, находящиеся в папке \Driver, являются драйверами, т.е. имеют тип IoDriverObjectTypeDRIVER_OBJECT.
U>Для работы с папками ядра предназначены следующие экспорты ядра:

Драйвер может где угодно находится в дереве обьектов ядра.

[skip]

V>>Заранее благодарен.


U>$100


Так что вам неустойку предется заплатить в размере $1000
... << RSDN@Home 1.2.0 alpha rev. 685>>
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[3]: Перечисление всех драйверов в системе
От: Unmanaged Россия ICQ 476611995
Дата: 04.12.07 18:01
Оценка:
U>>Драйвера находятся в папке \Driver.
U>>Папка — имеется в виду объект — directory — Менеджера объектов ядра.
U>>Объекты, находящиеся в папке \Driver, являются драйверами, т.е. имеют тип IoDriverObjectTypeDRIVER_OBJECT.
З>Драйвер может где угодно находится в дереве обьектов ядра.

Теперь всем понятно, чем коллективный разум лучше .

Абсолютно верно.
Основные папки, в которых расположены объекты-драйвера, это \Driver и \FileSystem.
Но могут быть и другие, хотя это — скорее исключительный случай.
Если нужно перечислить именно все драйвера, то придётся рекурсивно обходить дерево объектов.

P.S.
$200
STATUS_INVALID_DEVICE_REQUEST
Re: Перечисление всех драйверов в системе
От: Maxim S. Shatskih Россия  
Дата: 06.12.07 11:24
Оценка:
V>Всем привет. Помогите, если кто знает. Мне надо получить PDRIVER_OBJECT для каждого работающего в системе драйвера.
V>Заранее благодарен.

Если надо перечислить не DRIVER_OBJECTы, а загруженные .SYS бинари — то для этого есть PsLoadedModuleList.

lm(v) в WinDbg по этому списку и гуляет. Для гуляния из своего кода есть одна из функций библиотеки AuxKLib (забыл, какая).
Занимайтесь LoveCraftом, а не WarCraftом!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.