p***@web.de
2006-08-13 20:10:20 UTC
Hallo,
Ich habe Probleme mit folgendem Programm, das ich zum Experimentieren
geschrieben habe:
--------------------------------------------------------------------------------------
Code Segment
Assume cs:code
Org 100h
Begin: jmp Install ;TSR installieren
int 20h
Tsr PROC FAR
Assume cs:code
jmp indosx
indos dw 0,0
hallo db "dsad$"
indosx:
mov ax, word ptr indos ;lese indos byte aus
mov es,ax
mov bx, word ptr indos+1
cmp byte ptr es:[bx],0
jne ende
mov ah,9h
mov dx, offset hallo
cli
int 21h
sti
ende:
iret
Tsr ENDP
Install PROC NEAR
Assume cs:code,ds:code
;adresse des indosflag kopieren
mov ah,34h
int 21h
mov word ptr indos,es
mov word ptr indos+1,bx
mov ah,25h ; int 13h auf die eigene Routine verbiegen
mov al,13h
mov dx,offset tsr
cli
int 21h
sti
mov dx,offset Install ;speicherresident beenden
int 27h
Install ENDP
Code ENDS
END Begin
------------------------------------------------------------------------------------------------------
Es verbiegt den Int13h auf die eigene Routine(, das Aufrufen der
ursprünglichen Routine habe ich noch nicht implementiert)
Soweit klappt auch alles; wie vorauszusehen war, sind keine Zugriffe
auf die Festplatte mehr möglich, allerdings ist das Indos Byte
immer(!) ungleich 0, das heißt, es ist momentan schon ein Interrupt
aktiv, der nicht gestört werden will.
Folgende Varianten habe ich ausprobiert:
- Ausführen des Int 10 innerhalb des TSR statt des INT21:
funktioniert, da es sich um einen BIOS Interrupt handelt.
- Ausführen des Int 21 innerhalb des TSR ohne Indosbyte Überprüfung:
Programmcrash.
- Ausführen des Programmes mit Indosbyte Überprüfung: Indos Byte ist
immer <> 0, d.h. kein Int21 ausführbar...
Wie kann ich trotzdem "irgendwie" den Int21 innerhalb des verbogenen
Interrupts aufrufen? Hat die Tatsache, dass das Indosbyte immer
ungleich 0 ist, etwas damit zu tun, dass ich gerade den Int13 verbogen
habe?
MfG,
baser
Ich habe Probleme mit folgendem Programm, das ich zum Experimentieren
geschrieben habe:
--------------------------------------------------------------------------------------
Code Segment
Assume cs:code
Org 100h
Begin: jmp Install ;TSR installieren
int 20h
Tsr PROC FAR
Assume cs:code
jmp indosx
indos dw 0,0
hallo db "dsad$"
indosx:
mov ax, word ptr indos ;lese indos byte aus
mov es,ax
mov bx, word ptr indos+1
cmp byte ptr es:[bx],0
jne ende
mov ah,9h
mov dx, offset hallo
cli
int 21h
sti
ende:
iret
Tsr ENDP
Install PROC NEAR
Assume cs:code,ds:code
;adresse des indosflag kopieren
mov ah,34h
int 21h
mov word ptr indos,es
mov word ptr indos+1,bx
mov ah,25h ; int 13h auf die eigene Routine verbiegen
mov al,13h
mov dx,offset tsr
cli
int 21h
sti
mov dx,offset Install ;speicherresident beenden
int 27h
Install ENDP
Code ENDS
END Begin
------------------------------------------------------------------------------------------------------
Es verbiegt den Int13h auf die eigene Routine(, das Aufrufen der
ursprünglichen Routine habe ich noch nicht implementiert)
Soweit klappt auch alles; wie vorauszusehen war, sind keine Zugriffe
auf die Festplatte mehr möglich, allerdings ist das Indos Byte
immer(!) ungleich 0, das heißt, es ist momentan schon ein Interrupt
aktiv, der nicht gestört werden will.
Folgende Varianten habe ich ausprobiert:
- Ausführen des Int 10 innerhalb des TSR statt des INT21:
funktioniert, da es sich um einen BIOS Interrupt handelt.
- Ausführen des Int 21 innerhalb des TSR ohne Indosbyte Überprüfung:
Programmcrash.
- Ausführen des Programmes mit Indosbyte Überprüfung: Indos Byte ist
immer <> 0, d.h. kein Int21 ausführbar...
Wie kann ich trotzdem "irgendwie" den Int21 innerhalb des verbogenen
Interrupts aufrufen? Hat die Tatsache, dass das Indosbyte immer
ungleich 0 ist, etwas damit zu tun, dass ich gerade den Int13 verbogen
habe?
MfG,
baser