Speicherkarte ohne Dateisystem Auslesen (Windows)

Gast #269011
Lesenswert?

Hallo,

eigentlich sagt der Betreff ja schon alles, es gilt, eine MMC bzw.
SD-Karte am PC auszulesen. Ein Mikrocontroller hat sie zuvor mit einem
Haufen Rohdaten beschrieben. Da das Auslesen über den Mikrocontroller
über RS232 ziemlich langwierig ist, wäre es gut, wenn jemand ein
Programm kennen würde, was mir die Rohdaten einfach in eine Textdatei
auf dem PC schreibt (Auslesen via Card-Reader).

Es gibt ja diverse Datenrettungsprogramme, die im Hintergrund
eigentlich auch nichts anderes machen, allerdings stellen die einem die
Rohdaten nicht zu Verfügung.

Danke,
Thomas
Gast #269013
Lesenswert?

Danke für den Tipp, das sieht ja schonmal vielversprechend aus. Ich
hoffe nur, dass die Applikation nicht abschmiert, wenn ich ihr eine
4GByte SD-Karte vorsetze.

Ansonsten muss ich halt die Option nutzen, und immer nur einen Teil der
Sektoren auslesen. Auf jeden Fall ist das Tool schon mal mehr als ein
Anfang.
Gast #269014
Lesenswert?

Da würde ich mit dem tiny hexer aufpassen, ich glaube der liest am
Anfang die gsesamte Karte ein bevor man manipulieren kann und das würde
mit so einer grossen Karte ewigs dauern. Ich empfehle dir eine kleine
SD-Karte oder winhex.
Gast #269017
Lesenswert?

Auf Winhex war ich während des Googelns auch schon gestoßen.

Das von Matthias genannte Tool hätte mir genützt, wenn es nicht in
Pascal (oder auch Delphi?!) geschrieben wäre. Wäre natürlich praktisch
gewesen, die Karte gleich irgendwie mit den MFC auslesen zu können, da
die spätere Auswertung soundso mittels einer C++-Applikation erfolgt.

Trotzdem danke für die vielen Tipps,

Thomas
Persönliche Seite #269018
Lesenswert?

@Thomas:
Du kannst mit selbstgeschriebenen Win32-Applikationen die Speicherkarte
als sog. Raw-Device ansprechen; das geht, wie in der Dokumentation von
CreateFile im Abschnitt "Physical Disks and Volumes" angegeben:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/createfile.asp

Der Filepointer, den CreateFile zurückgibt, kannst Du -im Prinzip-
genauso behandeln, wie einen Filepointer, der auf eine Datei mit der
Größe der Speicherkarte verweist.

Ich habe auf die Art und Weise mal einen Dump einer SmartMedia-Karte
angefertigt, um einige durch einen besonders miesen Kartenleser
gelöschte Urlaubsbilder wiederherstellen zu können.

Viel Erfolg!
Gast #269019
Lesenswert?

ich hätte jetzt auch den Linux-Dateikopierer "dd" genommen, der ist
auch bei Knoppix mitgeliefert.
dd if=/dev/sda of=Dateiname
mit inputfile "if" die hoffentlich automatisch erkannte SD-Karte -
gleich beim Booten schauen, was Knoppix so schreibt - und outputfile
"of" den Dateinamen im PC, die Datei läßt sich dann mit einem
Hexeditor anschauen. Wenn kein Pfad angegeben wird steht sie im
home-Verzeichnis des Benutzers, dann muß man es noch in ein
Windows-zugängliches Verzeichnis kopieren, irgendeine FAT-Partition
wenn vorhanden.
Gast #269021
Lesenswert?

OK, habe mich mal an einer Implementierung versucht:

hDevice = CreateFile(path,      // drive to open
                    0,                // no access to the drive
                    FILE_SHARE_READ,  // share mode
                    NULL,             // default security attributes
                    OPEN_EXISTING,    // disposition
                    0,                // file attributes
                    NULL);            // do not copy file attributes

Das klappt soweit ohne Probleme sowohl mit USB-Stick als auch
angeschlossener Digi-Cam.

DWORD dwPtr = SetFilePointer(hDevice,  //handle to drive
                     (0*512),  //start sector
                 NULL,    //
               FILE_BEGIN);  //method

Hier stimmt auch noch alles, die Routine soll halt den Pointer auf
Speicherzelle 0 des ausgewählten Gerätes setzen.

if (!ReadFile(hDevice, buffer, 512*numberofsectors, &bytesread, NULL))
{
  DWORD dwError = GetLastError();
      ...
}

