Материал просмотрен 3,211 раз(а)

Начиная с Windows 95 была введена практика использования “длинных” имён для каталогов и файлов. В таких именах допускается использование символов разного регистра, наличие точек, пробелов и некоторых других специальных символов.
В каталоге под такой файл отводится несколько смежных 32-байтных блоков.

Эти элементы имеют спецефическое значение элемента “атрибуты”, выставлены одновременно флаги “метка тома”, “системный”, “скрытый” и “только чтение”, благодаря которому ОС их не воспринимает при поиске и не отображает. После этих записей идет элемент с обычной структурой, в котором хранится короткое имя в формате 8.3. Этот элемент заключает в себе номер начального кластера, дату создания и атрибуты файла или каталога.

Важно понимать, что длинное имя без короткого не существует.

Все блоки с частями длинного имени нумеруются по порядку следования символов, причем блок с номером 01h будет располагаться непосредственно перед блоком с коротким именем.

Если в этот 01h-ый блок не умещается длинное имя, то перед ним будет блок с номером 02h и так далее, до тех пор, пока имя не уместится.

У самого последнего блока номер будет увеличиваться на 40h. То есть если длинное имя заключилось в 1 блок, то его номер будет 41h.

Итак, резюмирую. Структура файлов с “длинным” именем выглядит так:

 Смещение  Длина в байтах  Описание
00h 1 Порядковый номер блока
01h 10 Имя (5 символов Unicode по 2 байта каждый)
0Bh 1 Атрибуты 0Fh
0Ch 1 Тип (00h)
0Dh 1 Контрольный код (берется из короткого имени)
0Eh 12 Имя (6 символов Unicode по 2 байта каждый)
1Ah 2 Байты 0000h
1Ch 4 Имя (2 символа Unicode по 2 байта каждый)

Нетрудно подсчитать, что одна такая запись позволяет вместить 5+6+2=13 символов имени файла.

Создадим на флешке файл с именем “long_name_file_ole-ole-raz-dva-tri-raz-dva-tri-raz-dva-tri.txt”, это 62 символа. 62 делим на 13 получаем 5 (с округлением в большую сторону), значит, чтобы описать такое имя, потребуется 5 блоков для длинного имени + 1 блок для короткого.

Длинное имя в файловой системе

Длинное имя в файловой системе

  1. Байт 01h – первый блок длинного имени;
  2. Байт 02h – второй блок длинного имени. Мы знаем, что имя не вместится в этот блок, поскольку последний блок увеличивается на 40h;
  3. Аналогично;
  4. Аналогично;
  5. Байт 45h – пятый блок имени, он увеличен на 40h (40h + 05h = 45h), значит блок последний;
  6. Сразу после 01h блока идёт блок с описанием короткого имени файла, его мы рассматривали ранее (см. записи по тегу FAT)
  7. Вот тут начинается длинное имя. Так как это Unicode, то под каждый символ отводится 2 байта. Выписываем эти символы (чуть ниже);
  8. Эта вставка из таблицы, атрибуты и тип;
  9. Аналогично, табличное;

Итак, начинаем вычитывать имя файла. Выписываем байты с 01h блока по последний. Всё, что я отметил зеленым в первом блоке, перепишем последовательно:

6C 6F 6E 67 5F 6E 61 6D 65 5F 66 69 6C

Теперь переходим на следующий блок (вверх) и продолжаем:

65 5F 6F 6C 65 2D 6F 6C 65 2D 72 61 7A

Продолжаем 3-ий блок:

2D 64 76 61 2D 74 72 69 2D 72 61 7A 2D

Продолжаем 4-ый блок:

64 76 61 2D 74 72 69 2D 72 61 7A 2D 64

Наконец 5-ый блок:

76 61 2D 74 72 69 2E 74 78 74 00

Склеив это, получаем:
6C 6F 6E 67 5F 6E 61 6D 65 5F 66 69 6C 65 5F 6F 6C 65 2D 6F 6C 65 2D 72 61 7A 2D 64 76 61 2D 74 72 69 2D 72 61 7A 2D 64 76 61 2D 74 72 69 2D 72 61 7A 2D 64 76 61 2D 74 72 69 2E 74 78 74 00

Переводим в текст:

hex to text

hex to text

Вот так и хранятся длинные имена файлов. Спасибо за внимание!