summerfruit
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2013-12-07
  • 粉丝0
  • 关注0
  • 积分395分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
阅读:1692回复:0

关于自建IRP使用的一点心得

楼主#
更多 发布于:2007-03-30 15:16
  在写Windows上的WDM驱动程序时通常需要自建IRP,然后用它来跟更低层的驱动程序通信。下面我就我碰到的关于自建IRP的一个问题,以及一些心得作一下描述。
1)IoAllocateIrp的使用
    IoAllocateIrp的第一个参数是指定需要分配给这个IRP的STACK_LOCATTION的长度。通常我们取我们的设备对象直接下层的设备对象的STACK_LOCATION的长度,而没有给我们的设备对象保留空间。如果这样做,那么在自建IRP的完成例程中,你将不能使用参数指定设备对象,因为它是NULL。所以如果在完成例程中想访问我们的设备对象,必须把设备对象的地址在设置完成例程时传进去。
    还有一种做法就是在调用IoAllocateIrp 时,指定的STACK长度是下层设备对象的stack长度+1,然后把当前stack location指针向前走一个,然后把设备对象填进去。
  
2)自建IRP的完成例程
   在通常的IRP完成例程里面我们都会以STATUS_SUCCESS或者STATUS_CANCELED返回,但是在自建的IRP的完成例程里面我个人认为最后都用STATUS_MORE_PROCESSING_REQUIRED返回。因为当返回STATUS_MORE_PROCESSING_REQUIRED时,完成例程回卷过程结束,控制权返回给当前设备对象的驱动程序。这是我们可以做很多事情了,可以释放这个IRP,也可以继续使用这个IRP。

欢迎讨论
游客

返回顶部