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.