Рабочие процедуры драйвера
Все функции, опубликованные в процедуре DriverEntry путем заполнения массива DriverObject->MajorFunction [...], вызываются Диспетчером ввода/вывода для обработки соответствующих запросов от клиентов драйвера (приложений пользовательского режима или от модулей режима ядра). Запросы эти всегда оформлены в виде специальных структур данных — пакетов 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 — запрос обработан o STATUS_PENDING — ожидается обработка запроса o STATUS_XXX — код ошибки |