Смекни!
smekni.com

Контроль програм, які запускаються на даному комп'ютері (стр. 2 из 2)

pushf

call dword ptr cs: old; вызываем старый обработчик прерывания

jc @@1; Проверка на существование:

mov cs: outfile,ax; =¬

mov ah,42h; ¦

mov bx,cs: outfile; ¦

mov cx,0; ¦позиционируется на конец

mov dx,0; ¦

mov al,2; ¦

pushf; ¦

call dword ptr cs: old; ¦

ret; =-

@@1:

lea dx,cs: nam; =¬

xor cx,cx; ¦

mov cx,110b; ¦

mov ah,3ch; ¦Если файла нет с таким именем, то он

pushf; ¦

call dword ptr cs: old; ¦создаётся

mov cs: outfile,ax; ¦

ret; =-

CreateFile endp

Prov proc

; - --------------------------------------------------------------------¬

; ¦Prov - процедура проверки имени программы которая запускается и имен¦

; ¦программ, которые берутся из файла stop. asm. ¦

; ¦Вход нет ¦

; ¦Выход comp=1 имена совпали ¦ ¦

; L---------------------------------------------------------------------

push ds es di si; сохраняем все используемые регистры в стеке

mov cs: comp,0; обнуляем флаг сравнения

mov cs: err1,0; обнуляем флаг ошибки

mov ah,3dh; Функция DOS открытия файла

lea dx,cs: nam1; адрес имени файла с запрещаемыми программами

push cs

pop ds

mov al,0; открытие файла на чтение

pushf

call dword ptr cs: old; вызываем старый обработчик прерывания

jnc @@9; Проверка на существование: если не существует, то

pop si di es ds; восстанавливаем регистры из стека

ret; выходим из процедуры

@@9:; иначе

mov cs: outfile1,ax; сохраняем номер файла

@@12:

lea di,cs: string1; адрес строки

@@11:

mov ah,3fh; Функция чтения из файла

mov bx,cs: outfile1; номер файла, который читаем

mov cx,1; количество читаемых символов

lea dx,cs: str1; адрес буфера

push cs;

pop ds;

pushf;

call dword ptr cs: old; вызываем старый обработчик прерывания

cmp ax,-1; проверка на ошибку

je error1;

cmp ax,0; проверка на количество прочитанных байт

je error1;

jmp noerror;

error1:; ошибка

mov cs: err1,1; устанавливаем флаг ошибки

jmp error;

noerror:; нет ошибки

cmp cs: str1,13; проверка на код перехода на новую строку

je @@21; если равно, то на @@21

mov al,cs: str1; записываем в al символ

cmp al,'a'; если меньше, чем 'a', то

jb @@q1; на @@q1

cmp al,'z'; если больше, чем 'z', то

ja @@q1; на @@q1

sub al,32; иначе вычитаем разницу между больш. и маленькими

@@q1:;

mov cs: [di],al; сохраняем символ в строке

inc di; увеличение текущей позиции

jmp @@11; переход к следующему символу

@@21:;

mov ah,3fh; Функция чтения из файла

mov bx,cs: outfile1; номер файла, который читаем

mov cx,1; количество читаемых символов

lea dx,cs: str1; адрес буфера

push cs;

pop ds;

pushf;

call dword ptr cs: old; вызываем старый обработчик прерывания

error:;

lea di,cs: string; адрес имени загружаемой программы

push cs;

pop es;

lea si,cs: string1; адрес имени программы, прочитанной из файла

push cs;

pop ds;

mov al,0; загружаем в al символ с кодом 0

mov cx,100; количество символов, в которых ищем

cld; направление поиска вперед

repne scasb; ищем символ с кодом 0

std; направление поиска назад

dec di; уменьшаем адрес поиска на 1

mov cx,13; длина имени и расширения программы

mov al,'\'; загружаем в al символ '\'

repne scasb; ищем символ '\'

cld; направление поиска вперед

inc di; увеличиваем адрес сравнения на 2

inc di;

mov cx,13; длина сравниваемых строк

repe cmpsb; сравниваем строки

je @@ex; если равно, то на @@ex

; mov cs: comp,0;

jmp @@ex1; иначе на @@ex1

@@ex:;

mov cs: comp,1; устанавливаем флаг равенства

