ExpTryExpandAutoExpandPushLock

VOID __stdcall ExpTryExpandAutoExpandPushLock(_EX_PUSH_LOCK_AUTO_EXPAND *Lock){
  UINT64 v1; 
  signed __int32 Value; 
  VOID *FannedOutPushLock; 

  _m_prefetchw(&Lock->State);
  Value = Lock->State.Value;
  if( (Value & 3) == 0
    && Value == _InterlockedCompareExchange((volatile signed __int32 *)&Lock->State, Value | 2, Value) )
  {
    FannedOutPushLock = ExpAllocateFannedOutPushLock(Lock, (Value & 4) == 0, v1);
    if( FannedOutPushLock == (VOID *)-1i64 )
    {
      Lock->Stats = (Lock->Stats >> 2) & 0x3FF33FFF;
      Lock->State.Value = Value & 0xFFFFFFFD;
    }
    else
    {
      Lock->State.Value = (unsigned int)FannedOutPushLock ^ ((unsigned __int8)Value ^ (unsigned __int8)FannedOutPushLock) & 4 | 1;
    }
  }
}

Referenced by:

ExReleaseAutoExpandPushLockShared