阅读:1857回复:9
关于取消例程和完成例程的一点认识,大牛们请斧正
最近开发的时候得到了一点认识,不知道正确与否,请大牛们判断一下:
当我一个功能驱动程序收到一个上层发下来的Irp的时候,如果IoSetCancelRoutine和IoSetCompletionRoutine都进行了设置,win32 app采用异步调用,当win32 app调用CancelIo对发送的Irp进行取消处理的时候,CancelRoutine和CompletionRoutine会有不同情况的调用,具体情况是: IoSetCancelRoutine...; IoSetCompletionRoutine..; ... IoMarkIrpPending...; IoCallDriver...;//将该Irp发送到下层驱动 return STATUS_PENDING; 此处若调用IoCallDriver,则当win32app call CancelIo的时候,OS会调用Completion Routine而不会调用Cancel Routine; 若没有调用IoCallDriver的话(即没有将该Irp发送到下层驱动),则OS会调用Cancel Routine,而不会调用Completion Routine |
|
最新喜欢:hbnhbn... |
沙发#
发布于:2004-07-09 16:43
哦。谢谢老兄提醒。
还真没考虑这种情况。 现在回想起来,老兄说得还真是,碰到的一些SetCancelroutine的例子都是不往下发送Irp的情况。 |
|
板凳#
发布于:2004-07-13 14:56
[quote]自己程序里创建的新的 IRPs 是可以设置取消例程的,而且一般都是要设置的,否则怎么取消呢? 要是上层取消了irp,那lower device岂不是要非法访问了? 创建irp的程序可以设置完成例程啊? 调用IoCancelIrp通知下层device取消啊。 [/quote] 如果Irp是本层驱动发起的,那么调用IoCancelIrp通知下层取消irp的话,系统不会再调用本层设置的cancel routine,而是调用这个irp的complete routine。 这一点我是专门做过测试的。 |
|