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