Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2010, 11:45   #1
vasili
Новичок
Джуниор
 
Регистрация: 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 адрес начала
vasili вне форума Ответить с цитированием
Старый 04.05.2010, 11:47   #2
vasili
Новичок
Джуниор
 
Регистрация: 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
vasili вне форума Ответить с цитированием
Старый 04.05.2010, 11:48   #3
vasili
Новичок
Джуниор
 
Регистрация: 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
vasili вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с горячей клавишей 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