Share via


移植舊版篩選驅動程式的指導方針

建議開發人員將舊版篩選驅動程式移植到篩選管理員模型,以為其篩選驅動程式取得更好的功能,並改善系統可靠性。 有經驗的開發人員應該發現將舊版篩選驅動程式移植到迷你篩選驅動程式相當容易。 Microsoft 的篩選驅動程式開發人員建議使用下列方法:

  • 從可靠的迴歸測試套件開始,以驗證舊版篩選驅動程式與移植迷你篩選驅動程式之間的行為。

  • 建立迷你篩選驅動程式殼層,並有系統地將功能從舊版篩選驅動程式移至迷你篩選驅動程式。 例如,取得附件運作,然後一次移植一個作業,在每個作業之後進行測試。

  • 最後變更使用者模式/核心模式通訊,讓您可以使用現有的工具來測試迷你篩選驅動程式。

  • 使用 PREfast 進行編譯,並使用已啟用驅動程式驗證器中的 [篩選驗證器 I/O 驗證] 選項進行測試。

在移植程式期間,您應該檢閱所有舊版篩選驅動程式程式碼,以充分利用篩選管理員功能。 特別是,請記住下列事項:

  • IRP 型 I/O 和快速 I/O 作業可以在適當時通過相同的作業,這有助於減少程式碼重複。

  • 註冊作業時,迷你篩選驅動程式可以明確地選擇忽略所有分頁 I/O 和快取的 I/O,這樣就不需要檢查這些程式碼。

  • 實例通知可大幅簡化附加/中斷連結邏輯。

  • 僅註冊迷你篩選驅動程式必須處理的作業;您可以忽略其他所有專案。

  • 利用篩選管理員內容和名稱管理支援。

  • 利用篩選管理員支援來發出非遞迴 I/O。

  • 不同于舊版篩選驅動程式,迷你篩選驅動程式無法依賴區域變數來維護從預先操作處理到後置處理的內容。 請考慮配置外觀清單來儲存作業狀態。

  • 使用名稱或內容完成時,請務必釋放參考。

  • 使用者模式中的完成埠新增了建置佇列的強大技術。 您可能只需要單一連線到單一具名埠。

下表列出舊版篩選驅動程式中的常見作業,以及它們如何對應至篩選管理員模型。

舊版篩選驅動程式模型 篩選管理員模型

沒有完成常式的傳遞作業

如果您的迷你篩選驅動程式永遠不會適用于這種類型的 I/O 作業,請勿註冊此作業的預先操作或後置回呼常式。

否則,請從註冊此作業的預先操作回呼常式傳回FLT_PREOP_SUCCESS_NO_CALLBACK。

請參閱 傳回FLT_PREOP_SUCCESS_NO_CALLBACK

具有完成常式的傳遞作業

從預先操作回呼常式傳回FLT_PREOP_SUCCESS_WITH_CALLBACK。

請參閱 傳回FLT_PREOP_SUCCESS_WITH_CALLBACK

預先操作回呼常式中的畫筆作業

視需要呼叫 FltLockUserBuffer ,以確保任何使用者緩衝區都已正確鎖定,以便在背景工作執行緒中存取它們。

呼叫 FltAllocateDeferredIoWorkItemFltQueueDeferredIoWorkItem等支援常式,將工作排入背景工作執行緒。

從預先操作回呼常式傳回FLT_PREOP_PENDING。

準備好將 I/O 作業傳回篩選管理員時,請呼叫 FltCompletePendedPreOperation

請參閱 預先操作回呼常式中的擱置 I/O 作業

後置回呼常式中的畫筆作業

在預先操作回呼常式中,呼叫 FltLockUserBuffer 以確保使用者緩衝區已正確鎖定,以便在背景工作執行緒中存取。

呼叫 FltAllocateGenericWorkItemFltQueueGenericWorkItem等支援常式,將工作排入佇列至背景工作執行緒。

從後置回呼常式傳回FLT_POSTOP_MORE_PROCESSING_REQUIRED。

準備好將 I/O 作業傳回篩選管理員時,請呼叫 FltCompletePendedPostOperation

請參閱擱 置後回呼常式中的 I/O 作業

同步處理作業

從預先操作回呼常式傳回FLT_PREOP_SYNCHRONIZE。

請參閱 傳回FLT_PREOP_SYNCHRONIZE

在預先操作回呼常式中完成作業

針對作業,在FLT_CALLBACK_DATA結構的IoStatus成員中設定最終作業狀態和資訊。

從預先操作回呼常式傳回FLT_PREOP_COMPLETE。

請參閱 在預先操作回呼常式中完成 I/O 作業

在預先操作回呼常式中填入作業之後完成作業

針對作業,在FLT_CALLBACK_DATA結構的IoStatus成員中設定最終作業狀態和資訊。

從處理 I/O 作業的背景工作執行緒呼叫 FltCompletePendedPreOperation ,傳遞FLT_PREOP_COMPLETE作為 CallbackStatus 參數。

請參閱 在預先操作回呼常式中完成 I/O 作業

在完成常式中執行所有完成工作

從後置回呼常式傳回FLT_POSTOP_FINISHED_PROCESSING。

請參閱 撰寫後置回呼常式

在安全 IRQL 執行完成工作

從後置回呼常式呼叫 FltDoCompletionProcessingWhenSafe

請參閱 確保完成處理是在安全 IRQL 執行

從完成常式發出事件訊號

從此作業的預先操作回呼常式傳回FLT_PREOP_SYNCHRONIZE。

篩選管理員會在 IRQL < = APC_LEVEL,在與預先操作回呼常式相同的執行緒內容中呼叫後置回呼常式。

請參閱 傳回FLT_PREOP_SYNCHRONIZE

成功建立作業失敗

從建立作業的後置回呼常式呼叫 FltCancelFileOpen

在作業FLT_CALLBACK_DATA結構的IoStatus 成員中設定適當的錯誤NTSTATUS值。

傳回FLT_POSTOP_FINISHED_PROCESSING。

請參閱 在後續操作回呼常式中失敗 I/O 作業

透過 I/O 作業的快速 I/O 路徑不允許 I/O

從作業的預先操作回呼常式傳回FLT_STATUS_DISALLOW_FAST_IO。

請參閱 預先操作回呼常式中的不允許快速 I/O 作業

修改 I/O 作業的參數

為作業設定FLT_CALLBACK_DATA結構之Iopb成員中修改的參數值。

呼叫 FltSetCallbackDataDirty將FLT_CALLBACK_DATA結構標示為已變更,除非您已修改 FLT_CALLBACK_DATA 結構的 IoStatus 成員內容。

請參閱 修改 I/O 作業的參數

鎖定作業的使用者緩衝區

使用 存取 I/O 作業的使用者緩衝區中所述的技術與指導方針。