jl2004
驱动小牛
驱动小牛
  • 注册日期2007-04-10
  • 最后登录2011-02-22
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望276点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
阅读:2052回复:3

关于FLT_POSTOP_STATUS_MORE_PROCESSING_REQUIRED,请问各位大佬

楼主#
更多 发布于:2008-09-28 09:13


请问各位大佬一个问题,先行谢过!

在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;
}
向前,向前,向前....
jl2004
驱动小牛
驱动小牛
  • 注册日期2007-04-10
  • 最后登录2011-02-22
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望276点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-09-28 11:12
自己顶!
向前,向前,向前....
jl2004
驱动小牛
驱动小牛
  • 注册日期2007-04-10
  • 最后登录2011-02-22
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望276点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-10-06 10:06
ding上去
向前,向前,向前....
xuplus
驱动牛犊
驱动牛犊
  • 注册日期2008-04-10
  • 最后登录2010-06-11
  • 粉丝1
  • 关注0
  • 积分2分
  • 威望28点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-10-07 12:08
帮你顶!
游客

返回顶部