FAT16 Hilfe

Diskutiere FAT16 Hilfe im Developer Network Forum im Bereich Hardware & Software Forum; Hi, ich schreibe gerade an einem Programm, was mir Daten einer SD Karte liefert, also die Rohdaten im FAT16 Format. Ich weiß, wie ich zum Anfang...
  • FAT16 Hilfe Beitrag #1
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Hi, ich schreibe gerade an einem Programm, was mir Daten einer SD Karte liefert, also die Rohdaten im FAT16 Format.
Ich weiß, wie ich zum Anfang des RootVerzeichnisses komme, dass jeder Eintrag 32 Byte lang ist und an der Stelle 26/27 jedes Eintrages eine neue Adresse steht.
Leider kriege ich es einfach nicht hin, mich anhand dieser Adressen durch die Ordner zu hangeln und die Datein darin aufzulisten.
Kann mir jemand genau erklären, von wo und wie dieses Offset des Eintrags gerechnet wird?

MfG
Anno1989
 
  • FAT16 Hilfe Beitrag #2
the_viper

the_viper

Bekanntes Mitglied
Dabei seit
27.11.2000
Beiträge
1.977
Reaktionspunkte
0
willst du dich also rekursiv durch die unterordner hangeln?
dann müsstest du einen binären baum abbilden, und diesen zweig für zweig abwärts abarbeiten.
die unterverzeichnisse sind nichts anders als dateien, die ein "directory" flag haben, siehe doku. öffnest du diese "dateien" hast du die gleichen strukturen wie der hauptordner, die du analysieren und dementsprechend auswerten musst.
du brauchst also eine funktion , die ein datenpaket bekommt, was strukturen eines verzeichnisses enthält, die dir also ein array mit dateidaten und deren FAT tabelleneinträgen liefert. die "directory" einträge musst du dementsprechend als datei öffnen, und den inhalt wieder zu dieser funktion schicken, die dir die dateidaten des unterverzeichnisses liefert.

wirst du aber niemals lange dateinamen benutzen so wie windows? weil dann musst du VFAT berücksichtigen, was hinter dem FAT16 eintrag ein VFAT eintrag mit langen dateinamen anfügt.
 
  • FAT16 Hilfe Beitrag #4
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
@the_viper: Ja ich habe bereits eine solche rekursive Funktion geschrieben, die mir Ordner auflistet, leider aber nicht die Dateien.
Mein Problem ist eher, die Position an Stelle 26/27, wie wird die verrechnet?
Relativ zur StartPosition oder relativ zum momentanen Eintrag, weil je nachdem wie ich das auswerte kriege ich entweder nur Ordner oder Entweder nur den Root Ordner und Dateien in dne Unterordnern aber ohne Unterordner, deswegen, mag zufall sein, aber bin gerade etwas verwirrt.
@UnimatrixZero: Danke, habe zwar schon die Wikipedia Artikel dazu gelesen und schaffe es auch den Bootsektor über meine Klasse richtig auszulesen, aber siehe oben ist es momentan etwas verwirrend, wie ich weiter springen muss.
Ich sehe mir die Links nochmal an, vielleicht habe ich irgendwas übersehen.

Danke für euere Hilfe schonmal.
 
  • FAT16 Hilfe Beitrag #5
the_viper

the_viper

Bekanntes Mitglied
Dabei seit
27.11.2000
Beiträge
1.977
Reaktionspunkte
0
der erste link von unimatrixzero ist das schon zimelich gut:

0x1A 2 Byte Erster Cluster der Datei (low Word)
hast du berücksichtigt das low-und high byte vertauscht sind?

du erhälst den ersten cluster in der FAT, wo du dann springen musst, in dieser spalte in der FAT steht der nächste cluster zum auslesen usw usw. diese clusterkette musst du zwischenspeichern und dann damit die echten cluster auf dem laufwerk auslesen.
im link ist wunderbar unter FAT beschrieben wie man die berechnen kann, ohne viel kopfzerbrechen, wenn man sich die laufwerksnfo holt und berücksichtigt.

ich empfehle dir irgendwoher den uralten MS-DOS norton dosk doctor zu holen, der zeigt dir alles mögliche auf laufwerken an, inkl. FAT tabelle, cluster sektoren, usw.
damit kannst du wunderbar an einer echten FAT16 oder FAT32 schauen, wie der aufbau funktioniert. (und manchmal mit dem kopf schütteln...)
 
  • FAT16 Hilfe Beitrag #6
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Nein, habe ich nicht berücksichtig glaube ich. ;)
Ja ich arbeite parallel mit dem Hexeditor, weil die FAT Daten habe ich darin im Überblick. Habe zuerst mit dem HExeditor die relevanten Infos aus dem BPB gesucht und dann die stellen berechnet.
Mhh.
Ich glaube dann habe ich da noch etwas nicht ganz verstanden. Das low word bedeutet genau was?
Ich lese das momentan so ein:
Code:
int t_newFileOffset = 0;
unsigned char ts_offset[4];
ts_offset[0] = ts_block[t_offsetNewStartCluster+1];   //t_offsetNewStartCluster ist hierbei 26
ts_offset[1] = ts_block[t_offsetNewStartCluster];
ts_offset[2] = '\0';
ts_offset[3] = '\0';
memcpy(&t_newFileOffset, ts_offset, 4);

