ExpAcquireResourceExclusiveLite

VOID __stdcall ExpAcquireResourceExclusiveLite(VOID *LockAddress, INT8 a2){
  _ETHREAD *CurrentThread; 
  unsigned __int64 *v5; 
  unsigned __int8 CurrentIrql; 
  int v7; 
  _KSPIN_LOCK_QUEUE *volatile Next; 
  __int64 *v9; 
  __int64 ***v10; 
  _KSPIN_LOCK_QUEUE *volatile v11; 
  _ETHREAD *v12; 
  int v13; 
  unsigned int v14; 
  unsigned int v15; 
  UINT64 v16; 
  __int16 v17; 
  int v18; 
  int v19; 
  unsigned __int8 v20; 
  _OWNER_ENTRY *v21; 
  _OWNER_ENTRY *v22; 
  _KSPIN_LOCK_QUEUE *volatile v23; 
  _KSPIN_LOCK_QUEUE *volatile v24; 
  int v25; 
  void(__fastcall **ExtensionTable)(_ETHREAD *); 
  UINT64 FirstEntryInelligible; 
  _KLOCK_QUEUE_HANDLE v28; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  __int64 *Object; 
  __int64 **p_Object; 
  _ETHREAD *v32; 
  __int64 v33; 
  __int64 v34[8]; 
  unsigned __int8 v35; 
  _KPRCB *Prcb; 

  p_Object = 0i64;
  BYTE3(v33) = 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  __incgsdword(0x8678u);
  v5 = (unsigned __int64 *)((char *)LockAddress + 96);
  v28.LockQueue.Lock = (unsigned __int64 *volatile)((char *)LockAddress + 96);
  v28.LockQueue.Next = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  *(_QWORD *)&v28.OldIrql = CurrentIrql;
  if( _InterlockedExchange64((volatile __int64 *)LockAddress + 12, (__int64)&v28) )
    KxWaitForLockOwnerShip((INT64)&v28);
  if( !*((_DWORD *)LockAddress + 16) )
  {
    *((_QWORD *)LockAddress + 6) = CurrentThread;
    *((_WORD *)LockAddress + 12) = 1;
    *((_WORD *)LockAddress + 13) |= 0x80u;
    v7 = *((_DWORD *)LockAddress + 14) & 7;
    *((_DWORD *)LockAddress + 16) = 1;
    *((_DWORD *)LockAddress + 14) = v7 | 8;
    _m_prefetchw(&v28);
    Next = v28.LockQueue.Next;
    if( !v28.LockQueue.Next )
    {
      if( (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                    (volatile signed __int64 *)v28.LockQueue.Lock,
                                    0i64,
                                    (signed __int64)&v28) == &v28 )
      {
LABEL_6:
        __writecr8(v28.OldIrql);
        __incgsdword(0x867Cu);
        __incgsdword(0x8664u);
        return;
      }
      Next = KxWaitForLockChainValid(&v28.LockQueue);
    }
    v28.LockQueue.Next = 0i64;
    _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
    goto LABEL_6;
  }
  if( *((char *)LockAddress + 26) < 0 && *((_ETHREAD **)LockAddress + 6) == CurrentThread )
  {
    *((_DWORD *)LockAddress + 14) += 8;
    _m_prefetchw(&v28);
    v24 = v28.LockQueue.Next;
    if( !v28.LockQueue.Next )
    {
      if( (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                    (volatile signed __int64 *)v28.LockQueue.Lock,
                                    0i64,
                                    (signed __int64)&v28) == &v28 )
      {
LABEL_51:
        __writecr8(v28.OldIrql);
        __incgsdword(0x8680u);
        __incgsdword(0x8664u);
        return;
      }
      v24 = KxWaitForLockChainValid(&v28.LockQueue);
    }
    v28.LockQueue.Next = 0i64;
    _InterlockedXor64((volatile signed __int64 *)&v24->Lock, 1ui64);
    goto LABEL_51;
  }
  if( a2 )
  {
    ++*((_DWORD *)LockAddress + 19);
    v34[1] = (__int64)v34;
    v34[0] = (__int64)v34;
    v9 = (__int64 *)*((_QWORD *)LockAddress + 5);
    Object = 0i64;
    p_Object = 0i64;
    v33 = 393217i64;
    v32 = CurrentThread;
    if( v9 )
    {
      v10 = (__int64 ***)v9[1];
      if( *v10 != (__int64 **)v9 )
        __fastfail(3u);
      p_Object = (__int64 **)v9[1];
      Object = v9;
      *v10 = &Object;
      v9[1] = (__int64)&Object;
    }
    else
    {
      p_Object = &Object;
      Object = (__int64 *)&Object;
      *((_QWORD *)LockAddress + 5) = &Object;
    }
    _m_prefetchw(&v28);
    v11 = v28.LockQueue.Next;
    if( !v28.LockQueue.Next )
    {
      if( (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                    (volatile signed __int64 *)v28.LockQueue.Lock,
                                    0i64,
                                    (signed __int64)&v28) == &v28 )
        goto LABEL_15;
      v11 = KxWaitForLockChainValid(&v28.LockQueue);
    }
    v28.LockQueue.Next = 0i64;
    _InterlockedXor64((volatile signed __int64 *)&v11->Lock, 1ui64);
LABEL_15:
    __writecr8(v28.OldIrql);
    __incgsdword(0x8684u);
    v12 = (_ETHREAD *)KeGetCurrentThread();
    v13 = 0;
    v14 = (v12->CrossThreadFlags >> 9) & 7;
    if( (v12->Tcb.Process->Flags & 0x100000) != 0 )
    {
      v14 = 0;
    }
    else if( v14 >= 2 )
    {
      goto LABEL_17;
    }
    if( v12 == (_ETHREAD *)KeGetCurrentThread() && v12->IoBoostCount )
    {
LABEL_18:
      if( (*((_BYTE *)LockAddress + 26) & 4) == 0 )
        v13 = 4;
LABEL_20:
      v15 = v13 | 2;
      if( (*((_WORD *)LockAddress + 13) & 2) != 0 )
        v15 = v13;
      v16 = v15 | 0xFF00;
      if( v12->Tcb.Priority <= HIBYTE(*((unsigned __int16 *)LockAddress + 13)) )
        v16 = v15;
      if( (_DWORD)v16 )
        ExpApplyPriorityBoost((_ERESOURCE *)LockAddress, v16, v12);
      ExpWaitForResource((_ERESOURCE *)LockAddress, &Object);
      v17 = *((_WORD *)LockAddress + 13);
      memset(&LockHandle, 0, sizeof(LockHandle));
      if( (v17 & 8) != 0 )
        goto LABEL_48;
      v18 = 0;
      if( (v17 & 4) != 0
        && ((CurrentThread->Tcb.Process->Flags & 0x100000) != 0 || (CurrentThread->CrossThreadFlags & 0xE00) < 0x400) )
      {
        v18 = 4;
      }
      v19 = v18 | 2;
      if( (v17 & 2) == 0 )
        v19 = v18;
      if( !v19 )
        goto LABEL_48;
      LockHandle.LockQueue.Lock = v5;
      LockHandle.LockQueue.Next = 0i64;
      v20 = KeGetCurrentIrql();
      __writecr8(2ui64);
      LockHandle.OldIrql = v20;
      if( _InterlockedExchange64((volatile __int64 *)v5, (__int64)&LockHandle) )
        KxWaitForLockOwnerShip((INT64)&LockHandle);
      LODWORD(FirstEntryInelligible) = 1;
      v21 = ExpFindCurrentThread(
              (_ERESOURCE *)LockAddress,
              (UINT64)CurrentThread,
              &LockHandle,
              0i64,
              FirstEntryInelligible);
      v22 = v21;
      if( (v19 & 4) != 0 )
      {
        if( (v21->_bf_0 & 1) != 0 )
        {
          v19 &= ~4u;
        }
        else
        {
          PsBoostThreadIoEx(CurrentThread, 0, 0, 0i64);
          v22->_bf_0 |= 1u;
        }
      }
      if( (v19 & 2) != 0 )
      {
        if( (v22->_bf_0 & 4) != 0 )
        {
          v19 &= ~2u;
        }
        else
        {
          if( _InterlockedIncrement((volatile signed __int32 *)&CurrentThread->IoQoSBoostCount) == 1
            && CurrentThread->Tcb.AbWaitEntryCount )
          {
            v35 = KeGetCurrentIrql();
            __writecr8(2ui64);
            Prcb = KeGetCurrentPrcb();
            KiAbThreadInsertList(CurrentThread, &Prcb->AbPropagateBoostsList, &CurrentThread->Tcb.PropagateBoostsEntry);
            if( v25 )
              KiAbQueueAutoBoostDpc(Prcb);
            __writecr8(v35);
          }
          v22->_bf_0 |= 4u;
        }
      }
      _m_prefetchw(&LockHandle);
      v23 = LockHandle.LockQueue.Next;
      if( !LockHandle.LockQueue.Next )
      {
        if( (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                      (volatile signed __int64 *)LockHandle.LockQueue.Lock,
                                      0i64,
                                      (signed __int64)&LockHandle) == &LockHandle )
          goto LABEL_43;
        v23 = KxWaitForLockChainValid(&LockHandle.LockQueue);
      }
      LockHandle.LockQueue.Next = 0i64;
      _InterlockedXor64((volatile signed __int64 *)&v23->Lock, 1ui64);
LABEL_43:
      __writecr8(LockHandle.OldIrql);
      if( v19 )
      {
        if( (v19 & 4) != 0 )
          IoBoostThreadIoPriority(CurrentThread, IoPriorityNormal, 0i64);
        if( (v19 & 2) != 0 && CurrentThread->IoQoSThrottleCount )
        {
          ExtensionTable = (void(__fastcall **)(_ETHREAD *))ExGetExtensionTable(*(&stru_140C452E0 + 122));
          if( ExtensionTable )
          {
            ExtensionTable[2](CurrentThread);
            ExReleaseRundownProtection((_EX_RUNDOWN_REF *)(*(&stru_140C452E0 + 122) + 64i64));
          }
        }
      }
LABEL_48:
      __incgsdword(0x867Cu);
      __incgsdword(0x8664u);
      return;
    }
LABEL_17:
    if( v14 <= 1 )
      goto LABEL_20;
    goto LABEL_18;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&v28);
  __writecr8(v28.OldIrql);
  __incgsdword(0x8688u);
}

Referenced by:

ExEnterCriticalRegionAndAcquireResourceExclusive