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

文書翻訳 文書翻訳
文書番号: 115486 - 対象製品
この記事は、以前は次の ID で公開されていました: JP115486
すべて展開する | すべて折りたたむ

目次

概要

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年1月23日 - リビジョン: 4.0
この資料は以下の製品について記述したものです。
  • Microsoft Win32 Device Driver Kit for Windows NT 3.5
  • Microsoft Win32 Device Driver Kit for Windows NT 3.5
  • Microsoft Win32 Device Driver Kit for Windows NT 3.51
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
  • Microsoft Win32 Device Driver Kit for Windows 2000
キーワード:?
kbhowto kbddk kbwinos2000 kbntos400 kbntos350 kbntos351 kbntos310 KB115486
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com