九月の日記/メモ |
▼
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のサポートインシデントを使って現在問い合わせ中。