//Danach dann folgendes um das neue Offset zu bekommen
t_newFileOffset*= getSectorsPerCluster();
t_newFileOffset+= getRootDirectoryStart();
//Und mir der Adresse rufe ich die Funktion wieder auf. Stimmt das bis hier hin, weil ich bekomme komische Ordnernamen angezeigt.
Also ich habe das nun so verstanden.
Es gibt Cluster, darin befinden sich Sektoren und die Sektoren haben eine bestimmte Größe in Bytes, so richtig?
 
Zuletzt bearbeitet:
  • FAT16 Hilfe Beitrag #7
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
So, ich habe das mit den Langen Dateinamen verstanden, leider immer noch nicht, wie ich mich durch die Verzeichnis Struktur hangeln kann.
Wenn ich die Position eines Verzeichnis Eintrages ermittelt habe. Wie komme ich da an die Unterverzeichnisse.
Und wie komme ich aus einem Ordner an die darin enthaltenen Dateien.
Rechne ich die Position immer wieder von der StartPosition der RootDirectory aus oder muss ich die Position, wo sich der neue Verzeichnis Eintrag befindet irgendwo nachsehen?:confused:
Ebenso kriege ich die Unterverzeichnisse irgendwie nur 1 unter de, Root Verzeichnis, also nur Root und Unterordner, weil sich dann plötzlich irgendwas an der Adressierung ändert. -.-
 
Zuletzt bearbeitet:
  • FAT16 Hilfe Beitrag #8
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Zu jedem Verzeichniseintrag ist vermerkt, ab welchem Cluster die Daten stehen. Also der Dateiinhalt. Und wenn es sich dabei um ein Verzeichnis handelt (ist auch im Eintrag vermerkt), dann ist der Dateiinhalt ein weiteres Verzeichnis.
Wie viele und welche Cluster Du lesen mußt, steht dann in der FAT. Im Verzeichniseintrag ist nur der erste Cluster vermerkt.
 
  • FAT16 Hilfe Beitrag #9
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Okay, sprich, ich lese aus dem Root Verzeichnis die Adresse des ersten Ordners aus und gucke ob es sich um ein Verzeichnis handelt.
Täusche ich mich, oder gibt es lediglich ein Flag, ob es sich um ein Verzeichnis handelt, aber keins ob es sich um eine Datei handelt?
Wie gucke ich dann in der FAT nach?
Hast du da eine Formel, weil irgendwie komme ich nicht zu den weiteren Unterordnern...
 
  • FAT16 Hilfe Beitrag #10
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Richtig. Wenn das Flag für das Directory gesetzt ist, dann ist es eins ;-)
Desweiteren findest Du dort auch den ersten Cluster (Hi und Low beachten). Dann schaust Du in die FAT, ob Du noch weitere Cluster lesen mußt. Die FAT ist sozusagen eine verkettete Liste. Wie der Cluster-Eintrag aufgeschlüsselt wird, findest Du bei meinem ersten Link.

Hast Du alle Cluster beisammen, dann arbeitest Du den Inhalt genauso ab, wie das Root.
 
  • FAT16 Hilfe Beitrag #11
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Ich weiß nun, wie ich die ganzen Werte ermittel, aber ich verstehe nicht, wie ich an die wirklichen Daten über die FAT komme...
 
  • FAT16 Hilfe Beitrag #12
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Die FAT ist sozusagen ein Array aus DWORDs (FAT32), Im Verzeichniseintrag steht der Start-Cluster des Dateiinhalts. Damit hast Du schon mal den ersten Cluster.
Die Cluster-Nr. ist gleichzeitig der Index für die FAT. Du schaust also nach, was an fat[cluster] steht. Da gibt es ein paar Spezial-Einträge (siehe Link). Oder Du findest dort den nächsten Cluster der Datei. Usw.
 
  • FAT16 Hilfe Beitrag #13
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Achso, sprich:
- Anfang der ersten FAT suchen
- Anfang des Root verzeichnisses suchen
- Einträge im rootverzeichnis die zwei Bytes bei (ich glaube der Adresse 26 waren es) auslesen und das ist dann meine Clusternummer?

Momentan habe ich folgendes:
- Sektoren pro FAT: 246
- Anzahl der FATs. 2
- Bytes je Sektor: 512
- Sektoren pro Cluster 32

