デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。
【 デバドラ講座19 : ドライバロードの設定と動作手順 】
ドライバはPC起動時にロードされます。詳細は「デバドラ講座14」のシステムの起動を参照してください。システムの状態はブート時とブート終了後では異なり、ドライバのロード方法も多少異なります。ブート終了後、デバイスの起動、停止はSCM(サービスコントロールマネージャー)によって行われ、ここではSCMによるドライバのロードについてのみ説明します。
1. ロードするドライバを指定する
SCMはロードするドライバを指定します。
2. レジストリのキーを調べる
SCMはドライバを探すためにレジストリのHKEY_MACHINE\SYSTEM\CurrentControlSet\Servicies\DriverNameキーを調べます。このキーのエントリを表1に示します。
名前 | 内容 |
---|---|
Type | サービスタイプ(1,2,4,8) |
Start | ドライバロードのタイミング(0,1,2,3,4) |
Group | ドライバが属するロード順グループ(1-29) |
Tag | 同じスタートアップグループ内でのロード開始の順番 |
ErrorControl | ドライバが正常にロードできなかった際の対処方法 |
DependOnGroup DependOnService |
ドライバに依存する特定グループまたは特定ドライバの指定 |
ImagePath | ドライバイメージファイルへのパス (通常%systemroot%\System32\Drivers) |
DisplayName | ドライバの表示される名前 |
ドライバの設定にすべてのエントリは必要ありません。TypeとTagはドライバのロードに関係していますが、複雑なのでここでは説明は省略します。
ドライバのロードのタイミングは、各ドライバのレジストリのエントリ「Start」の値で決まります。(表2)
Start値 | 種類 | ロードタイミング | ドライバ |
---|---|---|---|
0x00 | ブート | OSローダー | 必要不可欠なドライバ |
0x01 | システム | Executiveローダー | ブート時にロードする必要があるドライバ |
0x02 | 自動 | サービスコントローラ | ブート最終ステップでサービス制御マネージャ(SCM)に自動でインストールされるドライバ |
0x03 | 手動 | 要求に応じて手動で開始 | システム起動後にSCMにより手動でインストールされるドライバ |
3. ドライバファイルの場所を探す
ImagePathにはドライバファイルのパスが示してあります。SCMはレジストリからImagePathによってドライバファイルの場所を探します。ImagePathが省略されている場合、デフォルトのパス(%SystemRoot%\System32\Drivers)内でドライバを探します。
4. ドライバファイルが存在しない場合
3において指定されたパスにドライバファイルが存在しない場合、SCMはメッセージを表示し、ユーザーに新しくドライバをインストールするように要求します。ユーザーがドライバをインストールした場合、SCMは再度②から始めます。
5. ドライバファイルを読み込む
SCMはドライバファイルを見つけると、システムローダーを呼び出し、ドライバファイルをページプールメモリに読み込みます。
6. DriverEntryルーチンのエントリを探す
SCMはDriverEntryルーチンのエントリを探します。すべてのドライバにDriverEntryルーチンは存在するため、ドライバファイルが正常にメモリに読み込まれると、このエントリが呼び出されます。
7. 制御がSCMからI/Oマネージャに渡される
ここで制御はSCMからI/Oマネージャに渡されます。I/Oマネージャはドライバオブジェクトを作成します。
8. DriverEntryを起動する
I/Oマネージャは作成したドライバオブジェクトのポインタ、ドライバのレジストリパス名を引数としてDriverEntryに渡し、DriverEntryを起動します。
9. DriverEntryのプロトコル
DriverEntryのプロトコルは以下のようになっています。
NTSTATUS DriverEntry (
IN PDRIVER_OBJECT DriverObject, //ドライバオブジェクトのポインタ
IN PUNICODE_STRING RegistryPath //ドライバのレジストリパスを示すUnicode文字列
);
10. DriverEntryでのハードウェアに関連する処理
ドライバはロードされても、ドライバが制御する実際のデバイスが必ず存在するとは限りません。そのため、DriverEntryではハードウェアに関連する処理は一切行いません。
11. AddDeviceにおいてハードウェアに関連する処理を実行
デバイスがPnPマネージャにより検出された後、I/OマネージャはAddDeviceルーチンを呼び出します。AddDeviceにおいてハードウェアに関連する処理が行われます。
参考資料
- 「WDMデバイスドライバプログラミング完全ガイド」上、下
- Edword N. Dekker, Jpseph M. Newcomer著 株式会社クイック訳