RtlInternTableIntern

INT64 __fastcall RtlInternTableIntern(INT64 a1, INT64 a2){
  INT64 v4; 
  __int64 v5; 
  INT64 v6; 
  INT64 v7; 
  __int64 v8; 
  void(__fastcall *v9)(INT64, __int64); 
  int v10; 
  __int64 v12; 
  _QWORD *v13; 
  unsigned int v14; 
  __int64 v15; 
  char *v16; 
  __int64 v17; 
  __int64 v18; 
  void(__fastcall *v19)(INT64, _QWORD *, INT64); 
  char v20; 
  unsigned __int64 v21; 
  unsigned int v22; 
  __int64 v23; 
  __int64 v24; 
  _QWORD *v25; 
  __int64 v26; 
  INT64 v27; 
  unsigned __int64 v28; 
  __int64 v29; 
  INT64 a4; 
  *(_DWORD *)(a2 + 24) = 0;
  a4 = 0i64;
  v4 = RtlpInternEntryHash((INT64 *)a2, &a4);
  LOBYTE(v5) = 1;
  (*(void(__fastcall **)(INT64, __int64))(*(_QWORD *)(a1 + 16) + 16i64))(a1, v5);
  v6 = a4;
  v7 = RtlpInternEntryFind(a1, (_QWORD *)a2, v4, a4);
  LOBYTE(v8) = 1;
  v9 = *(void(__fastcall **)(INT64, __int64))(*(_QWORD *)(a1 + 16) + 24i64);
  if( v7 )
  {
    v9(a1, v8);
    goto LABEL_3;
  }
  v12 = *(_QWORD *)(a1 + 24);
  v9(a1, v8);
  v13 = RtlpInternEntryCreate(a1, a2, v4, v6);
  if( !v13 )
  {
    v7 = 0i64;
    goto LABEL_3;
  }
  (*(void(__fastcall **)(INT64, _QWORD))(*(_QWORD *)(a1 + 16) + 16i64))(a1, 0i64);
  if( v12 == *(_QWORD *)(a1 + 24) || (v7 = RtlpInternEntryFind(a1, (_QWORD *)a2, v4, v6)) == 0 )
  {
    v14 = *(_DWORD *)(a1 + 4);
    v15 = 2 * (v14 >> 5);
    if( *(_DWORD *)a1 >= (unsigned int)v15 )
    {
      if( (unsigned int)v15 < 4 )
        v15 = 4i64;
      v16 = (char *)RtlpInternHashBucketsAllocate(8i64 * (unsigned int)v15, a1);
      if( v16 )
      {
        if( (((_DWORD)v15 - 1) & (unsigned int)v15) != 0 )
        {
          v20 = -1;
          do
          {
            ++v20;
            LODWORD(v15) = (unsigned int)v15 >> 1;
          }
          while( (_DWORD)v15 );
          v15 = (unsigned int)(1 << v20);
        }
        if( (unsigned int)v15 > 0x4000000 )
          v15 = 0x4000000i64;
        v21 = (unsigned int)v15;
        if( v16 > &v16[8 * v15] )
          v21 = 0i64;
        if( v21 )
          memset64(v16, a1 | 1, v21);
        v22 = 0;
        v23 = -1i64 << (*(_BYTE *)(a1 + 4) & 0x1F);
        if( (*(_DWORD *)(a1 + 4) & 0xFFFFFFE0) != 0 )
        {
          do
          {
            v24 = *(_QWORD *)(a1 + 8);
            while( 1 )
            {
              v25 = *(_QWORD **)(v24 + 8i64 * v22);
              if( ((unsigned __int8)v25 & 1) != 0 )
                break;
              *(_QWORD *)(v24 + 8i64 * v22) = *v25;
              a4 = v23 & v25[1];
              v26 = (37
                   * (BYTE6(a4)
                    + 37
                    * (BYTE5(a4)
                     + 37
                     * (BYTE4(a4)
                      + 37 * (BYTE3(a4) + 37 * (BYTE2(a4) + 37 * (BYTE1(a4) + 37 * ((unsigned __int8)a4 + 11623883)))))))
                   + HIBYTE(a4)) & (unsigned int)(v15 - 1);
              *v25 = *(_QWORD *)&v16[8 * v26];
              *(_QWORD *)&v16[8 * v26] = v25;
            }
            ++v22;
          }
          while( v22 < *(_DWORD *)(a1 + 4) >> 5 );
        }
        v27 = *(_QWORD *)(a1 + 8);
        v14 = (32 * v15) | *(_DWORD *)(a1 + 4) & 0x1F;
        *(_QWORD *)(a1 + 8) = v16;
        *(_DWORD *)(a1 + 4) = v14;
        if( v27 )
        {
          RtlpInternHashBucketsFree(v27, a1);
          v14 = *(_DWORD *)(a1 + 4);
        }
      }
      else
      {
        v14 = *(_DWORD *)(a1 + 4);
        if( v14 < 0x20 )
        {
          v7 = 0i64;
          goto LABEL_15;
        }
      }
    }
    a4 = v13[1] & (-1i64 << (v14 & 0x1F));
    v17 = *(_QWORD *)(a1 + 8);
    v18 = (37
         * (BYTE6(a4)
          + 37
          * (BYTE5(a4)
           + 37
           * (BYTE4(a4) + 37 * (BYTE3(a4) + 37 * (BYTE2(a4) + 37 * (BYTE1(a4) + 37 * ((unsigned __int8)a4 + 11623883)))))))
         + HIBYTE(a4)) & ((v14 >> 5) - 1);
    *v13 = *(_QWORD *)(v17 + 8 * v18);
    *(_QWORD *)(v17 + 8 * v18) = v13;
    ++*(_DWORD *)a1;
    ++*(_QWORD *)(a1 + 24);
    *(_DWORD *)(a2 + 24) |= 2u;
    v19 = *(void(__fastcall **)(INT64, _QWORD *, INT64))(*(_QWORD *)(a1 + 16) + 32i64);
    if( v19 )
      v19(a1, v13, a2);
    v7 = (INT64)v13;
    v13 = 0i64;
  }
LABEL_15:
  (*(void(__fastcall **)(INT64, _QWORD))(*(_QWORD *)(a1 + 16) + 24i64))(a1, 0i64);
  if( v13 )
    (*(void(__fastcall **)(INT64, _QWORD *))(*(_QWORD *)(a1 + 16) + 8i64))(a1, v13);
LABEL_3:
  v10 = *(_DWORD *)(a2 + 24);
  if( (v10 & 3) == 1 )
  {
    v28 = 0i64;
    if( *(_QWORD *)(a2 + 16) )
    {
      v29 = 0i64;
      do
      {
        v29 += 32i64;
        ++v28;
        *(_QWORD *)(v29 + *(_QWORD *)(a2 + 8) - 24) = 0i64;
      }
      while( v28 < *(_QWORD *)(a2 + 16) );
      v10 = *(_DWORD *)(a2 + 24);
    }
    *(_DWORD *)(a2 + 24) = v10 & 0xFFFFFFFE;
  }
  return v7;
}

Referenced by:

PopEtAppIdIntern
PopEtStringIntern