Abenteuer mit Laufwerk A:

Endlich, nach vielen Jahren (ähm schon fast Jahrzehnten), sind es Disketten, die mir bei einer wichtigen Problemstellung helfen konnten:

Wie simuliert man Datenträgerfehler?

Alte Disketten aus den vor-2000ern haben dieses “Feature” inzwischen häufig integriert, also ab ins USB-Laufwerk und los…


vBinCopy ist aktuell mein liebstes GATE-Referenzprojekt, weil es nicht nur wichtige Features des Frameworks nutzt und abtestet, sondern weil es auch einen guten praktischen Nutzen hat:
Das Kopieren und Beschreiben von SD-Karten für SOC Geräte.

Aber was passiert eigentlich, wenn ein Sektor fehlerhaft ist?

Genau diesen Fall möchte ich schließlich auch abdecken, aber Festplattenfehler sind schwer zu simulieren.

Bei SD-Karten ist das auch mühsam, weil diese zwar gerne Daten verlieren, sich aber nicht als “fehlerhaft” beim OS anmelden.

Disketten hingegen kriegen leicht einen Kratzer ab und schon meldet das OS unterschiedlichste Fehlercodes, wenn ein Sektor nicht gelesen werden kann.

So kam also mein USB-Floppy-Disk-Drive wieder mal zum Einsatz, um das Verhalten beim Lesen und Schreiben von Disketten zu beobachten.

USB Floppy Drive

Folgende Erkenntnisse durfte ich dabei machen:

Festplatten haben im Windows Object-Manager einen Device-Eintrag z.B.: \Device\HarddiskN und dieser ist im globalen Namensraum dann mit \\.\PhysicalDriveN verlinkt und das ist der Pfad, den wir mit CreateFile auch öffnen können.

Floppy-Disk-Drives haben (meines Wissensstandes) einen solchen Eintrag nicht, man kann aber den Grätepfad, den man von der Setup-API bekommt ebenso mit CreateFile öffnen und dann direkt die Sektoren per ReadFile und WriteFile bearbeiten.

USB-Floppys sind in Linux “entfernbare” Festplatten

Dass sich mein USB-Floppy-Drive im sysfs und in /dev als sda meldet hat mich schon etwas überrascht. Zwar kann ich das gerade nicht nachprüfen, aber ich erinnere mich noch, dass früher die nativ verbauten Floppy-Controller als /dev/fdN ansprechbar waren um sich von den IDE Festplatten mit /dev/hdX zu unterscheiden.
/dev/sdX steht doch eigentlich für SCSI und/oder SATA … keine Ahnung warum sich das so abbildet.

However, open kann den Floppydisk Pfad problemlos ansprechen.

Ergebnisse

Nun, bei einem Lesefehler wird das wie erwartet bei ReadFile und read zurückgeliefert.

Um solche Sektoren zu umgehen, setzt man den Datenzeiger einfach auf die Startadresse des nächsten Sektors und versucht dort weiterzulesen. Den übersprungenen Sektor muss man eben durch Füllbytes repräsentieren.

Und schon hat man ein primitives Reparatur-Tool, das auch defekte Medien lesen kann und nicht einfach abbricht (was eine Tools leider machen).

Fazit

Ich freue mich mit vBinCopy ein kleines Tool zum binären Lesen, Schreiben und reparieren von Laufwerken, Partitionen und einfachen Dateien im Sortiment zu haben, das ausschließlich auf dem GATE Framework aufbaut.

Gespannt bin ich vor allem, ob die genutzte Implementierung auch auf älteren Windows Plattformen oder exotischen Unix-Derivaten anwendbar ist.

Die Zukunft wird es zeigen …

PS: Hier noch ein schöner Ausschnitt, der mich an vergangene Zeiten erinnert:

 1C:\Windows\system32>format a:
 2Legen Sie eine neue Diskette in Laufwerk A: ein,
 3und drücken Sie die EINGABETASTE.
 4Der Typ des Dateisystems ist RAW.
 5Das neue Dateisystem ist FAT.
 6Überprüfung von 1.44 MB
 7Die Dateizuordnungstabelle (FAT) wird initialisiert...
 8Volumebezeichnung (11 Zeichen, EINGABETASTE für keine)?
 9Formatieren beendet.
10       1,4 MB Speicherplatz auf dem Datenträger insgesamt.
11       1,4 MB sind verfügbar.
12
13          512 Bytes in jeder Zuordnungseinheit
14        2 847 Zuordnungseinheiten auf dem Datenträger verfügbar
15
16           12 Bits in jedem FAT-Datensatz.
17
18Volumeseriennummer : 4884-4783
19
20Weiteren Datenträger formatieren (J/N)?

Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!