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.