MBR eines USB Sticks überschreiben unter Windows 7



  • Um mein Betriebssystem zu laden habe ich einen MBR geschreiben, leider erlaubt Windows 7 den meisten Programmen nicht den MBR eines USB Sticks zu beschreiben. Ich bin Administartor auf meinem Computer und wollte nun fragen ob ihr eine Idee hättet mit C/C++ den MBR eines USB Sticks zu beschreiben?
    MfG Dezimiert



  • Ja starte dein Programm mal mit "Als Administrator ausführen"
    MBR Schreiben geht nämlich grundsätzlich ganz wunderbar unter Windows 7.



  • Es tut mir sehr leid hustbaer jedoch sehe ich leider keinerlei Nutzen an deinem Beitrag, allerdings hat sich jemand die Mühe gemacht einen Beitrag zu schreiben, wenn auch einen ironisch gemeinten. Ich frage ja nicht im Forum wenn es eine Frage wäre, die ich mal so in 5 minuten googlen herausfinden könnte.
    MfG Dezimiert



  • Es wird aus deinem Text einfach nicht klar wo dein Problem liegt. Ich erinnere mich allerdings daran wie ehenkes damals über das Problem gestolpert ist. Das Problem ist einfach, dass Windows auf USB Sticks keine Partitionen unterstützt und dabei evtl. vorhandene Partitionstabellen dadurch ignoriert, dass der Sektor 0 einfach komplett ausgeblendet wird.

    Sprich Tools und auch dein eigenes Programm können den MBR nicht schreiben, weil dir Windows den MBR vorenthält. Ehenkes hatte für Windows XP damals einen Treiber gefunden der USB-Sticks als andere Laufwerksart erkannte und damit das Problem umgehen sollte. Ich weiß aber nicht ob das geklappt hatte.



  • Okay tut mir sehr leid genau das ist mein Problem Tobiking2 ich kann den MBR unter Windows nicht beschreiben selbst wenn es nicht die Betriebsystem Festplatte ist. Also sollte ich jetzt nach einem Treiber suchen?



  • @Tobiking2
    Windows ignoriert den Partition-Table gar nicht, es ignoriert bloss alles bis auf die erste Partition.
    Was das Schreiben angeht könntest du Recht haben.

    @Dezimiert
    Es tut mir gar nicht leid Dezimiert, denn wenn du hier öfters mal reinschaust wird dir vielleicht auffallen wie unglaublich dämlich die meisten Leute sind und wie unglaublich wenig sie bereits selbst probiert haben.
    Wäre das nicht so würde ich solche Antworten auch nicht schreiben.

    Gerade die Formulierung "ich bin Administrator auf meinem Computer" lässt vermuten dass dem Autor nicht klar ist dass aktivem mit UAC alles etwas anders läuft.



  • @hustbaer
    Ich wollte mit "ich bin Administrator auf meinem Computer", dass es kein Problem ist die UAC in den Linker Optionen des C++ Compilers zu erhöhen. Danke für deine Antwort, war von mir auch nicht böse gemeint.

    Ich habe mitlerweile eine Funktion gefunden in der WINAPI mit der man I/O Devices öffnen kann. Dafür benutze ich die CreateFile Function, diese rufe ich mit folgenden Parametern auf:

    HANDLE desiredMBRHandle=CreateFileA("\\.\PhysicalDrive5",GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0);
    

    Dies gibt leider immer den Wert 0xffffffff zurück und GetLastError() gibt den Wert 2 zurück. Meine Frage ist nun ob ich vielleicht die Parameter falsch übergeben habe, oder ob es mit dieser Funktion gar nicht möglich ist ein Physiche Festplatte zu öffnen. Die Informationen über die Funktion habe ich von MSDN
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
    MfG Dezimiert





  • @ERROR_FILE_NOT_FOUND:
    Da hast du sehr wohl recht, der string mü´sste also eher so aussehen "\\\.\\PhyscialDrive5".
    Vielen Dank jetzt funktioniert es, zumindestens hat das Handle einen gültigen Wert. Ich melde mich wieder wenn ein weiteres Problem auftritt habe ja jetzt erstmal was zum experimentieren.
    MfG Dezimiert



  • Ah.
    Ich glaube ich habe übrigens deine Frage nicht richtig verstanden.
    Ich dachte du hättest schon ein Programm das auf anderen Windowsen funktioniert aber mit 7 nimmer.

    Du willst aber vermutlich wissen wie es überhaupt geht, also vorausgesetzt es geht überhaupt, nen? 💡

    In dem Fall bist du auf dem richtigen Weg: wenn es geht, dann indem du das "PhysicalDrive" aufmachst. Und dann kannst du ganz normal mit ReadFile und WriteFile zugreifen als ob das Ding ein File wäre. MBR ist netterweise auch trivial, da immer an Offset 0.

    Das FILE_ATTRIBUTE_SYSTEM Flag in deinem Code kommt mir jetzt komisch vor.
    Unser Code macht das mit
    CreateFile(drivePath, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, 0);
    Und dann ganz normal mit SetFilePointer/ReadFile/WriteFile daten schreiben.
    Wobei ich nicht weiss ob die Flags alle nötig sind - kann gut sein dass deine Variante auch funktioniert.

    Die Zugriffe müssen halt auf 512 Byte aligned sein (bzw. bei den neuen "Advanced Format" Platten vermutlich 4K - aber bis USB Sticks "Advanced Format" brauchen dauert es vermutlich noch ein wenig).

    Soweit sollte das aber auch alles auf der MSDN Seite zu CreateFile dokumentiert sein.

    Irgendwas läuft bei Windows 7 aber komisch diesbezüglich. Ich arbeite nicht selbst an dem Programm, aber ein Arbeitskollege von mir hat gemeint das Ding schreibt zwar brav den MBR runter, aber wenn man ihn zurückliest entsteht als 2. Partitionseintrag auf einmel eine "Füller-Partition" die den gesamten freien Speicherplatz belegt und irgendwie als ungültig markiert ist.
    Genaueres kann ich dir aber auch nicht sagen. (Also ich weiss z.B. nicht ob der MBR beim Schreiben oder beim Lesen modifiziert wird, oder nach dem Schreiben wenn Windows das Ding wieder nach Partitionen absucht - keine Ahnung)

    Ich hatte auch nicht gleich daran gedacht dass es bei Windows 7 da ein Problem gibt (bei Windows XP gab es das Phänomen nämlich angeblich noch nicht) - sonst hätte ich gleich was dazugeschrieben 🙂





  • Danke für die Antworten ich werde mich damit gleich beschäftigen, leider konnte ich nicht früher schreiben, da mein Internet defekt war.
    @huestbar
    Danke für deine Produktivität, damit kann ich auf jeden Fall was anfangen.


Anmelden zum Antworten