【问题标题】:Intercept FIleSytemCall for Deletion拦截 FIleSytemCall 以进行删除
【发布时间】:2012-05-30 11:13:32
【问题描述】:

有没有办法在 windows 执行删除之前检测文件的删除?我找到了 FileSystemWatcher 类,但仅在执行删除操作后才引发事件,但我想在用户/进程选择删除它时捕获删除操作。您可以监视文件系统表,但要寻找更好的方法。感谢您的帮助。

【问题讨论】:

  • 通过使用 mhook 库挂钩 NtSetFileInformation API 来做到这一点,就像一个魅力。谢谢大家。

标签: .net windows visual-c++ operating-system


【解决方案1】:

或者可以试试ICopyHook接口。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb776049%28v=vs.85%29.aspx

在CopyCallback方法中,使用wFunc参数中的FO_DELETE,指定删除操作。

缺点: 仅防止在 Windows Shell 中删除。

【讨论】:

    【解决方案2】:

    我认为最简单的方法是使用挂钩来获得通知(并最终停止)该过程。它不能在 .NET 中完成,因此您必须 DllImport 大量结构和少量函数来 P/Invoke。

    让我们从NtSetFileInformation(未记录的)函数开始您的工作。当需要删除文件时(使用FileDispositionInformation 结构),它是由其他任何东西调用的函数。

    现在的问题是如何挂钩该函数(祝你好运,这并不容易)。一个不错的选择是使用Microsoft Detours。以this article 为例。它的问题是它不是免费的。另一种解决方案(价格合理并带有 .NET 界面)是Deviare,但我什至从未尝试过他们的免费版本,所以我不知道它有多好。如果别人知道一个好的拦截工具...

    【讨论】:

    • 谢谢,我实际上不想停止删除文件的过程。我想制作文件的安全副本并让删除发生。
    • @Gopikanna 这是相同的(硬)方式。最大的问题是当某人/某物试图删除文件时检测(不同的函数使用不同的方法,NtSetFileInformation 只是最深的一个)。当你在那里做什么是(善良的)微不足道的。
    • 谢谢,我会尝试 API hooking 并希望我能成功:)
    • @Gopikanna 一个复杂任务的小技巧:从 CodeProject 上的链接文章开始,这很好(如果你会使用 detour)。
    【解决方案3】:

    您需要一个文件系统过滤器驱动程序。但是我强烈建议,如果您不知道答案,您可能不应该这样做。

    http://msdn.microsoft.com/en-us/library/windows/hardware/gg462968.aspx

    【讨论】:

    • 谢谢,但不是在寻找驱动程序级别的解决方案。编写驱动程序对我来说是不可行的:)。我正在寻找 api 级别的解决方案。
    • 我可能完全错了,是否可以运行一个对文件进行锁定的服务,以便每当有东西试图删除它时,我的服务可以找到它。
    • 如果你想阻止删除,只需持有一个打开的句柄(打开访问 FILE_READ_ATTRIBUTES)但没有 FILE_SHARE_DELETE。发现有人试图删除它更难。
    • 这种低级文件欺骗确实属于过滤驱动程序,而不是应用程序。 (例如,您可以通过在“最后一秒复制”代码中执行 Sleep(INFINITE) 来挂起另一个应用程序。如果另一个应用程序在不同的安全上下文下运行,这将成为一个安全问题。)也许你可以挖一个卷快照数据库中文件的旧副本。
    • @Gopikanna,您看过卷影复制服务 (VSS) 吗?编辑:正如 Raymond Chen 建议的那样......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多