ВУЗ:
Составители:
73
функция завершения освобождает полученную ссылку на объект файла или
устройства.
Ветви (А) и (В) не используются одновременно – в коде присутствует либо
одна ветвь, либо ни одной.
Сценарий 6: создание синхронных IRP
В этом сценарии драйвер создает синхронный IRP, который пересылается
другому драйверу (рисунок 3.13). Условия для применения этого сценария:
− имеется другой
драйвер, выполняющий операцию по вашему поручению,
− вы должны дождаться завершения операции для продолжения работы.
Рисунок 3.13 – Создание синхронных IRP
Ниже приведен примерный код, включаемый в драйвер. Этот код не обязан
находиться в диспетчерской функции IRP, а целевой объект устройства не обязан
быть следующим нижним объектом в стеке.
SOMETYPE SomeFunction(PDEVICE_EXTENSION pdx,
PDEVICE_OBJECT DeviceObject)
{
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock,
(PVOID) 42); //A
if (!NT_SUCCESS(status)) //A
return <состояние>; //A
PIRP Irp;
KEVENT event;
функция завершения освобождает полученную ссылку на объект файла или
устройства.
Ветви (А) и (В) не используются одновременно – в коде присутствует либо
одна ветвь, либо ни одной.
Сценарий 6: создание синхронных IRP
В этом сценарии драйвер создает синхронный IRP, который пересылается
другому драйверу (рисунок 3.13). Условия для применения этого сценария:
− имеется другой драйвер, выполняющий операцию по вашему поручению,
− вы должны дождаться завершения операции для продолжения работы.
Рисунок 3.13 – Создание синхронных IRP
Ниже приведен примерный код, включаемый в драйвер. Этот код не обязан
находиться в диспетчерской функции IRP, а целевой объект устройства не обязан
быть следующим нижним объектом в стеке.
SOMETYPE SomeFunction(PDEVICE_EXTENSION pdx,
PDEVICE_OBJECT DeviceObject)
{
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock,
(PVOID) 42); //A
if (!NT_SUCCESS(status)) //A
return <состояние>; //A
PIRP Irp;
KEVENT event;
73
Страницы
- « первая
- ‹ предыдущая
- …
- 71
- 72
- 73
- 74
- 75
- …
- следующая ›
- последняя »