Bedeutet also dass ein Cluster
ClusterGröße = SektorenProCluster * Bytes je Sektor = 32*512 = 16.384 Bytes.

So. Nuh guck ich also den ersten Verzeichnis Eintrag im root Verzeichnis durch. Sehe dabei die Nummer 2.
Bedeutet das nun also, dass ich nun diese Nummer als nehme und direkt in der ersten FAT nachsehe, die bei mir direkt nach dem BootSektor, also nach 512 beginnt?
 
  • FAT16 Hilfe Beitrag #14
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Achso, sprich:
- Anfang der ersten FAT suchen
- Anfang des Root verzeichnisses suchen
- Einträge im rootverzeichnis die zwei Bytes bei (ich glaube der Adresse 26 waren es) auslesen und das ist dann meine Clusternummer?
Nicht ganz. Bei FAT32 ist die Clusternummer 32 Bit breit. Da gibt es noch 2 weitere Bytes, die dann zusammen mit diesen die Nummer ergeben.

Momentan habe ich folgendes:
- Sektoren pro FAT: 246
- Anzahl der FATs. 2
- Bytes je Sektor: 512
- Sektoren pro Cluster 32

Bedeutet also dass ein Cluster
ClusterGröße = SektorenProCluster * Bytes je Sektor = 32*512 = 16.384 Bytes.

So. Nuh guck ich also den ersten Verzeichnis Eintrag im root Verzeichnis durch. Sehe dabei die Nummer 2.
Bedeutet das nun also, dass ich nun diese Nummer als nehme und direkt in der ersten FAT nachsehe, die bei mir direkt nach dem BootSektor, also nach 512 beginnt?
Der Cluster 2 enthält die ersten 16 kb. Dann schaust Du in die FAT, was am Index 2 steht. Dort findest Du entweder die Nummer des nächsten Clusters, oder eine Info, daß es der letzte Cluster ist.
 
  • FAT16 Hilfe Beitrag #15
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Gut, aber bei FAT16 sind es 2 Byte.
Also die FAT beginnt bei mir in dem Falle direkt nach 512, nach:
AA F8 FF FF FF FF FF FF FF
So nuh steht danach dann folgendes:
05 00 06 00 07 00 08 00
Also nach wie vor zeigt der erste Ordner im root Verzeichnis mit den Bytes 26 und 27 (02 00) auf den Index 2. In dem Falle somit 07 00 oder? Weil in deinem Link sind es auch immer 2 Byte.
Sprich das wäre doch dann Nummero 7 oder?
Nur ich komme doch von da aus gar nicht zu meinem Unterordner.
Das Root Verzeichnis beginnt bei 252416, der erste Unterordner ist bei 268800 aufgeführt. Also genau eine Cluster Größe, die ich ja auf 16384 Byte berechnet habe, nicht aber auf 2 Clustergrößen, wie die Bytes des ersten Eintrages im Root Verzeichnisses es besagen.
Denn 2 Cluster nach Begin des Root Verzeichnisses kommt direkt die Auflistung des Unterordners bei 268800, sprich meine Auflistung ergibt den ersten Ordner im root Verzeichnis und als enthaltene Dateien werden mir direkt die Dateien einen Unterordner wieter angezeigt, nicht aber dieser Unterordner selbst zuerst und dann die Dateien.
Ich verstehe nciht, wie ich mich jetzt durch den VerzeichnisBaum hangeln muss.
Tut mir leid...
 
  • FAT16 Hilfe Beitrag #16
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Okay, ich glaube ich komme so langsam dahinter.
Ich weiß nun, wie ich die FAT zu lesen habe, um die Dateien die auf dem Datenträger liegen zusammen zu bauen.
Ebenso weiß ich nun, wie die Root Directory auszulesen ist.
Nur, mein Problem ist.
Der erste Datencluster beginnt ja bereits nach der Root Directory, da die RootDirectory bei FAT16 ja nur 512 Einträge maximal haben darf also eine Cluster Größe nach dem Beginn der RootDirectory oder?
So.
Wenn ich nun die FAT durchgehe und die benutzten Cluster aussortiere komme ich leider nur an die Dateien, die sich auf dem Datenträger befinden.
Die FAT beginnt ja mit dem Media Desktriptor.
Daraufhin folgen bei mir 6 Bytes mit FF. Dann erst beginnen die Clustereinträge für die erste Datei.
Ich weiß nun also, wie ich die Dateien auf dem Datenträger zusammen bauen kann.
Leider weiß ich immer noch nicht, wie ich an die Unterordner komme, die einen Cluster hinter dem Rootverzeichnis liegen.
Also:

Der Anfang der FAT sieht so aus:
F8FF FFFF FFFF FFFF 0500 0600 0700 0800 usw.
Sprich ab Index 4 geht es erst los.

