HalpDmaCommitContiguousMapBuffers

_HALP_DMA_TRANSLATION_ENTRY *__fastcall HalpDmaCommitContiguousMapBuffers(
        __int64 a1,
        __int64 a2,
        unsigned __int64 a3,
        unsigned int a4){
  __int64 v4; 
  __int64 v6; 
  UINT64 v8; 
  _HALP_DMA_TRANSLATION_ENTRY *result; 
  _HALP_DMA_TRANSLATION_ENTRY *v10; 
  __int64 *v11; 
  _QWORD *v12; 
  char v13; 
  INT64 v14; 
  ULONG v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  bool v20; 
  __int64 *v21; 
  char v22; 
  ULONG StartingIndex; 
  __int64 *v24; 
  __int64 v25; 
  _HALP_DMA_TRANSLATION_ENTRY *v26; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  char v28; 
  v4 = a4;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v6 = *(_QWORD *)(a1 + 40);
  v24 = 0i64;
  v8 = a4;
  if( v6 && (*(_QWORD *)(a1 + 56) != v6 || *(_DWORD *)(a1 + 64)) )
  {
    v8 = a4 + 1;
    v28 = 1;
  }
  else
  {
    v28 = 0;
  }
  if( !*(_BYTE *)(a1 + 145) )
    v8 = (unsigned int)((((unsigned __int64)a4 << 12) + a3 - 1) >> 16) - (unsigned int)(a3 >> 16) + (unsigned int)v8;
  result = HalpDmaGetTranslationEntries((_HALP_DMA_ADAPTER_OBJECT *)a1, HalpDmaContiguousMapBuffer, v8);
  v26 = result;
  v10 = result;
  if( result )
  {
    StartingIndex = HalpDmaTranslationEntryToIndex(a1, (unsigned __int64)result, &v24);
    if( (unsigned int)(((__int64)v10 - v24[2]) / 72) )
    {
      v12 = (_QWORD *)((char *)v10 - 72);
    }
    else
    {
      v11 = *(__int64 **)(a1 + 40);
      if( v11 == v24 )
      {
        v12 = 0i64;
      }
      else
      {
        if( v11 )
        {
          do
          {
            v21 = (__int64 *)*v11;
            if( (__int64 *)*v11 == v24 )
              break;
            v11 = (__int64 *)*v11;
          }
          while( v21 );
        }
        v12 = (_QWORD *)(v11[2] + 72i64 * (unsigned int)(*((_DWORD *)v11 + 2) - 1));
      }
    }
    v13 = *(_BYTE *)(a1 + 144);
    v14 = (INT64)v10;
    v22 = *(_BYTE *)(a1 + 145);
    KeAcquireInStackQueuedSpinLock((UINT64 *)(a1 + 120), &LockHandle);
    if( (_DWORD)v4 )
    {
      v15 = StartingIndex;
      v16 = v13 & 1;
      v25 = v4;
      v17 = a2;
      v18 = 4 * v16;
      do
      {
        if( v12 )
        {
          if( *v12 + 4096i64 != a3 || !v22 && ((a3 ^ *v12) & 0xFFFFFFFFFFFF0000ui64) != 0 )
          {
            v14 = *(_QWORD *)(v14 + 8);
            ++v15;
          }
          v18 = 4 * v16;
        }
        *(_QWORD *)v14 = a3;
        if( v17 )
        {
          v19 = v17 | *(_DWORD *)(v14 + 48) & 0xFFF;
          v17 += 4096i64;
        }
        else
        {
          v19 = *(_QWORD *)(v14 + 48);
        }
        *(_QWORD *)(v14 + 48) = v19 & 0xFFFFFFFFFFFFFFF0ui64 | v13 & 1 | v18 & 0xFFFFFFFFFFFFFFF7ui64;
        RtlClearBits(*(RTL_BITMAP **)(a1 + 16), v15, 1ui64);
        a3 += 4096i64;
        v18 = 4 * v16;
        ++v15;
        v12 = (_QWORD *)v14;
        v20 = v25-- == 1;
        v14 = *(_QWORD *)(v14 + 8);
      }
      while( !v20 );
      LODWORD(v4) = a4;
      v10 = v26;
    }
    if( v28 && v14 )
    {
      --*(_DWORD *)(a1 + 64);
      memset(v14, 0i64);
    }
    if( v13 )
      *(_DWORD *)(a1 + 200) += v4;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    return v10;
  }
  return result;
}

Referenced by:

HalpDmaAllocateLocalContiguousPool
HalpDmaAllocateMapRegisters
HalpDmaGrowContiguousMapBuffers
HalpDmaInitializeMasterAdapter