2009年5月30日星期六

DOS编程之截取INT09

所有数据和代码都在CS段地址内

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 指向中断向量表中09中断向量
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VECTORS SEGMENT AT 0h
ORG 09h*4
INT9_Off dw ?
INT9_Seg dw ?

EXTRN _Int09_Route : NEAR16

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 替换原来的INT09,把向量保存在
wOrgINT9_Seg:wOrgINT9_Off
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
public _ReplaceInt9
_ReplaceInt9 proc near
push es
IF EXE_FILE EQ 1
; save original vector
mov ax,3509h
int 21h ; get int09h vector
mov cs:wOrgINT9_Off, bx
mov cs:wOrgINT9_Seg, es

; set new vector
push ds
push cs
pop ds
mov dx, offset INT9_Service
mov ax,2509h
int 21h ; set new int13h vector
pop ds ; restore DS
ELSE
xor ax, ax
mov es, ax
mov ax, es:INT9_Off
mov cs:wOrgINT9_Off, ax
mov ax, es:INT9_Seg
mov cs:wOrgINT9_Seg, ax

; set new vector
xor ax, ax
mov es, ax
mov ax, offset INT09_Service
mov es:INT9_Off, ax
mov ax, cs
mov es:INT9_Seg, ax
ENDIF
pop es
ret
_ReplaceInt9 endp



;-----------------------------------------------------------------------------
; INT9_Service is the entry of INT09
;-----------------------------------------------------------------------------
PUBLIC INT9_Service
INT9_Service:
pusha
in al, 60h
cmp al, 80h
jnb @f ; 检测键盘是按下还是放开
mov _KeyPressed, 1
@@:
popa
jmp dword ptr cs:wOrgINT9_Off

没有评论: