Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Лекция № 9 Резидентные программы в MS DOS.ppt
Скачиваний:
9
Добавлен:
07.08.2024
Размер:
708.1 Кб
Скачать

Установка резидентной программы

B oбoиx примерах уcтaнoвлeнa мeткa FINISH для oтмeтки кoнцa пpoцeдуpы пpepывaния. Для COM фaйлoв FINISH дaeт cмeщeниe oт нaчaлa PSP, кaк и тpeбуeтcя для пpepывaния 27H. Для EXE фaйлoв cмeщeниe oтcчитывaeтcя oт пepвoгo бaйтa, cлeдующeгo зa PSP, пoэтoму к нeму нeoбxoдимo пpибaвить 100H, чтoбы пepecчитaть нa нaчaлo PSP. Следует зaмeтить, чтo пoмecтив пpoцeдуpу в нaчaлo пpoгpaммы, мoжно иcключить уcтaнoвoчную чacть кoдa из peзидeнтнoй программы.

Прерывание 27H не может установить резидентную

программу, большую 64K.

Установка резидентной программы

Функция 31H пpepывaния 21H paбoтaeт aнaлoгичнo, зa иcключeниeм тoгo, чтo в DX дoлжнo coдepжaтьcя чиcлo 16- бaйтныx пapaгpaфoв oт нaчaлa PSP.

Пpeимущecтвoм этoй функции являeтcя тo, чтo oнa пepeдaeт poдитeльcкoй пpoгpaммe кoд выxoдa в регистре AL, дaющий инфopмaцию o cтaтуce пpoцeдуpы.

Poдитeльcкaя пpoгpaммa пoлучaeт этoт кoд c пoмoщью функции 4DH пpepывaния 21H (в AH – номер функции,

вAL - код выхода).

Вслучае использования этой функции нужно правильно рассчитать длину оставляемого в памяти блока программы.

Установка резидентной программы

 

Пример.

;сегмент данных

DSEG SEGMENT

 

BUFFER

DВ 2000 DUP(?)

P1

DD ?

DSEG ENDS

 

;сегмент стека

SSEG SEGMENT STACK

ST

DW 100 DUP(?)

SSEG ENDS

 

;сегмант кода

 

CODE SEGMENT

 

ASSUME CS:CODE, DS:DSEG, SS:SSEG

BEGIN:

 

.

 

.

 

.

 

;все, что ниже в памяти не останется

 

 

NO_RES:

 

 

 

 

 

MOV

AX,

SIZE

BUFER+SIZE P1+16

; сегмент

данных

MOV

BX,

SIZE

ST+16

; сегмент

стека

Установка резидентной программы

MOV

DX,NO_RES-BEGIN+16 ; часть сегмента кода

MOV

CL,4

 

SHR

AX,CL

; делим на 16

SHR

BX,CL

 

SHR

DX,CL

 

ADD

AX,BX

 

ADD

DX,AX

 

ADD

DX,10H

; учтем PSP - 10H параграфов

MOV

AX,3100H

 

INT

21H

 

CODE

ENDS

 

END

BEGIN

 

Защита резидентной программы от повторной установки

Может получиться, что пользователь, установив резидентную программу, забудет об этом и запустит­ ту же программу повторно. В этом случае в память будет загружена и останется резидентной вторая копия той же программы.

Это плохо не только потому, что понапрасну­ расходуется память; более неприятным является вторичный перехват тех же векторов. Если резидентная программа после ее активизации не обращается к старому содержимому перехваченных ею векторов, то вторая копия полностью лишит первую работоспособности и тогда повторная загрузка приведет только к расходованию памяти­.

Защита резидентной программы от повторной установки

Если, однако, резидентная программа в процессе своей работы передает управление старому обработчику перехваченного ею прерывания,­ то новая копия резидентной программы, сохранившая в процессе инициализации адрес первой копии в качестве содержимого перехватываемого вектора, будет при каждой­ активизации вызывать и первую копию. В результате резидентная программа будет фактически выполняться при каждом вызове дважды. Во многих случаях такое повторное выполнение нарушит правильную работу программы. Поэтому обязательным­ элементом любой резидентной программы является процедура защиты ее от по­ вторной загрузки (установки).

Защита резидентной программы от повторной установки

Существует несколько способов обнаружения копии резидентной программы в памяти:

1.Внешняя привязка к перехваченному вектору прерывания. Суть этого метода заключается в том, что в теле программы помещается некоторый признак - обычно это слово. Далее делается предположение, что, поскольку резидентной программой был перехвачен определенный вектор, то он должен быть направлен в тело программы. Таким образом, имеется адрес входа в процедуру прерывания и по этому адресу ищется признак присутствия.

Защита резидентной программы от повторной установки

Пример. Фрагмент TSR-программы с признаком присутствия

; в резидентной процедуре

 

PRIZN DW АВ12Н

 

 

TSR

РROC FAR

 

 

...

 

 

TSR

ENDP

 

 

 

...

 

 

; в установочной части кода

 

MOV

АХ,3570Н

 

INT

21H

 

 

MOV

AX,PRIZN

;проверяем на присутствие

СМP

WORD PTR ES:[BX-2],AX

;проверяем на присутствие

JE

NO_SET_UP

 

 

...

 

 

NO_SET_UP:

MOV AH,4CH

; выход без установки

 

INT 21H

 

Излагаемый метод не слишком совершенен, т.к. после запуска программы другие резиденты могут перехватить ключевое прерывание, и программа перестанет обнаруживать себя в памяти.

Защита резидентной программы от повторной установки

2.Внутренняя привязка к перехваченному прерыванию. Как и в предыдущем случае, используется перехваченное программой прерывание. Используется заведомо не существующая функция этого прерывания. В ответ на вызов такой функции программа, находящаяся в памяти, посылает в ответ (в одном из регистров) код возврата, сигнализирующий о своем присутствии в памяти. Следует заметить, что таким способом можно не только определять присутствие программы в памяти, но и отдавать указания программе, находящейся в памяти. Через один из регистров можно передать, например, сегментный адрес резидента, который необходим для удаления его из памяти. Указанный метод более надежен, прост и универсален, чем предыдущий.

Защита резидентной программы от повторной установки

Пример. Фрагмент TSR-программы с кодом возврата

; в резидентной процедуре

 

INT16 PROC FAR

 

СМР АН,20Н

 

 

JNZ CONT

 

 

MOV АХ,789АН

 

;код присутствия

IRET

 

 

CONT:

 

 

JMP WORD PTR CS:OLD16

 

INT16 ENDP

 

 

...

 

 

; в установочной части кода

 

MOV АН,20Н

 

 

INT 16H

 

 

CMP АХ,789АН

 

 

JZ NO_SET_UP

 

;программа в памяти

...

 

 

NO_SET_UP:

MOV AH,4CH

; выход без установки

 

INT 21H

 

Здесь, правда, существует одна не слишком приятная проблема. Могут совпасть номера функций, используемых разными программами. Выйти из этого положения можно следующим способом: программа должна реагировать не просто на посланный код, а на последовательность кодов. Тем самым можно свести почти до нуля вероятность совпадений.