Смекни!
smekni.com

Переопределение назначений клавиш на клавиатуре в операционной системе Windows (стр. 5 из 5)

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

3.2 Структуры данных проекта

Информация о нажатиях и опусканиях клавиш

Скэнкоды нажатых или отпущенных клавиш хранятся в системном буфере. Доступ к этому буферу можно получить, если прочитать данные по адресу, хранящемуся в IRP пакете. Адрес хранится в поле AssociatedIrp. SystemBuffer. Буфер представляет собой массив структур типа KEYBOARD_INPUT_DATA. Она состоит из следующих полей:

- UnitId типа USHORT. В нем хранится номер устройства, на котором нажали или отпустили клавишу.

- MakeCode типа USHORT. В этом поле хранится скэнкод нажатой или отпущенной клавиши. Скэнкод, переданный в этом поле, не определяет клавишу однозначно. Для полной идентификации клавиши необходимо значение поля Flags.

- Flags типа USHORT. Это поле несет дополнительную информацию о клавише, а так же определяет, нажали клавишу или отпустили. Если нулевой бит равен 0, то значит клавиша нажата, если же он равен 1, то она отпущена. Биты 1 и 2 используются для идентификации клавиши.

- Reserved типа USHORT. Поля является зарезервированным.

- ExtraInformation типа ULONG. Это поле содержит дополнительную информацию об устройстве.

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

- Клавиша 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.

Вместе с AltPrintScreen выдает:

- Скан код равен 84, флаги равны 0 (при нажатии)

- Скан код равен 84, флаги равны 1 (при отпускании)

Без AltPrintScreenвыдает:

- Скан код равен 55, флаги равны 2 (при нажатии)

- Скан код равен 55, флаги равны 3 (при отпускании)

Структура списка замен

Список замен замен – это массив структур ChangeStruct. Она состоит из следующих полей:

- f1 типа UCHAR. Поле содержит дополнительную, идентифицирующую заменяемую клавишу.

- Scan1 типа UCHAR. Поле содержит скэнкод заменяемой клавиши

- f2 типа UCHAR. Поле содержит информацию о клавише, на которую заменяют.

- Scan2 типа UCHAR. Поле содержит скэнкод клавиши, на которую заменяют.

Фактически поля f1 и f2 содержат 1 и 2 бит поля Flagsструктуры KEYBOARD_INPUT_DATA. Они помогают идентифицировать клавишу, которая заменяется, и на которую происходит замена.

Дополнительная информация

При создании FDO выделяется память под структуру DEVICE_EXTENSION, в эта структура состоит всего из одного поля. Это поле TopOfStack типа PDEVICE_OBJECT. Оно содержит указатель на FDO, расположенное ниже в стеке клавиатуры, и используется для передачи IRP пакетов ниже по стеку. Адрес этой структуры находится в поле DeviceExtension нашего FDO.

3.3 Интерфейс управляющего приложения

Интерфейс управляющего приложения состоит из двух окон. Первое окно представляет собой модель клавиатуры, оно является главным в программе. Второе окно предназначено для вывода информации и называется информационным.

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

- Название выбранной кнопки

- Название кнопки, на которую происходит замена

- Состояние кнопки (включена или выключена)

-


Если необходимо переопределить кнопку, то нужно щелкнуть по этой кнопке. В информационном окне появится информация об активизированной кнопке. Далее необходимо нажать на кнопку «Заменить», она расположена в информационном окне. И затем щелкнуть по кнопке, на которую необходимо произвести замену.

После того как желаема конфигурация определена, нужно нажать кнопку «Установить». После этого информация будет отослана драйверу, и изменения вступят в силу. Если необходимо узнать, какие замены производит драйвер на данный момент, то нужно щелкнуть по кнопке «Принять».

Для быстрого восстановления стандартных настроек клавиатуры предусмотрена кнопка «По умолчанию». Она загружает стандартную конфигурацию. Чтобы она вступила в силу, необходимо нажать на кнопку «Установить».

3.4 Тестирование драйвера-фильтра клавиатуры

Драйвер был протестирован с использованием стандартной тестирующей утилиты DriverVerifier пакета DDK. С его помощью были проведены следующие тесты:

- Операции с пулами памяти

- Корректность уровней IRQL, на которых выполняется код драйвера

- Обнаружение взаимоблокировок

- Нехватка ресурсов

- Нетипичные запросы к драйверу

Все тесты прошли успешно. Память в системе распределялась правильно, ошибок с ней не возникало. На нехватку ресурсов драйвер реагировал корректно. Нетипичные запросы к драйверу не обрабатывались им.

Для отладки драйвера использовалась программа DebugView. С помощью этой программы любой драйвер может выводить на экран отладочную информацию. При отладке эта программа позволила отследить процесс переопределения клавиш.

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

Заключение

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

Разрабатываемый драйвер позволяет

- переопределять значение любых клавиш клавиатуры

- отключать клавиши клавиатуры

Драйвер-фильтр отвечает всем современным требованиям, накладываемым Windows на драйверы.

Драйвер был протестирован с помощью тестирующих утилит Microsoft и успешно выдержал все тесты. Тестирование показало корректную работу.

Список литературы

1. Кузьмин И. Драйверы уровня ядра системы WindowsXP // Программист, – М.:ООО «Викфилд». – №11, 2003

2. Солдатов В.П. Программирование драйверов Windows. Изд. 2-е, перераб. и доп. М.: ООО «Бином-Пресс», 2004 г.

3. MSDN Library, Copyright 1987–2004 Microsoft Corporation

4. Форум и публикации проекта «Первые шаги» – www.firststeps.ru.