neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
阅读:2622回复:1

minifilter中fltWriteFile 的用法

楼主#
更多 发布于:2009-09-02 15:06
WriteBuff = FltAllocatePoolAlignedWithTag(Data->Iopb->TargetInstance, PagedPool, PAGE_SIZE, 'abcd');
    if (WriteBuff != NULL)
    {
        RtlFillMemory(WriteBuff, PAGE_SIZE, 0xFF);
        ByteOffset.QuadPart = 0;

        while (ByteOffset.QuadPart < FileSize.QuadPart)
        {
            Size.QuadPart = (FileSize.QuadPart - ByteOffset.QuadPart) > PAGE_SIZE ?
                                     PAGE_SIZE : (FileSize.QuadPart - ByteOffset.QuadPart);
            status = FltWriteFile(Data->Iopb->TargetInstance,
                                   FileObject,
                                   &ByteOffset,
                                   Size.LowPart,
                                   WriteBuff,
                                   FILE_NO_INTERMEDIATE_BUFFERING|FLTFL_IO_OPERATION_PAGING |
                                   FLTFL_IO_OPERATION_NON_CACHED,
                                   &WriteBytes, NULL, NULL);
            ByteOffset.QuadPart += WriteBytes;
            if (!(NT_SUCCESS(status)))
                break;
        }

        FltFreePoolAlignedWithTag(Data->Iopb->TargetInstance, WriteBuff, 'abcd');
    }
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
沙发#
发布于:2009-09-02 16:07
1. FltAllocatePoolAlignedWithTag是用于非缓冲I/O的;

2. FltWriteFile的第6个参数只能是下面所列参数的组合:
     FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET
     FLTFL_IO_OPERATION_NON_CACHED
     FLTFL_IO_OPERATION_PAGING

3. 既然你使用的是非缓冲I/O, 那么你就必须保证I/O的偏移量以及I/O的大小都要和卷的扇区大小对齐;
人总在矛盾中徘徊。。。
游客

返回顶部