ExTryAcquireCacheAwarePushLockExclusiveEx
UINT8 __stdcall ExTryAcquireCacheAwarePushLockExclusiveEx(_EX_PUSH_LOCK_CACHE_AWARE_LEGACY *PushLock, UINT64 Flags){
_EX_PUSH_LOCK_CACHE_AWARE_LEGACY *v3;
volatile signed __int32 **v4;
_BYTE *v5;
volatile signed __int32 *v7;
if( (Flags & 0xFFFFFFFC) != 0 )
KeBugCheckEx(0x152u, (PVOID)(unsigned int)Flags, PushLock, 0i64, 0i64);
v3 = PushLock + 64;
v4 = (volatile signed __int32 **)PushLock;
if( (Flags & 2) != 0 )
v5 = 0i64;
else
v5 = KeAbPreAcquire(PushLock, 0i64, 1ui64);
if( PushLock >= v3 )
{
LABEL_9:
if( v5 )
v5[26] |= 1u;
return 1;
}
else
{
while( !_interlockedbittestandset64(*v4, 0i64) )
{
if( ++v4 >= (volatile signed __int32 **)v3 )
goto LABEL_9;
}
while( v4 != (volatile signed __int32 **)PushLock )
{
v7 = *--v4;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)*v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v7);
}
if( v5 )
KeAbPostReleaseEx(PushLock, v5);
return 0;
}
}Referenced by:
No references.