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