Windows 7 迷你过滤器驱动程序-在IRP_MJ_关闭和IRP_MJ_创建时修改文件字节

Windows 7 迷你过滤器驱动程序-在IRP_MJ_关闭和IRP_MJ_创建时修改文件字节,windows-7,driver,minifilter,irp,Windows 7,Driver,Minifilter,Irp,我想在文件关闭时更改它,并在打开时反转更改。 它有点像加密驱动程序,只是我不想加密文件 我在VisualStudio2012中使用WDK8创建了一个新的“过滤器驱动程序:文件系统迷你过滤器”项目,并将PreCreate、postreate、PreClose和PostClose注册为回调函数 例如,在文件的IRP_MJ_CLOSE上,它的字节是{72101108108111}(“Hello”),我希望在PostClose函数之后,该文件在硬盘上看起来像这样: {10,11,12,721011081

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

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

例如,在文件的IRP_MJ_CLOSE上,它的字节是{72101108108111}(“Hello”),我希望在PostClose函数之后,该文件在硬盘上看起来像这样: {10,11,12,72101108111}

我怀疑这并不像以下那样简单:

    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;
}
我想要一些关于这个问题的指导

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

谢谢! gfgqtmakia

编辑:我读过,但我认为它对我没有帮助,因为它是用于读/写的,我不想处理它


编辑2:或者也许我应该在PRECERATE和PostClose中做我的修改,当文件在硬盘上而不是在IRP的中间,然后我就不需要在“即时”上处理缓冲区了,但是在磁盘上,

你必须写一些交换缓冲区之类的东西。在PostCreate/PreClose中修改文件数据不是个好主意

原因如下:

  • 首先,在PostCreate/PreClose中,您不应该访问
    数据->Iopb->参数.Write.WriteBuffer
    。这仅在IRP_MJ_WRITE中有效。您可以执行
    FltWriteFile
    将数据写入文件
  • 在IRP_MJ_关闭中/之后,Windows内核可能不会立即将文件数据写入磁盘。考虑一下页面缓存
  • 可能存在需要适当注意的复杂性,如分页i/o、直接i/o等
  • 我注意到的另一个主要问题是,您还将更改文件大小(如您在问题中所述,实际数据长度为5字节,而您将数据更新为8字节)。现在这很难管理。不建议在minifilter/文件系统驱动程序中更改文件大小

谢谢。但是PreCreate和PostClose呢?@gfgqtmakia同样的论点也适用于它们。但是这些都是在文件从HD加载之前和文件写入HD之后。