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