Перебор стека устройств WDM

Насколько я понимаю, можно перебирать стек устройств WDM только снизу вверх, потому что DEVICE_OBJECT имеет член AttachedDevice (но не член LowerDevice). К счастью, обратный вызов AddDevice получает объект PhysicalDeviceObject, поэтому вы можете выполнить итерацию по всему стеку.

Из своего драйвера фильтра я пытаюсь определить, фильтрую ли я уже определенный объект устройства. (Допустим, у меня есть законная причина для этого. Потерпите меня.) Моя идея состояла в том, чтобы просмотреть каждый DEVICE_OBJECT в стеке и сравнить его элемент DriverObject с моим.

Судя по существованию IoGetAttachedDeviceReference, я предполагаю, что простой доступ к AttachedDevice небезопасен из-за риска внезапного исчезновения устройства. Однако IoGetAttachedDeviceReference выводит меня прямо на вершину стека, что мне не подходит.

Итак, существует ли безопасный способ перебора стека устройств?


person Ilya    schedule 23.02.2011    source источник


Ответы (1)


Правильно, вы не можете безопасно пройти по цепочке AttachedDevice, если вы не можете каким-то образом гарантировать, что стек не будет разорван (например, если у вас есть активный файловый объект, ссылающийся на стек). В Win2K это практически единственный вариант.

В XP и более поздних версиях предпочтительным методом является обход с вершины стека вниз. Это можно сделать, вызвав IoGetAttachedDeviceReference, а затем вызвав IoGetLowerDeviceObject.

-Скотт

person snoone    schedule 24.02.2011
comment
Ого, IoGetLowerDeviceObject, не знаю, как я это пропустил :) Спасибо! - person Ilya; 25.02.2011