共用方式為


同步處理 Higher-Level 驅動程式中的取消,而不需取消例程

較高層級的驅動程式無法假設現有較低層級驅動程式如何處理可取消的 IRP。 只要任何較高層級的驅動程式呼叫 IRP 的 IoCallDriver ,它就不再擁有該 IRP,而且無法確定或控制較低層級驅動程式對 IRP 的處理。

不過,任何較高層級的驅動程式都可以在呼叫 IoCallDriver 之前呼叫 IoSetCompletionRoutine,為 IRP 設定 IoCompletion 例程。 較高層級的驅動程式可以呼叫 IoSetCompletionRoutine 並將 InvokeOnCancel 參數設定為 TRUE ,再將IRP傳遞至較低驅動程式之前,判斷下層驅動程式中是否有任何擱置的 IRP 取消。 這麼做可確保會呼叫驅動程式的 IoCompletion 例程,不論IRP是否已取消或完成。

較高層級的驅動程式可以使用驅動程式配置的任何擱置 IRP 呼叫 IoCancelIrp 。 不過,進行此呼叫並不可確保驅動程式配置的 IRP 將會完成,並將其 I/O 狀態區塊設定為 STATUS_CANCELLED;另一個線程可能已經完成 IRP。 若要檢查 IRP 是否已取消,較高層級的驅動程序必須先呼叫 IoSetCompletionRoutine ,並將 InvokeOnCancel 參數設定為 TRUE ,再將 IRP 傳遞至下一個較低的驅動程式。 如需完成例程的詳細資訊,請參閱 完成 IRP

較高層級的驅動程式不得使用未配置的 IRP 呼叫 IoCancelIrp