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

iret      

exit: sti              

jmp cs:[Old_2F]   ; перейдем по адресу старого обработчика прерывания 2F.

Old_2F   DD 0     ;Переменная для хранения оригинального адреса обработчика 2Fh

New_2F  endp

;Нерезидентная часть программы:

Init:

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

mov   ax,8899h

int   2Fh 

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

je    tsr_runs

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

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

mov   ah,35h     

mov   al,21h            ; номер прерывания

int   21h         ;Теперь в ES:BX адрес (вектор) 21h прерывания

mov   word ptr Old_21h,bx

mov   word ptr Old_21h+2,es   ; сохраним адрес

;Теперь перехватываем прерывание:

mov   ax,2521h

lea   dx,New_21h  ;DX должен указывать на наш обработчик

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

Завершим программу, оставив ее резидентной в памяти:

mov   dx,offset Init

int   27h

tsr_runs:

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

mov   si,80h     ;загрузим в AL число символов в строке параметров

lodsb             ;(получим его из PSP)

cmp   al,5        ;если командная строка короче 5 символов - выходим         

jl    msg&bue                

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

lodsw      

cmp   ax,'d/'  

jne   msg&bue           ;проверим ключ /del

lodsw    

cmp   ax,'le'  

jne   msg&bue    

;Выгрузка программы из памяти:

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

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

push ds       ;в таблицу векторов прерываний               

lds   dx,dword ptr es:Old_21h

mov   ax,2521h             

int   21h

lds   dx,dword ptr es:old_2F ;То же сделаем с прерыванием 2Fh

mov   ax,252Fh             

int   21h                  

pop   ds   

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

int   21h                  

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

mov   es,word ptr es:[002ch]

mov   ah,49h

int   21h                  

jmp   bue

msg&bue:

mov   ah,9

lea   dx, Message

int   21h

bue:  mov   ax,4c00h

int  21h

Message db 'Use /del$'

CSEG ends

end Start


Результат работы программы

Рис. 3. Работа TSR программы

После запуска резидента и нескольких программ (рис. 3.) в файл files.txt была записана следующая информация:

C:\BORLANDC\BIN\ROOT_R.EXE

C:\BORLANDC\BIN\ROOT_R_2.EXE

C:\T.COM

C:\OO10.COM

C:\TSR.COM


Список использованных источников

1. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 1. Часть 1, 2, 3. Операционная система MS-DOS. М: ДИАЛОГ-МИФИ, 1991, 1993

2. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 2. Аппаратное обеспечение IBM PC. Часть 1, 2. М: ДИАЛОГ-МИФИ, 1992

3. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 18. Часть 1, 2. MS-DOS для программиста. М: ДИАЛОГ-МИФИ, 1995

4. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 6. Защищенный режим процессоров Intel 80286/80386/80486. М: ДИАЛОГ-МИФИ, 1993

5. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 8. Локальные сети персональных компьютеров. Использование протоколов IPX, SPX, NETBIOS. М: ДИАЛОГ-МИФИ, 1993