各カーネル モード ドライバーは、システム定義の標準ドライバー ルーチンのセットを中心に構築されています。 カーネル モード ドライバーは、システム提供のドライバー サポート ルーチンを呼び出すことによって、これらの標準ルーチン内の 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" を使用します。 この規則に従うことで、ドライバーのデバッグと保守が容易になります。