FAT 12 16 32
THIS IS FAT!!!
Помогал одногруппнице с курсовой работой. Почерпнул для себя много нового. Решил записать.Структура FAT на внешнем носителе, выглядит так:
- Загрузочный сектор 512 байт
- FAT1. (НЕ)Хитрый односвязный список. Длинна записи зависит от типа FAT. Указатели FAT
- FAT2. Копия первого. Актуально для дискет (не обязательно присутствует)
- Корневой каталог 32 сектора
- Кластеры данных.
С какой версией фата мы имеем дело?
Сколько кластеров?
Какого размера сектора?
Какого размера кластеры?
Где корневой каталог?
Отвечать на эти вопросы не сложно. Воспользуйтесь этой документацией - ссыль, либо ее переводом (В котором, переводчик поясняет некоторые моменты)
Теперь, когда все что нам интересно - известно, мы можем прочесть корневой каталог. Так выглядит мой (Это загрузочная дискета GRUB которую я использовал для экспериментов с Multiboot Specicifation):
Я выделил желтым все что относится к первому файлу в каталоге.
Важно отметить, каталоги — это файлы, которые ссылаются на другие файлы и каталоги.
Запись файла в каталоге содержит длинное и короткое имена файла (последнее обязательно должно присутствовать). Одна запись выглядит так:
Я выделил желтым все что относится к первому файлу в каталоге.
Важно отметить, каталоги — это файлы, которые ссылаются на другие файлы и каталоги.
Запись файла в каталоге содержит длинное и короткое имена файла (последнее обязательно должно присутствовать). Одна запись выглядит так:
typedef struct FileStruct
{
uint8_t Name[11];
uint8_t Attr;
uint8_t NTRes;
uint8_t CrtTimeTenth;
uint16_t CrtTime;
uint16_t CrtDate;
uint16_t LstAccDate;
uint16_t FstClusHI;
FatTime WrtTime;
FatTime WrtDate;
uint16_t FstClusLO;
uint32_t FileSize;
} __attribute__((gcc_struct, __packed__)) FileStruct;
Атрибуты выглядят так:
#define ATTR_READ_ONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
#define ATTR_VOLUME_ID 0x08
#define ATTR_DIRRECTORY 0x10
#define ATTR_ARCHIVE 0x20\
Кроме того, если байт атрибутов выглядит так:
ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID
То, перед вами фрагмент имени файла, а не файл. Первый байт такой записи указывает на ее номер (одна запись содержит 13 символов длинного имени). Последняя запись длинного имени имеет номер равный n | 0x40. Таким образом, для однозначной идентификации последней записи длинного имени количество этих записей не должно привышать 15. Вот так:
0x43 часть имени
0x02 часть имени
0x01 часть имени
запись файла с коротким именем
В записи файла кроме имени и атрибутов содержится номер первого кластера в таблице кластеров.
Прочли запись файла, теперь прочтем его содержимое.
Из записи файла берем номер первого кластера и читаем ассоциированную с кластером запись в FAT таблице. Как я писал выше, фат таблица - односвязный список. Каждой записи в фат таблице соответствует один кластер на диске, а значение записи указывает на следующую запись в списке. Если значение записи == 0xFFFF то это последний кластер в файле, если больше 0x0000 и меньше 0x0FF0 то это указатель на следующий кластер. Думаю очевидно, как это читать.
Как я писал выше, каталог — тот же файл, если вы прочтете файл, содержащий каталог, то работа с ним не отличается от работы с корневым каталогом.
Комментарии
Отправить комментарий