ドライバーによって管理される IRP キュー
ファイル システム ドライバーを除き、I/O マネージャーはデバイス キュー オブジェクト (IRP のキュー登録用) をドライバーが作成する各デバイス オブジェクトに関連付けます。
ほとんどのデバイス ドライバーは、I/O マネージャーのサポート ルーチンを呼び出して、関連付けられているデバイス キューを使用します。このキューには、ターゲット デバイス オブジェクトに対するデバイス I/O 要求が、ドライバーの完了までの処理速度を超えて到着する場合に IRP を保持します。 この手法では、IRP は、ドライバーが提供する StartIo ルーチンに登録されます。
パフォーマンスを向上させるために、ほとんどの中間ドライバーは、IRP が来たと同時に下位ドライバーに渡すだけなので、中間ドライバーがそれぞれのデバイス オブジェクトに関連付けられたデバイス キューを使用することはほとんどありません。
ただし、1 つ以上のデバイス キュー、インターロックされたキュー、またはキャンセル セーフ キューを明示的に設定することで、IRP の内部キューを管理するドライバーを設計できます。 この方法は、ドライバーが I/O 操作と重複するデバイスを制御する場合に特に便利です。 このようなデバイスでは、1 つのキューのみを使用して、同じターゲット デバイス オブジェクトに対して 2 つ以上の IRP の同時処理を管理することが困難になる場合があります。
内部キューを構築する最も簡単な方法は、キャンセル セーフ IRP キュー フレームワークを使用することです。 選択したキュー メカニズムをドライバーに実装できます。 その後、IoCsqInitialize を使用して、IRP の挿入と削除、およびキューのロックとロック解除を処理するコールバック ルーチンのセットを登録できます。 キャンセル セーフ IRP キュー フレームワークは IoCsqInsertIrp、IoCsqRemoveIrp、IoCsqRemoveNextIrp ルーチンを提供します。これらのルーチンは、コールバック ルーチンを自動的に使用してドライバーのキューに IRP を安全に挿入および削除します。 また、システムはコールバック ルーチンを使用して、取り消された IRP を安全に削除します。
また、種類の異なる一連の物理デバイス用のデバイス コントローラーのドライバーに、IRP のための補足的なキューを設定することもできます。 たとえば、SCSI ポート ドライバーは、内部キューにデバイス キュー オブジェクトを使用します。 このドライバーはどちらも StartIo ルーチンを持ち、HBA に対して作成するデバイス オブジェクト用のデバイス キューに加えて、デバイス キュー オブジェクトを補助キューとして設定します。 SCSI ポート ドライバーは、その補助デバイス キューを使用して、HBA 制御 SCSI バス上の特定の論理ユニットにバインドされている IRP を保持します。
システム フロッピー コントローラー ドライバーは、StartIo ルーチンがなく、インターロックされたキューを使用するドライバーの例です。 このドライバーは、ドライバーとそのデバイス専用スレッドが IRP を挿入および削除する、2 重にリンクされたインターロック キューを設定します。
カーネルは、デバイス キュー オブジェクトの種類を定義します。 エグゼクティブ サポート コンポーネントは、インターロック キューに IRP を挿入および削除するためのルーチンを提供します。 Windows XP 以降のバージョンの Windows 用ドライバーでは、キャンセル セーフな IRP キューを使用して IRP キューを処理できます。
次の各セクションでは、デバイス キュー、インターロック キュー、キャンセル セーフ キューの使用方法について説明します。