【问题标题】:MiniFilter Driver - modify a file bytes on IRP_MJ_CLOSE and IRP_MJ_CREATEMiniFilter 驱动程序 - 修改 IRP_MJ_CLOSE 和 IRP_MJ_CREATE 上的文件字节
【发布时间】:2012-08-24 02:08:32
【问题描述】:

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

我在 Visual Studio 2012 中使用 WDK8 创建了一个新的“Filter Driver: Filesystem Mini-Filter”项目,并将 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 中间时,我就不需要“即时”处理缓冲区" 但在磁盘上?

【问题讨论】:

    标签: windows-7 driver minifilter irp


    【解决方案1】:

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

    几个原因:

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

    【讨论】:

    • 谢谢。但是 PreCreate 和 PostClose 呢?
    • @gfgqtmakia 同样的论点也适用于他们。
    • 但是这些是在文件从HD加载之前和文件写入HD之后。
    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多