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