Выход из резидентной программы или выгрузка ее из памяти
Добавлено: 22 дек 2013, 19:19
У меня есть программа, загружаемая резидентно в память ПК и осуществляющая перехват прерывания INT09h, анализирующая нажатие пользователем комбинации клавиш, в случае нажатия комбинации Alt-A выполнятся слияние двух файлов.
Помогите сделать выход из резидентной программы или сделать выгрузку ее из памяти.
.model tiny
.code
.286
org 1eh
org 1ch
envseg dw ?
org 100h
start:
jmp init
int09h_handler proc far
jmp short actual_int09h_handler
old_int09h dd ?
dw 424Bh
db 00h
actual_int09h_handler:
pushf
call dword ptr cs:old_int09h
disable_point label byte
pusha
push ds
push es
cld
push 0B800h
pop es
push 0040h
pop ds
mov di, word ptr ds:001Ch
jne l1
jmp exit
l1:
mov ax, word ptr [di]
No_ext:
mov ah,10h ;ожидание нажатия клавиши от пользователя
int 16h ;(в ah=0, если расширенный, в al=расширенный код)
cmp al,0 ;проверка на расширенный код
jnz No_ext ;если не расширенный код, то переход к No_ext
cmp ah,1eh ;расширенный код Alt+a(в ah );
push cs
pop ds
je Alt_a ;если да(Alt+a), то переход к Alt_a:
jne re
jmp exit
re: ;иначе на старый вектор
Alt_a proc near
;открываем первый файл
MOV AH,3DH
MOV AL,0
LEA DX,PATH1
INT 21H
JC CLOSE2
MOV HANDL1,AX
;открываем второй файл
MOV AH,3DH
MOV AL,1
LEA DX,PATH2
INT 21H
JC CLOSE1
MOV HANDL2,AX
;указатель второго файла на конец
MOV AH,42H
MOV BX,HANDL2
XOR CX,CX
XOR DX,DX
MOV AL,2
INT 21H
;готовим регистры
LEA DX,BUFER
MOV CX,1000
;блок копирования
LOO:
;читаем
MOV BX,HANDL1
MOV AH,3FH
INT 21H
CMP AX,CX
JZ NORM
MOV CX,AX ;<1000 байт
MOV EOF,1 ;достигнут конец файла
NORM:
;пишем
MOV BX,HANDL2
MOV AH,40H
INT 21H
CMP EOF,0 ; не достигнут ли конец
JZ LOO
; закрываем второй файл
CLOSE2:
MOV AH,3EH
MOV BX,HANDL2
INT 21H
;закрываем первый файл
CLOSE1:
MOV AH,3EH
MOV BX,HANDL1
INT 21H
;выход в ДОС
EXIT1:
MOV Ax,4C00H
INT 21H
Alt_a endp
int09h_handler endp
exit:
pop es
pop ds
popa
iret
init proc near
mov ax,3509h; получим адрес обработчика прерывания
int 21h
mov word ptr old_int09h,bx
mov word ptr old_int09h+2,es
mov ax,2509h; установим адрес нового обработчика
mov dx, offset int09h_handler
int 21h
mov ah,49h
mov es, word ptr envseg
int 21h
mov dx, offset init
mov ah,09h
mov dx,offset mes_l
int 21h
int 27h
ret
buf db 1 dup (?)
PATH1 DB 'PRIMER1.TXT',0;имя первого файла
PATH2 DB 'PRIMER2.TXT',0;имя второго файла(куда добавлять)
HANDL1 DW ? ;описатель первого файла
HANDL2 DW ? ;описатель второго файла
BUFER DB 1000 DUP(?) ;буфер
EOF DB 0 ;если 1,то в процессе чтения
;достигнут конец файла
mes_l db 'Rezident zagruzhen',0Dh,0Ah,'$'
mes db 'Rezident vygruzhen',0Dh,0Ah,'$'
init endp
end start
Помогите сделать выход из резидентной программы или сделать выгрузку ее из памяти.
.model tiny
.code
.286
org 1eh
org 1ch
envseg dw ?
org 100h
start:
jmp init
int09h_handler proc far
jmp short actual_int09h_handler
old_int09h dd ?
dw 424Bh
db 00h
actual_int09h_handler:
pushf
call dword ptr cs:old_int09h
disable_point label byte
pusha
push ds
push es
cld
push 0B800h
pop es
push 0040h
pop ds
mov di, word ptr ds:001Ch
jne l1
jmp exit
l1:
mov ax, word ptr [di]
No_ext:
mov ah,10h ;ожидание нажатия клавиши от пользователя
int 16h ;(в ah=0, если расширенный, в al=расширенный код)
cmp al,0 ;проверка на расширенный код
jnz No_ext ;если не расширенный код, то переход к No_ext
cmp ah,1eh ;расширенный код Alt+a(в ah );
push cs
pop ds
je Alt_a ;если да(Alt+a), то переход к Alt_a:
jne re
jmp exit
re: ;иначе на старый вектор
Alt_a proc near
;открываем первый файл
MOV AH,3DH
MOV AL,0
LEA DX,PATH1
INT 21H
JC CLOSE2
MOV HANDL1,AX
;открываем второй файл
MOV AH,3DH
MOV AL,1
LEA DX,PATH2
INT 21H
JC CLOSE1
MOV HANDL2,AX
;указатель второго файла на конец
MOV AH,42H
MOV BX,HANDL2
XOR CX,CX
XOR DX,DX
MOV AL,2
INT 21H
;готовим регистры
LEA DX,BUFER
MOV CX,1000
;блок копирования
LOO:
;читаем
MOV BX,HANDL1
MOV AH,3FH
INT 21H
CMP AX,CX
JZ NORM
MOV CX,AX ;<1000 байт
MOV EOF,1 ;достигнут конец файла
NORM:
;пишем
MOV BX,HANDL2
MOV AH,40H
INT 21H
CMP EOF,0 ; не достигнут ли конец
JZ LOO
; закрываем второй файл
CLOSE2:
MOV AH,3EH
MOV BX,HANDL2
INT 21H
;закрываем первый файл
CLOSE1:
MOV AH,3EH
MOV BX,HANDL1
INT 21H
;выход в ДОС
EXIT1:
MOV Ax,4C00H
INT 21H
Alt_a endp
int09h_handler endp
exit:
pop es
pop ds
popa
iret
init proc near
mov ax,3509h; получим адрес обработчика прерывания
int 21h
mov word ptr old_int09h,bx
mov word ptr old_int09h+2,es
mov ax,2509h; установим адрес нового обработчика
mov dx, offset int09h_handler
int 21h
mov ah,49h
mov es, word ptr envseg
int 21h
mov dx, offset init
mov ah,09h
mov dx,offset mes_l
int 21h
int 27h
ret
buf db 1 dup (?)
PATH1 DB 'PRIMER1.TXT',0;имя первого файла
PATH2 DB 'PRIMER2.TXT',0;имя второго файла(куда добавлять)
HANDL1 DW ? ;описатель первого файла
HANDL2 DW ? ;описатель второго файла
BUFER DB 1000 DUP(?) ;буфер
EOF DB 0 ;если 1,то в процессе чтения
;достигнут конец файла
mes_l db 'Rezident zagruzhen',0Dh,0Ah,'$'
mes db 'Rezident vygruzhen',0Dh,0Ah,'$'
init endp
end start