RtlpHpFreeHeap

NTSTATUS __stdcall RtlpHpFreeHeap(VOID *HeapAddress, VOID *Address, INT64 a3){
  NTSTATUS v4; 
  int v6; 
  unsigned int v7; 
  int v8; 
  unsigned int v9; 
  int v10; 
  _RTL_RUN_ONCE *HeapManager; 
  __int64 v13; 
  UINT64 v14; 
  char v15; 
  int v16; 
  int v17; 
  __int64 v18; 
  __int128 v19; 

  v4 = 0;
  v6 = 0;
  v7 = a3 | *((_DWORD *)HeapAddress + 5) & 0x11000001;
  v8 = *((_DWORD *)HeapAddress + 55);
  if( v8 )
    LOBYTE(v6) = v8 == KeGetCurrentThread()[1].CurrentRunTime;
  v9 = v7 | 1;
  if( !v6 )
    v9 = v7;
  if( (v9 & 0x1000000) != 0
    || !*((_DWORD *)HeapAddress + 6)
    || (v14 = RtlpHpExtrasGet((INT128 *)HeapAddress, (_XSTATE_CONFIGURATION *)Address, v9, 0i64),
        v14 - 1 > 0xFFFFFFFFFFFFFFFDui64)
    || (v15 = *(_BYTE *)(v14 + 2), (v15 & 0xF) == 0)
    || ((v16 = v15 & 0xF) == 0 || (_WORD)v16 != 1 ? (v17 = -1073741823) : (v17 = ((__int64(__fastcall *)(VOID *, VOID *, __int64, UINT64))RtlpInterceptorRoutines.QuadPart)(
                                                                                   HeapAddress,
                                                                                   Address,
                                                                                   3i64,
                                                                                   v14 + 16)),
        v17 >= 0) )
  {
    if( (*((_DWORD *)HeapAddress + 5) & 0x10000000) != 0 )
    {
      LODWORD(v18) = RtlpHpSizeHeap((INT64)HeapAddress, (UINT64)Address, v9);
      if( v18 == -1 )
      {
        RtlpLogHeapFailure(heap_failure_invalid_argument, HeapAddress, Address, 0i64, 0i64);
        return v4;
      }
    }
    if( (_WORD)Address )
    {
      v10 = 0;
    }
    else
    {
      v19 = *(_OWORD *)HeapAddress;
      HeapManager = RtlpHpEnvGetHeapManager(&v19);
      LODWORD(v13) = RtlCSparseBitmapBitmaskRead(
                       (INT64)&HeapManager[2],
                       2 * (((unsigned __int64)Address - HeapManager[1].Value) >> 20));
      if( !v13 )
        goto LABEL_25;
      v10 = v13 - 1;
    }
    if( v10 != 2 )
      return RtlpHpSegFree((INT64)HeapAddress + 192 * v10 + 256, (UINT64)Address, v9);
LABEL_25:
    LOBYTE(v4) = RtlpHpLargeFree(HeapAddress, Address, v9) != 0;
  }
  return v4;
}

Referenced by:

ExAllocateContiguousHeapPool
ExAllocateHeapPool
ExGetBigPoolInfo
ExPoolCleanupExpansionTable
ExpFreeHeapSpecialPool
ExpHpCompactionRoutine
ExpResizeBigPageTable
RtlpHpAllocateHeap
RtlpHpMetadataFree