完成例程在什么情况下需要调用 IoMarkIrpPending
2007-04-20 10:40
323 查看
完成例程在什么情况下需要调用IoMarkIrpPending
(1) 如果完成例程将以 STATUS_PENDING 来结束,则在调用IoCompleteRequest前,必须调用 IoMarkIrpPending。
(2) 所有不返回 STATUS_MORE_PROCESSING_REQUIRED 状态的完成例程都需要:
但是有一种情况是例外:如果驱动程序分配了 IRP,安装了完成例程,然后在未改变堆栈指针的情况下调用 IoCallDriver,那么完成例程就不应该包含上面的代码,因为没有堆栈单元与你的驱动程序关联。
这种情况与完成例程的 DeviceObject 参数为 NULL 的情形类似。驱动程序通常做的是分配一个带有额外堆栈单元的 IRP,在第一个单元中设置 DeviceObject 指针,在调用 IoSetCompletionRoutine 和 IoCallDriver 前用 IoSetNextIrpStackLocation 函数跳过那个额外堆栈单元。如果你这样做,那么在完成例程中调用 IoMarkIrpPending 将不会出现问题,并且完成例程也能得到了一个有效的设备对象。
(1) 如果完成例程将以 STATUS_PENDING 来结束,则在调用IoCompleteRequest前,必须调用 IoMarkIrpPending。
(2) 所有不返回 STATUS_MORE_PROCESSING_REQUIRED 状态的完成例程都需要:
if (Irp->PendingReturned) { IoMarkIrpPending(Irp); }
但是有一种情况是例外:如果驱动程序分配了 IRP,安装了完成例程,然后在未改变堆栈指针的情况下调用 IoCallDriver,那么完成例程就不应该包含上面的代码,因为没有堆栈单元与你的驱动程序关联。
这种情况与完成例程的 DeviceObject 参数为 NULL 的情形类似。驱动程序通常做的是分配一个带有额外堆栈单元的 IRP,在第一个单元中设置 DeviceObject 指针,在调用 IoSetCompletionRoutine 和 IoCallDriver 前用 IoSetNextIrpStackLocation 函数跳过那个额外堆栈单元。如果你这样做,那么在完成例程中调用 IoMarkIrpPending 将不会出现问题,并且完成例程也能得到了一个有效的设备对象。
相关文章推荐
- Python入门:自定义类中的方法被调用的时候,什么情况下需要传入self,什么时候不需要
- 04-【解答疑惑篇】什么情况下需要构建网络数据集?
- andorid4.2 mtk无论在什么情况下按耳机按钮都会调用音乐播放器
- c++ 什么情况下需要将基类的析构函数声明为虚函数
- Struts2有些情况下需要在jsp中嵌套调用action执行的结果
- 在网站流量唱衰的情况下 做好网站运营工作需要什么神技能?
- 完成微信开发需要什么技术
- 什么情况需要数据归一化处理?
- 1.为什么需要继承?如何继承?继承到什么? 2.方法的重载与重写的区别 3.类型的自动转换和强制转换 4.子类特有的方法的调用规则 5.子类重写的方法的调用规则 6.多态的理解 7.面向对象的三大特征
- 什么情况下需要使用VPS
- .lib文件什么情况下需要重新编译
- 在什么情况下需要开启“反交织”模式?
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- 企业在什么情况需要部署CRM系统?
- 什么情况下会调用到session_destroy()
- 调用IE内置打印组件完成web打印方案及例程
- 终于知道什么情况下需要实现.NET Core中的IOptions接口
- SurfaceHolder.Callback 的三个函数什么情况下调用
- 什么情况下需要加extern "C",通俗易懂
- 什么情况下需要通过COINIT_MULTITHREADED进入MTA?