HalAllocateAdapterChannelV2

NTSTATUS __stdcall HalAllocateAdapterChannelV2(
        PDMA_ADAPTER DmaAdapter,
        _KDEVICE_QUEUE_ENTRY *DeviceQueueEntry,
        UINT64 a3,
        _LIST_ENTRY *a4){
  char v4; 
  char v5; 
  unsigned __int8 CurrentIrql; 
  unsigned int v8; 
  char v11; 
  _DMA_OPERATIONS *MapRegisters; 
  _DMA_OPERATIONS *DmaOperations; 
  int v15; 

  *(_DWORD *)&DeviceQueueEntry->Inserted &= ~4u;
  v4 = 0;
  v5 = 0;
  DeviceQueueEntry[1].DeviceListEntry.Flink = a4;
  CurrentIrql = 0;
  DeviceQueueEntry[1].SortKey = a3;
  v8 = a3;
  if( KeGetCurrentIrql() < 2u )
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    v5 = 1;
  }
  KeInsertDeviceQueue((_KDEVICE_QUEUE *)&DmaAdapter[11], DeviceQueueEntry);
  if( !v11 )
  {
    *(_DWORD *)&DmaAdapter[15].Version = v8;
    DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)DeviceQueueEntry;
    if( v8 && (LOBYTE(DmaAdapter[27].Version) || !*((_BYTE *)&DmaAdapter[27].Size + 3)) )
    {
      if( v8 > *(_DWORD *)&DmaAdapter[14].Version )
      {
        *(_DWORD *)&DmaAdapter[15].Version = 0;
        IoFreeAdapterChannel(DmaAdapter);
        if( v5 )
          __writecr8(CurrentIrql);
        return -1073741670;
      }
      MapRegisters = (_DMA_OPERATIONS *)HalpDmaAllocateMapRegisters((_ADAPTER_OBJECT *)DmaAdapter, v8);
      DmaAdapter[14].DmaOperations = MapRegisters;
      if( !MapRegisters )
      {
        HalpDmaQueueAdapter((_ADAPTER_OBJECT *)DmaAdapter);
        v4 = 1;
        HalpQueueMapBufferWorker((_ADAPTER_OBJECT *)DmaAdapter, v8);
      }
    }
    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;
      v15 = ((__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( v15 == 2 )
      {
LABEL_20:
        IoFreeAdapterChannel(DmaAdapter);
        goto LABEL_21;
      }
      if( v15 == 3 )
      {
        *(_DWORD *)&DmaAdapter[15].Version = 0;
        goto LABEL_20;
      }
    }
  }
LABEL_21:
  if( v5 )
    __writecr8(CurrentIrql);
  return 0;
}

Referenced by:

HalAllocateAdapterChannel