- •Лекция №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.3.1] Контекст исполнения
Говоря о точках входа в драйвер, необходимо отметить контекст, при котором эти точки входа могут быть вызваны.
Вначале необходимо определиться с тем, что мы подразумеваем под контекстом исполнения?
Контекст исполнения определяется двумя составляющими:
исполняемый в настоящее время поток (контекст планирования потока – thread scheduling context)
контекст памяти процесса, которому принадлежит поток.
Текущий контекст исполнения может принадлежать одному из трех классов:
контекст процесса “System” (далее - системный контекст)
контекст конкретного потока и процесса
контекст случайного потока и процесса (далее – случайный контекст)
Различные точки входа в драйвер могут вызываться в контексте, принадлежащем одному из этих классов.
DriverEntry всегда вызывается в системном контексте.
Диспетчерские функции для драйверов верхнего уровня (т.е. получающих запрос от прикладных программ) вызываются в контексте инициирующего запрос потока.
Диспетчерские функции драйверов остальных уровней, получающие запрос от драйвера верхнего уровня, вызываются в случайном контексте.
Все точки входа, связанные с сериализацией запросов в/в или с обработкой прерываний и DPC, вызываются в случайном контексте.
[5.3.2] Уровень irql
DriverEntry всегда вызывается на IRQL=PASSIVE_LEVEL.
Диспетчерские точки входа вызываются на IRQL=PASSIVE_LEVEL или APC_LEVEL.
Вызов отложенных процедур – DISPATCH_LEVEL
Функции обработки прерываний – один из DIRQL.
Практически все последующие разделы этой и следующих лекций будут посвящены описанию различных точек входа драйвера.
[5.4] Точка входа DriverEntry
Диспетчер в/в вызывает точку входа DriverEntry при загрузке драйвера. В NT может существовать только один экземпляр драйвера, вне зависимости от числа физических устройств, контролируемых им. Таким образом, DriverEntry вызывается только один раз, на уровне IRQL=PASSIVE_LEVEL в системном контексте.
Прототип DriverEntry:
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath);
где DriverObject – указатель на объект-драйвер, соответствующий загружаемому драйверу
RegistryPath – указатель на строку в формате Unicode с именем ключа реестра, соответствующего загружаемому драйверу.
Возвращаемое значение имеет тип NTSTATUS. Если возвращается успешный статус завершения, диспетчер в/в немедленно позволяет производить обработку запросов к объектам-устройствам, созданным драйвером. Во всех остальных случаях драйвер не загружается в память и запросы к нему не передаются.
В функции DriverEntry обычно происходит:
определение всех других точек входа драйвера (их перечень см. в предыдущем разделе)
определение конфигурации аппаратного устройства, все, связанное с его инициализацией
создание одного или нескольких объектов-устройств
[5.4.1] Определение всех других точек входа драйвера
Описывать в этом разделе задание всех возможных точек входа бессмысленно. Эта информация будет описана на протяжении примерно 7 последующих лекций.
[5.4.2] Определение конфигурации аппаратного устройства, все, связанное с его инициализацией
В данном курсе делается упор на создание служебных драйверов, не управляющих физическими устройствами. Поэтому довольно обширную тему, связанную с подготовкой драйвера к использованию аппаратного устройства мы пропустим. Интересующихся отсылаю к [Device Driver Development, chapter 13. Driver Entry].
Тем не менее, один часто используемый в драйверах физических устройств момент, а именно – использование реестра – необходимо упомянуть.
