IoFreeAdapterChannelV2

NTSTATUS __stdcall IoFreeAdapterChannelV2(PDMA_ADAPTER DmaAdapter){
  char v1; 
  unsigned __int8 CurrentIrql; 
  ULONG v4; 
  PVOID *p_DmaOperations; 
  _KDEVICE_QUEUE_ENTRY *v6; 
  __int64 v7; 
  __int64 v8; 
  _KDEVICE_QUEUE_ENTRY *v9; 
  unsigned int SortKey; 
  __int64 MapRegisters; 
  PVOID v12; 
  v1 = 0;
  CurrentIrql = 0;
  if( KeGetCurrentIrql() < 2u )
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    v1 = 1;
  }
  while( 1 )
  {
    v4 = *(_DWORD *)&DmaAdapter[15].Version;
    p_DmaOperations = (PVOID *)&DmaAdapter[14].DmaOperations;
    if( v4 )
      IoFreeMapRegisters(DmaAdapter, *p_DmaOperations, v4);
    v6 = KeRemoveDeviceQueue((_KDEVICE_QUEUE *)&DmaAdapter[11]);
    v9 = v6;
    if( !v6 )
      break;
    DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)v6;
    *(_DWORD *)&DmaAdapter[15].Version = v6[1].SortKey;
    SortKey = v6[1].SortKey;
    if( SortKey && DmaAdapter[9].DmaOperations )
    {
      MapRegisters = HalpDmaAllocateMapRegisters((__int64)DmaAdapter, SortKey, v7, v8);
      *p_DmaOperations = (PVOID)MapRegisters;
      if( !MapRegisters )
      {
        HalpDmaQueueAdapter((__int64)DmaAdapter);
        HalpQueueMapBufferWorker((__int64)DmaAdapter, v9[1].SortKey);
        break;
      }
    }
    else
    {
      DmaAdapter[14].DmaOperations = 0i64;
      *(_DWORD *)&DmaAdapter[15].Version = 0;
    }
    v12 = *p_DmaOperations;
    DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)v9;
    LODWORD(v6) = ((__int64(__fastcall *)(_LIST_ENTRY *, _LIST_ENTRY *, PVOID, _LIST_ENTRY *))v9[1].DeviceListEntry.Flink)(
                    v9[2].DeviceListEntry.Flink,
                    v9[2].DeviceListEntry.Blink,
                    v12,
                    v9[1].DeviceListEntry.Blink);
    if( (_DWORD)v6 == 1 )
      break;
    if( (_DWORD)v6 == 3 )
      *(_DWORD *)&DmaAdapter[15].Version = 0;
  }
  if( v1 )
  {
    LODWORD(v6) = CurrentIrql;
    __writecr8(CurrentIrql);
  }
  return(int)v6;
}

Referenced by:

IoFreeAdapterChannel