Вопрос № 178568: Уважаемые эксперты! Требуется написать программу(с комментариями) Разработать резидентную программу для ОС MSDOS.Программа может быть выполнена в виде exe или com файла. При попытке отформатировать диск программа выдает сообщение о невозможности тако...
Вопрос № 178568:
Уважаемые эксперты! Требуется написать программу(с комментариями) Разработать резидентную программу для ОС MSDOS.Программа может быть выполнена в виде exe или com файла. При попытке отформатировать диск программа выдает сообщение о невозможности такой операции и всегда возвращает вызвавшей программе код ошибки. Ассемблер TASM.
Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, Филимонов Алексей Викторович. Примерная программа ниже. Программа перехватывает выполнение функции 5 (форматирование) и в случае попытки форматировать взводит флаг C и возвращает код ошибки "защиты записи". К сожалению, проверить не могу, флоппи нет в принципе, а на жестком не хочется пробывать...
Код:
.model tiny .code .startup jmp init ;на инициализацию New13h: ;новый вектор 13h cmp ax, 1234h ;проверка на повторную инсталяцию jne CmpFormat mov ax, 4321h ;программа уже инсталирована iret CmpFormat: cmp ah, 05h ;формат? jne ToOld13h ;нет - на старый вектор ;просто stc ничего не даст, ; после iret флаг потеряется! push bp ;Но, флаг FC мы можем в
звести в стеке! mov bp, sp ;будем адресовать с помощью bp or byte ptr [bp+6], 1 ;в стеке: [bp] = старый bp ; [bp+2] = IP ; [bp+4] = CS ; [bp+6] = FLAGS ;0001h - маска флага C pop bp ;восстановим bp mov ah, 3 ;код ошибки "Защита записи" iret ;выход из прерывания, ; по выходу взведется флаг FC
ToOld13h: jmp cs:dword ptr old13h ;все остальное на отработку ; по старому вектору
old13h dw ?, ? ;адрес старого
вектора 13h
init: ;инициализация mov ax, 1234h ;проверим на повторную загрузку int 13h cmp ax, 4321h je finish ;просто завершаемся push bx es mov ax, 3513h ;узнаем адрес старого вектора int 21h ; в es:bx mov old13h, bx ;сохраняем mov old13h+2, es pop es bx
lea dx, New13h ;устанавливаем новый вектор 13h mov ax, 2513h int 21h
lea dx, loaded ;сообщение mov ah, 9 int 21h
lea
dx, init ;оставляем в памяти резидентом int 27h ; до адреса init
finish: lea dx, already ;сообщение mov ah, 9 int 21h mov ax, 4c00h ;обычный выход при повторной загрузке int 21h
.data loaded db 'Program loaded$' already db 'Program already loaded$'
end
----- Удачи!
Ответ отправил: Лысков Игорь Витальевич, Модератор
Ответ отправлен: 23.05.2010, 22:20
Номер ответа: 261597 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru Абонент Skype: igorlyskov
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261597
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.