!irp
!irp 扩展显示有关 I/O 请求数据包(IRP)的信息。
!irp Address [Detail]
参数
地址
指定 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 完成并返回错误代码时,将调用完成例程。
取消
指示如果尝试取消 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!NtfsMasterIrpSyncCompletionRoutine、847eeed0-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 |