|
Не-
обходимо защищать программу. Один из возможных подходов иллюстри-
рует листинг 4-20.
Фактически, получение положительного ответа на запрос int 2Fh
AL=0 означает, что ответила некоторая TSR. |
архиватор winzip |
|
|
ISR int 2Fh, показан-
ная в листинге, отвечает на функцию AL=1 путем возврата ее сег-
мента кодов в регистре ES. TSR, сделавшая начальный запрос, может
использовать это значение для нахождения некоторой уникальной
строки. |
антивирус касперского |
|
{img3} |
резервное копирование баз данных |
|
Если строки совпадают между собой, то можно быть уверен-
ным, что найдена правильная ISR.
Такое расширение протокола многократного прерывания не явля-
ется стандартным. Отсутствует гарантия того, что некоторая другая
TSR будет выполняться в ответ на запрос int 2Fh AL=1. |
архиватор winzip |
|
|
антивирус панда, asplinux, asplinux 11, файловый менеджер, домашняя бухгалтерия, .
avast edition
|
Многократные прерывания
обеспечивают гарантируемые правильные входы IVT для int 2Fh и
протокол размещения программ TSR. Начальные входы IVT этого пре-
рывания int 2Fh указывают на инструкцию IRET. Каждая TSR, ожидаю-
щая использования мультиплексируемого прерывания, сначала ищет
предыдущие загруженные копии своей программы, а затем устанавли-
вает свою собственную программу ISR прерывания int 2Fh.
Листинг 4-19. Размещение TSR путем использования
произвольно выбранного вектора прерывания
----------------------------------------------------------------
NewISRVector EQU ?? ; заполнение номера вектора
OldISRxx DD 0 ; здесь программа сохраняет старый вектор
UniqueID DB 'уникальная строка' ; для идентификации ISR
IDLength EQU $-UniqueID ; длина строки
NewISRxx PROC FAR ; устанавливается программой инициализации
;
; ... ; все, что выполняет ISR
;
iret
NewISRxx ENDP
Locate PROC NEAR
mov al,NewISRVector ; al <== номер вектора
mov ah,35h ; ah <== получение функции вектора
; прерывания
int 21h ; запрос к DOS для вектора прерывания
ret ; es:bx имеет адрес ISR
LocateISR ENDP
CheckISR PROC NEAR
cmp bx,OFFSET NewISRxx ; существующее смещение
- 4-32 -
; хорошее
jnz done ; если не 0 -- нет
mov si,OFFSET UniqueID ; si <== смещение UniqueID
mov di,si ; di <== смещение UniqueID
mov cx,IDLength ; cx <== длина идентификатора
cld
repnz cmpsb ; сравнение идентификаторов
done: ret ; возврат :
; zr=1 ==> результат установлен
CheckISR ENDP ; zr=0 ==> результат не установлен
TSRResdnt PROC NEAR ; определяет резидентная ли TSR
call LocateISR ; получение адреса ISR
call CheckISR ; проверяет идентификатор ID
ret ; и возвращает:
; zr=1 ==> результат установлен
; zr=0 ==> результат не установлен
TSRResdnt ENDP
----------------------------------------------------------------
TSR сама осуществляет поиск резидентных копий путем загрузки
уникального идентификатора в регистр AH, нуля в регистр AL и вы-
полнения инструкции int 2Fh. Программа ISR 2Fh проверяет значение
в регистре AH. Если ISR распознает идентификатор, то она устанав-
ливает AL=00fh и возвращает управление по инструкции IRET; в про-
тивном случае она переходит к ранее сохраненной ISR int 2Fh. В
конце концов, либо будет достигнут конец этой цепочки, либо ISR
распознает значение в регистре AH.
Снова возможны конфликты. Для их разрешения TSR должна выб-
рать дополнительные проверки. Для облегчения этой проверки можно
расширить протокол прерывания int 2Fh, но при этом следует иметь
в виду, что стандарты на дополнительные проверки отсутствуют.
|
|
|