原创
关于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会自动帮你搞定这一切.
文章评论(0条评论)
登录后参与讨论