Программирование драйверов Windows

       

Рабочие процедуры драйвера


Все функции, опубликованные в процедуре DriverEntry путем заполнения массива DriverObject-&#62MajorFunction [...], вызываются Диспетчером ввода/вывода для обработки соответствующих запросов от клиентов драйвера (приложений пользовательского режима или от модулей режима ядра). Запросы эти всегда оформлены в виде специальных структур данных &#8212 пакетов IRP.


Диспетчер ввода/вывода заполняет пропущенные места в массиве MajorFunction значением указателя на функцию _IoInvalidDeviceRequest прежде, чем обращается к процедуре DriverEntry.

Все функции драйвера, участвующие в обработке запросов и подлежащие занесению в таблицу (массив) MajorFunction используют один и тот же протокол вызовов, что включает число и тип передаваемых им параметров и тип вызова. Рабочие процедуры выполняются на PASSIVE_LEVEL уровне IRQL, что означает, что они могут обращаться к ресурсам страничной памяти. (Разумеется, возможны ситуации искусственного изменения этого правила, как это было показано в примере Example.sys главы 3.)

Таблица 8.7а. Прототип, описывающий рабочую (dispatch) процедуру драйвера

NTSTATUS DispatchRoutine IRQL == PASSIVE_LEVEL
Параметры Описание
IN PDEVICE_OBJECT pDevObject Указатель на объект устройства, для которого предназначается IRP запрос
IN PRIP pIrp Указатель на пакет IRP, описывающий этот запрос
Возвращаемое значение o STATUS_SUCCESS &#8212 запрос обработан o STATUS_PENDING &#8212 ожидается обработка запроса o STATUS_XXX &#8212 код ошибки

Содержание раздела