lijizhong619
驱动牛犊
驱动牛犊
  • 注册日期2009-03-12
  • 最后登录2012-06-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2050回复:3

请教高手 minifilter 为什么写不进去

楼主#
更多 发布于:2010-04-23 11:13
代码如下:明明已经执行拉,为什么打开后什么也没有呢,麻烦高手看看,
加密标志放在文件头部.
FLT_PREOP_CALLBACK_STATUS
NPPreWrite(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __deref_out_opt PVOID *CompletionContext
    )
{
    ULONG i;
    PFile_node node;
    PFILE_OBJECT file;
    PFLT_IO_PARAMETER_BLOCK iopb = Data->Iopb;
    FLT_PREOP_CALLBACK_STATUS retValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
    PUCHAR newBuf = NULL;
    PLARGE_INTEGER offset=NULL;
    PMDL newMdl = NULL;
    PFile_Context p2pCtx;
    PVOID origBuf;
    NTSTATUS status;
    ULONG writeLen = iopb->Parameters.Write.Length;
    file=iopb->TargetFileObject ;
    offset = &Data->Iopb->Parameters.Write.ByteOffset;

    if(gloadfileobject!=file)
          return FLT_PREOP_SUCCESS_NO_CALLBACK;

        DbgPrint("写 gloadfileobject 匹配成功");

  if (!FlagOn((IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE),iopb->IrpFlags))
      {
        return  retValue;
      }

    try {
      
        if (writeLen == 0) {

            leave;
        }      
        newBuf = ExAllocatePoolWithTag( NonPagedPool,writeLen,BUFFER_SWAP_TAG );
        if (newBuf == NULL) {

            leave;
        }      
        if (FlagOn(Data->Flags,FLTFL_CALLBACK_DATA_IRP_OPERATION)) {
            
            newMdl = IoAllocateMdl( newBuf,
                                    writeLen,
                                    FALSE,
                                    FALSE,
                                    NULL );
            if (newMdl == NULL) {

                leave;
            }
            MmBuildMdlForNonPagedPool( newMdl );
        }
      
        if (iopb->Parameters.Write.MdlAddress != NULL)
            {

            origBuf = MmGetSystemAddressForMdlSafe( iopb->Parameters.Write.MdlAddress,
                                                    NormalPagePriority );
            if (origBuf == NULL)
                 {
                Data->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                Data->IoStatus.Information = 0;
                retValue = FLT_PREOP_COMPLETE;
                leave;
               }
          }
        else {


            origBuf = iopb->Parameters.Write.WriteBuffer;
        }      
        try {

              RtlCopyMemory( newBuf,
                            origBuf,
                            writeLen );
           }
           except (EXCEPTION_EXECUTE_HANDLER)
             {
            
               Data->IoStatus.Status = GetExceptionCode();
               Data->IoStatus.Information = 0;
               retValue = FLT_PREOP_COMPLETE;
               leave;
            }


        p2pCtx = ExAllocateFromNPagedLookasideList( &Pre2PostContextList );

        if (p2pCtx == NULL) {

            leave;
        }
                    
         for(i=0;i<writeLen;i++)
         {    
             newBuf^= 0x77;
         }
         offset->QuadPart += CF_FILE_HEADER_SIZE;          
         DbgPrint("交换缓冲测试成功");
         iopb->Parameters.Write.WriteBuffer = newBuf;
         iopb->Parameters.Write.MdlAddress = newMdl;
         FltSetCallbackDataDirty( Data );                              
        p2pCtx->newbuffer= newBuf;
        *CompletionContext = p2pCtx;
        retValue = FLT_PREOP_SUCCESS_WITH_CALLBACK;

    }
    finally
    {
    
        if (retValue != FLT_PREOP_SUCCESS_WITH_CALLBACK) {

            if (newBuf != NULL) {

                ExFreePool( newBuf );
            }

            if (newMdl != NULL) {

                IoFreeMdl( newMdl );
            }
        }
    }

    return retValue;
}


FLT_POSTOP_CALLBACK_STATUS
NPPostWrite(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in PVOID CompletionContext,
    __in FLT_POST_OPERATION_FLAGS Flags
    )
{
    PFile_Context p2pCtx = CompletionContext;
    UNREFERENCED_PARAMETER( FltObjects );
    UNREFERENCED_PARAMETER( Flags );
    //  Free allocate POOL and volume context
     DbgPrint("释放缓冲成功");
     ExFreePool( p2pCtx->newbuffer );
     ExFreeToNPagedLookasideList( &Pre2PostContextList, p2pCtx );                              
      DbgPrint("释放通用连表节点成功");
    return FLT_POSTOP_FINISHED_PROCESSING;
}
ander5115
驱动牛犊
驱动牛犊
  • 注册日期2009-12-23
  • 最后登录2012-08-17
  • 粉丝6
  • 关注3
  • 积分76分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-04-23 11:41
是在NTFS分区下测试吧,你换到FAT32下就没问题。我也是无奈,碰到这种情况,后来是在
PostWrite返回值是多少,如果返回值没有问题,我就是在
if (!FlagOn((IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE),iopb->IrpFlags))
      {
        这里判断下文件大小正确不正确,如果小于偏移+写入长度就需要增加文件大小
    并且加入Flush的方法才写入到硬盘
        return  retValue;
      }

具体的可以参考我的代码http://bbs.driverdevelop.com/read.php?tid-119736-page-2.html的35楼
但是我还有一个很棘手的问题没解决,这几天正在纠结。
lijizhong619
驱动牛犊
驱动牛犊
  • 注册日期2009-03-12
  • 最后登录2012-06-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-04-23 16:04
ander5115:

是在NTFS分区下测试吧,你换到FAT32下就没问题。我也是无奈,碰到这种情况,后来是在 PostWrite返回值是多少,如果返回值没有问题,我就是在 if (!FlagOn((IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE),iopb->IrpFlags))       {         这里判断下文件大小正确不正确,如果小于偏移+写入长度就需要增加文件大小     并且加入Flush的方法才写入到硬盘         return  retValue;       } 具体的可以参考我的代码http://bbs.driverdevelop.com/read.php?tid-119736-page-2.html的35楼但是我还有一个很棘手的问题没解决,这几天正在纠结。



本人是新手,麻烦你说明白一点,谢谢.
if (!FlagOn((IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE),iopb->IrpFlags))       {         这里判断下文件大小正确不正确,如果小于偏移+写入长度就需要增加文件大小     并且加入Flush的方法才写入到硬盘         return  retValue;       }

是在 PostWrite还是在 PretWrite 中判断?
能够给你的一份我参考么 shuwen119922777@163.com  ,非常感谢
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
地板#
发布于:2010-04-23 22:07
Paging WRITE cannot write beyond EOF.
游客

返回顶部