九月の日記/メモ

 

2002.09.03(火) 12:17:32
cygwin-1.3.12-2(Jul 8 2002) で何故か /cygdrive の下に c ドライブだけ表示されないという問題があって、気になり出すとどうも不快に腹が立つ。腹立つこと何度目かにして我慢できなくなったので、バグを探して潰した。
バグは、fhandler_disk_file.cc の fhandler_cygdrive::readdir() にあった。 GetLogicalDriveStrings で "A:\\\x00C:\\\x00D:\\\x00"という文字列を取得し、 pdrive のポインタでドライブを順番に見ていくのだが "." と ".." を返す時にも pdrive += DRVSZ; としてポインタを進めてしまっている。 これ。つまり、A: と C: が飛ばされていた。
直したら A: を見に行くようになって待たされるので A: は見ないようにした。
CVS を確認したらなにやら直っているが A: は見ている様だ。

2002.09.03(火) 12:48:53
Windows2000/XP でネットワークカードを取っ替えひっかえしていると、 デバイスマネージャで表示される名前が、"Intel(R) PRO/1000 T Desktop Adapter #5" の様に添字つきになって目障りだったり、「IP アドレスが重複しています」だのといって無駄に警告される問題を解決するためのヒント(あくまだヒントだけ)。
レジストリから適切なエントリを削除する。適当にやるとコントロールパネルでIPアドレスが変更できなくなったりするので注意。
どっかにツールが公開されていたりするだろうか。

まずPCIのベンダIDとデバイスIDを頼りに次のキーを探す。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_8086&DEV_100C&SUBSYS_11128086&REV_02
SUBSYS IDは、同じチップでもボードメーカによって変わることがある。
このなかにいくつかキーがあり、それぞれどのスロットに刺したかに対応している。
各キーの名前は、内部で適当に決めていると思われる。
HardwareID は、一つだと思っていたが、MULTI_SZ になっていて
PCI\VEN_8086&DEV_100C&SUBSYS_11128086&REV_02
PCI\VEN_8086&DEV_100C&SUBSYS_11128086
PCI\VEN_8086&DEV_100C&CC_020000
PCI\VEN_8086&DEV_100C&CC_0200
といくつかある。
CompatibleIDs のほうは、こんな感じ。
PCI\VEN_8086&DEV_100C&REV_02
PCI\VEN_8086&DEV_100C
PCI\VEN_8086&CC_020000
PCI\VEN_8086&CC_0200
PCI\VEN_8086
PCI\CC_020000
PCI\CC_0200
(CC は、クラスコードか?)

LocationInformation の値を見れば、何となく分かる。
例えば、"PCI バス 0, デバイス 5, 機能 0" の様に書かれているが、
デバイス番号は、PCIホストブリッジのチップのどのIDSEL信号線に接続されているか
ということなので、スロットの位置とは必ずしも対応しない。
DeviceDesc の値 "Intel(R) PRO/1000 T Desktop Adapter" がデバイスマネージャに表示すれる名前。デバイスが現在システムに実在しているどうかは、たしかレジストリからは分からない。
デバイスマネージャで削除した場合は、このキーが削除される。さらに、同じベンダIDデバイスIDのものが他に何もなければ、親のキーも削除される。
Driver の値に {4D36E972-E325-11CE-BFC1-08002BE10318}\0006 という様な情報が記録されているので、これを頼りに次の位置が分かる。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0006
デバイスマネージャによって削除された場合は、このキーも削除される。
ComponentId の値に "pci\ven_8086&dev_100c&subsys_11128086" というのが記録されているが、これが、HardwareID の先頭のものでないのが謎。
MatchingDeviceId の方は、INFファイルのどのエントリにマッチしたかを示すものと思われる。PRO/1000 の場合は、"pci\ven_8086&dev_100c&subsys_11128086" と ComponentId に同じだった。
NetCfgInstanceId の値 "{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}" がコントロールパネルで設定する情報の格納されているキーに導く。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}@="ネットワーク アダプタ"
というのは、おそらく OSの仕組みの一部として固定されている GUID のはず。ここに
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}
というのがある。
Connection@PnpInstanceID="PCI\VEN_8086&DEV_100C&SUBSYS_11128086&REV_02\3&61AAA01&0&28"
は、CurrentControlSet\Enum の下のパスを示しているので、逆にたどることもできる。
Connection@Name="ローカル エリア接続"
は、同じ名前が ネットワークアダプタの中にあると添字が付くようになっているらしい。
この辺りのキーは、コントロールパネルで見える情報そのままのようだ。

