2.2 Взаимодействие компонентов системы

2.3 Размещение драйвера в памяти

 

Некоторые процедуры драйвера, те которые выполняют инициализацию, выгодно выполнить и освободить память после выполнения. Поскольку процедуры инициализации выполняются всего один раз при загрузке системы, а после этого находятся в памяти, занимая ценное место. В языке C есть специальная директива, позволяющая разместить инициализирующий код в специальной секции. Память из под этой секции будет возвращена системе после выполнения. Это директива #pragma alloc_text («INIT», имя). Параметром директивы является имя функции.

В данном фильтре функцией, которая выполняет инициализацию, является только DriverEntry. Ее имя и является параметром директивы.

По умолчанию функции драйвера размещаются в нестраничной памяти. Эта память является очень ценной, поскольку она не может быть выгружена на жесткий диск. Экономней было бы разместить код драйвера в странично организованной памяти. Для этого в C предусмотрена директива #pragma alloc_text («PAGE», имя). Параметром директивы является имя функции, которая должна быть размещена в странично организованной памяти. В данном драйвере-фильтре все процедуры кроме DriverEntry размещаются там.

2.4 Переопределение клавиш

 

Поскольку функция MyRead, которая обрабатывает пакеты IRP_MJ_READ, получает пакет IRP без прочитанных данных, то она устанавливает CallBack процедуру. Эта процедура вызывается, когда буфер получает данные.

Реализация процедуры MyReadBack

N – это количество записей в буфере.

K – количество записей в массиве замен.

S[i] – скэнкод клавиши, соответствующей i‑ой записи буфера.

F1 [j] – скэнкод заменяемой клавиши (j‑ая запись массива замен).

F2 [j] – скэнкод клавиши, на которую происходит замена (j‑ая запись массива замен).

Клавиша Pause

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

Предположим, пользователь поменял правый Ctrl и «a» местами. В этом случае при нажатии на «a» + Pause, клавиша Pause должна выдать код, как будто бы была нажата клавиша Ctrl. И наоборот выдать обычный код Pause при нажатии Ctrl + Pause.

Для решения этой задачи необходимо завести переменную, которая будет хранить информацию, о том, нажата ли клавиша, отвечающая на данный момент за Ctrl. Эта переменная называется CtrlPressed. Если клавиша нажата, то переменная равна 1, иначе 0.

Алгоритм работы с клавишей Pause

§   Встречена последовательность записей Ctrl + Pause

·          Если CtrlPressed=1, то

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

·          Если CtrlPressed=0, то

последовательность, заменяется на последовательность, соответствующую обычной Pause

§   Встречена последовательность записей Pause

·          Если CtrlPressed=1, то

последовательность, заменяется на последовательность, соответствующую Ctrl + Pause

·          Если CtrlPressed=0, то

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

Клавиша PrintScreen

Поскольку PrintScreen выдает разные записи, в зависимости от того, нажата ли клавиша Alt. Клавиша PrintScreen, в отличие от Pause может быть заменена на другую клавишу. И она всегда выдает по одной записи при нажатии и тпускании.

Как и в случае с Pause вводится переменная AltPressed, которая равна 1, если нажата клавиша, отвечающая за Alt.

Произведем унификацию. При встрече записи, соответствующей PrintScreen или Alt + PrintScreen будем заменять ее на запись, соответствующую PrintScreen.

Теперь необходимо проверить, есть ли PrintScreen в списке замен, и если нужно, заменить его на другую клавишу или вообще удалить из буфера (если клавиша отключена).

§   Если PrintScreen был заменен на другую клавишу, то

никакие действия над ним не производятся

§   Если PrintScreen не был заменен, то

·          Если AltPressed=1, то

запись заменяется на запись, соответствующую Alt + PrintScreen

·          Если AltPressed=1, то

запись заменяется на запись, соответствующую Alt + PrintScreen

 

2.5 Установка драйвера в системе

 

Для установки драйвера необходимо вызвать функции драйвера в определенный момент загрузки системы. Это необходимо для того, чтобы драйвер занял нужное место в стеке драйверов. Операционная система Windows осуществляет загрузку драйверов в порядке, прописанном в системном реестре.

Каждое устройство имеет свой раздел в реестре. Все эти разделы находятся в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControleSet\Control\Class. Клавиатуре соответствует раздел {4D36E96B-E325–11CE-BFC1–08002BE10318}. У каждого устройства в его разделе есть ключи UpperFilters и LowerFilters. Это ключи типа MultiString. Они содержат имена верхних и нижних драйверов-фильтров данного устройства. Драйверы-фильтры загружаются в систему в том порядке, в каком они записаны в этих ключах.

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

Для регистрации нового драйвера необходимо создать раздел с именем этого драйвера в системном реестре по адресу HKEY_LOCAL_MACHINE\SYSTEM\‌CurrentControlSet\Services. Этот раздел должен содержать следующие ключи.

§   Type типа двойное слово

Определяет тип подключаемого модуля. Для драйверов режима ядра значение всегда равно единице.

§   Start типа двойное слово

Определяет метод загрузки драйвера. Может принимать одно из следующих значений:

·        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 типа двойное слово

Определяет уровень контроля ошибок. Может принимать одно из следующих значений:

·        SERVICE_ERROR_IGNORE (0). В случае сбоя при загрузке драйвера игнорировать его и продолжить работу.

·        SERVICE_ERROR_NORMAL (1). В случае сбоя при загрузке драйвера продолжить работу, но выдать при этом соответствующее предупреждение.

·        SERVICE_ERROR_SEVERE (2). В случае сбоя при загрузке драйвера переключиться на последнюю конфигурацию, при которой работа системы происходила без ошибок.

·        SERVICE_ERROR_CRITICAL (3). Аналогично (2), но в случае повторного сбоя выдать «синий экран».

§   DisplayName типа строка ASCII

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

§   ImagePath типа строка Unicode

Полный путь к файлу с драйвером на диске. Обычно это поле устанавливается в значение % windir%\‌‌system32\‌‌Drivers\‌‍‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌D‌‌‌riverName.sys, где % windir% – папка, в которую установлена Windows, а Dr‌‌iverName – имя файла.



Информация о работе «Переопределение назначений клавиш на клавиатуре в операционной системе Windows»
Раздел: Информатика, программирование
Количество знаков с пробелами: 45280
Количество таблиц: 0
Количество изображений: 9

Похожие работы

Скачать
249178
21
46

... системам линейных алгебраических уравнений с более чем одной неизвестной; MATLAB решает такие уравнения без вычисле-ния обратной матрицы. Хотя это и не является стандартным математическим обозначением, система MATLAB использует терминологию, связанную с обычным делением в одномерном случае, для описания общего случая решения совместной системы нескольких линейных уравнений. Два символа деления / ...

Скачать
129632
2
0

... , выдачей и приёмом лицензий). В условиях крупных сетей рекомендуется выделение под сервер лицензий отдельного компьютера (или нескольких - для резервирования). 1.1 Архитектура терминальных устройств В компьютерных технологиях трёхуровневая архитектура, синоним трёхзвенная архитектура (по англ. three-tier или Multitier architecture) предполагает наличие следующих компонентов приложения: ...

Скачать
568458
20
78

... для реализации системы бюджетирования Консультационной группы "Воронов и Максимов". Статья о проблемах выбора системы бюджетирования - в проекте "УПРАВЛЕНИЕ 3000". Бюджетный автомат Если вы решитесь на автоматизацию системы бюджетирования компании, перед вами сразу встанут вопросы: что выбрать, сколько платить, как внедрять. Примеряйте! О ЧЕМ РЕЧЬ В “Капитале” на стр. 44, 45 мы рассказали ...

Скачать
176646
13
0

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

0 комментариев


Наверх