Клавиатурные макроопределения
Потребность в использовании макросов. Архитектура Windows NT 5. Классификация, структура драйверов. Процедура обработки пакетов. Стек драйверов клавиатуры. Установка, обращение к разработанным программам. Выбор языка программирования и средств разработки.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 24.06.2009 |
Размер файла | 594,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
USHORT Flags. Это поле несет дополнительную информацию о клавише, а так же определяет, нажали клавишу или отпустили. Если нулевой бит равен 0, то значит клавиша нажата, если же он равен 1, то она отпущена. Биты 1 и 2 используются для идентификации клавиши.
USHORT Reserved. Поля является зарезервированным.
ULONG ExtraInformation. Это поле содержит дополнительную информацию об устройстве.
Все клавиши, кроме клавиши Pause, вырабатывают одну запись при нажатии и одну при отпускании [2].
Клавиша Pause вырабатывает 4 записи, если она была нажата без Ctrl:
· Скан-код равен 29, флаги равны 4
· Скан-код равен 69, флаги равны 0
· Скан-код равен 29, флаги равны 5
· Скан-код равен 69, флаги равны 1
Если клавиша Pause была нажата вместе с Ctrl, то она выдает 2 записи:
· Скан-код равен 70, флаги равны 2
· Скан-код равен 70, флаги равны 3
Бит 2 равен 0, а бит 1 равен 1 в поле Flags у следующих клавиш: Insert, Delete, PageUp, PageDown, Home, End, PrintScreen, правй Ctrl, правй Alt, Enter на дополнительной клавиатуре, обратный слеш на дополнительной, стрелки, клавиши Windows, клавиша всплывающего меню.
У всех остальных клавиш биты 1 и 2 поля Flags равны 0.
Клавиша PrintScreen - это единственная клавиша, которая меняет выдаваемый скан-код в зависимости от того, нажата ли другая. PrintScreen меняет скан-код в зависимости от Alt.
Вместе с Alt PrintScreen выдает:
· Скан-код равен 84, флаги равны 0 (при нажатии )
· Скан-код равен 84, флаги равны 1 (при отпускании )
Без Alt PrintScreen выдает:
· Скан-код равен 55, флаги равны 2 (при нажатии )
· Скан-код равен 55, флаги равны 3 (при отпускании )
Поэтому для задания горячей комбинации клавиша PrintScreen не допускается.
2.4.2.1 Анализ содержимого IRP пакета
В функции MyReadBack анализируются скан-коды нажатых клавиш и их флаги.
Значение поля MakeCode хранит скан-код нажатой или отжатой клавиши, значение поля Flags хранит флаг, который устанавливается в 0 или 2, если клавиша была нажата и в 1 или 3, если отжата. Этот флаг используется в данной работе для постоянного контроля комбинации зажатых клавиш.
При очередном нажатии клавиши, в процедуре MyReadBack анализируется этот флаг и, если флаг равен 0 или 2 (клавиша нажата), то значение скан-кода, если такого еще нет в массиве текущей комбинации зажатых клавиш, записывается, а если 1 или 3, то значение скан-кода ищется в массиве и удаляется. Таким образом, удается постоянно контролировать зажатые клавиши для того, чтобы определить факт нажатия пользователем «горячей комбинации». После каждого нажатия клавиши, текущая комбинация зажатых клавиш сверяется со списком «горячих клавиш» всех записанных макросов. Если обнаруживается совпадение, то возводится флаг «Замены» и записывается в массив to_make_change последовательность клавиш, которую необходимо воспроизвести.
2.4.3 Алгоритм воспроизведения макроса
Как уже было сказано выше, IRP пакет с кодом IRP_MJ_READ постоянно весит в очереди. То есть, как только IRP_MJ_READ вернется потоку необработанного ввода RawInputThread системного процесса csrcc.exe, тот тут же генерирует и посылает новый пакет IRP_MJ_READ.
Алгоритм воспроизведения заданной последовательности клавиш основывается на том, что пакет с кодом IRP_MJ_READ постоянно посылается вниз по стеку, не смотря на то, была ли нажата клавиша или нет.
Как только в функции MyReadBack устанавливается совпадение зажатой комбинации клавиш с одной из «горячих комбинаций» записанных макросов, устанавливается флаг «Замена» и в глобальный массив to_make_change типа KEYBOARD_INPUT_DATA записывается последовательность скан-кодов, которую необходимо воспроизвести. Пакет отпускается дальше вверх по стеку. Как только он возвращается потоку необработанного ввода, тот тут же посылает новый пакет с кодом IRP_MJ_READ. У драйвера-фильтра вызывается функция MyRead. Определив, что флаг «Замена» установлен, она записывает в системный буфер, на который указывает IRP->AssociatedIrp.SystemBuffer, очередной элемент массива to_make_change и завершает обработку пакета вызовом IoCompleteRequest. Пакет возвращается вверх по стеку потоку RawInputThread, который обрабатывает его как если бы была нажата/отжата клавиша, информация о которой была записана в системный буфер, и посылает новый пакет. Этот новый пакет опять попадает в функцию MyRead и, если в массиве to_make_change еще остались не посланные элементы, действия повторяются. Как только функция MyRead обработает последний элемент массива to_make_change, она сбросит флаг «Замена» и следующий пакет с кодом IRP_MJ_READ обработается как обычно, т.е. зарегистрируется процедура call-back и пакет отправится нижележащему драйверу.
2.5 Структура данных драйвера-фильтра
Списки последовательности скан-кодов макроса хранятся в следующих структурах:
typedef struct _LIST
{
USHORT MakeCode; // информация о клавише, которая должна
быть нажатой
UCHAR Flags;
} KEY;
typedef struct _CHANGE
{
USHORT HotKeys[4]; // сканкоды клавиш горячей комбинации
KEY *macros;
UCHAR kol;
struct _CHANGE *next; // указатель на следующую структуру
} HOTKEY;
USHORT HotKeys[4] - массив из четырех элементов - «горячая комбинация» для макроса. Довольно трудно для пользователя зажать больше четырех «горячих клавиш», поэтому максимальное количество клавиш в комбинации ограничено 4.
KEY *macros - указатель на динамический массив, в котором хранится информация о последовательности нажатых и отжатых клавиш самого макроса. Для хранения «содержания» макроса был выбран такой способ организации памяти как массив, так как каждый раз выделять память при нажатии или отжатии клавиши очень накладно. Поэтому выделяется сразу большой буфер, а после останова записи макроса освобождается оставшаяся память.
UCHAR kol - количество элементов в массиве macros.
struct _CHANGE *next - указатель на следующий элемент в списке макросов. Для хранения макросов был выбран способ организации памяти списками, так как количество макросов не предсказуемо, и они записываются не так часто, как в случае с нажатием клавиши, поэтому можно позволить тратить на это время.
2.6 Установка драйвера в системе
Для установки драйвера необходимо вызвать функции драйвера в определенный момент загрузки системы. Это необходимо для того, чтобы драйвер занял нужное место в стеке драйверов. Операционная система Windows осуществляет загрузку драйверов в порядке, прописанном в системном реестре.
Каждое устройство имеет свой раздел в реестре. Все эти разделы находятся в
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControleSet\Control\Class.
Клавиатуре соответствует раздел
{4D36E96B-E325-11CE-BFC1-08002BE10318}.
У каждого устройства в его разделе есть ключи UpperFilters и LowerFilters. Это ключи типа MultiString. Они содержат имена верхних и нижних драйверов-фильтров данного устройства. Драйверы-фильтры загружаются в систему в том порядке, в каком они записаны в этих ключах.
Для регистрации разрабатываемого драйвера как фильтра необходимо поместить его имя первым в ключе UpperFilters.
Для регистрации нового драйвера необходимо создать раздел с именем этого драйвера в системном реестре по адресу:
HKEY_LOCAL_MACHINE\SYSTEM\\Services.
Этот раздел должен содержать следующие ключи:
· Type типа двойное слово
Определяет тип подключаемого модуля. Для драйверов режима ядра значение всегда равно единице.
· Start типа двойное слово
Определяет метод загрузки драйвера. Может принимать одно из следующих значений [3]:
· SERVICE_BOOT_START (0) - во время начальной загрузки ОС. Данное значение применяется, когда драйвер используется загрузчиком системы;
· SERVICE_SYSTEM_START (1) - после начальной загрузки ОС. Применяется для драйверов, которые самостоятельно осуществляют поиск оборудования, но не используются загрузчиком системы (нумераторы).
· SERVICE_AUTO_START (2) - автоматическая загрузка с помощью диспетчера управления сервисами (Service Control Manager). Применяется для драйверов, не поддерживающих Plug and Play.
· SERVICE_DEMAND_START (3) - загрузка «по требованию» либо диспетчера Plug and Play при обнаружении устройства, либо диспетчера управления сервисами при поступлении от пользователя команды на загрузку.
· SERVICE_DISABLED (4) - драйвер не загружается.
· ErrorControl типа двойное слово
Определяет уровень контроля ошибок. Может принимать одно из следующих значений [3]:
· SERVICE_ERROR_IGNORE (0). В случае сбоя при загрузке драйвера игнорировать его и продолжить работу.
· SERVICE_ERROR_NORMAL (1). В случае сбоя при загрузке драйвера продолжить работу, но выдать при этом соответствующее предупреждение.
· SERVICE_ERROR_SEVERE (2). В случае сбоя при загрузке драйвера переключиться на последнюю конфигурацию, при которой работа системы происходила без ошибок.
· SERVICE_ERROR_CRITICAL (3). Аналогично (2), но в случае повторного сбоя выдать «синий экран».
· DisplayName типа строка ASCII
Название драйвера или устройства в том виде, в котором оно будет отображаться для пользователя [3].
· ImagePath типа строка Unicode
Полный путь к файлу с драйвером на диске. Обычно это поле устанавливается в значение %windir%\system32\Drivers\DriverName.sys, где %windir% -- папка, в которую установлена Windows, а DriverName -- имя файла [3].
3. Технологический раздел
3.1. Выбор языка программирования и среды разработки
Данный проект состоит из трех программ:
§ Драйвер
§ Программа для установки драйвера
§ Программа для управления драйвером
Каждая из программ, осуществляет общение с операционной системой на разном уровне. Соответственно необходим разный подход к этим задачам и специальный подбор средств разработки.
3.1.1. Драйвер-фильтр
От разрабатываемого драйвера требуется высокая скорость работы и надежность. При написании такой задачи осуществляется множество манипуляций с памятью, операций с указателями, преобразований типов. Программисту важно представлять структуру скомпилированного продукта, чтобы правильно представить себе логику его работы. Среди языков программирования, удовлетворяющих этим требованиям, известны С и ассемблер. Для написания драйвера предпочтение было отдано языку C. Выбор сделан, основываясь на следующих причинах:
· Существует специальный компилятор C, поставляемый вместе с пакетом DDK, предназначенный специально для компиляции драйверов. Он содержит множество макроопределений и библиотек, позволяющих сделать процесс написания драйвера более легким. Microsoft рекомендует его как основную среду для разработки драйверов для Windows. Компилятор содержит специальные функции, позволяющие уменьшить размер исходного кода [1]. Специального компилятора ассемблера Microsoft не выпускает.
· Программы на ассемблере работают, конечно, быстрее, чем программы на C. Но разница в скорости между этими языками не очень велика, зато работа с языком высокого уровня гораздо проще.
3.1.2 Пользовательское приложение для установки драйвера
Программа для установки представляет собой оконное приложение. На это приложение не накладывается особых требований по скорости и по размеру, поэтому и была выбрана среда C++ Builder. Она позволяет легко создавать оконные приложения. Программы, написанные в этой среде, занимают мало места, и имеют компактный текст. При написании программы была использована технология структурного программирования.
3.1.3 Пользовательское приложение для управления драйвером
Программа для управления драйвером представляет собой оконное приложение. Для ее написания была выбрана среда C++ Builder. Поскольку приложение предназначено для пользователя, то оно должно иметь красивый и понятный интерфейс. Данная среда содержит множество стандартных визуальных компонент, позволяющих осуществить поставленную задачу. Для приложения скорость и объем не являются критичными параметрами, поэтому выбор C++ Builder можно считать оптимальным. При написании программы была использована технология структурного программирования.
3.2. Интерфейс пользовательского приложения
Интерфейс пользовательского приложения состоит из трех окон:
· Главное окно
Главное окно содержит список горячих клавиш существующих макросов, кнопки, позволяющие модифицировать список макросов: добавить макрос, удалить макрос, выполняющие соответствующие действия, кнопку обновить список и закрыть.
При нажатии на кнопку «Добавить макрос», приложение переходит в режим записи макроса и появляется дополнительное меню, при этом блокируется нажатие кнопок, нажатие которых нелогично и недопустимо в данной ситуации:
· Окно сохранения записанного макроса и назначения «горячих клавиш»:
Здесь пользователь должен ввести «горячую комбинацию», при нажатии которой будет воспроизводиться записанный макрос. Для облегчения контроля вводимых данных редактирование поля запрещено, нон реагирует на нажатие клавиши и вставляет в поле соответствующую константу. Если при вводе была допущена ошибка, следует нажать кнопку «Очистить» и ввести правильный вариант.
· Окно просмотра «содержания» макроса:
Это поле не предназначено для редактирования, а только лишь для просмотра последовательности нажатых клавиш - «содержания» макроса.
3.3. Установка и обращение к разработанным программам
Для того чтобы запустить разработанное приложение, необходимо сначала установить драйвер. Для этого надо запустить установщик - файл Installer.exe. Затем в появившемся окне нажать кнопку «Инсталлировать» и, если установка прошла успешно, перезагрузить компьютер.
После перезагрузки компьютера, драйвер уже будет готов к работе, останется только запустить приложение. Приложение запускается файлом Application.exe. При запуске приложение связывается с фильтром и считывает «горячие комбинации» существующих макросов.
После закрытия приложения, драйвер все равно останется загруженным и будет воспроизводить макросы в соответствующем случае. Для того чтобы выгрузить драйвер, необходимо снова запустить приложение Installer.exe и нажать кнопку «Деинсталлировать».
Заключение
В данной работе рассмотрен вопрос, связанный с разработкой драйверов устройств в системе Windows, и реализован драйвер-фильтр клавиатуры, его установщик и приложение, управляющее работой драйвера.
Разработанный драйвер-фильтр позволяет
· переопределять значение любых клавиш клавиатуры;
· назначать на заданную комбинацию клавиш воспроизведение произвольной последовательности клавиш;
· отключать клавиши клавиатуры;
Разработанное приложение позволяет:
· просматривать список «горячих комбинаций» записанных макросов;
· просматривать содержимое макроса;
· записывать макрос, обеспечивая режим записи, паузы, останова, отмены записи;
· удалять макрос из списка макросов;
Разработанный установщик позволяет:
· инсталлировать драйвер-фильтр;
· деинсталлировать драйвер-фильтр;
Драйвер-фильтр отвечает всем современным требованиям, накладываемым Windows на драйверы.
Приложение 1
Схема взаимодействия компонентов системы.
Приложение 2.
Блок-схема работы функции MyReadBack.
Список литературы
1. Солдатов В.П. Программирование драйверов Windows. Изд. 2-е, перераб. и доп. М.: ООО «Бином-Пресс», 2004г
2. Форум www.rsdn.ru и его публикации.
3. Walter Oney. Programming the Windows Driver Model. 2nd edition.
Подобные документы
Разработка программного обеспечения для упрощения буквенно-цифрового ввода при невозможности использовать функционал стандартной буквенной клавиатуры. Классификация и установка драйверов. Выбор языка и среды программирования. Пользовательский интерфейс.
курсовая работа [183,0 K], добавлен 12.03.2013Архитектура Windows NT 5. Приоритеты выполнения программного кода. Описание формата MIDI-данных. Установка драйвера в системе. Выбор средств разработки программного обеспечения. Обработка запросов драйверной модели WDM. Использование библиотеки DirectKS.
курсовая работа [498,8 K], добавлен 24.06.2009Знакомство с техническими характеристиками персонального компьютера. Установка операционной системы и драйверов Windows 7. Способы чистки Windows XP Professional SP3. Методы восстановления операционной системы. Выполнение установки Microsoft Office 2010.
отчет по практике [5,6 M], добавлен 22.09.2014Многослойная архитектура драйверов. Организация внутреннего хранения данных диска. Выбор и обоснование языка и среды программирования. Обработка расширенных запросов. Процедуры установки драйвера виртуального диска. Блокировка выгрузки устройства.
курсовая работа [159,1 K], добавлен 23.06.2009Выбор операционной системы и среды программирования. Рабочие процедуры обработки IRP-пакетов. DPC–процедура отложенного вызова. Структура Legacy-драйвера. Периодичность обновления информации о процессах и потоках. ISR–процедура обработки прерываний.
курсовая работа [227,5 K], добавлен 23.06.2009Оптимизация математической модели и реинжиниринг бизнес-процессов. Основные методологии, используемые в BPwin. Выбор архитектуры информационной системы. Обоснование подбора языка программирования. Установка и запуск программы в среде MS-DOS и Windows.
дипломная работа [1002,3 K], добавлен 13.04.2014Понятие, сущность, структура и виды операционных систем. Характеристика операционной системы Windows XP, требования к ее установке, сравнительный анализ версий, особенности настройки, обновления версии, установки драйверов устройств и добавление новых.
реферат [558,8 K], добавлен 20.10.2009История создания. Windows 9x/NT. Операционная система Microsoft Windows. Преимущества и недостатки Windows. Некоторые клавиатурные комбинации Windows 9x и NT. Windows XP Professional. Наиболее совершенная защита.
реферат [19,3 K], добавлен 18.07.2004Установка операционной системы Windows Server 2003 SP-2 и драйверов. Запуск сетевых подключений. Использование, проверка и настройка различных программ MS Office 2007. Включение компонентов и программ, которые не устанавливаются во время установки ОС.
курсовая работа [10,5 M], добавлен 17.09.2013Основные сходства и отличия операционных систем Microsoft Windows и GNU/Linux: конфигурации, цена и широта технической поддержки; оценка стоимости владения и статистика использования на настольных компьютерах; простота инсталляции и наличие драйверов.
курсовая работа [294,9 K], добавлен 12.05.2011