Forum: PC-Programmierung Unterschiedliche Sektorenanzahl


von Flo K. (Gast)


Lesenswert?

Hallo,

ich habe in der Arbeit ein kleines Problem. Ich soll ein Image von einer 
Compactflash-Karte ziehen und dieses auf andere Karten clonen. Bei 
Test's ist mir aufgefallen das Linux immer mehr Sektoren erkennt als 
Windows. Der Hex-Editor zeigt mir auch zu wenige Sektoren an (Tiny-Hex). 
Hat jemand einen Anhaltspunkt worann dies liegen könnte?

P.S. Ich habe den Test auch mit Compactflash-Karten gemacht, bei denen 
ich zuvor den gesamten Speicherbereich auf Nullen gesetzt habe.

von Sebastian (Gast)


Lesenswert?

Hallo Flo,

ganz sicher bin ich mir nicht, hab unter Windows noch nie mit Images 
gearbeitet.
Könnte es daran liegen, dass Du unter Linux das ganze Device ausliest 
(/dev/sdx) und unter Window evl. die Partitionstabelle nicht mitgelesen 
wird?

Gruß
   Sebastian

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Mir fällt das immer bei qtparted auf, dass es noch ein paar freie 
Sektoren meldet.
(Knoppix CD booten, eine rootshell aufrufen und dort "qtparted" starten, 
das braucht root-Rechte)

von Flo K. (Gast)


Lesenswert?

Hallo,

hier wahr schon länger nichts mehr los ;-). Hab das Thema vor kurzem 
wieder auf den Tisch bekommen. Ich lasse mir von Windows per "OpenFile" 
(aus der WinAPI) einen Handle auf das Laufwerk geben. Dieses lese ich 
mit "ReadFile" Byteweise aus. Auch der Zugriff per "DeviceIOControl" 
funktioniert, um mir die DiskParameter anzeigen zu lassen. Nur zeigt er 
mir wieder nur die typischen Windowsangaben an (zu wenige Sektoren;-) ). 
Hat jemand eine Ahnung wie ich über WinAPI Funktionen eine 
CompactFlash-Karte (per USB-Kartenleser angeschlossen) hardwarenah 
auslesen kann? Ich weiß das es funktionieren muss, da das Programm 
"WinHEX" mir auch die "Überhangsektoren" des Datenträgers anzeigt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Ich lasse mir von Windows per "OpenFile"
> (aus der WinAPI) einen Handle auf das Laufwerk geben.

Welches Laufwerk? Das physikalische oder das logische?

von Flo K. (Gast)


Lesenswert?

Das Phsyikalische (z.B.\\.\C:)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist nicht das physikalische Laufwerk, sondern das logische Laufwerk.

Mit \\.\PHYSICALDRIVE0 hingegen wird auf das physikalische Laufwerk 
(hier: die erste Festplatte) zugegriffen.

Der Unterschied zwischen physikalischem und logischen Laufwerk wird 
schnell klar, wenn man an Partitionen denkt. Auf einer Festplatte ist 
immer (mindestens) eine Partition. Der erste 512-Byte-Block des 
physikalischen Laufwerks enthält die Partitionstabelle sowie den "master 
boot record" (MBR), der erste 512-Byte-Block eines logischen Laufwerks 
enthält den je nach installiertem Betriebssystem unterschiedlichen 
Bootsektor.

von Flo K. (Gast)


Lesenswert?

Ok den Fehler geb ich zu. Ich kenne zwar den Unterschied, hab ich aber 
anscheinend kurz vergessen ;-). Das ändert aber leider nichts am 
Ergebnis.
Kann es sein, das ich solche Abfragen per ATA-Kommandos machen muss? 
Sprich, direkt mit der Hardware kommunizieren? Den Bereich den ich 
auslesen möchte liegt ja eingentlich im gemapten Speicherbereich, der 
normalerweise vom Controller verwaltet wird. Oder?

von *.* (Gast)


Lesenswert?

Ja, das 'identify device'-Kommando muss auf beiden Platformen die 
gleichen Daten zurückgeben.

von Flo K. (Gast)


Lesenswert?

So wie es aussieht kann ich aber keine ATA-Kommandos über die USB 
Schnittstelle an ein USB-Mass-Storage-Device schicken, bzw. die Doku 
gibt darüber wenig her. Es gibt zwar laut CF-spec eine Kommando das so 
gut wie alle Hardwareinformationen liefert. Ich weiß aber nicht wie ich 
es absenden kann.

von Flo K. (Gast)


Lesenswert?

Hallo,

hat jemand vielleicht eine Ahnung, wie ich mit IOCTL-Codes SCSI bzw. ATA 
Kommandos an den Cardreader schicken kann? Bisher habe ich nur 
Fehlermeldungen erhalten. Als Treiber benutze ich den Standard Windows 
"USB-Mass-Storage"-Treiber.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das wird der Cardreader nicht unterstützen.

