RtlpHpHeapDestroy
__int64 __fastcall RtlpHpHeapDestroy(UINT64 a1, __int64 a2, __int64 a3, __int64 a4){
UINT64 v4;
bool v5;
__int64 v7;
char v8;
int v9;
_QWORD *v10;
__int64 v11;
__int64 v12;
unsigned __int64 v13;
UINT64 v14;
UINT64 v15;
INT64 v16;
__int128 v17;
__int128 v19;
__int128 a4a;
UINT64 a1a;
UINT64 a2a;
a1a = a1;
a2a = 0i64;
v4 = a1 + 72;
v5 = (*(_BYTE *)(a1 + 80) & 1) == 0;
v7 = *(_QWORD *)(a1 + 72);
if( !v5 && v7 )
v7 ^= v4;
v8 = *(_BYTE *)(v4 + 8);
v9 = v8 & 1;
if( v7 )
{
while( 1 )
{
while( 1 )
{
while( *(_QWORD *)v7 )
{
v10 = (_QWORD *)v7;
if( v9 )
v7 ^= *(_QWORD *)v7;
else
v7 = *(_QWORD *)v7;
*v10 = 0i64;
}
v11 = *(_QWORD *)(v7 + 8);
if( !v11 )
break;
v12 = v7;
if( v9 )
v7 ^= v11;
else
v7 = *(_QWORD *)(v7 + 8);
*(_QWORD *)(v12 + 8) = 0i64;
}
v13 = *(_QWORD *)(v7 + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( v9 && v13 )
v13 ^= v7;
RtlpHpLargeAllocationDestroy(v7, (__int128 *)a1);
if( !v13 )
break;
v7 = v13;
}
v8 = *(_BYTE *)(v4 + 8);
}
*(_QWORD *)v4 = 0i64;
*(_QWORD *)(v4 + 8) = 0i64;
if( (v8 & 1) != 0 )
*(_BYTE *)(v4 + 8) = 1;
v14 = a1a;
v15 = a1a + 672;
while( *(_QWORD *)v15 )
{
v16 = v15 ^ *(_QWORD *)v15;
RtlpHpVsSubsegmentCleanup(v14 + 640, v16, a3, a4);
RtlpHpVsSubsegmentFree(v14 + 640, v16, 1ui64);
}
RtlpHpLfhContextCleanup(a1a + 832);
RtlpHpSegContextCleanup(a1a + 256);
RtlpHpSegContextCleanup(a1a + 448);
v17 = *(_OWORD *)a1a;
a2a = *(_QWORD *)(a1a + 248) - a1a;
v5 = (*(_BYTE *)(a1a + 30) & 1) == 0;
v19 = v17;
a4a = *(_OWORD *)a1a;
if( v5 )
RtlpHpFreeVA(&a1a, &a2a, BYTE1(v19) < 2u ? 16809984 : 0x8000, &a4a);
else
RtlpHpMetadataFree(a1a, &a4a);
return RtlpHpRegisterEnvironment(&v19);
}Referenced by:
ExCleanupSessionHeapManager
RtlpHpHeapCreate