坦率地说,我希望 MFT 专家 Sebastian-Laurenţiu Plesciuc 能来拯救我,但他没有,我也没有找到任何方法来吸引他的注意力,所以我必须自己找出答案。
答案在此处引用的 Linux-NTFS 项目文档中给出。
在 $FILE_NAME 属性的标准标头中,您会在偏移量 0x41 处找到 Filename 命名空间成员,其可能值范围为 0 到 4:
0:POSIX
这是最大的命名空间。它区分大小写并允许除 NULL (0) 和正斜杠“/”之外的所有 Unicode 字符。最大名称长度为 255 个字符。注意有一些字符,例如冒号':',在NTFS 中是有效的,但是Windows 不允许你使用。
1:Win32
Win32 是 POSIX 命名空间的子集,不区分大小写。它使用所有 Unicode 字符,除了: '"' '*' '/' ':' '<' '>' '?' '\' '|' NB 名称不能以点“.”或空格“”结尾。
2:DOS
DOS是Win32命名空间的子集,只允许8位大写字符,大于空格'',不包括:'"' '*' '+' ',' '/' ':' ';' '<' '=' '>' '?' '\'. NB 名称必须匹配以下模式:1 到 8 个字符,然后是 '.',然后是 1 到 3 个字符。
3:Win32和DOS
这个命名空间意味着 Win32 和 DOS 文件名是相同的,因此被保存在这个单一的文件名记录中。
当今驱动器上的绝大多数文件将包含来自 POSIX 命名空间的文件。请注意 NTFS 作为文件系统和 Windows 作为操作系统之间的区别。与 Windows 不同,NTFS 区分大小写,几乎没有文件命名限制。显然,可以在 MFT 中使用在 Windows 环境中不合法的文件名。
命名空间 0 和 1 文件名是通常超过 8 个字符的长文件名。命名空间 2 文件名是 DOS 时代典型的大写 8.3 名称(FILENA~1.TXT)。命名空间 3 文件名不超过 8 个字符。命名空间 2 和 3 文件名仅限于 ANSI 字符集。
现在,您如何从 Windows 10 的 MFT 中读取 Namespace 0 或 1 文件名的 8.3 文件名?好吧,你根本不知道。您可以根据文档中给出的接收方从长文件名构建它们:
- 删除所有 Unicode 字符
- 移除所有 '。' 但如果不是第一个字符,则为最后一个
- 大写所有字母
- 删除禁用字符
- 截断潜在的“。”之前的所有内容。到 6 个字符,并添加字符串“~1”
- 截断潜在的“。”之后的所有内容。至 3 个字符
- 虽然名称已经存在,但增加字符串“~1”