Autor Thema: FAT oder nicht FAT... das ist hier die Frage...  (Gelesen 6251 mal)

BigOlly

  • Beiträge: 88
    • Profil anzeigen
Gespeichert
« am: 18. April 2004, 21:03 »
Ich hätte mal ne Frage an alle die sich hier mit dem FAT-Filesystem auskennen.

Im Vorgriff auf eine spätere Treiber-Entwicklung für meinen Kernel arbeite ich gerade an einer Dokumentation über das FAT-Filesystem.
TeeJay hat ja schon ein schönes Tutorial für FAT12 geschrieben. In meinem Doc beziehe ich auch FAT16, FAT32, lange Dateinamen usw. mit ein. Die Doc ist zwar erstmal für meine eigene Entwicklungs-Arbeit gedacht, wenn sie aber fertig ist und Euch auch interessiert stell ich sie natürlich gerne zur Verfügung.
Aber das nur nebenbei.

Nun zu meinem Problem:
Wie man FAT12,16 und 32 unterscheidet ist ja kein Problem und kein Geheimnis. Aber ich versuche gerade eine Strategie zu entwickeln wie man überhaupt erkennt das ein FAT-System auf dem Volume existiert.
Der Kernel der einen neuen Datenträger erkennt muss ja schliesslich wissen ob der FAT-Treiber dafür zuständig ist oder vielleicht ein ganz anderer Treiber, z.B. der NTFS-Treiber oder der BOFS-Treiber, oder welcher auch immer.
Mal davon abgesehen ob es clever ist das diese Erkennung der Kernel macht oder vielleicht irgend eine andere Service-Routiene, bleibt immer noch die Frage: FAT oder nicht FAT.

Meine Strategie wäre folgende:

1. BootSector einlesen
2. prüfen ob an Position 54-56 die Buchstaben "FAT" stehen. (BS_FileSysType)
      wenn JA dann FAT erkannt, wenn NEIN dann weiter prüfen
3. prüfen ob an Position 3-10 die Buchstaben "MSWIN4.1" stehen (BS_OEMName)
      wenn JA dann FAT erkannt, wenn NEIN dann weiter prüfen

*** bis hier hin sichere Erkennung, ab hier "Indizien-Erkennung" ***

4. indiz=0
5. prüfen ob an Position 11 das Word 200h steht (BPB_BytesPerSec=512)
      wenn ja inc(indiz)
6. prüfen ob an Position 16 das Byte 02h steht (BPB_NumFATs)  
      wenn ja inc(indiz)
7. prüfen ob an Position 21 ein Byte größer/gleich F0h steht (BPB_Media)  
      wenn ja inc(indiz)
8. prüfen ob an Position 36 der Byte-Wert 00h oder 80h steht (BS_DrvNum)  
      wenn ja inc(indiz)
9. prüfen ob an Position 38 das Byte 29h steht (BS_BootSig)  
      wenn ja inc(indiz)

10. wenn indiz größer/gleich 3 ist dann FAT erkannt, wenn nicht dann KEIN FAT FILESYSTEM !

****************
So Leute, das wäre meine Idee. Vielleicht bin ich ja auf dem Holzweg, und ihr habt eine bessere Idee ein FAT-System zu erkennen.

:)
====================================================
Zitat: "Es ist schwierig zu antworten, wenn man die Frage nicht versteht."
(würde mich ja mal interessieren ob jemand weiß woher dieser Satz stammt...)

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #1 am: 18. April 2004, 22:47 »
Also erst einmal: Auf das Tutorial freue ich mich schon!
Keine schlechte Idee, aber man könnte sich das mit den Indizen sparen. Ich würde, wenn überhaupt ein Dateisystem nur ins System einbinden, wenn das relativ sicher ist. Für den Notfall, kannst du ja immer noch eine --force Option implementieren. Dann wird das als FAt gemountet, egal ob es das jetzt ist, oder nicht!

kleiner

  • Beiträge: 131
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 18. April 2004, 22:51 »
Oder Du machst es wie Linux und Unix und lässt den User selbst mit entsprechenden Attributen mounten.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #3 am: 18. April 2004, 23:19 »
Eure Tips gehen glaub leider an der Frage vorbei.

Das was olly fragt ist garnicht so blöd. Also soweit ich das FAT-Doc von MS noch im Kopf habe ist alleine die Angabe "FAT" in BS_FileSysType kein eindeutiges Indiz dafür das das FAT verwendet wird.

Und MSWIN4.1 muss auch nicht immer da stehen :)

Deine Indizes sind teilweise auch nicht die beste Wahl.

1. BytesPerSector muss ja nicht 512 Bytes sein. Obwohl das noch halbwegs standard ist.

2. Die Anzahl der FAT-Tabellen muss nicht 2 sein. Ein gültiges FAT System kommt auch mit nur einer oder theoretisch sogar 255 aus :)

3. Das BPB_Media bezieht sich soweit ich weiß auf den Medientyp der bei FAT12 meist die Diskette (0xF0) ist. Bei einer HDD könnte das etwas anderes sein.

4. Die Drv-Num könnte ebenfalls anders als 0 oder 80 sein. Gibt ja Leute die haben mehrere Diskettenlaufwerke und Festplatten.

5. Die Boot-Sig gibt meines Wissens nur an ob die nachfolgenden 3 Einträge des BootInfoBlocks vorhanden sind.


