ВУЗ:
Составители:
72
{
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;
<дополнительная инициализация>
IoSetCompletionRoutine[EX]([pdx->DeviceObject,] Irp,
(PIO_COMPLETIOM_ROUTINE)CompletiomRoutine, pdx,
TRUE, TRUE, TRUE);
ObReferenceObject(DeviceObject); //B
IoCallDriver(DeviceObject, Irp);
ObDeReferenceObject(DeviceObject); //B
}
NTSTATUS CompletionRoutine(PDEVICEOBJECT junk, PIRP Irp,
PDEVICETXTENSION PDX)
{
<зачистка IRP>
IoFreeIrp(Irp);
IoReleaseRemoveLock(&pdx->RemoveLock, (PVOID) 42); //A
return STATUS_MORE_PROCESSING_REQUIRED;
}
Вызовы IoAcquireRemoveLock и IoReleaseRemoveLock (ветвь А)
необходимы тогда, когда устройство назначения IRP является устройством
нижнего уровня в стеке. 42 – просто произвольный маркер.
Вызовы ObDeReferenceObject и ObDeReferenceObject до и после вызова
функции IoCallDriver (ветвь В) необходимы тогда, когда функция
IoGetDeviceObjectPointer использовалась для получения DeviceObject, и
{ 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; <дополнительная инициализация> IoSetCompletionRoutine[EX]([pdx->DeviceObject,] Irp, (PIO_COMPLETIOM_ROUTINE)CompletiomRoutine, pdx, TRUE, TRUE, TRUE); ObReferenceObject(DeviceObject); //B IoCallDriver(DeviceObject, Irp); ObDeReferenceObject(DeviceObject); //B } NTSTATUS CompletionRoutine(PDEVICEOBJECT junk, PIRP Irp, PDEVICETXTENSION PDX) { <зачистка IRP> IoFreeIrp(Irp); IoReleaseRemoveLock(&pdx->RemoveLock, (PVOID) 42); //A return STATUS_MORE_PROCESSING_REQUIRED; } Вызовы IoAcquireRemoveLock и IoReleaseRemoveLock (ветвь А) необходимы тогда, когда устройство назначения IRP является устройством нижнего уровня в стеке. 42 – просто произвольный маркер. Вызовы ObDeReferenceObject и ObDeReferenceObject до и после вызова функции IoCallDriver (ветвь В) необходимы тогда, когда функция IoGetDeviceObjectPointer использовалась для получения DeviceObject, и 72
Страницы
- « первая
- ‹ предыдущая
- …
- 70
- 71
- 72
- 73
- 74
- …
- следующая ›
- последняя »