|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.05.2010, 11:45 | #1 |
Новичок
Джуниор
Регистрация: 04.05.2010
Сообщений: 3
|
TSR-программа по горячей клавише блокирует гибкие диски. При повторномдеблокирует
не понимаю почему не работает. Всегда могу обращаться A: or cd A:
code_seg SEGMENT ASSUME CS:code_seg, DS:code_seg org 100h START: jmp boot ; =================================== ================================== DWPTR EQU DWORD PTR WPTR EQU WORD PTR BPTR EQU BYTE PTR old_08h DD ? ; прежние вектора прерываний: 08h old_09h DD ? ; 09h old_2Fh DD ? ; 2Fh video DW 0B800h ; адрес (сегмент) начала видеопамяти simbol DB 7 ; выводимый символ status DB 0 ; состояние дисковода: 0 - разблокирован ; =================================== ================================== ; --------------------------------------------------------------------- ; обработчик прерывания 2Fh ; --------------------------------------------------------------------- new_2Fh PROC cmp AH, 0CCh ; проверка номера jne pass_2Fh ; не наш номер -> выход cmp AL, 0 ; функция проверки на установку? jne check2 ; нет -> проверяем функцию выгрузки mov AL, 0FFh ; программа уже установлена iret check2: cmp AL, 1 ; функция выгрузки программы ? je uninstall ; да -> пробуем выгрузить pass_2Fh: jmp DWPTR CS:[old_2Fh] ;--------------------------------------------------- ; проверка, возможна ли выгрузка программы из памяти uninstall: push BX push CX push DX push ES mov CX, CS ; нужно для сравнения mov AX, 3508h ; проверка вектора 08h int 21h ; mov DX, ES cmp CX, DX jne not_unins cmp BX, offset new_08h jne not_unins mov AL, 09h ; проверка вектора 09h int 21h ; mov DX, ES cmp CX, DX jne not_unins cmp BX, offset new_09h jne not_unins mov AL, 2Fh ; проверка вектора 2Fh int 21h ; mov DX, ES cmp CX, DX jne not_unins cmp BX, offset new_2Fh jne not_unins ;--------------------------------------------------------------- ; вектора прерываний не изменились -> можно выгружать программу push DS lds DX, CSld_08h ; DS:DX = прежний вектор 08h mov AX, 2508h ; восстанавливаем вектор 08h int 21h lds DX, CSld_09h ; DS:DX = прежний вектор 09h mov AL, 09h ; восстанавливаем вектор 09h int 21h lds DX, CSld_2Fh ; DS:DX = прежний вектор 2Fh mov AL, 2Fh ; восстанавливаем вектор 2Fh int 21h pop DS mov ES, CS:2Ch ; ES -> окружение mov AH, 49h ; освобождение блока памяти int 21h mov ES, CX ; ES = CS -> PSP mov AH, 49h ; освобождение памяти, занятой int 21h ; самой программой xor AL, AL ; признак успешной выгрузки jmp short pop_ret not_unins: mov AL, 0Fh ; признак неуспешной выгрузки pop_ret: pop ES pop DX pop CX pop BX iret new_2Fh ENDP ; --------------------------------------------------------------------- ; обработчик прерывания 08h ; --------------------------------------------------------------------- new_08h PROC pushf call DWPTR CS:[old_08h] ; сначала обрабатываются часы ; выводим символ на экран - индикация работы программы push AX push ES mov AX, CS:video ; заносим в ES адрес начала |
04.05.2010, 11:47 | #2 |
Новичок
Джуниор
Регистрация: 04.05.2010
Сообщений: 3
|
mov ES, AX ; видеопамяти
mov AL, CS:simbol ; выводим символ в начало mov ES:[0], AL ; первой строки экрана mov BPTR ES:[1], 1Fh ; синий фон, белый символ test CS:status, 40h ; дисковод блокирован? jz nextsim ; нет -> переход на nextsim xor BPTR ES:[1], 52h ; красный фон, розовый символ nextsim: dec CS:simbol and CS:simbol, 07h ; simbol = 7 .. 0 pop ES pop AX iret new_08h ENDP ; --------------------------------------------------------------------- ; обработчик прерывания 09h ; --------------------------------------------------------------------- new_09h PROC ; проверка нажатой комбинации клавиш push AX in AL, 60h cmp AL, 14h ; нажата клавиша 'T' ? jne pass_09h ; нет -> вызываем старый обработчик push ES mov AX, 40h ; копируем в AL флаги клавиатуры mov ES, AX ; mov AL, ES:[17h] ; pop ES and AL, 00001100b ; проверка, нажаты ли Alt и cmp AL, 00001100b ; Ctrl je do_pop ; нажаты -> нажата нужная комби- ; нация Ctrl + Alt + 'T' pass_09h: pop AX jmp DWPTR CS:[old_09h] do_pop: ; нажата нужная комбинация клавиш ; разрешение работы клавиатуры in AL, 61h or AL, 80h ; установить старший бит out 61h, AL and AL, 7Fh ; сбросить старший бит out 61h, AL mov AL, 20h ; разрешение прерываний out 20h, AL ; реакция программы на нажатие клавиши xor CS:status, 40h ; изменить состояние дисковода in AL, 21h ; чтение регистра маски and AL, 0BFh ; сбросить бит 6 or AL, CS:status ; установить бит 6 , как и в status out 21h, AL ; установить состояние дисковода mov AX, 0E07h ; даем звуковой сигнал int 10h ; pop AX iret new_09h ENDP ; =================================== ================================== ; инициализация ; =================================== ================================== boot: ; проверка, установлена ли уже программа mov AX, 0CC00h int 2Fh mov insflag, AL ; проверка командной строки mov CL, ES:80h ; проверка, были ли заданы cmp CL, 0 ; параметры при запуске je check_ins ; нет -> пробуем установить xor CH, CH ; CX = длина строки параметров cld ; флаг направления DF = 0 (вперед) mov DI, 81h ; пропуск всех пробелов в начале mov AL, ' ' ; строки параметров (ES:DI) repe scasb ; dec DI mov CX, 2 ; ожидаемая длина команды mov SI, offset key ; ожидаемая команда выгрузки repe cmpsb jne check_ins ; неверная команда, пробуем ; установить программу ; введена команда выгрузки TSR cmp insflag, 0FFh ; программа установлена ? je uninst ; да -> пробуем выгрузить lea DX, msg4 ; Программа не установлена, а out_quit: mov AH, 09h ; а пользователь хочет выгрузить int 21h ; ее. Выдается соотв. сообщение. int 20h ; выход без установки ; пробуем выгрузить программу uninst: mov AX, 0CC01h ; функция выгрузки int 2Fh cmp AL, 0 ; программа выгружена ? je success ; да -> на метку success lea DX, msg3 ; нет -> выводим соотв. сообщение jmp out_quit |
04.05.2010, 11:48 | #3 |
Новичок
Джуниор
Регистрация: 04.05.2010
Сообщений: 3
|
; установка программы
check_ins: cmp insflag, 0FFh ; программа установлена ? jne install ; нет -> устанавливаем lea DX, msg2 ; программа уже установлена jmp out_quit install: mov AH, 0Fh ; получить текущий видеорежим int 10h ; cmp AL, 7 ; режим монохромный ? jne setvec ; нет -> устанавливаем вектора mov video, 0B000h ; изменяем адрес начала видеопамяти ; установка обработчика int 2Fh setvec: mov AX, 352Fh ; получить вектор int 21h ; прерывания 2Fh mov WPTR old_2Fh, BX ; сохранение полученного mov WPTR old_2Fh+2, ES ; вектора mov DX, offset new_2Fh ; установка нового вектора mov AX, 252Fh ; int 21h ; ; установка обработчика int 08h mov AX, 3508h ; получить вектор int 21h ; прерывания 08h mov WPTR old_08h, BX ; сохранение полученного mov WPTR old_08h+2, ES ; вектора mov DX, offset new_08h mov AX, 2508h int 21h ; установка обработчика int 09h mov AX, 3509h ; получить вектор int 21h ; прерывания 09h mov WPTR old_09h, BX ; сохранение полученного mov WPTR old_09h+2, ES ; вектора mov DX, offset new_09h mov AX, 2509h int 21h lea DX, msg1 mov AH, 09h int 21h mov DX, offset boot int 27h ; оставить прог. резидентной и выйти ; --------------------------------------------------------------------------- msg1 DB "Программа инсталлирована.",10,13 DB "Для блокировки/разблокировки дисковода нажмите Ctrl+Alt+'T'.",10,13 DB "Если индикатор в первой строке экрана красный, то дисковод блокирован.",10,13,'$' msg2 DB "Программа уже инсталлирована!",10,13,'$' msg3 DB "Выгрузка невозможна!",10,13,'$' msg4 DB "Еще не установлена!",10,13,'$' msg5 DB "Программа выгружена.",10,13,'$' key DB '\u' insflag DB ? ; --------------------------------------------------------------------------- code_seg ENDS END START |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема с горячей клавишей | tirexherou | Общие вопросы Delphi | 2 | 23.01.2010 20:42 |
блокировать гибкие диски | Ёрик | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 9 | 08.06.2009 21:30 |
com-программа, которая блокирует клавиатуру | Белка | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 26.11.2007 14:37 |
Создание системной горячей клавиши | Seqular | Общие вопросы Delphi | 8 | 17.02.2007 21:12 |