Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
250
Добавлен:
20.02.2016
Размер:
105.47 Кб
Скачать

[5.3.1] Контекст исполнения

Говоря о точках входа в драйвер, необходимо отметить контекст, при котором эти точки входа могут быть вызваны.

Вначале необходимо определиться с тем, что мы подразумеваем под контекстом исполнения?

Контекст исполнения определяется двумя составляющими:

  1. исполняемый в настоящее время поток (контекст планирования потока – thread scheduling context)

  2. контекст памяти процесса, которому принадлежит поток.

Текущий контекст исполнения может принадлежать одному из трех классов:

  • контекст процесса “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].

Тем не менее, один часто используемый в драйверах физических устройств момент, а именно – использование реестра – необходимо упомянуть.

Соседние файлы в папке Лабы по драйверам