[DDK] HOWTO: デバイス ドライバのロード順序を制御する方法

概要

Windows NT は、デバイスを最初に要求したドライバが、そのデバイスの所有権を取得するという考え方で設計されています。この所有権は、共有されることもあれば排他的なものになる可能性もあります。どちらになるのかは、要求するデバイス ドライバによります。デバイスがデバイス ドライバから排他的なものとして要求された場合、その後にロードされたデバイス ドライバが同じデバイスを要求しようとしても、その要求はすべて失敗します。こうした理由から、デバイス ドライバの作成者がドライバのロード順序を変更できることが不可欠です。この資料では、デバイス ドライバのロード順序の制御を行う 2 つの方法について説明しています。

詳細

デバイス ドライバのロード順序を制御するために使用できる方法は 2 つあります。どちらの方法も、レジストリの \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control に存在するエントリを利用します。最初の方法は、ServiceGroupOrder を変更するものです。2 番目の方法は、GroupOrderList に従ってドライバのロード順序を決定する Tag 値を指定するものです。


これら 2 つの方法は、開始値 (ドライバ サービスの開始時期を指定するパラメータ) が 0 (SERVICE_BOOT_START) または 1 (SERVICE_SYSTEM_START) のデバイス ドライバに対してのみ使用できます。すべての場合において、開始値が 0 のデバイス ドライバは、開始値 1 のデバイス ドライバのロードが試みられる前にロードされます。

方法 1 : ServiceGroupOrder



ServiceGroupOrder には、サービス グループ名の一覧がロードされる順序で記載されています。下記は、未修正の ServiceGroupOrder の内容です。


SCSI miniport

port

Primary disk

SCSI class

SCSI CDROM class

filter

boot file system

Base

Pointer Port

Keyboard Port

Pointer Class

Keyboard Class

Video Init

Video

Video Save

file system

Event log

Streams Drivers

NDIS

TDI

NetBIOSGroup

SpoolerGroup
ServiceGroupOrder に従って、グループ "SCSIclass" のデバイス ドライバは、グループ "Primary disk" のデバイス ドライバすべてがロードされた後、かつ、グループ "SCSI CDROM class" のデバイス ドライバのロード前にロードされます。そのグループがリスト内で上位にあるデバイス ドライバほど、早い段階でロードされます。ServiceGroupOrderlist のスキャンは 2 回行われます。最初に、開始値 0 のデバイス ドライバがすべてロードされます。次に、開始値 1 のすべてのデバイス ドライバがロードされます。したがって、開始値 0 のデバイス ドライバは、ServiceGroupOrder リストでの位置とは関係なく、開始値 1 のデバイス ドライバよりも先にロードされます。


デバイス ドライバの作者が ServiceGroupOrder を編集することも可能です。これを行うことによって、リスト内の任意の位置に新しいグループを作成することができます。例として、"SAMPLDRV" という SCSI クラス デバイス ドライバを挙げます。SAMPLDRV で要求されるデバイスが SCSIDISK にも要求されるために、SCSIDISK よりも先に SAMPLDRV をロードしなければなりません。SCSIDISK のレジストリ エントリは次のようになっています。


\registry\machine\system\currentcontrolset\services\scsidisk
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000000
Group = SCSI class
ErrorControl = REG_DWORD 0x00000000
DependOnGroup = REG_MULTI_SZ "SCSI miniport"

"Load Me First" という新しいグループを ServiceGroupOrder に追加して、SAMPLDRV のグループが Load Me First となるように設定することができます。修正した ServiceGroupOrder を次に示します。


SCSI miniport

port

Primary disk

Load Me First

SCSI class

SCSI CDROM class

filter

boot file system

.

.

.
SAMPLDRV のレジストリ エントリは次のようになります。


\registry\machine\system\currentcontrolset\services\sampldrv
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000000
Group = Load Me First
ErrorControl = REG_DWORD 0x00000000
DependOnGroup = REG_MULTI_SZ "SCSI miniport"

この設定により、SAMPLDRV が SCSIDISK よりも先にロードされます。

方法 2 : GroupOrderList と Tag 値



デバイス ドライバのレジストリには、Tag と呼ばれるオプションのキーを含めることができます。Tagは、グループ内でのデバイス ドライバがロードされる順序を決定します。ロード順序は必ずしも、Tag の数値ではなく、GroupOrderList で定義される順序によって決まります。GroupOrderList 内にある各グループの最初のエントリは、そのグループ内にある Tag 値の総数です。この後に、ロードされる順序に従って、それぞれの Tag 値の数字が並びます。グループ内のデバイス ドライバはまず、GroupOrderList によって定義される Tag 値に従ってロードされます。デバイス ドライバに Tag 値がない場合や、Tag 値が GroupOrderList にない場合は、有効な Tag 値を持つデバイス ドライバがロードされた後にロードされます。こうしたデバイス ドライバでは、グループ内の全デバイス ドライバが次のグループよりも先にロードされること以外は、ロードの順序が保証されません。


GroupOrderList の一部を抜き出したものを次に示します。


\registry\machine\system\currentcontrolset\control\grouporderlist
Base = REG_BINARY 0d 00 00 00 01 00...
Extended base = REG_BINARY 04 00 00 00 01 00...
Filter = REG_BINARY 05 00 00 00 01 00...
Keyboard Class = REG_BINARY 01 00 00 00 01 00...
Keyboard Port = REG_BINARY 01 00 00 00 01 00...
Ndis = REG_BINARY 09 00 00 00 01 00...
Pointer Class = REG_BINARY 01 00 00 00 01 00...
Pointer Port = REG_BINARY 03 00 00 00 01 00...
.
.
.

注 : ここには、SCSI class の値がありません。すべてのグループが GroupOrderList 内にあるわけではありません。GroupOrderList にないグループでは、そのグループ内でデバイス ドライバがロードされる順序を保証できません。


ServiceGroupOrder の場合と同様、GroupOrderList も変更することができます。上記と同じ例を使用して、SCSI class の Tag エントリを次のように追加することができます。


\registry\machine\system\currentcontrolset\control\grouporderlist
SCSI class = REG_BINARY 02 00 00 00 02 00 00 00 01 00 00 00
Base = REG_BINARY 0d 00 00 00 01 00...
Extended base = REG_BINARY 04 00 00 00 01 00...
.
.
.

この例では、グループ SCSI class に 2 つの Tag 値、00000001 と 00000002 とがあります。Tag 値がロードされる順序は、00000002 が最初にロードされ、その後に 00000001 が続きます。SAMPLDRV が (SCSIDISK と同じ) SCSI class のグループ内にある場合は、Tag 値がどちらであっても SAMPLEDRV が SCSIDISK よりも先にロードされることが保証されます。SCSIDISK には Tag 値がなく、Tag 値のないドライバはグループ内で最後にロードされるからです。


何らかの理由で SCSIDISK に Tag 値 0x00000001 が指定された場合でも、SAMPLEDRV に Tag 値 00000002 が指定されていれば、SCSIDISK よりも先に SAMPLEDRV がロードされます。


\registry\machine\system\currentcontrolset\services\sampldrv
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000000
Group = SCSI class
ErrorControl = REG_DWORD 0x00000000
DependOnGroup = REG_MULTI_SZ "SCSI miniport"
Tag = REG_DWORD 0x00000002

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID
115486 (最終更新日 1999-12-07) をもとに作成したものです。


プロパティ

文書番号:115486 - 最終更新日: 2004/01/23 - リビジョン: 1

フィードバック