Problem: Wie eine Festplatte auf Byte-Ebene editieren?



  • nyhlz schrieb:

    Manuell ist das wunderbar mit einem Hex-Editor möglich (z.B. Winhex, wenn man die Version hat, die editieren kann, oder HIEW)

    Aber da machst Du das doch mit einer bestimmten Datei und nicht mit der Festplatte, oder irre ich mich da?



  • Nein, die zu bearbeitende Festplatte ist komplett formatiert und es soll dort eine Partitionsstruktur erstellt werden und diverse Bytes an bestimmte STellen geschrieben werden.

    Also nichts mit Dateien 🙂

    Mittlerweile hab ich ein anderes Problem: Meine Win-32-Konsolenprogramme laufen nicht unter FreeDOS. Hab es fast befürchtet, aber ich dachte mir, dass aufgrund der fehlenden GUI DOS keine Probleme hat... Hab mich geirrt.
    Ich benutze Visual Studio 2008, falls das hilft.



  • Du brauchst halt einen Compiler für DOS. Mit Visual Studio kommst du da nicht weiter.

    Dieser hier tuts: http://www.htsoft.com/products/compilers/PACIFICc.php

    Andernfalls such mal. Die alten Turbo C++ Compiler von Borland gibt es mittlerweile kostenlos zum runter laden. Oder du schreibst direkt alles in 16Bit Assembler.



  • Mich wuerde spontan interessieren, warum du direkt den Inhalt einer Festplatte manipulieren moechtest.



  • 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.0

    Das 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)


Anmelden zum Antworten