Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 68 стр.

UptoLike

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

68
Рисунок 3.9 – Передача вниз без функции завершения
Сценарий 3: завершение в диспетчерской функции
В этом сценарии драйвер немедленно завершает IRP, полученный извне
(рисунок 3.10). Условия для применения этого сценария:
IRP получен извне (а не создан вами),
возможна немедленная обработка IRP, как это бывает для многих
управляющих запросов ввода-вывода (IOCTL),
с пакетом IRP что-то очевидно (драйверу) не так, из чего следует
немедленный отказ.
Код диспетчерской функции может выглядеть примерно так:
NTSTATUS DispatchSomething(PDEVICE_OBJECT fdo, PIRP Irp)
{
PDEVICE_EXTENSION pdx =
(PDEVICE_EXTENSION) fdo->DeviceExtension;
//Необходимая обработка IRP
Irp->IoStatus.Status = STATUS_XXX;
Irp->IoStatus.Information = YYY;
IoSetCompletionRequest(Irp,IO_NO_INCREMENT);
return STATUS_XXX;
}
             Рисунок 3.9 – Передача вниз без функции завершения
     Сценарий 3: завершение в диспетчерской функции
     В этом сценарии драйвер немедленно завершает IRP, полученный извне
(рисунок 3.10). Условия для применения этого сценария:
     − IRP получен извне (а не создан вами),
     − возможна немедленная обработка IRP, как это бывает для многих
        управляющих запросов ввода-вывода (IOCTL),
     − с пакетом IRP что-то очевидно (драйверу) не так, из чего следует
        немедленный отказ.
     Код диспетчерской функции может выглядеть примерно так:
NTSTATUS DispatchSomething(PDEVICE_OBJECT fdo, PIRP Irp)
 {
 PDEVICE_EXTENSION pdx =
  (PDEVICE_EXTENSION) fdo->DeviceExtension;
 …         //Необходимая обработка IRP
 Irp->IoStatus.Status = STATUS_XXX;
 Irp->IoStatus.Information = YYY;
 IoSetCompletionRequest(Irp,IO_NO_INCREMENT);
 return STATUS_XXX;
 }




                                      68