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