ExpWaitForSpinLockSharedAndAcquire
UINT64 __stdcall ExpWaitForSpinLockSharedAndAcquire(INT64 *SpinLock, UINT8 OldIrql){
unsigned int v2;
signed __int32 v4;
bool v6;
signed __int32 v7;
v2 = 0;
do
{
v4 = *(_DWORD *)SpinLock;
while( v4 < 0 )
{
if( (v4 & 0x40000000) == 0 )
{
v7 = _InterlockedCompareExchange((volatile signed __int32 *)SpinLock, v4 | 0x40000000, v4);
v6 = v4 == v7;
v4 = v7;
if( !v6 )
continue;
}
if( OldIrql != 0xFF )
__writecr8(OldIrql);
++v2;
_mm_pause();
if( OldIrql != 0xFF )
{
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
v4 = *(_DWORD *)SpinLock;
}
}
while( v4 != _InterlockedCompareExchange((volatile signed __int32 *)SpinLock, (v4 + 1) & 0xBFFFFFFF, v4) );
return v2;
}Referenced by:
ExAcquireSpinLockShared
ExAcquireSpinLockSharedAtDpcLevel
ExFreeHeapPool
ExpAcquireSpinLockSharedAtDpcLevelInstrumented
ExpAddTagForBigPages
MiLockWorkingSetShared
MiMakeHyperRangeAccessible
MiMakeSystemCacheRangeValid
MiMoveDirtyBitsToPfns
MiOffsetToProtos
MiProbeAndLockPrepare
MiSetProtectionOnSection
MiSynchronizeSystemVa
MiTrimOrAgeWorkingSet
MiUserFault