ExpAcquireResourceSharedLite

INT64 __stdcall ExpAcquireResourceSharedLite(PVOID LockAddress, INT8 a2){
  INT64 CurrentThread; 
  unsigned __int64 *v5; 
  int v6; 
  unsigned __int8 CurrentIrql; 
  KSPIN_LOCK_QUEUE *v8; 
  unsigned __int8 v9; 
  int v10; 
  _KSPIN_LOCK_QUEUE *volatile Next; 
  __int16 v13; 
  unsigned int v14; 
  CHAR *v15; 
  int v16; 
  int v17; 
  _KSPIN_LOCK_QUEUE *volatile v18; 
  _KSPIN_LOCK_QUEUE *volatile v19; 
  int v20; 
  __int64 v21; 
  _KSPIN_LOCK_QUEUE *volatile v22; 
  _ETHREAD *v23; 
  int v24; 
  unsigned int v25; 
  int v26; 
  void *v27; 
  int v28; 
  __int16 v29; 
  int v30; 
  int v31; 
  unsigned __int8 v32; 
  KSPIN_LOCK_QUEUE *v33; 
  CHAR *v34; 
  CHAR *v35; 
  _KSPIN_LOCK_QUEUE *volatile v36; 
  __int64 v37; 
  CHAR *v38; 
  _QWORD *v39; 
  _KSPIN_LOCK_QUEUE *volatile v40; 
  unsigned __int8 v41; 
  UINT64 FirstEntryInelligible; 
  UINT64 a6; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  KLOCK_QUEUE_HANDLE LockQueue; 
  __int128 Object; 
  __int128 v47; 
  __int128 v48; 
  struct _KPRCB *SystemArgument1; 
  Object = 0i64;
  v47 = 0i64;
  v48 = 0i64;
  CurrentThread = (INT64)KeGetCurrentThread();
  __incgsdword(0x868Cu);
  v5 = (unsigned __int64 *)((char *)LockAddress + 96);
  v6 = 0;
  LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)((char *)LockAddress + 96);
  LockHandle.LockQueue.Next = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  *(_QWORD *)&LockHandle.OldIrql = CurrentIrql;
  v8 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)LockAddress + 12, (__int64)&LockHandle);
  if( v8 )
    KxWaitForLockOwnerShip(&LockHandle.LockQueue, v8);
  while( 1 )
  {
    if( !*((_DWORD *)LockAddress + 16) )
    {
      *((_WORD *)LockAddress + 12) = 1;
      *((_DWORD *)LockAddress + 16) = 1;
      v9 = 1;
      v10 = *((_DWORD *)LockAddress + 14) & 7;
      *((_QWORD *)LockAddress + 6) = CurrentThread;
      *((_DWORD *)LockAddress + 14) = v10 | 8;
      _m_prefetchw(&LockHandle);
      Next = LockHandle.LockQueue.Next;
      if( !LockHandle.LockQueue.Next )
      {
        if( (struct _KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                             (volatile signed __int64 *)LockHandle.LockQueue.Lock,
                                             0i64,
                                             (signed __int64)&LockHandle) == &LockHandle )
        {
LABEL_6:
          __writecr8(LockHandle.OldIrql);
          __incgsdword(0x8694u);
          __incgsdword(0x8664u);
          return v9;
        }
        Next = KxWaitForLockChainValid(&LockHandle.LockQueue);
      }
      LockHandle.LockQueue.Next = 0i64;
      _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
      goto LABEL_6;
    }
    v13 = *((_WORD *)LockAddress + 13) & 0x80;
    if( v13 )
    {
      if( *((_QWORD *)LockAddress + 6) == CurrentThread )
        break;
    }
    if( v13 )
    {
      v37 = *((_QWORD *)LockAddress + 2);
      if( v37 )
      {
        v38 = (CHAR *)(v37 + 16i64 * *(unsigned int *)(v37 + 8));
        v15 = (CHAR *)(v37 + 16);
        while( *(_QWORD *)v15 )
        {
          v15 += 16;
          if( v15 == v38 )
            goto LABEL_77;
        }
        *((_BYTE *)KeGetCurrentThread() + 649) = (__int64)(unsigned int)((_DWORD)v15 - *((_DWORD *)LockAddress + 4)) >> 4;
LABEL_11:
        if( *(_QWORD *)v15 != CurrentThread )
        {
          v16 = *((_DWORD *)LockAddress + 16);
          if( !v16 || *((char *)LockAddress + 26) >= 0 && !*((_DWORD *)LockAddress + 19) )
          {
            *((_WORD *)LockAddress + 12) = 1;
            *((_DWORD *)LockAddress + 16) = v16 + 1;
            v17 = *((_DWORD *)v15 + 2) & 7;
            *(_QWORD *)v15 = CurrentThread;
            *((_DWORD *)v15 + 2) = v17 | 8;
            _m_prefetchw(&LockHandle);
            v18 = LockHandle.LockQueue.Next;
            if( !LockHandle.LockQueue.Next )
            {
              if( (struct _KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                                   (volatile signed __int64 *)LockHandle.LockQueue.Lock,
                                                   0i64,
                                                   (signed __int64)&LockHandle) == &LockHandle )
              {
LABEL_17:
                __writecr8(LockHandle.OldIrql);
                __incgsdword(0x8694u);
                __incgsdword(0x8664u);
                return 1;
              }
              v18 = KxWaitForLockChainValid(&LockHandle.LockQueue);
            }
            LockHandle.LockQueue.Next = 0i64;
            _InterlockedXor64((volatile signed __int64 *)&v18->Lock, 1ui64);
            goto LABEL_17;
          }
          if( !a2 )
          {
            KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
            __writecr8(LockHandle.OldIrql);
            __incgsdword(0x86A0u);
            return 0;
          }
          v20 = *((_DWORD *)v15 + 2);
          *(_QWORD *)v15 = CurrentThread;
          *((_DWORD *)v15 + 2) = v20 & 7 | 8;
          ++*((_DWORD *)LockAddress + 18);
          *((_QWORD *)&v48 + 1) = &v48;
          *(_QWORD *)&v48 = &v48;
          v21 = *((_QWORD *)LockAddress + 4);
          *((_QWORD *)&Object + 1) = 0i64;
          *((_QWORD *)&v47 + 1) = 393217i64;
          *(_QWORD *)&v47 = CurrentThread;
          if( v21 )
          {
            v39 = *(_QWORD **)(v21 + 8);
            if( *v39 != v21 )
              __fastfail(3u);
            *((_QWORD *)&Object + 1) = *(_QWORD *)(v21 + 8);
            *(_QWORD *)&Object = v21;
            *v39 = &Object;
            *(_QWORD *)(v21 + 8) = &Object;
          }
          else
          {
            *((_QWORD *)&Object + 1) = &Object;
            *(_QWORD *)&Object = &Object;
          }
          *((_QWORD *)LockAddress + 4) = &Object;
          _m_prefetchw(&LockHandle);
          v22 = LockHandle.LockQueue.Next;
          if( !LockHandle.LockQueue.Next )
          {
            if( (struct _KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                                 (volatile signed __int64 *)LockHandle.LockQueue.Lock,
                                                 0i64,
                                                 (signed __int64)&LockHandle) == &LockHandle )
              goto LABEL_28;
            v22 = KxWaitForLockChainValid(&LockHandle.LockQueue);
          }
          LockHandle.LockQueue.Next = 0i64;
          _InterlockedXor64((volatile signed __int64 *)&v22->Lock, 1ui64);
LABEL_28:
          __writecr8(LockHandle.OldIrql);
          __incgsdword(0x869Cu);
          v23 = (_ETHREAD *)KeGetCurrentThread();
          v24 = 0;
          v25 = (*((_DWORD *)v23 + 324) >> 9) & 7;
          if( (*(_DWORD *)(*((_QWORD *)v23 + 68) + 1124i64) & 0x100000) != 0 )
          {
            v25 = 0;
          }
          else if( v25 >= 2 )
          {
            goto LABEL_30;
          }
          if( v23 == (_ETHREAD *)KeGetCurrentThread() && *((_DWORD *)v23 + 340) )
          {
LABEL_31:
            if( (*((_BYTE *)LockAddress + 26) & 4) == 0 )
              v24 = 4;
          }
          else
          {
LABEL_30:
            if( v25 > 1 )
              goto LABEL_31;
          }
          v26 = v24 | 2;
          if( (*((_WORD *)LockAddress + 13) & 2) != 0 )
            v26 = v24;
          v27 = (void *)HIBYTE(*((unsigned __int16 *)LockAddress + 13));
          v28 = v26 | 0xFF00;
          if( *((char *)v23 + 195) <= (int)v27 )
            v28 = v26;
          if( v28 )
            ExpApplyPriorityBoost((__int64)LockAddress, v28, (__int64)v23, v27);
          ExpWaitForResource((ERESOURCE *)LockAddress, &Object);
          if( (CurrentThread & 3) == 0 )
            v6 = *(unsigned __int8 *)(CurrentThread + 649);
          v29 = *((_WORD *)LockAddress + 13);
          memset(&LockQueue, 0, sizeof(LockQueue));
          if( (v29 & 8) == 0 )
          {
            v30 = 0;
            if( (v29 & 4) != 0
              && ((*(_DWORD *)(*(_QWORD *)(CurrentThread + 544) + 1124i64) & 0x100000) != 0
               || (*(_DWORD *)(CurrentThread + 1296) & 0xE00u) < 0x400) )
            {
              v30 = 4;
            }
            v31 = v30 | 2;
            if( (v29 & 2) == 0 )
              v31 = v30;
            if( v31 )
            {
              LockQueue.LockQueue.Lock = v5;
              LockQueue.LockQueue.Next = 0i64;
              v32 = KeGetCurrentIrql();
              __writecr8(2ui64);
              LockQueue.OldIrql = v32;
              v33 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)v5, (__int64)&LockQueue);
              if( v33 )
                KxWaitForLockOwnerShip(&LockQueue.LockQueue, v33);
              LODWORD(a6) = v6;
              LODWORD(FirstEntryInelligible) = 1;
              v34 = ExpFindCurrentThread(
                      (ERESOURCE *)LockAddress,
                      CurrentThread,
                      &LockQueue,
                      0i64,
                      FirstEntryInelligible,
                      a6);
              v35 = v34;
              if( (v31 & 4) != 0 )
              {
                if( (*((_DWORD *)v34 + 2) & 1) != 0 )
                {
                  v31 &= ~4u;
                }
                else
                {
                  PsBoostThreadIoEx(CurrentThread, 0, 0, 0i64);
                  *((_DWORD *)v35 + 2) |= 1u;
                }
              }
              if( (v31 & 2) != 0 )
              {
                if( (*((_DWORD *)v35 + 2) & 4) != 0 )
                {
                  v31 &= ~2u;
                }
                else
                {
                  if( _InterlockedIncrement((volatile signed __int32 *)(CurrentThread + 1364)) == 1
                    && *(_BYTE *)(CurrentThread + 793) )
                  {
                    v41 = KeGetCurrentIrql();
                    __writecr8(2ui64);
                    SystemArgument1 = KeGetCurrentPrcb();
                    if( (unsigned int)KiAbThreadInsertList(
                                         (_KTHREAD *)CurrentThread,
                                         (_SINGLE_LIST_ENTRY *)SystemArgument1 + 4335,
                                         (_SINGLE_LIST_ENTRY *)(CurrentThread + 808)) )
                      KiAbQueueAutoBoostDpc(SystemArgument1);
                    __writecr8(v41);
                  }
                  *((_DWORD *)v35 + 2) |= 4u;
                }
              }
              _m_prefetchw(&LockQueue);
              v36 = LockQueue.LockQueue.Next;
              if( !LockQueue.LockQueue.Next )
              {
                if( (KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                             (volatile signed __int64 *)LockQueue.LockQueue.Lock,
                                             0i64,
                                             (signed __int64)&LockQueue) == &LockQueue )
                {
LABEL_58:
                  __writecr8(LockQueue.OldIrql);
                  if( v31 )
                  {
                    if( (v31 & 4) != 0 )
                      IoBoostThreadIoPriority((KSPIN_LOCK *)CurrentThread, 2, 0);
                    if( (v31 & 2) != 0 && *(_DWORD *)(CurrentThread + 1368) )
                      IoBoostThreadOutstandingIo(CurrentThread);
                  }
                  goto LABEL_64;
                }
                v36 = KxWaitForLockChainValid(&LockQueue.LockQueue);
              }
              LockQueue.LockQueue.Next = 0i64;
              _InterlockedXor64((volatile signed __int64 *)&v36->Lock, 1ui64);
              goto LABEL_58;
            }
          }
LABEL_64:
          __incgsdword(0x8694u);
          __incgsdword(0x8664u);
          return 1;
        }
        *((_DWORD *)v15 + 2) += 8;
        _m_prefetchw(&LockHandle);
        v40 = LockHandle.LockQueue.Next;
        if( !LockHandle.LockQueue.Next )
        {
          if( (struct _KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                               (volatile signed __int64 *)LockHandle.LockQueue.Lock,
                                               0i64,
                                               (signed __int64)&LockHandle) == &LockHandle )
          {
LABEL_75:
            __writecr8(LockHandle.OldIrql);
            __incgsdword(0x8698u);
            __incgsdword(0x8664u);
            return 1;
          }
          v40 = KxWaitForLockChainValid(&LockHandle.LockQueue);
        }
        LockHandle.LockQueue.Next = 0i64;
        _InterlockedXor64((volatile signed __int64 *)&v40->Lock, 1ui64);
        goto LABEL_75;
      }
