Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   MBR auslesen (https://www.delphipraxis.net/125104-mbr-auslesen.html)

DeddyH 1. Dez 2008 15:41

Re: MBR auslesen
 
Administratorrechte hast Du?

[edit] Probiert - geht bei mir auch nicht (XP SP 3) [/edit]

divBy0 1. Dez 2008 15:51

Re: MBR auslesen
 
Ja, Adminrechte hab ich. XP pro SP2

bassman 1. Dez 2008 16:01

Re: MBR auslesen
 
So gehts bei mir

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  nBytesRead ,
  fHandle   : Cardinal;
  Buffer    : Array of Byte;
  Success   : Boolean;
begin
fHandle := CreateFile(
    PChar('\\.\PHYSICALDRIVE0'), // ...PHYSICALDRIVE0 <--<< first Harddisk ( Primary Master )
    GENERIC_READ,               // ...read only
    FILE_SHARE_WRITE,           // ...Wichtig, nicht das es Probleme gibt
    nil,
    OPEN_EXISTING,              // ...ist klar warum
    0,
    0);

  if fHandle = INVALID_HANDLE_VALUE then
  begin
    ShowMessage('CreateFile - Error: Invalid Handle');
    exit;
  end;

  SetLength(Buffer,512);

   // ....read the first 512 Byte (MBR)
  if not ReadFile(fHandle, Buffer[0], 512, nBytesRead, nil) then
  begin
    ShowMessage('ReadFile - Error');
  end;

  CloseHandle(fHandle);      // ...Schnell wieder den MBR zu-machen ;-)

  // --- nun sollte man den MBR im Array "Buffer" haben ---
end;
Gruss, Jörn

DeddyH 1. Dez 2008 16:04

Re: MBR auslesen
 
Jo, bei mir auch (was so ein paar läppische Backslashes nicht ausmachen können :mrgreen:).

turboPASCAL 1. Dez 2008 16:19

Re: MBR auslesen
 
Entschuldigung, die habe ich unterschlagen. ( Absichtlich ?! :gruebel: :stupid: )

Cyf 1. Dez 2008 18:34

Re: MBR auslesen
 
Huch erst nichts und auf einmal so viel hier drin. :P
Bin zwischenzeitlich zum selben Ergebnis gekommen, kam aber noch nicht dazu, das zu posten (Schule und so...). :wink:
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. :thumb: :dp:
(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 :gruebel: Mag dran liegen das sie in Asm sind und mir zum Thema (also Kernel nicht Asm grundsätzlich) noch insgesamt zuviel Hintergrundwissen fehlt.)

himitsu 2. Dez 2008 08:34

Re: MBR auslesen
 
Zitat:

Zitat von Cyf
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.

Abgesehn davon isses eh schlecht da einfach so drin rumzuschreiben, denn zusätzlich umgeht man gleich mal die Windowscache und andere Stellen, wo Werte von Windows zwischengespeichert werden ... vorallem beim MBR, den Bootsektoren, den FATs/PartitionsBitmaps und dem Dateisystem(MFT/Verzeichnisstrukturen) ... also einfach so rumschreiben und das ohne Windows bescheidzusagen ist nicht gut/klug.

Cyf 2. Dez 2008 16:28

Re: MBR auslesen
 
Naja es gibt sicherlich auch Ausnahmefälle wo sowas sinnvoll sein kann, Tools zum partitionieren oder zum resizen von Partitionen, wenn Windows damit grundsätlich Propleme hätte könnte man sowas ja zum Beispiel ja nicht ohne windows-eigene Programme lösen oder Bootmanager verwenden, dennoch sollte man wissen was man macht (und sowas besser in einer VM testen).

lbccaleb 2. Dez 2008 16:39

Re: MBR auslesen
 
Zitat:

Zitat von Cyf
..wenn Windows damit grundsätlich Propleme hätte könnte man sowas ja zum Beispiel ja nicht ohne windows-eigene Programme lösen oder Bootmanager verwenden..

[OT]
Naja, aber aus der Zeit von Win 3.1 sind wir raus. :stupid:
[/OT]

mr_emre_d 29. Mär 2009 18:25

Re: MBR auslesen
 
PChar('\\.\PHYSICALDRIVE0') :
Wie bekomme ich raus, was für andere Geräte am System angeschlossen sind ?

MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr.
Seite 2 von 3     12 3      

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 by Thomas Breitkreuz