Windows驱动开发-IoCompleteRequest

血红的双手。 提交于 2020-02-22 17:17:29

IoCompleteRequest 例程表示调用者的已经完成了对指定I/O请求的所有处理操作,并且向I/O管理器返回指定的IRP报文。

//函数原型
VOID IoCompleteRequest( IN PIRP Irp, IN CCHAR PriorityBoost );

Irp 指向将要完成的IRP报文数据结构。

PriorityBoost 代表线程恢复时的优先级别。

关于优先级的概念,与文件I/O相关的win32API的内部执行过程,大体是这样的,以ReadFile为例

1,ReadFile调用ntdll中的NtReadFile,其中ReadFile是win32的API,NtReadFile是Native API

2,ntdll中的NtReadFile进入到内核模式,并调用系统服务中的NtReadFile,

3,系统服务中的NtReadFile创建IRP_MJ_READ类型的IRP,然后它将这个IRP发送到某个驱动程序中的派遣函数中,NtReadFile然后去等待一个事件,  这时,当前线程进入睡眠状态,也可以说当前线程被阻塞或线程处于Pending状态,

4,在派遣函数中,一般会将IRP请求结束,结束IRP是通过IoCompleteRequest函数,在IoCompleteRequest函数内部会设置,刚才的等待事件,睡眠的线程被恢复运行

IoCompleteRequest函数中第二个参数PriorityBoost代表一种优先级,指的是被阻塞的线程以何种优先级恢复运行,一般形况下,优先级设置为IO_NO_INCREMENT,
对某些特殊情况,需要将阻塞的线程以“优先”的身份恢复运行,如鼠标,键盘等设备输入,他们需要更快的反应

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!