RtlpHpVsContextFree
INT64 __fastcall RtlpHpVsContextFree(INT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, UINT64 *a5){
char v6;
int v9;
INT64 v10;
unsigned int v11;
PSLIST_ENTRY v12;
_QWORD *v13;
int v14;
__int64 v15;
UINT64 v16;
_QWORD *v17;
UINT64 v18;
unsigned __int64 v19;
int v20;
int v21;
unsigned __int64 v22;
unsigned int i;
INT64 v24;
unsigned __int64 v25;
__int64 v26;
__int64 v27;
unsigned int v28;
UINT64 v29;
UINT64 v30;
unsigned __int64 v31;
_WORD *v32;
__int16 v33;
UINT64 v34;
unsigned __int64 v35;
bool v36;
unsigned __int64 v37;
union _SLIST_HEADER *v39;
int v40;
int v41;
INT64 v42;
int v43;
unsigned __int64 v44;
INT64 v45;
UINT64 v46;
INT64 v47[2];
__int64 v48;
int v49;
UINT64 v50;
UINT64 v51;
UINT64 v52;
LODWORD(v52) = a4;
v6 = a4;
v9 = *(_DWORD *)(a1 + 176);
v10 = a3 - 16;
if( (v9 & 1) != 0 && (a3 & 0xFFF) == 0 )
v10 = a3 - 32;
if( !a2 )
{
v40 = DWORD1(RtlpHpHeapGlobals) ^ HIDWORD(v10) ^ HIDWORD(*(_QWORD *)v10);
if( (v40 & 0xFF0000) != 0 )
{
v41 = (unsigned __int8)(RtlpHpHeapGlobals ^ v10 ^ *(_BYTE *)(v10 + 8));
}
else
{
if( (_WORD)v40 )
{
v42 = v10 - 16i64 * (unsigned __int16)((v10 ^ (unsigned __int64)RtlpHpHeapGlobals ^ *(_QWORD *)v10) >> 32);
v43 = DWORD1(RtlpHpHeapGlobals) ^ HIDWORD(v42) ^ HIDWORD(*(_QWORD *)v42);
if( (v43 & 0xFF0000) != 0 )
{
v41 = (unsigned __int8)(RtlpHpHeapGlobals ^ v42 ^ *(_BYTE *)(v42 + 8));
}
else if( (_WORD)v43 )
{
v42 -= 16i64 * (unsigned __int16)(((unsigned __int64)RtlpHpHeapGlobals ^ v42 ^ *(_QWORD *)v42) >> 32);
v41 = (unsigned __int8)(RtlpHpHeapGlobals ^ v42 ^ *(_BYTE *)(v42 + 8));
}
else
{
v41 = 0;
}
v6 = v52;
goto LABEL_64;
}
v41 = 0;
}
v42 = v10;
LABEL_64:
a2 = (v42 - (unsigned int)(v41 << 12)) & 0xFFFFFFFFFFFFF000ui64;
}
if( (((unsigned __int16)(*(_WORD *)(a2 + 32) ^ *(_WORD *)(a2 + 34)) ^ 0x2BED) & 0x7FFF) != 0 )
{
RtlpLogHeapFailure(18i64, a1 ^ *(_QWORD *)(a1 + 128), a2, 0i64, 0i64, 0i64);
return 0i64;
}
else if( ((v10 ^ (unsigned __int64)RtlpHpHeapGlobals ^ *(_QWORD *)v10) & 0xFF000000000000i64) != 0 )
{
v11 = 16 * (WORD1(RtlpHpHeapGlobals) ^ WORD1(v10) ^ *(unsigned __int16 *)(v10 + 2)) - 16;
*(_DWORD *)a5 = v11;
v12 = 0i64;
if( (v9 & 4) != 0 && v11 < 0x1000 )
{
v39 = (union _SLIST_HEADER *)(a1 + 64);
if( *(_WORD *)(a1 + 64) < 0x20u )
{
RtlpInterlockedPushEntrySList(v39, (PSLIST_ENTRY)(v10 + 16));
return 1i64;
}
v12 = RtlpInterlockedFlushSList(v39);
}
v13 = (_QWORD *)(v10 + 16);
*(_QWORD *)(v10 + 16) = v12;
v14 = v6 & 1;
v48 = 0i64;
v49 = v14;
*(_OWORD *)v47 = 0i64;
if( (v6 & 1) == 0 )
RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
if( v10 != -16 )
{
do
{
v15 = *(v13 - 2);
v16 = (UINT64)(v13 - 2);
v17 = v13;
v13 = (_QWORD *)*v13;
v18 = v16;
v19 = ((unsigned __int64)RtlpHpHeapGlobals ^ v16 ^ v15) >> 32;
v20 = v19 & 0xFF0000;
if( (v19 & 0xFF0000) != 0 )
{
v21 = (unsigned __int8)(RtlpHpHeapGlobals ^ v16 ^ *((_BYTE *)v17 - 8));
}
else
{
if( !(_WORD)v19 )
goto LABEL_84;
v18 = v16 - 16i64 * (unsigned __int16)v19;
v44 = ((unsigned __int64)RtlpHpHeapGlobals ^ v18 ^ *(_QWORD *)v18) >> 32;
if( (v44 & 0xFF0000) != 0 )
{
v21 = (unsigned __int8)(RtlpHpHeapGlobals ^ v18 ^ *(_BYTE *)(v18 + 8));
}
else
{
if( !(_WORD)v44 )
{
LABEL_84:
v21 = 0;
goto LABEL_14;
}
v18 -= 16i64 * (unsigned __int16)v44;
v21 = (unsigned __int8)(RtlpHpHeapGlobals ^ v18 ^ *(_BYTE *)(v18 + 8));
}
}
LABEL_14:
v22 = (v18 - (unsigned int)(v21 << 12)) & 0xFFFFFFFFFFFFF000ui64;
if( (((unsigned __int16)(*(_WORD *)(v22 + 32) ^ *(_WORD *)(v22 + 34)) ^ 0x2BED) & 0x7FFF) != 0 )
{
RtlpLogHeapFailure(18i64, a1 ^ *(_QWORD *)(a1 + 128), v22, 0i64, 0i64, 0i64);
}
else if( v20 )
{
LODWORD(v50) = 0;
for( i = 0; ; i = v28 )
{
v24 = RtlpHpVsChunkCoalesce(a1, v22, v16, &v50);
v28 = v50;
v16 = v24;
if( (_DWORD)v50 == *(unsigned __int16 *)(v22 + 32) )
{
RtlpHpVsSubsegmentCleanup(a1, v22, v26, v27);
if( !v14 )
RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), (INT64)v47);
RtlpHpVsSubsegmentFree(a1, v22, (unsigned int)v52);
if( !v14 )
RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
goto LABEL_46;
}
if( (unsigned int)v50 <= i )
break;
LODWORD(v51) = 0;
v46 = 0i64;
RtlpHpVsChunkComputeCost(v24, v22, &v51, &v46);
if( !(_DWORD)v51 )
break;
v29 = v46;
if( !v46 )
goto LABEL_26;
v30 = v46 - ((v46 >> 1) & 0x5555555555555555i64);
v25 = v30 & 0x3333333333333333i64;
v31 = (0x101010101010101i64
* (((v30 & 0x3333333333333333i64)
+ ((v30 >> 2) & 0x3333333333333333i64)
+ (((v30 & 0x3333333333333333i64) + ((v30 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
if( *(__int16 *)(v22 + 34) < 0 )
goto LABEL_26;
if( (*(_DWORD *)(a1 + 176) & 2) == 0 )
{
v25 = *(_QWORD *)(a1 + 48) >> 7;
if( v25 <= 8 )
v25 = 8i64;
if( *(_QWORD *)(a1 + 56) + (unsigned __int64)(unsigned int)v31 <= v25 )
{
LABEL_26:
v14 = v49;
break;
}
}
v51 = 0x1000000000000i64;
*(_BYTE *)(v16 + 6) = BYTE6(RtlpHpHeapGlobals) ^ BYTE6(v16) ^ 1;
*(_DWORD *)(v16 + 8) = (unsigned __int8)(RtlpHpHeapGlobals ^ v16 ^ ((unsigned int)(v16 - v22) >> 12)) | 0x200;
if( !v49 )
RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), (INT64)v47);
LODWORD(v45) = 0;
RtlpHpVsSubsegmentCommitPages(a1, v22, v29, (unsigned int)v31, v45);
v14 = v49;
if( !v49 )
RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
*(_DWORD *)(v16 + 8) &= ~0x200u;
}
if( (*(_DWORD *)(a1 + 176) & 1) != 0 && ((v16 + 32) & 0xFFF) != 0 )
{
v32 = (_WORD *)RtlpHpVsChunkAlignSplit(v25, v22, v16);
if( v32 )
RtlpHpVsFreeChunkInsert((UINT64 *)a1, v22, v32);
}
LODWORD(v50) = 0;
v51 = 0i64;
v33 = RtlpHpVsChunkComputeCost(v16, v22, &v50, &v51);
v34 = ((v51 - ((v51 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v51 - ((v51 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64);
*(_QWORD *)(a1 + 56) += (unsigned int)((0x101010101010101i64 * ((v34 + (v34 >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24;
*(_WORD *)v16 = RtlpHpHeapGlobals ^ v16 ^ (v50
+ v33
- ((0x101010101010101i64 * ((v34 + (v34 >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56));
v35 = *(_QWORD *)(a1 + 16);
if( (*(_QWORD *)(a1 + 24) & 1) != 0 && v35 )
v35 ^= a1 + 16;
v36 = 0;
if( v35 )
{
while( 1 )
{
if( ((unsigned int)RtlpHpHeapGlobals ^ (unsigned int)v16 ^ *(_DWORD *)v16) < ((unsigned int)RtlpHpHeapGlobals ^ ((_DWORD)v35 - 8) ^ *(_DWORD *)(v35 - 8)) )
{
v37 = *(_QWORD *)v35;
if( (*(_QWORD *)(a1 + 24) & 1) != 0 )
{
if( !v37 )
goto LABEL_43;
v37 ^= v35;
}
if( !v37 )
{
LABEL_43:
v36 = 0;
break;
}
}
else
{
v37 = *(_QWORD *)(v35 + 8);
if( (*(_QWORD *)(a1 + 24) & 1) != 0 )
{
if( !v37 )
goto LABEL_44;
v37 ^= v35;
}
if( !v37 )
{
LABEL_44:
v36 = 1;
break;
}
}
v35 = v37;
}
}
RtlRbInsertNodeEx((unsigned __int64 *)(a1 + 16), v35, v36, v16 + 8);
}
else
{
RtlpLogHeapFailure(8i64, a1 ^ *(_QWORD *)(a1 + 128), v16, 0i64, 0i64, 0i64);
}
LABEL_46:
;
}
while( v13 );
}
if( !v14 )
RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), (INT64)v47);
return 1i64;
}
else
{
RtlpLogHeapFailure(8i64, a1 ^ *(_QWORD *)(a1 + 128), a3, v10, 0i64, 0i64);
return 0i64;
}
}Referenced by:
ExFreeHeapPool
RtlpFreeHeapInternal
RtlpHpSegFree