裝置節點和裝置堆疊

在 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 相關聯的裝置物件。

此圖顯示 proseware gizmo 和pci裝置節點中裝置堆疊中排序的裝置物件。

裝置堆疊如何建構?

在啟動期間,PnP 管理員會要求驅動程式為每個總線列舉連接到總線的子裝置。 例如,PnP 管理員會要求PCI總線驅動程式 (Pci.sys) 列舉連接到PCI匯流的裝置。 為了回應此要求,Pci.sys 為每個連線到PCI總線的裝置建立裝置物件。 每個裝置物件都稱為 實體裝置物件 , (PDO) 。 在 Pci.sys 建立一組 PDO 之後,裝置樹狀結構看起來像下圖所示。

子裝置的pci節點和實體裝置物件的圖表。

PnP 管理員會將裝置節點與每個新建立的 PDO 產生關聯,並查看登錄,以判斷哪些驅動程式必須是節點裝置堆疊的一部分。 裝置堆疊必須有一個 (,而且只有一個) 函式驅動程式 ,而且可以選擇性地擁有一或多個 篩選驅動程式。 函式驅動程式是裝置堆疊的主要驅動程式,負責處理讀取、寫入和裝置控制要求。 篩選驅動程式在處理讀取、寫入和裝置控制要求時扮演輔助角色。 載入每個函式和篩選驅動程式時,它會建立裝置物件,並將本身附加至裝置堆疊。 函式驅動程式所建立的 裝置對象稱為功能裝置物件 (FDO) ,而篩選驅動程式所建立 的裝置對象稱為篩選設備物件 (Filter DO) 。 現在,裝置樹狀結構看起來像這個圖表。

顯示 proseware gizmo 裝置節點中篩選、函式和實體裝置對象的裝置樹狀結構圖表。

在圖表中,請注意,在一個節點中,篩選驅動程式位於函式驅動程式上方,而在其他節點中,篩選驅動程式位於函式驅動程式下方。 在裝置堆疊中函式驅動程式上方的篩選驅動程序稱為 上層篩選驅動程式。 函式驅動程式下方的篩選驅動程序稱為 較低的篩選驅動程式

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 裝置樹狀結構中。 作為總線函式驅動程式的驅動程式,也可以作為總線子裝置的總線驅動程式。

使用者模式裝置堆疊

到目前為止,我們已討論核心模式裝置堆疊。 也就是說,堆疊中的驅動程式會在核心模式中執行,而裝置對象會對應到系統空間,也就是只能在核心模式中執行之程式代碼的位址空間。 如需核心模式與使用者模式之間差異的資訊,請參閱 使用者模式和核心模式

在某些情況下,裝置除了核心模式裝置堆疊之外,還有使用者模式裝置堆疊。 使用者模式驅動程式通常是以 User-Mode Driver Framework (UMDF) 為基礎,這是 Windows 驅動程式架構 (WDF ) 所提供的驅動程式模型之一。 在UMDF中,驅動程式是使用者模式 DLL,而裝置對像是實作 IWDFDevice 介面的 COM 物件。 UMDF 裝置堆疊中的裝置對象稱為 WDF 裝置物件 (WDF DO) 。

下圖顯示 USB-FX-2 裝置的裝置節點、核心模式裝置堆疊和使用者模式裝置堆疊。 使用者模式和內核模式堆疊中的驅動程式都會參與在USB-FX-2裝置上導向的I/O要求。

顯示使用者模式和核心模式裝置堆疊的圖表。

適用於所有驅動程式開發人員的概念

驅動程式堆疊