ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 75
- 76
- 77
- 78
- 79
- …
- следующая ›
- последняя »