您的位置:首页 > 其它

完成例程在什么情况下需要调用 IoMarkIrpPending

2007-04-20 10:40 323 查看
完成例程在什么情况下需要调用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 将不会出现问题,并且完成例程也能得到了一个有效的设备对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