МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Резидентный обработчик клавиатуры (перехват нажатий клавиш и запись в файл)

    Резидентный обработчик клавиатуры (перехват нажатий клавиш и запись в файл)

    Министерство образования Украины

    Одесская государственная академия холода

    Институт информационных технологий

    Кафедра «Информационных систем»

    Разработка резидентного обработчика прерываний от клавиатуры

    Курсовой проект по дисциплине

    «Системы программирования и операционные системы»

    Руководитель Ненов А. Д. Исполнитель

    Ст. гр. 333А Лазанюк

    А. С.

    Зач. книжка № 983214

    Защищён с оценкой _____________________

    (личная подпись)

    _______________

    г. Одесса 2000 г.

    Содержание:

    1. Задание……………………………………………………………………………………………….2

    2. Краткие теоретические сведенья

    1. Резидентный обработчик прерываний………………………………………………………...3

    2. Защита резидентной программы от повторной установки…………………………………..5

    3. Выгрузка резидентной программы из памяти………………………………………………...8

    4. Перехват прерываний…………………………………………………………………………11

    5. Обработчик прерываний………………………………………………………………………12

    6. Прерывания от внешних устройств…………………………………………………………..12

    7. Резидентный обработчик прерываний от клавиатуры с подключением до

    системного обработчика…………………………………………………………………………………….14

    3. Описание программы

    1. Описание для пользователя…………………………………………………………………...19

    2. Описание для программиста………………………………………………………………….20

    3. Листинг программы………………………………………………………………………..….24

    4. Рекомендации по улучшению………………………………………………………………...32

    4. Список используемой литературы…………………………………………………………..….33

    1. Задание

    Разработка резидентного обработчика прерываний от клавиатуры с

    подключением до системного. Данный обработчик должен производить запись

    скэн-кодов всех нажимаемых клавиш, а также фиксировать байт флагов

    клавиатуры при каждом нажатии. Обработчик должен иметь механизм выгрузки из

    оперативной памяти встроенный в него самого. Также программа должна иметь

    защиту от повторной установки в оперативную память.

    2. Краткие теоретические сведенья

    2.1. Резидентный обработчик прерываний

    Большой класс программ, обеспечивающих функционирование вычислительной

    системы (драйверы устройств, программы шифрации и защиты данных,

    русификаторы, обслуживающие программы типа электронных блокнотов или

    калькуляторов и др.), должны постоянно находиться в памяти и быстро

    реагировать на запросы пользователя или на какие-то события, происходящие в

    вычислительной системе. Такие программы носят названия программ,

    резидентных в памяти (Terminate and Stay Resident, TSR), или просто

    резидентных программ. Сделать резидентной можно как программу типа СОМ,

    так и программу типа

    ЕХЕ, однако ввиду того, что резидентная программа должна быть максимально

    компактной, чаще всего в качестве резидентных используют программы типа

    СОМ.

    Рассмотрим типичную структуру резидентной программы и системные средства

    оставления ее в памяти после инициализации (рис. 2.1).

    text segment 'code'

    assume CS:text,DS:text

    org 100h main proc

    jmp init ;Переход на секцию инициализации

    ; Данные резидентной секции программы

    . . .

    entry: ; Текст резидентной секции программы

    . . .

    main endp

    init proc ;Секция инициализации

    . . .

    mov DX, (init-main+10Fh)/16;Paзмер в параграфах

    mov АН,3100h ;функция "Завершить и оставить в

    int 21h ; памяти" init endp text ends

    end main

    Рис 2.1. Типичная структура резидентной программы.

    Программа пишется в формате СОМ, поэтому в ней предусматривается только

    один сегмент, с котором связываются сегментные регистры CS и DS; в начале

    сегмента резервируется l00h байт дня PSP.

    При запуске программы с клавиатуры управление передается (в соответствии

    с параметром директивы end) на начало процедуры main. Командой jmp сразу же

    осуществляется переход на секцию инициализации, которая может быть

    оформлена в виде отдельной процедуры или входить в состав процедуры main.

    В секции инициализации, в частности, подготавливаются условия для работы

    программы уже в резидентном состоянии. Последними строками секции

    инициализации вызывается функция DOS 31h, которая выполняет завершение

    программы с оставлением в памяти указанной ее части. Эта функция не может

    оставлять резидентными программы размером больше 64 Кб, но многие

    программы, написанные на ассемблере, соответствуют этому условию. Так как

    резидентные программы уменьшают объем основной памяти, их всегда пишут на

    ассемблере и оптимизируют для достижения минимального размера.

    Размер резидентной части программы (в параграфах) передается DOS в

    регистре DX. Определить размер резидентной секции можно, например,

    следующим образом. К разности смещений mil-main, которая равна длине

    резидентной части программы в байтах, прибавляется размер PSP (l00h) и еще

    число 15 (Fh) для того, чтобы после целочисленного деления на 16 результат

    был округлен в большую сторону.

    С целью экономии памяти секция инициализации располагается я конце

    программы и отбрасывается при ее завершении.

    Точка входа ( main

    при загрузке jmp init

    . Резидентные

    ( поля данных

    Резидентная часть

    Точка входа ( entry программы

    при вызове . Резидентные

    ( коды

    iret

    init

    . Секция

    ( инициализации Завершение

    программы

    Функция DOS 31h ( с составлением в памяти

    её резидентной части

    Рис. 2.2 Взаимодействие элементов резидентной программы.

    Функция 31h, закрепив за резидентной программой необходимую для ее

    функционирования память, передает управление командному процессору и

    вычислительная система переходит в исходное состояние. Наличие программы,

    резидентной в памяти, никак не отражается на хода вычислительного процесса,

    за исключением того, что уменьшается объем свободной памяти. Одновременно в

    память может быть загружено любое число резидентных программ.

    На рис. 2.2 показаны элементы резидентной программы и их взаимодействие.

    Любая резидентная программа имеет по крайней мере две точки входа. При

    запуске с клавиатуры программы типа .СОМ управление всегда передается на

    первый байт после PSP (IP=l00h). Поэтому практически всегда первой командой

    резидентной программы является команда jmp, передающая управление на начало

    секции инициализации.

    После отработки функции DOS 31h программа остается в памяти в пассивном

    состоянии. Для того, чтобы активизировать резидентную программу, ей надо

    как-то передать управление и, возможно, параметры. Вызвать к жизни

    резидентную программу можно разными способами, но наиболее употребительным

    является механизм аппаратных или программных прерываний. В этом случае в

    секции инициализации необходимо заполнить соответствующий вектор адресом

    резидентной части программы (точка entry на рис. 2.2). Адрес entry образует

    вторую точку входа в программу, через которую осуществляется ее

    активизация. Очевидно, что резидентная секция программы должна

    заканчиваться командой выхода из прерывания iret.

    Поля данных резидентной части программы переместились в начало программы

    после команды imp. Это довольно естественное место дня резидентных данных,

    потому что и при первом запуске, и при активизации сюда никогда не будет

    передано управление. При заполнении в секции инициализации векторов не

    возникает проблем с перенастройкой регистра DS, так как в программе типа

    СОМ все регистры указывают на единственный сегмент программы. В секции

    инициализации предусмотрен, как это обычно делается, вывод на экран

    сообщения о загрузке программы в память.

    После запуска программы она остается в памяти и, активизируясь фактически

    аппаратными прерываниями от клавиатуры (а более точно – программой BIOS,

    активизируемой аппаратными прерываниями от клавиатуры).

    2.2. Защита резидентной программы от повторной установки

    Как правило, в секции инициализации загружаются векторы прерываний, через

    которые будет активизироваться программа. Последними строками секции

    инициализации вызывается функция DOS 31h, которая выполняет завершение

    программы с оставлением в памяти ее резидентной части.

    Если программу запустить с клавиатуры повторно, в память будет загружена

    и останется резидентной ее вторая копия. Это плохо не только потому, что

    понапрасну расходуется память, более неприятным является вторичный перехват

    тех же векторов. Если резидентная программа после ее активизации не

    обращается к старому содержимому перехваченных ею векторов, то вторая копия

    полностью лишит первую работоспособности, и тогда повторная загрузка

    приведет только к расходованию памяти. Если, однако, как это обычно и имеет

    место, резидентная программа в процессе своей работы передаст управление

    старому обработчику перехваченного ею прерывания, то новая копия

    резидентной программы, сохранившая в процессе инициализации адрес первой

    копии в качестве содержимого перехватываемого вектора, будет при каждой

    активизации вызывать и первую копию. В результате резидентная программа

    будет фактически выполняться при каждом вызове дважды. Во многих случаях

    такое повторное выполнение нарушит правильную работу программы. Поэтому

    обязательным элементом любой резидентной программы является процедура

    защиты ее от повторной загрузки, или, как говорят, установки.

    Наиболее распространенным методом защиты резидентной программы от

    повторной установки является использование прерывания 2Fh, специально

    предназначенного для связи с резидентными программами. При вызове этого

    прерывания в регистре АН задается номер функции (от 00h до FFh), а в

    регистре AL - номер подфункции (в том же диапазоне). 00h - 7Fh

    зарезервировано для DOS/Windows 0B8h - 0BFh зарезервировано для сетевых

    функций 0C0h - 0FFh отводится для программ.

    Для того, чтобы резидентная программа могла отозваться на вызов

    прерывания int 2Fh, в ней должен иметься обработчик этого прерывания.

    Фактически все резидентные программы, как системные, так и прикладные,

    имеют такие обработчики, через которые осуществляется не только проверка на

    повторную установку, но и вообще связь с резидентной программой: смена

    режима ее работы или получение от неё в транзитную программу каких-то

    параметров. Задание действия, которое надлежит выполнить обработчику

    прерывания 2Fh конкретной резидентной программы, осуществляется с помощью

    номера подфункции, помещаемого перед вызовом прерывания в регистр AL

    Таким образом, обработчик прерывания 2Fh резидентной программы должен,

    прежде всего, проверить номер функции в регистре АН; при обнаружении

    "своей" функции обработчик анализирует содержимое регистра AL и выполняет

    затребованные действия, после чего командой iret передаст управление

    вызвавшей его программе. Если, однако, обработчик обнаружил в регистре АН

    "чужую" функцию, он должен командой jmp CS:old_2fh передать управление по

    цепочке тому обработчику, адрес которого был ранее в векторе 2Fh. В

    результате вызов int 2Fh из любой программы будет проходить по цепочке

    через все загруженные резидентные программы, пока не достигнет "своей"

    программы или не вернет управление в вызвавшую программу через обработчик

    DOS (который, очевидно, всегда будет самым последним в цепочке).

    Естественно, для коммуникации с резидентной программой должен быть

    установлен некоторый интерфейс. Обычно при проверке на повторную установку

    резидентная программа, если она уже находится в памяти, возвращает в

    регистре AL значение FFh, которое является признаком запрета вторичной

    загрузки. Иногда для большей надежности идентификации "своей" функции

    резидентная программа, помимо значения FFh в регистре AL, возвращает еще

    какие-то обусловленные заранее коды в других регистрах. Часто через

    дополнительные регистры передастся символьная информация, например, имя

    программы. В этом случае, если вызвавшая программа с именем DUMP.COM (т.е.

    вторая копия резидентной программы, выясняющая, можно ли ей остаться

    резидентной в памяти) получает после вызова int 2Fh в регистре AL значение

    FFh, а в регистрах СХ и DX символьные коды 'DU' и 'МР', она может быть

    уверена, что ее первая копия уже находится в памяти. Если же в регистре AL

    вернулся код FFh, а в регистрах СХ и DX -коды, например, 'ОК' и 'RB', это,

    скорее всего означает, что закрепленная за нашей программой функция

    мультиплексного прерывания ухе используется другой резидентной программой.

    В этом случае стоит сменить функцию, чтобы не возбуждать конфликтных

    ситуаций.

    В резидентную часть следует включить обработчик прерывания 2Fh. Его

    расположение в пределах текста программы не имеет особого значения; мы

    поместили его в начале резидентной части. Секция инициализации претерпела

    большие изменения. Она должна начинаться с вызова прерывания 2Fh с

    соответствующей функций для проверки на повторную установку. Если первая

    копия программы уже загружена, текущую программу следует завершить не

    функцией 3th (завершить и оставить в памяти), а обычной функцией завершения

    4Ch. Если же нашей программы в памяти нет, то в секции инициализации,

    помимо заполнения ее "рабочего" вектора, в данном случае 03h, следует также

    установить наш обработчик мультиплексного прерывания.

    Среди функций мультиплексного прерывания, предназначенных для прикладных

    программ, мы произвольно выбрали для нашей программы функцию F1h, а для

    проверки на повторную установку подфункцию 00h. Резидентный обработчик

    прерывания 2Fh, включенный в нашу программу, проверяет номера функции и

    подфункции и при обнаружении каких-либо других кодов передает управление

    следующему обработчику этого прерывания. Если же вызвана функция F1h с

    подфункцией 00h, обработчик устанавливает в регистре AL значение FFh ("я

    уже загружен") и возвращает управление в вызвавшую программу командой iret.

    Секция инициализации начинается с проверки на повторную установку. После

    загрузки в регистр АН номера функции (F1h), а в регистр AL - номера

    подфункции (00h), вызывается прерывание 2Fh. После возврата из прерывания

    анализируется содержимое регистра AL Если обработчик вернул значение FFh,

    программа должна завершиться без оставления в памяти. Эти действия

    выполняются по метке installed. Если возвращено другое значение,

    инициализация продолжается (для надежности стоило проверить, возвращен ли

    именно 0). Сохраняется старое содержимое вектора 2Fh, устанавливается наш

    обработчик этого прерывания, после чего выполняются все действия по

    установке, предусмотренные в старом варианте программы динамического дампа.

    При переходе на метку installed на экран выводится сообщение о

    невозможности повторной установки и выполняется функция завершения 4Сh с

    кодом возврата 01h. Последнее, конечно, имеет символический характер,

    поскольку этот код в дальнейшем не анализируется.

    2.3. Выгрузка резидентной программы из памяти

    Следует заметить, что в DOS отсутствуют средства выгрузки резидентных

    программ. Единственный предусмотренный для этого механизм - перезагрузка

    компьютера. Практически, однако, большинство резидентных

    программных продуктов имеют встроенные средства выгрузки. Обычно выгрузка

    резидентной программы осуществляется соответствующей командой, подаваемой с

    клавиатуры и воспринимаемой резидентной программой. Для этого резидентная

    программа должна перехватывать прерывания, поступающие с клавиатуры, и

    "вылавливать" команды выгрузки. Другой, боже простой способ заключается в

    запуске некоторой программы, которая с помощью, например, мультиплексного

    прерывания 2Fh передает резидентной программе команду выгрузки. Чаще всего

    в качестве "выгружающей" используют саму резидентную программу, точнее, ее

    вторую копию, которая, если ее запустить в определенном режиме, не только

    не пытается остаться в памяти, но, наоборот, выгружает из памяти свою

    первую копию.

    Выгрузку резидентной программы из памяти можно осуществить разными

    способами. Наиболее простой - освободить блоки памяти, занимаемые

    программой (собственно программой и ее окружением) с помощью функции DOS

    49h. Другой, более сложный - использовать в выгружающей программе функцию

    завершения 4Ch, заставив ее завершить не саму выгружающую, а резидентную

    программу, да еще после этого вернуть управление в выгружающую. В любом

    случае перед освобождением памяти необходимо восстановить все векторы

    прерываний, перехваченные резидентной программой. Следует подчеркнуть, что

    восстановление векторов представляет в общем случае значительную и иногда

    даже неразрешимую проблему. Во-первых, старое содержимое вектора, которое

    хранится где-то в полях данных резидентной программы, невозможно извлечь

    Страницы: 1, 2, 3, 4


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.