2

据我了解,只能从下往上迭代 WDM 设备的设备堆栈,因为 DEVICE_OBJECT 有一个 AttachedDevice 成员(但不是 LowerDevice 成员)。幸运的是,AddDevice 回调接收到 PhysicalDeviceObject,因此您可以遍历整个堆栈。

从我的过滤器驱动程序中,我试图确定我是否已经在过滤某个设备对象。(假设我对此有正当理由。请耐心等待。)我的想法是检查堆栈中的每个 DEVICE_OBJECT 并将其 DriverObject 成员与我的成员进行比较。

从 IoGetAttachedDeviceReference 的存在来看,我认为仅仅访问 AttachedDevice 并不是一件安全的事情,因为设备突然消失的风险。但是,IoGetAttachedDeviceReference 将我直接带到了堆栈的顶部,这对我没有好处。

那么,有没有一种安全的方法来迭代设备堆栈?

4

1 回答 1

4

正确,除非您能以某种方式保证堆栈不会被拆除(例如,如果您有一个引用堆栈的活动文件对象),否则您不能安全地遍历 AttachedDevice 链。在 Win2K 上,这几乎是您唯一的选择。

在 XP 和更高版本上,首选方法实际上是从堆栈顶部向下走。您可以通过调用 IoGetAttachedDeviceReference 然后调用 IoGetLowerDeviceObject 来做到这一点。

-斯科特

于 2011-02-24T15:53:31.363 回答