2 Stimmen

Wie lesen sie Cluster/Zylinder/Sektoren von der Festplatte?

Ich musste die Partitionstabelle wiederherstellen, die ich versehentlich gelöscht hatte. Ich verwendete eine Anwendung namens TestDisk . Es ist einfach umwerfend. Ich lese jeden Zylinder von der Festplatte. Ich habe ähnliche Anwendungen gesehen, die mit MBR und Partitionierung arbeiten.

Ich bin neugierig.

Wie lesen sie Clustern/Zylindern/Sektoren von der Platte? Gibt es dafür eine Art API?

Ist es wieder abhängig vom Betriebssystem? Wenn ja, was ist der Weg zu für Linux & für Windows?

EDITAR: Nun, ich bin nicht nur neugierig, ich möchte praktische Erfahrungen sammeln. Ich möchte eine einfache Anwendung schreiben, die jede LBA anzeigt.

3voto

Steven Schlansker Punkte 35955

Zylinder und Sektoren ( wiki-Erklärung ) sind weitgehend durch das neuere LBA ( logische Blockadressierung ) Schema für die Adressierung von Laufwerken.

Wenn Sie sich für die Geschichte interessieren, können Sie den Wikipedia-Artikel als Ausgangspunkt verwenden. Wenn Sie sich nur fragen, wie es jetzt funktioniert, wird erwartet, dass der Code einfach die LBA-Adresse verwendet (die weitgehend genauso funktioniert wie eine Datei - eine lineare Anordnung von Bytes, die in Blöcken angeordnet sind)

3voto

Eric Seppanen Punkte 5773

Dank der Magie der speziellen *nix-Gerätedateien ist das ganz einfach. Sie können öffnen und lesen /dev/sda wie Sie jede andere Datei lesen würden.

Verwenden Sie einfach open , lseek , read , write (oder pread , pwrite ). Wenn Sie sicherstellen wollen, dass Sie die Daten physisch von einem Laufwerk und nicht aus Kernelpuffern abrufen, können Sie mit dem Flag O_DIRECT (Sie müssen allerdings ausgerichtete Lese-/Schreibvorgänge in 512-Byte-Blöcken durchführen, damit dies funktioniert).

3voto

Matteo Italia Punkte 119470

Für *nix gab es bereits Antworten (/dev-Verzeichnis); für Windows gibt es die speziellen Objekte \\.\PhisicalDrive_X_ con X als die Nummer des Laufwerks, das mit der normalen CreateFile API. Um tatsächlich Lese- oder Schreibvorgänge durchzuführen, müssen Sie dann die DeviceIoControl Funktion.

Weitere Informationen finden Sie unter "Abschnitt "Physische Festplatten und Volumes der CreateFile API-Dokumentation.

2voto

claws Punkte 49408

Ich bin die OP. Ich kombiniere die Antworten von Eric Seppanen und Matteo Italia, um sie zu vervollständigen.

*NIX-Plattformen:

Dank der Magie der speziellen *nix-Gerätedateien ist das ganz einfach. Sie können öffnen und lesen /dev/sda wie Sie jede andere Datei lesen würden.

Verwenden Sie einfach open , lseek , read , write (oder pread , pwrite ). Wenn Sie sicherstellen wollen, dass Sie die Daten physisch von einem Laufwerk und nicht aus Kernelpuffern abrufen, können Sie mit dem Flag O_DIRECT (Sie müssen allerdings ausgerichtete Lese-/Schreibvorgänge in 512-Byte-Blöcken durchführen, damit dies funktioniert).

Windows-Plattform

Für Windows gibt es die speziellen Objekte \\.\PhisicalDrive_X_ con X als die Nummer des Laufwerks, das mit der normalen CreateFile API. Um Lese- oder Schreibvorgänge durchzuführen, rufen Sie einfach ReadFile y WriteFile (Puffer muss auf Sektorgröße ausgerichtet sein).

Weitere Informationen finden Sie unter "Abschnitt "Physische Festplatten und Volumes der CreateFile API-Dokumentation.

Alternativ können Sie auch Sie DeviceIoControl Funktion, die einen Steuercode direkt an einen bestimmten Gerätetreiber sendet und das entsprechende Gerät veranlasst, die entsprechende Operation auszuführen.

1voto

Nicolas Viennot Punkte 3825

Unter Linux können Sie als Root Ihren MBR wie folgt speichern (vorausgesetzt, Ihr Laufwerk ist /dev/sda):

dd if=/dev/sda of=mbr bs=512 count=1

Wenn Sie 1 MB von Ihrem Laufwerk lesen wollten, würden Sie beim 10. MB beginnen:

dd if=/dev/sda of=1Mb bs=1Mb count=1 skip=10

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X