ExTryAcquireAutoExpandPushLockExclusive

INT64 __fastcall ExTryAcquireAutoExpandPushLockExclusive(
        _CM_KEY_BODY *OrigKeyBody,
        _CM_KEY_BODY *VirtualKeyBody,
        _KEY_VALUE_ENTRY *ValueEntries,
        UINT64 EntryCount,
        VOID *ValueBuffer,
        UINT64 *BufferLength,
        UINT64 *ResultLength){
  _BYTE *v7; 
  INT64 result; 
  int KeyControlBlock; 
  UINT8 v11; 
  UINT64 StatsValue; 
  v7 = 0i64;
  if( ((unsigned int)VirtualKeyBody & 0xFFFFFFFC) != 0 )
    KeBugCheckEx(0x152u, (unsigned int)VirtualKeyBody, (ULONG_PTR)OrigKeyBody, 0i64, 0i64);
  if( ((unsigned __int8)VirtualKeyBody & 2) == 0 )
  {
    LODWORD(result) = KeAbPreAcquire(OrigKeyBody, 0i64, 1ui64);
    v7 = (_BYTE *)result;
  }
  if( _interlockedbittestandset64((volatile signed __int32 *)OrigKeyBody, 0i64) )
  {
    LODWORD(StatsValue) = HIDWORD(OrigKeyBody->KeyControlBlock);
    v11 = 0;
    if( ExpAeUpdateStatsForExclusiveRelease(&StatsValue) )
    {
      result = (unsigned int)StatsValue;
      HIDWORD(OrigKeyBody->KeyControlBlock) = StatsValue;
    }
  }
  else
  {
    KeyControlBlock = (int)OrigKeyBody->KeyControlBlock;
    v11 = 1;
    if( (KeyControlBlock & 1) != 0 )
    {
      v11 = ExpTryAcquireFannedOutPushLockExclusive((PVOID)(KeyControlBlock & 0xFFFFFFF8));
      if( !v11 && (_InterlockedExchangeAdd64((volatile signed __int64 *)OrigKeyBody, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)OrigKeyBody);
    }
  }
  if( v7 )
  {
    if( v11 )
      v7[26] |= 1u;
    else
      KeAbPostReleaseEx(OrigKeyBody, v7);
  }
  LOBYTE(result) = v11;
  return result;
}

Referenced by:

No references.