【发布时间】:2017-12-14 00:23:08
【问题描述】:
如果我有一个完整的 IRP,并且我正在 IRP Monitor 等程序中查看它,我如何知道该 IRP 与哪些函数相关联,例如 IRP_MJ_READ 或 IRP_MJ_WRITE?
【问题讨论】:
如果我有一个完整的 IRP,并且我正在 IRP Monitor 等程序中查看它,我如何知道该 IRP 与哪些函数相关联,例如 IRP_MJ_READ 或 IRP_MJ_WRITE?
【问题讨论】:
IRP 本身不与任何功能“关联”。每个IRP 至少有一个I/O Stack Locations - 在IO_STACK_LOCATION 结构的开头,您可以查看
UCHAR MajorFunction;
UCHAR MinorFunction;
主要功能
指示要执行的 I/O 操作类型的 IRP 主要功能代码。
正是这里的值IRP_MJ_XXX。然而复杂的 IRP 有多个堆栈位置,不同的位置可以有不同的MajorFunction。说最初(在顶部堆栈中)设置为文件系统或磁盘驱动程序的 IRP 具有IRP_MJ_WRITE(或读取)。但是当磁盘驱动程序将此 irp 发送到端口驱动程序时 - 已经在堆栈中设置了 IRP_MJ_SCSI
【讨论】:
IoGetCurrentIrpStackLocation)。你从哪里有IRP?无论如何,您需要查找当前堆栈位置 - Irp->Tail.Overlay.CurrentStackLocation