ВУЗ:
Составители:
74
IO_STATUS_BLOCK iosb;
KeInitializeEvent(&event, NotificationEvent, FALSE);
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_XXX, DeviceObject,
… &event, &iosb);
или
Irp = IoBuildDeviceIoControl(IOCTL_XXX, DeviceObject,
… &event, &iosb);
status = IoCallDriver(DeviceObject, Irp);
if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode,
FALSE, NULL);
status = iosb.Status;
}
IoReleaseRemoveLock(&pdx->RemoveLock, (PVOID) 42); //A
…
}
Как и в сценарии 5, вызовы IoAcquireRemoveLock и
IoReleaseRemoveLock (комментарии А) необходимы тогда, когда устройство
назначения IRP является устройством нижнего уровня в стеке. 42 – просто
произвольный маркер.
Этот сценарий часто используется для синхронной отправки блоков
запросов USB (URB – USB Request Block). Обычно это происходит в контексте
диспетчерской функции IRP, независимо устанавливающей блокировку удаления.
Зачистка за
такими IRP не выполняется. Диспетчер ввода-вывода выполняет ее
автоматически.
Сценарий 7: синхронная передача вниз
В этом сценарии извне получен IRP. Ваш драйвер синхронно передает его
вниз по стеку и продолжает работу (рисунок 3.14). Условия для применения этого
сценария:
− IRP получен извне (а не создан вами),
− выполнение ведется на уровне PASSIVE_LEVEL
в фиксированном
потоке,
IO_STATUS_BLOCK iosb;
KeInitializeEvent(&event, NotificationEvent, FALSE);
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_XXX, DeviceObject,
… &event, &iosb);
или
Irp = IoBuildDeviceIoControl(IOCTL_XXX, DeviceObject,
… &event, &iosb);
status = IoCallDriver(DeviceObject, Irp);
if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode,
FALSE, NULL);
status = iosb.Status;
}
IoReleaseRemoveLock(&pdx->RemoveLock, (PVOID) 42); //A
…
}
Как и в сценарии 5, вызовы IoAcquireRemoveLock и
IoReleaseRemoveLock (комментарии А) необходимы тогда, когда устройство
назначения IRP является устройством нижнего уровня в стеке. 42 – просто
произвольный маркер.
Этот сценарий часто используется для синхронной отправки блоков
запросов USB (URB – USB Request Block). Обычно это происходит в контексте
диспетчерской функции IRP, независимо устанавливающей блокировку удаления.
Зачистка за такими IRP не выполняется. Диспетчер ввода-вывода выполняет ее
автоматически.
Сценарий 7: синхронная передача вниз
В этом сценарии извне получен IRP. Ваш драйвер синхронно передает его
вниз по стеку и продолжает работу (рисунок 3.14). Условия для применения этого
сценария:
− IRP получен извне (а не создан вами),
− выполнение ведется на уровне PASSIVE_LEVEL в фиксированном
потоке,
74
Страницы
- « первая
- ‹ предыдущая
- …
- 72
- 73
- 74
- 75
- 76
- …
- следующая ›
- последняя »
