ExTryAcquireAutoExpandPushLockShared
VOID *__stdcall ExTryAcquireAutoExpandPushLockShared(_EX_PUSH_LOCK_AUTO_EXPAND *Lock, UINT64 Flags){
_BYTE *v2;
unsigned __int64 v3;
int v5;
unsigned int Value;
v2 = 0i64;
v3 = 0i64;
if( (Flags & 0xFFFFFFFC) != 0 )
KeBugCheckEx(0x152u, (PVOID)(unsigned int)Flags, Lock, 0i64, 0i64);
v5 = Flags & 2;
if( (Flags & 2) == 0 )
v2 = KeAbPreAcquire(Lock, 0i64, 1ui64);
Value = Lock->State.Value;
if( (Value & 1) != 0 )
{
v3 = (unsigned __int64)ExpTryAcquireFannedOutPushLockShared((VOID *)(Value & 0xFFFFFFF8));
}
else if( !_InterlockedCompareExchange64(&Lock->LocalLock._bf_0, 17i64, 0i64)
|| ExfTryAcquirePushLockShared(&Lock->LocalLock) )
{
v3 = (unsigned __int64)Lock | 1;
}
if( !v5 && v3 )
v3 |= 2ui64;
if( v2 )
{
if( v3 )
v2[26] |= 1u;
else
KeAbPostReleaseEx(Lock, v2);
}
return(VOID *)v3;
}Referenced by:
No references.