Ezennel elérkeztünk a cikksorozat utolsó részéhez. Most olyan dolgokat szeretnék leírni ami a korábbi részekből kimaradt, valamint ahogy ígértem, azt is leírom, hogyan lehet beüzemelni egy ilyen bootmanagert.
Szigorúan csak olyanok próbálkozzanak meg a dologgal, akiknek van megfelelő assembly tapasztalatuk, (nem a cikk olvasásával szerzett tapasztalat, mert ez végig egy gyakorlati jellegű cikksorozat volt, amiből nem lehet a nyelvet megtanulni), tökéletesen tisztában vannak a bootmanagerek működésével és tudják mi a teendő ha valami hiba lép fel. Mivel pont az operációs rendszer indítása előtti folyamatot írjuk át, ha valamit elrontunk akkor semmilyen oprendszer nem fog elindulni.
Eddig még nem hangsúlyoztam eléggé, hogy az általam bemutatott példa az elsődleges (primary) partíciókra installált operációs rendszerekhez használható.
Ha nem ilyen partíción van valamelyik oprendszerünk, akkor ne is próbálkozzunk a dologgal. Ezt megtudhatjuk, ha ellenőrizzük a típuskódokat (lásd az első részben).
Az extended partíció (ami nekünk nem jó) kódja 5-ös. Természetesen
lehet ilyen partíciónk is, csak ne legyen rajta operációs rendszer. Ha fdisk
programmal partícionáltunk és több partíciót hoztunk létre, akkor biztosan van egy extended, mert az
fdisk csak 1 primary partíciót tud létrehozni a maximum 4 helyett.
A harmadik részben az int13H
megszakítás 42H és 43H funkcióját használtuk. Előfordulhat, hogy nagyon régi
alaplapokban található BIOS nem támogatja ezt a funkciót. Sajnos nem találtam
meg mivel lehet lekérdezni, hogy használható-e ez a két rutin, ezért ha valaki
tudja nekem is megírhatja :-).
A bootmanager “felinstallálását”
csupasz DOS alatt végezzük, ugyanis az olyan operációs rendszerek mint például
a WinXP, nem engedik meg a virtuális módban futó programoknak hogy szektorokat
írjanak/olvassanak. Egyszerűen nem engedik lefuttatni az ilyeneket (a Win98 még
igen).
Most pedig következik a gyakorlati
rész. A bootmagert fordítsuk a tasm assemblerrel com-ba, és a keletkezett com
file-t kell majd paraméterként megadni az ‘installáló’ programnak.
A második részben készítettünk egy
int13H olvasó függvényt.
function
harddisk_read(hova:pointer; meghajto_azonosito,fej:byte;
cilinder_szektor:word):byte;
Most ennek a párjára is szükségünk
lesz, ami a szektorok írását végzi. Szintén TP7.0-ben megvalósítva a
következőképpen néz ki:
function harddisk_write(honnan:pointer; meghajto_azonosito,
fej:byte; cilinder_szektor:word):byte; assembler;
asm
push es
mov ah,3
mov al,1
mov
dl,meghajto_azonosito
mov dh,fej
mov
cx,cilinder_szektor
les bx,honnan
int 013h
mov al,ah
jc @quit
xor al,al
@quit:
pop es
end;
Ezeket a függvényeket rakjuk egy HDD unitba és csináljunk még egy tsector típust:
Type tsector = array [0..511] of byte
Ezt a unitot használjuk fel a következő programban, amiben az első winchester MBR-jába fogjuk rakni, ha
nem ide akarjuk, akkor paraméterként $80 helyett $81, $82 ... a merevlemez
számát kell megadni.
Program
MBR_Save_Load;
uses
CRT,HDD;
procedure
install(name:string);
var
i, k : word;
f : file of byte;
s, t : tsector;
begin
assign(f,name); reset(f);
if filesize(f)>$1bd then
begin
writeln('Invalid file. File size must be
less then $1bd byte.'); (*ha tul nagy a file*)
exit;
end;
i:=0;
while not eof(f) do
begin
read(f,s[i]); i:=i+1; (*beolvassuk s-be *)
end;
close(f);
for
k:=i to $1bd do (*ha kisebb mint a
maximum méret, akkor feltöltjük nop-pal*)
s[k]:=$90;
if harddisk_read(@t,$80,0,1)<>0 then {0-$1bd-ig betöltő progi} {beolvassuk az mbr-t}
begin
writeln('Error can`t read MBR.'); {ha hiba lépett fel}
exit;
end;
for
i:=0 to $1bd do {és
lecseréljük a betöltő rutint a sajátunkra}
t[i]:=s[i];
if harddisk_write(@t,$80,0,1)=0 {majd fogjuk és felírjuk a szektort} then
writeln(‘Ok,
MBR has been replaced with file ',name,' succesfully.');
else
writeln('Error can`t write MBR.');
end;
Begin
clrscr;
if paramcount<>1 then
begin
writeln('MBR loader/saver');
writeln('=============');
writeln;
writeln('usage: mbr.exe [file name]');
exit;
end;
install(paramstr(1));
End.
A második részben utaltam arra, hogyan készíthetünk biztonsági másolatot az MBR-ről, ezt ajánlatos a felmásolás előtt megtenni.
Még egy dolgot köteles vagyok kijelenteni :
Sem én, sem a Codex, sem a PCWorld semmilyen felelősséget nem vállal azért, ha a példaprogram kipróbálása közben valamilyen hiba lép fel.
Ezennel a cikksorozat végére értünk, mindenféle észrevételt, javaslatot, kritikát szívesen fogadok.
Magyar Attila - m.magyar3@chello.hu