Hogyan írjunk saját BootManagert - IV. rész

 

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