windows - 获取文件在磁盘/簇号上的偏移量

标签 windows winapi file-io ntfs

我需要获取有关文件在 NTFS 磁盘上的物理位置的任何信息。绝对偏移量、集群 ID……任何东西。 我需要扫描磁盘两次,一次是为了获取分配的文件,还有一次我需要在 RAW 模式下直接打开分区并尝试查找其余数据(从已删除的文件中)。我需要一种方法来了解我找到的数据与我之前已经作为文件处理的数据相同。当我以原始模式扫描磁盘时,我发现的数据的偏移量可以以某种方式转换为文件的偏移量(具有有关磁盘几何形状的信息)。有什么办法吗?其他解决方案也被接受。 现在我正在玩 FSCTL_GET_NTFS_FILE_RECORD,但目前无法让它工作,我不确定它是否有帮助。

更新

我找到了下面的函数 http://msdn.microsoft.com/en-us/library/windows/desktop/aa364952(v=vs.85).aspx 它返回包含 nFileIndexHigh 和 nFileIndexLow 变量的结构。 文档说

存储在 nFileIndexHigh 和 nFileIndexLow 成员中的标识符称为文件 ID。对文件 ID 的支持是特定于文件系统的。不能保证文件 ID 随着时间的推移是唯一的,因为文件系统可以自由地重用它们。在某些情况下,文件的文件 ID 会随着时间的推移而改变。

我不太明白这是什么。我无法将它连接到文件的物理位置。以后是否可以从 MFT 中提取此文件 ID?

更新

发现这个: 这个标识符和卷序列号唯一标识一个文件。当系统重新启动或打开文件时,此数字可能会发生变化。

这不满足我的要求,因为我要打开文件,但 ID 可能会改变这一事实并不让我高兴。

有什么想法吗?

最佳答案

使用 Defragmentation IOCTLs .例如,FSCTL_GET_RETRIEVAL_POINTERS会告诉你包含文件数据的范围。

关于windows - 获取文件在磁盘/簇号上的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11934550/

相关文章:

.net - 当我从 .NET 生成一个新线程时到底发生了什么?

c# - 返回用户所属的所有 Active Directory 应用程序组的列表

c++ - 如何使用SendMessage设置图片框样式

delphi - Delphi 嵌套类中的 EnumWindows

ruby - 从 ruby​​ 中的单段中的标准输入或文件读取

windows - 使用 BHO 时 IE 上的运行时错误 216

windows - Powershell相当于cp -n,即复制文件而不覆盖

c - 调整权限 SE_DEBUG_NAME

c - 在 C 中生成随机矩阵到外部文件

java - 在 Android 中写入 SD 卡中的文件