RtlpHpVaMgrRangeFind
VOID __fastcall RtlpHpVaMgrRangeFind(INT64 a1, UINT16 a2, UINT16 a3, _QWORD *a4){
unsigned __int64 i;
__int64 v6;
__int64 v8;
int v9;
unsigned __int64 v10;
unsigned __int64 v11;
__int64 v12;
__int64 v13;
__int64 v14;
unsigned __int64 v15;
_QWORD **v16;
unsigned __int64 v17;
_QWORD *v18;
i = *(_QWORD *)(a1 + 8);
v6 = a3;
v8 = a2;
if( (*(_BYTE *)(a1 + 16) & 1) != 0 && i )
i ^= a1 + 8;
v9 = *(_BYTE *)(a1 + 16) & 1;
v10 = 0i64;
while( i )
{
if( a2 < *(_WORD *)(i + 24) )
{
v11 = *(_QWORD *)i;
v10 = i;
}
else
{
if( a2 <= *(_WORD *)(i + 24) )
goto LABEL_15;
v11 = *(_QWORD *)(i + 8);
}
if( v9 && v11 )
i ^= v11;
else
i = v11;
}
i = v10;
LABEL_15:
if( i )
{
if( (unsigned __int16)v6 > 1u )
{
v12 = *(_QWORD *)(a1 + 24);
v13 = v6;
v14 = v6 - 1;
while( 1 )
{
v15 = (i - *(_QWORD *)(v12 + 40)) >> *(_DWORD *)(v12 + 24);
if( v8 + v15 + v13 - (v14 & (v15 + v13 - 1)) - 1 <= v15 + *(unsigned __int16 *)(i + 24) )
break;
v16 = *(_QWORD ***)(i + 8);
v17 = i;
if( v16 )
{
v18 = *v16;
for( i = *(_QWORD *)(i + 8); v18; v18 = (_QWORD *)*v18 )
i = (unsigned __int64)v18;
}
else
{
while( 1 )
{
i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !i || *(_QWORD *)i == v17 )
break;
v17 = i;
}
}
if( !i )
return;
}
*a4 = RtlSparseArrayElementAllocated(v12 + 16, v15 + v13 - (v14 & (v15 + v13 - 1)) - 1);
}
else
{
*a4 = i;
}
}
}Referenced by:
RtlpHpVaMgrAlloc