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