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.