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