IRP 的结构
来源:互联网 发布:淘宝培训班哪家好 编辑:程序博客网 时间:2024/05/29 03:45
。WDK 中的wdm.h 中,能找到IRP 的结构如下:
值得注意的是所谓的IRP 栈空间。这是因为一个IRP 往往要传递n 个设备才能得到完
成(为何如此?在第三章的描述中读者会有所认识)。可以想象,传递过程中,有可能会
有一些“中间变换”,导致请求的参数变化。为了保存这种参数变化,我们给每次“中转”
都留一个“栈空间”,用来保存中间参数。所以一个请求并非简单的一个输入,并等待一
个输出。而是经过许多中转才得以完成。而且中转的每个步骤,输入都可以改变。所以可
变部分的输入信息保存在一个栈似的结构中。每中转一次,则使用其中一个位置。域
CurrentLocation 表示当前使用了哪一个。
typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP{// 类型和大小CSHORT Type;USHORT Size;// 内存描述符链表指针。实际上,这里用来描述一个缓冲区。可以想象,// 一个内核请求一般都需要一个缓冲区(如读硬盘需要有读出缓冲区)PMDL MdlAddress;……// 下面这个共用体中也有一个SystemBuffer。这是比MdlAddress 稍微简// 单的表示缓冲区的一种方式。IRP 用MdlAddress 还是用SystemBuffer// 取决于这次请求的IO 方式。总之二者都有可能。union {struct _IRP *MasterIrp;__volatile LONG IrpCount;PVOID SystemBuffer;} AssociatedIrp;// IO状态。一般的说请求完成之后的返回情况放在这里。IO_STATUS_BLOCK IoStatus;// IRP 栈空间大小。CHAR StackCount;// IRP当前栈空间CHAR CurrentLocation;……// 用来取消一个未决请求的函数__volatile PDRIVER_CANCEL CancelRoutine;// 和MdlAddress 和SystemBuffer 一样都可以表示缓冲区。但是缓冲区的// 特性稍有不同。以后再详细解释。PVOID UserBuffer;union {……// 发出这个请求的线程PETHREAD Thread;……struct {LIST_ENTRY ListEntry;union {// 一个IRP 栈空间元素struct _IO_STACK_LOCATION *CurrentStackLocation;…};};……} Overlay;……} Tail;} IRP, *PIRP;
值得注意的是所谓的IRP 栈空间。这是因为一个IRP 往往要传递n 个设备才能得到完
成(为何如此?在第三章的描述中读者会有所认识)。可以想象,传递过程中,有可能会
有一些“中间变换”,导致请求的参数变化。为了保存这种参数变化,我们给每次“中转”
都留一个“栈空间”,用来保存中间参数。所以一个请求并非简单的一个输入,并等待一
个输出。而是经过许多中转才得以完成。而且中转的每个步骤,输入都可以改变。所以可
变部分的输入信息保存在一个栈似的结构中。每中转一次,则使用其中一个位置。域
CurrentLocation 表示当前使用了哪一个。
- IRP 的结构
- IRP结构
- IRP结构
- IRP结构
- IRP结构
- IRP结构
- IRP结构
- IRP和IO_STACK_LOCATION结构的关联
- IRP和IO_STACK_LOCATION结构
- 【驱动之一】IRP结构
- IRP结构与理解
- WDM中的结构(1)---IRP
- WDM中的结构(1)---IRP
- 对IRP的理解
- IRP 的创建
- 对IRP的理解
- IRP的创建
- IRP的完成例程
- C语言的库文件
- ffmpeg的码率控制
- Httpservlet cannot be resolved to a type的原因与解决方法
- 四极管:JNI学习(一:书写步骤及简单在eclipse下实现JNI)
- 排序学习笔记
- IRP 的结构
- C# 在WinForm中按钮响应回车事件的简单方法
- 函数式语言特点之-闭包
- balance
- 实现一个冒泡提示的浮点数编辑框
- 简单介绍百度蜘蛛的工作原理
- Mybatis学习日记(一)
- 读中文txt里显示乱码问题
- Lua游戏开发 0