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

Что же из себя представляют каталоги в файловой системе FAT?

Каталог представляет собой почти тот же самый файл, описываемый соответствующим элементом родительского каталога. В ссылке на каталог (помеченной специальным признаком) поле длины файла не используется (заполнено нулями), а конец каталога определяется по концу цепочки кластеров.

Вложенный каталог состоит из набора таких же элементов каталога. Самым первым элементом является ссылка на себя самого под псевдонимом “.” (оттуда и берётся номер начального кластера данного каталога). Затем идёт элемент со ссылкой на родительский каталог под псевдонимом “..”, она позволяет найти начало родительского каталога (нулевой номер кластера указывает на корневой каталог).

Если корневой каталог может содержать фиксированное число вхождений, то на вложенные каталоги такое ограничение не распространяется, и число элементов ограничивается только свободным местом на диске.

Итак, для того, чтобы наглядно показать, что есть каталог – превратим один из наших файлов в директорию.

Итак, первая область – атрибуты файла. В статье я говорил, что 02h значит “Архивный”. Нам нужно здесь выставить атрибут “Признак каталога”, это выставленный Бит 4.

Смотрим!

Тут я отметил поле атрибутов и поле размера файлов. В качестве атрибута нам нужно выставить бит в позицию 4, чтобы создать признак каталога. Вычисляем новое значение.

Отсчёт справа, начиная с 0, выставлены 4 и 5 биты. Это число в hex пишем в позицию атрибутов по смещению 0Bh.

Также занулим все байты, определяющие размер. Каталогу они не нужны. Смотрим, что получилось:

Файл выглядит как папка! В неё даже можно войти.

Содержимое легко шокирует. Это произошло потому, что содержимое текстового файла было “0123456789…” и эти фрагменты система интерпретирует как имена файлов (а так же атрибуты и т.д.)

Создаем папку с нуля

Для закрепления материала предлагаю создать новую папку на диске с нуля, то есть в пустом месте вписать нужные байты и при этом не допустить ошибок.
Открываем корневой каталог, создавать папку будем тут.

  1. Имя папки “NEWDIR”, остальное заполняем кодом 20h – пробел;
  2. 10h означает атрибут директории;
  3. 0006h – указывает на 6-ую запись в FAT;
  4. Размер нулевой;
Остальные цифры (между атрибутами и номером записи в FAT) не важны, это дата-время создания и изменения, я их взял от произвольного файла. Можно даже оставить пустыми. Получаем новый снэпшот. Открываем смещение, с которого начинается наша новая “папка”, дописываем новые байты:

  1. Имя папки: 2Eh – это символ “.” – текущая директория. Остальные байты аналогичны созданным ранее, в корневом каталоге.
  2. Имя папки 2E2Eh – символы “..” – ссылка на родительский каталог.
  3. Обратите внимание, что “.” ссылается на 6-ую запись в FAT, а “..” ссылается в “0000h”, так как родительский каталог – корневой;
  4. Размеры – нулевые, так как это папки.
Ну а теперь правим FAT-таблицу.

Отсчитываем 6-ую позицию так: (одна позиция – два байта)

FFF8h – тип тома;

FFFFh – заполнитель;

Далее, начиная с 0404h идут попарно записи, счёт с двух.. (пропускаем родительский каталог). 6-ая пара байт приходится на 040Ch и 040Dh. Записываем там FFFFh (кластер занят).

Проверяем:

Чекдиск с радостью сообщает, что ошибок не найдено, и на диске появилась папка.