Расширения для отладки драйверов Plug and Play
При отладке драйверов Plug and Play могут оказаться полезными следующие расширения отладчика.
!Арбитр
Отображает текущих арбитров системных ресурсов. Арбитр — это фрагмент кода, предоставляемый водителем шины, который выполняет арбитраж запросов на ресурсы и пытается решить конфликты ресурсов между устройствами, подключенными к этой шине.
!cmreslist
Отображает CM_RESOURCE_LIST для указанного объекта устройства.
Необходимо знать адрес списка ресурсов CM.
Вот пример:
kd> !cmreslist 0xe12576e8
CmResourceList at 0xe12576e8 Version 0.0 Interface 0x1 Bus #0
Entry 0 - Port (0x1) Device Exclusive (0x1)
Flags (0x01) - PORT_MEMORY PORT_IO
Range starts at 0x3f8 for 0x8 bytes
Entry 1 - Interrupt (0x2) Shared (0x3)
Flags (0x01) - LATCHED
Level 0x4, Vector 0x4, Affinity 0xffffffff
Это показывает, что устройство с этим списком ресурсов CM использует диапазон ввода-вывода 3F8-3FF и IRQ 4.
!Dcs
Это расширение устарело— его функциональные возможности были добавлены в состав !pci. См. пример !pci 100 далее в этом разделе.
!devext
Отображает сведения о расширении для различных устройств, относящиеся к шине.
!devnode
Отображает сведения об узле в дереве устройств.
Узел устройства 0 (ноль) является корнем дерева устройств.
Вот пример:
0: kd> !devnode 0xfffffa8003634af0
DevNode 0xfffffa8003634af0 for PDO 0xfffffa8003658590
Parent 0xfffffa8003604010 Sibling 0xfffffa80036508e0 Child 0000000000
InstancePath is "ROOT\SYSTEM\0000"
ServiceName is "swenum"
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)
...
Flags (0x6c000131) DNF_MADEUP, DNF_ENUMERATED,
DNF_IDS_QUERIED, DNF_NO_RESOURCE_REQUIRED,
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 = 1 (including self)
!devobj
Отображает подробные сведения о DEVICE_OBJECT.
Вот пример:
kd> !devobj 0xff0d4af0
Device object (ff0d4af0) is for:
00252d \Driver\PnpManager DriverObject ff0d9030
Current Irp 00000000 RefCount 0 Type 00000004 Flags 00001040AttachedDev ff0b59e0
DevExt ff0d4ba8 DevNode ff0d4a08
Device queue is not busy.
!Драйверы
Команда !drivers больше не поддерживается. Вместо этого используйте команду lm t n .
!drvobj
Отображает подробные сведения о DRIVER_OBJECT.
Выводит список всех объектов устройств, созданных указанным драйвером.
Вот пример:
kd> !drvobj serial
Driver object (ff0ba630) is for:
\Driver\Serial
Driver Extension List: (id , addr)
Device Object list:
ffba3040 ff0b4040 ff0b59e0 ff0b5040
!ecb, !ecd, !ecw
(только для целевых компьютеров x86) Записывает последовательность значений в пространство конфигурации PCI.
ib, iw, id
Считывает данные из порта ввода-вывода.
Эти три команды полезны для определения того, используется ли определенный диапазон операций ввода-вывода устройством, которое отличается от отлаживаемого драйвера. Байтовое значение 0xFF на порту указывает, что порт не используется.
!ioreslist
Отображает указанный IO_RESOURCE_REQUIREMENTS_LIST.
!Irp
Отображает сведения о IRP.
!irpfind
Отображает сведения обо всех IRP, выделенных в настоящее время в целевой системе, или сведения о тех IRP, поля которых соответствуют указанным условиям поиска.
!Pci
(только для целевых компьютеров x86) Отображает текущее состояние шин PCI и всех подключенных к ним устройств. Он также может отображать пространство конфигурации PCI.
В следующем примере отображаются устройства в основной шине:
kd> !pci
PCI Bus 0
00:0 8086:1237.02 Cmd[0106:.mb..s] Sts[2280:.....] Device Host bridge
0d:0 8086:7000.01 Cmd[0007:imb...] Sts[0280:.....] Device ISA bridge
0d:1 8086:7010.00 Cmd[0005:i.b...] Sts[0280:.....] Device IDE controller
0e:0 1011:0021.01 Cmd[0107:imb..s] Sts[0280:.....] PciBridge 0->1-1 PCI-PCI
bridge
10:0 5333:8811.43 Cmd[0023:im.v..] Sts[0200:.....] Device VGA compatible controller
The following example displays the devices for the secondary bus, with verbose output:
kd> !pci 1 1
PCI Bus 1
08:0 10b7:5900.00 Cmd[0107:imb..s] Sts[0200:.....] Device Ethernet
cf8:80014000 IntPin:1 IntLine:f Rom:fa000000 cis:0 cap:0
IO[0]:fce1
09:0 9004:8178.00 Cmd[0117:imb..s] Sts[0280:.....] Device SCSI controller
cf8:80014800 IntPin:1 IntLine:f Rom:fa000000 cis:0 cap:0
IO[0]:f801 MEM[1]:f9fff000
0b:0 9004:5800.10 Cmd[0116:.mb..s] Sts[0200:.....] Device SubID:9004:8940
1394 host controller
cf8:80015800 IntPin:1 IntLine:e Rom:fa000000 cis:0 cap:0
MEM[0]:f9ffec00
В следующем примере отображается пространство конфигурации PCI для контроллера SCSI (шина 1, устройство 9, функция 0):
kd> !pci 100 1 9 0
00: 9004 ;VendorID=9004
02: 8178 ;DeviceID=8178
04: 0117 ;Command=SERREnable,MemWriteEnable,BusInitiate,MemSpaceEnable,IOSpac
eEnable
06: 0280 ;Status=FB2BCapable,DEVSELTiming:1
08: 00 ;RevisionID=00
09: 00 ;ProgIF=00 (SCSI bus controller)
0a: 00 ;SubClass=00
0b: 01 ;BaseClass=01 (Mass storage controller)
0c: 08 ;CacheLineSize=Burst8DW
0d: 20 ;LatencyTimer=20
0e: 00 ;HeaderType=00
0f: 00 ;BIST=00
10: 0000f801;BAR0=0000f801
14: f9fff000;BAR1=f9fff000
18: 00000000;BAR2=00000000
1c: 00000000;BAR3=00000000
20: 00000000;BAR4=00000000
24: 00000000;BAR5=00000000
28: 00000000;CBCISPtr=00000000
2c: 0000 ;SubSysVenID=0000
2e: 0000 ;SubSysID=0000
30: fa000000;ROMBAR=fa000000
34: 00000000;Reserved=00000000
38: 00000000;Reserved=00000000
3c: 0f ;IntLine=0f
3d: 01 ;IntPin=01
3e: 08 ;MinGnt=08
3f: 08 ;MaxLat=08
40: 00001580,00001580,00000000,00000000,00000000,00000000,00000000,00000000
60: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000
80: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000
a0: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000
c0: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000
e0: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000
!pcitree
Отображает сведения об объектах устройств PCI, включая дочерние шины PCI и автобусы CardBus, а также подключенные к ним устройства.
!pnpevent
Отображает очередь событий устройства PnP.
!rellist
Отображает список связей PnP и все связанные структуры CM_RESOURCE_LIST и IO_RESOURCE_LIST.