Der Aufbau ab dem Rootverzeichnis ist so:
RootCluster | Datencluster mit den Unterordnern | Erster Cluster der Datei

Mein Problem ist aber, dass jede Subdirectory eben mit dem 2. Verzeichniseintrag auf ihre ParentDirectory zeigt ".." aber ich nicht weiß, wo ich ansetzen muss, um von einer ParentDirectory zu den Subs zu kommen.

Im Rootverzeichnis befindet sich nur ein Ordner, der zeigt auf den Index 2, also FFFF. Damit komme ich also nicht weiter, logisch.
Wenn ich dann mal bei den entsprechenden Unterordnern gucke, auf was der erste Eintrag mit dem Namen "." zeigt, sehe ich auf Index3, leider ist der Immernoch FFFF.
Der Cluster nach dem Rootverzeichnis sieht also quasi so aus:
. - Zeigt auf Cluster 2 (Hier sind die Dateien aufgelistet)
.. - Zeigt auf Cluster 0 (logisch, Root)
Unterordername - Zeigt auf Cluster 3 (Keine Ahnung, was mir das sagen soll, ist ja FFFF).

Kann ich also davon ausgehen, dass die Unterordner alle direkt nach dem Rootverzeichnis beginnen? Wohl eher nicht
Nur wie kann ich die den entsprechenden Rootordnern, bzw. auch ParentOrdnern zuweisen?
 
  • FAT16 Hilfe Beitrag #17
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Im Rootverzeichnis befindet sich nur ein Ordner, der zeigt auf den Index 2, also FFFF. Damit komme ich also nicht weiter, logisch.
Wenn ich dann mal bei den entsprechenden Unterordnern gucke, auf was der erste Eintrag mit dem Namen "." zeigt, sehe ich auf Index3, leider ist der Immernoch FFFF.
Der Cluster nach dem Rootverzeichnis sieht also quasi so aus:
. - Zeigt auf Cluster 2 (Hier sind die Dateien aufgelistet)
.. - Zeigt auf Cluster 0 (logisch, Root)
Unterordername - Zeigt auf Cluster 3 (Keine Ahnung, was mir das sagen soll, ist ja FFFF).
Wenn da ein Verweis auf Cluster 2 steht, dann schaust Du in die FAT an Index 2. Steht da eine 0 oder 0xFFF7, dann ist was schiefgelaufen. Steht da eine Zahl > 0xFFF7, dann ist der Cluster 2 der einzige Cluster mit den Daten oder im Falle eines Verzeichnisses eben den Verzeichniseinträgen.
Steht da eine Zahl < 0xFFF0, dann ist die Datei/das Verzeichnis größer als ein Cluster und die Zahl ist die nächste Clusternummer. Usw.
 
  • FAT16 Hilfe Beitrag #18
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Okay, danke, das habe ich soweit nun hinbekommen.
Ich erstelle zuerst einmal eine Grobe Map der FAT.
Dann habe ich eine Klasse, die einen Cluster verwaltet und erstelle für jeden Datenhaltigen Cluster eine solche Klasse und verwalte sie.
Ich kriege nun die Cluster mit enthaltenen Verzeichnissen und Dateien angezeigt.
Dabei bekomme ich (optional) auch die gelöschten Dateien angezeigt, aus denen ich nun wählen will, welche wieder herzustellen sind.
Mein Problem ist nun, der Verzeichnis Eintrag wird ja nur im ersten Zeichen überschrieben mit 0xE5, die Adresse zum Cluster in der FAT steht noch, nur dass dieser Cluster nach dem löschen in der FAT und seine folge Cluster ja mit 0x0000 überschrieben wurden, leider auch in der FAT Kopie.
Sprich was mir nun einfällt:

1. Ich überschreibe das erste Zeichen des Eintrages, gucke nach auf welche cluster der verwiesen hat und überschreibe dann die leeren Einträge sinnvoll mit ihren Folgeeinträgen.
Problem(?): Es kann auch dazu kommen, dass die Cluster verstreut waren oder?^^

2. Ich lese einfach direkt die Datencluster aus und bastel die zusammen zu einer Datei, wobei ich mich da dann eben mit den Zusatzinfos der Dateiselber rumschlagen muss, ehe ich an die Datenmenge von einem JPG oder AVI File komme oder?

Was würdest du / ihr meinen, wie ich die verlorenen Dateien wieder herstellen sollte?
Bei Textdateien wäre das ja kein Problem, einfach die gesamten Cluster mit 0x0000 auslesen und gucken, was so drin steht und vielleicht nachher wieder zusammen bauen. Um an verlorene Daten zu kommen sicher gut, da man zumindest Bruchstücke retten kann, nur bei Bildern und Videos eher schwierig oder?
 
Thema:

FAT16 Hilfe

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben