我访问了 $MFT 文件并提取了文件属性。
给定来自 MFT 的文件属性,如何从 NTFS 文件系统上的 MFT 记录中获取文件的 LBA?
要计算 LBA,我知道文件的簇数。
可以用簇数来计算吗?
我访问了 $MFT 文件并提取了文件属性。
给定来自 MFT 的文件属性,如何从 NTFS 文件系统上的 MFT 记录中获取文件的 LBA?
要计算 LBA,我知道文件的簇数。
可以用簇数来计算吗?
我不完全确定你的问题——但如果你只是想在磁盘上找到文件的逻辑位置,有各种 IOCTL 可以实现这一点。
例如,MFT 文件记录:FSCTL_GET_NTFS_FILE_RECORD http://msdn.microsoft.com/en-us/library/windows/desktop/aa364568(v=vs.85).aspx
通过 HANDLE 在磁盘上的特定文件位置:FSCTL_GET_RETRIEVAL_POINTERS http://msdn.microsoft.com/en-us/library/windows/desktop/aa364572(v=vs.85).aspx
如果您尝试自己解析 NTFS,则需要遵循 $DATA 属性——这将始终是非常驻数据运行(除非它是可以驻留在 MFT 中的小文件)。Microsoft 的数据运行是包含在前两个半字节中的相当简单的数据结构,它们指定下一次数据运行的偏移量和长度。
恕我直言,您应该通过做一些基本的算术而不是使用 IOCTL 和 FSCTL 来编写代码。您应该知道磁盘的大小和卷开始的偏移量(或使用 IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS 的每个范围)并将这些值存储在某处。然后只需将 LCN 乘以集群大小添加到磁盘上的范围的偏移量。
大多数时候你只需要处理一个范围。当您有多个范围时,您可以通过将 LCN 乘以集群的大小,然后按 IOCTL 返回的顺序减去 IOCTL 返回的每个范围的大小来确定集群的范围,如果下一个要减去的数字大于您当前的数字,则该特定 LCN 在该范围内。