LABEL_77:
      ExpExpandResourceOwnerTable((ERESOURCE *)LockAddress, &LockHandle);
    }
    else
    {
      LODWORD(a6) = ExpGetThreadResourceHint(CurrentThread);
      LODWORD(FirstEntryInelligible) = *((_DWORD *)LockAddress + 19) != 0;
      v15 = ExpFindCurrentThread((ERESOURCE *)LockAddress, CurrentThread, &LockHandle, v14, FirstEntryInelligible, a6);
      if( v15 )
        goto LABEL_11;
    }
  }
  *((_DWORD *)LockAddress + 14) += 8;
  _m_prefetchw(&LockHandle);
  v19 = LockHandle.LockQueue.Next;
  if( !LockHandle.LockQueue.Next )
  {
    if( (struct _KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                         (volatile signed __int64 *)LockHandle.LockQueue.Lock,
                                         0i64,
                                         (signed __int64)&LockHandle) == &LockHandle )
      goto LABEL_22;
    v19 = KxWaitForLockChainValid(&LockHandle.LockQueue);
  }
  LockHandle.LockQueue.Next = 0i64;
  _InterlockedXor64((volatile signed __int64 *)&v19->Lock, 1ui64);
LABEL_22:
  __writecr8(LockHandle.OldIrql);
  __incgsdword(0x8690u);
  __incgsdword(0x8664u);
  return 1;
}

Referenced by:

ExAcquireResourceSharedLite
ExEnterCriticalRegionAndAcquireResourceShared
ExEnterPriorityRegionAndAcquireResourceShared
SeSecurityAttributePresent
SepMandatoryIntegrityCheck