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