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; Конец программы, точка входа