Windows IRP
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相关推荐
- 【IRP】Windows 驱动之IRP
什么是IRP: I/O request packets,简称IRP.即输入输出请求包.它是WINDOWS内核中的一种非常重要的数据结构.上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求.操作 ...
- Windows驱动之IRP PENDING
文章目录 Windows驱动之IRP PENDING 1. IRP的发起 2. IoMarkIrpPending 3. IoCompleteRequest 4. 总结 Windows驱动之IRP PE ...
- windows内核开发学习笔记十五:IRP结构
windows内核开发学习笔记十五:IRP结构 IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...
- Windows驱动之IRP结构
文章目录 Windows驱动之IRP结构 1. IRP 2. IO_STACK_LOCATION 3. IRP 和 IO_STACK_LOCATION 的交互 3.1 IoAllocateIrp 3. ...
- windows内核开发学习笔记十八:IRP 处理的标准模式
windows内核开发学习笔记十八:IRP 处理的标准模式 在 Windows 内核中的请求基本上是通过 I/O Request Packet 完成的. I/O manager ---> Dis ...
- windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互
windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互 前面两篇学习笔记分别介绍了IRP和IO_STACK_LOCATION,整个设备栈来处理这个IRP,但是每个设 ...
- windows 驱动开发基础(二)事件通知---关于irp处理,DPC,链表等
代码来源及参考:wdk 7,路径:C:\WinDDK\7600.16385.1\src\general\event 这个例子演示了两种关于当硬件事件发生时,驱动如何通知应用程序的方法.一种是基于eve ...
- 浅议Windows 2000/XP Pagefile组织管理
任何时候系统内存资源相对磁盘空间来说都是相形见拙的.因为虚拟内存机制,使我们可以有相对丰富的地址资源(通常32bit的虚拟地址,可以有4G的寻址 空间),而这些资源对物理内存来说一般情况是总是绰绰有余 ...
- Windows 文件过滤驱动经验总结
by ai3000 看了 ChuKuangRen 的第二版<文件过滤驱动开发教程>后,颇有感触.我想,交流都是 建立在平等的基础上,在抱怨氛围和环境不好的同时应该先想一想自己究竟付出了多少 ...
最新文章
- 苏宁、国美-OPM战略
- SQL Server 数据库连接字符串的声明
- 微软的100道算法面试题(一)
- onselectstart 、onselect区别
- ubuntu安装linux deepin,如何在Ubuntu中安装Deepin终端 | MOS86
- 自动化测试和手工测试结果汇总小实践
- RS(Regular Singular)隐写分析及实现
- Idea中@Autowired 黄色波浪线问题,注入类显示红色波浪线,去除重复代码导致的波浪黄线,去除xml文件里sql语句的黄色行背景色,问题解决
- PDF虚拟打印机的功能详解和使用方法
- Python-Opencv激光测距
- MySQL可视化工具HeidiSQL安装与使用
- Aspose PDF预览出现乱码
- 纠正口呼吸,信医生别信“神器”
- linux cp omitting,Linux复制文件时出现omitting directory错误解决方法(图)
- Android自定义Lint检查-CustomLint
- 多元统计分析及R语言建模(第四版)-----数据,包,资源
- 详细讲解 —— 网络编程套接字(Java EE初阶)
- 【光学】基于matlab涡旋光产生【含Matlab源码 1927期】
- 追剧还能得红包 《欢乐颂2》五美邀你来“抢”搜狗搜索现金大礼
- Ruff Chain韩国Meetup回顾:物联网因区块链而改变