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

UptoLike

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

77
{
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock,
(PVOID) 42); //A
if (!NT_SUCCESS(status)) //A
return <состояние>; //A
PIRP Irp;
Irp = IoBuildAsynchronousFsdRequest(IRP_MJ_XXX, DeviceObject,
…);
или
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp);
Stack->MajorFunction = IPR_MJ_XXX;
<дополнительная инициализация>
KEVENT event;
KeInitializeEvent(&event, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine[EX]([pdx->DeviceObject,] Irp,
(PIO_COMPLETIOM_ROUTINE)CompletiomRoutine, &event,
TRUE, TRUE, TRUE);
status = IoCallDriver(DeviceObject, Irp);
if (status == STATUS_PENDING)
KeWaitForSingleObject(&event, Executive, KernelMode,
FALSE, NULL);
IoReleaseRemoveLock(&pdx->RemoveLock, (PVOID) 42); //A
}
NTSTATUS CompletionRoutine(PDEVICE_OBJECT junk, PIRP Irp,
PKEVENT pev)
if (Irp->PendingReturned)
KeSetEvent(pev,EVENT_INCREMENT, FALSE);
<зачистка IRP – см. выше>
IoFreeIrp(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
Фрагменты, отличающиеся от сценария 5, выделены жирным шрифтом.
Здесь, как и в предыдущих сценариях, вызовы IoAcquireRemoveLock и
{
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock,
 (PVOID) 42);                                                //A
if (!NT_SUCCESS(status))                                     //A
 return <состояние>;                                         //A
PIRP Irp;
Irp = IoBuildAsynchronousFsdRequest(IRP_MJ_XXX, DeviceObject,
 …);
     или
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp);
Stack->MajorFunction = IPR_MJ_XXX;
<дополнительная инициализация>
KEVENT event;
KeInitializeEvent(&event, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine[EX]([pdx->DeviceObject,] Irp,
 (PIO_COMPLETIOM_ROUTINE)CompletiomRoutine, &event,
 TRUE, TRUE, TRUE);
status = IoCallDriver(DeviceObject, Irp);
if (status == STATUS_PENDING)
 KeWaitForSingleObject(&event, Executive, KernelMode,
    FALSE, NULL);
IoReleaseRemoveLock(&pdx->RemoveLock, (PVOID) 42);           //A
}
NTSTATUS CompletionRoutine(PDEVICE_OBJECT junk, PIRP Irp,
 PKEVENT pev)
 if (Irp->PendingReturned)
 KeSetEvent(pev,EVENT_INCREMENT, FALSE);
<зачистка IRP – см. выше>
IoFreeIrp(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
     Фрагменты, отличающиеся от сценария 5, выделены жирным шрифтом.
Здесь, как и в предыдущих сценариях, вызовы IoAcquireRemoveLock и

                                 77