Программа для установки драйвера
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Программа для установки представляет собой консольное предложение. На это приложение не накладывается особых требований по скорости и по размеру. Поэтому и была выбрана среда C++ Builder. Она позволяет легко создавать консольные предложения. Программы, написанные в этой среде, занимают мало места, и имеют компактный текст.

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

Программа для управления драйвером

Программа для управления драйвером представляет собой оконное приложение. Написана она была в среде C++ Builder. Поскольку приложение предназначено для пользователя., то оно должно иметь красивый и понятный интерфейс. Данная среда содержит множество стандартных визуальных компонент. Позволяющих осуществить поставленную задачу. Для приложения скорость и объем не является критичным параметром. Поэтому выбор C++ Builder можно считать оптимальным.

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

 

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

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

Скэнкоды нажатых или отпущенных клавиш хранятся в системном буфере. Доступ к этому буферу можно получить, если прочитать данные по адресу, хранящемуся в 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.

Вместе с Alt PrintScreen выдает:

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

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

Без Alt PrintScreen выдает:

§ Скан код равен 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 пакетов ниже по стеку. Адрес этой структуры находится в поле D eviceExtension нашего FDO.

Дата: 2019-05-29, просмотров: 188.