ExpFindCurrentThread
_OWNER_ENTRY *__stdcall ExpFindCurrentThread(
_ERESOURCE *Resource,
UINT64 TargetThread,
_KLOCK_QUEUE_HANDLE *LockHandle,
UINT64 AllocateSlot,
UINT64 FirstEntryInelligible){
unsigned __int64 OwnerThread;
_OWNER_ENTRY *result;
int v7;
_OWNER_ENTRY *v11;
_OWNER_ENTRY *p_OwnerEntry;
unsigned __int64 v13;
_OWNER_ENTRY *v14;
_OWNER_ENTRY *OwnerTable;
unsigned __int64 v16;
_OWNER_ENTRY *v17;
_OWNER_ENTRY *v18;
unsigned __int32 v19;
OwnerThread = Resource->OwnerEntry.OwnerThread;
result = &Resource->OwnerEntry;
v7 = AllocateSlot;
if( OwnerThread != TargetThread )
{
v11 = 0i64;
p_OwnerEntry = 0i64;
if( !OwnerThread )
{
p_OwnerEntry = &Resource->OwnerEntry;
if( (_DWORD)FirstEntryInelligible )
p_OwnerEntry = 0i64;
}
v13 = Resource->OwnerEntry.OwnerThread != 0;
if( !v19
|| (v14 = Resource->OwnerTable) == 0i64
|| v19 >= v14->_bf_0
|| (result = &v14[v19], result->OwnerThread != TargetThread) )
{
OwnerTable = Resource->OwnerTable;
result = OwnerTable;
if( OwnerTable )
{
v16 = Resource->ActiveEntries + (unsigned __int64)Resource->NumberOfSharedWaiters;
v11 = &OwnerTable[OwnerTable->TableSize];
result = OwnerTable + 1;
if( v13 < v16 )
{
while( result->OwnerThread != TargetThread )
{
if( result->OwnerThread )
{
if( ++v13 == v16 )
{
++result;
goto LABEL_13;
}
}
else
{
v18 = result;
if( p_OwnerEntry )
v18 = p_OwnerEntry;
p_OwnerEntry = v18;
}
if( ++result == v11 )
goto LABEL_13;
}
v17 = result;
goto LABEL_18;
}
}
LABEL_13:
if( v7 )
{
if( p_OwnerEntry || result < v11 && (p_OwnerEntry = result) != 0i64 )
{
v17 = p_OwnerEntry;
result = p_OwnerEntry;
LABEL_18:
KeGetCurrentThread()->SchedulerApc.SpareByte0 = v17 - OwnerTable;
return result;
}
ExpExpandResourceOwnerTable(Resource, LockHandle);
}
return 0i64;
}
}
return result;
}Referenced by:
ExAcquireSharedWaitForExclusive
ExpAcquireResourceExclusiveLite
ExpAcquireResourceSharedLite
ExpAcquireSharedStarveExclusive
ExpBoostIoAfterAcquire
ExpTryConvertSharedToExclusiveLite