AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

MBR auslesen

Ein Thema von Cyf · begonnen am 30. Nov 2008 · letzter Beitrag vom 30. Mär 2009
Antwort Antwort
Cyf

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

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
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz