HalpFreeDmaChannels

NTSTATUS __fastcall HalpFreeDmaChannels(__int64 a1){
  __int64 v1; 
  __int64 v2; 
  unsigned __int8 CurrentIrql; 
  UINT64 *v4; 
  _QWORD *v5; 
  _QWORD *v6; 
  __int64 v7; 
  struct _DMA_ADAPTER *v8; 
  NTSTATUS result; 
  v1 = *(_QWORD *)(a1 + 360);
  v2 = *(_QWORD *)(v1 + 56) + 160i64 * *(unsigned int *)(a1 + 372);
  *(_DWORD *)(a1 + 384) = 0;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(*(unsigned __int8 *)(v1 + 176));
  v4 = (UINT64 *)(v1 + 168);
  KxAcquireSpinLock(v4);
  v5 = (_QWORD *)(v2 + 144);
  v6 = *(_QWORD **)(v2 + 144);
  if( v6 == (_QWORD *)(v2 + 144) )
  {
    *(_WORD *)(v2 + 5) = 0;
    *(_QWORD *)(v2 + 24) = 0i64;
    KxReleaseSpinLock(v4);
    result = CurrentIrql;
    __writecr8(CurrentIrql);
  }
  else
  {
    v7 = *v6;
    if( (_QWORD *)v6[1] != v5 || *(_QWORD **)(v7 + 8) != v6 )
      __fastfail(3u);
    *v5 = v7;
    v8 = (struct _DMA_ADAPTER *)(v6 - 25);
    *(_QWORD *)(v7 + 8) = v5;
    ++*((_DWORD *)v6 + 104);
    *((_DWORD *)v6 + 46) = 1;
    *(_QWORD *)(v2 + 24) = v6 - 25;
    KxReleaseSpinLock(v4);
    __writecr8(CurrentIrql);
    return HalpAllocateDmaResources(v8);
  }
  return result;
}

Referenced by:

IoFreeAdapterChannelV3Internal