IRP 的结构

来源:互联网 发布:淘宝培训班哪家好 编辑:程序博客网 时间:2024/05/29 03:45
。WDK 中的wdm.h 中,能找到IRP 的结构如下:
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 表示当前使用了哪一个。
原创粉丝点击