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

UptoLike

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

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