ドライバはPC起動時にロードされます。詳細は「デバドラ講座14」のシステムの起動を参照してください。システムの状態はブート時とブート終了後では異なり、ドライバのロード方法も多少異なります。ブート終了後、デバイスの起動、停止はSCM(サービスコントロールマネージャー)によって行われ、ここではSCMによるドライバのロードについてのみ説明します。
SCMはロードするドライバを指定します。
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により手動でインストールされるドライバ |
ImagePathにはドライバファイルのパスが示してあります。SCMはレジストリからImagePathによってドライバファイルの場所を探します。ImagePathが省略されている場合、デフォルトのパス(%SystemRoot%\System32\Drivers)内でドライバを探します。
3において指定されたパスにドライバファイルが存在しない場合、SCMはメッセージを表示し、ユーザーに新しくドライバをインストールするように要求します。ユーザーがドライバをインストールした場合、SCMは再度②から始めます。
SCMはドライバファイルを見つけると、システムローダーを呼び出し、ドライバファイルをページプールメモリに読み込みます。
SCMはDriverEntryルーチンのエントリを探します。すべてのドライバにDriverEntryルーチンは存在するため、ドライバファイルが正常にメモリに読み込まれると、このエントリが呼び出されます。
ここで制御はSCMからI/Oマネージャに渡されます。I/Oマネージャはドライバオブジェクトを作成します。
I/Oマネージャは作成したドライバオブジェクトのポインタ、ドライバのレジストリパス名を引数としてDriverEntryに渡し、DriverEntryを起動します。
DriverEntryのプロトコルは以下のようになっています。
NTSTATUS DriverEntry (
IN PDRIVER_OBJECT DriverObject, //ドライバオブジェクトのポインタ
IN PUNICODE_STRING RegistryPath //ドライバのレジストリパスを示すUnicode文字列
);
ドライバはロードされても、ドライバが制御する実際のデバイスが必ず存在するとは限りません。そのため、DriverEntryではハードウェアに関連する処理は一切行いません。
デバイスがPnPマネージャにより検出された後、I/OマネージャはAddDeviceルーチンを呼び出します。AddDeviceにおいてハードウェアに関連する処理が行われます。