RtlpHpLargeAllocSetExtraPresent
CHAR __fastcall RtlpHpLargeAllocSetExtraPresent(INT64 a1, UINT64 a2, CHAR a3){
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
LOBYTE(v6) = RtlpHpLargeLockAcquireShared(a1, a3);
v7 = (unsigned __int8)v6;
v8 = *(_QWORD *)(a1 + 72);
if( (*(_BYTE *)(a1 + 80) & 1) != 0 )
{
if( v8 )
v8 ^= a1 + 72;
else
v8 = 0i64;
}
while( v8 )
{
v6 = *(_QWORD *)(v8 + 24) & 0xFFFFFFFFFFFF0000ui64;
if( a2 < v6 )
{
v6 = *(_QWORD *)v8;
}
else
{
if( a2 <= v6 )
goto LABEL_16;
v6 = *(_QWORD *)(v8 + 8);
}
if( (*(_BYTE *)(a1 + 80) & 1) != 0 && v6 )
v8 ^= v6;
else
v8 = v6;
}
v8 = 0i64;
LABEL_16:
if( (a3 & 1) == 0 )
{
if( (*(_DWORD *)a1 & 1) != 0 )
{
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(a1 + 64));
LOBYTE(v6) = KiIrqlFlags;
__writecr8(v7);
}
else
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 64), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(a1 + 64));
KeAbPostRelease((PVOID)(a1 + 64));
LOBYTE(v6) = KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
}
*(_QWORD *)(v8 + 32) |= 1ui64;
return v6;
}Referenced by:
RtlpHpExtrasSetPresent