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

UptoLike

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

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