Share via


範例:在不設定完成常式的情況下向下傳遞 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 ,則無法為其設定完成常式。