RtlpHpLfhOwnerCompact
NTSTATUS __stdcall RtlpHpLfhOwnerCompact(INT64 a1, INT64 a2, UINT64 a3){
unsigned int v3;
__int64 v6;
__int64 v7;
_QWORD **v8;
_EX_PUSH_LOCK *v9;
UINT8 v10;
_QWORD *v11;
unsigned __int64 v12;
_QWORD *v13;
v3 = a3;
if( (*(_BYTE *)a2 & 1) != 0 && *(_BYTE *)(a2 + 2) )
{
v6 = 0i64;
v7 = *(unsigned __int8 *)(a2 + 2);
do
{
RtlpHpLfhOwnerCompact(a1, *(_QWORD *)(*(_QWORD *)(a2 + 96) + v6), v3);
v6 += 8i64;
--v7;
}
while( v7 );
}
v8 = (_QWORD **)(a2 + 24);
if( *v8 != v8 || (v13 = (_QWORD *)(a2 + 40), (_QWORD *)*v13 != v13) )
{
v9 = (_EX_PUSH_LOCK *)(a2 + 16);
v10 = RtlpHpAcquireLockShared(v9, *(unsigned __int8 *)(a1 + 57));
v11 = *v8;
v12 = v10;
while( v11 != v8 )
{
RtlpHpLfhSubsegmentDecommitPages(a1, (INT64)v11, 0xFFFFFFFFi64, 1ui64, v3);
v11 = (_QWORD *)*v11;
}
if( *(_BYTE *)(a1 + 57) )
{
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v9);
LODWORD(v13) = KiIrqlFlags;
__writecr8(v12);
}
else
{
if( _InterlockedCompareExchange64(&v9->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v9);
KeAbPostRelease(v9);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
}
return(int)v13;
}Referenced by:
RtlpHpLfhContextCompact
RtlpHpLfhOwnerCompact