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

UptoLike

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

71
Irp->IoStatus.Information = YYY;
IoRequestDpc(pdx->DeviceObject, NULL, pdx);
}
VOID DpcForIsr(PKDPC junk1, PDEVICE_OBJECT fdo, PIRP junk2,
PDEVICE_EXTENSION pdx)
{
PIRP Irp = GetCurrentIrp(&pdx->dqReadWrite);
StartNextPacket(&pdx->dqReadWrite, fdo);
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
Сценарий 5: создание асинхронных IRP
В этом сценарии драйвер создает асинхронный IRP, который пересылается
другому драйверу (рисунок 3.12). Условия для применения этого сценария:
имеется другой драйвер, выполняющий операцию по вашему поручению,
выполнение ведется либо в контексте произвольного потока (в котором
блокировка нежелательна), либо на уровне DISPATCH_LEVEL (на
котором блокировка невозможна).
Рисунок 3.12 – Создание асинхронных IRP
Ниже приведен примерный код, включаемый в драйвер. Этот код не обязан
находиться в диспетчерской функции IRP, а целевой объект устройства не обязан
быть следующим нижним объектом в стеке.
SOMETYPE SomeFunction(PDEVICE_EXTENSION pdx,
PDEVICE_OBJECT DeviceObject)
 Irp->IoStatus.Information = YYY;
 IoRequestDpc(pdx->DeviceObject, NULL, pdx);
 …
 }
VOID DpcForIsr(PKDPC junk1, PDEVICE_OBJECT fdo, PIRP junk2,
 PDEVICE_EXTENSION pdx)
 {
 …
 PIRP Irp = GetCurrentIrp(&pdx->dqReadWrite);
 StartNextPacket(&pdx->dqReadWrite, fdo);
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 }
     Сценарий 5: создание асинхронных IRP
     В этом сценарии драйвер создает асинхронный IRP, который пересылается
другому драйверу (рисунок 3.12). Условия для применения этого сценария:
     − имеется другой драйвер, выполняющий операцию по вашему поручению,
     − выполнение ведется либо в контексте произвольного потока (в котором
        блокировка нежелательна), либо на уровне DISPATCH_LEVEL (на
        котором блокировка невозможна).




                  Рисунок 3.12 – Создание асинхронных IRP
     Ниже приведен примерный код, включаемый в драйвер. Этот код не обязан
находиться в диспетчерской функции IRP, а целевой объект устройства не обязан
быть следующим нижним объектом в стеке.
SOMETYPE SomeFunction(PDEVICE_EXTENSION pdx,
 PDEVICE_OBJECT DeviceObject)
                                     71