RtlpHeapRemoveListEntry
INT64 *__fastcall RtlpHeapRemoveListEntry(INT64 a1, INT64 a2, INT64 a3, INT64 *a4, UINT64 a5, INT64 a6){
__int64 v7;
unsigned int v8;
__int64 v10;
__int64 v11;
INT64 *result;
unsigned int v13;
unsigned int v14;
INT64 *v15;
v7 = *(_QWORD *)(a2 + 48);
v8 = a5 - *(_DWORD *)(a2 + 24);
v10 = 2 * v8;
if( !*(_DWORD *)(a2 + 12) )
v10 = v8;
v11 = (unsigned int)v10;
result = *(INT64 **)(v7 + 8 * v10);
--*(_DWORD *)(a2 + 16);
v13 = *(_DWORD *)(a2 + 8);
v14 = v13 - 1;
if( (_DWORD)a5 == v13 - 1 )
--*(_DWORD *)(a2 + 20);
if( result == a4 )
{
v15 = (INT64 *)*a4;
result = *(INT64 **)(a2 + 32);
if( *(_QWORD *)a2 )
v14 = v13;
if( (unsigned int)a5 >= v14 )
{
if( v15 != result )
{
*(_QWORD *)(v7 + 8 * v11) = v15;
return result;
}
*(_QWORD *)(v7 + 8 * v11) = 0i64;
}
else
{
if( v15 != result && !(unsigned int)RtlpHeapListCompare(a1, (__int64)v15, a6, 1) )
{
result = *(INT64 **)(a2 + 48);
result[v11] = (INT64)v15;
return result;
}
*(_QWORD *)(*(_QWORD *)(a2 + 48) + 8 * v11) = 0i64;
}
result = *(INT64 **)(a2 + 40);
*((_DWORD *)result + ((unsigned __int64)v8 >> 5)) &= ~(1 << (v8 & 0x1F));
}
return result;
}Referenced by:
RtlZeroHeap
RtlpAllocateHeap
RtlpCoalesceFreeBlocks
RtlpCreateSplitBlock
RtlpPopulateListIndex