HalpDmaCommitScatterMapBuffers

_HALP_DMA_TRANSLATION_ENTRY *__fastcall HalpDmaCommitScatterMapBuffers(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        int a4,
        _DWORD *a5){
  __int64 *v8; 
  unsigned __int64 v9; 
  _HALP_DMA_TRANSLATION_ENTRY *result; 
  __int64 v11; 
  char v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( a5 )
  {
    v8 = (__int64 *)(a5 + 12);
    v9 = (((a5[8] + a5[11]) & 0xFFF) + (unsigned __int64)(unsigned int)a5[10] + 4095) >> 12;
  }
  else
  {
    LODWORD(v9) = a4;
    v8 = 0i64;
  }
  result = HalpDmaGetTranslationEntries((_HALP_DMA_ADAPTER_OBJECT *)a1, HalpDmaNonContiguousMapBuffer, (unsigned int)v9);
  v11 = (__int64)result;
  if( result )
  {
    v12 = *(_BYTE *)(a1 + 144);
    v13 = (__int64)result;
    if( (_DWORD)v9 )
    {
      v14 = (unsigned int)v9;
      do
      {
        v15 = a3;
        if( a5 )
        {
          v16 = *v8++;
          v15 = v16 << 12;
        }
        else
        {
          a3 += 4096i64;
        }
        *(_QWORD *)v13 = v15;
        if( a2 )
        {
          v17 = a2 | *(_DWORD *)(v13 + 48) & 0xFFF;
          a2 += 4096i64;
        }
        else
        {
          v17 = *(_QWORD *)(v13 + 48);
        }
        *(_QWORD *)(v13 + 48) = (4i64 * (v12 & 1)) | v17 & 0xFFFFFFFFFFFFFFFAui64 | v12 & 1 | 0xA;
        v13 = *(_QWORD *)(v13 + 8);
        --v14;
      }
      while( v14 );
    }
    KeAcquireInStackQueuedSpinLock((UINT64 *)(a1 + 120), &LockHandle);
    v18 = HalpDmaPrependTranslations(v11, v9, *(_QWORD *)(a1 + 24));
    *(_DWORD *)(a1 + 32) += v9;
    *(_QWORD *)(a1 + 24) = v18;
    if( v12 )
      *(_DWORD *)(a1 + 208) += v9;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    return(_HALP_DMA_TRANSLATION_ENTRY *)v11;
  }
  return result;
}

Referenced by:

HalpDmaAllocateLocalScatterPool
HalpDmaGrowScatterMapBuffers