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