阅读:2223回复:15
在IoCompletionRoutine里需要调用IoCompleteIrp吗?
标准过滤驱动程序里,我想建立一个IoCompletionRoutine来改变返回的数据,
但是在写框架的时候, NTSTATUS completeirp(IN PDEVICE_OBJECT DeviceObject,IN PIRP irp,IN PVOID Context){ if(irp->PendingReturned){ IoMarkIrpPending(irp); //IoCompleteIrp(irp); return STATUS_PENDING; } //IoCompleteIrp(irp); return STATUS_SUCCESS; } 不知道这里的IoCompleteIrp是否需要,看了ddk很长时间也是云里雾里的,好像很多样例驱动里都没有,但是好像ddk又说如果下层不IoCompleteIrp,更上层的IoCompletionRoutine得不到调用??晕啊 还有一个问题是本来已经是IoCompletionRoutine了,为什么还会接受到PendingReturned的irp??一个irp被完成了,状态还是pending?那么什么时候就不pending了?那个时候IoCompletionRoutine还会得到调用吗? 谢谢大家,我真是菜鸟,ddk越看越晕,唉~~ |
|
最新喜欢:hunter...
|
沙发#
发布于:2005-07-18 13:24
嗯,谢谢zhaock斑竹。
还有一个问题是本来已经是IoCompletionRoutine了,为什么还会接受到PendingReturned的irp??一个irp被完成了,状态还是pending?那么什么时候就不pending了?那个时候IoCompletionRoutine还会得到调用吗? 谢谢…… |
|
|
板凳#
发布于:2005-07-18 22:37
chenx-python老兄,你就是救命稻草,呵呵~~
|
|
|
地板#
发布于:2005-07-18 23:10
但是我觉得“告诉上面 可能需要一段时间才complete。。这样上面IOCALLDRIVER就不用傻等了”可以通过直接return status_pending 但是不调用IoCompleteIrp呀,因为irp并未完成,应该等中断发生,真正完成的时候再调用IoCompleteIrp
|
|
|
地下室#
发布于:2005-07-19 13:44
下面是引用arthurtu于2005-07-19 13:05发表的: arthurtu老大说的在很多ddk自己带的过滤驱动里都是这样子实现的,但是小弟有个疑问,就是这样会阻塞掉自己的驱动的dispatch的返回,使异步的io失去意义了。为什么不直接在自己驱动的dispatch里立刻返回,在完成例程本身里修改数据呢? 谢谢各位! |
|
|
5楼#
发布于:2005-07-23 21:18
upup
|
|
|
6楼#
发布于:2005-07-23 21:22
那我就用普通的异步方式,直接在完成例程例修改数据也可以吧,让dispatch立刻返回
|
|
|