IRP 的结构

。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 表示当前使用了哪一个。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值