WDF 驅動程式的 WDM 概念

Windows Driver Frameworks (WDF) 是 Microsoft Windows Driver Model (WDM) 介面的包裝函式。 雖然架構可簡化許多 WDM 概念,並完全隱藏其他概念,因此您不需要使用這些概念,您仍應該瞭解 WDM 驅動程式的一些基本概念。 具體而言,您應該瞭解 驅動程式類型驅動程式堆疊裝置堆疊I/O 要求封包

驅動程式類型

以 Windows 為基礎的驅動程式分為三種類型: 匯流排驅動程式函式驅動程式篩選驅動程式。 匯流排驅動程式藉由偵測插入父匯流排並報告其特性的子裝置,來支援 I/O 匯流排。 (此活動稱為 匯流排列舉。) 函式驅動程式控制裝置和匯流排的 I/O 作業。 篩選驅動程式會接收、檢閱及修改在使用者應用程式和驅動程式之間流動的資料,或個別驅動程式之間流動的資料。

公車的驅動程式基本上是同時列舉子系的驅動程式。 當驅動程式列舉匯流排上的子裝置時,驅動程式會作為「匯流排驅動程式」。 否則,當該驅動程式處理存取匯流排硬體的 I/O 作業時,相同的驅動程式會作為匯流排的「函式驅動程式」。

User-Mode Driver Framework (UMDF) 驅動程式不能是匯流排驅動程式。

驅動程式堆疊

在 Windows 作業系統中,WDM 驅動程式會分層成稱為 驅動程式堆疊的垂直呼叫序列。 堆疊中最上層的驅動程式通常會在要求通過作業系統的 I/O 管理員之後,從使用者應用程式接收 I/O 要求。 較低驅動程式層通常會與電腦硬體通訊。

簡單的驅動程式堆疊包含堆疊底部的匯流排驅動程式,可處理匯流排特定的 I/O 作業,並列舉與其連線的子裝置。 一般而言,一或多個裝置特定的函式驅動程式高於匯流排驅動程式。 這些函式驅動程式會將 I/O 工作處理至連線至匯流排的裝置。 篩選驅動程式可以位於函式驅動程式上方,也可以位於匯流排驅動程式和函式驅動程式之間。 執行中的系統有數個驅動程式堆疊,可支援不同類型的裝置。

裝置堆疊

每個驅動程式堆疊都支援一或多個 裝置堆疊。 裝置堆疊是從 WDM 定義的DEVICE_OBJECT結構建立的一組裝置物件。 每個裝置堆疊都代表一部裝置。 每個驅動程式都會為每個裝置建立裝置物件,並將每個裝置物件連結至裝置堆疊。 裝置堆疊會建立並移除,因為裝置已插入並解除叢集,而且每次重新開機系統時。

當匯流排驅動程式偵測到子裝置已插上或解除叢集時,它會通知隨插即用 (PnP) 管理員。 回應中,PnP 管理員會要求匯流排驅動程式針對連接到父裝置的每個子 (裝置建立實體裝置物件 (PDO) ,也就是匯流排) 。 PDO 會變成裝置堆疊的底部。

接下來,PnP 管理員會載入函式和篩選驅動程式,以支援每個裝置 (如果尚未載入) ,則 PnP 管理員會呼叫這些驅動程式,讓每個驅動程式都可以建立裝置物件,並將其新增至裝置堆疊頂端。 函式驅動程式會在 FDO) (建立功能裝置物件,而篩選驅動程式會 (篩選 DOS) 來建立篩選裝置物件。

當 I/O 管理員將 I/O 要求傳送至裝置的驅動程式時,它會將要求傳遞至在裝置堆疊中建立最上層裝置物件的驅動程式。 如果該驅動程式要求 I/O 管理員將要求傳遞至下一個較低的驅動程式,I/O 管理員會使用裝置堆疊來判斷下一個較低的驅動程式。 (下一個較低驅動程式是建立下一個較低裝置物件的驅動程式。)

WDF 會為每個 WDM 裝置物件建立架構裝置物件。 架構型驅動程式會存取這些架構裝置物件,而不是 WDM 裝置物件。

I/O 要求封包

I/O 管理員會藉由建立 I/O 要求封包 (IRP) ,將應用程式的 I/O 要求傳送至驅動程式。 IRP 可以包含要求來執行 I/O 作業 (,例如讀取/寫入作業) 或要求來執行 I/O 控制項 (IOCTL) 動作 (,例如傳回狀態) 。 此外,PnP 管理員會建立代表驅動程式必須執行的 PnP 和電源管理作業的 IRP,並將這些 IRP 傳送給驅動程式。

一般而言,當使用者應用程式要求讀取或寫入作業時,I/O 管理員會建立讀取或寫入 IRP。 I/O 管理員會將 IRP 傳遞至驅動程式堆疊頂端的驅動程式,而該驅動程式會服務要求,或將要求傳遞至下一個較低驅動程式。 有些要求會移至堆疊底部,而某些要求則完全由較高層級的驅動程式處理。

每次驅動程式收到 IRP 時,驅動程式也會收到代表必須處理作業之裝置物件的指標。 因此,驅動程式堆疊中的驅動程式會使用裝置物件來判斷特定要求應該前往哪些插入式裝置。

WDF 驅動程式通常不會直接存取 IRP。 架構會將代表讀取、寫入和裝置 I/O 控制作業的 WDM IRP 轉換為架構要求物件,這些物件Kernel-Mode Driver Framework (KMDF) 和 UMDF 驅動程式會在 I/O 佇列中接收。 架構會在內部處理 PnP 和電源管理 IRP,並使用事件回呼函式來通知驅動程式 PnP 和電源事件。