Насколько я понимаю, можно перебирать стек устройств WDM только снизу вверх, потому что DEVICE_OBJECT имеет член AttachedDevice (но не член LowerDevice). К счастью, обратный вызов AddDevice получает объект PhysicalDeviceObject, поэтому вы можете выполнить итерацию по всему стеку.
Из своего драйвера фильтра я пытаюсь определить, фильтрую ли я уже определенный объект устройства. (Допустим, у меня есть законная причина для этого. Потерпите меня.) Моя идея состояла в том, чтобы просмотреть каждый DEVICE_OBJECT в стеке и сравнить его элемент DriverObject с моим.
Судя по существованию IoGetAttachedDeviceReference, я предполагаю, что простой доступ к AttachedDevice небезопасен из-за риска внезапного исчезновения устройства. Однако IoGetAttachedDeviceReference выводит меня прямо на вершину стека, что мне не подходит.
Итак, существует ли безопасный способ перебора стека устройств?