HalpDmaRemoveAdapterFromMasterQueue

NTSTATUS __stdcall HalpDmaRemoveAdapterFromMasterQueue(_ADAPTER_OBJECT *ChildAdapter){
  _HALP_DMA_MASTER_ADAPTER_OBJECT *MasterAdapter; 
  _LIST_ENTRY *p_ContiguousAdapterQueue; 
  _LIST_ENTRY *p_ScatterAdapterQueue; 
  char v5; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *WaitQueueEntry; 
  _LIST_ENTRY *v8; 
  NTSTATUS result; 
  _LIST_ENTRY *Blink; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  MasterAdapter = ChildAdapter->MasterAdapter;
  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock(&MasterAdapter->AdapterObject.SpinLock, &LockHandle);
  p_ContiguousAdapterQueue = &MasterAdapter->ContiguousAdapterQueue;
  p_ScatterAdapterQueue = &MasterAdapter->ScatterAdapterQueue;
  if( !ChildAdapter->ScatterGather )
    p_ScatterAdapterQueue = p_ContiguousAdapterQueue;
  v5 = 0;
  Flink = p_ScatterAdapterQueue->Flink;
  if( p_ScatterAdapterQueue->Flink != p_ScatterAdapterQueue )
  {
    WaitQueueEntry = ChildAdapter->WaitQueueEntry;
    while( 1 )
    {
      v8 = Flink->Flink;
      if( Flink == WaitQueueEntry )
        break;
      Flink = Flink->Flink;
      if( v8 == p_ScatterAdapterQueue )
        goto LABEL_7;
    }
    Blink = Flink->Blink;
    if( v8->Blink != Flink || Blink->Flink != Flink )
      __fastfail(3u);
    Blink->Flink = v8;
    v5 = 1;
    v8->Blink = Blink;
  }
LABEL_7:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  result = KiIrqlFlags;
  __writecr8(LockHandle.OldIrql);
  LOBYTE(result) = v5;
  return result;
}

Referenced by:

HalCancelAdapterChannel
HalCancelAdapterChannelThin
HalpAllocateDmaResourcesInternal