Also es ist schon eine kniffelige Sache.
Auch wenn ich es in Frage gestellt hab, denk ich mal du kannst dich wohl noch am ehesten darauf verlassen das es ein FAT System ist, wenn "FAT xx"
in BS_FileSysType steht.


PS: Das mit dem FAT 16/32 und lange Dateinamen hatte ich erstmal weggelassen da ich das Tut nicht noch länger und komplizierter machen wollte. Aber da du das ja nun erledigst, muss ich ja nicht noch extra was nachlegen :)
----------------------
Redakteur bei LowLevel

BigOlly

  • Beiträge: 88
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 19. April 2004, 00:07 »
@chr15
Das mit den Indizien weglassen ist ja das Problem das auch die "sicherern" Merkmale nicht unbedingt vorhanden sein müssen.

@kleiner
Das mit der "User-Entscheidung" das dies jetzt als FAT gemountet werden soll kann ja zusätzlich noch möglich sein. Eine Automatische Erkennung wäre aber doch komfortabler.

@TeeJay
Deine Einwende sind rundum richtig. Aber gerade diese Unsicherheiten die Du aufgezählt hast soll ja meine "Erkennungs-Strategie" weitgehend ausräumen.

Ja, MSWIN4.1 muss nicht da stehen. Aber wenn es doch da steht, kann man doch davon ausgehen das es mit hoher Warscheinlichkeit ein FAT-System ist.

Ja, auch "FAT?????" muss nicht in BS_FileSysType stehen. Aber wenn die ersten drei Zeichen dort "FAT" lauten dann dürfte auch dies ein "sicheres" Zeichen dafür sein das es sich um FAT handelt.

Und eben deshalb weil MSWIN4.1 und FAT dort auch fehlen können und sicher oft auch fehlen werden, mach ich den zweiten Schritt und sage: Wenn ich FAT durch die beiden genannten Merkmalen nicht erkannt habe, dann kann ich nur noch eine Wahrscheinlichkeit "ermitteln" das es sich um ein FAT-System handelt.
Und dazu sammel ich eben 5 Indizien. Wenn nach der Prüfung nun mindestens 3 Indizien für ein FAT-System vorliegen dann ist es auch ziemlich warscheinlich das es ein FAT-System ist. Denn das ein anderes Filesystem genau an diesen Positionen genau solche Werte aufweist das drei Indizien erfüllt sind ist doch sehr unwahrscheinlich.

Selbstverständlich weiß ich das keine der geprüften Felder den erwarteten Wert aufweisen muss. Aber dann ist die automatische Erkennung halt gescheitert, auch wenn es doch ein FAT-System sein sollte.


Nochwas zu den einzelnen Indizien-Positionen: :)

"BytesPerSector muss ja nicht 512 Bytes sein. Obwohl das noch halbwegs standard ist."
Ja, deshalb nehm ich es ja nur als "Indiz" und nicht als Beweis.

"Die Anzahl der FAT-Tabellen muss nicht 2 sein. Ein gültiges FAT System kommt auch mit nur einer oder theoretisch sogar 255 aus"
Genau das selbe. Ich sag halt: "Wenn genau an dieser Position eine 2 steht, ist es ein Indiz dafür das es ein FAT sein könnte.

"Das BPB_Media bezieht sich soweit ich weiß auf den Medientyp der bei FAT12 meist die Diskette (0xF0) ist. Bei einer HDD könnte das etwas anderes sein"
Richtig, F0h ist es nur bei einer Diskette. Deshalb prüfe ich das Feld ja auf größer/gleich F0h. (Zitat Microsoft: Erlaubte Werte sind: F0h, F8h, F9h, FAh, FBh, FCh, FDh, FEh, FFh. Für Wechseldatenträger wird meist F0h verwendet.)

"Die Drv-Num könnte ebenfalls anders als 0 oder 80 sein. Gibt ja Leute die haben mehrere Diskettenlaufwerke und Festplatten."
Nun ja. Hiezu kann ich nichts wirklich kompetentes sagen, da dies das einzige Feld ist, welches ich nicht wirklich verstanden hab. Was ist zum Beispiel wenn auf einer Diskette hier eine 0 steht und ich lege sie in LW-B ein?
Aber egal was nun hier steht, wenn halt hier 0 oder 80h steht, ist es doch schon wieder ein Indiz für ein FAT-System.

"Die Boot-Sig gibt meines Wissens nur an ob die nachfolgenden 3 Einträge des BootInfoBlocks vorhanden sind."
Genau, eine andere Funktion hat laut Microsoft dieses Feld nicht (nur FAT12 und FAT16). Wenn aber nun hier an Position 36 tatsächlich eine 29h stehen sollte, ist es doch wieder ein guter "Hinweis" auf FAT.


Was ich damit sagen will:
Eine absolut sichere Erkennung ist nich möglich, das weis ich schon. Aber man kann doch nach Hinweisen (Indizien) suchen und sagen: "Falls ich mindestens so-und-so viele Hinweise finde, dann ist es wahrscheinlich FAT". :)

PS: Ich meine "Idizien" wie die Indizien vor Gericht, also ein stichhaltiger Hinweis, aber noch kein Beweis.
====================================================
Zitat: "Es ist schwierig zu antworten, wenn man die Frage nicht versteht."
(würde mich ja mal interessieren ob jemand weiß woher dieser Satz stammt...)

 

Einloggen