Das FAT Datei Format
Der Master-Boot-Record
Aufbau einer Partition
Der Boot Sektor
Die FAT (File Alocation Table)
Verzeichniseinträge
Der Infosektor
Festplatten beginnen mit einer Partitionstabelle auf Kopf 0, Zylinder 0 und Sektor 1. Bei Disketten entfällt diese Tabelle. Die Partitionstabelle wird auch Master-Boot-Record genannt (MBR), und hat folgenden Aufbau:
Offset Größe Funktion 0x000 446 Byte Bootcode 0x1BE 16 Byte 1. Eintrag in der Partitionstabelle 0x1CE 16 Byte 2. Eintrag in der Partitionstabelle 0x1DE 16 Byte 3. Eintrag in der Partitionstabelle 0x1EE 16 Byte 4. Eintrag in der Partitionstabelle 0x1FE 2 Byte Signatur 0xAA55 Die Partitionstabelleneinträge haben folgenden Aufbau:
Offset Größe Funktion 0x00 1 Byte 0x80: bootfähig 0x00: nicht bootfähig 0x01 1 Byte Startkopf der Partition (0 bis n) 0x02 1 Byte Bit 0-5 Startsektor (1 bis 63) Bit 6-7 sind zusätzliche Bits für den Startzylinder 0x03 1 Byte Startzylinder (0 bis 1023) 0x04 1 Byte OS-Type:
0x00 = Eintrag leer
0x01 = FAT12
0x02 = Xenix
0x03 = Xenix
0x04 = FAT16 (max. 32 MB)
0x05 = extended DOS-Partition (max. 2 GB)
0x06 = FAT16 (max. 2 GB)
0x07 = HPFS/NTFS
0x08 = AIX
0x09 = AIX bootable
0x0A = OS/2 Bootmanager
0x0B = FAT32 (CHS Adressierung)
0x0C = FAT32 (LBA Adressierung)
0x0E = FAT16 (LBA Adressierung)
0x0F = extended Partition (LBA,mehr als 1024 Zylinder)
0x10 = OPUS
0x11 = hidden FAT12
0x12 = Compaq diagnost
0x14 = hidden FAT16 bis 32MB
0x16 = hidden FAT16
0x17 = hidden HPFS / NTFS
0x18 = AST Windows swap
0x1B = hidden WIN95 FAT32
0x1C = hidden WIN95 FAT32 (LBA)
0x1E = hidden WIN95 FAT16 (LBA)
0x24 = NEC DOS
0x39 = Plan 9
0x3C = Partition Magic
0x40 = Venix 80286
0x41 = PPC PReP boot
0x42 = SFS
0x4D = QNX4.x
0x4E = QNX4.x 2nd partition
0x4F = QNX4.x 3rd partition
0x50 = OnTrack DM
0x51 = OnTrack DM6 Aux
0x52 = CP/M
0x53 = OnTrack DM6 Aux
0x54 = OnTrack DM6
0x55 = EZ-Drive
0x56 = Golden Bow
0x5c = Priam Edisk
0x61 = Speed Stor
0x63 = GNU HURD or SYS
0x64 = Novell NetWare
0x65 = Novell
0x70 = Disk Secure Mult
0x75 = UNIX PC/IX
0x80 = aktiv (old Minix)
0x81 = Booten von Laufwerk D:
0x82 = Linux Swap
0x83 = Linux native
0x84 = OS/2 hidden C:
0x85 = LINUX extended
0x86 = NTFS volume set
0x87 = NTFS volume set
0x8e = LINUX LVM
0x93 = Amoebla
0x94 = Amoebla BBT
0x9F = BSD/OS
0xA0 = IBM Thinkpad hidden
0xA5 = BSD/386
0xA6 = Open BSD
0xA7 = NeXT STEP
0xB7 = BSDI fs
0xB8 = BSDI swap
0xC1 = DRDOS/sec (FAT32)
0xC4 = DRDOS/sec (FAT32(LBA))
0xC6 = DRDOS/sec (FAT16(LBA))
0xC7 = Syrinx
0xDA = Non-Fs data
0xDB = Concurrent DOS , CP/M , CTOS
0xDE = Dell Utility
0xE1 = DOS access
0xE3 = DOS R/o
0xE4 = Speed Stor
0xEB = BeOS fs
0xEE = EFI GPT
0xEF = EFI (FAT12/16/32)
0xF1 = Speed Stor
0xF2 = DOS secondary
0xF4 = Speed Stor
0xFD = LINUX raid auto
0xFE = LANstep
0xFF = BBT0x05 1 Byte Endkopf der Partition (0 bis n) 0x06 1 Byte Bit 0-5 Endsektor (1 bis 63) Bit 6-7 sind zusätzliche Bits für den Endzylinder 0x07 1 Byte Endzylinder (0 bis 1023) 0x08 4 Byte Anfangssektor der Partitionsdaten (absoluter LBA) 0x0C 4 Byte Größe der Partition in Sektoren Die LBA Adressierung (large block array) ist für Festplatten mit mehr als 1024 Zylindern, bei weniger Zylindern kann weiter die CHS Adressierung verwendet werden (cylinder head sector). Bei der LBA Adressierung wird statt Kopf,Zylinder,Sektor ein 32 Bit DWORT Wert für die Sektor Adressierung verwendet.
Aus den Partitionsdaten kann die Position und Größe der logischen Laufwerke ermittelt werden. Dazu dienen die DWORD Werte bei Offset 0x08 und 0x0C. Handelt es sich bei der Partition um eine "extended Partition" so ist diese kein logisches Laufwerk sondern eine weitere Unterpartition mit einem weitern Master-Boot-Record. Zu allen Positionen der LBA's ist der Anfangssektor der "extended Partition" hinzu zu zählen.
Am Anfang jeder FAT-Partition eines logischen Laufwerkes steht der Boot Sektor. Er enthält Angaben über die Größe und Art der Partition. Anschließend kommt ein Bereich mit reservierten Sektoren, in diesen kann auch eine Kopie des Bootsektors vorhanden sein. Danach kommen die FAT-Sektoren. Um eine höhere Sicherheit zu erhalten werden meist zwei FAT Tabellen verwendet, falls eine beschädigt wird. Die FAT Tabellen enthalten Informationen über die Cluster-Ketten die in den einzelnen Dateien gespeichert sind. Nach den FAT's folgt das Rootverzeichnis. Es enthält alle Dateien die im Hauptverzeichnis stehen. Bei FAT32 Partitionen ist kein Rootverzeichnis vorhanden, es ist durch eine Cluster-Kette ersetzt deren Anfang im Boot Sektor steht. Zuletzt kommen die Datensektoren. Sie sind in einzelne Cluster unterteilt. Jeder Cluster besteht aus ein oder mehreren Sektoren. Der erste Cluster hat die Nummer 2 und beginnt beim ersten Datensektor.
![]()
Am Anfang jedes logischen Laufwerkes steht ein ein Boot Sektor der folgenden Aufbau hat:
Offset Größe Funktion 0x000 3 Byte Jump Befehl zu Bootcode 0x003 8 Byte OEM Name 0x00B 2 Byte Bytes je Sektor 0x00D 1 Byte Sektoren je Cluster 0x00E 2 Byte Anzahl der reservierten Sektoren, relativ zum Anfang der Partition. 0x010 1 Byte Anzahl der FAT's 0x011 2 Byte Anzahl der Einträge im Hauptverzeichnis 0x013 2 Byte Anzahl der Sektoren auf der Disk 0x015 1 Byte Media Art:
0xF0 2.88 MB 3.5-inch, 2-sided, 36-sector
0xF0 1.44 MB 3.5-inch, 2-sided, 18-sector
0xF9 720 KB 3.5-inch, 2-sided, 9-sector
0xF9 1.2 MB 5.25-inch, 2-sided, 15-sector
0xFD 360 KB 5.25-inch, 2-sided, 9-sector
0xFF 320 KB 5.25-inch, 2-sided, 8-sector
0xFC 180 KB 5.25-inch, 1-sided, 9-sector
0xFE 160 KB 5.25-inch, 1-sided, 8-sector
0xF8 Festplatte0x016 2 Byte Anzahl der Sektoren je FAT 0x018 2 Byte Anzahl der Sektoren je Spur 0x01A 2 Byte Anzahl der Leseschreibköpfe 0x01C 4 Byte Anzahl der versteckten Sektoren 0x020 4 Byte Gesamt Anzahl der Sektoren 0x024 1 Byte Physikalische Disk Nummer (0x80,0x81 ... ) 0x025 1 Byte Jetziger Kopf (unbenutzt) 0x026 1 Byte Signatur 0x027 4 Byte Seriennummer 0x02B 11 Byte Laufwerksname 0x036 8 Byte System ID 0x03E 448 Byte Boot Programm 0x1FE 2 Byte Signatur 0xAA55 Bei FAT32 Partitionen ist der Bootsektor etwas anders:
Offset Größe Funktion 0x000 3 Byte Jump Befehl zu Bootcode 0x003 8 Byte OEM Name 0x00B 2 Byte Bytes je Sektor 0x00D 1 Byte Sektoren je Cluster 0x00E 2 Byte Anzahl der reservierten Sektoren, relativ zum Anfang der Partition. 0x010 1 Byte Anzahl der FAT's 0x011 2 Byte Anzahl der Einträge im Hauptverzeichnis (immer 0) 0x013 2 Byte Anzahl der Sektoren (immer 0) 0x015 1 Byte Media Art:
0xF0 2.88 MB 3.5-inch, 2-sided, 36-sector
0xF0 1.44 MB 3.5-inch, 2-sided, 18-sector
0xF9 720 KB 3.5-inch, 2-sided, 9-sector
0xF9 1.2 MB 5.25-inch, 2-sided, 15-sector
0xFD 360 KB 5.25-inch, 2-sided, 9-sector
0xFF 320 KB 5.25-inch, 2-sided, 8-sector
0xFC 180 KB 5.25-inch, 1-sided, 9-sector
0xFE 160 KB 5.25-inch, 1-sided, 8-sector
0xF8 Festplatte0x016 2 Byte Anzahl der Sektoren je FAT (immer 0) 0x018 2 Byte Anzahl der Sektoren je Spur 0x01A 2 Byte Anzahl der Leseschreibköpfe 0x01C 4 Byte Anzahl der versteckten Sektoren 0x020 4 Byte Gesamt Anzahl der Sektoren 0x024 4 Byte Anzahl der Sektoren je FAT 0x028 2 Byte Flags
0x0080: Keine FAT Spiegelung
0x000F: Anzahl der FAT's0x02A 2 Byte Version (immer 0) 0x02C 4 Byte Cluster Nummer für Root-Verzeichnis 0x030 2 Byte Position des Infosektors (relativ zum 1. Datensektor)
1=normal
0xFFFF=keiner0x032 2 Byte Backup Boot Sektor (6=normal) 0x034 12 Byte unbenutzt (immer 0) 0x040 1 Byte Physikalische Disk Nummer (0x80,0x81 ... ) 0x041 1 Byte Jetziger Kopf (unbenutzt) 0x042 1 Byte Signatur 0x043 4 Byte Seriennummer 0x047 11 Byte Laufwerksname 0x052 8 Byte System ID 0x05A 420 Byte Boot Programm 0x1FE 2 Byte Signatur 0xAA55 Mit dem Boot Sektor wird bestimmt wie ein Laufwerk aufgebaut ist.
Die FAT (File Alocation Table)
In einer FAT ist für jeden Cluster ein Eintrag vorhanden. Der Eintrag bestimmt ob ein Cluster frei ist, ob er defekt ist, ob er reserviert ist, oder ob er belegt ist. Bei belegten Sektoren wird immer die Nummer des nächsten Clusters eingetragen. Damit ist es möglich Ketten aus Clustern zu definieren, die zu einer Datei gehören. In einem Verzeichniseintrag steht dann der Anfangs-Cluster dieser Dateien. Die ersten beiden Einträge in der FAT sind der Media-Deskriptor (siehe Boot Sektor bei Offset 0x15)
Die einzelnen FAT Einträge haben folgende Bedeutung:
FAT12 FAT16 FAT32 Funktion 0x000 0x0000 0x0000000 freier Cluster 0xFF0-0xFF6
0xFFF0-0xFFF6
--- Cluster fürs Rootverzeichnis 0xFF7 0xFFF7 0xFFFFFF7 defekter Cluster 0xFF8-0xFFF 0xFFF8-0xFFFF 0xFFFFFF8-0xFFFFFFF
letzter Cluster einer Datei xxx xxxx xxxxxxxx nächster Cluster einer Datei Beim FAT32 Format sind die oberen 4 Bits aller Einträge reserviert.
Beim FAT12 Format sind die Einträge nach folgendem Format angeordnet.
Offset Funktion n*3 -1 ... n*3 +0 Gerader Eintrag Bits 0-7 n*3 +1 Gerader Eintrag Bits 8-11 (low), Ungerader Eintrag Bits 0-3 (high) n*3 +2 Ungerader Eintrag Bits 4-11 n*3 +3 ... Bei FAT16 ist jeder Eintrag ein 2 Byte WORD (little Endian), bei FAT32 ist jeder Eintrag ein 4 Byte DWORD (little Endian). Die FAT-Sektoren beginnen nach dem Bootsektor genau um die Anzahl der reservierten Sektoren später (Offset 0x0E im Boot Sektor). Die Anzahl der FAT-Sektoren berechnet sich nach folgendem Schema:
FAT_Sektoren = Anzahl_der_FATs * Sektoren_je_FATNach dem FAT Sektoren kommen die Sektoren für das Root-Verzeichnis. Bei FAT32 gibt es kein Root-Verzeichnis sondern eine Cluster-Kette für das Verzeichnis. Die Größe der FAT-Einträge wird aus der Anzahl der Datensektoren berechnet:
Root_Verzeichnis_Sektoren = (Verzeichnis_Einträge*32+Byte_je_Sektoren-1) / Byte_je_Sektor Sektoren_Anzahl = Gesamt_Sektoren - Reservierte_Sektoren - FAT_Sektoren - Root_Verzeichnis_SektorenCluster_Anzahl = Sektoren_Anzahl / Sektoren_je_Cluster
FAT Type Cluster Anzahl... FAT12 ... kleiner 0xFF5 FAT16 ... kleiner 0xFFF5 FAT32 ... größer gleich 0xFFF5 Die Position des ersten Datensektors berechnet sich folgender Maßen:
Erster_Datensektor = Reservierte_Sektoren + FAT_Sektoren + Root_Verzeichnis_SektorenZum umrechnen einer Cluster-Nummer aus der FAT in eine Sektornummer kann man diese Formel verwenden:
Ssektor_Position = Erster_Datensektor + ( Cluster_Nummer - 2 ) * Sektoren_je_Cluster
Jedes Verzeichnis besteht aus 32 Byte großen Einträgen mit folgenden Aufbau:
Offset Größe Funktion 0x00 8 Byte Dateiname
Spezial Byte am Beginn:
0x00 = Letzter Verzeichniseintrag
0x05 = Das erste Byte ist das ASCII Zeichen 0xE5
0xE5 = Der Eintrag wurde gelöscht0x08 3 Byte Dateierweiterung 0x0B 1 Byte Attribute
Bit 0 = Schreibgeschützt
Bit 1 = Versteckt
Bit 2 = System
Bit 3 = Volume-Name
Bit 4 = Verzeichnis
Bit 5 = Archive
Bei LongFileName-Einträgen steht hier 0x0F0x0C 1 Byte Reserviert 0x0D 1 Byte Erstellungszeit 10tel Sekunde (0 bis 199) 0x0E 4 Byte Erstellungszeit
Bit 0-4 : Sekunden (immer mit 2 dividiert)
Bit 5-10 : Minute
Bit 11-15 : Stunde
Bit 16-20 : Tag
Bit 21-24 : Monat
Bit 25-31 : Jahre ab 19800x12 2 Byte Datum des letzen Zugriffs (unbenutzt)
Bit 0-4 : Tag
Bit 5-8 : Monat
Bit 9-15 : Jahre ab 19800x14 2 Byte Erster Cluster der Datei (high Word) nur für FAT32 0x16 4 Byte Zeit der letzen Änderung
Bit 0-4 : Sekunden (immer mit 2 dividiert)
Bit 5-10 : Minute
Bit 11-15 : Stunde
Bit 16-20 : Tag
Bit 21-24 : Monat
Bit 25-31 : Jahre ab 19800x1A 2 Byte Erster Cluster der Datei (low Word) 0x1C 4 Byte Größe der Datei in Byte Lange Dateinamen werden aus aufeinander folgenden spezial Einträgen zusammen gesetzt die diesen Aufbau haben:
Offset Größe Funktion 0x00 1 Byte Ordinal-Nummer
Bit 0-5 = Nummer (von n bis 1)
Bit 6 = Erster Eintrag0x01 10 Byte Die ersten 5 Namenszeichen (Unicode) 0x0B 1 Byte immer 0x0F 0x0C 1 Byte immer 0 0x0D 1 Byte Checksumme vom kurzen Dateinamen 0x0E 12 Byte Die nächsten 6 Namenszeichen (Unicode) 0x1A 2 Byte immer 0 0x1C 4 Byte Die nächsten 2 Namenszeichen (Unicode) Die Checksumme für den lange Dateinamen wird aus dem kurzen Dateinamen berechnet:
for(cs=0,i=0;i<11;i++) cs=(cs<<7)+(cs>>1)+name[i];Ein langer Dateiname wird immer vor einen kurzen Dateinamen gespeichert. Er wird aus einem oder mehreren spezial Einträgen zusammengesetzt. Beim ersten Eintrag wird die Ordinal-Nummer auf die Anzahl der Einträge gesetzt, und das 6.te Bit auf eins gesetzt. Jeder Eintrag enthält 13 Buchstaben im Unicode-Format. Der Dateiname wird dabei von hinten nach vorn zusammen gesetzt. Das heißt im ersten Eintrag stehen die letzen 13 Buchstaben des Namens. Wenn die Checksumme nicht mehr mit der des kurzen Dateinamens übereinstimmt, so ist der lange Dateiname ungültig.
Beim FAT32 Format kann ein Infosektor der Partition hinzugefügt werden. Dieser hat folgenden Aufbau:
Offset Größe Funktion 0x000 4 Byte Signatur 1 (immer 0x41615252) 0x004 480 Byte reserviert 0x1E4 4 Byte Signatur 2 (immer 0x61417272) 0x1E8 4 Byte Anzahl der freien Cluster 0x1EC 4 Byte Position des nächsten freien Clusters 0x1F0 12 Byte reserviert 0x1FC 4 Byte Signatur 3 (immer 0xAA550000) Die Position des Infosektors wird relativ zum Anfang der Partition berechnet.