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