!irp

!irp 扩展显示有关 I/O 请求数据包(IRP)的信息。

!irp Address [Detail] 

参数

Address
指定 IRP 的十六进制地址。

详细信息
如果此参数随任何值(如 1)一起包含,则输出包括 IRP 的状态、内存描述符列表(MDL)的地址、其所有 I/O 堆栈的自有线程和堆栈信息,以及有关 IRP 的每个堆栈位置的信息,包括主要函数代码和次要函数代码的十六进制版本。 如果省略此参数,输出仅包含信息的摘要。

DLL

Kdexts.dll

其他信息

有关此扩展命令的应用程序,请参阅即插即用调试调试中断 Storm。 有关 IRP 的信息,请参阅 Windows 驱动程序工具包(WDK)文档和 Mark Russinovich 和 David Solomon 编写的 Microsoft Windows 内部资料。 有关主要函数代码和次要函数代码的详细信息,请参阅 Windows 驱动程序工具包(WDK)文档。

本主题介绍 IRP 结构 IRP

有关解码 IRP 结构(包括返回的 Args)的详细信息,请参阅以下资源。

  • Mark E. Russinovich、David A. Solomon 和 Alex Ionescu 编写的“Microsoft Windows 内部资料”
  • 使用 Windows Driver Foundation 开发驱动程序 Guy Smith 和 Penny Orwick

注解

该输出还指示,一旦 IRP 完成并处理了堆栈位置,在什么条件下将调用每个堆栈位置的完成例程。 有三种可能的原因:

成功
指示当 IRP 完成并显示成功代码时,将调用完成例程。

错误
指示当 IRP 完成并返回错误代码时,将调用完成例程。

Cancel
指示如果尝试取消 IRP,将调用完成例程。

这三者的任何组合都可能出现,如果满足所显示的任何条件,将调用完成例程。 在关于每个堆栈位置的第一行信息的末尾,紧接完成上下文条目之后,列出了适当的值。

以下是适用于 Windows 10 的此扩展的输出示例:

0: kd> !irp ac598dc8
Irp is active with 2 stacks 1 is current (= 0xac598e38)
 No Mdl: No System Buffer: Thread 8d1c7bc0:  Irp stack trace.  
     cmd  flg cl Device   File     Completion-Context
>[IRP_MJ_FILE_SYSTEM_CONTROL(d), N/A(0)]
            1 e1 8a6434d8 ac598d40 853220cb-a89682d8 Success Error Cancel pending
           \FileSystem\Npfs fltmgr!FltpPassThroughCompletion
            Args: 00000000 00000000 00110008 00000000
 [IRP_MJ_FILE_SYSTEM_CONTROL(d), N/A(0)]
            1  0 8a799710 ac598d40 00000000-00000000    
           \FileSystem\FltMgr
            Args: 00000000 00000000 0x00110008 00000000

从 Windows 10 开始,将显示 IRP 主要代码文本和次要代码文本,例如,"IRP_MJ_FILE_SYSTEM_CONTROL"。代码值也以十六进制显示,在本例中为 "(d)"。

输出中显示的第三个参数是 IOCTL 代码。 使用 !ioctldecode 命令显示有关 IOCTL 的信息。

以下是来自 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

请注意,驱动程序名称旁边的完成例程在该堆栈位置上设置,并由以下行中的驱动程序设置。 在前面的示例中,Ntfs!NtfsMasterIrpSyncCompletionRoutine\FileSystem\Ntfs 设置。 Ntfs!NtfsMasterIrpSyncCompletionRoutine847eeed0-829e2ba8 上方的 Completion-Context 条目指示完成例程的地址,以及将传递给 Ntfs!NtfsMasterIrpSyncCompletionRoutine 的上下文。 由此可以看到,Ntfs!NtfsMasterIrpSyncCompletionRoutine 地址为 847eeed0,当调用这个例程时,传递给它的上下文是 829e2ba8

IRP 主要函数代码

包括以下信息,来帮助解释此扩展命令的输出。

IRP 主要函数代码如下所示:

主要函数代码 十六进制代码

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

即插即用次要函数代码如下所示:

次要函数代码 十六进制代码

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 次要函数代码如下所示:

次要函数代码 十六进制代码

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

电源管理次要函数代码如下所示:

次要函数代码 十六进制代码

IRP_MN_WAIT_WAKE

0x00

IRP_MN_POWER_SEQUENCE

0x01

IRP_MN_SET_POWER

0x02

IRP_MN_QUERY_POWER

0x03

SCSI 次要函数代码如下所示:

次要函数代码 十六进制代码

IRP_MN_SCSI_CLASS

0x01

另请参阅

IRP

!irpfind

!ioctldecode