RtlpHpSegMgrRelease
CHAR __fastcall RtlpHpSegMgrRelease(INT64 rcx0, INT64 a2, INT64 r8_0){
__int64 v3;
unsigned __int64 v4;
UINT64 v6;
_WORD *v7;
unsigned __int64 v8;
unsigned int v9;
INT64 v11;
INT64 v12;
INT64 v13;
__int128 a4;
unsigned __int64 a3;
_WORD *v16;
UINT64 a1;
LODWORD(v6) = *(_DWORD *)rcx0;
v3 = a2;
v16 = 0i64;
a1 = a2;
v4 = (unsigned int)-(int)v6;
LOBYTE(v6) = *(_BYTE *)(rcx0 + 13) & 7;
a3 = v4;
if( !(_BYTE)v6 )
{
LABEL_2:
if( v3 )
{
a4 = *(_OWORD *)(rcx0 + 40);
LOBYTE(v6) = RtlpHpFreeVA(&a1, &a3, 0x8000i64, &a4);
}
return v6;
}
if( v4 >= 0x200000 )
{
LABEL_10:
a4 = *(_OWORD *)(rcx0 + 40);
LOBYTE(v6) = RtlpHpQueryVA(v3, &a4, &v16, 0i64);
v7 = v16;
v8 = (unsigned __int64)&v16[v4 >> 21];
v9 = 0;
if( (unsigned __int64)v16 < v8 )
{
do
{
LOWORD(v6) = *v7;
if( (*v7 & 0x7FF) != 0 )
{
LODWORD(v13) = 0;
LODWORD(v12) = 0x4000;
LODWORD(v11) = -(v6 & 0x7FF);
LOBYTE(v6) = RtlpHpSegMgrCommit(rcx0, v3, v9, 512i64, v11, v12, v13);
}
++v7;
v9 += 512;
}
while( (unsigned __int64)v7 < v8 );
}
goto LABEL_2;
}
if( (int)r8_0 > 0 )
{
LODWORD(v13) = 0;
LODWORD(v12) = 0x4000;
LODWORD(v11) = -(int)r8_0;
RtlpHpSegMgrCommit(rcx0, a2, 0i64, (unsigned int)v4 >> 12, v11, v12, v13);
}
v6 = RtlpHpSegMgrVaCtxFree(rcx0, v3, &a3);
a1 = v6;
v3 = v6;
if( v6 )
{
v4 = a3;
goto LABEL_10;
}
return v6;
}Referenced by:
RtlpHpSegMgrAllocate
RtlpHpSegSegmentFree