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