0

我想在关闭文件时更改文件,并在打开文件时撤消更改。它有点像加密驱动程序,只是我不想加密文件。

我在 Visual Studio 2012 中使用 WDK8 创建了一个新的“过滤器驱动程序:文件系统微型过滤器”项目,并将 PreCreate、PostCreate、PreClose 和 PostClose 注册为回调函数。

例如,在其字节为 {72,101,108,108,111}(“Hello”)的文件的 IRP_MJ_CLOSE 上,我希望在 PostClose 函数之后,文件在硬盘上看起来像这样:{10,11,12,72,101,108,108,111}。

我怀疑这并不像这样简单:

    FLT_PREOP_CALLBACK_STATUS
    PreClose (
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    )
{
    //...

    //some if statment...
    {
        Data->Iopb->Parameters.Write.WriteBuffer = newBfr;
        Data->Iopb->Parameters.Write.Length = newLen;
    }
    //...

    return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}

我想要一些关于这个主题的指导。

还有什么是调试这个的最佳方法?我还没有找到打印到 Windows 7 调试的方法。

谢谢!gfgqtmakia。

编辑:我已经阅读了http://code.msdn.microsoft.com/windowshardware/swapBuffer-File-System-6b7e6e2d但我认为它对我没有帮助,因为它是用于读/写的,我没有不想处理。

EDIT2:或者我应该在 PreCreate 和 PostClose 中进行更改,当文件在硬盘驱动器上而不是在 IRP 中间时,然后我不需要“即时”处理缓冲区,而是在磁盘?

4

1 回答 1

1

您将不得不编写诸如交换缓冲区之类的东西。在 PostCreate/PreClose 中修改文件数据不是一个好主意。

几个原因:

  • 首先在 PostCreate/PreClose 你不应该访问Data->Iopb->Parameters.Write.WriteBuffer. 这仅在 IRP_MJ_WRITE 中有效。您可以FltWriteFile将数据写入文件。
  • Windows 内核可能不会在 IRP_MJ_CLOSE 中/之后立即将文件数据写入磁盘。想想页面缓存。
  • 可能存在需要适当注意的复杂性,例如分页 i/o、直接 i/o 等。
  • 我注意到的另一件事是您还将更改文件大小(如您的问题中所说,实际数据长度为 5 个字节,而您将数据更新为 8 个字节)。现在这很难管理。从不建议在 minifilter/文件系统驱动程序中更改文件大小。
于 2012-08-23T18:08:32.000 回答