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