Курсовая работа: Переопределение назначений клавиш на клавиатуре в операционной системе Windows
- Драйвер должен быть драйвером PnP.
- Драйвер-фильтр не должен тормозить ввод с клавиатуры и работу всей системы в целом. Драйвер-фильтр должен обеспечить надежную работу системы.
2. Конструкторский раздел
2.1 Точки входа разрабатываемого драйвера-фильтра
Поскольку разрабатываемый драйвер-фильтр является драйвером PnP, то должен иметь следующие точки входа:
- DriverEntry
- DriverUnload
- AddDevice
- Функции для обработки пакетов IRP
Функции для обработки прерываний в данной работе не регистрируются, поскольку драйвер не работает с прерываниями.
DiverEntry
В данной работе процедура DriverEntry выполняет следующие действия:
· Заполнение массива MajorFunctions. Регистрируется процедура обработки пакета на чтение, процедура обработки IOCTL запросов, процедуры обработки запросов от менеджера PnP и менеджера питания. Остальные элементы массива заполняются адресом функции MyPassNext, которая пропускает пакеты ниже по стеку.
· Регистрация процедуры AddDevice. В данной работе она называется MyAddDevice.
· Регистрация процедуры DriverUnload, называющейся MyUnload.
· Выделение памяти для хранения массива замен клавиш. Одна запись массива занимает 4 байта, а максимум может быть только 103 замены (клавиша Pause/Break не в счет). Значит максимальный объем массива равен 412 байт. DriverEntry сразу выделяет при загрузке эти 412 байт. Не имеет смысла экономить и выделять память динамически при каждой инициализации массива, поскольку 412 – это очень мало, и система не будет тратить время на освобождение и выделение памяти при каждой инициализации.
· Инициализация некоторых глобальных переменных: AltPressed, CtrlPressed, KeyPause.
DriverEntry регистрирует только необходимые процедуры. Поскольку проект представляет собой драйвер-фильтр верхнего уровня, и в нем нет необходимости обрабатывать прерывания, то не производится регистрация DriverStartIo, процедур ISR и DPC.
AddDevice
В данной работе функция MyAddDevice создает одно функциональное устройство с именем \\Device\\MyFilter . При создании устройства происходит резервирования места для хранения адреса устройства, расположенного ниже в стеке драйверов. Это сделано для того, чтобы при разрушении стека драйверов передать запрос PnP на демонтаж нижестоящему драйверу. Созданное устройство подключается к стеку драйверов клавиатуры. Это делается с помощью функции IoAttachDeviceToDeviceStack. Это стандартная функция Windows, она принимает PDO и указатель на структуру подключаемого FDO. FDO занимает место в стеке драйверов сразу после объекта, находящегося в вершине стека. Теперь подключаемый FDO становится вершиной стека. Нельзя подключится к стеку когда он уже сформирован, поэтому необходимо подключится к нему в определенный момент. Очередность загрузки драйверов описана в реестре Windows. Программа установки производит необходимую регистрацию. Структура этой программы описана ниже.
Для того чтобы пользовательское приложение смогло обратиться к драйверу (для загрузки в драйвер списка замен или для получения списка замен, которые драйвер осуществляет в данный момент) для FDO должно быть зарегистрировано DOS имя. Используя это имя приложение сможет послать драйверу IOCTL запрос. Для регистрации такого имени создается строка юникод со значением \\DosDevices\\MyFilter и применяется функция IoCreateSymbolicLink. Ее параметрами является только что созданная строка и имя FDO, которое обслуживает наш драйвер. Теперь \\DosDevices\\MyFilter – это DOS имя созданного FDO устройства.
DriverUnload
Поскольку данный фильтр является PnP драйвером, то на процедуру DriverUnload ничего не возложено.
Процедуры обработки пакетов IRP
Разрабатываемый драйвер-фильтр осуществляет обработку следующих пакетов IRP:
- IRP _ MJ _ DEVICE _ CONTROL
- IRP _ MJ _ READ
- IRP _ MJ _ PNP
Остальные IRP пакеты пропускаются ниже по стеку драйверов.