Einzige Möglichkeit, die ich sehe, ist die Verwendung eines 
IDE-Adapters, mit dem die CF-Karte im TrueIDE-Modus betrieben wird ... 
und der am IDE-Anschluss des Rechners hängt.

von Flo K. (Gast)


Lesenswert?

Hallo Rufus,
irgendwie muss es aber doch möglich sein, da WinHEX meiner Meinung nach 
auch auf die internen Register der Karte zugreift, um die 
Überhangsektoren auszulesen. Laut der USB-Mass-Storage-Spec sollten die 
Treiber aber auch in der Lage sein solche Kommandos weiterzureichen. Ich 
verwende hier einen Sandisc-Imagemate-CF-Reader. Falls das weiterhelfen 
sollte.
Bei Test mit "IOCTL_SCSI_PASS_THROUGH_DIRECT" gibt er mir auch keinen 
Fehler aus wie "Kommando wird nicht unterstützt", sondern er läuft 
entweder in den Timeout, oder ein Device-Fehler tritt auf.

von Flo K. (Gast)


Lesenswert?

Laut dem Programm USBMon (USB-Sniffer) schickt WinHEX an den Kartenleser 
SCSI-Kommandos. Das unterstützte Protokoll (SCSI,...) ist abhängig von 
der "InterfaceSubClass" des USB-Deskriptors. Bei 0x06h unterstütz das 
Medium bzw. der Reader SCSI-Kommandos. Bleibt nur noch die Frage, wie 
sieht der Beispielcode aus um solche Kommandos abzusetzen (z.b. das 
INQUIRY Kommando)

von Uhu U. (uhu)


Lesenswert?

IOCTL_SCSI_PASS_THROUGH_DIRECT und IOCTL_SCSI_PASS_THROUGH haben so ihre 
speziellen Tücken, die mehr oder weniger garnicht dokumentiert sind, 
weil sie u.a. vom angesprochenen Treiberstack abhängig sind.

Eine besondere Tücke liegt aber auch im Unterschied der beiden: Für 
kleine Puffer muß man - zumindest bei IDE/ATAPI mit 
IOCTL_SCSI_PASS_THROUGH behandeln, sonst bleibt die Chose irgendwann 
unvermittelt hängen und nichts geht mehr - auf dem ganzen Rechner.

Wenn du damit anfängst, wirst du viel Spaß haben... deshalb würde ich 
dir zuerst mal empfehlen, das physikalische Device zu öffnen und zu 
versuchen mit den üblichen Blocklesekommandos ganze Sektoren zu lesen.

Die Lesekommandos, die du von WinHEX auf dem Device siehst, werden mit 
ziemlicher Sicherheit nicht von WinHEX erzeugt, sondern von den Treibern 
auf dem Stack, die die Highlevellesekommandos in SCSI-Kommandos 
umsetzen. Was man sieht, hängt im wesentlichen davon ab, wo im Stack der 
Filtertreiber des Sniffers sich einhängt.

von Flo K. (Gast)


Lesenswert?

Hallo  Uhu Uhuhu,
ich bin jetzt schon einen Megaschritt weiter. Ich habe es geschafft mir 
eine eigene Wrapper-DLL zu schreiben, die mir die CreateFile, 
CloseHandle und DeviceIOControl Kommandos für LabView vorbereitet. Ich 
hab es auch geschafft Low-Level auf USB-Mass-Storage Geräte zuzugreifen. 
Die ist durch das Kommando SCSI_PASS_THROUGH_DIRECT möglich. Ich 
reserviere und beschreibe einen max 64kB großen Speicherbereich, dessen 
Zeiger ich der Struktur übergebe. Funktioniert prächtig. Laut Microsoft 
müssen alles USB-Mass-Storage Treiber einen Grundstock von 
SCSI-Kommandos übersetzen können. Das währen unter anderem INQUIRY, 
READ(10), WRITE(10) und READ CAPACITY. Theoretisch könnte ich damit 2TB 
an Daten adressieren. Dürfte also für die nächsten Generationen von 
Speicherkarten ausreichen. Bei ersten Test hab ich eine, natürlich von 
CF-Card abhängig, maximale Übertragungsrate von 12MB/s Lesend und 10MB/s 
schreibend erreicht. Habs auch schon geschafft 4 Kartenleser 
gleichzeitig zu beschreiben, leider bricht dabei die Performance um ca. 
2 MB/s zusammen. Bin aber noch dabei herauszufinden warum.
Zusätzlich ist es mir gelungen einen MD5-Hash Generator für die 
Speicherkarten zu schreiben. Dadurch bin ich in der Lage die 
Originalimagedatei mit dem Inhalt der Device zu vergleichen. Alles in 
allem ein netter Speicherkartenkopieren mit wirklichem 1:1 Verhältnis. 
Es gibt zwar bereits einen Hersteller für solche Software, nur diese 
schafft es nicht die Überhangsektoren mitzuschreiben.

Also bye und danke an alle nochmal für ihre Antworten.

P.S. Dieses Forum ist echt das beste seiner Art. Hier wird wenigstens 
noch anständig geantwortet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.