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

UptoLike

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

67
PDEVICE_EXTENSION pdx)
{
if (Irp->PendingReturned)
IoMarkIrpPending(Irp);
//Необходимая постобработка
IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
return STATUS_SUCCESS;
}
Сценарий 2: передача вниз без функции завершения
IRP, направленный вашему драйверу, перенаправляется драйверу низшего
уровня в стеке PnP, при этом далее с IRP ничего делать не надо (рисунок 3.9).
Для применения этой стратегии необходимы два условия:
IRP получен извне (а не создан вами),
ваш драйвер не обрабатывает IRP, но, возможно, это захочет
сделать
драйвер низшего уровня.
Этот сценарий часто применяется в фильтрующих драйверах, которые
просто передают все IRP, не представляющие интереса для данного драйвера.
Код функции, реализующей эту стратегию, может выглядеть примерно так:
NTSTATUS ForwardAndForget(PDEVICE_EXTENSION pdx, PIRP Irp)
{
PDEVICE_EXTENSION pdx =
(PDEVICE_EXTENSION) fdo->DeviceExtension;
NTSTATUS status = IoAcqureRemoveLock(&pdx->RemoveLock, Irp);
if (!NT_SUCCESS(status))
return CompleteRequest(Irp, status);
IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(pdx->LowerDeviceObject Irp);
IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
return status;
}
 PDEVICE_EXTENSION pdx)
 {
 if (Irp->PendingReturned)
  IoMarkIrpPending(Irp);
 …   //Необходимая постобработка
 IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
 return STATUS_SUCCESS;
 }
     Сценарий 2: передача вниз без функции завершения
     IRP, направленный вашему драйверу, перенаправляется драйверу низшего
уровня в стеке PnP, при этом далее с IRP ничего делать не надо (рисунок 3.9).
     Для применения этой стратегии необходимы два условия:
     − IRP получен извне (а не создан вами),
     − ваш драйвер не обрабатывает IRP, но, возможно, это захочет сделать
        драйвер низшего уровня.
     Этот сценарий часто применяется в фильтрующих драйверах, которые
просто передают все IRP, не представляющие интереса для данного драйвера.
     Код функции, реализующей эту стратегию, может выглядеть примерно так:
NTSTATUS ForwardAndForget(PDEVICE_EXTENSION pdx, PIRP Irp)
 {
 PDEVICE_EXTENSION pdx =
  (PDEVICE_EXTENSION) fdo->DeviceExtension;
 NTSTATUS status = IoAcqureRemoveLock(&pdx->RemoveLock, Irp);
 if (!NT_SUCCESS(status))
  return CompleteRequest(Irp, status);
 IoSkipCurrentIrpStackLocation(Irp);
 status = IoCallDriver(pdx->LowerDeviceObject Irp);
 IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
 return status;
 }




                                       67