CmpFindPathByName

char __fastcall CmpFindPathByName(__int64 a1, __m128i *a2, _UNICODE_STRING *a3, unsigned int *a4, __int64 *a5){
  unsigned __int16 v5; 
  __int64 *v8; 
  __m128i v10; 
  unsigned __int16 v11; 
  wchar_t *v12; 
  unsigned __int16 v13; 
  __int64 v14; 
  unsigned int v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  _CM_KEY_NODE *v18; 
  unsigned int v20; 
  __int64 v21; 
  _UNICODE_STRING v22; 
  _UNICODE_STRING SearchName; 
  UINT Cell; 
  int v25; 
  int v26; 
  unsigned int *v27; 

  v27 = a4;
  v5 = 0;
  *(_QWORD *)&SearchName.Length = 0i64;
  v25 = -1;
  *a4 = -1;
  v8 = a5;
  v26 = 0;
  *a5 = 0i64;
  if( a3 )
  {
    RtlInitUnicodeString(a3, 0i64);
    a4 = v27;
    v8 = a5;
  }
  v10 = *a2;
  v11 = _mm_cvtsi128_si32(*a2);
  v22 = (_UNICODE_STRING)v10;
  v22.Length = v11;
  if( v11 )
  {
    v12 = (wchar_t *)v10.m128i_i64[1];
    v13 = v10.m128i_u16[1];
    if( a1 )
    {
      v14 = *(_QWORD *)(a1 + 32);
      *v8 = v14;
      v15 = *(_DWORD *)(a1 + 40);
      *a4 = v15;
    }
    else
    {
      v14 = *(_QWORD *)&CmpMasterHive;
      v15 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)&CmpMasterHive + 64i64) + 36i64);
      do
      {
        if( *v12 != 92 )
          break;
        v11 -= 2;
        ++v12;
        v13 -= 2;
        v22.Length = v11;
      }
      while( v11 );
      v22.Buffer = v12;
      v22.MaximumLength = v13;
      if( !v11 )
        goto LABEL_21;
      do
      {
        if( *v12 == 92 )
          break;
        v11 -= 2;
        ++v12;
        v13 -= 2;
        v22.Length = v11;
      }
      while( v11 );
      v22.Buffer = v12;
      v22.MaximumLength = v13;
    }
    do
    {
      if( v11 )
      {
        do
        {
          if( *v12 != 92 )
            break;
          v11 -= 2;
          ++v12;
          v13 -= 2;
          v22.Length = v11;
        }
        while( v11 );
        v22.Buffer = v12;
        v22.MaximumLength = v13;
      }
LABEL_21:
      if( a3 )
        *a3 = v22;
      if( !v11 )
        break;
      v17 = (*(__int64(__fastcall **)(__int64, _QWORD, int *, unsigned int *))(v14 + 8))(v14, v15, &v25, a4);
      v18 = (_CM_KEY_NODE *)v17;
      if( !v17 )
        return 0;
      SearchName.Buffer = v12;
      SearchName.Length = 0;
      do
      {
        if( v12[(unsigned __int64)v5 >> 1] == 92 )
          break;
        v5 += 2;
      }
      while( v5 < v11 );
      SearchName.Length = v5;
      if( (*(_BYTE *)(v17 + 2) & 2) != 0 )
      {
        v20 = *(_DWORD *)(v17 + 28);
        v21 = v14;
        v14 = *(_QWORD *)(v17 + 36);
        (*(void(__fastcall **)(__int64, int *, __int64))(v21 + 16))(v21, &v25, 2i64);
        v18 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(__int64, _QWORD, int *))(v14 + 8))(v14, v20, &v25);
        if( !v18 )
          return 0;
      }
      Cell = 0;
      CmpFindSubKeyByNameWithStatus((_HHIVE *)v14, v18, &SearchName, &Cell);
      (*(void(__fastcall **)(__int64, int *))(v14 + 16))(v14, &v25);
      v15 = Cell;
      if( Cell == -1 )
        return 0;
      v13 -= v5;
      v11 -= v5;
      v22.MaximumLength = v13;
      v22.Length = v11;
      *v27 = Cell;
      *a5 = v14;
      v16 = v5;
      v5 = 0;
      v12 += v16 >> 1;
      v22.Buffer = v12;
    }
    while( v11 );
  }
  else
  {
    if( !a1 )
      return 0;
    *v8 = *(_QWORD *)(a1 + 32);
    *a4 = *(_DWORD *)(a1 + 40);
  }
  return 1;
}

Referenced by:

CmpVEExecuteOpenLogic
CmpVEExecuteRealStoreParseLogic
CmpVEExecuteVirtualStoreParseLogic
CmpVirtualBranchIsReplicated
CmpVirtualPathPresent