evil_fuck
驱动牛犊
驱动牛犊
  • 注册日期2008-10-13
  • 最后登录2013-01-30
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望191点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2864回复:2

[求助]为什么在minifilter pre-read中使用FltReadFile

楼主#
更多 发布于:2010-05-26 12:23
各位大牛好:
小弟在minifilter架构的基础上写过滤驱动,发现在pre-read中使用FltReadFile();总是返回STATUS_VOLUME_DISMOUNTED,文件系统是NTFS,在FAT32文件系统下OK。操作流程为,在pre-read中发现有需要转移读取的文件A:,这时读取缓存在内存盘中的文件B:文件B在DriverEntry();时就打开,而且成功。下面是部分代码:
    if (FlagOn(IRP_NOCACHE, iopb->IrpFlags))
     {
     KdPrint(("No Cache!\n"));
     readLen = (ULONG)ROUND_TO_SIZE(readLen, readLen);
     }
     if (FltObjects->FileObject->CurrentByteOffset.QuadPart == pFltObj->pMem->dwSize)
     {
     return FLT_PREOP_COMPLETE;
     }
     if (FltObjects->FileObject->CurrentByteOffset.QuadPart + iopb->Parameters.Read.Length > pFltObj->pMem->dwSize) //pFltObj->pMem->dwSize为A文件大小
     {
     iopb->Parameters.Read.Length = pFltObj->pMem->dwSize - FltObjects->FileObject->CurrentByteOffset.QuadPart;
     }
                   //g_FileObj是在DriverEntry时打开的文件的文件对象
                   status = FltReadFile(FltObjects->Instance, g_FileObj, &FltObjects->FileObject->CurrentByteOffset, Data->Iopb->Parameters.Read.Length,
                                                         iopb->Parameters.Rea   d.ReadBuffer, FLTFL_IO_OPERATION_NON_CACHED, NULL, NULL, NULL);
                   if (!NT_SUCCESS(status))
                  {
      KdPrint(("ChangeBuffer failed!\n"));
      return FLT_PREOP_SUCCESS_WITH_CALLBACK;
                  }
                 Data->IoStatus.Status = STATUS_SUCCESS;
                 Data->IoStatus.Information = iopb->Parameters.Read.Length;
                 FltObjects->FileObject->CurrentByteOffset.QuadPart += iopb->Parameters.Read.Length;
                if (FltObjects->FileObject->CurrentByteOffset.QuadPart > pFltObj->pMem->dwSize)
                {    
    FltObjects->FileObject->CurrentByteOffset.QuadPart = pFltObj->pMem->dwSize;
                }
               return FLT_PREOP_COMPLETE;
谢谢。
evil_fuck
驱动牛犊
驱动牛犊
  • 注册日期2008-10-13
  • 最后登录2013-01-30
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望191点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-05-26 12:57
帮帮忙啊!
evil_fuck
驱动牛犊
驱动牛犊
  • 注册日期2008-10-13
  • 最后登录2013-01-30
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望191点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-05-26 18:09
找到问题的原因了,如果a文件所在的分区格式为ntfs,而b文件所在的缓存盘格式为fat32,那么FltFileRead使用FltObject->Instances来读取文件,那就会出题。反之亦然。看来只能自己封装IRP了,希望大牛们能给点建议。谢谢
游客

返回顶部