MiniFilter驱动程序 - 修改IRP_MJ_CLOSE和IRP_MJ_CREATE上的文件字节

时间:2012-08-23 12:56:33

标签: windows-7 driver minifilter irp

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

我在Visual Studio 2012中使用WDK8创建了一个新的“Filter Driver:Filesystem Mini-Filter”项目,并注册了PreCreate,PostCreate,PreClose和PostClose作为回调函数。

例如,在文件的IRP_MJ_CLOSE上,它的字节是{72,101,108,108,111}(“Hello”),我希望在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中间时,然后我就不需要“动态”处理缓冲区了“但是在磁盘上?

1 个答案:

答案 0 :(得分: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 /文件系统驱动程序中更改文件大小。