HalAllocateAdapterChannelV2

__int64 __fastcall HalAllocateAdapterChannelV2(
        PDMA_ADAPTER DmaAdapter,
        PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
        unsigned int a3,
        _LIST_ENTRY *a4){
  char v4; 
  char v5; 
  unsigned __int8 CurrentIrql; 
  __int64 v11; 
  __int64 v12; 
  _DMA_OPERATIONS *MapRegisters; 
  _DMA_OPERATIONS *DmaOperations; 
  int v16; 
  *(_DWORD *)&DeviceQueueEntry->Inserted &= ~4u;
  v4 = 0;
  v5 = 0;
  DeviceQueueEntry[1].DeviceListEntry.Flink = a4;
  CurrentIrql = 0;
  DeviceQueueEntry[1].SortKey = a3;
  if( KeGetCurrentIrql() < 2u )
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    v5 = 1;
  }
  if( !KeInsertDeviceQueue((_KDEVICE_QUEUE *)&DmaAdapter[11], DeviceQueueEntry) )
  {
    *(_DWORD *)&DmaAdapter[15].Version = a3;
    DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)DeviceQueueEntry;
    if( a3 && (LOBYTE(DmaAdapter[27].Version) || !*((_BYTE *)&DmaAdapter[27].Size + 3)) )
    {
      if( a3 > *(_DWORD *)&DmaAdapter[14].Version )
      {
        *(_DWORD *)&DmaAdapter[15].Version = 0;
        IoFreeAdapterChannel(DmaAdapter);
        if( v5 )
          __writecr8(CurrentIrql);
        return 3221225626i64;
      }
      MapRegisters = (_DMA_OPERATIONS *)HalpDmaAllocateMapRegisters((__int64)DmaAdapter, a3, v11, v12);
      DmaAdapter[14].DmaOperations = MapRegisters;
      if( !MapRegisters )
      {
        HalpDmaQueueAdapter((__int64)DmaAdapter);
        v4 = 1;
        HalpQueueMapBufferWorker((__int64)DmaAdapter, a3);
      }
    }
    else
    {
      DmaAdapter[14].DmaOperations = 0i64;
      *(_DWORD *)&DmaAdapter[15].Version = 0;
    }
    if( DmaAdapter[26].DmaOperations )
      (*(void(**)(void))(DmaDispatch + 32))();
    if( !v4 )
    {
      DmaOperations = DmaAdapter[14].DmaOperations;
      DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)DeviceQueueEntry;
      v16 = ((__int64(__fastcall *)(_LIST_ENTRY *, _LIST_ENTRY *, _DMA_OPERATIONS *, _LIST_ENTRY *))a4)(
              DeviceQueueEntry[2].DeviceListEntry.Flink,
              DeviceQueueEntry[2].DeviceListEntry.Blink,
              DmaOperations,
              DeviceQueueEntry[1].DeviceListEntry.Blink);
      if( v16 == 2 )
      {
LABEL_20:
        IoFreeAdapterChannel(DmaAdapter);
        goto LABEL_21;
      }
      if( v16 == 3 )
      {
        *(_DWORD *)&DmaAdapter[15].Version = 0;
        goto LABEL_20;
      }
    }
  }
LABEL_21:
  if( v5 )
    __writecr8(CurrentIrql);
  return 0i64;
}

Referenced by:

HalAllocateAdapterChannel