RtlpInsertFreeBlock
VOID __fastcall RtlpInsertFreeBlock(INT64 a1, UINT64 a2, UINT64 a3){
UINT64 v3;
UINT64 v4;
__int64 v5;
INT64 v7;
__int64 v8;
unsigned __int64 v9;
char v10;
__int64 **v11;
unsigned __int16 v12;
char v13;
INT64 v14;
unsigned __int64 v15;
_DWORD *v16;
unsigned __int64 v17;
__int64 *Entry;
int v19;
int v20;
unsigned __int16 v21;
INT64 *v22;
__int64 **v23;
INT64 v24;
unsigned __int64 i;
INT64 v26;
int v27;
INT64 v28;
int v29;
char v30;
if( a3 )
{
v3 = a2;
v5 = *(unsigned __int16 *)(a2 + 12);
v4 = a3;
LOWORD(v5) = *(_WORD *)(a1 + 140) ^ v5;
if( !(_WORD)v5
&& RtlpHeapErrorHandlerThreshold >= 1
&& (*(_BYTE *)(v3 + 10) & 8) == 0
&& ((v3 + 4095) & 0xFFFFFFFFFFFFF000ui64) != v3 )
{
DbgPrint(
"((FreeBlock->Flags & HEAP_ENTRY_DECOMMITTED) || (ROUND_UP_TO_POWER2(FreeBlock, PAGE_SIZE) == (ULONG_PTR)FreeBlock))",
v5,
a3,
0i64);
RtlpHeapHandleError(v7);
}
v8 = *(unsigned __int8 *)(v3 + 14);
if( (_BYTE)v8 )
v9 = (v3 & 0xFFFFFFFFFFFF0000ui64) - (v8 << 16) + 0x10000;
else
v9 = a1;
v10 = *(_BYTE *)(v3 + 10);
v11 = (__int64 **)(a1 + 336);
v30 = v10;
while( 1 )
{
if( v4 <= 0xFF00 )
{
v12 = v4;
}
else
{
v12 = -272;
if( v4 != 65281 )
v12 = -256;
}
v13 = 0;
if( v4 <= 0xFF00 )
v13 = v10;
*(_BYTE *)(v3 + 10) = v13;
*(_WORD *)(v3 + 12) = v5 ^ *(_WORD *)(a1 + 140);
v14 = *(_QWORD *)(v9 + 40);
if( v14 == v9 )
{
LOBYTE(v15) = 0;
}
else
{
v15 = ((v3 - v9) >> 16) + 1;
if( v15 >= 0xFE )
RtlpLogHeapFailure(3i64, v14, v3, v9, 0i64, 0i64);
}
*(_BYTE *)(v3 + 10) &= 0xF0u;
*(_BYTE *)(v3 + 14) = v15;
*(_WORD *)(v3 + 8) = v12;
*(_BYTE *)(v3 + 11) = 0;
*(_BYTE *)(v3 + 15) = 0;
if( (*(_DWORD *)(a1 + 112) & 0x40) != 0 )
{
v16 = (_DWORD *)(v3 + 32);
v17 = (16 * (unsigned __int64)v12 - 32) >> 2;
if( v17 )
{
if( ((unsigned __int8)v16 & 4) != 0 )
{
--v17;
*v16 = -17891602;
v16 = (_DWORD *)(v3 + 36);
}
memset64(v16, 0xFEEEFEEEFEEEFEEEui64, v17 >> 1);
if( (v17 & 1) != 0 )
v16[v17 - 1] = -17891602;
}
*(_BYTE *)(v3 + 10) |= 4u;
}
if( *(_QWORD *)(a1 + 312) )
Entry = RtlpFindEntry(a1, v12);
else
Entry = *v11;
if( v11 != (__int64 **)Entry )
{
v19 = *(_DWORD *)(a1 + 124);
do
{
if( v19 )
{
v20 = *((_DWORD *)Entry - 2);
v19 = *(_DWORD *)(a1 + 124);
LOWORD(v29) = v20;
if( (v19 & v20) != 0 )
v29 = *(_DWORD *)(a1 + 136) ^ v20;
v21 = v29;
}
else
{
v21 = *((_WORD *)Entry - 4);
}
if( v12 <= (unsigned __int64)v21 )
break;
Entry = (__int64 *)*Entry;
}
while( v11 != (__int64 **)Entry );
}
v22 = (INT64 *)Entry[1];
v23 = (__int64 **)(v3 + 16);
if( (__int64 *)*v22 == Entry )
{
*v23 = Entry;
*(_QWORD *)(v3 + 24) = v22;
*v22 = (INT64)v23;
Entry[1] = (__int64)v23;
}
else
{
RtlpLogHeapFailure(13i64, 0i64, (UINT64)Entry, 0i64, *v22, 0i64);
}
*(_QWORD *)(a1 + 192) += *(unsigned __int16 *)(v3 + 8);
v24 = *(_QWORD *)(a1 + 312);
if( v24 )
{
for( i = *(unsigned int *)(v24 + 8); ; i = *(unsigned int *)(v26 + 8) )
{
if( *(unsigned __int16 *)(v3 + 8) < i )
{
v27 = *(unsigned __int16 *)(v3 + 8);
goto LABEL_50;
}
v26 = *(_QWORD *)v24;
if( !*(_QWORD *)v24 )
break;
v24 = *(_QWORD *)v24;
}
v27 = *(_DWORD *)(v24 + 8) - 1;
LABEL_50:
LODWORD(v28) = v27;
RtlpHeapAddListEntry(a1, v24, (INT64)Entry, v3 + 16, v28, *(unsigned __int16 *)(v3 + 8));
}
if( *(_DWORD *)(a1 + 124) )
{
*(_BYTE *)(v3 + 11) = *(_BYTE *)(v3 + 8) ^ *(_BYTE *)(v3 + 9) ^ *(_BYTE *)(v3 + 10);
*(_DWORD *)(v3 + 8) ^= *(_DWORD *)(a1 + 136);
}
v4 -= v12;
LOWORD(v5) = v12;
v3 += 16i64 * v12;
if( v3 >= *(_QWORD *)(v9 + 72) )
break;
v10 = v30;
v11 = (__int64 **)(a1 + 336);
if( !v4 )
{
*(_WORD *)(v3 + 12) = v12 ^ *(_WORD *)(a1 + 140);
return;
}
}
}
}Referenced by:
RtlpCreateSplitBlock
RtlpDeCommitFreeBlock
RtlpExtendHeap
RtlpFreeHeap
RtlpInitializeHeapSegment