RtlpHpLargeAllocSize
UINT64 __stdcall RtlpHpLargeAllocSize(INT64 a1, UINT64 a2, CHAR a3, INT64 *a4){
unsigned __int64 v8;
__int64 v9;
unsigned __int64 v10;
__int64 v11;
UINT64 v12;
int v13;
int v15[18];
v8 = RtlpHpLargeLockAcquireShared(a1, a3);
v9 = *(_QWORD *)(a1 + 72);
if( (*(_BYTE *)(a1 + 80) & 1) != 0 )
{
if( v9 )
v9 ^= a1 + 72;
else
v9 = 0i64;
}
while( v9 )
{
v10 = *(_QWORD *)(v9 + 24) & 0xFFFFFFFFFFFF0000ui64;
if( a2 < v10 )
{
v11 = *(_QWORD *)v9;
}
else
{
if( a2 <= v10 )
goto LABEL_16;
v11 = *(_QWORD *)(v9 + 8);
}
if( (*(_BYTE *)(a1 + 80) & 1) != 0 && v11 )
v9 ^= v11;
else
v9 = v11;
}
v9 = 0i64;
LABEL_16:
if( v9 )
{
if( a4 )
{
if( (*(_BYTE *)(v9 + 32) & 1) != 0 )
{
_InterlockedOr(v15, 0);
v13 = 1;
}
else
{
v13 = 0;
}
*(_DWORD *)a4 = v13;
}
v12 = (*(_QWORD *)(v9 + 32) & 0xFFFFFFFFFFFFF000ui64) - (unsigned __int16)*(_DWORD *)(v9 + 24);
}
else
{
v12 = -1i64;
}
if( (a3 & 1) == 0 )
{
if( (*(_DWORD *)a1 & 1) != 0 )
{
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(a1 + 64));
__writecr8(v8);
}
else
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 64), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)(a1 + 64));
KeAbPostRelease((VOID *)(a1 + 64));
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
}
return v12;
}Referenced by:
RtlpHpSizeHeapInternal