RtlpAnalyzeHeapFailure

VOID __stdcall RtlpAnalyzeHeapFailure(_HEAP *Heap, _HEAP_ENTRY *HeapEntry){
  _HEAP *v3; 
  unsigned int v4; 
  unsigned int EncodeFlagMask; 
  __int64 SegmentOffset; 
  unsigned __int8 UnusedBytes; 
  _HEAP_ENTRY *v8; 
  void *PreviousBlockPrivateData; 
  _HEAP_ENTRY *v10; 
  _HEAP_ENTRY *v11; 
  unsigned __int16 PreviousSize; 
  unsigned __int16 v13; 
  _HEAP_ENTRY *v14; 
  unsigned int SubSegmentCode; 
  __int16 Size; 
  _HEAP_ENTRY *v17; 
  __int64 v18; 
  _HEAP_FAILURE_TYPE v19; 
  _HEAP *v20; 
  unsigned int v21; 

  v3 = 0i64;
  v4 = 0;
  EncodeFlagMask = Heap->EncodeFlagMask;
  if( (EncodeFlagMask & HeapEntry->UnpackedEntry.SubSegmentCode) != 0 )
    goto LABEL_33;
  v4 = 10;
  if( (Heap->Flags & 0x4000000) == 0
    && HeapEntry->UnpackedEntry.SmallTagIndex != (LOBYTE(HeapEntry->Code1) ^ (unsigned __int8)(BYTE1(HeapEntry->AgregateCode) ^ HeapEntry->UnpackedEntry.Flags)) )
  {
    goto LABEL_33;
  }
  v4 = 1;
  SegmentOffset = HeapEntry->UnpackedEntry.SegmentOffset;
  if( (_BYTE)SegmentOffset )
  {
    v3 = (_HEAP *)(((unsigned __int64)HeapEntry & 0xFFFFFFFFFFFF0000ui64) + ((1 - SegmentOffset) << 16));
    v20 = v3;
  }
  else
  {
    v3 = Heap;
    v20 = Heap;
  }
  if( v3->Segment.SegmentSignature != -1114130 )
    goto LABEL_33;
  UnusedBytes = HeapEntry->UnpackedEntry.UnusedBytes;
  if( UnusedBytes != 4 )
  {
    v4 = 2;
    if( HeapEntry < v3->Segment.BaseAddress || HeapEntry >= v3->Segment.LastValidEntry || v3->Segment.Heap != Heap )
      goto LABEL_33;
  }
  v4 = 3;
  if( UnusedBytes == 3 )
  {
    v8 = HeapEntry + 1;
    PreviousBlockPrivateData = HeapEntry[3].UnpackedEntry.PreviousBlockPrivateData;
    if( ((unsigned __int16)PreviousBlockPrivateData & 0xFFF) != 0 )
      goto LABEL_33;
    if( PreviousBlockPrivateData < v3->Segment.BaseAddress )
      goto LABEL_33;
    if( (_HEAP_ENTRY *)((unsigned __int64)PreviousBlockPrivateData + HeapEntry[3].UnpackedEntry.CompactHeader) > v3->Segment.LastValidEntry )
      goto LABEL_33;
    v4 = 4;
    v10 = *(_HEAP_ENTRY **)HeapEntry[1].UnpackedEntry.CompactHeader;
    if( v10 != *((_HEAP_ENTRY **)v8->UnpackedEntry.PreviousBlockPrivateData + 1) )
      goto LABEL_33;
    if( v10 != v8 )
      goto LABEL_33;
    v4 = 5;
    v11 = *(_HEAP_ENTRY **)HeapEntry[2].UnpackedEntry.CompactHeader;
    if( v11 != *((_HEAP_ENTRY **)HeapEntry[2].UnpackedEntry.PreviousBlockPrivateData + 1) || v11 != &HeapEntry[2] )
      goto LABEL_33;
    PreviousSize = Heap->Encoding.UnpackedEntry.PreviousSize;
  }
  else
  {
    v4 = 6;
    PreviousSize = Heap->Encoding.UnpackedEntry.PreviousSize;
    if( (PreviousSize ^ HeapEntry[HeapEntry->UnpackedEntry.Size].UnpackedEntry.PreviousSize) != HeapEntry->UnpackedEntry.Size )
      goto LABEL_33;
  }
  v4 = 7;
  v13 = HeapEntry->UnpackedEntry.PreviousSize;
  if( PreviousSize == v13 )
    goto LABEL_29;
  v14 = &HeapEntry[-(PreviousSize ^ (unsigned __int64)HeapEntry->UnpackedEntry.PreviousSize)];
  if( EncodeFlagMask )
  {
    SubSegmentCode = v14->UnpackedEntry.SubSegmentCode;
    LOWORD(v21) = SubSegmentCode;
    if( (SubSegmentCode & Heap->EncodeFlagMask) != 0 )
      v21 = SubSegmentCode ^ Heap->Encoding.UnpackedEntry.SubSegmentCode;
    Size = v21;
    PreviousSize = Heap->Encoding.UnpackedEntry.PreviousSize;
    v13 = HeapEntry->UnpackedEntry.PreviousSize;
    v3 = v20;
    v4 = 7;
  }
  else
  {
    Size = v14->UnpackedEntry.Size;
  }
  if( Size == (PreviousSize ^ v13) )
  {
LABEL_29:
    v4 = 8;
    if( (HeapEntry->UnpackedEntry.Flags & 1) != 0
      || (v17 = *(_HEAP_ENTRY **)HeapEntry[1].UnpackedEntry.CompactHeader,
          v17 == *((_HEAP_ENTRY **)HeapEntry[1].UnpackedEntry.PreviousBlockPrivateData + 1))
      && v17 == &HeapEntry[1] )
    {
      v4 = 9;
    }
  }
LABEL_33:
  if( Heap->EncodeFlagMask )
  {
    HeapEntry->UnpackedEntry.SmallTagIndex = LOBYTE(HeapEntry->Code1) ^ BYTE1(HeapEntry->AgregateCode) ^ HeapEntry->UnpackedEntry.Flags;
    HeapEntry->UnpackedEntry.SubSegmentCode ^= Heap->Encoding.UnpackedEntry.SubSegmentCode;
  }
  if( v4 > 5 )
  {
    if( v4 <= 7 )
      goto LABEL_47;
    if( v4 == 8 )
    {
      v18 = 8i64;
      v19 = heap_failure_freelists_corruption;
      goto LABEL_49;
    }
    if( v4 == 10 )
      goto LABEL_47;
    v19 = heap_failure_generic;
LABEL_48:
    v18 = v4;
    goto LABEL_49;
  }
  if( v4 >= 4 )
  {
    v19 = heap_failure_listentry_corruption;
    goto LABEL_48;
  }
  if( v4 <= 1 )
  {
LABEL_47:
    v19 = heap_failure_entry_corruption;
    goto LABEL_48;
  }
  if( v4 == 2 )
  {
    v18 = (__int64)v3->Segment.Heap;
    v19 = heap_failure_cross_heap_operation;
  }
  else
  {
    v18 = 3i64;
    v19 = heap_failure_internal;
  }
LABEL_49:
  RtlpLogHeapFailure(v19, Heap, HeapEntry, (VOID *)v18, 0i64);
}

Referenced by:

RtlZeroHeap
RtlpAllocateHeap
RtlpCoalesceFreeBlocks
RtlpCreateSplitBlock
RtlpExtendHeap
RtlpFindAndCommitPages
RtlpFreeHeap
RtlpPopulateListIndex
RtlpSetupExtendedBlock