SCIENCE PARK

デバドラ講座

【 デバドラ講座19 : ドライバロードの設定と動作手順 】

ドライバはPC起動時にロードされます。詳細は「デバドラ講座14」のシステムの起動を参照してください。システムの状態はブート時とブート終了後では異なり、ドライバのロード方法も多少異なります。ブート終了後、デバイスの起動、停止はSCM(サービスコントロールマネージャー)によって行われ、ここではSCMによるドライバのロードについてのみ説明します。

1. ロードするドライバを指定する

SCMはロードするドライバを指定します。

2. レジストリのキーを調べる

SCMはドライバを探すためにレジストリのHKEY_MACHINE\SYSTEM\CurrentControlSet\Servicies\DriverNameキーを調べます。このキーのエントリを表1に示します。

表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)

表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著 株式会社クイック訳
page up