Studna
Studna > ╚lßnky > Runtime Error at ... > RTE 00:03



Runtime Error at 00:03 aneb Drivery

V dneÜnφm dφle se podφvßme na drivery. Toto Φφslo je zßvisl² na Pascalu, ale CΘΦka°i si urΦit∞ taky u₧ijou.

Pravd∞podobn∞ znßte shareware prohlφ₧eΦ obrßzk∙ QPEG nebo aspo≥ star² Φφsla Pa°eniÜt∞. Zde se objevujφ krßtkΘ assemblerovskΘ progrßmky na p°epφnßnφ bank, nastavovßnφ dΘlky VRAM a podobnΘ rutinky. Tyto progrßmky jsou venkovnφ, aby se daly jednoduÜe upravovat. A jß vßm zde nabφzφm vyu₧itφ ve vaÜich programech.

Nejd°φve driver:

model tiny
codeseg
p286
startupcode
dw init,info,0áááá
;sem se zapφÜφ adresy funkcφ

init:áááá
;prvnφ funkce

áá
;sem si namrskejte ≥ßk² instrukce, a¥ to n∞co d∞lß

retfáááá
;!!! tak tohle je fakt nutn² FAR RETURN !!!

info: db 'Informace','$'ááá
;informace o driveru
end

zde je takovß kost°iΦka naÜeho driveru. Pro zkompilovßnφ jsem p°idal ba¥ßk COMPILE, kter² sma₧e star² driver, zkompiluje a slinkuje COM fajl a p°ejmenuje ho na ".DRV" Jinak, kompilujeme ho takle (jen pro zopßknutφ):

TASM xxx.asm
TLINK /t xxx.obj <---- vytvo°φ COMßΦ
REN xxx.com xxx.drv

Pokud n∞jak² drivery mßme, p°φjde ta horÜφ Φßst. Jak to nahrßt do pam∞ti a jak to spustit. Ud∞lßme si takovou "krycφ" proced∙rku.

procedure driver; far; assembler; {FAR procedura}
  asm
    dw 104h,106h{init,info - adresy, kdy₧ driver nenφ nahrßn}
    retf
    db 0
    db 'nic','$'
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
end;

Takto vypadß proced∙rka, do kterΘ si budeme nahrßvat driver, stejn∞ tak by to mohl bejt kus pam∞ti na heapu nebo v XMS, ale to nevim, jak by funkΦnilo.

Ty prvnφ dv∞ Φφsla jsou tam proto, kdyby n∞jakej sna₧ivec volal funkce driveru, kdy₧ jeÜt∞ nenφ nahrßn. T∞ch nul si tam m∙₧ete dßt, kolik chcete, zßvisφ to na dΘlce nejv∞tÜφho driveru.

Nahrßnφ driveru:

Tak to by nem∞l b²t problΘm:

procedure load_driver(st:string);
var f:file;
    nr:integer;
    drv_size:longint;
begin
  assign(f,st);
  reset(f,1);
  blockread(f,@driver^,filesize(f),nr);
  close(f);
end;

Pozn: @driver^ je ukazatel na naÜφ krycφ proced∙rku

Vyvolßnφ driveru:

Nejd∙le₧it∞jÜφ je vypoΦφtat adresu ulo₧enφ. Ve zdrojßku jsou dv∞ ukßzky, z Built-in assembleru a pomocφ fcφ SEG a OFS a vypadß to takto:

asm
    mov bx,offset driver-100h; {vezme si adresu driveru}
    add bx,[cs:bx+100h];       {a pricte k ni adresu funkce}
    jmp bx;                    {a zavola ji}
end;

T∞ch 100h v druhΘm °ßdku s instrukcφ ADD znamenß, ₧e p°ipoΦφtßvß adresu prvnφ funkce v driveru, pokud by tam bylo 102h tak by Ülo o druhou fci a tak dßle.

var xs,xo:word;
    start:word;
begin
  xs:=seg(@driver^);
  xo:=ofs(@driver^)-$100;
  start:=xo+memw[xs:xo+$100];
end;

Takhle by se to ud∞lalo pomocφ ΦistΘho prßskala. Je to op∞t na stejnΘm principu.

Tohle je tedy konec t°etφ Φßsti RTEΦka. Doufßm ₧e budou n∞jakΘ dalÜφ. (ale jß u₧ vφm, ₧e budou :-))))

Pokud to nechßpete, prostudujte si zdrojßky nebo si to proje∩te v Turbo Debuggeru.

╚au

pavel (paulsoft/no!future)

Pozn.: Tyto nabitΘ informace jsem zφskal podrobn²m zkoumßnφm zdrojov²ch driver∙ QPEGa a Pa°eniÜt∞ a tφmto d∞kuji Dementovi z Public DomainovΘ zdrojßky na vyu₧φvßnφ driver∙. Sßm bych na to asi nep°iÜel. D═KY, Demente!!!

kontakt:
mail jislp@feld.cvut.cz
http http://cs.felk.cvut.cz/~jislp/
irc kanßly #cs, #cz, #cesi; nick xpj

ZdrojovΘ texty p°φklad∙ (ZIP, 6 kB).


Zp∞t nahoru ]
Copyright © 1997, 1998 Pavel Jisl, jislp@feld.cvut.cz