迭代WDM设备堆栈

时间:2011-02-23 18:34:01

标签: windows device-driver wdm

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

在XP及更高版本中,首选方法实际上是从堆栈顶部向下走。您可以通过调用IoGetAttachedDeviceReference然后调用IoGetLowerDeviceObject来完成此操作。

-Scott