Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 73 стр.

UptoLike

Составители: 

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