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