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 を処理するドライバー ルーチン内でのキャンセルの同期