裝置節點和裝置堆疊
在 Windows 中,裝置是由 隨插即用 (PnP) 裝置樹狀結構中的裝置節點表示。 一般而言,當 I/O 要求傳送至裝置時,有數個驅動程式可協助處理要求。 這些驅動程式都與裝置對象相關聯,且裝置物件會排列在堆疊中。 裝置物件的序列及其相關聯的驅動程式稱為裝置堆疊。 每個裝置節點都有自己的裝置堆疊。
裝置節點和 隨插即用 裝置樹狀結構
Windows 會組織樹狀結構中的裝置,稱為 隨插即用 裝置樹狀結構,或只是裝置樹狀結構。 一般而言,裝置樹狀結構中的節點代表裝置或複合裝置上的個別功能。 不過,某些節點代表與實體裝置沒有關聯的軟體元件。
裝置樹狀結構中的節點稱為 裝置節點。 裝置樹狀結構的根節點稱為 根裝置節點。 依照慣例,根裝置節點會繪製在裝置樹狀結構的底部,如下圖所示。
裝置樹狀結構說明 PnP 環境中固有的父/子關聯性。 裝置樹狀結構中的數個節點代表已連接子裝置的總線。 例如,PCI 總線節點代表主機板上的實體PCI總線。 在啟動期間,PnP 管理員會要求PCI總線驅動程式列舉連線到PCI總線的裝置。 這些裝置是由PCI總線節點的子節點表示。 在上圖中,PCI 總線節點有數個連線到PCI總線的裝置的子節點,包括USB主機控制器、音訊控制器和PCI Express埠。
連接到PCI總線的一些裝置本身是公交車。 PnP 管理員會要求每個總線列舉與其連線的裝置。 在上圖中,我們可以看到音訊控制器是連接音訊裝置的總線。 我們可以看到PCI Express埠是已連接顯示器適配卡的總線,而顯示適配卡是有一部監視器連線的總線。
不論您認為節點代表裝置或總線,取決於您的觀點。 例如,您可以將顯示適配卡視為在準備畫面上顯示畫面畫面時扮演重要角色的裝置。 不過,您也可以將顯示器適配卡視為能夠偵測和列舉連線監視器的總線。
裝置物件和裝置堆疊
裝置對像是DEVICE_OBJECT結構的實例。 PnP 裝置樹狀結構中的每個裝置節點都有一份已排序的裝置物件清單,而且每個裝置物件都與驅動程式相關聯。 已排序的裝置物件清單及其相關聯的驅動程式,稱為 裝置節點的裝置堆疊 。
您可以透過數種方式來思考裝置堆疊。 從最正式的意義上說,裝置堆疊是已排序的(裝置對象、驅動程式)配對清單。 不過,在某些內容中,將裝置堆疊視為已排序的裝置物件清單可能會很有用。 在其他內容中,將裝置堆疊視為已排序的驅動程式清單可能會很有用。
根據慣例,裝置堆疊具有頂端和底部。 在裝置堆疊中建立的第一個裝置對象位於底部,而要建立並連結至裝置堆疊的最後一個裝置對象位於頂端。
在下圖中,Proseware Gizmo 裝置節點有一個裝置堆疊,其中包含三個(裝置對象、驅動程式)組。 頂端裝置對象與驅動程式AfterThought.sys相關聯、中間裝置對象與驅動程式Proseware.sys相關聯,而底部裝置物件則與驅動程式Pci.sys相關聯。 圖表中央的PCI總線節點有一個裝置堆疊,其中包含兩個(裝置物件、驅動程式)配對,也就是與Pci.sys相關聯的裝置物件,以及與Acpi.sys相關聯的裝置物件。
如何建構裝置堆疊?
在啟動期間,PnP 管理員會要求驅動程式為每個總線列舉連線到總線的子裝置。 例如,PnP 管理員會要求PCI總線驅動程式 (Pci.sys) 列舉連接到PCI總線的裝置。 為了回應此要求,Pci.sys為每個連線到PCI總線的裝置建立裝置物件。 每一個 裝置物件都稱為實體裝置物件 (PDO)。 Pci.sys建立 PDO 集合之後不久,裝置樹狀結構看起來就像下圖所示。
PnP 管理員會將裝置節點與每個新建立的 PDO 產生關聯,並在登錄中尋找,以判斷哪些驅動程式必須是節點裝置堆疊的一部分。 裝置堆疊必須有一個(且只有一個) 函式驅動程式 ,而且可以選擇性地擁有一或多個 篩選驅動程式。 函式驅動程式是裝置堆疊的主要驅動程式,負責處理讀取、寫入和裝置控制要求。 篩選驅動程式會在處理讀取、寫入和裝置控制要求時扮演輔助角色。 載入每個函式和篩選驅動程式時,它會建立裝置物件,並將本身附加至裝置堆疊。 函式驅動程式所建立的裝置對象稱為 功能性裝置物件 (FDO),而篩選驅動程式所建立的裝置對象稱為 篩選裝置物件 (Filter DO)。 現在裝置樹狀結構看起來像下圖。
在圖表中,請注意,在一個節點中,篩選驅動程式高於函式驅動程式,而在其他節點中,篩選驅動程式位於函式驅動程式下方。 在裝置堆疊中函式驅動程式上方的篩選條件驅動程式稱為上層 篩選驅動程式。 函式驅動程式下方的篩選驅動程序稱為 較低的篩選驅動程式。
PDO 一律是裝置堆疊中的底部裝置物件。 這會從建構裝置堆疊的方式產生。 PDO 會先建立,而且當其他裝置對象連結至堆疊時,它們會連結至現有堆疊的頂端。
注意 安裝裝置的驅動程式時,安裝程式會使用資訊 (INF) 檔案中的資訊來判斷哪個驅動程式是函式驅動程式,以及哪些驅動程式是篩選條件。 一般而言,INF 檔案是由Microsoft或硬體廠商提供。 安裝裝置的驅動程序之後,PnP 管理員可以藉由查看登錄來判斷裝置的函式和篩選驅動程式。
巴士司機
在上圖中,您可以看到驅動程式Pci.sys扮演兩個角色。 首先,Pci.sys與PCI總線裝置節點中的FDO相關聯。 事實上,它會在PCI總線裝置節點中建立 FDO。 因此,Pci.sys是PCI總線的功能驅動程式。 其次,Pci.sys與PCI總線節點每個子系中的 PDO 相關聯。 回想一下,它會為子裝置建立 PDO。 為裝置節點建立 PDO 的驅動程式稱為 節點的總線驅動程式 。
如果您的參考點是PCI總線,則Pci.sys是函式驅動程式。 但是,如果你的參考點是Proseware Gizmo裝置,那麼Pci.sys是公共汽車司機。 這種雙重角色在 PnP 裝置樹狀結構中很常見。 作為公交車功能驅動程式的驅動程式,也可以做為公交車子裝置的公交車司機。
使用者模式裝置堆疊
到目前為止,我們一直在討論核心模式裝置堆疊。 也就是說,堆疊中的驅動程式會以核心模式執行,而裝置對象會對應至系統空間,這是只能在核心模式中執行之程式代碼的位址空間。 如需核心模式與使用者模式差異的相關信息,請參閱 使用者模式和核心模式。
在某些情況下,裝置除了核心模式裝置堆疊之外,還有使用者模式裝置堆疊。 使用者模式驅動程式通常以使用者模式驅動程序架構 (UMDF)為基礎,這是 Windows 驅動程式架構 (WDF) 所提供的其中一個驅動程式模型。 在UMDF中,驅動程式是使用者模式 DLL,而裝置對像是實作 IWDFDevice 介面的 COM 物件。 UMDF 裝置堆疊中的裝置對象稱為 WDF 裝置物件 (WDF DO)。
下圖顯示 USB-FX-2 裝置的裝置節點、內核模式裝置堆疊和使用者模式裝置堆疊。 使用者模式和內核模式堆疊中的驅動程式都會參與導向 USB-FX-2 裝置的 I/O 要求。