- •Лекция №5. Структура драйвера. Основные точки входа. Точка входа DriverEntry.
- •[5.1] Ограничения, налагаемые на драйвер
- •[5.2] Назначение и взаимосвязь основных объектов
- •[5.2.1] Объект-драйвер
- •[5.2.2] Объект-устройство
- •Имя устройства и символическая связь
- •[5.2.3] Объект-файл и файловые описатели (handle)
- •[5.2.4] Пакет запроса ввода/вывода (irp)
- •[5.3] Точки входа драйвера
- •[5.3.1] Контекст исполнения
- •[5.3.2] Уровень irql
- •[5.4] Точка входа DriverEntry
- •[5.4.1] Определение всех других точек входа драйвера
- •[5.4.2] Определение конфигурации аппаратного устройства, все, связанное с его инициализацией
- •[5.4.3] Запрос содержимого реестра
- •[5.4.4] Создание объекта-устройство и символической связи
[5.4.3] Запрос содержимого реестра
В соответствии с принятыми соглашениями, драйвера хранят настроечные параметры в ключе реестра \HKLM\CurrentControlSet\Services\DrvName\Parameters или …\DrvName\DeviceX\Parameters.
Наиболее простой способ запроса содержимого реестра предоставляет функция RtlQueryRegistryValues(). Имя ключа реестра \HKLM\CurrentControlSet\Services\DrvName содержится во втором параметре функции DriverEntry.
[5.4.4] Создание объекта-устройство и символической связи
Как уже говорилось, объект-устройство представляет физическое или логическое устройство, которое должно быть использовано в качестве получателя запросов ввода/вывода. Именованный объект-устройство может быть использован либо из прикладного уровня посредством вызова (Nt)CreateFile(), либо из другого драйвера посредством вызова IoGetDeviceObjectPointer().
Создается объект-устройство с помощью вызова функции IoCreateDevice().
NTSTATUS IoCreateDevice( IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceName,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,
IN BOOLEAN Exclusive,
OUT PDEVICE_OBJECT *DeviceObject);
Стоит упомянуть, что при необходимости создания нескольких именованных объектов-устройств одного типа (параметр DeviceType) стандартные драйвера NT пользуются определенным соглашением (которое не является обязательным). А именно: к фиксированному имени прибавляется номер устройства начиная с нуля. Например, COM0, COM1,… Это позволяет открывать устройства, про которые заранее не известно, существуют они или нет. Для получения следующего номера, для которого еще не создано устройство, драйвер может использовать функцию IoGetConfigurationInformation(). Эта функция возвращает указатель на структуру, содержащую число устройств текущего драйвера для каждого обнаруженного типа устройства.
Параметр “тип устройства” (DeviceType) может принимать или одно из предопределенных в ntddk.h значений, начинающихся с FILE_DEVICE_, либо значение в диапазоне 32768…65535, зарезервированном для нестандартных устройств.
Необходимо отметить, что при определении кода запроса в/в к устройству(Device i/o control code, будет рассмотрен на следующей лекции) следует использовать тот же тип устройства.
Параметр “характеристики устройства” (DeviceCharacteristics) является набором флагов и представляет интерес в основном для разработчиков стандартных типов устройств. Среди возможных значений флагов – FILE_REMOVABLE_MEDIA, FILE_READ_ONLY_DEVICE, FILE_REMOTE_DEVICE.
Параметр “эксклюзивность устройства” (Exclusive). Когда этот параметр установлен в TRUE, для устройства может быть создан единственный объект-файл. Как видно из рисунка 1, взаимосвязь различных объектов может быть довольно сложна. При этом довольно часто в драйвере необходимо представлять, от какого файлового объекта поступил запрос. Для упрощения ситуации можно разрешить использование только одного файлового объекта, т.е. в один момент времени устройство будет использоваться только из одного места.
Как уже говорилось, для открытия устройства из подсистемы Win32 для имени устройства в директории \Device в пространстве имен диспетчера объектов должна быть создана символическая связь в директории \?? или \DosDevices. Это можно сделать в драйвере с помощью функции IoCreateSymbolicLink(), либо из прикладной программы с помощью Win32-функции DefineDosDevice().
Лекция №5. Структура драйвера. Основные точки входа. Точка входа DriverEntry. 1
[5.1] Ограничения, налагаемые на драйвер 1
[5.2] Назначение и взаимосвязь основных объектов 1
[5.2.1] Объект-драйвер 2
[5.2.2] Объект-устройство 3
Имя устройства и символическая связь 3
[5.2.3] Объект-файл и файловые описатели (HANDLE) 4
[5.2.4] Пакет запроса ввода/вывода (IRP) 4
[5.3] Точки входа драйвера 5
[5.3.1] Контекст исполнения 6
[5.3.2] Уровень IRQL 7
[5.4] Точка входа DriverEntry 7
[5.4.1] Определение всех других точек входа драйвера 8
[5.4.2] Определение конфигурации аппаратного устройства, все, связанное с его инициализацией 8
[5.4.3] Запрос содержимого реестра 8
[5.4.4] Создание объекта-устройство и символической связи 9
