【问题标题】:Obtain file name from volume offset or sector(Windows)从卷偏移或扇区获取文件名(Windows)
【发布时间】:2012-07-11 01:40:57
【问题描述】:

我正在开发一个上卷过滤器驱动程序,它监控卷的读/写块。 当发生任何读/写时,我会从中获取卷偏移和第一个扇区(LBA)。 如何使用 C/C++ 从卷偏移或第一个扇区获取文件名? 任何形式的帮助表示赞赏。 提前致谢。

【问题讨论】:

  • 在这么低的级别上不存在该信息。这就像被递给一个碳原子并问:“这个原子来自什么动物?”
  • 实际上,我正在获取已修改文件的卷偏移量和第一个扇区,但我不知道如何找出该扇区或卷偏移处存在哪个文件。有什么方法可以帮助我在扇区或偏移量的帮助下找出任何文件信息。我开发的驱动程序处于音量级别(上音量过滤器),它对文件一无所知,它处理块、扇区或偏移量。但同时我也想找出那个块的文件名。所以问了这么一个问题。 C/C++有什么办法吗?

标签: windows filenames offset volume sector


【解决方案1】:

这几乎是可能的。您可以使用this code 枚举卷上的所有文件。 (警告: 一些 printf 函数在应该使用 %I64u 时使用了 %lu,因此打印的一些信息是错误的,尤其是文件引用数字;不过我相信主要逻辑是可以的。)

对于您找到的每个文件,您可以使用FSCTL_GET_RETRIEVAL_POINTERS 查找其在磁盘上的位置。

因此您可以提前构建数据库。您可以使用FSCTL_READ_USN_JOURNAL 使其保持最新状态,而不必不断地重新扫描整个磁盘。

但是,即使确定了曾经位于给定位置的文件,您也需要再次检查它以防它被移动。 USN日志可能不会记录文件在没有经过逻辑修改的情况下重新定位到磁盘上。

即使那样,也不能保证文件在您检查之前没有被移走,然后又被移回。或者,在您有机会收集任何数据之前,可能会创建一个文件然后再次删除它。

所以,基本上:不。你不能这样做。

(在某些情况下,可能存在其他解决方案。例如,如果您的驱动程序可以在感兴趣的点对卷的内容进行快照,则可以检查快照以确定有问题的文件。您将有不过,要包含您自己的 NTFS 堆栈。您也许可以从 Linux 借用 NTFS 代码。基本上仍然比它可能值得付出更多的努力。)

【讨论】:

  • 您好,感谢您的帮助,您能否告诉我如何验证从 FSCTL_GET_RETRIEVAL_POINTERS 获得的输出与 FSCTL_READ_USN_JOURNAL 的输出。提前致谢。
  • FSCTL_READ_USN_JOURNAL 向您显示自从您最初枚举卷上的文件以来所做的更改(新的、删除的、修改的文件)。它与验证 FSCTL_GET_RETRIEVAL_POINTERS 的输出无关。答案仍然是“不,你不能那样做”。
  • FSCTL_GET_RETRIEVAL_POINTERS 也可用于查找特定文件在磁盘上的位置,但如何找到磁盘上每个文件的位置。我实际上要问的是如何获取每个文件的名称并找出它们的位置。
  • 我的答案的第一行包含一个代码链接,该代码枚举了一个卷上的所有文件。
  • 嗨,我使用了你的代码和它的工作......!但是当我执行你的代码时,文件计数显示“88183”个文件,总数没有。显示的文件名约为“8200”,在 Windows 资源管理器中显示约为“78,265”文件。为什么差别这么大?
【解决方案2】:

FSCTL_LOOKUP_STREAM_FROM_CLUSTER 做你想做的事,但速度很慢。

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 2016-05-07
    • 1970-01-01
    • 2020-04-20
    • 2020-12-28
    • 1970-01-01
    • 2010-10-08
    • 2014-02-15
    • 2021-04-11
    相关资源
    最近更新 更多