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