我正在开发一个上卷过滤器驱动程序,它监视卷的读/写块。当发生任何读/写时,我会从中获取卷偏移和第一个扇区(LBA)。如何使用 C/C++ 从卷偏移或第一个扇区获取文件名?任何形式的帮助表示赞赏。提前致谢。
2 回答
这几乎是可能的,有点。您可以使用此代码枚举卷上的所有文件。(警告:一些 printf 函数%lu
在应该使用的时候使用%I64u
,所以打印的一些信息是错误的,最明显的是文件参考号;我相信主要逻辑是可以的。)
对于您找到的每个文件,您可以使用FSCTL_GET_RETRIEVAL_POINTERS
它来查找其在磁盘上的位置。
所以你可以提前建立一个数据库。您可以使用它来使其保持最新状态,FSCTL_READ_USN_JOURNAL
而不必不断地重新扫描整个磁盘。
但是,即使确定了曾经位于给定位置的文件,您也需要再次检查它以防它被移动。USN 日志可能不会记录文件在未进行逻辑修改的情况下重新定位到磁盘上的情况。
而且,即使那样,也不能保证文件在您检查之前没有被移走然后又被移回。或者,在您有机会收集任何数据之前,可能会创建一个文件然后再次删除它。
所以,基本上:不。你不能那样做。
(在某些情况下可能有其他解决方案。例如,如果您的驱动程序可以在感兴趣的点对卷的内容进行快照,则可以检查快照以确定有问题的文件。您必须包括您的不过,你有自己的 NTFS 堆栈。你也许可以从 Linux 借用 NTFS 代码。基本上仍然比它可能值得付出更多的努力。)
FSCTL_LOOKUP_STREAM_FROM_CLUSTER做你想做的事,但它很慢。