|
|
|
|
Подмена Int 16h
Простейшим путем создания горячего ключа является подмена прерывания int 16h. Большинство хорошо работающих приложений используют это прерывание
для ввода с клавиатуры. Установка собственного прерывания int 16h ISR позволит Вам анализировать каждый символ и отклонять любые горячие ключи. Листинг
4-5 демонстрирует типичную замену для int 16h ISR.
Листинг 4-5. Замена прерывания int 16h для просмотра
используемых клавиш
----------------------------------------------------------------
OldInt16 DD 0 ; сохранение кода инициализации
; адрес первоначальной isr
Hotkey DW (?) ; определение нажатой клавиши
NewInt16 PROC FAR
cmp ah,1 ; проверка функции
jg DoShift ; если g -- сдвиг
jl DoRead ; ah=0 ==> чтение
DoStatus: ; ah=1 ==> проверка состояния
pushf ; моделирование int 16
call cs:OldInt16 ; передача запроса BIOS
pushf ; сохранение флагов
cmp ax,HotKey ; найдена нажатая клавиша?
jnz Done1; нет
xor ax,ax; ah <== 0 (запрос чтения)
call cs:OldInt16 ; удаление нажатой клавиши
call ActivateTSR ; нажатая клавиша вызывает TSR
mov ah=1 ; ah <== 1 (запрос состояния)
jmp SHORT DoStatus ; повторение запроса
DoRead:
pushf ; моделирование int 16h
call cs:OldInt16
cmp ax,HotKey ; найдена нажатая клавиша?
jnz Done0 ; если nz - нет
call ActivateTSR ; нажатая клавиша вызывает TSR
xor ah,ah ; ah <== 0 (запрос чтения)
jmp SHORT DoRead ; повторение запроса
DoShift: ; передача запроса
jmp cs:OldInt16; старая ISR. Сброс
Done0: ; ax имеет не используемые флаги
iret ; возврат для вызова
Done1: ; ax имеет символ
popf ; восстановление флагов int 16h
ret 2 ; отбрасывание флагов, смоделированных
; командой int и возврат
NewInt16 ENDP
----------------------------------------------------------------
|
Новая int 16h ISR проверяет результаты каждого считывания (AH=0) и запроса о состоянии буфера (AH=1), но не осуществляет проверку состояния shift
запросов (AH=2). Если код ROM-BIOS возвращает горячий ключ, новая ISR удаляет код клавиши из буфера клавиатуры, инициирует TSR, и повторяет запрос.
Если только первый символ буфера клавиатуры оказывается горячим ключом , ISR не повторяет запрос. Этот пример сделан при упрощающем предположении, что
реактивация резидентной программы будет безопасной. (Подробное обсуждение этой темы смотри в разделе "Реактивация, архитектура DOS и сервис".
Следовательно, коды в листинге 4-5 являются только моделью, и не совсем корректны).
Ограничение для этого метода заключается в том, что горячий ключ можно выявить только один раз, когда программа переднего плана задает считывание.
Если эта программа производит большой объем вычислений, то между временем нажатия клавиши и ответом TSR задержка может быть большая.
|
|