Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   [erledigt ] Floppy Sector-weise auslesen (https://www.delphipraxis.net/174252-%5Berledigt-%5D-floppy-sector-weise-auslesen.html)

thomasschaf 11. Apr 2013 21:20


[erledigt ] Floppy Sector-weise auslesen
 
Hallo,

hier wird beschrieben, wie man ReadFile zum Lesen von einer Diskette im Raw-Format benutzt.

Als dritter Paramter von ReadFile wird ja erwartet, wie viele Bytes gelesen werden sollen
(bei Disketten ja nur ein Vielfaches der zahl Bytes/Sector, weil dann immer ganze Sektoren ausgelesen werden).

Mein Problem ist nun:
Habe mehrere (3) ältere Disketten, die alle exakt den gleichen Inhalt haben. (Sie wurden raw-kopiert.)
Ich möchte die Daten von ihnen sichern. Allerdings sind alle an irgendeiner Stelle nicht lesbar.
Ich vermute, dass es aufgrund des Alters dazu gekommen ist, dass ein oder mehrere Sektoren nicht mehr lesbar sind.

Nun will ich alle 2880 Sektoren einzeln auslesen. ( je Von allen Disketten)
Und die unbeschädigten zusammenfügen.

Leider kann ich bei ReadFile kein Anfang zum Lesen eingeben, nur eine Anzahl von Bytes. Sonst würde ich halt von 0 bis 511, dann von 512 bis 1023, dann von 1024 ... usw die Sektoren auslesen.

Hat da jemand eine Idee?

Vielen Dank

Uwe Raabe 11. Apr 2013 22:04

AW: Floppy Sector-weise auslesen
 
Du kannst versuchen mit einem simplen FileStream auf die Diskette zuzugreifen. Dann steht dir mit Seek eine Möglichkeit zum Positionieren zur Verfügung.

Delphi-Quellcode:
fileStream := TFileStream.Create('\\.\A:', fmOpenRead);

thomasschaf 11. Apr 2013 22:11

AW: Floppy Sector-weise auslesen
 
Das Problem ist dann ja, dass ich nicht weiß, ob dieser Bereich korrupt ist.

Bei ReadFile kann ich aber den Rückgabewert anschauen.

Könnte man vielleicht mit "SetFilePointer" sowas machen?

Delphi-Quellcode:
    GetMem(buffer, 512); // genug Speicher FÜR EINEN SEKTOR reservieren
    SetFilePointer(fhandle, sec * 512, nil, FILE_BEGIN);
    if not ReadFile(fhandle, buffer^, 512, bytesread, nil)
      then // [konnte Sektor "sec" nicht auslesen... ]
Leider ist das noch recht neu für mich,
habe hier (zwar C++) Zeile 60 etwas gefunden.
Delphi-Quellcode:
 // Setting the pointer to point to the start of the sector we want to read ..
SetFilePointer (hDevice, (startinglogicalsector*512), NULL, FILE_BEGIN);

Uwe Raabe 11. Apr 2013 22:44

AW: Floppy Sector-weise auslesen
 
Zitat:

Zitat von thomasschaf (Beitrag 1211193)
Das Problem ist dann ja, dass ich nicht weiß, ob dieser Bereich korrupt ist.

Wieso nicht? Der Stream liest genauso von der Diskette. Wenn das nicht möglich ist, bekommst du einen Fehler. Dann kannst du den Bereich überspringen.

thomasschaf 11. Apr 2013 22:51

AW: Floppy Sector-weise auslesen
 
Wie kann ich denn mit dem Stream an einer speziellen Stelle auf der Diskette von ihr lesen?
Wenn ich die ganze Diskette lese, kann ich nicht im Nachhinein herausfinden, ob der Bereich verfügbar ist.

Namenloser 11. Apr 2013 22:51

AW: Floppy Sector-weise auslesen
 
Außerdem, selbst wenn der Fehler still ignoriert wird, kannst du ja dadurch, dass alle drei Disketten den gleichen Inhalt haben, recht leicht rausfinden, welche Bytes korrekt sind, wenn immer nur höchstens eine Diskette an einer bestimmten Stelle einen Fehler hat.

thomasschaf 11. Apr 2013 22:53

AW: Floppy Sector-weise auslesen
 
Das ist eine gute Idee. Werde ich gleich ausprobierenm

Sir Rufo 11. Apr 2013 23:01

AW: Floppy Sector-weise auslesen
 
Zitat:

Zitat von NamenLozer (Beitrag 1211197)
Außerdem, selbst wenn der Fehler still ignoriert wird, kannst du ja dadurch, dass alle drei Disketten den gleichen Inhalt haben, recht leicht rausfinden, welche Bytes korrekt sind, wenn immer nur höchstens eine Diskette an einer bestimmten Stelle einen Fehler hat.

:thumb:

thomasschaf 11. Apr 2013 23:13

AW: Floppy Sector-weise auslesen
 
Die Idee ist wirklich sehr gut. Dann kann ich auch gleich die Diskette mit Winimage auslesen.
Für den automatischen Vergleich könnte ich dann ja ein Programm schreiben.

Vielen Dank für den Tipp!

Luckie 11. Apr 2013 23:24

AW: [erledigt ] Floppy Sector-weise auslesen
 
Guck mal hier: http://michael-puff.de/Programmierung/Delphi/Programme/ -> DiskImageNT.zip

Uwe Raabe 11. Apr 2013 23:35

AW: Floppy Sector-weise auslesen
 
Zitat:

Zitat von thomasschaf (Beitrag 1211196)
Wie kann ich denn mit dem Stream an einer speziellen Stelle auf der Diskette von ihr lesen?

Zitat:

Zitat von Uwe Raabe (Beitrag 1211192)
Dann steht dir mit Seek eine Möglichkeit zum Positionieren zur Verfügung.

Liest du eigentlich, was ich schreibe?

Codehunter 12. Apr 2013 09:11

AW: [erledigt ] Floppy Sector-weise auslesen
 
Ich möchte noch als Stichwort "ANTS TDirectDisk" in den Raum werfen. Kommt zwar aus dem Ostblock, funktioniert aber spitzenmäßig.

Habe ich vor Jahren mal benutzt um Floppies als Lizenzschlüssel zu verwenden. Ich habe einfach ein paar Dateien mit Randomdaten drauf gespeichert und die eigentlichen Lizenzdaten direkt sektorweise auf die Floppy geschrieben, ohne Datei "drumrum". Beim Auslesen habe ich diese Dateien auch mit gelesen und damit irgendwelche "wilden Geschichten" angestellt. Nur so um den Schein zu wahren ^^

An den vermeintlich verschlüsselten Dateien haben sich etliche Informatikstudenten monatelang die Zähne ausgebissen und kamen im Leben nicht auf die Idee, dass man Speichermedien auch ohne Dateisystem benutzen kann. Typischer Fall von "Modern Brain vs. Oldschool Programming".


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz