RtlpHpSegFree
NTSTATUS __stdcall RtlpHpSegFree(INT64 a1, UINT64 a2, UINT64 a3){
unsigned int v3;
INT64 v5;
INT64 v6;
VOID *v7;
VOID *v8;
NTSTATUS v9;
NTSTATUS v10;
INT64 v11;
INT64 a5;
LODWORD(a5) = 0;
v3 = a3;
v5 = RtlpHpSegDescriptorValidate(a1, a2);
if( v5 )
{
v8 = (VOID *)((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 RtlpHpLfhSubsegmentFreeBlock(*(_QWORD *)(a1 + 24), (INT64)v8, (UINT64)v7, v3);
}
else
{
RtlpHpVsContextFree(*(INT64 **)(a1 + 32), v8, v7, v3, (INT64)&a5);
v10 = v9;
if( v9 )
{
v11 = *(_QWORD *)(a1 + 24);
if( (unsigned int)a5 <= (unsigned int)*(unsigned __int16 *)(v11 + 60) - 16 )
RtlpHpLfhBucketUpdateStats(v11, (unsigned int)a5, 0i64);
}
}
}
else
{
RtlpLogHeapFailure(heap_failure_invalid_argument, *(VOID **)(a1 + 56), v7, 0i64, 0i64);
return 0;
}
return v10;
}Referenced by:
RtlpHpFreeHeap
RtlpHpSegLfhVsFree