Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
切り分けのために、接続したデバイスと 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 の環境) と異常系 (お困りの現象が発生する環境) のドライバー構成の違いを切り分けることができる場合があります。皆様のトラブルシューティングの一助となりましたら幸いです。