据我了解,只能从下往上迭代 WDM 设备的设备堆栈,因为 DEVICE_OBJECT 有一个 AttachedDevice 成员(但不是 LowerDevice 成员)。幸运的是,AddDevice 回调接收到 PhysicalDeviceObject,因此您可以遍历整个堆栈。
从我的过滤器驱动程序中,我试图确定我是否已经在过滤某个设备对象。(假设我对此有正当理由。请耐心等待。)我的想法是检查堆栈中的每个 DEVICE_OBJECT 并将其 DriverObject 成员与我的成员进行比较。
从 IoGetAttachedDeviceReference 的存在来看,我认为仅仅访问 AttachedDevice 并不是一件安全的事情,因为设备突然消失的风险。但是,IoGetAttachedDeviceReference 将我直接带到了堆栈的顶部,这对我没有好处。
那么,有没有一种安全的方法来迭代设备堆栈?