Резидентный обработчик клавиатуры (перехват нажатий клавиш и запись в файл)
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: реферат на тему творчество, банк рефератов
| Добавил(а) на сайт: Козарис.
Предыдущая страница реферата | 1 2 3 4 5 6 7 | Следующая страница реферата
Хвостовой указатель, перемещаясь по буферу в процессе занесения в него кодов, доходит, наконец, до конца буфера (адрес 40h:3Ch). В этом случае при поступлении очередного кода адрес в указателе не увеличивается, а, наоборот, уменьшается на длину буфера. Тем самым указатель возвращается в начало буфера, затем продолжает перемещаться по буферу до его конца, опять возвращается в начало и так далее по кольцу. Аналогичные манипуляции выполняются и с головным указателем.
Равенство адресов в обоих указателях свидетельствует о том, что буфер пуст. Если при этом программа поставила запрос на ввод символа с клавиатуры, то драйвер консоли будет ждать поступления кода в буфер, после чего этот код будет передан в программу. Если же хвостовой указатель, перемещаясь по буферу в процессе его заполнения, подошел к головному указателю "с обратной стороны" (это произойдет, если оператор нажимает на клавиши, а выполняемая в настоящий момент программа не обращается к клавиатуре), прием новых кодов блокируется, а нажатие на клавиши возбуждает предупреждающие звуковые сигналы.
Если компьютер не выполняет никакой программы, то активной является программа командного процессора COMMAND.COM. Активность COMMAND.COM заключается в том, что он, поставив запрос к DOS на ввод с клавиатуры (с помощью функции 0Ah прерывания 21h) ожидает ввода с клавиатуры очередной команды пользователя. Как только в кольцевом буфере ввода появляется код символа, функция 0Ah переносит его во внутренний буфер DOS, очищая при этом кольцевой буфер ввода, а также выводит символ на экран. При получении кода клавиши (0Dh) функция 0Ah завершает свою работу, а командный процессор предполагает, что ввод команды закончен, анализирует содержимое буфера DOS и приступает к выполнению введенной команды. При этом командный процессор работает практически лишь с младшими половинами двухбайтовых кодов символов, именно, с кодами ASCII.
Если компьютер выполняет какую-либо программу, ведущую диалог с
оператором, то, как ухе отмечалось, ввод данных с клавиатуры (а точнее из
кольцевого буфера ввода) и вывод их на экран с целью эхо контроля
организует эта программа, обращаясь непосредственно к драйверу BIOS (int
16h) или к соответствующей функции DOS (int 21h). Может случиться, однако, что выполняемой программе не требуется ввод с клавиатуры, а оператор нажал
какие-то клавиши. В этом случае вводимые символы накапливаются (с помощью
программы int09h) в кольцевом буфере ввода и, естественно, не отображаются
на экране. Так можно ввести до 15 символов. Когда программа завершится, управление будет передано COMMAND. СОМ, который сразу же обнаружит наличие
символов в кольцевом буфере, извлечет их оттуда и отобразит на экране.
Такой ввод с клавиатуры называют вводом с упреждением.
До сих пор речь шла о символах и кодах ASCII, которым соответствуют
определенные клавиши терминала и которые можно отобразить на экране. Это
буквы (прописные и строчные), цифры, знаки препинания и специальные знаки, используемые в программах и командных строках, например, |, $, * и др.
Однако имеется ряд клавиш, которым не назначены отображаемые на экране
символы. Это, например, функциональные клавиши , ...; клавиши
управления курсором , , , , , и др. При нажатии этих клавиш в кольцевой буфер ввода
засылается расширенный код ASCII, в котором младший байт равен нулю, а
старший является скэн-кодом нажатой клавиши. Расширенный коды ASCII
поступают в буфер ввода и в случае нажатия комбинаций управляющих и
функциональных клавиш, например, /, / (на
дополнительной цифровой клавиатуре), / и др. В этом
случае, однако, в старший байт расширенного кода ASCII помещается уже не
скэн-код клавиши, а некоторый код, специально назначенный этой комбинации
клавиш. Естественно, этого кода нет среди "обычных" скэн-кодов. Например, клавиша , скэн-код которой равен 3Bh, может генерировать следующие
расширенные коды ASCII:
ЗB00h / 5E00h / 6800h /
5400h
Итак, прерывание, возникающее при нажатии или отпускании любой клавиши, обрабатывается по относительно сложному алгоритму с системным обработчиком, содержащимся в BIOS. Рассмотрим примеры вмешательства в этот процесс. Ниже приведен пример прикладной программы, выполняющей некоторую обработку поступающих с клавиатуры данных еще до активизации системного обработчика.
3. Описание программы
3.1. Описание для пользователя
Приведённая ниже программа осуществляет перехват прерывания от
клавиатуры, и производит запись скэн-кодов клавиш и байта флагов клавиатуры
в файл с именем « s_code&f.txt ». При этом фиксируются только нажатия
клавиш. Запись происходит при каждом шестнадцатом нажатии клавиши. Это
сделано, во-первых, для уменьшения вероятности потери «ценных» нажатий при
экстренном выключении компьютера, во-вторых, для экономии оперативной
памяти, в-третьих, для сохранения нормальной работоспособности компьютера.
Файл « s_code&f.txt » создаётся в родительском каталоге
программы. Если при инсталляции файл уже существует, то программа, автоматически, запишет в конец текущую дату и время, после этого будет
осуществляться запись скэн-кодов и флагов в обычном режиме после даты и
времени. Программа является резидентной. После того как она будет успешно
инсталлирована, на экране появится соответствующая надпись “Program
installed”. В ней предусмотрена защита от повторной установки. Таким
образом одновременно в оперативной памяти компьютера не может находится
больше одной копии программы, что практически сводит к нулю шансы не
корректной работы. При попытке запустить программу после того как она уже
была инсталлирована, на экране появится соответствующая надпись “Program
already installed”. Также эту программу можно выгрузить из оперативной
памяти после того как потребность в ней отпадёт. Для этого следует
запустить программу с ключом “off”, т.е. в командной строке написать off . После этого вы увидите строку “Program is DIE”, сигнализирующую об успешной выгрузке программы. При этом содержимое буфера
будет записано в файл. Таким образом, в файл будут записаны все нажатия
клавиш вплоть до выгрузки программы. Если данную программу записать, например, в autoexec.bat, то можно будет проследить время начала работы
пользователя и какие кнопки он после этого нажимал.
Данная программа работает только в среде MS-DOS.
3.2 Описание для программиста
Программа пишется в формате СОМ, поэтому в ней предусматривается только
один сегмент, с котором связываются сегментные регистры CS и DS; в начале
сегмента резервируется 256 байт дня PSP.
Инициализация.
При запуске программы с клавиатуры управление передается (в соответствии
с параметром директивы end) на начало процедуры main. Командой jmp сразу же
осуществляется переход на секцию инициализации, которая оформлена в виде
отдельной процедуры. В секции инициализации подготавливаются условия для
работы программы уже в резидентном состоянии.
В начальной части инициализации мы проверяем наличие хвоста в PSP, если
же в командной строке кроме имени команды ничего не было – переходим на
дальнейший анализ: mov cl,es:80h cmp cl,0 je live
Если хвост присутствует, проверим не был ли введён ожидаемый параметр
“off”. При положительном результате проверки устанавливаем флаг требования
выгрузки “flag” в единицу и переходим на дальнейший анализ.
Затем вызываем мультиплицированное прерывание int2Fh c функцией F1h и
подфункцией проверки на повторную установку 00h. Если наш обработчик
находится в оперативной памяти – он возвратит AL=FFH, и программа перейдёт
на метку installed. Проверим установлен ли флаг требования выгрузки “flag”
. Если flag =1 перейдём на метку unins, где перешлём в первую
(резидентную) копию программы запрос на выгрузку из оперативной памяти по
средствам прерывания int2Fh и функцией F2h с подфункцией 01h. После чего
происходит вывод строки “Program is DIE” на экран сигнализирующей об
успешном удалении резидентной части программы. После чего выйдем из
программы, обычным образом, функцией 4С00h.
Если флаг требования выгрузки “flag”=0, это говорит о том, что введена неизвестная команда, а наш резидент уже инсталлирован. В этом случае выведем на экран предупреждающую надпись о невозможности повторной установки программы “Program already installed” сопровождаемую звуковым сигналом. После этого завершим программу функцией 4Ch с кодом возврата 01h.
Если после прерывания int2Fh c функцией F200h, возвратиться AL(FFh, то нашего обработчика в памяти не оказалось. Сохраним смещения и сегменты системных обработчиков int09h и int2Fh, а затем заполним векторы смещениями наших обработчиков. mov ax,352fh int 21h mov word ptr cs:old_2fh,bx mov word ptr cs:old_2fh+2,es mov ax,252fh mov dx,offset new_2fh int 21h mov ax,3509h int 21h mov word ptr cs:old_09h,bx mov word ptr cs:old_09h+2,es mov ax,2509h mov dx,offset new_09h int 21h
После этого произведём поиск рабочего файла «s_code&f.txt» в текущем каталоге. Если файл не будет найден, то запустится процедура div_f, которая создаст рабочий файл и запишет в него строку «Skencode&Klav_flag file». В дальнейшем в этот файл будут записываться скэн-коды и байт флагов клавиатуры. Если файл уже существует, будет вызвана процедура div2_f, которая допишет в конец файла текущую дату и время.
Выведем на экран строку «Program installed» подтверждающую установку
программы. Последними строками этой части инициализации вызывается функция
DOS 31h, которая выполняет завершение программы с оставлением в памяти
указанной ее части. Размер резидентной части программы (в параграфах)
передается DOS в регистре DX. Размер резидентной секции определяется
разностью смещений end_res-main, которая равна длине резидентной части
программы в байтах, прибавляется размер PSP (l00h) и еще число 15 (Fh) для
того, чтобы после целочисленного деления на 16 результат был округлен в
большую сторону.
mov ax,3100h
mov dx,(end_res-main+10fh)/16
int 21h
С целью экономии памяти секция инициализации располагается я конце программы и отбрасывается при ее завершении.
Функция 31h, закрепив за резидентной программой необходимую для ее функционирования память, передает управление командному процессору и вычислительная система переходит в исходное состояние. Наличие программы, резидентной в памяти, никак не отражается на хода вычислительного процесса, за исключением того, что уменьшается объем свободной памяти. Одновременно в память может быть загружено любое число резидентных программ.
Резидентная часть обработчика.
Эта секция программы имеет две точки входа:
1. Перехват прерывания int09h(клавиатура). В результате нажатия или отпускания клавиши на клавиатуре запускается процедура new_09h.
2. Перехват мультиплексорного прерывания int2Fh. В результате перехвата мультиплексорного прерывания запускается процедура new_2fh.
Обработчик прерывания от клавиатуры.
После запуска процедуры new_09h сохраним используемые регистры. Затем
получим скэн-код последней нажатой клавиши. В противном случае восстановим
регистры и передадим управление следующему по цепочке обработчику
клавиатуры (скорее всего это будет BIOS-овский обработчик «int09h»). in al,60h cmp al,80h ja exit
Затем запишем этот скэн-код в буфер, считаем байт флагов клавиатуры из
области данных BIOS и также занесём в буфер.
Наш буфер имеет объём 32 байта, поэтому после каждого шестнадцатого
нажатия необходимо сохранять буфер в рабочем файле. Для подсчёта нажатий
введена переменная-счётчик sch.
Увеличим счётчик на 2, затем проверим полон ли буфер, сравнив счётчик с
32. Если буфер не полон, сохраним использовавшиеся регистры и передадим
управление следующему по цепочке обработчику клавиатуры. Если буфер забит, передадим управление процедуре fil.
Эта процедура откроет наш рабочий файл, установит указатель в конец и
допишет столько байт из буфера начиная сначала, сколько укажет ей
переменная-счётчик. mov ah,40h mov cl,sch mov dx,offset bufer int 21h
Это сделано для того, чтобы при удалении программы из памяти в файл были
записаны все скэн-коды включая команду на удаление. Этот случай рассмотрим
ниже. После того как данные будут сохранены, восстановим использовавшиеся
регистры и передадим управление следующему по цепочке обработчику
клавиатуры.
Рекомендуем скачать другие рефераты по теме: конспекты занятий в детском саду, менеджмент.
Категории:
Предыдущая страница реферата | 1 2 3 4 5 6 7 | Следующая страница реферата