File Allocation Table — Änderungen 10291 → 10436

Zeile 52: Zeile 52:
 
| 0x0E  || 2    || Anzahl reservierter Sektoren inkl. Bootsektor.
 
| 0x0E  || 2    || Anzahl reservierter Sektoren inkl. Bootsektor.
 
|-
 
|-
−
| 0x10  || 1    || Anzahl an File Allocation Tables. Normal gibt es immer 2 FATs
+
| 0x10  || 1    || Anzahl an File Allocation Tables. Normal gibt es immer 2 FATs, man kann zwar auch ein Laufwerk mit nur einer FAT anlegen (DOS, Windows und Linux können damit umgehen) aber sehr viele Tools haben damit Probleme so das man davon grundsätzlich absehen sollte.
 
|-
 
|-
 
| 0x11  || 2    || Maximale Anzahl an Einträgen im Wurzelverzeichnis (nur gültig für FAT12 und FAT16)
 
| 0x11  || 2    || Maximale Anzahl an Einträgen im Wurzelverzeichnis (nur gültig für FAT12 und FAT16)
Zeile 122: Zeile 122:
 
| 0x2A  || 2    || FAT32-Version. Üblicherweise 0 - andernfalls kann es sein, dass die Partition von Windows nicht gemounted wird.
 
| 0x2A  || 2    || FAT32-Version. Üblicherweise 0 - andernfalls kann es sein, dass die Partition von Windows nicht gemounted wird.
 
|-
 
|-
−
| 0x2C  || 4    || Erster Cluster des Wurzelverzeichnis
+
| 0x2C  || 4    || Erster Cluster des Wurzelverzeichnis, muss immer eine gültige Cluster-Nummer enthalten.
 
|-
 
|-
 
| 0x30  || 2    || Info-Sektor. Sektor der Informationen über das Dateisystem enthält.
 
| 0x30  || 2    || Info-Sektor. Sektor der Informationen über das Dateisystem enthält.
Zeile 174: Zeile 174:
 
Bei einem normalen Cluster in einer Clusterkette gibt der Wert in der FAT die Nummer des nächsten Clusters an. Man muss also den Wert aus der FAT nehmen und ihn als neuen Index für die FAT benutzen. Wenn man auf die eigentlichen Daten zugreifen will, muss man vorher 2 subtrahieren, weil die Cluster 0 und 1 nicht im Datenbereich existieren (der Datenbereich ist quasi ein Array aus Clustern das mit Index 2 anfängt wogegen die FAT ein Array aus Cluster-Nummern ist das mit Index 0 anfängt).
 
Bei einem normalen Cluster in einer Clusterkette gibt der Wert in der FAT die Nummer des nächsten Clusters an. Man muss also den Wert aus der FAT nehmen und ihn als neuen Index für die FAT benutzen. Wenn man auf die eigentlichen Daten zugreifen will, muss man vorher 2 subtrahieren, weil die Cluster 0 und 1 nicht im Datenbereich existieren (der Datenbereich ist quasi ein Array aus Clustern das mit Index 2 anfängt wogegen die FAT ein Array aus Cluster-Nummern ist das mit Index 0 anfängt).
  
−
Die verbotenen Cluster-Nummern dürfen weder in der FAT selber noch in den Verzeichniseinträgen benutzt werden. Die Cluster-Nummer 0 darf in Verzeichiseinträgen nur verwendet werden wenn die betreffende Datei eine Größe von 0 hat (also keine Cluster für Nutzdaten benötigt) und in der FAT kennzeichnet die Cluster-Nummer 0 freie Cluster. Die Einträge 0 und 1 in der FAT werden für unbekannte Zwecke benutzt (die Tools von Microsoft verlangen die aber) und sollten daher nicht verändert werden.
+
Die verbotenen Cluster-Nummern dürfen weder in der FAT selber noch in den Verzeichniseinträgen benutzt werden. Die Cluster-Nummer 0 darf in Verzeichiseinträgen nur verwendet werden wenn die betreffende Datei eine Größe von 0 hat (also keine Cluster für Nutzdaten benötigt) und in der FAT kennzeichnet die Cluster-Nummer 0 freie Cluster. Die Einträge 0 und 1 in der FAT werden u.a. dafür benutzt um zu kennzeichnen ob das Laufwerk ordentlich entmounted wurde oder ob mal Fehler beim Zugriff auf physische Sektoren aufgetreten sind. Für simple FAT-Treiber ist es empfehlenswert diese Werte zu ignorieren und nicht zu verändern.
  
 
=== Wurzelverzeichnis ===
 
=== Wurzelverzeichnis ===
Zeile 183: Zeile 183:
 
=== Datei- und Verzeichnis-Datenregion ===
 
=== Datei- und Verzeichnis-Datenregion ===
 
In der Datei- und Verzeichnis-Datenregion liegen die Datei- und Verzeichnis-Daten. Diese sind in Cluster verteilt. Um eine Datei Clustern zuzuordnen benutzt man die FAT.
 
In der Datei- und Verzeichnis-Datenregion liegen die Datei- und Verzeichnis-Daten. Diese sind in Cluster verteilt. Um eine Datei Clustern zuzuordnen benutzt man die FAT.
 +
 +
== Verzeichnisse ==
 +
Ein Verzeichnis ist erst mal ebenfalls nur eine Datei die aber einen speziellen Inhalt, die Verzeichniseinträge, hat. Ein Verzeichnis ist immer ein Array aus Verzeichniseinträgen. Ein Verzeichnis muss immer mindestens einen Cluster belegen da jedes Verzeichnis, außer das Wurzelverzeichnis, die Einträge "." und ".." als erstes enthalten muss. Der Eintrag "." zeigt auf das Verzeichnis selber (also auf den ersten Cluster) und der Eintrag ".." zeigt auf das übergeordnete Verzeichnis (wenn dass das Wurzelverzeichnis ist dann muss bei FAT12 und FAT16 hier die Cluster-Nummer 0 benutzt werden). Ein Verzeichnis darf auch mehr als einen Cluster benutzen, wenn mehr Verzeichniseinträge benötigt werden als ein Cluster ermöglicht. Ein Verzeichniseintrag kann gültig, gelöscht oder ungültig sein. Sobald ein ungültiger Verzeichniseintrag vorkommt müssen alle nachfolgenden Einträge ebenfalls ignoriert werden, das hat den Grund das normalerweise nur die tatsächlich benötigte Anzahl an Sektoren geschrieben wird und demzufolge weiter hinten kommende Sektoren in einem Verzeichnis-Cluster auch irgendwelche (Zufalls-)Daten enthalten dürfen. Zu Zeiten wo Speicher knapp war und Schreibzugriffe sehr lange dauerten war das wichtig, bei heutigen FAT-Treibern ist es aber empfehlenswert wenn immer ganze Cluster geschrieben werden und alle ungültigen Verzeichniseinträge (hinter den gültigen und gelöschten Einträgen) komplett mit 0x00 ausgefüllt werden. Die gültigen und gelöschten Verzeichniseinträge können beliebig gemischt vorkommen und es müssen auch alle gültigen Einträge beachtet werden. Beim Anlegen von neuen Dateien/Unterverzeichnissen dürfen die gelöschten Einträge wieder benutzt werden, aber Windows und Linux hängen lieber hinten an um einer möglichen Wiederherstellen gelöschter Dateien möglichst nicht im Wege zu stehen.
  
 
== Verzeichnis-Eintrag ==
 
== Verzeichnis-Eintrag ==
Zeile 190: Zeile 193:
 
! Offset || Größe || Beschreibung
 
! Offset || Größe || Beschreibung
 
|-
 
|-
−
| 0x00  || 8    || Dateiname ohne Erweiterung (mit Leerzeichen aufgefüllt). Der Dateiname darf nur aus Großbuchstaben bestehen und darf folgende Zeichen nicht enthalten: 0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x5D, 0x7C.
+
| 0x00  || 8    || Dateiname ohne Erweiterung (mit Leerzeichen aufgefüllt). Der Dateiname darf nur aus Großbuchstaben bestehen und darf folgende Zeichen nicht enthalten: 0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x5D, 0x7C.<br />Wenn das erste Byte 0xE5 ist gilt dieser Eintrag als gelöscht und wird ignoriert aber es können noch weitere Einträge kommen. Wenn das erste Byte 0x00 ist gilt dieser Eintrag als unbenutzt und es kommen auch keine weiteren Einträge in diesem Verzeichnis mehr bzw. alle folgenden Bytes müssen ignoriert werden.
 
|-
 
|-
 
| 0x08  || 3    || Dateierweiterung (mit Leerzeichen aufgefüllt). Erlaubte Zeichen siehe Dateiname.
 
| 0x08  || 3    || Dateierweiterung (mit Leerzeichen aufgefüllt). Erlaubte Zeichen siehe Dateiname.
Zeile 273: Zeile 276:
  
 
|-
 
|-
−
| 0x1A  || 2    || Erster Cluster<br />(Beim Zugriff auf die eigentlichen Daten muss man vorher 2 subtrahieren, da es im Datenbereich die Cluster 0 und 1 nicht gibt. In der FAT gibt es aber die Einträge 0 und 1, so dass dort diese Nummer unverändert benutzt werden muss um zu erfahren welches der nächste Cluster ist.<br />Gültige Werte sind 0 wenn die Datei keine Daten enthält also keine Clusterkette benötigt wird und &ge;2 wenn doch eine Clusterkette benötigt wird.)
+
| 0x1A  || 2    || Erster Cluster<br />(Beim Zugriff auf die eigentlichen Daten muss man vorher 2 subtrahieren, da es im Datenbereich die Cluster 0 und 1 nicht gibt. In der FAT gibt es aber die Einträge 0 und 1, so dass dort diese Nummer unverändert benutzt werden muss um zu erfahren welches der nächste Cluster ist.<br />Gültige Werte sind 0 wenn die Datei (nicht Verzeichnis) keine Daten enthält also keine Clusterkette benötigt wird und &ge;2 wenn doch eine Clusterkette benötigt wird.)
 
|-
 
|-
−
| 0x1C  || 4    || Dateigröße in Bytes
+
| 0x1C  || 4    || Dateigröße in Bytes, für Verzeichnisse immer 0
 
|}
 
|}