Организация ввода-вывода. Часть 2. Драйверы для WINDOWS NT. Рощин А.В. - 94 стр.

UptoLike

Составители: 

94
3.1 Стандартные процедуры
Любой драйвер должен реализовывать основное множество
процедур и, возможно, еще несколько дополнительных подмножеств в
зависимости от разновидности драйвера. На рисунке 3.1 показан
стандартный цикл работы драйвера, заключающийся в обработке запроса
на прерывание IRP.
Ниже показаны основные процедуры, которые должен иметь каждый
драйвер.
DriverEntry
NTSTATUS
(*PDRIVER_INITIALIZE) (
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
Каждый драйвер должен иметь инициализационную процедуру,
которую менеджер ввода-вывода вызывает автоматически, если эта
процедура называется DriverEntry.
Dispatch
NTSTATUS
(*PDRIVER_DISPATCH) (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
Каждый драйвер должен иметь, по крайней мере, одну процедуру
Dispatch.
StartIo (или Queue-management)
VOID
(*PDRIVER_STARTIO) (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
Если драйвер устройства не может завершить все возможные
запросы ввода-вывода в его Dispatch процедуре, он должен иметь либо
процедуру StartIo, либо заводить одну или более внутренних очередей и
управлять собственным механизмом отложенных запросов на прерывание.
      3.1 Стандартные процедуры
      Любой      драйвер     должен     реализовывать   основное   множество
процедур и, возможно, еще несколько дополнительных подмножеств в
зависимости от разновидности драйвера. На рисунке 3.1 показан
стандартный цикл работы драйвера, заключающийся в обработке запроса
на прерывание IRP.
      Ниже показаны основные процедуры, которые должен иметь каждый
драйвер.
DriverEntry
       NTSTATUS
       (*PDRIVER_INITIALIZE) (
            IN PDRIVER_OBJECT DriverObject,
            IN PUNICODE_STRING RegistryPath
            );
      Каждый драйвер должен иметь инициализационную процедуру,
которую менеджер ввода-вывода вызывает автоматически, если эта
процедура называется DriverEntry.
Dispatch
       NTSTATUS
       (*PDRIVER_DISPATCH) (
           IN PDEVICE_OBJECT DeviceObject,
           IN PIRP Irp
           );
      Каждый драйвер должен иметь, по крайней мере, одну процедуру
Dispatch.
StartIo (или Queue-management)
         VOID
         (*PDRIVER_STARTIO) (
              IN PDEVICE_OBJECT DeviceObject,
              IN PIRP Irp
              );
      Если драйвер устройства не может завершить все возможные
запросы ввода-вывода в его Dispatch процедуре, он должен иметь либо
процедуру StartIo, либо заводить одну или более внутренних очередей и
управлять собственным механизмом отложенных запросов на прерывание.




                                         94