关于NT驱动irp pending的注意事项

关于NT驱动irp pending的注意事项发布时间:2008-04-02 20:38:30
  

在NT内核中,有时候不能立马完成一个irp,需要pending它,这个时候有一些微妙的地方需要注意,因为NT得代码没有真正公开,详细搞清楚NT处理IRP的过程很不容易,以前网上有两篇文章讨论过,但我觉得还是讲的不是很清楚.现在win2k得代码泻了很久了,里面也许有关于这块的代码,我没有时间去仔细研究,看哪天有空要好好研究.
但总体而言,pending一个IRP时候,要遵守下面的几条规则:
1.如果你在分派例程中不pending irp,而是完成它,那么一定要设置irp的完成状态和information,然后一定要调用IoCompleteRequest完成该IRP,最后返回你刚刚设定的irp完成状态:
      Irp->IoStatus.Status = STATUS_SUCCESS;

       Irp->IoStatus.Information = bytesTransfered;

       IoCompleteRequest(Irp, IO_NO_INCREMENT);

       return(STATUS_SUCCESS);//这里一定返回STATUS_SUCCESS,因为你刚刚设定Irp->IoStatus.Status = STATUS_SUCCESS
2.如果你要在分派例程中pending它,则你一定要先调用IoMarkIrpPending(),再返回STATUS_PENDING,绝对不能不IoMarkIrpPending就return STATUS_PENDING
3.如果你想返回lower driver的状态给上层驱动,那么如果lower driver返回的是STATUS_PENDING,那么你一定要将它传递上去,除非你有充分的理由返回STATUS_MORE_ PROCESSING_REQUIRED,自己搞定这个IRP,而不需要I/O manager插手.上upper driver传递pending状态的正确方法是在你的完成例程中(注意是在你的完成例程,不是分派例程)这样做:
If(Irp->PendingReturned) {

              IoMarkIrpPending(Irp);

             return STATUS_PENDING;
}
4.如果你没有指定完成例程,则不必管上面第3条规则,I/O manager会自动帮你搞定这一切。
.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值