RtlpCreateUCREntry
VOID __stdcall RtlpCreateUCREntry(
_HEAP *Heap,
_HEAP_SEGMENT *Segment,
_HEAP_UCR_DESCRIPTOR *NewUCRBlock,
UINT64 Size,
_HEAP_FREE_ENTRY *LastKnownEntry,
UINT64 *FreeSize){
_HEAP_FREE_ENTRY *p_Address;
_HEAP *v10;
unsigned __int64 v11;
bool v12;
bool v13;
INT64 v14;
unsigned __int64 v15;
NewUCRBlock->Size = Size;
p_Address = (_HEAP_FREE_ENTRY *)&NewUCRBlock[-1].Address;
p_Address->HeapEntry.UnpackedEntry.UnusedBytes = 3;
NewUCRBlock->Address = &NewUCRBlock[1];
p_Address->HeapEntry.UnpackedEntry.SubSegmentCode = 65540;
v10 = Segment->Heap;
if( v10 == (_HEAP *)Segment )
{
LOBYTE(v11) = 0;
}
else
{
v11 = ((unsigned __int64)((char *)p_Address - (char *)Segment) >> 16) + 1;
if( v11 >= 0xFE )
RtlpLogHeapFailure(heap_failure_entry_corruption, v10, &NewUCRBlock[-1].Address, Segment, 0i64);
}
v12 = RtlpHeapErrorHandlerThreshold < 1;
p_Address->HeapEntry.UnpackedEntry.SegmentOffset = v11;
if( v12 )
{
v13 = LastKnownEntry == p_Address;
}
else
{
v13 = LastKnownEntry == p_Address;
if( LastKnownEntry > p_Address )
{
DbgPrint("((PHEAP_ENTRY)LastKnownEntry <= Entry)");
RtlpHeapHandleError(v14);
}
}
if( !v13 )
p_Address->HeapEntry.UnpackedEntry.PreviousSize = Heap->Encoding.UnpackedEntry.PreviousSize;
if( Heap->EncodeFlagMask )
{
p_Address->HeapEntry.UnpackedEntry.SmallTagIndex = LOBYTE(p_Address->InterceptorValue) ^ BYTE1(p_Address->Code1) ^ p_Address->HeapEntry.UnpackedEntry.Flags;
p_Address->HeapEntry.UnpackedEntry.SubSegmentCode ^= Heap->Encoding.UnpackedEntry.SubSegmentCode;
}
RtlpInsertUCRBlock(Heap, NewUCRBlock);
++Segment->NumberOfUnCommittedRanges;
Segment->NumberOfUnCommittedPages += NewUCRBlock->Size >> 12;
Heap->Counters.TotalMemoryCommitted -= NewUCRBlock->Size;
++Heap->Counters.TotalUCRs;
v15 = NewUCRBlock->Size;
if( v15 >= 0xFF000 )
Heap->Counters.TotalMemoryLargeUCR += v15;
*FreeSize = ((char *)p_Address - (char *)LastKnownEntry) >> 4;
}Referenced by:
RtlpDeCommitFreeBlock
RtlpFindAndCommitPages
RtlpInitializeHeapSegment