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.