Thema: MBR auslesen

Einzelnen Beitrag anzeigen

Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#16

Re: MBR auslesen

  Alt 1. Dez 2008, 17:34
Huch erst nichts und auf einmal so viel hier drin.
Bin zwischenzeitlich zum selben Ergebnis gekommen, kam aber noch nicht dazu, das zu posten (Schule und so...).
Das ganze lässt sich noch mit SetFilePointer errweitern um beliebige Sektoren auszulesen und mit WriteFile und GENERIC_WRITE Rechten lässt sich auch schreiben, auch dazu sind Adminrechte von nöten.
Dabei sollte allerdings - insbesondere im MBR (erster Sektor) und den folgenden Sektoren - vorsichtig sein, da hier falsche Änderungen sehr schnell dazu führen können, dass sich das System nicht mehr booten lässt.

Delphi-Quellcode:
type
  TMBR = array[0..511] of Byte;

var
  Mbr: TMBR;
  i: Word;
  Errorcode: Cardinal;

function ReadMBR(var Buffer: TMBR): Boolean;
var
  hDevice: THandle; //Handle der Festplatte
  NumberOfBytesRead: DWORD;
begin
  //Handle anforern
  hDevice:= CreateFile(LPCTSTR('\\.\PHYSICALDRIVE0'),
    GENERIC_READ, //Schreib-/Leserechte: nur Lesen
    FILE_SHARE_READ or FILE_SHARE_WRITE, //Lese- und Schreibrechte teilen
    PSecurityAttributes(nil), //lpSecurityAttributes
    OPEN_EXISTING, //nur öffnen wen nschon vorhanen (Standard bei allem außer Dateien)
    0, //dwFlagsAndAttributes,
    THandle(0)); //hTemplateFile: NULL

  if (hDevice = INVALID_HANDLE_VALUE) then
  begin
    Result:= false; //Fehler
    Exit;
  end;

  //auslesen, bei Fehler ggf. GetLastError; Fehler wenn <> 0
  Result:= ReadFile(hDevice, {@}Buffer, 512, {@}NumberOfBytesRead, nil);

  //NumberOfBytesRead enthält die gelesenen Bytes.

  //Handle freigeben
  CloseHandle(hDevice);
end;

begin
  if(ReadMBR(Mbr)) then
  begin
    for i:= 0 to High(Mbr) do
    begin
      Write(Format('%.2x', [Mbr[i]]));
      //16 Werte pro Zeile
      if(((i+1) mod 16) <> 0) then
        Write(' ')
      else
        Writeln;
    end;
  end
  else
  begin
    Write('Errorcode: ');
    Errorcode:= GetLastError;
    Writeln(Errorcode);
    case Errorcode of
      5: Writeln('Access is denied.');
      else Writeln('Unknown error.');
    end;
  end;
  Readln;
end.
Danke an alle die MBR-Sache hat sich für mich damit erledigt.
(Ich schau mir nur grade historische Linux-Kernel an und wollte den MBR mal bei einem funktionierenden System betrachten, komme aber im Moment noch nicht so wirklich drauf wie die Funktionsweise der Loader so funktioniert Mag dran liegen das sie in Asm sind und mir zum Thema (also Kernel nicht Asm grundsätzlich) noch insgesamt zuviel Hintergrundwissen fehlt.)
  Mit Zitat antworten Zitat