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