ドライバー オブジェクトの概要
I/O マネージャーは、インストールおよび読み込まれたドライバーごとにドライバー オブジェクトを作成します。 ドライバー オブジェクトは、DRIVER_OBJECT 構造を使用して定義されます。
I/O マネージャーは、ドライバーの DriverEntry ルーチンを呼び出すと、ドライバーのドライバー オブジェクトのアドレスを提供します。 ドライバー オブジェクトには、ドライバーの標準ルーチンの多くのエントリ ポイントのストレージが含まれています。 ドライバーは、これらのエントリ ポイントの入力を担当します。
次の図は、ドライバー オブジェクトと、最下位レベルおよび上位レベルのドライバーで使用可能であるか、それらのドライバーに必要なシステム定義の標準ルーチン セットを示しています。
名前の横にアスタリスクが付いた各標準ルーチンは、入力として I/O 要求パケット (IRP) を受け取ります。 これらの標準ルーチンはそれぞれ、I/O 要求のターゲット デバイス オブジェクトへのポインターも受け取ります。
I/O マネージャーは、ドライバー オブジェクトの種類を定義し、ドライバー オブジェクトを使用して、ドライバーの読み込まれたイメージに関する情報を登録および追跡します。 ドライバー オブジェクトのディスパッチ エントリ ポイント (DDDispatchXxx から DDDispatchYyy) は、IRP の I/O スタック位置で渡される主要な関数コード (IRP_MJ_XXX) に対応しています。
I/O マネージャーは、ドライバーによって提供されるディスパッチ ルーチンに最初に各 IRP をルーティングします。 最下位レベルのドライバーのディスパッチ ルーチンは通常、I/O サポート ルーチン (IoStartPacket) を呼び出して、ドライバーの StartIo ルーチンに対して有効な引数を持つ各 IRP をキューに入れ (または渡し) ます。 StartIo ルーチンは、特定のデバイスで要求された I/O 操作を開始します。 上位レベルのドライバーには通常、StartIo ルーチンはありませんが、使用することは可能です。