2011-02-23 30 views
2

據我所知,一個只能從塔底向上遍歷WDM設備的設備棧,因爲DEVICE_OBJECT具有AttachedDevice構件(但不是LowerDevice構件)。幸運的是,AddDevice回調接收PhysicalDeviceObject,因此您可以迭代整個堆棧。迭代WDM設備棧

從我的過濾驅動程序中,我想確定我是否已經過濾了一定的設備對象。 (假設我有一個合法的理由,請和我一起)。我的想法是遍歷堆棧中的每個DEVICE_OBJECT,並將其DriverObject成員與我的相比較。

從IoGetAttachedDeviceReference的存在判斷,我認爲只是訪問AttachedDevice不是一件安全的事情,因爲設備突然消失的風險。但是,IoGetAttachedDeviceReference將我直接帶到堆棧的頂部,這對我來說並不好。

那麼,有沒有一種設備堆棧遍歷一個安全的方式?

回答

4

正確的,你不能安全地走AttachedDevice鏈,除非你能以某種方式保證堆棧將不被拆毀了(例如,如果你有一個活躍的文件對象引用的堆棧)。在Win2K上,這幾乎是你唯一的選擇。

在XP和更高,優選的方法實際上是從堆棧向下的頂部行走。你可以通過調用IoGetAttachedDeviceReference然後調用IoGetLowerDeviceObject來做到這一點。

斯科特

+0

喔,IoGetLowerDeviceObject,我不知道我怎麼錯過了一個:)謝謝! – Ilya 2011-02-25 01:12:30