HalpAllocateDmaChannels

NTSTATUS __stdcall HalpAllocateDmaChannels(_ADAPTER_OBJECT *ChildAdapter){
  _HALP_DMA_CONTROLLER *DmaController; 
  __int64 v3; 
  unsigned __int8 CurrentIrql; 
  UINT64 *p_Lock; 
  NTSTATUS result; 
  _LIST_ENTRY *v7; 
  _LIST_ENTRY **p_Blink; 
  _LIST_ENTRY *Blink; 

  DmaController = ChildAdapter->DmaController;
  v3 = (__int64)&DmaController->Channels[ChildAdapter->ChannelNumber];
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(DmaController->Irql);
  p_Lock = &DmaController->Lock;
  KxAcquireSpinLock(p_Lock);
  if( *(_BYTE *)(v3 + 5) )
  {
    if( (ChildAdapter->CurrentWcb->_bf_14 & 1) == 0 )
    {
      v7 = (_LIST_ENTRY *)(v3 + 144);
      p_Blink = &ChildAdapter->WaitQueueEntry[2].Blink;
      Blink = v7->Blink;
      if( Blink->Flink != v7 )
        __fastfail(3u);
      *p_Blink = v7;
      p_Blink[1] = Blink;
      Blink->Flink = (_LIST_ENTRY *)p_Blink;
      v7->Blink = (_LIST_ENTRY *)p_Blink;
    }
    KxReleaseSpinLock(p_Lock);
    result = CurrentIrql;
    __writecr8(CurrentIrql);
    LOBYTE(result) = 0;
  }
  else
  {
    *(_BYTE *)(v3 + 5) = 1;
    ChildAdapter->AllocatedChannelCount = 1;
    *(_QWORD *)(v3 + 24) = ChildAdapter;
    KxReleaseSpinLock(p_Lock);
    result = KiIrqlFlags;
    __writecr8(CurrentIrql);
    LOBYTE(result) = 1;
  }
  return result;
}

Referenced by:

HalpAllocateDmaResourcesInternal