ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »