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