RtlpHpSegLargeRangeAllocate

UINT64 __fastcall RtlpHpSegLargeRangeAllocate(INT64 a1, UINT64 i, INT64 a3, INT64 a4){
  unsigned int v4; 
  unsigned int v6; 
  int v7; 
  unsigned __int64 j; 
  __int64 v10; 
  unsigned __int8 v11; 
  unsigned int v12; 
  UINT64 v14; 
  unsigned __int64 v15; 
  int v16; 
  __int16 *v17; 
  unsigned __int64 v18; 
  _QWORD **v19; 
  UINT64 v20; 
  _QWORD *v21; 
  UINT64 v22; 
  v4 = *(unsigned __int8 *)(a1 + 8);
  v6 = (_DWORD)a3 << *(_BYTE *)(a1 + 8);
  v7 = a4;
  while( 1 )
  {
    j = v4;
    v10 = *(unsigned __int8 *)(i + 31) << v4;
    if( !v7 )
      break;
    v11 = *(_BYTE *)(i + 30);
    if( v11 <= 2u )
    {
      if( !v11 && (v6 <= ((unsigned int)v10 & 0x1FFFFF) || (v10 & 0x1FFFFF) == 0) )
      {
        v12 = 0;
        goto LABEL_7;
      }
      break;
    }
LABEL_22:
    v19 = *(_QWORD ***)(i + 8);
    v20 = i;
    if( v19 )
    {
      v21 = *v19;
      for( i = *(_QWORD *)(i + 8); v21; v21 = (_QWORD *)*v21 )
        i = (UINT64)v21;
    }
    else
    {
      while( 1 )
      {
        i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
        if( !i || *(_QWORD *)i == v20 )
          break;
        v20 = i;
      }
    }
    if( !i )
      return 0i64;
  }
  v14 = (i & *(_QWORD *)a1) + ((__int64)(i - (i & *(_QWORD *)a1)) >> 5 << v4);
  v15 = v14 + v10;
  v16 = v14;
  v17 = (__int16 *)(*(_QWORD *)((v14 & *(_QWORD *)a1) + 0x18) + 2 * ((v14 - (v14 & *(_QWORD *)a1)) >> 21));
  for( j = (v14 + 0x200000) & 0xFFFFFFFFFFE00000ui64; ; j += 0x200000i64 )
  {
    if( *v17 < 0 )
    {
      v18 = v15;
      if( j < v15 )
        v18 = j;
      j = v18;
      if( (int)v18 - v16 >= v6 )
        break;
    }
    if( j >= v15 )
      goto LABEL_22;
    v16 = j;
    ++v17;
  }
  v12 = v16 - v14;
LABEL_7:
  if( v7 )
    RtlpHpSegFreeRangeRemove(a1, i);
  if( v12 )
  {
    LOBYTE(j) = *(_BYTE *)(a1 + 8);
    v22 = RtlpHpSegPageRangeSplit(j, i, v12 >> j);
    RtlpHpSegFreeRangeInsert(a1, i, 0i64);
    return v22;
  }
  return i;
}

Referenced by:

RtlpHpSegPageRangeAllocate