Entwickler-Ecke
Windows API - CreateFile für physikalischen Sektoren eines Datenträgers
GuaAck - Fr 05.05.23 23:43
Titel: CreateFile für physikalischen Sektoren eines Datenträgers
Hallo,
ich zeichne Messdaten mit einem Mikrocontroller (Arduino) auf SD-Karte auf. Leider kommt es dabei aus verschiedenen Gründen vor, dass Dateien nicht lesbar sind, z. B. auch, weil sie nicht abgeschlossen wurden. Die belegten Sektoren sind in der FAT eingetragen, aber im Inhaltsverzeichnis ist Länge=0 angegeben. Der Fehler ist mit einem üblichen Diskeditor leicht zu beheben, wenigstens, wenn es nur wenige Dateien auf der Karte gibt. Vorteilhaft ist, dass jede SD-Karte vor der Verwendung formatiert wird. Aber wenn es Hunderte von Dateien auf der Karte gibt, dann ist das Rekonstruieren schon einzelner Dateien dem Diskeditor so mühsam. dass ich es noch nicht gemacht habe. Aber der Algorithmus zur Wiederherstellung ist einfach und wäre schnell in Delphi zu programmieren.
Nun meine Frage: In der Hilfe zur Windows-API zu createFile steht, das man damit auch physikalische Laufwerke öffnen könne. Das gelingt mir aber nicht. Hier mein Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Filename:= 'f'; SD:=createFile(PChar(FileName),GENERIC_READ,0,0,3,FILE_ATTRIBUTE_NORMAL,0); if SD = INVALID_HANDLE_VALUE then Memo1.lines.add('Invalid Handle') else .... |
Hat da jemand eine Idee, wie das gehen könnte?
Gruß
GuaAck
jaenicke - Sa 06.05.23 08:39
Wenn du auf den physischen Datenträger zugreifen möchtest, kannst du diesen nicht so einfach über eine logische Einheit auf diesem Datenträger (Partition) ansprechen. Dann kannst du z.B.
\\.\PhysicalDrive0 verwenden. Die Liste dazu findest du über WMI in Win32_DiskDrive.
Alternativ findest du hier auch noch eine andere Zugriffsmöglichkeit über \DosDevices\ und NtCreateFile, aber die habe ich selbst nie getestet:
https://snipplr.com/view/24910/raw-disk-access-unit
Ob das über \DosDevices\ immer geht, weiß ich nicht, denn diese Aliasnamen werden soweit ich weiß nicht immer bereit gestellt.
GuaAck - Sa 06.05.23 22:29
Danke,
auch wenn ich letztlich über einen anderen Weg gemacht habe, Dein Beitrag hat mir sehr geholfen, weil ich dadurch den Einstieg bekam und erfolgversprechende Suchbegriffe fand.
Meine Lösung basiert auf
raw disk access unit [
https://snipplr.com/view/24910/raw-disk-access-unit]. (Tipp: Bei den Angaben im Beispiel werden Cluster angegeben, nicht Sektoren!)
Danke nochmals,viele Grüße
GuaAck
Moderiert von Th69: URL zu Link geändert.
jaenicke - So 07.05.23 00:31
Ja, den Link fand ich auch interessant, weshalb ich den auch in meiner Sammlung hatte und gepostet habe, war mir aber wie ich geschrieben hatte nicht sicher, ob das so immer geht. Ich selbst hatte immer die erste Möglichkeit verwendet.
Schön, dass es funktioniert. :zustimm:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!