17 Stimmen

Ist es möglich, Schreibzugriff auf rohe Geräte mit Python unter Windows zu erhalten?

Dies ist eine Art Fortsetzung von diese Frage . Ich möchte wissen, ob Sie auf Rohgeräte zugreifen können (d. h. \\.\PhysicalDriveN ) im Schreibmodus und wenn dies der Fall sein sollte, wie.

Unter Linux kann der Schreibzugriff einfach durch die Verwendung von z. B. open("/dev/sdd", "w+") (vorausgesetzt, das Skript wird mit Root-Rechten ausgeführt). Ich nehme an, dass sich Mac OS ähnlich verhält (mit /dev/diskN als Eingabedatei).

Wenn Sie denselben Befehl unter Windows (mit dem entsprechenden Pfad) ausprobieren, schlägt er mit der folgenden Fehlermeldung fehl:

IOError: [Errno 22] invalid mode ('w+') or filename: '\\\\.\\PhysicalDrive3'

Wenn Sie jedoch versuchen lesen aus dem PhysicalDrive, es funktioniert (auch die richtigen Daten werden gelesen). Die Shell läuft mit Administratorrechten unter Windows 7.

Gibt es eine andere Möglichkeit, diese Aufgabe mit Python zu erledigen und dabei das Skript so plattformunabhängig wie möglich zu halten?

Edita:

Ich habe mir die Methoden, die Python für die Dateibearbeitung bietet, etwas genauer angesehen und bin dabei auf Folgendes gestoßen os.open . Öffnen des PhysicalDrive mit os.open(drive_string, os.O_WRONLY|os.O_BINARY) gibt keinen Fehler zurück. So weit, so gut. Jetzt habe ich entweder die Wahl, direkt in diesen Dateideskriptor zu schreiben, indem ich os.write , oder verwenden Sie os.fdopen um ein Datei-Objekt zu erhalten und es auf die übliche Weise zu beschreiben. Leider funktioniert keine dieser Möglichkeiten. Im ersten Fall ( os.write() ), bekomme ich dies:

>>> os.write(os.open("\\\\.\\PhysicalDrive3", os.O_WRONLY|os.O_BINARY), "test")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

Im zweiten Fall, I puede ein Datei-Objekt mit Schreibrechten erstellen, aber das Schreiben selbst schlägt fehl (nun, nachdem die Ausführung mit .flush() ):

>>> g = os.fdopen(os.open("\\\\.\\PhysicalDrive3", os.O_WRONLY|os.O_BINARY), "wb")
>>> g.write("test")
>>> g.flush()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument

19voto

Martin Matysiak Punkte 3306

En eryksun y agf in den Kommentaren erwähnt wurde (ich habe es zuerst nicht verstanden), ist die Lösung ziemlich einfach: Sie müssen das Gerät in der rb+ Modus, der das Gerät für Aktualisierung von (wie ich jetzt herausgefunden habe ), ohne zu versuchen, sie durch eine neue Datei zu ersetzen (was nicht funktionieren würde, da die Datei in Wirklichkeit ein physisches Laufwerk ist).

Beim Schreiben muss immer ein ganzer Sektor auf einmal geschrieben werden (d.h. ein Vielfaches von 512 Byte), sonst schlägt es fehl.

Darüber hinaus ist die .seek() Befehl kann auch nur sektorweise springen. Wenn Sie versuchen, eine Position innerhalb eines Sektors zu suchen (z.B. Position 621 ), springt das Dateiobjekt an den Anfang des Sektors, in dem sich die gewünschte Position befindet (d. h. an den Anfang des zweiten Sektors, Byte 512 ).

-1voto

user2174865 Punkte 67

Möglicherweise müssen Sie in Win 7 etwas Extremeres tun, z. B. das/die Volume(s) für die Festplatte vorher mit DeviceIoControl(hVol, FSCTL_LOCK_VOLUME, ...) sperren.

Unter Win 7 müssen Sie das nicht tun; das Öffnen und Schreiben im Modus "rb+" funktioniert problemlos.

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