Создание TSR программ в ОС MS DOS, страница 2

old_28     dd 0

New_28 endp

start:

;Проверим нет ли нашей программы в памяти?

mov   ax,08000h

int   2Fh 

cmp   ax,0ABCDh   ;Проверим поступивший из прерывания «отзыв».

je    analiz

;Начинаем установку программы резидентом в памяти

;Для этого сначала сохраним адреса старых векторов прерываний:

mov   ax,3528h   

int   21h

mov   word ptr old_28,bx     

mov   word ptr old_28+2,es

;а вместо старого вектора установим адрес нашей процедуры 

mov   ax,2528h               

lea   dx,new_28        

int   21h              

;Теперь то же самое проделаем с вектором 2Fh:

mov   ax,352Fh  

int   21h       

mov   word ptr old_2F,bx     

mov   word ptr old_2F+2,es   

mov   ax,252Fh         

lea   dx, New_2F

int   21h

;и с вектором 1Сh:

mov   ax,351Ch  

int   21h       

mov   word ptr old_1C, bx    

mov   word ptr old_1C+2, es  

mov   ax,251Ch         

lea   dx, New_1C

int   21h

;Разместим в регистре dx адрес начала не резидентной части нашей программы     

lea   dx,start

int   27h   ;завершим нашу программу, оставив ее в памяти резидентной  

;если программа обнаружена уже установленной в памяти:

analiz:

;Будем анализировать содержимое  строки параметров нашей программы.

mov   si,80h     ;проверяем количество символов в строке параметров

lodsb                    

cmp   al,3                 

jl    bue         ;если командная строка коротка

inc   si   ;иначе перейдем на адрес следующего байта командной строки

lodsw      

cmp   ax,'u/'     ;проверим ключ /u

jne   bue                  

;модуль выгрузки программы из памяти

mov   ax,3528h;загрузим регистры ES:BX адресом нашей программы в памяти

int   21h         ;и возвратим старый вектор прерываний на

push ds          ;«родное место» в таблицу векторов прерываний       

lds   dx,dword ptr es:old_1C

mov   ax,251Ch              

int   21h                  

lds   dx,dword ptr es:old_28

mov   ax,2528h        ;То же сделаем с прерыванием 28h и 2Fh

int   21h                  

lds   dx,dword ptr es:old_2F

mov   ax,252Fh             

int   21h                   

pop   ds                   

mov   ah,49h       ;освободим память, занимаемую резидентом 

int   21h                  

;освободим память, занятую блоком окружения программы:

mov   es,word ptr es:[002ch]

mov   ah,49h

int   21h                  

bue:  mov   ax,4c00h

int  21h

TSRprog endp

code_seg ends

end begin


Результат работы программы, контроль над ее установлением в памяти

На рис.1 представлен результат работы программы – строка “10 seconds passed”, которая появляется через 10 секунд после запуска программы и обновляется через каждые 10 секунд. Также приведены показания утилиты mem.exe по размещению программ в памяти после запуска данной программы (lab5os.com) и запуска программы tsr.com из третьей части задания.

Рис. 1. Результат работы, показания утилиты mem

На рис. 2 – показания утилиты mem после удаления обеих программ из памяти (запуск lab5os.com /u и tsr.com /del). Видно, что программы удалены из памяти.

Рис. 2. Корректное удаление программ из памяти


Алгоритм работы программы

Данная программа записывает в файл имена (пути) запускаемых пользователем программ. Согласно требованиям к TSR программам в программу входят: модуль установки программы в память; модуль предотвращения повторной установки программы в память; модуль записи в файл путей запускаемых пользователем программ; модуль выгрузки программы из памяти.