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