ExpFindCurrentThread
CHAR *__fastcall ExpFindCurrentThread(
ERESOURCE *Resource,
INT64 a2,
KLOCK_QUEUE_HANDLE *a3,
INT64 a4,
UINT64 FirstEntryInelligible,
UINT64 a6){
unsigned __int64 OwnerThread;
CHAR *result;
int v8;
CHAR *v12;
CHAR *p_OwnerEntry;
unsigned __int64 v14;
_OWNER_ENTRY *v15;
_OWNER_ENTRY *OwnerTable;
unsigned __int64 v17;
CHAR *v18;
CHAR *v19;
OwnerThread = Resource->OwnerEntry.OwnerThread;
result = (CHAR *)&Resource->OwnerEntry;
v8 = a4;
if( OwnerThread != a2 )
{
v12 = 0i64;
p_OwnerEntry = 0i64;
if( !OwnerThread )
{
p_OwnerEntry = (CHAR *)&Resource->OwnerEntry;
if( (_DWORD)FirstEntryInelligible )
p_OwnerEntry = 0i64;
}
v14 = Resource->OwnerEntry.OwnerThread != 0;
if( !(_DWORD)a6
|| (v15 = Resource->OwnerTable) == 0i64
|| (unsigned int)a6 >= v15->TableSize
|| (result = (CHAR *)&v15[(unsigned int)a6], *(_QWORD *)result != a2) )
{
OwnerTable = Resource->OwnerTable;
result = (CHAR *)OwnerTable;
if( OwnerTable )
{
v17 = Resource->ActiveEntries + (unsigned __int64)Resource->NumberOfSharedWaiters;
v12 = (CHAR *)&OwnerTable[OwnerTable->TableSize];
result = (CHAR *)&OwnerTable[1];
if( v14 < v17 )
{
while( *(_QWORD *)result != a2 )
{
if( *(_QWORD *)result )
{
if( ++v14 == v17 )
{
result += 16;
goto LABEL_13;
}
}
else
{
v19 = result;
if( p_OwnerEntry )
v19 = p_OwnerEntry;
p_OwnerEntry = v19;
}
result += 16;
if( result == v12 )
goto LABEL_13;
}
v18 = result;
goto LABEL_18;
}
}
LABEL_13:
if( v8 )
{
if( p_OwnerEntry || result < v12 && (p_OwnerEntry = result) != 0i64 )
{
v18 = p_OwnerEntry;
result = p_OwnerEntry;
LABEL_18:
*((_BYTE *)KeGetCurrentThread() + 649) = (v18 - (CHAR *)OwnerTable) >> 4;
return result;
}
ExpExpandResourceOwnerTable(Resource, a3);
}
return 0i64;
}
}
return result;
}Referenced by:
ExAcquireSharedWaitForExclusive
ExpAcquireResourceExclusiveLite
ExpAcquireResourceSharedLite
ExpAcquireSharedStarveExclusive
ExpBoostIoAfterAcquire
ExpTryConvertSharedToExclusiveLite