已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
四年前关闭了。
Improve this question
我想阅读我的本地系统使用C的MFT.我在互联网上寻找解决方案,但没有找到.我希望有人有一个教程给我或一个很好的解释与代码的例子如何做到这一点.提前感谢.
已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
四年前关闭了。
Improve this question
我想阅读我的本地系统使用C的MFT.我在互联网上寻找解决方案,但没有找到.我希望有人有一个教程给我或一个很好的解释与代码的例子如何做到这一点.提前感谢.
2条答案
按热度按时间wz8daaqr1#
首先,我们需要打开具有
FILE_READ_DATA
权限的卷句柄。然后我们需要用
FSCTL_GET_NTFS_VOLUME_DATA
控制代码查询NTFS_VOLUME_DATA_BUFFER
。从这里我们得到单个 MFT 记录的大小-
BytesPerFileRecordSegment
,MFT 的总大小-MftValidDataLength
。因此最大记录数为(MftValidDataLength.QuadPart / BytesPerFileRecordSegment)
。正确的方法(与NTFS同步)是通过
FSCTL_GET_NTFS_FILE_RECORD
读取单个记录。如果你想一次读取多个记录-当然可以直接从卷中读取。我们有 MFT 的开始 LCN-
MftStartLcn
。但是 MFT 可能有几个不连续的片段。所以如果我们想获得所有片段位置,我们需要使用FSCTL_GET_RETRIEVAL_POINTERS
。要将 LCN 转换为卷偏移量,我们需要将其乘以BytesPerCluster
。演示代码:
7y4bm7vi2#
MFT开始的群集号位于NTFS Boot 扇区的偏移0x30处,如here所述。
GetDiskFreeSpace
将返回群集大小,要打开卷以进行直接访问,您可以执行(例如)CreateFile ("\\.\C:", ...)
,如“物理磁盘和卷”下的here所述。