範例:在不設定完成常式的情況下向下傳遞 IRP
注意
為了獲得最佳可靠性和效能,請使用 檔案系統迷你篩選驅動程式 搭配篩選管理員支援,而不是舊版檔案系統篩選驅動程式。 若要將舊版驅動程式移植到迷你篩選驅動程式,請參閱 移植舊版篩選驅動程式的指導方針。
若要在不設定完成常式的情況下將 IRP 向下傳遞至較低層級的驅動程式,分派常式必須執行下列動作:
- 呼叫 IoSkipCurrentIrpStackLocation 以移除目前的 IRP 堆疊位置,讓 I/O 管理員在 IRP 上執行完成處理時,不會在該處尋找完成常式。
- 呼叫 IoCallDriver 將 IRP 向下傳遞至下一個較低層級的驅動程式。
這項技術會在下列程式碼範例中說明:
IoSkipCurrentIrpStackLocation ( Irp );
return IoCallDriver ( NextLowerDriverDeviceObject, Irp );
或者,相當於:
IoSkipCurrentIrpStackLocation ( Irp );
status = IoCallDriver ( NextLowerDriverDeviceObject, Irp );
/* log or debugprint the status value here */
return status;
在這些範例中, 呼叫 IoCallDriver 中的第一個參數是下一個較低層級篩選驅動程式裝置物件的指標。 第二個參數是 IRP 的指標。
此方法的優點
呼叫 IoSkipCurrentIrpStackLocation 很簡單且有效率,而且應該用於驅動程式將 IRP 向下傳遞至驅動程式堆疊而不註冊完成常式的所有案例。
此方法的缺點
呼叫 IoCallDriver之後,傳遞給IoCallDriver的 IRP 指標已不再有效且無法安全地取值。 如果驅動程式需要在較低層級的驅動程式處理 IRP 之後執行進一步處理或清除,它必須先設定完成常式,才能將 IRP 傳送至驅動程式堆疊。 如需撰寫和設定完成常式的詳細資訊,請參閱 使用完成常式。
如果您為 IRP 呼叫 IoSkipCurrentIrpStackLocation ,則無法為其設定完成常式。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應