@@ex1:;

mov cx,100; кол. байт

mov al,0;

lea di,cs: string1; адрес строки

push cs;

pop es;

rep stosb; обнуляем

cmp cs: comp,0; проверяем флаг сравнения

jne @@31; если не равен то на @@31

cmp cs: err1,1; проверяем флаг ошибки

je @@31; если равен то на @@31

jmp @@12; переход на начало сравнения

@@31:;

mov ah,3eh; Функция закрытия файла

mov bx,cs: outfile1; номер файла, который закрываем

pushf;

call dword ptr cs: old; Вызываем старый обработчик прерывания

pop si di es ds; восстанавливаем регистры из стека

ret

prov endp; конец процедуры сравнения

; - ---------------------------INIT----------------------------------------

init:; Установки.

mov ah,9h; функция вывода строки

mov dx,offset text; адрес сообщения о программе

int 21h; выводим сообщение

mov ax,9090h; наша функция проверки, есть лди в памяти

int 21h; вызываем нашу функцию проверки

cmp ax,12h; AX=12?

jz exi; если да, то на проверку парвметров

mov ah,35h; функция чтения адреса прерывания

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

int 21h; вызываем функцию чтения адреса прерывания

mov old,bx; сохраняем в переменной сегмент исмещение

mov old+2,es; обработчика прерывания

mov ah,25h; функция замены прерывания

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

mov dx,offset new21; адрес нового обработчика

int 21h; вызываем функцию замены прерывания

lea dx,cs: nam; адрес выходного файла

push cs

pop ds

call createFile; процедура создания файла

mov ah,40h; =¬

mov bx,cs: outfile; ¦

mov cx,2; ¦ переход в файле на следующую строку

lea dx,cs: lf; ¦

pushf; ¦

call dword ptr cs: old; =-

mov ah,3eh; Функция закрытия файла

mov bx,cs: outfile; номер файла

pushf; сохраняем регистр флагов в стеке

call dword ptr cs: old; вызываем старый обработчик прерывания

mov dx,offset init; адрес конца обработчика

int 27h; Выйти и остаться резидентом.

; Проверка параметров

exi:

push cs

pop ds

xor ch,ch; обнуляем CH

mov cl, [ds: Leng] ; CX=длина параметров

inc cx; добавить символ возврата каретки

mov si,Parametr; поместить адрес параметров в SI

; пропустить начальный пробелы и табуляцию

@@100:

call Separators; проверка на пробелы

jne @@20; переход если пробелов и табул. нет

inc si; иначе пропустить этот символ

loop @@100; переход пока не закончена обработка

@@20:

cmp cx,0; CX=0?

jne @@30; если нет, то есть параметры

jmp noparam; нет параметров

@@30:

mov ah,ds: [si] ; в AH заносим символы строки параметров

cmp ah,'/'; сравниваем AH с символом '/'

je param; если равно то следующий символ

cmp ah,'-'; сравниваем AH с символом '-'

je param; если равно то следующий символ

cmp ah,'r'; сравниваем AH с символом 'r'

je release; если равно то на выгрузку резидента

cmp ah,'R'; сравниваем AH с символом 'R'

je release; если равно то на выгрузку резидента

cmp ah,'d'; сравниваем AH с символом 'd'

je delete; если равно то на удаление файла

cmp ah,'D'; сравниваем AH с символом 'D'

je delete; если равно то на удаление файла

cmp ah,'s'; сравниваем AH с символом 's'

je stoped; если равно то на инвертирование флага stop1

cmp ah,'S'; сравниваем AH с символом 'S'

je stoped; если равно то на инвертирование флага stop1

cmp ah,'? '; сравниваем AH с символом '? '

je help; если равно то на выдачу помощи

cmp ah,'h'; сравниваем AH с символом 'h'

je help; если равно то на выдачу помощи

cmp ah,'H'; сравниваем AH с символом 'H'

je help; если равно то на выдачу помощи

param: inc si

mov ah,ds: [si] ; берем следующий символ

cmp ah,'d'; сравниваем AH с символом 'd'

je delete; если равно то на удаление файла

cmp ah,'D'; сравниваем AH с символом 'D'

je delete; если равно то на удаление файла

