RtlpHpSegFree
INT64 __fastcall RtlpHpSegFree(INT64 a1, UINT64 a2, UINT64 a3){
unsigned int v3;
INT64 v5;
INT64 v6;
UINT64 v7;
unsigned __int64 v8;
unsigned int v9;
INT64 v10;
UINT64 v12;
LODWORD(v12) = 0;
v3 = a3;
v5 = RtlpHpSegDescriptorValidate(a1, a2);
if( v5 )
{
v8 = (v5 & *(_QWORD *)a1) + ((v5 - (v5 & *(_QWORD *)a1)) >> 5 << *(_BYTE *)(a1 + 8));
if( v7 <= v8 )
{
RtlpHpSegPageRangeShrink(a1, v5, v6, v3);
return 1;
}
else if( (*(_BYTE *)(v5 + 24) & 0xC) == 8 )
{
return(unsigned int)RtlpHpLfhSubsegmentFreeBlock(*(_QWORD *)(a1 + 24), v8, v7, v3);
}
else
{
v9 = RtlpHpVsContextFree(*(_QWORD *)(a1 + 32), v8, v7, v3, &v12);
if( v9 )
{
v10 = *(_QWORD *)(a1 + 24);
if( (unsigned int)v12 <= (unsigned int)*(unsigned __int16 *)(v10 + 60) - 16 )
RtlpHpLfhBucketUpdateStats(v10, (unsigned int)v12, 0i64);
}
}
}
else
{
RtlpLogHeapFailure(9i64, *(_QWORD *)(a1 + 56), v7, 0i64, 0i64, 0i64);
return 0;
}
return v9;
}Referenced by:
RtlpHpFreeHeap
RtlpHpSegLfhVsFree