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