NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----80

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-Context847eeed0-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

posted on 2008-07-22 13:57 NetRoc 阅读(1846) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