Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 2478
∙ повысить рейтинг »
_Ayl_
Статус: Профессионал
Рейтинг: 1891
∙ повысить рейтинг »
vladisslav
Статус: 6-й класс
Рейтинг: 1227
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Assembler (Ассемблер)

Номер выпуска:1362
Дата выхода:19.06.2010, 04:00
Администратор рассылки:Лысков Игорь Витальевич, Старший модератор
Подписчиков / экспертов:236 / 63
Вопросов / ответов:1 / 1
IRC-канал по теме:#assembler

Вопрос № 179075: Уважаемые эксперты! Требуется написать программу(с комментариями).Разработать резидентную программу для ОС MSDOS в соответствии со своим вариантом. Программа может быть выполнена в виде exe или com файла.При попытке пользователя удалить файл программ...



Вопрос № 179075:

Уважаемые эксперты! Требуется написать программу(с комментариями).Разработать резидентную программу для ОС MSDOS в соответствии со своим вариантом. Программа может быть выполнена в виде exe или com файла.При попытке пользователя удалить файл программа перемещает его в специальную директорию. Ассемблер TASM. Желательно выполнить задание до 11 вечера сегодняшнего дня. Благодарность гарантирована за таку срочность. Нужно сегодня очень.

Отправлен: 13.06.2010, 10:45
Вопрос задал: Филимонов Алексей Викторович, 1-й класс
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич, Старший модератор :
Здравствуйте, Филимонов Алексей Викторович.
Вот программа:
Код:

.model tiny
.code
.startup

FCB struc ;блок FCB
_drv db ?
_name db 8 dup (?)
_ext db 3 dup (?)
_curBlk dw ?
_rSize dw ?
_fSize dw ?,?
_date dw ?
_time dw ?
_reserv dw 8 dup (?)
FCB ends

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 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное