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