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