IRP(I/O Request Packet),是由IO manager发起的对device的IO请求。

当用户调用系统API,如createFile类似的函数,其实是会交给IO manager来做相应的处理。

首先IO Manager知道这次IO请求,涉及到的设备栈(Device Stack),每个Device都有相应的Driver。

IO Manager然后会组一个IRP的结构,包括IRP头,以及紧随其后的IO_STACK_LOCATION结构体数组。

相当于:

typedef struct _IRP{struct IRP_HEADER irpHeader;...IO_STACK_LOCATION ioStack[];...
}

irpHeader有不少有用的信息,如:SystemBuffer,StackCount,CurrentLocation,Flags...

其中成员StackCount指定IO_STACK_LOCATION数组的个数,其实就是Device Stack里面每个device都会被分配一个IO_STACK_LOCATION。

typedef struct _IO_STACK_LOCATION {UCHAR  MajorFunction;UCHAR  MinorFunction;UCHAR  Flags;UCHAR  Control;union {// Parameters for IRP_MJ_CREATE
        struct {PIO_SECURITY_CONTEXT  SecurityContext;ULONG  Options;USHORT POINTER_ALIGNMENT  FileAttributes;USHORT  ShareAccess;ULONG POINTER_ALIGNMENT  EaLength;} Create;...} Parameters;PDEVICE_OBJECT  DeviceObject;PFILE_OBJECT  FileObject;.
} IO_STACK_LOCATION, *PIO_STACK_LOCATION;

IO_STACK_LOCATON会有不少Input Parameter,如MajorFunction,MinorFunction...等,这些parameter是由上级device帮忙配置好的。

一般的流程就是,这级的device对应的driver根据上级帮忙配置的一些IO_STACK_LOCATION信息,完成相应的工作,然后配置好下一级的IO_STCAK_LOCATION.

调用IoCallDriver(NextDeviceObject,Irp),交给下一级的device.

事实上,如果某个device啥事都不想做,它可以直接skip原来分给它的IO_STACK_LOCATION,在IoCallDriver,只要相应调整下stackIndex类似的值,就可以让下一级的Device使用自己的IO_STACK_LOCATION内存了。

当然每个Device都可以配置IoSetCompletionRoutine,这样下一级完成的时候,会call自己设的completion routine,当然不设也没关系.

要理解IRP,其实首先需要理解device stack, IO Manager是怎么维护device stack的呢?

其实有相应的API, IoAttachDevice, IoDetachDevice。

NTSTATUS IoAttachDevice(_In_   PDEVICE_OBJECT SourceDevice,_In_   PUNICODE_STRING TargetDevice,_Out_  PDEVICE_OBJECT *AttachedDevice
);

The IoAttachDevice routine attaches the caller's device object to a named target device object, so that I/O requests bound for the target device are routed first to the caller.

VOID IoDetachDevice(_Inout_  PDEVICE_OBJECT TargetDevice
);

The IoDetachDevice routine releases an attachment between the caller's device object and a lower driver's device object.

在call这些API的时候,IO Manager就在做构建device stack的工作了。

转载于:https://www.cnblogs.com/zzSoftware/p/2908825.html

Windows IRP相关推荐

  1. 【IRP】Windows 驱动之IRP

    什么是IRP: I/O request packets,简称IRP.即输入输出请求包.它是WINDOWS内核中的一种非常重要的数据结构.上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求.操作 ...

  2. Windows驱动之IRP PENDING

    文章目录 Windows驱动之IRP PENDING 1. IRP的发起 2. IoMarkIrpPending 3. IoCompleteRequest 4. 总结 Windows驱动之IRP PE ...

  3. windows内核开发学习笔记十五:IRP结构

    windows内核开发学习笔记十五:IRP结构   IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...

  4. Windows驱动之IRP结构

    文章目录 Windows驱动之IRP结构 1. IRP 2. IO_STACK_LOCATION 3. IRP 和 IO_STACK_LOCATION 的交互 3.1 IoAllocateIrp 3. ...

  5. windows内核开发学习笔记十八:IRP 处理的标准模式

    windows内核开发学习笔记十八:IRP 处理的标准模式 在 Windows 内核中的请求基本上是通过 I/O Request Packet 完成的. I/O manager ---> Dis ...

  6. windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互

    windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互 前面两篇学习笔记分别介绍了IRP和IO_STACK_LOCATION,整个设备栈来处理这个IRP,但是每个设 ...

  7. windows 驱动开发基础(二)事件通知---关于irp处理,DPC,链表等

    代码来源及参考:wdk 7,路径:C:\WinDDK\7600.16385.1\src\general\event 这个例子演示了两种关于当硬件事件发生时,驱动如何通知应用程序的方法.一种是基于eve ...

  8. 浅议Windows 2000/XP Pagefile组织管理

    任何时候系统内存资源相对磁盘空间来说都是相形见拙的.因为虚拟内存机制,使我们可以有相对丰富的地址资源(通常32bit的虚拟地址,可以有4G的寻址 空间),而这些资源对物理内存来说一般情况是总是绰绰有余 ...

  9. Windows 文件过滤驱动经验总结

    by ai3000 看了 ChuKuangRen 的第二版<文件过滤驱动开发教程>后,颇有感触.我想,交流都是 建立在平等的基础上,在抱怨氛围和环境不好的同时应该先想一想自己究竟付出了多少 ...

最新文章

  1. 苏宁、国美-OPM战略
  2. SQL Server 数据库连接字符串的声明
  3. 微软的100道算法面试题(一)
  4. onselectstart 、onselect区别
  5. ubuntu安装linux deepin,如何在Ubuntu中安装Deepin终端 | MOS86
  6. 自动化测试和手工测试结果汇总小实践
  7. RS(Regular Singular)隐写分析及实现
  8. Idea中@Autowired 黄色波浪线问题,注入类显示红色波浪线,去除重复代码导致的波浪黄线,去除xml文件里sql语句的黄色行背景色,问题解决
  9. PDF虚拟打印机的功能详解和使用方法
  10. Python-Opencv激光测距
  11. MySQL可视化工具HeidiSQL安装与使用
  12. Aspose PDF预览出现乱码
  13. 纠正口呼吸,信医生别信“神器”
  14. linux cp omitting,Linux复制文件时出现omitting directory错误解决方法(图)
  15. Android自定义Lint检查-CustomLint
  16. 多元统计分析及R语言建模(第四版)-----数据,包,资源
  17. 详细讲解 —— 网络编程套接字(Java EE初阶)
  18. 【光学】基于matlab涡旋光产生【含Matlab源码 1927期】
  19. 追剧还能得红包 《欢乐颂2》五美邀你来“抢”搜狗搜索现金大礼
  20. Ruff Chain韩国Meetup回顾:物联网因区块链而改变

热门文章

  1. Tableau技巧(五)帕累托分布(二八原则)
  2. “躲不开”的科技革命,第一季:远离舒适区!
  3. HTML+CSS写网站首页
  4. 吴恩达深度学习课程值不值得学?四晚学完的高手给你建议
  5. zsh补全中compinit full initialization问题
  6. 图解网络TCP/IP
  7. turtle.write方法使用说明
  8. 用CSS画小猪佩奇,你就是下一个社会人!
  9. Excel如何永久去除“受保护视图”的打开提醒?
  10. 芯片设计公司有哪些小而美的选择?