阅读:2052回复:3
关于FLT_POSTOP_STATUS_MORE_PROCESSING_REQUIRED,请问各位大佬请问各位大佬一个问题,先行谢过! 在minifilter中要实现在类似功能,我应该如何处理? 如下基于legacy driver的代码,对IRP完成之后还得做一些事 status = SfForwardIrpSyncronously() 相应后处理 Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); 想法: 即我也想在在一个CallbackData完成之后,还对其做一些处理 可以设置PostOperation函数 并要其返回FLT_POSTOP_STATUS_MORE_PROCESSING_REQUIRED 在另外一个地方调用FltCompletePendedPostOperation()即对此CBD进行完成操作. 但我不知能不能,比如说在PreOperation函数中 写成如下形式? PreOperation() { //这个SfForwardCBDSyncronously如何写啊 status = SfForwardCBDSyncronously() 相应后处理 CBD->iobp.IoStatus.Status = Status; FltCompletePendedPostOperation(); } 这种情况如何处理? //====================================================================== //函数名:SfForwardIrpSyncronouslyCompletion //功能: 同步方式完成一个Irp的完成函数 //参数: // IN DeviceObject 设备对象 // IN Irp Irp // IN Context 上下文 //返回值: //====================================================================== NTSTATUS SfForwardIrpSyncronouslyCompletion ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { PKEVENT Event = Context; UNREFERENCED_PARAMETER(DeviceObject); ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject)); if (Irp->PendingReturned) { KeSetEvent(Event, IO_NO_INCREMENT, FALSE); } return STATUS_MORE_PROCESSING_REQUIRED; } //====================================================================== //函数名:SfForwardIrpSyncronously //功能: 以同步方式完成一个Irp(先下传,在完成函数中设置Event并返回 // STATUS_MORE_PROCESSING_REQUIRED) // // 1.初始化事件 // 2.设置完成函数 // 3.传入下一层驱动 // 4.等待完成函数的完成 //参数: // IN DeviceObject 设备对象 // IN Irp Irp //返回值: //NE:还没有调用IoCompleteRequest函数 //====================================================================== NTSTATUS SfForwardIrpSyncronously( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { KEVENT Event; NTSTATUS Status; KeInitializeEvent(&Event, NotificationEvent, FALSE); IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, SfForwardIrpSyncronouslyCompletion, &Event, TRUE, TRUE, TRUE); Status = IoCallDriver(DeviceObject, Irp); if (STATUS_PENDING == Status) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); Status = Irp->IoStatus.Status; } return Status; } |
|
|
沙发#
发布于:2008-09-28 11:12
自己顶!
|
|
|
板凳#
发布于:2008-10-06 10:06
ding上去
|
|
|
地板#
发布于:2008-10-07 12:08
帮你顶!
|
|