На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 4 / Подмена Int 16h Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Подмена 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 задержка может быть большая.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz