ドライバーの読み込み順序の指定
ほとんどのシステムでは、コンピューター上のデバイスの物理階層によって、Windows および PnP マネージャーがドライバーを読み込む順序が決まります。 Windows と PnP マネージャーは、システム ルート デバイスから始まるデバイスを構成し、ルート デバイス (PCI アダプターなど)、それらのデバイスの子などの子デバイスを構成します。 PnP マネージャーは、デバイスの構成時に各デバイスのドライバーを読み込みます (ドライバーが別のデバイス用に以前に読み込まれなかった場合)。
INF ファイル内の設定は、ドライバーの読み込み順序に影響を与える可能性があります。 このトピックでは、ドライバーの INF AddService ディレクティブによって参照される service-install-section でベンダーが指定する必要がある関連する値について説明します。 具体的には、StartType、BootFlags、LoadOrderGroup、そして、Dependencies の各エントリについて説明します。
ドライバーは、StartType を指定するために次の規則に従う必要があります。
PnP ドライバーは起動の早い段階で必要ありません
PnP ドライバーには、ドライバーがサービスするデバイスが PnP マネージャーによって検出されたときに PnP マネージャーがドライバーを読み込むことができることを指定する Standard Edition RVICE_DEMAND_START (0x3) の開始の種類が必要です。
コンピューターを起動するために必要なデバイスのドライバー
コンピューターを起動するためにデバイスが必要な場合、デバイスのドライバーの開始の種類は Standard Edition RVICE_BOOT_START (0x0) である必要があります。
PnP 列挙可能でないデバイスを検出する非起動ドライバー
PnP 列挙可能でないデバイスの場合、ドライバーは IoReportRootDevice または IoReportDetectedDevice を呼び出して PnP マネージャーにデバイスを報告します。 このようなドライバーには、システムの初期化中に Windows によってドライバーが読み込まれるように、開始の種類 Standard Edition RVICE_SYSTEM_START (0x01) が必要です。
PnP 以外のハードウェアを報告するドライバーのみが、この開始の種類を設定する必要があります。 ドライバーが PnP デバイスと非 PnP デバイスの両方をサービスする場合は、この開始の種類を設定する必要があります。
サービス コントロール マネージャーによって起動する必要がある 非 PnP のドライバー
このようなドライバーには、開始の種類 Standard Edition RVICE_AUTO_START (0x02) が必要です。 PnP ドライバーでは、この開始の種類を設定しないでください。
PnP ドライバーは、Windows がドライバーサービスを提供するデバイスを構成するときに、読み込みができるように記述する必要があります。 逆に、PnP マネージャーがドライバーサービスを提供するデバイスが存在しなくなったと判断した時点で、いつでもドライバーをアンロードできる必要があります。 PnP ドライバーが依存する必要があるドライバーの読み込みの順序は次のとおりです。
子デバイスのドライバーは、親デバイスのドライバーが読み込みされているかどうかに依存することがあります。
デバイス スタック内のドライバーは、その下のドライバーが読み込みされているかどうかに依存することがあります。
たとえば、関数 ドライバーは、下位フィルター ドライバーが読み込みされていることを確認できます。
ただし、デバイス スタック内のドライバーは、別のデバイスが構成されたときに以前に読み込みされた可能性があるため、デバイスの下位ドライバーの後に順番に読み込みされるかどうかに依存できないことに注意してください。
フィルター グループ内のフィルター ドライバーは、読み込みの順序を予測できません。 たとえば、デバイスに 3 つの上位フィルター ドライバーが登録されている場合、これらの 3 つのドライバーはすべて関数ドライバーの後にロードされますが、上位フィルター グループ内の任意の順序で読み込みすることができます。
ドライバーが別のドライバーに明示的な読み込みの順序の依存関係を持っている場合、その依存関係は親子関係を通じて実装する必要があります。 子デバイスのドライバーは、子ドライバーが読み込まれる前に読み込まれる親デバイスのドライバーに依存することがあります。
正しい StartType 値を設定することの重要性を補強するために、次の一覧では、Windows および PnP マネージャーが INF ファイルの StartType エントリを使用する方法について説明します。
システムの起動時に、オペレーティング システム ローダーは、カーネルに制御を転送する前に、Standard Edition RVICE_BOOT_START型のドライバーを読み込みます。 カーネルが制御を取得すると、これらのドライバーはメモリ内にあります。
ブート スタート ドライバーは、ほとんどのデバイスが構成される前に読み込まれるため、デバイス階層で読み込み順序を決定できません。 ブートスタート ドライバーでは、INF LoadOrderGroup エントリを使用して読み込みを並べ替えることができます。 オペレーティング システムは、ブートスタート ドライバーの INF 依存関係 エントリを無視します。
PnP マネージャーは、ドライバーがブート デバイスを処理できるように、Standard Edition RVICE_BOOT_START ドライバーの DriverEntry ルーチンを呼び出します。
ブート デバイスに子デバイスがある場合は、それらのデバイスが列挙されます。 子デバイスは、ドライバーがブートスタート ドライバーでもある場合に構成され、起動されます。 デバイスのドライバーがすべてブート開始ドライバーではない場合、PnP マネージャーはデバイス ノード (devnode) を作成しますが、まだ、デバイスは起動しません。
すべてのブート ドライバーが読み込まれ、ブート デバイスが起動すると、PnP マネージャーは PnP デバイスの残りの部分を構成し、ドライバーを読み込みます。
PnP マネージャーは、デバイス ツリーをウォークし、まだ開始されていない devnodes (つまり、前の手順で開始されていないすべての devnode) のドライバーを読み込みます。 各 PnP デバイスが起動すると、PnP マネージャーはデバイスの子 (存在する場合) を列挙します。
これらのデバイスを構成すると、PnP マネージャーは、デバイスの起動に進む前に、ドライバーの StartType 値 (StartType が Standard Edition RVICE_DISABLEDの場合を除く) に関係なく、デバイスのドライバーを読み込みます。 これらのドライバーの多くは、Standard Edition RVICE_DEMAND_START ドライバーです。
PnP マネージャーは、この手順で読み込まれるドライバーの INF 依存関係 エントリと LoadOrderGroup エントリの結果として作成されたレジストリ エントリを無視します。 読み込みの順序は、物理デバイス階層に基づいています。
この手順の最後に、PnP 列挙可能でないデバイスとそれらのデバイスの子孫を除き、すべてのデバイスが構成されます。 (子孫は PnP 列挙可能な場合もあれば、そうでない場合もあります)。
PnP マネージャーは、まだ読み込まれていない StartType Standard Edition RVICE_SYSTEM_STARTのドライバーを読み込みます。
これらのドライバーは、PnP 以外のデバイスを検出して報告します。 PnP マネージャーは、これらのドライバーの INF LoadOrderGroup エントリの結果であるレジストリ エントリを処理します。 これらのドライバーの INF 依存関係 エントリが原因で作成されたレジストリ エントリは無視されます。
service control manager は、まだ読み込まれていない StartType SERVICE_AUTO_START のドライバーを読み込みます。
サービス コントロール マネージャーは、サービスの DependOnGroup と DependOnServices に関するサービス データベース情報を処理します。 この情報は、INF AddService エントリの依存関係エントリから取得されます。 依存関係情報は、必要な PnP ドライバーがシステム起動の前の手順で読み込まれたため、PnP 以外のドライバーに対してのみ処理されることに注意してください。 サービス コントロール マネージャーは、INF LoadOrderGroup 情報を無視します。
サービス コントロール マネージャーの詳細については、Microsoft Windows SDK のドキュメントを参照してください。
ブート シナリオに応じてブート時に BootFlags を使用してドライバーの StartType を昇格します。
オペレーティング システムは、ドライバーの INF で指定された BootFlags 値に応じて、ドライバーの StartType を起動開始ドライバーに昇格させることができます。 INF ファイルでは、次の数値の 1 つ以上 (ORed) を 16 進数で表して指定できます。
- ネットワーク 起動時にドライバーを起動開始ドライバーに昇格させる必要がある場合は、0x1 (CM_Standard Edition RVICE_NETWORK_BOOT_LOAD) を指定します。
- VHD からの起動時にドライバーを昇格させる必要がある場合は、0x2 を指定します (CM_Standard Edition RVICE_VIRTUAL_DISK_BOOT_LOAD)
- USB ディスクからの起動中にドライバーを昇格させる必要がある場合は、0x4 (CM_Standard Edition RVICE_USB_DISK_BOOT_LOAD) を指定します。
- SD ストレージからの起動中にドライバーを昇格させる必要がある場合は、0x8 (CM_Standard Edition RVICE_SD_DISK_BOOT_LOAD) を指定します
- USB 3.0 コントローラー上のディスクから起動中にドライバーを昇格させる必要がある場合は、0x10 (CM_Standard Edition RVICE_USB3_DISK_BOOT_LOAD) を指定します。
- メジャー ブートを有効にして起動中にドライバーを昇格させる必要がある場合は、0x20 (CM_Standard Edition RVICE_MEASURED_BOOT_LOAD) を指定します。
- 検証ツールの起動を有効にして起動中にドライバーを昇格させる必要がある場合は、0x40 (CM_Standard Edition RVICE_VERIFIER_BOOT_LOAD) を指定します。
- WinPE ブート時にドライバーを昇格させる必要がある場合は、0x80 (CM_Standard Edition RVICE_WINPE_BOOT_LOAD) を指定します。
起動時にドライバーの StartType を昇格する方法の詳細については、ブート シナリオに応じて、INF AddService ディレクティブを参照してください。