何時建立 WDM 裝置物件?
本節說明每一種裝置物件,並在建立每個物件時提及。
下圖顯示可在裝置堆疊中附加的可能裝置物件種類,代表處理裝置 I/O 要求的驅動程式。
從此圖底部開始:
總線驅動程式會為其在總線上列舉的每個裝置建立 PDO。
總線驅動程式會在列舉裝置時為子裝置建立 PDO。 總線驅動程式會列舉裝置,以回應 PnP 管理員的 BusRelationsIRP_MN_QUERY_DEVICE_RELATIONS要求。 如果裝置自上次總線驅動程序回應 BusRelations 的查詢關聯要求 (,或這是自) 機器開機后的第一個查詢關聯要求,則總線驅動程式會為子裝置建立 PDO。
PDO 代表總線驅動程式的裝置,以及其他內核模式系統元件,例如電源管理員、PnP 管理員和 I/O 管理員。
裝置的其他驅動程式會在 PDO 頂端附加裝置物件,但 PDO 一律位於裝置堆疊底部。
選擇性總線篩選驅動程式會為其篩選的每個裝置建立篩選 DO。
當 PnP 管理員在 BusRelations 清單中偵測到新的裝置時,它會判斷裝置是否有任何總線篩選驅動程式。 如果是的話,對於每個這類驅動程式,PnP 管理員都會確保載入 (視需要呼叫 DriverEntry) ,並呼叫驅動程式的 AddDevice 例程。 如果總線篩選驅動程式篩選此裝置的作業,篩選驅動程式會建立裝置物件,並將它附加到其 AddDevice 例程中的裝置堆疊。 如果有多個總線篩選驅動程式存在,且與此裝置相關,則每個這類篩選驅動程式都會建立並附加自己的裝置物件。
選擇性、較低層級的篩選驅動程式會為其篩選的每個裝置建立篩選 DO。
如果此裝置有選擇性的較低層級篩選驅動程式存在,PnP 管理員可確保在總線驅動程式和任何總線篩選驅動程式之後載入這類驅動程式。 PnP 管理員會呼叫篩選驅動程式的 AddDevice 例程。 在其 AddDevice 例程中,較低層級的篩選驅動程式會為裝置建立篩選 DO,並將其連結至裝置堆疊。 如果有一個以上的較低層級篩選驅動程式存在,則每個這類驅動程式都會建立並附加自己的篩選 DO。
函式驅動程式會為裝置建立 FDO。
PnP 管理員可確保載入裝置的函式驅動程式,並呼叫函式驅動程式的 AddDevice 例程。 函式驅動程式會建立 FDO,並將其連結至裝置堆疊。
選擇性、上層篩選驅動程式會為其篩選的每個裝置建立篩選 DO。
如果裝置存在任何選擇性、最上層篩選驅動程式,PnP 管理員可確保在函式驅動程序之後載入它們,並呼叫其 AddDevice 例程。 每個這類篩選驅動程式都會將其裝置對象連結至裝置堆疊。
總而言之,裝置堆疊包含每個驅動程式的裝置對象,這些驅動程式涉及處理特定裝置的 I/O。 父總線驅動程式具有 PDO、函式驅動程式具有 FDO,而每個選擇性篩選驅動程式都有篩選 DO。
請注意,所有裝置、總線配接器/控制器裝置和非總線裝置在其裝置堆疊中都有 PDO 和 FDO。 總線配接器/控制器的 PDO 是由父總線的總線驅動程式所建立。 例如,如果 SCSI 適配卡插入 PCI 總線,PCI 總線驅動程式會為 SCSI 適配卡建立 PDO。
如果裝置正用於原始模式,則沒有任何函式或篩選驅動程式 (FDO 或篩選 DO) 。 只有父總線驅動程式的 PDO,以及零或多個總線篩選 DO。
如需哪些驅動程式例程負責建立和附加裝置對象的資訊,請參閱 建立裝置物件 。
裝置堆疊加上一些額外的資訊,構成裝置的開發 節點 。 PnP 管理員會在裝置的開發節點中維護資訊,例如裝置是否已啟動,以及裝置上是否有任何驅動程式註冊變更通知。 核心調試程式命令 !devnode 會顯示 devnode 的相關信息。