驱动开发之 完成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。
下面做个总结:
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。
相关文章推荐
- 驱动开发(13)IRP 的异步完成和 CancelRoutine
- Windows驱动开发WDM (16)- 完成例程 (重新获得IRP控制权)
- linux2.6.22下usb驱动完成情况及问题解决
- linux2.6.24下usb驱动完成情况及问题解决
- Working Practice-工作量完成情况趋势图说明开发进展情况
- 分层驱动模型中IRP的传递与完成
- NDIS过滤驱动开发手记(完成)
- 我要转行Linux驱动开发了,驱动开发的工作是什么样的情况,希望大神给点建议,也希望大家给我一点鼓励
- Windows驱动开发WDM (15)- 完成例程
- Windows驱动开发WDM (9)- StartIO例程(串行化处理IRP)
- iOS开发中,按钮不能点击的几种情况
- 驱动开发的几种编译环境配置法
- 驱动开发的几种编译环境配置法----PS:我孤陋寡闻了。。。。反省啊。。。。
- 对 Windows驱动开发技术详解 第九章的(IRP的同步)自我理解
- java游戏开发--简单的几行代码就完成了驱动小精灵的编程
- 驱动开发的几种编译环境配置法(转)
- <学习笔记>Windows驱动开发技术详解__IRP的同步
- [转]分层驱动模型中IRP的传递与完成
- 驱动开发之 常见IRP
- iOS 开发中按钮不能点击的几种情况