阅读:979回复:4
为什么完成例程没有执行?
我下面代码中,pBuffer并没有拷贝到tempBuf。
不知道为什么? 是不是完成例程有错误呀?或者完成例程根本没有被调用? 大家帮我看一看。 case IRP_MJ_READ: ..... IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine( Irp, DoneSomething, NULL, FALSE, FALSE, FALSE ); return IoCallDriver( hookExt->FileSystem , Irp ); break; //完成例程函数 DoneSomething(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context) { ... tempBuf = ExAllocatePool(NonPagedPool , Len); RtlCopyMemory(tempBuf, pBuffer, Len); if( Irp->PendingReturned ) { IoMarkIrpPending( Irp ); } return STATUS_SUCCESS; } |
|
|
沙发#
发布于:2004-12-16 18:20
似乎完成例程没有执行!
我的情况是这样的。 文件过滤驱动,在读一个文件是产生irp_mj_read. 读完的时候,我想 应该调用我的DoneSomething()。 但是好像没有调用DoneSomething()。 这是为什么呀? |
|
|
板凳#
发布于:2004-12-16 21:09
你的IoSetCompletionRoutine()z中的后三个参数错了,全部改成TRUE就可以了,这三个参数如果是true,分别代表下层成功完成irp,失败完成irp和cancel IRp的情况下都调用完成历程。
看一下ddk。 |
|
地板#
发布于:2004-12-16 21:16
你的IoSetCompletionRoutine()z中的后三个参数错了,全部改成TRUE就可以了,这三个参数如果是true,分别代表下层成功完成irp,失败完成irp和cancel IRp的情况下都调用完成历程。 说得很清楚 |
|
|
地下室#
发布于:2004-12-16 21:26
看来我应该对看一看DDK了。
谢谢,我明天试一下。 |
|
|