CmpComputeComponentHashes
INT64 __fastcall CmpComputeComponentHashes(__m128i *a1, INT16 *a2, INT64 a3){
UINT64 v3;
__m128i v4;
char v5;
__int16 v7;
__int16 v8;
_WORD *v9;
__int16 v10;
__int64 v11;
INT16 v12;
__int16 v13;
int v14;
UINT16 *v15;
__int64 v16;
UINT16 v17;
INT64 result;
__int16 v19;
__int64 v20;
UINT16 *v21;
__int64 v22;
UINT16 v23;
__m128i CoordinatedSelection;
__m128i v25;
char v26;
v4 = *a1;
v5 = 0;
v26 = 0;
v7 = _mm_cvtsi128_si32(v4);
CoordinatedSelection.m128i_i64[0] = v4.m128i_i64[0];
v25 = v4;
CoordinatedSelection.m128i_i16[0] = v7;
if( v7 )
{
v8 = 0;
v9 = (_WORD *)v4.m128i_i64[1];
v10 = v4.m128i_i16[1];
do
{
if( v8 >= 32 )
break;
if( *v9 == 92 )
{
++v8;
v19 = v25.m128i_i16[0] - v7;
v25.m128i_i16[0] = v19;
v25.m128i_i16[1] = v19;
if( v8 > 8 && !v5 )
{
LODWORD(result) = CmpExpandPathInfo(
(PVOID)a3,
(UINT64)a2,
a3,
v3,
(UINT64 *)CoordinatedSelection.m128i_i64[0]);
if( (int)result < 0 )
return result;
v26 = 1;
}
v20 = (unsigned int)(v8 - 1);
if( (unsigned int)v20 >= 8 )
*(__m128i *)(*(_QWORD *)(a3 + 160) + 16 * ((unsigned int)(v8 - 9) + 6i64)) = v25;
else
*(__m128i *)(a3 + 16 * ((unsigned int)v20 + 2i64)) = v25;
v3 = 0i64;
if( v19 )
{
v21 = (UINT16 *)v25.m128i_i64[1];
v22 = (unsigned __int16)(((unsigned __int16)(v19 - 1) >> 1) + 1);
do
{
v23 = *v21;
if( *v21 >= 0x61u )
{
if( v23 > 0x7Au )
v23 = NLS_UPCASE(v23);
else
v23 -= 32;
}
++v21;
v3 = (unsigned int)v23 + 37 * (_DWORD)v3;
--v22;
}
while( v22 );
}
if( (unsigned int)v20 >= 8 )
*(_DWORD *)(*(_QWORD *)(a3 + 160) + 4i64 * (unsigned int)(v8 - 9)) = v3;
else
*(_DWORD *)(a3 + 4 * v20) = v3;
do
{
if( *v9 != 92 )
break;
v7 -= 2;
++v9;
v10 -= 2;
CoordinatedSelection.m128i_i16[0] = v7;
}
while( v7 );
CoordinatedSelection.m128i_i64[1] = (__int64)v9;
CoordinatedSelection.m128i_i16[1] = v10;
v4 = CoordinatedSelection;
v5 = v26;
v25 = CoordinatedSelection;
}
else
{
++v9;
v7 -= 2;
v10 -= 2;
CoordinatedSelection.m128i_i16[1] = v10;
CoordinatedSelection.m128i_i16[0] = v7;
}
}
while( v7 );
v11 = (unsigned int)v8;
if( v7 )
{
return 3221225485i64;
}
else
{
v12 = v8 + 1;
if( v12 <= 8
|| v5
|| (LODWORD(result) = CmpExpandPathInfo(
(PVOID)a3,
(UINT64)a2,
a3,
v3,
(UINT64 *)CoordinatedSelection.m128i_i64[0]),
(int)result >= 0) )
{
if( (unsigned int)v11 >= 8 )
*(__m128i *)(*(_QWORD *)(a3 + 160) + 16 * ((unsigned int)(v11 - 8) + 6i64)) = v4;
else
*(__m128i *)(a3 + 16 * (v11 + 2)) = v4;
v13 = _mm_cvtsi128_si32(v4);
v14 = 0;
if( v13 )
{
v15 = (UINT16 *)v4.m128i_i64[1];
v16 = (unsigned __int16)(((unsigned __int16)(v13 - 1) >> 1) + 1);
do
{
v17 = *v15;
if( *v15 >= 0x61u )
{
if( v17 > 0x7Au )
v17 = NLS_UPCASE(v17);
else
v17 -= 32;
}
++v15;
v14 = v17 + 37 * v14;
--v16;
}
while( v16 );
}
if( (unsigned int)v11 >= 8 )
*(_DWORD *)(*(_QWORD *)(a3 + 160) + 4i64 * (unsigned int)(v11 - 8)) = v14;
else
*(_DWORD *)(a3 + 4 * v11) = v14;
*a2 = v12;
return 0i64;
}
}
}
else
{
result = 0i64;
*a2 = 0;
}
return result;
}Referenced by:
CmpDoParseKey
CmpGetSymbolicLinkTarget