Создание TSR программ в операционной, страница 6

pop    cx

pop    es

pop    bp

pop    bx

pop    ax

M1:     popf

; В заключение процедуры передадим управление старому обработчику

jmp    cs:[old_28]

;А это область данных нашей процедуры New_28. Здесь хранится текстовая стро;ка выводимая на экран ПЭВМ

curtime   db   " 10 секундистекли!”

old_28     dd 0

New_28 endp

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

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

Начинается модуль с метки (мы ее сами придумали):

start:

; Во-первых, сразу запросим прерывание 2F – нет ли нашей программы в памяти?

;Для этого занесем в AX запланированный нами код функции (см. выше процедуру

;New_2F – мы там решили занять для своих нужд функцию 80 и подфункцию 00

              mov ax,08000h

;Обратимся к функции 2F

              int    2Fh 

;Проверим поступивший из прерывания «отзыв». Наша программа должна ото;зваться кодом 0ABCD (см.выше процедуру New_2F)

              cmp ax,0ABCDh

;Если это так, то мы пытаемся второй раз установить программу – это не нужно,

;а может быть мы хоти выгрузить ее из памяти? Надо проверить ключ в строке

;параметров запуска программы, поэтому перейдем к метке ANALIZ

              je     analiz

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

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

;планируем заместить своими процедурами. Начнем с вектора 28h. Используя

;стандартную функцию 35h прерывания 21h получим этот вектор в  ES:BX

              mov ax,3528h         

              int    21h

;и сохраним его в специально подготовленной ячейке old_28 (см.выше)

mov word ptr old_28,bx        

mov word ptr old_28+2,es

;С помощью стандартной функции 25h прерывания 21h на место старого векто;ра установим адрес нашей процедуры        

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 old1C, bx        

              mov word ptr old1C+2, es     

              mov ax,251Ch        

              lea   dx, New_1C    

int    21h

;Разместим в регистре dx адрес начала НЕ РИЗЕДЕНТНОЙ части нашей програм;мы       

              lea   dx,start

;и, с помощью стандартного прерывания 27h завершим нашу программу, оставив

;ее в памяти резидентной

              int    27h     

;Сюда мы попадаем, если наша программа обнаружена уже установленной в

;памяти

analiz:

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

;Известно, что после запуска программы, содержимое командной строки операц;онная система размещает по смещению 80h в PSP программы (см. TECH HELP,

;PSP). Точнее по самому смещению 80h находится байт, в котором размещается

;число, равное количеству символов в строке параметров. Получим его из PSP,

;для чего смещение интересующего нас байта занесем в SI

        mov si,80h    

;потом загрузим этот байт в AL          

        lodsb                    

;и проверим, длина строки параметров не меньше трех символов? (Если Вы еще

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

;параметр /u, а это, вместе с пробелом – как раз три символа)

        cmp al,3                 

;если меньше, то выйти из программы, потому, что командная строка коротка

        jl bue                 

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

        inc si                   

;и возьмем из нее в AX два байта (слово)

        lodsw      

;проверим, это наш ключ /u ? (при этом помним, что в AX байты перевернуты –

;сначала заносится старший, потом младший             

        cmp ax,'u/'  

;если не равно, то это не наш ключ и программу завершаем