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