【问题标题】:Given an IO Request Packet, how can I tell with which function(s) it is associated? E.g IRP_MJ_READ给定一个 IO 请求数据包,我如何判断它与哪些功能相关联?例如 IRP_MJ_READ
【发布时间】:2017-12-14 00:23:08
【问题描述】:

如果我有一个完整的 IRP,并且我正在 IRP Monitor 等程序中查看它,我如何知道该 IRP 与哪些函数相关联,例如 IRP_MJ_READ 或 IRP_MJ_WRITE?

【问题讨论】:

    标签: windows driver wdk wdm


    【解决方案1】:

    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

    【讨论】:

    • 好的,因此仅给定一个 IRP 就无法准确判断使用了哪个函数?或者您可以通过确定 IRP 最后来自哪个驱动程序然后检查 IO STACK 来弄清楚?
    • @the_endian - 你在“给定的 IRP”下是什么意思?每次 IPR 都有所有者 - 处理此 IRP 的驱动程序,并且只有他可以使用它进行操作和访问。驱动程序使用当前堆栈位置(查找IoGetCurrentIrpStackLocation)。你从哪里有IRP?无论如何,您需要查找当前堆栈位置 - Irp->Tail.Overlay.CurrentStackLocation
    • 我现在明白了。谢谢!
    猜你喜欢
    • 2015-08-15
    • 2016-04-29
    • 2020-11-28
    • 1970-01-01
    • 2010-09-28
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多