我正在开发一个上部过滤器驱动程序,它监视卷的读/写块。 当任何读/写发生时,我从它获得音量偏移和第一扇区(LBA)。 如何使用C / C ++从卷偏移量或第一个扇区获取文件名? 任何形式的帮助表示赞赏。 提前谢谢。
答案 0 :(得分:1)
这几乎是可能的。您可以使用this code枚举卷上的所有文件。 ( 警告: 某些printf函数在使用%lu
时会使用%I64u
,因此打印的某些信息是错误的,大多数特别是文件引用号;我相信主要逻辑是可以的。)
对于您找到的每个文件,您可以使用FSCTL_GET_RETRIEVAL_POINTERS
在磁盘上查找其位置。
所以你可以提前建立一个数据库。您可以使用FSCTL_READ_USN_JOURNAL
使其保持最新状态,而不必不断重新扫描整个磁盘。
但是,即使已经识别出曾经位于给定位置的文件,您也需要再次检查它以防它被移动。 USN日志可能不会记录何时在磁盘上重新定位文件而不进行逻辑修改。
即便如此,也不能保证文件没有移开,然后在检查之前将其移回。或者,在您有机会为其收集任何数据之前,可能会创建一个文件然后再次删除。
所以,基本上:不。你做不到。
(在某些情况下可能会出现其他解决方案。例如,如果您的驱动程序可以在感兴趣的位置对卷的内容进行快照,则可以检查快照以确定相关文件。您可以但是要包含你自己的NTFS堆栈。你可以从Linux借用NTFS代码。基本上还有更多的工作量。)
答案 1 :(得分:1)
FSCTL_LOOKUP_STREAM_FROM_CLUSTER做你想要的但是很慢。