RtlDestroyHeap
VOID *__stdcall RtlDestroyHeap(VOID *HeapHandle){
INT64 v3;
int v4;
_QWORD *v5;
unsigned __int64 v6;
int v7;
VOID *v8;
UINT64 RegionSize;
VOID *BaseAddress;
RegionSize = 0i64;
BaseAddress = 0i64;
if( HeapHandle )
{
if( *((_DWORD *)HeapHandle + 4) != -857879331 )
{
v4 = *((_DWORD *)HeapHandle + 36);
if( v4 && (_WORD)v4 == 1 )
((void(__fastcall *)(VOID *, _QWORD, __int64))RtlpInterceptorRoutines.QuadPart)(HeapHandle, 0i64, 8i64);
v5 = (_QWORD *)*((_QWORD *)HeapHandle + 34);
while( (char *)HeapHandle + 272 != (char *)v5 )
{
v6 = (unsigned __int64)v5;
v5 = (_QWORD *)*v5;
RegionSize = 0i64;
BaseAddress = (VOID *)(v6 & 0xFFFFFFFFFFFF0000ui64);
ZwFreeVirtualMemory((VOID *)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 0x8000ui64);
}
v7 = *((_DWORD *)HeapHandle + 28);
if( (v7 & 1) == 0 )
{
if( v7 >= 0 )
ExDeleteResourceLite(*((_QWORD *)HeapHandle + 44));
*((_QWORD *)HeapHandle + 44) = 0i64;
}
do
{
v8 = (VOID *)(*((_QWORD *)HeapHandle + 37) - 24i64);
RtlpDestroyHeapSegment((__int64)v8);
}
while( v8 != HeapHandle );
}
}
else if( RtlpHeapErrorHandlerThreshold >= 2 )
{
DbgPrint("(HeapHandle != NULL)");
RtlpHeapHandleError(v3);
}
return 0i64;
}Referenced by:
No references.