次の方法で共有


上位レベル ドライバーでのキャンセル ルーチンを使用しないキャンセルの同期

上位レベルのドライバーでは、既存の下位レベルのドライバーがキャンセル可能な IRP を処理するかどうか、またはどのように処理するかについて想定することはできません。 上位レベルのドライバーが IRP の IoCallDriver を呼び出すとすぐに、その IRP は所有しなくなり、下位レベルのドライバーによる IRP の処理を確認することも制御することもできません。

ただし、上位レベルのドライバーは、IoCallDriver を呼び出す前に IoSetCompletionRoutine を呼び出すことによって、IRP の IoCompletion ルーチンを設定できます。 上位レベルのドライバーは、下位ドライバーに IRP を渡す前に、InvokeOnCancel パラメーターを TRUE に設定して IoSetCompletionRoutine を呼び出すことによって、下位ドライバーで保留中の IRP が取り消されるかどうかを判断できます。 これにより、IRP が取り消されるか完了したかに関係なく、ドライバーの IoCompletion ルーチンが確実に呼び出されます。

上位レベルのドライバーは、ドライバーが割り当てた保留中の IRP で IoCancelIrp を呼び出すことができます。 ただし、この呼び出しにより、ドライバーに割り当てられた IRP が I/O 状態ブロックを STATUS_CANCELLED に設定して完了することは保証されません。別のスレッドが既に IRP を完了している可能性があるためです。 IRP が取り消されたかどうかを確認するには、上位レベルのドライバーは、次の下位ドライバーに IRP を渡す前に、InvokeOnCancel パラメーターを TRUE に設定して IoSetCompletionRoutine を呼び出す必要があります。 完了ルーチンの詳細については IRP の完了を参照してください。

上位レベルのドライバーは、割り当てられなかった IRP で IoCancelIrp を呼び出すことはできません。