![]() |
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: 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