標準ドライバー ルーチンの概要
各カーネル モード ドライバーは、システム定義の標準ドライバー ルーチンのセットを中心に構築されています。 カーネル モード ドライバーは、システム提供のドライバー サポート ルーチンを呼び出すことによって、これらの標準ルーチン内の I/O 要求パケット (IRP) を処理します。
すべてのドライバーは、接続されているドライバー チェーン内のレベルに関係なく、IRP を処理するために標準ルーチンの基本セットを備えている必要があります。 ドライバーが追加の標準ルーチンを実装する必要があるかどうかは、ドライバーが物理デバイスを制御するか、物理デバイス ドライバーの上に階層化されているか、また基になる物理デバイスの性質によって異なります。 物理デバイスを制御する最下位レベルのドライバーでは、処理のために通常は IRP を下位ドライバーに渡す高位レベルのドライバーよりも、多くのルーチンが必要とされます。
標準ドライバー ルーチンは、2 つのグループに分けることができます。各カーネル モード ドライバーが持つ必要があるグループと、デバイス スタック内のドライバーの種類と場所に応じて省略可能なグループです。
次の表に、必須の標準ルーチンを示しています。
必須の標準ドライバー ルーチン | 目的 | 説明されている場所 |
---|---|---|
DriverEntry | ドライバーとそのドライバー オブジェクトを初期化します。 | DriverEntry ルーチンの記述 |
AddDevice | デバイスを初期化し、デバイス オブジェクトを作成します。 | AddDevice ルーチンの記述 |
ディスパッチ ルーチン | IRP を受信して処理します。 | ディスパッチ ルーチンの記述 |
Unload | ドライバーによって取得されたシステム リソースを解放します。 | アンロード ルーチンの記述 |
次の表に、いくつかの省略可能なルーチンを示します。
省略可能な標準ドライバー ルーチン | 目的 | 説明されている場所 |
---|---|---|
Reinitialize | DriverEntry で完了できない場合に、ドライバーの初期化を完了します。 | 再初期化ルーチンの記述 |
StartIo | 物理デバイスで I/O 操作を開始します。 | StartIo ルーチンの記述 |
割り込みサービス ルーチン | 割り込み時のデバイスの状態を保存します。 | ISR の記述 |
遅延プロシージャ呼び出し | ISR がデバイスの状態を保存した後、デバイス割り込みの処理を完了します。 | DPC オブジェクトと DPC |
SynchCritSection | ドライバー データへのアクセスを同期します。 | クリティカル セクションの使用 |
AdapterControl | DMA 操作を開始します。 | アダプター オブジェクトと DMA |
IoCompletion | IRP のドライバーの処理を完了します。 | IRP の完了 |
キャンセル | IRP のドライバーの処理を取り消します。 | IRP のキャンセル |
CustomTimerDpc, IoTimer | イベントのタイミングと同期。 | 同期の手法 |
現在の IRP およびターゲット デバイス オブジェクトは、多くの標準ルーチンの入力パラメーターです。 すべてのドライバーは、標準ルーチンのセットを使用して段階的に各 IRP を処理します。
慣例により、システムが提供するドライバーは、DriverEntry を除くすべての標準ルーチンの名前の前に、識別できる、ドライバ固有またはデバイス固有のプレフィックスを付けます。 例として、このドキュメントでは、「ドライバー オブジェクトの概要」の図 に示すように、"DD" を使用します。 この規則に従うことで、ドライバーのデバッグと保守が容易になります。