RtlpLocateRelatedBlocks

VOID __stdcall RtlpLocateRelatedBlocks(_HEAP *Heap, VOID *Address){
  _LIST_ENTRY *p_SegmentList; 
  _LIST_ENTRY *i; 
  _LIST_ENTRY **p_Blink; 
  _LIST_ENTRY *p_VirtualAllocdBlocks; 
  _LIST_ENTRY *j; 
  _LIST_ENTRY **v9; 
  _LIST_ENTRY *Blink; 
  unsigned __int64 v11; 
  _LIST_ENTRY *v12; 
  unsigned __int64 Flink; 
  unsigned __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned int EncodeFlagMask; 
  int v18; 
  unsigned __int16 v19; 
  unsigned __int64 v20; 
  unsigned __int16 v21; 
  int v22; 
  unsigned __int16 v23; 
  unsigned int v24; 
  unsigned __int16 v25; 
  __int64 v26; 
  int v27; 
  unsigned __int16 v28; 
  int v29; 
  unsigned __int16 v30; 
  unsigned int v31; 
  unsigned int v32; 
  int v33; 
  unsigned int v34; 
  unsigned int v35; 

  p_SegmentList = &Heap->SegmentList;
  for( i = p_SegmentList->Flink; ; i = i->Flink )
  {
    if( i == p_SegmentList )
    {
      p_VirtualAllocdBlocks = &Heap->VirtualAllocdBlocks;
      for( j = p_VirtualAllocdBlocks->Flink; j != p_VirtualAllocdBlocks; j = j->Flink )
      {
        if( ((unsigned __int64)j & 0xFFFFFFFFFFFF0000ui64) <= (unsigned __int64)Address
          && (char *)j[2].Blink + ((unsigned __int64)j & 0xFFFFFFFFFFFF0000ui64) > Address )
        {
          dword_140C117B8 = 5;
        }
      }
      return;
    }
    p_Blink = &i[-2].Blink;
    if( i[1].Blink <= Address && i[3].Flink > Address )
      break;
  }
  v9 = &i[4].Blink;
  Blink = i[4].Blink;
  v11 = 0i64;
  v12 = 0i64;
  while( Blink != (_LIST_ENTRY *)v9 )
  {
    Flink = (unsigned __int64)Blink[1].Flink;
    v14 = (unsigned __int64)Blink[1].Blink + Flink;
    if( v14 < (unsigned __int64)Address && v14 > v11 )
      v11 = (unsigned __int64)Blink[1].Blink + Flink;
    if( Flink > (unsigned __int64)Address && (!v12 || (_LIST_ENTRY *)Flink < v12[2].Flink) )
      v12 = Blink - 1;
    Blink = Blink->Flink;
  }
  v15 = 0i64;
  v16 = 0i64;
  if( !v11 )
    v11 = (unsigned __int64)p_Blink;
  if( v11 < (unsigned __int64)Address )
  {
    EncodeFlagMask = Heap->EncodeFlagMask;
    do
    {
      v16 = v11;
      if( EncodeFlagMask )
      {
        v18 = *(_DWORD *)(v11 + 8);
        EncodeFlagMask = Heap->EncodeFlagMask;
        LOWORD(v31) = v18;
        if( (EncodeFlagMask & v18) != 0 )
          v31 = Heap->Encoding.UnpackedEntry.SubSegmentCode ^ v18;
        v19 = v31;
      }
      else
      {
        v19 = *(_WORD *)(v11 + 8);
      }
      if( !v19 )
        break;
      v11 += 16i64 * v19;
    }
    while( v11 < (unsigned __int64)Address );
  }
  v20 = (unsigned __int64)&v12[-1];
  if( &v12[-1] > Address )
  {
    do
    {
      v15 = v20;
      v21 = Heap->Encoding.UnpackedEntry.PreviousSize ^ *(_WORD *)(v20 + 12);
      if( !v21 )
        break;
      v20 += -16i64 * v21;
    }
    while( v20 > (unsigned __int64)Address );
  }
  qword_140C117E8 = v16;
  qword_140C117F0 = v15;
  if( !v16 || !v15 )
    goto LABEL_70;
  if( Heap->EncodeFlagMask )
  {
    v22 = *(_DWORD *)(v16 + 8);
    LOWORD(v32) = v22;
    if( (v22 & Heap->EncodeFlagMask) != 0 )
      v32 = Heap->Encoding.UnpackedEntry.SubSegmentCode ^ v22;
    v23 = v32;
  }
  else
  {
    v23 = *(_WORD *)(v16 + 8);
  }
  if( v16 + 16i64 * v23 != v15
                          - 16
                          * (Heap->Encoding.UnpackedEntry.PreviousSize ^ (unsigned __int64)*(unsigned __int16 *)(v15 + 12)) )
  {
    dword_140C117B8 = 4;
  }
  else
  {
LABEL_70:
    if( Heap->EncodeFlagMask )
    {
      v33 = *(_DWORD *)(v16 + 8);
      v24 = Heap->EncodeFlagMask;
      if( (v24 & v33) != 0 )
        v33 ^= Heap->Encoding.UnpackedEntry.SubSegmentCode;
      v25 = v33;
    }
    else
    {
      v25 = *(_WORD *)(v16 + 8);
      v24 = 0;
    }
    v26 = 2i64 * v25;
    if( v15 )
    {
      qword_140C117F8 = Heap->Encoding.UnpackedEntry.PreviousSize ^ (unsigned __int64)*(unsigned __int16 *)(v15 + 12);
      v24 = Heap->EncodeFlagMask;
    }
    if( v16 )
    {
      if( v24 )
      {
        v27 = *(_DWORD *)(v16 + 8);
        LOWORD(v34) = v27;
        if( (v27 & Heap->EncodeFlagMask) != 0 )
          v34 = Heap->Encoding.UnpackedEntry.SubSegmentCode ^ v27;
        v28 = v34;
      }
      else
      {
        v28 = *(_WORD *)(v16 + 8);
      }
      qword_140C11800 = v28;
      v24 = Heap->EncodeFlagMask;
    }
    if( v24 )
    {
      v29 = *(_DWORD *)(v16 + 8 * v26 + 8);
      LOWORD(v35) = v29;
      if( (v29 & Heap->EncodeFlagMask) != 0 )
        v35 = Heap->Encoding.UnpackedEntry.SubSegmentCode ^ v29;
      v30 = v35;
    }
    else
    {
      v30 = *(_WORD *)(v16 + 8 * v26 + 8);
    }
    if( qword_140C117F8 == v30 )
    {
      if( qword_140C11800 != (Heap->Encoding.UnpackedEntry.PreviousSize ^ (unsigned __int64)*(unsigned __int16 *)(v16 + 8 * v26 + 12)) )
        dword_140C117B8 = 7;
    }
    else
    {
      dword_140C117B8 = 6;
    }
  }
}

Referenced by:

RtlpHpHeapHandleError