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

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

2 голосов
/ 23 февраля 2011

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

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

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

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

1 Ответ

4 голосов
/ 24 февраля 2011

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

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

-scott

...