Как имена файлов DOS обрабатываются в MFT в Windows 10?
Имена файлов хранятся в MFT в атрибуте $30 записи файла. До Windows 10 запись файла чаще всего имела два атрибута по 30 долларов, первый для имен файлов формата 8.3 и - если длина имени файла превышала 8 символов - второй для длинного имени файла. (Возможны более 30 атрибутов при наличии жестких ссылок).
В Windows 10 это изменилось. И имя файла 8.3, и длинное имя файла хранятся в одном атрибуте $30 (если в реестре не отключено создание имен файлов 8.3).
Это оставляет мне 2 вопроса:
- Как вы извлекаете имена файлов формата 8.3 из атрибута $30?
- По-видимому, существовали версии Windows 10 с двумя атрибутами по 30 долларов. В какой момент это изменилось?
1 ответ
Честно говоря, я надеялся, что эксперт MFT Себастьян-Лауренциу Плещук придет мне на помощь, но он этого не сделал, и я не нашел никаких средств, чтобы привлечь его внимание, поэтому мне пришлось выяснить это самому.
Ответ дан в цитируемой здесь документации проекта Linux-NTFS.
В стандартном заголовке атрибута $FILE_NAME вы найдете по смещению 0x41 член пространства имен файлов с возможными значениями от 0 до 4:
0: POSIX
Это самое большое пространство имен. Он чувствителен к регистру и позволяет использовать все символы Unicode, кроме NULL (0) и косой черты '/'. Максимальная длина имени - 255 символов. NB. Есть некоторые символы, например двоеточие ":", которые допустимы в NTFS, но Windows не позволит вам их использовать.
1: Win32
Win32 является подмножеством пространства имен POSIX и не чувствителен к регистру. Он использует все символы Юникода, кроме:'"' '*' '/' ':' '<' '>' '?' '\' '|' NB Имена не могут оканчиваться на точку '.' Или пробел ''.
2: DOS
DOS - это подмножество пространства имен Win32, позволяющее использовать только 8-битные символы верхнего регистра, больше, чем Space ' ', и исключая:'"' '*' '+' ',' '/' ':' ';' '<' '=' '>' '?' '\'. NB Имена должны соответствовать следующему шаблону: от 1 до 8 символов, затем '.', Затем от 1 до 3 символов.
3: Win32 и DOS
Это пространство имен означает, что имена файлов Win32 и DOS идентичны и, следовательно, были сохранены в этой единственной записи имени файла.
Подавляющее большинство файлов на сегодняшних дисках будут состоять из файлов из пространства имен POSIX. Обратите внимание на разницу между NTFS как файловой системой и Windows как операционной системой. В отличие от Windows NTFS чувствительна к регистру и почти не имеет ограничений в отношении именования файлов. Очевидно, в MFT можно использовать имена файлов, которые недопустимы в среде Windows.
Имена файлов пространства имен 0 и 1 - это обычные длинные имена файлов, превышающие 8 символов. Имена файлов пространства имен 2 - это типичные имена 8.3 в верхнем регистре (FILENA~1.TXT) из эпохи DOS. Имена файлов в пространстве имен 3 не превышают 8 символов. Имена файлов пространств имен 2 и 3 ограничены набором символов ANSI.
Теперь, как вы читаете 8.3 имена файлов пространств имен 0 или 1 имен файлов из MFT в Windows 10? Ну, ты просто не знаешь. Вы строите их из длинных имен файлов, следующих за получателем, указанным в документации:
- Удалить все символы Юникода
- Убрать все '.' но последний, если это не первый символ
- Все буквы в верхнем регистре
- Удалить запрещенные символы
- Обрежьте все, прежде чем потенциал '.' до 6 символов и добавьте строку "~1"
- Обрежьте все после потенциального '.' до 3 символов
- Пока имя уже существует, увеличьте строку "~1"