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

2008-4-2 20:38 6298 4 4 分类: 软件与OS
在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会自动帮你搞定这一切.

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条