デバイスマネージャーの [表示] を [デバイス (接続別)] に切り替える
切り分けのために、接続したデバイスと PC のバスとの間でどんなドライバーが動いているか知りたいと思ったことはありますか?
皆さん、こんにちは。Windows Driver Kit サポートチームの津田です。今回は、そんな皆様に、デバイス マネージャーの [表示] を、デフォルトの [デバイス (種類別)] から [デバイス (接続別)] に切り替え、各デバイス ノードからドライバーを確認できるところをお見せしたいと思います。また、同じドライバー構成をカーネルデバッガーでデバイス ノードをたどって確認する方法もご紹介します。
今回、例として Windows 10 (1607) x86 を使います。
1. [スタート] メニューを右クリックして、[デバイス マネージャー] をクリックして、デバイス マネージャーを起動します。
2. 任意のデバイスをクリックします。今回は例として、[ディスクドライブ] にある [Virtual HD ATA Device] をクリックします。
3. 上図のように、[表示] をクリックすると、[デバイス (種類別)] となっているので、[デバイス (接続別)] をクリックします。
4. 上図の通り、対象デバイスが接続されている場所がツリー状に表示されます。上記の例では、以下のツリーになっています。
ACPI x86-based PC
→ Microsoft ACPI-Compliant System
→ PCI バス
→ Intel(R) 82371AB/EB PCI Bus Master IDE Controller
→ ATA Channel 0
→ Virtual HD ATA Device
5. 各ノードを右クリックして [プロパティ] をクリックし、[ドライバー] タブを開いて [ドライバーの詳細] をクリックします。
5-1. まずは、Virtual HD ATA Device を見てみます。以下のように disk.sys, EhStorClass.sys, partmgr.sys, vmstorfl.sys が入っていて、各ファイルをクリックすると弊社製であることがわかります。
5-2. 次に、一つ上のノードである ATA Channel 0 を見てみます。Atapi.sys, ataport.sys があることがわかります。
5-3. 次に、Intel(R) 82371AB/EB PCI Bus Master IDE Controller を見てみます。Atapi.sys, ataport.sys, intelide.sys, pciidex.sys があるのがわかります。
5-4. 次に PCI バスを見てみます。その名の通り、pci.sys があります。
6. 上記をカーネルデバッガ―で見てみます。
6-1. まずは、disk.sys のデバイスオブジェクトを探します。
kd> !drvobj disk Driver object (8ebe86f8) is for: \Driver\disk Driver Extension List: (id , addr) (8a657bd0 8ebeee20) Device Object list: 8d700a80 |
6-2. 最後に表示されたデバイスオブジェクトのアドレスを使って、デバイススタックを見てみます。5-1 で確認した disk.sys の上に partmgr.sys があることがわかります。またこのデバイスノードでは、atapi.sys のデバイスオブジェクトが PDO であることがわかります。デバイスオブジェクトやデバイススタックについては K 里さんのエントリ (Device Object と Device Stack) をご参照ください。
kd> !devstack 8d700a80 !DevObj !DrvObj !DevExt ObjectName 8d7006e0 \Driver\partmgr 8d700798 > 8d700a80 \Driver\disk 8d700b38 DR0 8d6c1790 \Driver\storflt 8d6c1f10 8ebd9920 \Driver\ACPI 8eb0b568 8ebd7878 \Driver\atapi 8ebd7930 IdeDeviceP0T0L0-0 !DevNode 8ebdd008 : DeviceInst is "IDE\DiskVirtual_HD______________________________1.1.0___\5&35dc7040&0&0.0.0" ServiceName is "disk" |
6-3. !DevNode として表示されたデバイスノードを見てみます。PDO が上記 atapi.sys のデバイスオブジェクトと同じ (0x8ebd7878) であることがわかります。このデバイスノードが末端なので Child のアドレスが NULL (0) です。親ノードである Parent のアドレス (0x8ebd3e30) が確認できます。
kd> !DevNode 8ebdd008 DevNode 0x8ebdd008 for PDO 0x8ebd7878 Parent 0x8ebd3e30 Sibling 0000000000 Child 0000000000 InstancePath is "IDE\DiskVirtual_HD______________________________1.1.0___\5&35dc7040&0&0.0.0" ServiceName is "disk" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) StateHistory[08] = DeviceNodeEnumerateCompletion (0x30d) StateHistory[07] = DeviceNodeEnumeratePending (0x30c) StateHistory[06] = DeviceNodeStarted (0x308) StateHistory[05] = DeviceNodeStartPostWork (0x307) StateHistory[04] = DeviceNodeStartCompletion (0x306) StateHistory[03] = DeviceNodeResourcesAssigned (0x304) StateHistory[02] = DeviceNodeDriversAdded (0x303) StateHistory[01] = DeviceNodeInitialized (0x302) StateHistory[00] = DeviceNodeUninitialized (0x301) StateHistory[19] = Unknown State (0x0) StateHistory[18] = Unknown State (0x0) StateHistory[17] = Unknown State (0x0) StateHistory[16] = Unknown State (0x0) StateHistory[15] = Unknown State (0x0) StateHistory[14] = Unknown State (0x0) StateHistory[13] = Unknown State (0x0) StateHistory[12] = Unknown State (0x0) StateHistory[11] = Unknown State (0x0) StateHistory[10] = Unknown State (0x0) StateHistory[09] = Unknown State (0x0) Flags (0x20000130) DNF_ENUMERATED, DNF_IDS_QUERIED, DNF_NO_RESOURCE_REQUIRED, DNF_NO_UPPER_DEVICE_FILTERS UserFlags (0x00000008) DNUF_NOT_DISABLEABLE DisableableDepends = 1 (including self) |
6-4. 親ノードを !devnode で見てみます。Child のアドレスが、6-3 のもの (0x8ebdd008) と同じであることがわかります。
kd> !devnode 8ebd3e30 DevNode 0x8ebd3e30 for PDO 0x8ebd2ce0 Parent 0x8eb7fa80 Sibling 0x8ebd3c58 Child 0x8ebdd008 InstancePath is "PCIIDE\IDEChannel\4&10bf2f88&0&0" ServiceName is "atapi" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) StateHistory[09] = DeviceNodeEnumerateCompletion (0x30d) StateHistory[08] = DeviceNodeEnumeratePending (0x30c) StateHistory[07] = DeviceNodeStarted (0x308) StateHistory[06] = DeviceNodeStartPostWork (0x307) StateHistory[05] = DeviceNodeStartCompletion (0x306) StateHistory[04] = DeviceNodeStartPending (0x305) StateHistory[03] = DeviceNodeResourcesAssigned (0x304) StateHistory[02] = DeviceNodeDriversAdded (0x303) StateHistory[01] = DeviceNodeInitialized (0x302) StateHistory[00] = DeviceNodeUninitialized (0x301) StateHistory[19] = Unknown State (0x0) StateHistory[18] = Unknown State (0x0) StateHistory[17] = Unknown State (0x0) StateHistory[16] = Unknown State (0x0) StateHistory[15] = Unknown State (0x0) StateHistory[14] = Unknown State (0x0) StateHistory[13] = Unknown State (0x0) StateHistory[12] = Unknown State (0x0) StateHistory[11] = Unknown State (0x0) StateHistory[10] = Unknown State (0x0) Flags (0x6c0000f0) DNF_ENUMERATED, DNF_IDS_QUERIED, DNF_HAS_BOOT_CONFIG, DNF_BOOT_CONFIG_RESERVED, DNF_NO_LOWER_DEVICE_FILTERS, DNF_NO_LOWER_CLASS_FILTERS, DNF_NO_UPPER_DEVICE_FILTERS, DNF_NO_UPPER_CLASS_FILTERS UserFlags (0x00000008) DNUF_NOT_DISABLEABLE DisableableDepends = 2 (including self) |
6-5. PDO のアドレスからデバイススタックを見てみます。Atapi.sys のデバイスオブジェクトが FDO としてあり、このデバイスノードは、5-2 で見た「ATA Channel 0」と同じだとわかります。PDO が intelide.sys のデバイスオブジェクトなので、5-3 の「Intel(R) 82371AB/EB PCI Bus Master IDE Controller」につながっているのだろうと推察できます。
kd> !devstack 0x8ebd2ce0 !DevObj !DrvObj !DevExt ObjectName 88695028 \Driver\atapi 886950e0 IdePort0 8ebc9620 \Driver\ACPI 8eb0b7a0 > 8ebd2ce0 \Driver\intelide 8ebd2d98 PciIde0Channel0 !DevNode 8ebd3e30 : DeviceInst is "PCIIDE\IDEChannel\4&10bf2f88&0&0" ServiceName is "atapi" |
6-6. 同様に Parent をたどって、PDO のデバイススタックを表示していくと以下のようになります。
kd> !devnode 0x8eb7fa80 DevNode 0x8eb7fa80 for PDO 0x8eb7e030 Parent 0x887eccc0 Sibling 0x8eb7f8a8 Child 0x8ebd3e30 InstancePath is "PCI\VEN_8086&DEV_7111&SUBSYS_00000000&REV_01\3&267a616a&0&39" ServiceName is "intelide" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) StateHistory[09] = DeviceNodeEnumerateCompletion (0x30d) StateHistory[08] = DeviceNodeEnumeratePending (0x30c) StateHistory[07] = DeviceNodeStarted (0x308) StateHistory[06] = DeviceNodeStartPostWork (0x307) StateHistory[05] = DeviceNodeStartCompletion (0x306) StateHistory[04] = DeviceNodeStartPending (0x305) StateHistory[03] = DeviceNodeResourcesAssigned (0x304) StateHistory[02] = DeviceNodeDriversAdded (0x303) StateHistory[01] = DeviceNodeInitialized (0x302) StateHistory[00] = DeviceNodeUninitialized (0x301) StateHistory[19] = Unknown State (0x0) StateHistory[18] = Unknown State (0x0) StateHistory[17] = Unknown State (0x0) StateHistory[16] = Unknown State (0x0) StateHistory[15] = Unknown State (0x0) StateHistory[14] = Unknown State (0x0) StateHistory[13] = Unknown State (0x0) StateHistory[12] = Unknown State (0x0) StateHistory[11] = Unknown State (0x0) StateHistory[10] = Unknown State (0x0) Flags (0x6c0000f0) DNF_ENUMERATED, DNF_IDS_QUERIED, DNF_HAS_BOOT_CONFIG, DNF_BOOT_CONFIG_RESERVED, DNF_NO_LOWER_DEVICE_FILTERS, DNF_NO_LOWER_CLASS_FILTERS, DNF_NO_UPPER_DEVICE_FILTERS, DNF_NO_UPPER_CLASS_FILTERS UserFlags (0x00000008) DNUF_NOT_DISABLEABLE DisableableDepends = 2 (including self)
// PDO のデバイススタックを表示
kd> !devstack 0x8eb7e030 !DevObj !DrvObj !DevExt ObjectName 8ebd2030 \Driver\intelide 8ebd20e8 PciIde0 8eb7e8f8 \Driver\ACPI 8eb0b9d8 > 8eb7e030 \Driver\pci 8eb7e0e8 NTPNP_PCI0002 !DevNode 8eb7fa80 : DeviceInst is "PCI\VEN_8086&DEV_7111&SUBSYS_00000000&REV_01\3&267a616a&0&39" ServiceName is "intelide"
// Parent のデバイスノードを表示
kd> !devnode 0x887eccc0 DevNode 0x887eccc0 for PDO 0x8e3fd1e0 Parent 0x8869b860 Sibling 0x8eb0ce00 Child 0x8eb7fe30 InterfaceType 0x5 Bus Number 0 InstancePath is "ACPI\PNP0A03\0" ServiceName is "pci" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) StateHistory[09] = DeviceNodeEnumerateCompletion (0x30d) StateHistory[08] = DeviceNodeEnumeratePending (0x30c) StateHistory[07] = DeviceNodeStarted (0x308) StateHistory[06] = DeviceNodeStartPostWork (0x307) StateHistory[05] = DeviceNodeStartCompletion (0x306) StateHistory[04] = DeviceNodeStartPending (0x305) StateHistory[03] = DeviceNodeResourcesAssigned (0x304) StateHistory[02] = DeviceNodeDriversAdded (0x303) StateHistory[01] = DeviceNodeInitialized (0x302) StateHistory[00] = DeviceNodeUninitialized (0x301) StateHistory[19] = Unknown State (0x0) StateHistory[18] = Unknown State (0x0) StateHistory[17] = Unknown State (0x0) StateHistory[16] = Unknown State (0x0) StateHistory[15] = Unknown State (0x0) StateHistory[14] = Unknown State (0x0) StateHistory[13] = Unknown State (0x0) StateHistory[12] = Unknown State (0x0) StateHistory[11] = Unknown State (0x0) StateHistory[10] = Unknown State (0x0) Flags (0x6c0000f0) DNF_ENUMERATED, DNF_IDS_QUERIED, DNF_HAS_BOOT_CONFIG, DNF_BOOT_CONFIG_RESERVED, DNF_NO_LOWER_DEVICE_FILTERS, DNF_NO_LOWER_CLASS_FILTERS, DNF_NO_UPPER_DEVICE_FILTERS, DNF_NO_UPPER_CLASS_FILTERS UserFlags (0x00000008) DNUF_NOT_DISABLEABLE CapabilityFlags (0x000000c0) UniqueID, SilentInstall DisableableDepends = 4 (including self)
// PDO のデバイススタックを表示。PCI バスにたどり着いた。
kd> !devstack 0x8e3fd1e0 !DevObj !DrvObj !DevExt ObjectName 8ebb9020 \Driver\pci 8ebb90d8 > 8e3fd1e0 \Driver\ACPI 8eb0bc10 0000000f !DevNode 887eccc0 : DeviceInst is "ACPI\PNP0A03\0" ServiceName is "pci" |
上記を行うことで、正常系 (例えばクリーンインストールした OS の環境) と異常系 (お困りの現象が発生する環境) のドライバー構成の違いを切り分けることができる場合があります。皆様のトラブルシューティングの一助となりましたら幸いです。