Четене на FAT32

Не толкова отдавна реших да разбера същността на файловата система FAT. За целта си поставих задачата да намеря и прочета файл на USB флаш устройство, използвайки само HxD и без Ctrl + F, разбира се.

Тази публикация ще покрие само повърхностно спецификацията FAT32. Интересно? Влез. И да, не забравяйте за големите ендийски ендианси и други малки неща, които правят живота ни забавен.

този случай

Първите 11 байта се отнасят за сектора за зареждане, три байта означават началото на сектора за зареждане на операционната система (ако той е там, разбира се), останалите осем са името на операционната система или производителя, в този случай това е MSDOS5. 0. Давам значението на останалите байтове по-долу:

Байтове - Цел
2 - Броят байтове в сектора, валидни стойности - 512, 1024, 2048 или 4096.
1 - Сектори на клъстер, тук има 8 от тях Може би 1,2,4,8,16,32,64 или 128.
2 - Брой запазени сектори. Обикновено 32, но това е различно. Не е страшно.
1 - Брой FAT таблици, обикновено две, в противен случай много програми ще полудеят. Но в името на икономията понякога остава само една таблица, когато не се изисква резервиране на FS (данните не се дублират).
4 - Използва се във FAT12/16, но за FAT32 ще има нули.
1 - Стандартната стойност за твърдите дискове е 0xF8, за сменяемите устройства - 0xF0. Също така, може да има стойности 0xF9, 0xFA ... 0xFF, основното е, че първият байт от таблицата FAT има същата стойност, в противен случай това е причина за безпокойство. Но това е само старо правило от MSDOS дни, което се използва за определяне на типа на диска.
2 - Не се използва във FAT32, 0x00.
2 - Брой сектори на песен.
2 - Брой глави.
4 - Брой скрити сектори, ако дискът е разделен на дялове, тук не трябва да има нула.
4 - Общ брой сектори на диска.
4 - Брой сектори на една FAT таблица.
2 - Поле за флаг, което не е покрито тук.
2 - Номер на версията на FAT32, в случая 00.
4 - Номерът на първия клъстер на главната директория, най-често два, но ако вторият клъстер е повреден, тогава дисковата програма може да промени номера.
2 - Секторен номер със странна структура на FSINFO, който няма да засегнем сега.
2 - Номерът на сектора в резервната зона на диска, или 6 или 0, други стойности водят до безпокойство и ненужна работа.
12 - Най-дълго и безполезно поле Запазено, нули по подразбиране.
1 - 0x00 за флопи и 0x80 за твърди дискове. Използва се за BIOS функция int 13h.

1 - 0x00
1 - 0x29, индикатор, че съществуват следващите три полета.
4 - Сериен номер на тома.
11 - Име на диска, съответства на името на главната директория (но понякога помощната програма на диска работи слабо и те не съвпадат), в този случай „NO NAME“.
8 - Винаги трябва да е „FAT32“, но не използвайте това поле за дефиниране на типа файлова система, то е просто „застраховка“. Няма да разглеждаме методите за определяне на FS.

510 и 511 байта съдържат стойностите 0x55 и 0xAA, в този случай те са в края на нулевия сектор, но не е факт, че това винаги ще бъде така и навсякъде. Ако броят на байтовете на сектор е повече от 512, тогава границата на сектора ще бъде по-далеч от тези числа.

Регион за файлове и данни

И така, прегледахме заглавието и запаметихме основните данни относно нашия диск. Сега нека разгледаме структурата на самата удебелена файлова система и се опитаме да намерим региона с необходимите данни. Директорията във FAT е файл с флага "директория" и практически не се различава от обикновения файл.

FS разпределя данни по номера на клъстери, номерът на първия клъстер в този случай е 2. За да се намери номерът на началния сектор на втория клъстер, трябва да се извършат следните изчисления:

FirstDataSector = ResSec + (NumFATs * FATSz), където ResSec = брой резервирани сектори, NumFATs - брой FAT таблици, FATSz - размер на FAT таблица.

В случая това е сектор 7672. Да отидем на него.

Стигнахме до странен HABR файл. Първите 11 байта са името на файла. Следва байт с файлови атрибути, който тук е 0x08. Какво означава? Нека да разгледаме спецификацията FAT:

ATTR_READ_ONLY 0x01
ATTR_HIDDEN 0x02
ATTR_SYSTEM 0x04
ATTR_VOLUME_ID 0x08
ATTR_DIRECTORY 0x10
ATTR_ARCHIVE 0x20
ATTR_LONG_NAME ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID

ATTR_VOLUME_ID? Уря, стигнахме до главната директория. Ако беше само папка, атрибутът ATTR_DIRECTORY щеше да е там. Пропускаме следващия байт, има смисъл само за WinNT. Следват времето за създаване, датата на създаване, най-значимата дума, номерът на клъстера (който все още ще бъде нула тук), времето на последния достъп и размера на файла в байтове. Продължавай. Сега се интересуваме от същия файл, който е в основната директория. Както можете да видите, този файл се нарича GNU_GPL и е архив (КАКВО?). Нека пропуснем 14 байта и ще видим 2-байтово поле, съдържащо най-малко значимата дума от първия номер на клъстера (03), както и 4-байтов размер на файла в байтове (74 AF). Тук няма повече файлове, но ние сме нетърпеливи да прочетем точно този GNU_GPL! Като се има предвид номерът на клъстера N, можем лесно да намерим сектора, съдържащ този клъстер:

Sector = ReservedSec + (N * 4/BytePerSec), където ReservedSec е броят на запазените сектори, а BytePerSec е броят на байтовете на сектор.

Случи се така, че клъстерът с данни отива веднага след клъстера с главната директория. Леле, сега можем да прочетем лиценза:

главната директория

Файловите системи всъщност не са лесна тема. Ако изведнъж искате да прочетете повече за FAT или да напишете свой собствен FAT драйвер, препоръчвам ви да се обърнете към официалната книга на Microsoft: tyk