cmp ah,'s'; сравниваем AH с символом 's'

je stoped; если равно то на инвертирование флага stop1

cmp ah,'S'; сравниваем AH с символом 'S'

je stoped; если равно то на инвертирование флага stop1

cmp ah,'? '; сравниваем AH с символом '? '

je help; если равно то на выдачу помощи

cmp ah,'h'; сравниваем AH с символом 'h'

je help; если равно то на выдачу помощи

cmp ah,'H'; сравниваем AH с символом 'H'

je help; если равно то на выдачу помощи

cmp ah,'r'; сравниваем AH с символом 'r'

je release; если равно то на выгрузку резидента

cmp ah,'R'; сравниваем AH с символом 'R'

jne noparam; если не равно то на noparam

release:

mov ah,09h; функция вывода строки

lea dx,mes2; адрес сообщения о выгрузке

int 21h; выводим сообщение

mov ah,35h; функция чтения адреса прерывания

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

int 21h; вызываем функцию чтения адреса прерывания

push es

mov ah,25h; функция замены прерывания

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

mov dx,es: old; адрес старого обработчика

mov ds,es: old+2

int 21h; вызываем функцию замены прерывания

pop ds

mov ah,49h; функция освобождения паияти

int 21h; освобождаем паиять

jmp ex_init; переход на выход

delete:

mov ah,9; функция вывода строки

mov dx,offset cs: mes3; адрес сообщения о удалении

int 21h; выводим сообщение

mov ah,41h; функция удаления файла

mov dx,offset cs: nam; адрес удаляемого файла

int 21h; удаляем файл

jmp noparam

stoped:

mov ah,35h; функция чтения адреса прерывания

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

int 21h; вызываем функцию чтения адреса прерывания

mov ah,9; функция вывода строки

not es: stop1; инвертируем флаг проверки

stoped2: cmp es: stop1,0; сравниваем флаг проверки с 0

jne stoped1; если не равно то на stoped1

mov dx,offset cs: mes4; адрес сообщения о наличии проверки

int 21h; выводим сообщение

jmp noparam

stoped1: mov dx,offset cs: mes5; адрес сообщения о не наличии проверки

int 21h; выводим сообщение

jmp noparam

help: mov ah,9; функция вывода строки

mov dx,offset helpt; адрес сообщения помощи

int 21h; выводим сообщение

mov ah,35h; функция чтения адреса прерывания

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

int 21h; вызываем функцию чтения адреса прерывания

mov ah,9; функция вывода строки

jmp stoped2

noparam:

lea dx,cs: mes1; адрес сообщения о наличии резидента в памяти

mov ah,9; функция вывода строки

int 21h; выводим сообщение

ex_init:

mov ah,4ch; функция выхода из программы

mov al,0; возвращает код ошибки 0

int 21h; выход из программы

Separators Proc

; - ---------------------------------------------------------------------------¬

; ¦Separators - процедура проверки на пробелы ¦

; ¦ВЫХОД: ¦

; ¦zf=1: символ является пробелом, табуляцией или возвратом каретки ¦

; ¦zf=0: символ не является разделителем ¦

; L----------------------------------------------------------------------------

mov al,ds: [si] ; взять символ из ds: si

cmp al,020h; символ пробел?

je @@10; Если да то переход

cmp al,009h; символ табуляция?

je @@10; Если да то переход

cmp al,00dh; символ возврата каретки?

@@10:

ret

Separators EndP

Text db 13,10,'History Version 1.0 Copyright (c) 1999 Мороз Р. ',13,10

db 'Сохранение названий всех программ, которые запускались на компьютере',13,10,'$'

Helpt db 'Syntax: History [/r|/R|-r|-R|r|R] [/d|/D|-d|-D|d|D] [/? |/h|/H|-? |-h|-H|? |h|H] ',13,10

db ' /r - released History from memory',13,10

db ' /d - delete files History',13,10

db ' /s - invert stop flag ',13,10

db ' /? - HELP',13,10,'$'

mes1 db 13,10,' Program alredy in memory $'

mes2 db 13,10,' Program released in memory $'

mes3 db 13,10,' delete files History $'

mes4 db 13,10,' stoped files $'

mes5 db 13,10,' not stoped files $'

end start; Конец программы, точка входа