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

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

ru
Offline Offline

« : 11-01-2011 07:34 » 

Здравствуйте. У меня есть указатель на некоторый DeviceObject. Мне нужно найти все остальные девайс обжекты в стеке устройств. У DEVICE_OBJECT есть поле DeviceQueue, может как-то через него?
Записан
Ochkarik
Модератор

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

« Ответ #1 : 11-01-2011 09:26 » 

нет. вам нужно
  struct _DEVICE_OBJECT * AttachedDevice;
это в одну сторону.  в другую IoGetAttachedDeviceReference или типа того..
только проверьте - я мог напутать)

Добавлено через 5 минут и 24 секунды:
или IoGetLowerDeviceObject....)
« Последнее редактирование: 11-01-2011 09:32 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
srmx
Новенький

ru
Offline Offline

« Ответ #2 : 11-01-2011 09:46 » new

Для IoGetAttachedDeviceReference написано:
Цитата
The IoGetAttachedDeviceReference routine returns a pointer to the highest level device object in a driver stack and increments the reference count on that object.
То есть самый последний.

IoGetLowerDeviceObject, похоже, то, что нужно, правда, несколько смущает:
Цитата
IoGetLowerDeviceObject returns NULL if:
The next-lower-level driver is not loaded.
The next-lower-level driver is currently being unloaded, removed, or deleted.

The device object pointed to by DeviceObject is the lowest device object in the driver stack.
Возможно, я смогу просмотреть не все объекты.

Алгоритм примерно такой: берём верхний объект в стеке функцией IoGetAttachedDeviceReference, затем идём вниз, вызывая IoGetLowerDeviceObject. Нужно не забыть вызвать ObDereferenceObject для верхнего объекта.

Добавлено через 2 часа, 5 минут и 18 секунд:
Ещё такой вопрос. Как можно получить все устройства, работающие в системе? Знаю, что можно получить все драйвера через ZwQuerySystemInformation(SystemModuleInformation, ..). Есть ещё один способ, уже забыл, давно делал.. Вроде, просмотр корневой директории \\??\\ или \\DosDevices\\ через ZwQueryDirectoryFile...
« Последнее редактирование: 11-01-2011 11:51 от srmx » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines