zhangc98
驱动牛犊
驱动牛犊
  • 注册日期2002-03-30
  • 最后登录2004-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2926回复:3

请教有关IRP和IRP栈的问题。

楼主#
更多 发布于:2002-04-06 14:57
irp是I/O管理器发出的I/O请求,定义为一个结构,里面包含了IoStatus等属性,而Irp堆栈是由谁建立的呢?也是I/O管理器么?
关于这两者之间在使用上有什么区别呢?
好像在具体使用的过程中,主要都是在使用Irp堆栈的东西,
他们之间应该如何区别,有什么不同的地方呢?
在具体用的时候又要注意些什么呢〉
谢谢各位大虾的指点:)
目前:新手上路; 目标:高级站友; 理想:开国大佬; 方法:自己的努力+大家的关照!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-06 15:30
irp是I/O管理器发出的I/O请求,定义为一个结构,里面包含了IoStatus等属性,而Irp堆栈是由谁建立的呢?也是I/O管理器么?
关于这两者之间在使用上有什么区别呢?
好像在具体使用的过程中,主要都是在使用Irp堆栈的东西,
他们之间应该如何区别,有什么不同的地方呢?
在具体用的时候又要注意些什么呢〉
谢谢各位大虾的指点:)
 

    Win2000 WDM驱动程序是包驱动的,IRP是其中一个非常重要的数据结构。
    一个IRP是从非分页内存中分配的可变大小的结构,它包括两部分:IRP首部(也称为头部)和I/O堆栈位置(IrpStackLocation)。这两部分都是由I/O Manager(I/O管理器)建立的。IRP结构中的内容并不固定,随着请求类型的不同而有较大不同。
    IrpStackLocation的主要目的是,保存一个I/O请求的函数代码和参数。通过检查堆栈位置的MajorFunction字段,驱动程序能够确定执行什么操作及如何解释Parameters共用体(union)字段的内容。
    对于一个直接发送到最低级驱动程序的请求,其相应的IRP只有一个I/O堆栈位置。对于发送到较高级驱动程序的请求,I/O 管理器建立一个在每个驱动程序层有不同I/O堆栈位置的IRP。换句话说,I/O StackLocation的数量实际上是参与I/O 请求的I/O 层的数量,或者是设备栈的深度(depth).只允许层次结构中的每个驱动程序接触它自己的I/O Stack Location.如果它想调用一个更低级的驱动程序,它必须保证新的I/O StackLocation在它的下面的位置被正确地建立。这可以使用如IoCopyCurrentIrpStackLocationToText,IoAllcateIrp等例程来设置。

Best regards !

Tom_lyd
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-04-06 20:36
用户被禁言,该主题自动屏蔽!
zhangc98
驱动牛犊
驱动牛犊
  • 注册日期2002-03-30
  • 最后登录2004-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-07 16:26
谢谢两位的解释,我会继续努力学习的;0
目前:新手上路; 目标:高级站友; 理想:开国大佬; 方法:自己的努力+大家的关照!
游客

返回顶部