Problem: Wie eine Festplatte auf Byte-Ebene editieren?
-
Oj ja, hab's jetzt gesehen.Die Frage bleibt, warum du per Hand eine Patition erstellen moechtest,das ist Aufgabe des Betriebsystems.
-
Hm ich hab hier eine etwas ungenaue Anleitung, die mir sagt, dass ich die Festplatte, um sie zu partitionieren, mit einer gewissen Bytefolge an einer bestimmten Adresse beschreiben muss. Dort wird das händisch mittels eines Hex-Editors gemacht. Ansich kein Problem, ich wollts halt so, dass man unter DOS ein Programm startet, welches das dann alles macht, so dass man da nichts mehr manuell machen muss...
Hab mir mal einen TCPP besorgt... Bis jetzt klappts ganz gut...
-
So, meine Programme funktionieren jetzt unter DOS.
Ich hab allerdings immernoch ein Problem, nämlich genau das lesen und schreiben an bestimmten Sektoren...
Ein Ansatz war der, mit fopen die Festplatte als solche zu öffnen (siehe oben), ist aber eher unvorteilhaft, weil ich an bestimmte Sektoren muss, und vermutlich muss ich noch eine Ebene tiefer (Byte- und nicht Dateiebene).Also hab ich versucht, das mit Softwareinterrupts zu erledigen (int86 und int86x), sieht folgendermaßen aus:
#define DRIVE 0 // 0=A, 1=B, 2=C, etc. #define SECTOR 1 unsigned int far *out; // Zeiger auf auszugebende Daten unsigned int far *input; // Zeiger auf einzulesende Daten unsigned int output; // auszugebende Daten union REGS inreg, outreg; struct SREGS sreg; void main(void) { output=11; out=&output; inreg.h.al = DRIVE; // auf DRIVE schreiben inreg.x.cx = SECTOR; // SECTOR schreiben (Anzahl) inreg.x.dx = 1; // logischer Sektor: 1 sreg.ds = FP_SEG(out); // Segmentadresse von out feststellen inreg.x.bx = FP_OFF(out); // Offsetadresse von out feststellen outreg.x.ax = 0; int86x (0x26, &inreg, &outreg, &sreg); // lesen: inreg.h.al = DRIVE; // von DRIVE lesen inreg.x.cx = SECTOR; // SECTOR Sektoren lesen inreg.x.dx = 1; // logischer Sektor 1 sreg.ds = FP_SEG(input); inreg.x.bx = FP_OFF(input); outreg.x.ax = 0; int86x (0x25, &inreg, &outreg, &sreg); printf ("%u wurde gelesen\n", *input);Ich weiß allerdings nicht, wo das hingeschrieben wird (hab mir mit einem Hex-Editor den ersten Sektor angeschaut, steht aber nichts dort). In den Kommentaren beim Code steht auch "logischer" Sektor, nicht physikalischer. Ich hab mir diesen Code bei MS kopiert, dort steht auch kaum Dokumentation, insbesondere zu den int86-Interruptnummern (was zu übergeben ist etc.)
Ein weiterer Ansatz war, die Festplatte wieder mit einem File-Pointer zu adressieren und diese Adresse dann mit peekb weiterzuverwenden (peekb liest ein Byte an einer Adresse, zerlegt in Segment und Offset).
peekb liest allerdings, angewendet auf die Adresse im Pointer auf die Festplatte, ziemlichen Mist aus, der nicht dem entspricht, was am Anfang der Festplatte steht.
Hier der Code:unsigned char rwert; // Rueckgabewert unsigned long int i=0; unsigned long int offs; unsigned long int segm; FILE * fp; fp = fopen("\\\\.\\C:", "rb"); offs=FP_OFF(fp); segm=FP_SEG(fp); for(i=0; i<256; i++) { rwert = peekb(segm, offs+i); printf("%02x ", rwert); if ( ((i+1)%16)==0) printf("\n"); }Ich bin jetzt mit meinem Latein am Ende, hab keine Ahnung, welchen Ansatz ich wie weiter verfolgen soll....
-
Also ich glaube ja, dass dich die C-Routinen (fopen, etc.) nicht weiter bringen unter DOS. Zumindest, was den RAW-Zugriff angeht.
Suche mal unter folgenden Stichworten: Google: bios interrupt 13h
Einfache Assembler Kenntnisse vorausgesetzt. Btw. welchen C-Compiler für DOS hast du jetzt rausgesucht?Was mir noch bei deinem ersten Code aufgefallen ist, dass du den Sektor 1 beschreibst, aber du willst Sektor 0 beschreiben, oder?
-
Bisschen Assembler krieg ich hin.
Der erste Sektor ist Sektor 1, weil bei den Sektoren die Zählung erst bei 1 anfängt, anstatt bei 0, soweit ich weiß (steht in einer Art Skript von der Uni, hab das auch woanders mal gelesen).
Also "Programmierumgebung", also auch Compiler, benutz ich TCPP3.0Das Gedöns mit Interrupt 13 hört sich sehr brauchbar an, danke!
Ich hab noch einen anderen Ansatz mit Debug... wird in eine .BAT-Datei geschrieben und die wird dann ausgeführt... Mal sehen.
-
Geht bei Windows mit Bordmitteln: DOS-Box und debug.exe.
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Unter Windows geht das schonmal garnicht, weil Windows alle Festplattenzugriffe dieser Art abblockt.
debug kann meines Wissens nach nur RAM byteweise editieren, außerdem hab ich das Problem, dass die Platte nicht auf eine Art formatiert ist, die DOS versteht. debug scheidet also aus.
-
Du scheinst Recht zu haben. Die Sektorzählung beginnt bei 1. Was ich seltsam finde.
-
Schau dir mal unter http://members.inode.at/anton.zechner/az/
das Programm DiskViewer an.(Menü-->Berarbeiten->Schreibschutz)