HalpDmaForceAllocation

__int64 __fastcall HalpDmaForceAllocation(__int64 a1, __int64 *a2, __int64 **a3, int a4, char a5, _DWORD *a6){
  __int64 *v6; 
  __int64 v8; 
  int v9; 
  unsigned int v10; 
  __int64 result; 
  unsigned int v12; 
  char i; 
  __int64 v14; 
  unsigned int v15; 
  __int64 j; 
  int v17; 
  __int64 v18; 
  v6 = *a3;
  if( !*a3 )
  {
    if( *((_DWORD *)a3 + 2) == -1 )
    {
      v8 = 0i64;
      v9 = 0;
      v10 = 0;
      goto LABEL_4;
    }
    *((_DWORD *)a3 + 2) = 0;
    v6 = a2;
    *a3 = a2;
  }
  v12 = *((_DWORD *)a3 + 2);
  v10 = 0;
  for( i = 1; ; i = 0 )
  {
    v14 = 0i64;
    v8 = 0i64;
    v9 = 0;
    while( v6 )
    {
      v15 = *((_DWORD *)v6 + 2);
      v10 = v12;
      for( j = v6[2] + 72i64 * v12; v10 < v15; ++v10 )
      {
        if( (*(_QWORD *)(j + 48) & 0xFFFFFFFFFFFFF000ui64) != 0 )
        {
          if( v8 )
            *(_QWORD *)(v14 + 8) = j;
          else
            v8 = j;
          ++v9;
          v14 = j;
          if( v9 == a4 )
            goto LABEL_4;
        }
        else
        {
          v17 = 0;
          if( !a5 )
            v17 = v9;
          v9 = v17;
          v18 = 0i64;
          if( !a5 )
            v18 = v8;
          v8 = v18;
        }
        j += 72i64;
      }
      v6 = (__int64 *)*v6;
      v12 = 0;
    }
    if( !a5 )
      break;
    if( !i || *a3 == a2 && !*((_DWORD *)a3 + 2) )
    {
      *((_DWORD *)a3 + 2) = 0;
      result = 0i64;
      *a3 = a2;
      return result;
    }
    v12 = 0;
    v6 = a2;
  }
LABEL_4:
  *a3 = v6;
  *((_DWORD *)a3 + 2) = v10;
  if( v6 )
    goto LABEL_7;
  if( !a5 )
  {
    *((_DWORD *)a3 + 2) = -1;
LABEL_7:
    if( !a5 )
      *a6 = v9;
  }
  return v8;
}

Referenced by:

HalpDmaAllocateMapRegistersAtHighLevel