windows - 从卷偏移或扇区获取文件名(Windows)

标签 windows filenames offset volume sector

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

最佳答案

这几乎是可能的。您可以使用 this code 枚举卷上的所有文件. (警告一些 printf 函数在它们应该使用 %I64u 时使用了 %lu,所以一些正在打印的信息是错误的,最明显的是文件引用号;不过我相信主要逻辑没问题。)

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

所以你可以提前建立一个数据库。您可以使用 FSCTL_READ_USN_JOURNAL 使其大部分保持最新。而不是必须不断地重新扫描整个磁盘。

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

而且,即便如此,也不能保证文件不会在您检查之前被移走然后又移回。或者,可能会创建一个文件,然后在您有机会为其收集任何数据之前再次将其删除。

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

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

关于windows - 从卷偏移或扇区获取文件名(Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11432637/

相关文章:

c# - 在 Windows 中以兼容模式启动应用程序如何影响该应用程序以及我如何检测它?

windows - 使用 Schannel 的 DTLS

python - Tkinter - 在 Windows 资源管理器中打开目录窗口的方法

c++ - std::cin 适用于少量行,但不适用于较大行

c# - 文件名中带有表情符号的 ASP.NET Core 2 文件下载会创建格式错误的文件名

c - 当 offset 递减传递给 mmap 时,mmap 调用失败

c# - 如何防止对非托管 dll 调用的访问冲突?

java - 查找文本文件的路径

javascript - onscroll 事件仅执行一次

C++ , Cheat Engine/OllyDBG 从多级指针中找到基址 "static"