撰寫 IRP 分派常式
注意
為了獲得最佳可靠性和效能,請使用 檔案系統迷你篩選驅動程式 搭配篩選管理員支援,而不是舊版檔案系統篩選驅動程式。 若要將舊版驅動程式移植到迷你篩選驅動程式,請參閱 移植舊版篩選驅動程式的指導方針。
檔案系統篩選驅動程式會使用類似于設備磁碟機中使用的分派常式。 分派常式會處理一或多個 IRP 類型。 (IRP 的類型 取決於其主要函式程式碼。) 驅動程式的 DriverEntry 常式會藉由將它們儲存在驅動程式物件的分派資料表中, 來註冊 分派常式進入點。 當 IRP 傳送至驅動程式時,I/O 子系統會根據 IRP 的主要函式程式碼呼叫適當的分派常式。
每個 IRP 分派常式的定義如下:
NTSTATUS
(*PDRIVER_DISPATCH) (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
檔案系統篩選驅動程式分派常式最常在 IRQL PASSIVE_LEVEL呼叫,在源自 I/O 要求的執行緒內容中,這通常是使用者模式應用程式執行緒。 不過,此規則有一些例外狀況。 例如,分頁錯誤會導致在 IRQL APC_LEVEL呼叫讀取和寫入分派常式。 這些例外狀況摘要于 分派常式 IRQL 和執行緒內容的資料表中。 不幸的是,目前無法防止篩選鏈結中的驅動程式在 IRQL > PASSIVE_LEVEL (呼叫IoCallDriver PASSIVE_LEVEL (,例如,無法釋放微調鎖定或快速 mutex) 。 不過,強烈建議篩選分派常式一律在呼叫的相同 IRQL 上呼叫 IoCallDriver 。
分派常式可以設為可分頁,前提是它們符合Kernel-Mode驅動程式架構設計指南的 「讓驅動程式可分頁 」一節中所述的準則。
如果檔案系統篩選驅動程式有控制裝置物件 (CDO) ,其分派常式必須能夠偵測並處理 IRP 的目標裝置物件是 CDO 的情況,而不是磁片區裝置物件, (掛接磁片區的 VDO) 。 如需 CDO 的詳細資訊,請參閱 篩選驅動程式的控制裝置物件。
本節討論下列主題:
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應