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