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