RtlInternTableIntern

NTSTATUS __stdcall RtlInternTableIntern(INT64 a1, INT64 a2){
  __int64 v4; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  void(__fastcall *v10)(INT64, __int64); 
  int v11; 
  __int64 v13; 
  _QWORD *v14; 
  unsigned int v15; 
  __int64 v16; 
  char *v17; 
  char *v18; 
  __int64 v19; 
  __int64 v20; 
  void(__fastcall *v21)(INT64, _QWORD *, INT64); 
  char v22; 
  unsigned __int64 v23; 
  unsigned int v24; 
  __int64 v25; 
  __int64 v26; 
  _QWORD *v27; 
  __int64 v28; 
  INT64 v29; 
  __int64 v30; 
  unsigned __int64 v31; 
  __int64 v32; 
  INT64 v33; 

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

Referenced by:

PopEtAppIdIntern
PopEtStringIntern