Hier hängt es jetzt immer. Ich bekomme Fehlercode 0x05 zurück, was
soviel heißt, wie "access denied". Die gelesenen Bytes bleiben gleich
Null. Die Anzahl der Sektoren ist als Integer erstmal auf Null gesetzt.
Warum nun das? Ich arbeite an diesem Rechner als Admin, daran sollte es
also nicht liegen. Habe ich bei irgendeinem Flag einen Bock gebaut?

Thomas
Gast #269023
Lesenswert?

Danke Rufus, mit dieser Veränderung klappt es. Werde die Applikation
bestimmt nach ein bischen Feinschliff in die Codesammlung als
Beispiellösung stellen, mit MMCs bzw. SD-Karten arbeiten hier ja
einige.

Bin mal gespannt, ob die Datenrate mit der des Windows-Explorers
vergleichbar ist.

Den SetFilePointer hatte ich nur verwendet, da ich ihn später soundso
brauche.
Gast #269024
Lesenswert?

Tja, irgendwie sind mehr als 150-160kByte/s auf diesem Wege nicht drin.
Mal schauen, vielleicht setze ich das morgen nochmal in nen getrennten
Thread, wenn es hilft. Allerdings ist die CPU-Auslastung während des
Lesens eher gering.
Persönliche Seite #269026
Lesenswert?

Wieviele Sektoren pro Lesezugriff liest Du denn? Einzelsektorzugriffe à
512 Bytes oder größere Blöcke?
Was machst Du mit den so gewonnenen Daten?

Du könntest die Karte auch als Memory Mapped File ansprechen, dann ist
der windows-eigene Cache-Manager für die Zugriffe zuständig, was sich
möglicherweise positiv auf die Performance auswirkt. Ab etwa 1 GByte
Größe musst Du dann allerdings mit einer Art "Speicherfenster"
arbeiten, was die Sache dann etwas verkompliziert.
Gast #269027
Lesenswert?

Nochmal danke, wenn man 100 Sektoren auf einmal liest kann man sogar die
Datenrate von WinHex toppen. Hatte mich nur gestern davor gescheut, da
ich als Anzahl der Bytes mal aus Versehen einen Wert gewählt hatte, der
kein Vielfaches von 512 ist - das geht vor den Baum.

Aktuell lese ich die Daten einfach häppchenweise (z.B. in 50kByte
Blöcken) und schreibe sie dann gleich in eine Datei. Mit der
Performance werde ich so leben können, sie liegt nun schon wesentlich
über der Kommunikationsgeschwindigkeit mit dem DSP.
Gast #269028
Lesenswert?

Habe den Thread mit Interesse verfolgt und mal eine Applikation mit dem
Visual-Studio geschrieben. Er hat mir auf jeden Fall eine Menge
Stolperfallen erspart :-)

Habe die App zum selbst kompilieren mal angehangen, falls noch jemand
Verbesserungsvorschläge hat, würde ich mich freuen.

Das Auslesen erfolgt in einem separaten Thread, damit das Fenster bei
längerem Auslesen nicht hängt.

Man kann entweder komplette Karten (bzw. größere Teile) auslesen, dann
werden viele Sektoren auf einmal ausgelesen, was die Sache
beschleunigt. Alternativ kann man einzelne Sektoren auslesen, dies
passiert im Moment sektorweise und deshalb langsam, ich benötige es bei
mir eigentlich nicht.

Die Karte muss als Laufwerksbuchstabe ausgewählt werden, dann muss man
noch einen Pfad und Namen für die Zieldatei angeben.

Die Sache funktioniert auch mit USB-Sticks.


Alex
Angehängte Dateien:
Gast #269030
Lesenswert?

Die Anzahl habe ich einfach durch dividieren bestimmt.

Dabei gehe ich davon aus, dass ein Sektor 512Byte umfasst. Wenn ich die
Datenträgergröße kenne kann ich daraus die Anzahl der Sektoren
bestimmen.

Die *.exe habe ich angehangen.

Habe die App mit VC++.NET 2003 erstellt.

Alex
Angehängte Dateien:
Gast #269032
Lesenswert?

Was hast du für Optionen gewählt?

Sinnvoll wären:

"Copy Sectors"
Start Sector: 0
End Sector: 100

Das sollte die ersten 100 Sektoren lesen und eine Datei von 512*100Byte
Größe erzeugen.

Eine Schreibfunktion ist nicht geplant, sollte aber mittels
WriteFile(...) kein Problem darstellen.
Gast #269038
Lesenswert?

Unter MS-Win9X funktionieren die oben beschreibenen Sachen wohl nicht,
aber da gibt's die Möglichkeit einfach ein Dateisystem auf die Karte
zu packen und mit einer Datei komplett zu füllen, an deren Anfang eine
Kennung steht. Hinter dieser Kennung kann der MC dann die Daten ablegen
und auch unter MS-Win9x kann man die Daten auslesen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren