Вопрос № 179075: Уважаемые эксперты! Требуется написать программу(с комментариями).Разработать резидентную программу для ОС MSDOS в соответствии со своим вариантом. Программа может быть выполнена в виде exe или com файла.При попытке пользователя удалить файл программ...
Вопрос № 179075:
Уважаемые эксперты! Требуется написать программу(с комментариями).Разработать резидентную программу для ОС MSDOS в соответствии со своим вариантом. Программа может быть выполнена в виде exe или com файла.При попытке пользователя удалить файл программа перемещает его в специальную директорию. Ассемблер TASM. Желательно выполнить задание до 11 вечера сегодняшнего дня. Благодарность гарантирована за таку срочность. Нужно сегодня очень.
jmp init ;на инициализацию sAlready db 'Program already installed',0dh,0ah,'$' sInstalled db 'Program installed',0dh,0ah,'$' DName db 'c:\test',0 ;каталог, куда перенесем файл FName db '_1.dat',0 ;имя файла fcb1 FCB <> ;блок FCB для контроля удаления по FCB Old21h dw 0, 0 ;старый вектор 21h
New21h
: cmp ax, 0fefeh ;проверка на инсталяцию jne OurVector mov ax, 0efefh ;вернем признак, что уже инсталлирована iret OurVector: ;проверяем интересующие функции cmp ah, 41h ;удаление по имени je fun41h cmp ah, 13h ;удаление по FCB je fun13h OldVector: jmp dword ptr cs:[Old21h] ;все остальное - на старый вектор
fun13h: ;удаление по FCB, DS:DX = адрес FCB push ds es si di dx ax ;сохраним регистры mov si, dx ;адрес FCB
lea si, [si]._name ;на
начало имени файла push cs pop es ;es=cs lea di, fcb1._name ;es:di - заранее подготовленный FCB для интересующего файла mov cx, _curBlk-1 ;длина имени+расширения repe cmpsb ;сравниваем jne NotOurFile ;не равно - не наш файл jmp OurFile ;на перенос файла в директорию
fun41h: ;удаление по имени, DS:DX = имя файла push ds es si di dx ax mov si, dx ;смещение имени файла, который хотят удалить
push cs p
op es lea di,FName ;ES:DI = адрес контролируемого имени cmpLoop: ;сравниваем до нулей cmpsb jne NotOurFile ;не наш файл mov al, [si-1] ;проверим на 0 or al, es:[di-1] jnz cmpLoop ;если не 0, то продолжаем OurFile: ;дошли до 0 - имена одинаковые - переносим push cs ;сначала создадим подкаталог pop ds lea dx, DName ;DS:DX - адрес подкаталога mov ah, 39h ;MakeDir pushf call dword ptr [Old21h] ;если уже есть, то даст ошибку, но это неважно
mov byte
ptr [FName-1], '\' ;сформируем полный путь с именем заменой 0 на '\' lea dx, FName lea di, DName mov ah, 56h ;перемещаем DS:DX в ES:DI pushf call dword ptr cs:[Old21h] xor ax, ax ;пометим, что ок mov byte ptr cs:[FName-1], al ;и вернем 0 в конце имени поддиректории NotOurFile: pop ax dx di si es ds ;восстановим регистрвы jnz OldVector ;если придем сюда после несовпадения после сравнения, ;
то уйдем на стандартное удаление iret ;если после переноса в поддиректорию, то выходим из прерывания
;Инициализация резидента Init: mov ax, 0fefeh ;проверим на повтор int 21h cmp ax, 0efefh ;не равно - инсталлируем jne Continue
lea dx, sAlready ;иначе - сообщение mov ah, 9 int 21h
mov ax, 4c00h ;и завершаемся int 21h
Continue: lea di, fcb1 ;подготовим FCB для нинтересующего файла lea si, FName mov ax, 2900h ;заполним структуру int 21h
push es ;прочитаем
старый вектор 21h mov ax, 3521h int 21h mov cs:Old21h, bx mov cs:Old21h+2, es pop es
lea dx, New21h ;установим новый вектор mov ax, 2521h int 21h
mov es, word ptr cs:[2Ch] ;Получим сегмент окружения DOS. mov ah, 49h ;Функция освобождения памяти. int 21h ;Освобождаем память...
lea dx, sInstalled ;сообщение mov ah, 9 int 21h
lea dx, Init ;адрес послед
него байта резидента int 27h ;оставляем резидентом и завершаемся
end
Программа перехватывает удаление ф
айла _1.dat в текущей директории по функции 41h (по имени) и 13h (по FCB) К сожалению, команда del _1.dat отрабатывается программой cmd.exe, которая является консольной Windows-программой. Действие которой перехватить из досовской программы невозможно... Но можно, например, перехватить удаление command /c del _1.dat ----- Удачи!
Ответ отправил: Лысков Игорь Витальевич, Старший модератор
Ответ отправлен: 14.06.2010, 01:15
Номер ответа: 262092 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru Абонент Skype: igorlyskov
Оценка ответа: 5
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 262092
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.