デバイスマネージャーの [表示] を [デバイス (接続別)] に切り替える

切り分けのために、接続したデバイスと PC のバスとの間でどんなドライバーが動いているか知りたいと思ったことはありますか?

 

皆さん、こんにちは。Windows Driver Kit サポートチームの津田です。今回は、そんな皆様に、デバイス マネージャーの [表示] を、デフォルトの [デバイス (種類別)] から [デバイス (接続別)] に切り替え、各デバイス ノードからドライバーを確認できるところをお見せしたいと思います。また、同じドライバー構成をカーネルデバッガーでデバイス ノードをたどって確認する方法もご紹介します。

 

今回、例として Windows 10 (1607) x86 を使います。

 

1. [スタート] メニューを右クリックして、[デバイス マネージャー] をクリックして、デバイス マネージャーを起動します。

2. 任意のデバイスをクリックします。今回は例として、[ディスクドライブ] にある [Virtual HD ATA Device] をクリックします。

 

clip_image002

 

3. 上図のように、[表示] をクリックすると、[デバイス (種類別)] となっているので、[デバイス (接続別)] をクリックします。

 

clip_image004

 

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 が入っていて、各ファイルをクリックすると弊社製であることがわかります。

 

clip_image006

 

5-2. 次に、一つ上のノードである ATA Channel 0 を見てみます。Atapi.sys, ataport.sys があることがわかります。

 

clip_image008

 

5-3. 次に、Intel(R) 82371AB/EB PCI Bus Master IDE Controller を見てみます。Atapi.sys, ataport.sys, intelide.sys, pciidex.sys があるのがわかります。

 

clip_image010

 

5-4. 次に PCI バスを見てみます。その名の通り、pci.sys があります。

 

clip_image012

 

 

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 の環境) と異常系 (お困りの現象が発生する環境) のドライバー構成の違いを切り分けることができる場合があります。皆様のトラブルシューティングの一助となりましたら幸いです。