3.デバイスとドライバの対応

25
1.3
デバイスとドライバの対応
それでは、周辺機器が Windows 内でドライバとどのように対応付けられて
いるかを本項で示す。ハードウェアは接続されるとレジストリ内に記憶されド
ライバに関連付けられる。
1.3.1
Windows98 の場合
1.3.1.1 ハードウェアキー
ハードウェアキーは HKEY_LOCALMACHINE のサブキーに登録される。
ハードウェアキー
シリアルI
Dが設定されたデバ
HKEY_LOCAL_MACHINE
イスはこのキーがシリアルI
D
Enum
の文字列で作成される
USB
VID_0409&PID_3240
1USB&ROOT_HUB&PCI&VEN_8086&DEV_7112&
SUBSYS_00000000&REV_01&BUS_00&DEV_07&FUNC_02
キーの内容
Class
ClassGUID
DeviceDesc
Driver
“USB”
“{36FC9E60-C465-11CF-8056-444553540000}”
“USB Test Device”
“USB¥0002”
HardwareID
Mfg
“USB¥Vid_0409&Pid_3240&Rev_0001,USB¥Vid_0409&Pid...”
“NEC”
図 1-7 Windows98 のハードウェアキー
図 1-7に示したハードウェアの例は USB デバイスである。
HKEY_LOCAL_MACHINE¥Enum のキーの下には、デバイスの種別が列挙
される。レジストリエディタで確認できるように、他にも SCSI や FLOP など、
PC に接続したデバイスのすべてが登録されている。Enum キーの下には、ベ
ン ダ 名 と 製 品 名 を 表 す キ ー が 作 成 さ れ て お り 、 こ の 例 の 0409 は、 USB
Implementers Forum で割り当てられた NEC の ID を表している。3240 は
NEC 内で管理している製品コードであり、各社が決定するものである。
USB のデバイスの場合、この数値はデバイスが保持しているデバイスディス
26
クリプタに記述されている値となる。さらに、ベンダ名と製品名を表すキーの
下には、デバイスの実体をあらわすキーが作成される。このキーは、USB デバ
イスのシリアル ID の実装によって異なる。
表 1-2 シリアル ID によるキー作成方法
シリアル ID が未設定
シリアル ID が設定されている
ホスト PC のルートハブ経由で、デバ
イスまでのハブなどのデバイス ID が
記述される。
接続経路を個々のデバイスについて記
述することで、個々のデバイスを識別
する。
シリアル ID の文字列のキーが作成さ
れる
キーの内容にはデバイスに対応したドライバをインストールするための inf
ファイルで記述された内容などが格納される。その中の項目には DeviceDesc
といったデバイスマネージャで表示されるデバイスの説明などがある。
また、重要なのは Driver という文字列であり、ハードウェアに対応したド
ライバキーの格納位置を示す。
1.3.1.2 ドライバキー
ドライバキー
HKEY_LOCAL_MACHINE
System
CurrentControlSet
Services
Class
USB
0002
キーの内容
DevLoader
“*ntkern”
DriverDate
“2-15-2000”
DriverDesc
“USB Test Device”
InfPath
“usbtest.inf”
InfSection
“usbtest.Install”
MatchingDeviceId “USB¥VID_0409&PID_3240”
NTMPDriver
“usbtest.sys”
ProviderName
“NEC”
図 1-8 Windows98 のドライバキー
27
ドライバキーも HKEY_LOCAL_MACHINE のサブキーに登録される。
ドライバキーは、CurrentControlSet¥Services¥Class から、ハードウェア
キー内の項目 Drivers の相対指定 USB¥0002 で示されることになる。0002 は
ドライバがインストールされるたびに割り振られる番号であり、ドライバが追
加されるたびに+1 される。ドライバもハードウェアキーの場合と同様、ドラ
イバの説明の文字列などが格納される。また、NTMPDriver は NT Mini Port
Driver を意味し、ドライバのファイル名を格納する。
このような関連付けから、デバイスの接続をシステムが検知すると、システ
ムはこのファイルのドライバをロードすることができる。
なお、DevLoader の記述はデバイスドライバをロードするドライバである。
この図 1-8の場合は、ntkern.vxd を指定していることになる。この例のように
アスタリスクがつき、かつ拡張子が指定されていない記述の場合、ドライバが
1 つのファイルとして存在するのではなく、VMM32.VxD の中に配置されてい
るファイルを意味する。
しかし、コンフィギュレーションマネージャをデバイスローダとして使用し、
ドライバが PnP スタティック VxD の記述の場合もアスタリスクをつけて、拡
張子を省略する記述を行っている。
1.3.2
Windows2000 の場合
Windows2000 の場合も同様にハードウェアとドライバの関連付けが行われ
ている。
1.3.2.1 ハードウェアキー
Windows2000 では、Enum キーが CurrentControlSet の下になっており、
また、ControlSet001、ControlSet002 のキーが CurrentControlSet のコピー
となっている。
USB デバイスのベンダ ID、プロダクト ID のハードウェアキーの作成にあ
たっては Windows98 の場合と同じく、USB デバイスのディスクリプタが参照
されている。
シリアル番号が設定されない場合には、Inst_0 のように、実体の番号がキー
の名前に使われている。ドライバキーへの参照には USB というクラスの名称
ではなく、クラスの GUID(Global Unique ID)の文字列が格納される。
なお、Windows98 と異なり、このキーは保護されており、セキュリティの
設定を変更しない限り、レジストリエディタで削除することができないように
なっている。
28
ドライバ開発者は開発環境においては、32 ビット版のレジストリエディタを
使用して、セキュリティを変更することができる。
ハードウェアキー
HKEY_LOCAL_MACHINE
SYSTEM
ControlSet001
ControlSet002
CurrentControlSet
Enum
シリアルI
Dが設定されたデバイスは
このキーがシリアルI
Dの文字列で作
成される
USB
Vid_0409&Pid_3240
0000001
Control
Device Parameters
LogConf
キーの内容
Class
ClasssGuid
“USB”
“{36FC9E60-C46….
CompatibleIDs
DeviceDesc
Driver
HardwareID
Mfg
“USB¥Class_ff&Sub…”
“USB Test Device”
“{36FC9E …}¥ 0001”
“USB¥Vid_0409&Pid...”
“NEC”
Service
“USBTEST”
Inst_0
図 1-9 Windows2000 のハードウェアキー
1.3.2.2 ドライバキー
ドライバキー
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Control
Class
{36FC9E60-C465-11CF-8...}
0001
キーの内容
DevLoader
DriverDesc
InfPath
InfSection
InfSectionExt
MatchingDeviceId
NTMPDriver
ProvidorName
“*ntkern”
“USB Test Device”
“oem1.inf”
“Test.Install”
“.NT”
“usb¥vid_0409&pid_3240
“usbtest.sys”
“NEC”
図 1-10 Windows2000 のドライバキー
29
Windows2000 のドライバキーも Windows98 の場合とほぼ同様の内容とな
っ て い る 。 な お 、 ド ラ イ バ の イ ン ス ト ー ル で 使 用 し た inf フ ァ イ ル は
Windows2000 の inf ディレクトリの下にコピーされる。このときにファイル名
を oem1.inf のように番号付きのファイル名としてコピーされ、その名前がレジ
ストリに書き込まれる。
1.3.2.3 サービスキー
ドライバはサービスとして機能提供をするよう、サービスリストに登録され
る。
サービスとドライバは異なった機能であり、サービスはサービスコントロー
ラ仕様書にしたがって実装されたユーザモードのプロセスである。ドライバは
すでに述べたようにカーネルコードのモジュールである。
この場合のサービスはドライバのフロントエンドとして見えることになり、
サービス列挙などの関数を利用できると思われるが、現状、筆者は Windows98
と共通に使えるような形態のドライバ開発しか経験していないため、サービス
関連の機能は利用したことがない。筆者はサービスの列挙の代わりにデバイス
インタフェース(後述)を利用している。
サービスの名前や開始のタイミングなどは inf ファイルで指定する。また、
ドライバキーの場合と同じく、サービスキーの内容にはドライバのファイル名
が指定されている。
サービスキー
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Services
USBTEST
Enum
Security
キーの内容
DisplayName
ErrorControl
ImagePath
“USB Test Device Miniport Driver”
0x00000001
“System32¥DRIVERS¥usbtest.sys”
Start
Type
0x00000003
0x00000001
図 1-11 Windows2000 のサービスキー