0

文件名存储在文件记录的 $30 属性中的 MFT 中。在 Windows 10 之前,文件记录通常有两个 $30 属性,第一个用于 8.3 文件名,如果文件名的长度超过 8 个字符,第二个用于长文件名。(如果存在硬链接,则可能有更多 30 美元的属性)。

这在 Windows 10 中发生了变化。8.3 和长文件名都存储在一个 30 美元的属性中(除非在注册表中关闭了 8.3 文件名的创建)。

这给我留下了两个问题:

  1. 如何从 $30 属性中提取 8.3 文件名?
  2. 显然,Windows 10 的现有版本仍然具有两个 30 美元的属性。在什么时候发生了变化?
4

1 回答 1

0

坦率地说,我希望 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 文件名?好吧,你根本不知道。您可以根据文档中给出的接收方从长文件名构建它们:

  1. 删除所有 Unicode 字符
  2. 移除所有 '。' 但如果不是第一个字符,则为最后一个
  3. 大写所有字母
  4. 删除禁用字符
  5. 截断潜在的“。”之前的所有内容。到 6 个字符,并添加字符串“~1”
  6. 截断潜在的“。”之后的所有内容。至 3 个字符
  7. 虽然名称已经存在,但增加字符串“~1”
于 2020-06-11T19:14:44.390 回答