【问题标题】:Feasibility check for Filesystem Minifilter deletion Driver文件系统微过滤器删除驱动程序的可行性检查
【发布时间】:2014-03-26 11:50:28
【问题描述】:

我使用来自 msdn 的删除微过滤器示例作为基础: http://code.msdn.microsoft.com/windowshardware/Delete-File-System-b904651d

我需要完成的是:

  1. 在 DfPreCleanupCallback 中获取删除候选对象的句柄。
  2. 在 DfPostCleanupCallback 中 - 确定如果不是为获取的句柄而删除该文件。
  3. 也在 DfPostCleanupCallback 中 - 对将被删除的文件执行一些操作并释放句柄。还确保在下次进入 IRP_MJ_CLEANUP 时删除以避免无限循环。

我对微过滤器和过滤器管理器的了解非常模糊,因此在深入研究微过滤器世界之前,我想知道这在原则上是否可行。

短版 - 我需要一种方法来确定文件是否会被删除并对该文件执行一些操作。

【问题讨论】:

    标签: file-io filesystems minifilter windows-kernel wdf


    【解决方案1】:

    你需要在pre callback中做所有的处理,因为所有的delete相关信息都会在cleanup时提升到FCB。

    在 DfPreCleanupCallback 中获取删除候选对象的句柄。

    在清理路径中检索句柄是个坏主意,因为它会导致文件对象的句柄计数增加,即在清理过程中。而不是只使用 FILE_OBJECT,它被赋予预回调(例如在使用 FltReadFile 的操作中)。

    在文件上做一些本来可以做的操作

    在清理请求到达 fs 后,它会在 FILE_OBJECT 上设置 FO_CLEANUP_COMPLETE,你可以用它做什么非常有限。确保文件删除也只能在预回调中完成。

    【讨论】:

    • 据我了解,在预清理回调之后可能会发生几件事,这会取消删除操作(更改删除处置状态的竞争条件)。这意味着我无法确定在预回调中 100% 确定文件将被删除。我的想法是获得一个句柄来阻止在 pre 回调中发生清理,然后确定它是否会在 post 回调中被删除 - 这样我可以确定没有任何东西需要该文件。
    • 只是 dont do this. This is broken by design. You cant 确保即使在清理之后。即使在关闭此 FILE_OBJECT 之后。一个文件可以有多个 FILE_OBJECT。
    【解决方案2】:

    正如@izlesa 评论的那样,您无法确定文件在所有情况下都会被删除。主要是如果文件是使用缓存管理器打开的,那可以保留对文件的引用。

    如果您担心删除其内容,您可以在尝试删除之前将其大小设置为 0。或者擦拭它。或者做那些事情并搬到其他隐藏的地方。

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2015-03-21
      • 1970-01-01
      • 2020-07-08
      相关资源
      最近更新 更多