HalpDmaRemoveAdapterFromChannelQueue

NTSTATUS __stdcall HalpDmaRemoveAdapterFromChannelQueue(_ADAPTER_OBJECT *ChildAdapter){
  _HALP_DMA_CONTROLLER *DmaController; 
  __int64 v3; 
  unsigned __int8 CurrentIrql; 
  _ADAPTER_OBJECT **v5; 
  char v6; 
  _ADAPTER_OBJECT *v7; 
  _ADAPTER_OBJECT **v8; 
  NTSTATUS result; 
  _DMA_OPERATIONS *DmaOperations; 

  DmaController = ChildAdapter->DmaController;
  v3 = (__int64)&DmaController->Channels[ChildAdapter->ChannelNumber];
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(DmaController->Irql);
  KxAcquireSpinLock(&ChildAdapter->DmaController->Lock);
  v5 = (_ADAPTER_OBJECT **)(v3 + 144);
  v6 = 0;
  v7 = *v5;
  if( *v5 != (_ADAPTER_OBJECT *)v5 )
  {
    while( 1 )
    {
      v8 = *(_ADAPTER_OBJECT ***)&v7->AdapterObject.DmaHeader.Version;
      if( v7 == (_ADAPTER_OBJECT *)&ChildAdapter->WaitQueueEntry[2].Blink )
        break;
      v7 = *(_ADAPTER_OBJECT **)&v7->AdapterObject.DmaHeader.Version;
      if( v8 == v5 )
        goto LABEL_4;
    }
    DmaOperations = v7->AdapterObject.DmaHeader.DmaOperations;
    if( v8[1] != v7 || *(_ADAPTER_OBJECT **)&DmaOperations->Size != v7 )
      __fastfail(3u);
    *(_QWORD *)&DmaOperations->Size = v8;
    v6 = 1;
    v8[1] = (_ADAPTER_OBJECT *)DmaOperations;
  }
LABEL_4:
  KxReleaseSpinLock(&ChildAdapter->DmaController->Lock);
  result = KiIrqlFlags;
  __writecr8(CurrentIrql);
  LOBYTE(result) = v6;
  return result;
}

Referenced by:

HalCancelAdapterChannel
HalCancelAdapterChannelThin
HalpAllocateDmaResourcesInternal