撰寫 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 的詳細資訊,請參閱 篩選驅動程式的控制裝置物件

本節討論下列主題:

完成 IRP

將 IRP 向下傳遞至Lower-Level驅動程式

從分派常式傳回狀態

範例:在不設定完成常式的情況下向下傳遞 IRP

分派常式的條件約束

分派常式 IRQL 和執行緒內容