IoFreeAdapterChannelV2

VOID __fastcall IoFreeAdapterChannelV2(PDMA_ADAPTER DmaAdapter){
  char v1; 
  unsigned __int8 CurrentIrql; 
  ULONG v4; 
  PVOID *p_DmaOperations; 
  _KDEVICE_QUEUE_ENTRY *v6; 
  _KDEVICE_QUEUE_ENTRY *v7; 
  UINT64 SortKey; 
  _HALP_DMA_TRANSLATION_ENTRY *MapRegisters; 
  PVOID v10; 
  int v11; 

  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]);
    v7 = v6;
    if( !v6 )
      break;
    DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)v6;
    *(_DWORD *)&DmaAdapter[15].Version = v6[1].SortKey;
    SortKey = v6[1].SortKey;
    if( (_DWORD)SortKey && DmaAdapter[9].DmaOperations )
    {
      MapRegisters = HalpDmaAllocateMapRegisters((_ADAPTER_OBJECT *)DmaAdapter, SortKey);
      *p_DmaOperations = MapRegisters;
      if( !MapRegisters )
      {
        HalpDmaQueueAdapter((_ADAPTER_OBJECT *)DmaAdapter);
        HalpQueueMapBufferWorker((_ADAPTER_OBJECT *)DmaAdapter, v7[1].SortKey);
        break;
      }
    }
    else
    {
      DmaAdapter[14].DmaOperations = 0i64;
      *(_DWORD *)&DmaAdapter[15].Version = 0;
    }
    v10 = *p_DmaOperations;
    DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)v7;
    v11 = ((__int64(__fastcall *)(_LIST_ENTRY *, _LIST_ENTRY *, PVOID, _LIST_ENTRY *))v7[1].DeviceListEntry.Flink)(
            v7[2].DeviceListEntry.Flink,
            v7[2].DeviceListEntry.Blink,
            v10,
            v7[1].DeviceListEntry.Blink);
    if( v11 == 1 )
      break;
    if( v11 == 3 )
      *(_DWORD *)&DmaAdapter[15].Version = 0;
  }
  if( v1 )
    __writecr8(CurrentIrql);
}

Referenced by:

IoFreeAdapterChannel