ExIsResourceAcquiredSharedLite

ULONG __stdcall ExIsResourceAcquiredSharedLite(PERESOURCE Resource){
  WORK_QUEUE_TYPE v1; 
  void *v2; 
  unsigned __int16 Flag; 
  ULONG v5; 
  _ETHREAD *CurrentThread; 
  __int64 v8; 
  unsigned __int8 v9; 
  _OWNER_ENTRY *OwnerTable; 
  unsigned int TableSize; 
  int v12; 
  bool v13; 
  unsigned int v14; 
  unsigned __int8 CurrentIrql; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  Flag = Resource->Flag;
  if( (Flag & 0x41) == 1 )
    KeBugCheckEx(0x1C6u, 0xFui64, (ULONG_PTR)Resource, 0i64, 0i64);
  if( (Flag & 1) != 0 )
  {
    CurrentIrql = KeGetCurrentIrql();
    if( CurrentIrql > 2u )
      KeBugCheckEx(0x1C6u, 0i64, CurrentIrql, 2ui64, 0i64);
  }
  if( (Flag & 1) == 0 )
  {
    memset(&LockHandle, 0, sizeof(LockHandle));
    if( !Resource->ActiveEntries )
      return 0;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    if( (_ETHREAD *)Resource->OwnerEntry.OwnerThread == CurrentThread )
      return Resource->OwnerEntry.TableSize >> 3;
    v5 = 0;
    if( (Flag & 0x80u) != 0 )
      return v5;
    v8 = *((unsigned __int8 *)CurrentThread + 649);
    LockHandle.LockQueue.Lock = &Resource->SpinLock;
    LockHandle.LockQueue.Next = 0i64;
    v9 = KeGetCurrentIrql();
    __writecr8(2ui64);
    LockHandle.OldIrql = v9;
    KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)&Resource->SpinLock, v1, v2);
    OwnerTable = Resource->OwnerTable;
    if( OwnerTable )
    {
      TableSize = OwnerTable->TableSize;
      if( (unsigned int)v8 < TableSize && (_ETHREAD *)OwnerTable[v8].OwnerThread == CurrentThread )
      {
        v14 = OwnerTable[v8].TableSize;
LABEL_19:
        v5 = v14 >> 3;
        goto LABEL_17;
      }
      v12 = 1;
      if( TableSize > 1 )
      {
        while( 1 )
        {
          v13 = OwnerTable[1].OwnerThread == (_QWORD)CurrentThread;
          ++OwnerTable;
          if( v13 )
            break;
          if( ++v12 >= TableSize )
            goto LABEL_17;
        }
        v14 = OwnerTable->TableSize;
        goto LABEL_19;
      }
    }
LABEL_17:
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    return v5;
  }
  return ExpFastResourceLegacyIsAcquiredShared((INT64)Resource);
}

Referenced by:

CmLoadDifferencingKey
CmPostCallbackNotification
CmPostCallbackNotificationEx
CmUnloadKey
CmpDeleteKeyObject
CmpDoQueryKeyName
CmpDoReOpenTransKey
CmpParseKey
CmpSecurityMethod
FsRtlAcquireFileForCcFlushEx
NtDeleteKey
NtDeleteValueKey
NtEnumerateKey
NtEnumerateValueKey
NtFlushKey
NtQueryKey
NtQueryMultipleValueKey
NtQueryValueKey
NtRenameKey
NtReplaceKey
NtRestoreKey
NtSaveKeyEx
NtSetInformationKey
NtSetValueKey
PpDevNodeLockTree