TCP/IPに関する部分は、次の2カ所。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Adapters\{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DNSRegisteredAdapters\{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}
というのがあり、最後のがコントロールパネルのダイアログで設定するTCP/IPの情報を記録している。

TCP/IP と独立して、DHCP に関する部分がある。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dhcp\Parameters@{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}
ここはGUIDがキーではなく値として記録されていることに注意。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}\Parameters\Tcpip
というのもあった。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBIOS\Linkage@Bind という MULTI_SZ にも \Device\NetBT_Tcpip_{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}
という行が含まれている。
@Export には、
\Device\NetBIOS_NetBT_Tcpip_{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}
という行が含まれている。
@Route には、"NetBT" "Tcpip" "{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}"

Services\NetBT も同様。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\Tcpip_{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}
というキーもあった。この辺りは、存在しないときは、自動てきになくなるようなので、気にしなくていい。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess\Interfaces
5@InterfaceName="{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}"
にもなにやらある。これも気にしなくていいと思われる。


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{ad498944-762f-11d0-8dcb-00c04fc3358c}\##?#PCI#VEN_8086&DEV_100C&SUBSYS_11128086&REV_02#3&61aaa01&0&28#{ad498944-762f-11d0-8dcb-00c04fc3358c}\#{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}@SymbolicLink="\\?\PCI#VEN_8086&DEV_100C&SUBSYS_11128086&REV_02#3&61aaa01&0&28#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{16E8DA0D-AFDF-4001-B1CD-EE395F86CF2E}"
ここは、非常にごちゃごちゃしている。キー名のほうは適当に決めているだけかもしれない。Control というキーの中に Linked とか ReferenceCount とかいう値がある。
ここを崩すとやばいだろうか。
このキーの位置を求める方法が分からない。たいした情報を保持していないので、
ReferenceCount とやらが問題にならないのならば放置してもかまわないだろう。


デバイスマネージャで表示される名前が、"Intel(R) PRO/1000 T Desktop Adapter #5"
の様に添字つきになるのは、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\Descriptions
に
Intel(R) PRO/1000 T Desktop Adapter という値が作られていて、
MULTI_SZ で、"1" "2" "3" "4" "5" と設定されている事から、
ここを見て数字を付けるかどうか、いくつにするかを決めている。
デバイスマネージャで、デバイスを削除したときは、ここの数字も削除される。
Intel(R) PRO/1000 T Desktop Adapter の値ごと削除すると、
新たに認識したときに "1" という設定で作られる。

2002.09.10(火) 01:25:41
XBox のパッドは USB で接続されていて、コネクタを付け替えて PC に刺すとUSBデバイスとして検出されるというのは有名。だが、ドライバがなくてはパッドとして使う事はできない。
xpad.xbos-scene.com でこっそりと Alpha Driver という Windows2000/XP 用ものが公開されていることを知ったので試してみた。
日本版のパッドで使う場合は、xid.inf の一行を以下のように書き換える必要がある。

- XID=XID.Dev, USB\VID_045E&PID_0202
+ XID=XID.Dev, USB\VID_045E&PID_0202, USB\VID_045E&PID_0285
とりあえずちゃんと動く模様。

2002.09.19(木) 02:23:28
XBoxパッドに関するレポートを発見。動かないのは、ひょっとすると、DirectX 8.1 のせいかも。IF-SEGA ドライバがDirectX 8.1で動かなかったのと同じで、 HID INPUTレポートディスクリプタ の互換性問題じゃないかと思われる。うちの動いた環境は、調べてみると DirectX 7 だった。
※この互換性問題の件は、MSDNのサポートインシデントを使って現在問い合わせ中。

八月の日記/メモ