IRP のキャンセル

IRP が再びメイン無期限にキューに入れられていたドライバー (ユーザーが以前に送信した I/O 要求を取り消すことができる) には、ユーザーが取り消した I/O 要求を完了するために 1 つ以上のキャンセル ルーチンが必要です。 たとえば、キーボード、マウス、並列、シリアル、サウンドのデバイス ドライバー (またはそれらの上に重ねられたドライバー) やファイル システム ドライバーには キャンセル ルーチンが必要です。

Microsoft Windows XP 以降のオペレーティング システムのドライバーは、独自のキャンセル ルーチンを実装するのではなく、キャンセル セーフ IRP キューを使用できます。

"IRP を取り消す" とは、システムの整合性を維持しながら、できるだけ早く IRP を完了メイン意味します。 IRP の完了の一般的な説明については、「IRP の完了」を参照してください。

取り消しプロセスは、システムまたはドライバーが IoCancelIrp. を呼び出すと開始されます。 このルーチンは、まだ完全に完了していないスレッドに関連付けられている IRP ごとに呼び出されます。 I/O 要求を開始したスレッドが終了すると、システムは未処理の IRP を取り消します。 ドライバーは、作成した IRP のみを取り消すことができます (下位レベルのドライバーの IRP の作成 を参照してください)。

取り消された IRP が 5 分以内に完了しない場合、I/O マネージャーは IRP がタイムアウトしたと見なします。このような IRP はスレッドから関連付けが解除され、現在 IRP を所有しているデバイスに対してエラーがログに記録されます。 ドライバーの完了に長い時間がかかる可能性のある要求がキャンセル可能であることを確認する必要があります。 長い可能性のある要求が取り消し可能であることを確認するには、キャンセル セーフな IRP キュー またはドライバー開発者から取り消しを抽象化する カーネル モード ドライバー フレームワーク を使用できます。

このセクションには、次のトピックがあります。

キャンセル ルーチンの概要

キャンセル ルーチンの登録

IRP キャンセルの同期

キャンセル ルーチンの実装

IRP をキャンセルするときに考慮すべき点