如何在NTFS文件系统上从MFT获取文件的LBA(逻辑块寻址)?

时间:2013-02-18 05:50:41

标签: block ntfs addressing ntfs-mft

我访问了$ MFT文件并解压缩了文件属性。

考虑到MFT的文件属性,如何从NTFS文件系统上的MFT记录中获取LBA文件?

要计算LBA,我知道文件的簇号。

可以使用簇号来计算吗?

2 个答案:

答案 0 :(得分:1)

我不完全确定你的问题 - 但如果你只是想在磁盘上查找文件的逻辑位置,那么有各种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中的小文件) 。微软的数据运行是前两个半字节中包含的数据的相当简单的结构,它为下一次数据运行指定了偏移量和长度。

答案 1 :(得分:0)

恕我直言,你应该通过做一些基本的算法而不是使用IOCTL和FSCTL来编写代码。您应该知道磁盘的大小以及卷开始的偏移量(或者使用IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS的每个范围)并将这些值存储在某处。然后,只需将群集大小的LCN乘以磁盘上范围的偏移量即可。

大多数时候你只需处理一个范围。当您有多个范围时,您可以通过将LCN乘以一个集群的大小来确定集群的范围,然后按照它们返回的顺序减去IOCTL返回的每个范围的大小,如果要减去下一个数字大于您当前的数字,特定的LCN就在这个范围内。