您的位置:首页 > 其它

驱动开发之 完成IRP的几种情况

2014-08-18 10:47 204 查看
完成IRP时是忽略还是拷贝当前栈空间,返回什么状态值,以及完成函数中如何结束IRP,是不那么容易弄清楚的一件事情。
下面做个总结:

1.如果对IRP完成之后的事情无兴趣,则直接忽略当前IO_STACK_LOCATION(从代码上说,调用内核API函数IoSkipCurrentIrpLocation),然后向下传递请求,返回IoCallDriver所返回的状态。

2.不但对IRP完成之后的事情无兴趣,而且不打算继续传递,打算立即返回成功或失败,那么不用忽略或者拷贝当前IO_STACK_LOCATION,填写IRP的状态参数后调用IoCompleteRequest,并返回自己想返回的结果。

3.如果对IRP完成之后的事情有兴趣,并打算在完成函数中处理,应该首先拷贝当前IO_STACK_LOCATION(IoCopyCurrentIrpStackLocationToNext),然后指定完成函数,并返回IoCallDriver()所返回的状态。在完成函数中,不需要调用IoCompleteRequest,直接返回IRP的当前状态即可。

4.同 3 的情况,有时候,会把任务塞入系统工作线程或者希望在另外的线程中去完成IRP,那么完成函数中应该返回STATUS_MORE_PROCESSING_REQUIRED,此时完成irp时应该调用IoCompleteRequest。另一种类似的情况是在分发函数中等待完成函数中设置的事件,那么完成函数返回STATUS_MORE_PROCESSING_REQUIRED,分发函数在等待结束后调用IoCompleteRequest。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: