RtlpInternEntryFind

INT64 __fastcall RtlpInternEntryFind(INT64 a1, _QWORD *a2, INT64 a3, INT64 a4){
  unsigned int v4; 
  INT64 v6; 
  __int64 v9; 
  INT64 v10; 
  INT64 v11; 
  signed __int64 v12; 
  unsigned __int64 i; 
  signed __int64 v14; 
  INT64 v16; 
  v4 = *(_DWORD *)(a1 + 4);
  v6 = 0i64;
  v9 = -1i64 << (*(_BYTE *)(a1 + 4) & 0x1F);
  v10 = 0i64;
  v11 = a3 & v9;
  v16 = a3 & v9;
  while( 1 )
  {
    if( v10 )
      goto LABEL_5;
    if( !(v4 >> 5) )
      return v6;
    v10 = *(_QWORD *)(a1 + 8)
        + 8i64
        * ((37
          * (BYTE6(v16)
           + 37
           * (BYTE5(v16)
            + 37
            * (BYTE4(v16)
             + 37 * (BYTE3(v16) + 37 * (BYTE2(v16) + 37 * (BYTE1(v16) + 37 * ((unsigned __int8)v11 + 11623883)))))))
          + HIBYTE(v16)) & ((v4 >> 5) - 1));
LABEL_5:
    while( 1 )
    {
      v10 = *(_QWORD *)v10;
      if( (v10 & 1) != 0 )
        break;
      if( v11 == (v9 & *(_QWORD *)(v10 + 8)) )
        goto LABEL_7;
    }
    v10 = 0i64;
LABEL_7:
    if( !v10 )
      return v6;
    if( RtlpInternEntryMatch(v10, a2, a4) )
    {
      _m_prefetchw((const void *)(v10 + 16));
      v12 = *(_QWORD *)(v10 + 16);
      for( i = v12 + 1; i > 1; i = v12 + 1 )
      {
        v14 = v12;
        v12 = _InterlockedCompareExchange64((volatile signed __int64 *)(v10 + 16), i, v12);
        if( v14 == v12 )
          return v10;
      }
      if( i != 1 )
        __fastfail(0xEu);
      return v6;
    }
  }
}

Referenced by:

RtlInternTableIntern