RtlpInsertUCRBlock
VOID __stdcall RtlpInsertUCRBlock(_HEAP *Heap, _HEAP_UCR_DESCRIPTOR *UCRBlock){
unsigned __int64 Size;
_LIST_ENTRY *UCREntry;
_LIST_ENTRY *Blink;
__int64 v7;
_HEAP *v8;
_LIST_ENTRY *p_UCRSegmentList;
_LIST_ENTRY *p_SegmentEntry;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v12;
Size = UCRBlock->Size;
if( Size )
{
UCREntry = RtlpFindUCREntry(Heap, Size);
Blink = UCREntry->Blink;
if( Blink->Flink == UCREntry )
{
UCRBlock->ListEntry.Flink = UCREntry;
UCRBlock->ListEntry.Blink = Blink;
Blink->Flink = &UCRBlock->ListEntry;
UCREntry->Blink = &UCRBlock->ListEntry;
}
else
{
RtlpLogHeapFailure(heap_failure_freelists_corruption, 0i64, UCREntry, 0i64, Blink->Flink);
}
}
v7 = BYTE6(UCRBlock[-1].Size);
if( (_BYTE)v7 )
v8 = (_HEAP *)(((unsigned __int64)&UCRBlock[-1].Address & 0xFFFFFFFFFFFF0000ui64) - (v7 << 16) + 0x10000);
else
v8 = Heap;
p_UCRSegmentList = &v8->Segment.UCRSegmentList;
p_SegmentEntry = &UCRBlock->SegmentEntry;
Flink = v8->Segment.UCRSegmentList.Flink;
v12 = Flink->Blink;
if( v12 == &v8->UCRSegmentList )
{
p_SegmentEntry->Flink = Flink;
p_SegmentEntry->Blink = p_UCRSegmentList;
Flink->Blink = p_SegmentEntry;
p_UCRSegmentList->Flink = p_SegmentEntry;
}
else
{
RtlpLogHeapFailure(heap_failure_freelists_corruption, 0i64, p_UCRSegmentList, v12, 0i64);
}
}Referenced by:
RtlpCreateUCREntry
RtlpDeCommitFreeBlock