ExTryConvertSharedSpinLockExclusive
UINT64 __stdcall ExTryConvertSharedSpinLockExclusive(INT64 *SpinLock){
signed __int32 v2;
signed __int32 v3;
bool v5;
signed __int32 v6;
UINT64 SpinCount;
if( _interlockedbittestandset((volatile signed __int32 *)SpinLock, 0x1Fu) )
return 0i64;
v2 = *(_DWORD *)SpinLock;
v3 = *(_DWORD *)SpinLock;
LODWORD(SpinCount) = 0;
if( (v3 & 0xBFFFFFFF) != -2147483647 )
{
do
{
if( (v2 & 0x40000000) == 0 )
{
v6 = _InterlockedCompareExchange((volatile signed __int32 *)SpinLock, v2 | 0x40000000, v2);
v5 = v2 == v6;
v2 = v6;
if( !v5 )
continue;
}
KeYieldProcessorEx(&SpinCount);
v2 = *(_DWORD *)SpinLock;
}
while( (v2 & 0xBFFFFFFF) != -2147483647 );
}
return 1i64;
}Referenced by:
ExpAddTagForBigPages
ViDeadlockDetectionTryConvertSharedToExclusive