IRP キャンセルの同期

ドライバーの観点から、IRP はいつでも取り消すことができます。 IRP の取り消しは非同期的に発生します。そのため、ドライバーは、IRP が次のいずれかのポイントでキャンセルされた場合に、大量の作成された潜在的な競合状態を処理できる必要があります。

  • ドライバー ルーチンの呼び出し後、IRP をキューに入れる前。

  • ドライバー ルーチンの呼び出し後、IRP の処理を試みる前。 たとえば、ドライバーの StartIo ルーチンが呼び出された後、StartIo ルーチンがデバイス キューから IRP を削除する前に、IRP が取り消される可能性があります。

  • ドライバー ルーチンの IRP デキュー後、要求された I/O が開始する前。

ドライバーが IRP をキューに入れ、キューを保護するスピン ロックを解放した後、別のスレッドが IRP にアクセスして変更できることに注意してください。 元のスレッドが再開されると (次のコード行に入った場合も)、IRP は既に取り消されているか、変更されている可能性があります。

ドライバーは、キャンセルセーフ IRP キュー フレームワークを使用して IRP キューを実装できます。 次に、システムは、安全に IRP を取り消すために同期を自動的に処理するドライバーの Cancel ルーチンを登録します。 詳細については、キャンセルセーフ IRP キューを参照してください。 それ以外の場合、ドライバーは独自の同期を実装する必要があります。

次の IRP のメンバーには、取り消しに関する情報が含まれています。

  • Irp->Cancel は、IRP が取り消されているか、取り消す必要があるかを示します。

  • Irp->CancelRoutine は、IRP が取り消し可能かどうかを示します。 このメンバーにキャンセル ルーチンへのポインターが含まれている場合、IRP は取り消し可能です。 このメンバーが NULL の場合、IRP はキャンセルできません。 このメンバーが NULL で、Irp->Cancel が設定されている場合は、キャンセル ルーチンが実行されていて、IRP が取り消される処理中であることを示します。

ドライバーが取り消し可能な IRP を処理する場合は、キャンセル可能な状態で保持する各 IRP で適切な Cancel ルーチンを設定する必要があります。

このセクションには、IRP の取り消しの同期に関する次のトピックが含まれています。

システムのキャンセル スピン ロックの使用

IRP を処理するドライバー ルーチン内でのキャンセルの同期

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

ドライバーによって提供されるスピン ロックの使用