0

我在内核模式下编写了一个微过滤器。我想防止在 USB 上创建新文件。但是当我使用时:

[CODE]
    FltCancelFileOpen( FltObjects->Instance, FltObjects->FileObject );
    Data->IoStatus.Status = STATUS_ACCESS_DENIED; 
    Data->IoStatus.Information = 0;
    return FLT_PREOP_COMPLETE;
[CODE]

=> 我可以阻止创建一个新文件。但它总是显示警告对话框。我应该怎么做才能不显示此对话框?

更新:2014/12/22
我正在为一种情况编写一个 fs minifilter 驱动程序。当用户将文件或文件夹拖放到 USB 时(例如 H:)

  1. 驱动程序将获取文件信息;
    ==> 完成
  2. 驱动程序将删除此文件或文件夹(不会在 USB 上创建文件/文件夹)
    - 我只想捕捉事件以启动应用程序 (3)
    - 文件将在 USB 上创建之前被删除。
    **==> 完成

  3. 做点什么。

=> 请给我一个关于这种情况的建议?非常感谢!

4

2 回答 2

0

不,你不能——它是请求的发起者决定如何对被拒绝的访问做出反应。您可能会允许打开但阻止任何写入,但这会使应用程序和用户感到困惑。

于 2014-12-19T08:20:51.277 回答
0

现在我可以通过重定向打开另一个文件来解决我的问题

  1. 首先,定义新的 unicode 字符串 newfile = "abcdef.txt";

  2. 使用 FltGetFileNameInformation 获取文件名信息

  3. 使用 FltParseFileNameInformation 对其进行解析。

  4. 获取格式的文件名:\Device\HarddiskVolume1[path_to_file]filename[.ext]

  5. 然后,将其拆分为: \Device\HarddiskVolume1[path_to_file] 和 filename[.ext]

  6. 将新文件附加到第一部分:\Device\HarddiskVolume1[path_to_file]abcdef.txt

  7. 现在我将打开新文件而不是旧文件,如下所示:

    // 获取旧文件名

    PUNICODE_STRING pFileName = &Data->Iopb->TargetFileObject->FileName;

    // 释放释放缓冲区

    ExFreePool(pFileName->Buffer);

    // 重新分配缓冲区 pFileName->Length = 0; pFileName->MaximumLength = redirectTargetFile.MaximumLength; pFileName->Buffer = (PWSTR) ExAllocatePool(NonPagedPool, pFileName->MaximumLength);

    // 为其分配新文件名 RtlCopyUnicodeString(pFileName, &unicode_string_new_file_name); // 告诉内核重新解析这个打开的文件,以便它使用新的文件路径

    数据->IoStatus.Information = IO_REPARSE; 数据->IoStatus.Status = STATUS_REPARSE; 数据->Iopb->TargetFileObject->RelatedFileObject = NULL;

    FltSetCallbackDataDirty(数据); 返回 FLT_PREOP_SUCCESS_WITH_CALLBACK;


参考http://www.codingnotebook.com/2013/05/redirect-file-open-using-windows.html

于 2014-12-26T03:42:06.160 回答