cc682/NetRoc
http://netroc682.spaces.live.com/
!iovirp
!iovirp 扩展显示指定的I/O Verifier IRP 的详细信息。
语法
!iovirp [IRP]
参数
IRP
指定被驱动程序验证器(Driver Verifier)跟踪的IRP的地址。如果IRP 为0或省略,则显示每个未完成IRP的摘要信息。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
注释
下面是该扩展输出的示例:
kd> !iovirp 947cef68
IovPacket 84509af0
TrackedIrp 947cef68
HeaderLock 84509d61
LockIrql 0
ReferenceCount 1
PointerCount 1
HeaderFlags 00000000
ChainHead 84509af0
Flags 00200009
DepartureIrql 0
ArrivalIrql 0
StackCount 1
QuotaCharge 00000000
QuotaProcess 0
RealIrpCompletionRoutine 0
RealIrpControl 0
RealIrpContext 0
TopStackLocation 2
PriorityBoost 0
LastLocation 0
RefTrackingCount 0
SystemDestVA 0
VerifierSettings 84509d08
pIovSessionData 84509380
Allocation Stack:
nt!IovAllocateIrp+1a (817df356)
nt!IopXxxControlFile+40c (8162de20)
nt!NtDeviceIoControlFile+2a (81633090)
nt!KiFastCallEntry+164 (81513c64)
nt!EtwpFlushBuffer+10f (817606d7)
nt!EtwpFlushBuffersWithMarker+bd (817608cb)
nt!EtwpFlushActiveBuffers+2b4 (81760bc2)
nt!EtwpLogger+213 (8176036f)
任何时候通过按下CTRL+BREAK (WinDbg) 或者CTRL+C (KD)都可以中止命令。
!ipi
!ipi 扩展显示指定处理器的跨处理器中断(interprocessor interrupt (IPI))状态。
语法
!ipi [Processor]
参数
Processor
指定一个处理器。如果省略Processor,则显示所有处理器的 IPI 状态。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
该扩展只能对x86目标机使用。
注释
下面是命令输出的示例:
0: kd> !ipi
IPI State for Processor 0
Worker Routine: nt!KiFlushTargetMultipleTb [Stale]
Parameter[0]: 0
Parameter[1]: 3
Parameter[2]: F7C98770
Ipi Trap Frame: F7CCCCDC [.trap F7CCCCDC]
Signal Done: 0
IPI Frozen: 24 [FreezeActive] [Owner]
Request Summary: 0
Target Set: 0
Packet Barrier: 0
IPI State for Processor 1
Worker Routine: nt!KiFlushTargetMultipleTb [Stale]
Parameter[0]: 1
Parameter[1]: 3
Parameter[2]: F7CDCD28
Ipi Trap Frame: F7C8CCC4 [.trap F7C8CCC4]
Signal Done: 0
IPI Frozen: 2 [Frozen]
Request Summary: 0
Target Set: 0
Packet Barrier: 0
附加信息
关于IPI的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!irp
!irp 扩展显示某个I/O请求包(IRP)的信息。
语法
!irp Address [Detail]
参数
Address
指定IRP的16进制地址。
Detail
如果该参数包含了任何值,例如1,则输出重包含IRP的状态、内存描述符表(memory descriptor list (MDL))的地址、拥有者线程、它的所有I/O栈的堆栈信息、以及每个IRP堆栈位置的信息,包括主功能代码(major function code)和次功能代码(minor function code)的16进制数值。如果省略该参数,则只显示摘要信息。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
下面这些信息有助于理解该扩展命令输出的内容。
IRP 主功能代码有下面这些:
Major Function Code
|
16进制代码
|
IRP_MJ_CREATE
|
0x00
|
IRP_MJ_CREATE_NAMED_PIPE
|
0x01
|
IRP_MJ_CLOSE
|
0x02
|
IRP_MJ_READ
|
0x03
|
IRP_MJ_WRITE
|
0x04
|
IRP_MJ_QUERY_INFORMATION
|
0x05
|
IRP_MJ_SET_INFORMATION
|
0x06
|
IRP_MJ_QUERY_EA
|
0x07
|
IRP_MJ_SET_EA
|
0x08
|
IRP_MJ_FLUSH_BUFFERS
|
0x09
|
IRP_MJ_QUERY_VOLUME_INFORMATION
|
0x0A
|
IRP_MJ_SET_VOLUME_INFORMATION
|
0x0B
|
IRP_MJ_DIRECTORY_CONTROL
|
0x0C
|
IRP_MJ_FILE_SYSTEM_CONTROL
|
0x0D
|
IRP_MJ_DEVICE_CONTROL
|
0x0E
|
IRP_MJ_INTERNAL_DEVICE_CONTROL IRP_MJ_SCSI
|
0x0F
|
IRP_MJ_SHUTDOWN
|
0x10
|
IRP_MJ_LOCK_CONTROL
|
0x11
|
IRP_MJ_CLEANUP
|
0x12
|
IRP_MJ_CREATE_MAILSLOT
|
0x13
|
IRP_MJ_QUERY_SECURITY
|
0x14
|
IRP_MJ_SET_SECURITY
|
0x15
|
IRP_MJ_POWER
|
0x16
|
IRP_MJ_SYSTEM_CONTROL
|
0x17
|
IRP_MJ_DEVICE_CHANGE
|
0x18
|
IRP_MJ_QUERY_QUOTA
|
0x19
|
IRP_MJ_SET_QUOTA
|
0x1A
|
IRP_MJ_PNP IRP_MJ_MAXIMUM_FUNCTION
|
0x1B
|
即插即用(Plug and Play) 次功能代码有下面这些:
Minor Function Code
|
16进制代码
|
IRP_MN_START_DEVICE
|
0x00
|
IRP_MN_QUERY_REMOVE_DEVICE
|
0x01
|
IRP_MN_REMOVE_DEVICE
|
0x02
|
IRP_MN_CANCEL_REMOVE_DEVICE
|
0x03
|
IRP_MN_STOP_DEVICE
|
0x04
|
IRP_MN_QUERY_STOP_DEVICE
|
0x05
|
IRP_MN_CANCEL_STOP_DEVICE
|
0x06
|
IRP_MN_QUERY_DEVICE_RELATIONS
|
0x07
|
IRP_MN_QUERY_INTERFACE
|
0x08
|
IRP_MN_QUERY_CAPABILITIES
|
0x09
|
IRP_MN_QUERY_RESOURCES
|
0x0A
|
IRP_MN_QUERY_RESOURCE_REQUIREMENTS
|
0x0B
|
IRP_MN_QUERY_DEVICE_TEXT
|
0x0C
|
IRP_MN_FILTER_RESOURCE_REQUIREMENTS
|
0x0D
|
IRP_MN_READ_CONFIG
|
0x0F
|
IRP_MN_WRITE_CONFIG
|
0x10
|
IRP_MN_EJECT
|
0x11
|
IRP_MN_SET_LOCK
|
0x12
|
IRP_MN_QUERY_ID
|
0x13
|
IRP_MN_QUERY_PNP_DEVICE_STATE
|
0x14
|
IRP_MN_QUERY_BUS_INFORMATION
|
0x15
|
IRP_MN_DEVICE_USAGE_NOTIFICATION
|
0x16
|
IRP_MN_SURPRISE_REMOVAL
|
0x17
|
IRP_MN_QUERY_LEGACY_BUS_INFORMATION
|
0x18
|
WMI次功能代码有:
Minor Function Code
|
16进制代码
|
IRP_MN_QUERY_ALL_DATA
|
0x00
|
IRP_MN_QUERY_SINGLE_INSTANCE
|
0x01
|
IRP_MN_CHANGE_SINGLE_INSTANCE
|
0x02
|
IRP_MN_CHANGE_SINGLE_ITEM
|
0x03
|
IRP_MN_ENABLE_EVENTS
|
0x04
|
IRP_MN_DISABLE_EVENTS
|
0x05
|
IRP_MN_ENABLE_COLLECTION
|
0x06
|
IRP_MN_DISABLE_COLLECTION
|
0x07
|
IRP_MN_REGINFO
|
0x08
|
IRP_MN_EXECUTE_METHOD
|
0x09
|
电源管理的次功能代码有:
Minor Function Code
|
16进制代码
|
IRP_MN_WAIT_WAKE
|
0x00
|
IRP_MN_POWER_SEQUENCE
|
0x01
|
IRP_MN_SET_POWER
|
0x02
|
IRP_MN_QUERY_POWER
|
0x03
|
SCSI 次功能代码有:
Minor Function Code
|
16进制代码
|
IRP_MN_SCSI_CLASS
|
0x01
|
输出中还指出了当每个stack location当IRP完成或者stack location被处理时,在什么情况下完成例程会被调用。有三种可能的情况:
Success
表示当IRP以成功代码完成时完成例程会被调用。
Error
表示当IRP以错误代码完成时,完成例程会被调用 。
Cancel
表示当尝试cancel该IRP时完成里程会被调用。
可能会出现上面三个的任何组合形式,只要满足其中一种条件,那么完成例程都会被调用。适当的值会在每个stack location信息的第一行末尾列出,紧跟Completion-Context 之后。
下面是该扩展命令在Windows XP上的输出示例:
!irp 81183468
Irp is active with 2 stacks 2 is current (= 0x811834fc)
No Mdl Thread 00000000: Irp stack trace.
Cmd flg cl Device File Completion-Context
[ 0, 0] 0 0 8145f470 00000000 00000000-00000000
\Driver\E100B
Args: 00000000 00000000 00000000 00000000
[ 16, 2] 0 e1 8145f470 00000000 8047f744-814187a8 Success Error Cancel pending
\Driver\E100B ntoskrnl!PopCompleteSystemPowerIrp
Args: 00000000 00000000 00000002 00000002
在Windows XP示例的第二个stack location处, 主功能代码 是16,说明该IRP是发送给power stack的。次功能代码是2,所以power stack 知道它是一个set 请求。该IRP被pending,并且当它完成时,不管指定的返回值是Success还是Error,ntoskrnl!PopCompleteSystemPowerIrp 都会被调用。
下面是该扩展命令在Windows Vista上的输出示例:
0: kd> !irp 0x831f4a00
Irp is active with 8 stacks 5 is current (= 0x831f4b00)
Mdl = 82b020d8 Thread 8c622118: Irp stack trace.
cmd flg cl Device File Completion-Context
[ 0, 0] 0 0 00000000 00000000 00000000-00000000
Args: 00000000 00000000 00000000 00000000
[ 0, 0] 0 0 00000000 00000000 00000000-00000000
Args: 00000000 00000000 00000000 00000000
[ 0, 0] 0 0 00000000 00000000 00000000-00000000
Args: 00000000 00000000 00000000 00000000
[ 0, 0] 0 0 00000000 00000000 00000000-00000000
Args: 00000000 00000000 00000000 00000000
>[ 3,34] 40 e1 828517a8 00000000 842511e0-00000000 Success Error Cancel pending
\Driver\disk partmgr!PmReadWriteCompletion
Args: 00007000 00000000 fe084e00 00000004
[ 3, 0] 40 e0 82851450 00000000 842414d4-82956350 Success Error Cancel
\Driver\PartMgr volmgr!VmpReadWriteCompletionRoutine
Args: 129131bb 000000de fe084e00 00000004
[ 3, 0] 0 e0 82956298 00000000 847eeed0-829e2ba8 Success Error Cancel
\Driver\volmgr Ntfs!NtfsMasterIrpSyncCompletionRoutine
Args: 00007000 00000000 1bdae400 00000000
[ 3, 0] 0 0 82ac2020 8e879410 00000000-00000000
\FileSystem\Ntfs
Args: 00007000 00000000 00018400 00000000
注意驱动名边上的完成例程是设置在该stack location上的,并且它是被下一行的驱动设置的。上面的例子中, Ntfs!NtfsMasterIrpSyncCompletionRoutine 是由\FileSystem\Ntfs设置的。 Ntfs!NtfsMasterIrpSyncCompletionRoutine上面的Completion-Context为 847eeed0-829e2ba8,指示了该完成例程的地址以及将会传递给Ntfs!NtfsMasterIrpSyncCompletionRoutine的context。从这里我们可以知道Ntfs!NtfsMasterIrpSyncCompletionRoutine 的地址是847eeed0,将会被传递给它的context为 829e2ba8。
附加信息
查看Plug and Play 调试以及调试Interrupt Storms获得该扩展命令的应用。关于IRP的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。关于主功能代码和次功能代码的更多信息,查看Windows Driver Kit (WDK)文档。
!irpfind
!irpfind 显示当前目标系统中已分配的,或者符合指定搜索条件的I/O请求包(IRP)的信息。
语法
Windows NT 4.0的语法
!irpfind [PoolType]
Windows 2000的语法
!irpfind [PoolType [RestartAddress [Criteria Data]]]
Windows XP and later的语法
!irpfind [-v] [PoolType [RestartAddress [Criteria Data]]]
参数
-v
(Windows XP和之后) 显示详细信息。
PoolType
指定要搜索的池的类型。可以指定下面这些值:
0
指定非分页内存池(nonpaged memory pool)。这是默认值。
1
指定分页内存池(paged memory pool)。
2
指定特殊池(special pool)。
4
(Windows XP和之后) 指定会话池(session pool)。
4, 5, 6
(仅Windows NT 4.0) 和0, 1, 2一样,但是显示详细信息。
RestartAddress
指定搜索开始位置的16进制地址。这在前面的搜索提前终止时游泳。默认值为0。
Criteria
指定搜索条件。只有满足给定条件的IRP才会显示出来。
条件
|
匹配
|
arg
|
查找所有某个stack location具有等于Data的参数的IRP。
|
device
|
查找某个stack location的DeviceObject等于Data 的所有IRP。
|
fileobject
|
查找Irp.Tail.Overlay.OriginalFileObject 等于Data的IRP。
|
mdlprocess
|
查找Irp.MdlAddress.Process 等于Data的IRP。
|
thread
|
查找Irp.Tail.Overlay.Thread 等于Data的IRP。
|
userevent
|
查找 Irp.UserEvent 等于Data的IRP。
|
Data
指定搜索的匹配项。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
下面的例子查找完成时会设置FF9E4F48 用户事件的,在非分页池中的IRP:
kd> !irpfind 0 0 userevent ff9e4f48
下面的命令列出所有非分页池中的IRP:
kd> !irpfind
Searching NonPaged pool (8090c000 : 8131e000) for Tag: Irp
8097c008 Thread 8094d900 current stack belongs to \Driver\symc810
8097dec8 Thread 8094dda0 current stack belongs to \FileSystem\Ntfs
809861a8 Thread 8094dda0 current stack belongs to \Driver\symc810
809864e8 Thread 80951ba0 current stack belongs to \Driver\Mouclass
80986608 Thread 80951ba0 current stack belongs to \Driver\Kbdclass
80986728 Thread 8094dda0 current stack belongs to \Driver\symc810
附加信息
查看Plug and Play 调试获取该扩展命令的应用。关于IRP的更多信息,查看Windows Driver Kit (WDK)文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!irpzone
!irpzone 扩展命令已经废除,使用 !irpfind 来替代。
!irql
!irql 扩展显示目标机在调试器中断之前某个处理器的中断请求级别(interrupt request level (IRQL))。
语法
!irql [Processor]
参数
Processor
指定处理器。输入处理器号。如果省略该参数,调试器显示当前处理器的IRQL。
DLL
!irql 扩展仅在Windows Server 2003和之后的Windows版本中可用。
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP
|
不可用
|
Windows Server 2003和之后
|
Kdexts.dll
|
注释
当目标机中断到调试器时IRQL会改变,但是调试器中断之前的IRQL会被保存下来。!irql 扩展会显示这个被保存的 IRQL。
类似的,当发生bug check并且创建dump文件时,dump文件中会保存bug check之前的IRQL,而不是KeBugCheckEx 例程执行时的。
两种情况下,除了x86架构上之外,当前IRQL都会被提升到DISPATCH_LEVEL。因此,如果不止一个这样的事件发生,那么显示出来的IRQL会是DISPATCH_LEVEL,这样对调试问题就没有用处了。
!pcr 扩展命令可以在所有Windows版本上显示当前IRQL,但是当前IRQL一般都是无用的。Bug check或者调试器连接之前的IRQL要更加有用一点,而它只能用!irql显示出来。
如果指定了非法的处理器号,或者内核被破坏了,调试器会显示"Cannot get PRCB address"的信息。
下面是该扩展在一个双处理器的x86计算机上的输出示例:
kd> !irql 0
Debugger saved IRQL for processor 0x0 -- 28 (CLOCK2_LEVEL)
kd> !irql 1
Debugger saved IRQL for processor 0x1 -- 0 (LOW_LEVEL)
如果调试器在详细模式(verbose mode)下,则还会显示IRQL本身的说明。下面是一个在Itanium处理器上的示例 :
kd> !irql
Debugger saved IRQL for processor 0x0 -- 12 (PC_LEVEL) [Performance counter level]
IRQL数字的意义通常由处理器决定。这里是一个x64 处理器的例子。注意IRQL数字和上面的例子一样,但是该IRQL的含义是不同的:
kd> !irql
Debugger saved IRQL for processor 0x0 -- 12 (SYNCH_LEVEL) [Synchronization level]
附加信息
关于IRQL的信息,查看Windows Driver Kit (WDK)文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!isainfo
!isainfo 显示PNPISA卡或者系统中存在的设备的信息。
语法
!isainfo [Card]
参数
Card
指定一个PNPISA卡。如果 Card为0或者省略,则显示PNPISA (即PC I/O)总线上所有设备和卡。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
下面是该扩展输出的示例:
0: kd> !isainfo
ISA PnP FDO @ 0x867b9938, DevExt @ 0x867b99f0, Bus # 0
Flags (0x80000000) DF_BUS
ISA PnP PDO @ 0x867B9818, DevExt @ 0x86595388
Flags (0x40000818) DF_ENUMERATED, DF_ACTIVATED,
DF_REQ_TRIMMED, DF_READ_DATA_PORT
!isr
!isr 扩展显示指定地址处的Itanium中断状态寄存器(Interruption Status Register (ISR))。
语法
!isr Expression [DisplayLevel]
参数
Expression
指定要显示的ISR寄存器的16进制地址。也可以使用@isr表达式作为该参数。这种情况下,显示当前处理器的ISR寄存器信息。
DisplayLevel
可以是下面这些选项之一:
0
仅显示每个ISR字段的值。这是默认值。
1
显示非保留和非忽略的ISR字段的详细信息。
2
显示ISR的所有字段,包括被忽略或被保留的那些。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
该扩展命令只能对Itanium目标机使用。
注释
下面是命令输出的示例:
kd> !isr @isr
isr:ed ei so ni ir rs sp na r w x vector code
0 0 0 0 0 0 0 0 0 0 0 0 0
kd> !isr @isr 2
cod : 0 : interruption Code
vec : 0 : IA32 exception vector number
rv : 0 : reserved0
x : 0 : eXecute exception
w : 0 : Write exception
r : 0 : Read exception
na : 0 : Non-Access exception
sp : 0 : Speculative load exception
rs : 0 : Register Stack
ir : 0 : Invalid Register frame
ni : 0 : Nested Interruption
so : 0 : IA32 Supervisor Override
ei : 0 : Exception IA64 Instruction
ed : 0 : Exception Deferral
rv : 0 : reserved1
!ivt
!ivt 扩展显示Itanium中断向量表(interrupt vector table)。
语法
!ivt [-v] [-a] [Vector]
!ivt -?
参数
Vector
指定当前处理器的中断向量表条目。如果省略Vector,则显示目标机当前处理器的整个中断向量表。如果没有使用-a选项,那么未赋值的中断向量不会显示出来。
-a
显示所有中断向量,包括未赋值的那些。
-v
显示详细输出。
-?
在调试器命令窗口中显示帮助文本。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
该扩展命令只能在Itanium目标机上使用。
注释
下面是命令输出的示例:
kd> !ivt
Dumping IA64 IVT:
00:e000000083005f60 nt!KiPassiveRelease
0f:e000000083576830 hal!HalpPCIISALine2Pin
10:e0000000830067f0 nt!KiApcInterrupt
20:e000000083006790 nt!KiDispatchInterrupt
30:e000000083576b30 hal!HalpCMCIHandler
31:e000000083576b20 hal!HalpCPEIHandler
41:e000000085039680 i8042prt!I8042KeyboardInterruptService (KINTERRUPT e000000085039620)
51:e000000085039910 i8042prt!I8042MouseInterruptService (KINTERRUPT e0000000850398b0)
61:e0000000854484f0 VIDEOPRT!pVideoPortInterrupt (KINTERRUPT e000000085448490)
71:e0000000856c9450 NDIS!ndisMIsr (KINTERRUPT e0000000856c93f0)
81:e0000000857fd000 SCSIPORT!ScsiPortInterrupt (KINTERRUPT e0000000857fcfa0)
91:e0000000857ff510 atapi!IdePortInterrupt (KINTERRUPT e0000000857ff4b0)
a1:e0000000857d84b0 atapi!IdePortInterrupt (KINTERRUPT e0000000857d8450)
a2:e0000165fff2cab0 portcls!CInterruptSyncServiceRoutine (KINTERRUPT e0000165fff2ca50)
b1:e0000000858c7460 ACPI!ACPIInterruptServiceRoutine (KINTERRUPT e0000000858c7400)
b2:e0000000850382e0 USBPORT!USBPORT_InterruptService (KINTERRUPT e000000085038280)
d0:e0000000835768d0 hal!HalpClockInterrupt
e0:e000000083576850 hal!HalpIpiInterruptHandler
f0:e0000000835769c0 hal!HalpProfileInterrupt
f1:e000000083576830 hal!HalpPCIISALine2Pin
fd:e000000083576b10 hal!HalpMcRzHandler
fe:e000000083576830 hal!HalpPCIISALine2Pin
附加信息
关于如何显示x64和x86目标机上的中断分配表(interrupt dispatch table) ,查看!idt。