IRP请求的完成与返回
2009-05-15 14:45
183 查看
IRP请求的完成与返回
每当完成了一个以IRP为代表的I/O操作请求的时候,就要执行IRP的善后操作IoCompleteRequest(),这是个宏操作,定义为函数IofCompleteRequest()。
#define IoCompleteRequest IofCompleteRequest
如前所述,以IRP为代表的I/O操作请求的执行可以是同步的,也可以是异步的,所以一个I/O操作请求的完成不一定与相应主功能函数的返回相一致。如果操作是同步的,那么主功能函数要到完成了所要求的操作时才返回,所以在返回之前就要执行这个函数。如果操作是异步的,那么主功能函数不等所要求的操作完成就返回了,这个函数的执行就留给了DPC函数。
IRP的善后包括一些什么操作呢?当然,这里面包括将其从IRP所属线程和所针对设备对象的IRP队列中摘除出来并加以释放,但是这还不是事情的全部。前面讲过,由于异步操作,各层设备驱动的主功能函数不等操作完成就返回了,可是各层设备驱动都可能有自己的善后函数,这些善后函数要等IRP所要求的操作完成时才能执行,所以就通过宏操作IoSetCompletionRoutine()设置好相应IO_STACK_LOCATION数据结构中的函数指针CompletionRoutine,把善后函数的执行托付给DPC函数。所以,IRP的善后就包括自下而上地扫描IRP中的各层IO_STACK_LOCATION数据结构,如果字段Control中相应标志位所表示的条件得到满足就加以调用。
读者也许会问,如果各层设备驱动所实现的恰巧都是同步操作,那也要把善后函数托付给DPC函数吗?例如,在前面通过系统调用NtReadFile()读鼠标器的例子中,如果恰巧类设备对象的缓冲区中有数据可读,那么该操作实际上就是同步的。在这种情况下,各层设备驱动仍可以通过IoSetCompletionRoutine()设置IRP中的函数指针,但是最后执行IofCompleteRequest()的并不是DPC函数,而是当前线程。当前线程在完成了IRP所要求的操作以后就会执行IofCompleteRequest(),同样会自下而上地扫描执行各层设备驱动的善后函数。这样,当上一层设备驱动的函数从IoCallDriver()返回时,它所托付的善后函数已经得到执行了。
每当完成了一个以IRP为代表的I/O操作请求的时候,就要执行IRP的善后操作IoCompleteRequest(),这是个宏操作,定义为函数IofCompleteRequest()。
#define IoCompleteRequest IofCompleteRequest
如前所述,以IRP为代表的I/O操作请求的执行可以是同步的,也可以是异步的,所以一个I/O操作请求的完成不一定与相应主功能函数的返回相一致。如果操作是同步的,那么主功能函数要到完成了所要求的操作时才返回,所以在返回之前就要执行这个函数。如果操作是异步的,那么主功能函数不等所要求的操作完成就返回了,这个函数的执行就留给了DPC函数。
IRP的善后包括一些什么操作呢?当然,这里面包括将其从IRP所属线程和所针对设备对象的IRP队列中摘除出来并加以释放,但是这还不是事情的全部。前面讲过,由于异步操作,各层设备驱动的主功能函数不等操作完成就返回了,可是各层设备驱动都可能有自己的善后函数,这些善后函数要等IRP所要求的操作完成时才能执行,所以就通过宏操作IoSetCompletionRoutine()设置好相应IO_STACK_LOCATION数据结构中的函数指针CompletionRoutine,把善后函数的执行托付给DPC函数。所以,IRP的善后就包括自下而上地扫描IRP中的各层IO_STACK_LOCATION数据结构,如果字段Control中相应标志位所表示的条件得到满足就加以调用。
读者也许会问,如果各层设备驱动所实现的恰巧都是同步操作,那也要把善后函数托付给DPC函数吗?例如,在前面通过系统调用NtReadFile()读鼠标器的例子中,如果恰巧类设备对象的缓冲区中有数据可读,那么该操作实际上就是同步的。在这种情况下,各层设备驱动仍可以通过IoSetCompletionRoutine()设置IRP中的函数指针,但是最后执行IofCompleteRequest()的并不是DPC函数,而是当前线程。当前线程在完成了IRP所要求的操作以后就会执行IofCompleteRequest(),同样会自下而上地扫描执行各层设备驱动的善后函数。这样,当上一层设备驱动的函数从IoCallDriver()返回时,它所托付的善后函数已经得到执行了。
相关文章推荐
- IRP请求的完成与返回
- 在用form 提交请求时,在请求处理完成后想要在JAVA后台设置返回信息状态展示到页面
- 使用JQuery.js & JQuery.form.js 插件完成对StrutsAction的异步请求,返回JSON数据
- Windows内核学习笔记(三)-- IRP请求处理及完成机制
- Ajax发送同步请求给Spring,通过controller处理完成后如何返回响应
- IRP请求处理及完成机制
- IRP请求处理及完成机制
- ionic 发送请求返回一直都是404
- Struts2使用注解,完成请求响应,实现零配置
- 通过HTTP请求图片,同时转为二进制流返回
- 状态码告知从服务端返回的请求结果
- iOS 开发 把握AFNet网络请求完成的正确时机
- ios10微信,返回上一页后ajax请求出错的问题
- photoshop 打开图片 无法完成请求因为程序错误
- iOS中UIWebView的一个需求:获得js图片请求完成的回调时机
- 将后台List对象以Json格式返回到前台Ajax请求
- Java向请求返回应答数据
- 关于js处理ajax请求返回json数据时出现页面缓存的解决方案(适用于showdialog)
- 网络请求返回NSData转换
- jsp发送ajax请求,servlet返回json对象实例