ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 65
- 66
- 67
- 68
- 69
- …
- следующая ›
- последняя »
