キャンセル ルーチンの概要
IRP を保留中の状態で無期限に保持できるドライバーには、1 つ以上のキャンセル ルーチンが必要です。 たとえば、キーボード ドライバーは、ユーザーがキーを押すのを無期限に待機することがあります。 逆に、5 分で完了できる数を超える IRP をドライバーがキューに入れることがない場合、キャンセル ルーチンは必要ない可能性があります。
ユーザー モード スレッドが I/O 要求を行うとします。この I/O 要求は、最上位レベルのデバイス ドライバーのディスパッチ ルーチンによってキューに入れられ、IRP がキューに入っている間に要求スレッドが終了するとします。 終了したスレッドの代わりにキューに入れられた IRP は、キャンセルする必要があります。 そのため、ドライバーは、キューに入れる各 IRP でドライバー指定のキャンセル ルーチンを設定する必要があります。
関連付けられた IRP を作成するドライバーは、マスター IRP がキャンセルされたときにそれらをキャンセルする必要があります。 関連付けられた IRP は要求元のスレッドに関連付けられていないため、マスター IRP のキャンセル ルーチンは、マスター IRP がキャンセルされたときに関連付けられている IRP をキャンセルします。
ドライバーが持つキャンセル ルーチンの数は、ドライバーの設計によって異なります。 一般に、ドライバーには、IRP が無期限間隔の保留中状態で保持される可能性がある I/O 処理のステージごとにキャンセル ルーチンが必要です。 このような保留中の IRP は、キャンセル可能な状態で保持されていると言われます。
次の設計ガイドラインを考慮してください。
階層化されたドライバーのチェーン内の最上位レベルのドライバーには、IRP をキューに入れた場合、またはキャンセル可能な状態で IRP を保持する場合、キャンセル ルーチンが少なくとも 1 つ必要です。 必要に応じて、複数のキャンセル ルーチンを使用できます。
比較的長い間隔で IRP をキャンセル可能な状態に保持できる下位レベルのドライバーにも、キャンセル ルーチンが 1 つ以上必要です。
ドライバーが IRP の独自の内部キューを管理する場合、キューごとに別個のキャンセル ルーチンが必要です。
キーボード、マウス、サウンド、並列クラス、シリアル ドライバーなど、対話型デバイスの最上位レベルのドライバーには、キャンセル ルーチンが必要です。 比較的長い間隔でいくつかの上位レベルのクラス ドライバーのキューに入っている IRP を保持する並列ポート ドライバーなど、一部の下位レベルのドライバーにも、キャンセル ルーチンが必要です。
大容量記憶装置デバイス ドライバーと中間ドライバーを重ねて配置すると、キャンセル ルーチンを使用する可能性は低くなります。 ファイル I/O 要求のキャンセルを処理するのはファイル システム ドライバーの役割ですが、下位レベルの大容量記憶装置ドライバーへの IRP 入力は通常、キャンセル可能するためにすぐに完了するよう処理されます。