Курсовая работа: Переопределение назначений клавиш на клавиатуре в операционной системе Windows
- Функции для обработки пакетов IRP
- ISR
DiverEntry
Процедура DiverEntry должна присутствовать в любом драйвере. На данную процедуру возложена функция начальной инициализации и определение остальных точек входа в драйвер. Она выполняется в момент загрузки драйвера. В драйверах WDM значение этой функции значительно уменьшилось, большая часть работы возлагается на функцию AddDevice. Для регистрации точек входа в драйвер DriverEntry должна заполнить соответствующие поля в структуре объекта драйвера. Указатель на эту структуру передается в функцию.
Поле DriverUnload необходимо заполнить адресом процедуры, вызывающейся при выгрузке драйвера.
Поле DriverExtension->AddDevice необходимо заполнить адресом процедуры AddDevice.
Массив MajorFunctions заполняется адресами процедур обработки IRP пакетов. Процедура, зарегистрированная под номером N, обрабатывает IRP пакет с кодом N. Обычно драйверы используют не все эти процедуры, а регистрируют только нужные. Остальные же элементы массива заполняются адресом процедуры, выполняющей передачу пакета ниже по стеку драйверов.
AddDevice
Данная функция регистрируется, если драйвер поддерживает PnP. Одна из главных обязанностей AddDevice – это создание объекта устройства FDO и если необходимо подключение его к стеку драйверов устройства. Данная функция может создать несколько объектов устройств и подключить их к разным стекам. Более того, некоторые устройства FDO могут существовать, не будучи в связке с PDO. Они часто содаются для управления драйвером.
DriverUnload
Процедура DriverUnload необходима для того, чтобы сделать драйвер выгружаемым. В драйверах «в стиле NT» на эту процедуру возложен весь процесс выгрузки. Она обязана удалить все символьные ссылки, все объекты устройств, отключить (если нужно) прерывания от объектов, очистить память за собой. В PnP драйверах все эти действия возложены на обработчик пакетов IRP_MJ_PNP.
Процедуры обработки пакетов IRP
Функции, адреса которых записаны в массиве MajorFunctions, вызываются диспетчером ввода / вывода для обработки соответствующих запросов от клиентского драйвера (пользовательских приложений или модулей уровня ядра). Эти запросы оформляются в виде специальных структур – IRP пакетов.
При любом запросе Диспетчер формирует IRP. память для структуры IRP выделяется в нестраничной памяти. В IRP записывается код операции ввода вывода. Пакет IRP состоит из заголовка, который имеет постоянный размер и стека IRP. Стек имеет переменную длину.
Заголовок IRP пакета:
- Поле IoStatus типа IO _ STATUS _ BLOCK содержит два подполя
- Status содержит значение, которое устанавливает драйвер после обработки пакета.
- В Information чаще всего помещается число переданных или полученных байт.
- Поле AssociatedIrp . SystemBuffer типа void * содержит указатель на системный буфер для случая если устройство поддерживает буферизованный ввод / вывод.
- Поле MdlAddress типа PMDL содержит указатель на MDL список, если устройство поддерживает прямой ввод вывод.
- Поле UserBuffer типа void * содержит адрес пользовательского буфера для ввода / вывода.
- Типа Cancel типа BOOLEAN– это индикатор того, что пакет IRP должен быть аннулирован.
Стек IRP пакета
Основное значение ячеек стека IRP пакета состоит в том, чтобы хранить функциональный код и параметры запроса на ввод / вывод. Для запроса, который адресован драйверу самого нижнего уровня, соответствующий IRP пакет имеет только одну ячейку стека. Для запроса, который послан драйверу верхнего уровня, Диспетчер ввода / вывода создает пакет IRP с несколькими стековыми ячейками – по одной для каждого FDO.
Каждая ячейка стека IRP содержит:
- MajorFunction типа UCHAR – это код, описывающий назначение операции
- MinorFunction типа UCHAR – это код, описывающий суб-код операции
- DeviceObject типа PDEVICE _ OBJECT – это указатель на объект устройства, которому был адресован данный запрос IRP