浅谈IRP结构

啥都不说先上图:


浅谈IRP结构_第1张图片
图片未经允许禁止使用

什么是IRP

IRP是一个结构体,用于R3和R0之间通信,R3会把请求的数据封装在IRP中发送给R0,R0通过DeviceObject(设备对象)接收到IRP,然后由DeviceObject调用分发函数处理对IRP进行处理,

IRP分为2部分:IRP head(IRP 头)和IRP stack(IRP 栈).IRP head中封装了公用的一些参数,比如IoStatus和存储数据的Buffer,这些数据是共有的.IRP stack可以由多层.Stack中的数据则需要特定的驱动设备才能访问.当我们的DeviceObject拦截到一个IRP并处理完成之后,可以结束这个IRP,也可以继续下发这个IRP.下发IRP到下一层时,Stack的下标就-1.

IRP_HEAD(头):

IO_STATUS:这个成员中有2个子成员.分别是Status和Information

          status:就是反应这次IO的成功状况与否,

          Information:  表示Io的一些额外信息. 比如在读写操作时表示实际读写的字节数, 在其他地方可能有更多的意思.

SystemBuffer:当R3和R0的通信方式是DO_BUFFERED_IO时,IRP->Associated.SystemBuffer中获取IoManager分配的缓存的首地址

MdlAddress:当R3和R0的通讯方式是DRIVECT_IO时,就可以从这个位置获取到IoManager为R3和R0分配的物理地址的首地址.在拿到物理地址后再转换为R0的虚拟地址

UserBuffer: 当R3和R0通信方式是neither_io是,R0直接获取R3传下来的内存地址,在使用UserBuffer是一定要验证地址是否是R3的地址,以确保安全

IRP_STACK(栈):

栈是分层的,一般会有6或8层,每层栈的结构如图所示:


浅谈IRP结构_第2张图片
IRP stack


在DriverEntry函数中调用IoGetCurrentIrpStackLocation(IRP)函数,将IRP作为参数传入,就可获得IRP中的栈的地址.栈中保存了MajorFunction(主功能号)、MinorFunction(次功能号)Parameters(Union联合体)、DeviceObject和FileObject,下面介绍这些参数的作用:

MajorFunction(主功能号):

代表了IRP的类型,表示本次IRP是Read、Write、Close或是其他操作;

MinorFunction(次功能号):

代表主功能号的操作中包含的其他操作.举个栗子:比如Delete、Rename操作,这两个操作就可能是Write操作下的子操作,包含在Write中

Parameter(union联合体):

这个union存放着各种操作的struct.当进行Read操作时,就使用Read这个结构体,以此类推.这些struct中存放着对应buffer的长度

你可能感兴趣的:(浅谈IRP结构)