CmMergeFilterLists

__int64 __fastcall CmMergeFilterLists(wchar_t *Str1, wchar_t *a2, wchar_t *a3, wchar_t *a4, int a5, __int64 a6){
  wchar_t *v6; 
  wchar_t *v7; 
  unsigned int v8; 
  wchar_t *v9; 
  int v10; 
  int v11; 
  wchar_t *FilterListInflectionPoint; 
  const wchar_t *v13; 
  __int64 v14; 
  int v15; 
  __int64 v16; 
  __int64 v17; 
  const wchar_t *i; 
  __int64 v19; 
  int v20; 
  __int64 v21; 
  __int64 v22; 
  int v23; 
  bool v24; 
  __int64 v25; 
  int v26; 
  unsigned int v27; 
  wchar_t *v29; 
  wchar_t *v30; 
  wchar_t *Str1a; 
  wchar_t *v32; 
  wchar_t *Str2; 
  int v34; 
  Str2 = a3;
  v32 = a2;
  Str1a = Str1;
  v6 = Str1;
  v7 = a2;
  v29 = 0i64;
  v8 = 0;
  v9 = 0i64;
  v10 = 0;
  v11 = 0;
  if( a4 && (unsigned int)a5 >= 2 )
  {
    v11 = a5;
    v9 = a4;
    v29 = a4;
    *a4 = 0;
  }
  while( 1 )
  {
    FilterListInflectionPoint = CmFindFilterListInflectionPoint(v6, v7, a3);
    v30 = FilterListInflectionPoint;
    v13 = Str1a;
    if( *Str1a )
    {
      do
      {
        if( FilterListInflectionPoint && !wcsicmp(v13, FilterListInflectionPoint) )
          break;
        if( wcsicmp(v13, Str2) )
        {
          v14 = -1i64;
          do
            ++v14;
          while( v13[v14] );
          v10 += 2 * v14 + 2;
          v15 = 2 * v14 + 2;
          if( v9 )
          {
            v34 = v11;
            if( PnpMultiSzAppend(v9, (unsigned int *)&v34, v13, &v29) )
            {
              v9 = v29;
            }
            else
            {
              v9 = 0i64;
              v29 = 0i64;
              v8 = -1073741789;
            }
            v11 -= v15;
          }
          FilterListInflectionPoint = v30;
        }
        v16 = -1i64;
        do
          ++v16;
        while( v13[v16] );
        v13 += v16 + 1;
      }
      while( *v13 );
      v7 = v32;
    }
    Str1a = (wchar_t *)v13;
    if( *v13 )
    {
      v17 = -1i64;
      do
        ++v17;
      while( v13[v17] );
      Str1a = (wchar_t *)&v13[v17 + 1];
    }
    if( v7 )
    {
      for( i = v7; *i; i += v21 + 1 )
      {
        if( FilterListInflectionPoint && !wcsicmp(i, FilterListInflectionPoint) )
          break;
        v19 = -1i64;
        do
          ++v19;
        while( i[v19] );
        v10 += 2 * v19 + 2;
        v20 = 2 * v19 + 2;
        if( v9 )
        {
          v34 = v11;
          if( PnpMultiSzAppend(v9, (unsigned int *)&v34, i, &v29) )
          {
            v9 = v29;
          }
          else
          {
            v9 = 0i64;
            v29 = 0i64;
            v8 = -1073741789;
          }
          v11 -= v20;
        }
        v21 = -1i64;
        do
          ++v21;
        while( i[v21] );
        FilterListInflectionPoint = v30;
      }
      v7 = (wchar_t *)i;
      v32 = (wchar_t *)i;
      if( *i )
      {
        v22 = -1i64;
        do
          ++v22;
        while( i[v22] );
        v7 = (wchar_t *)&i[v22 + 1];
        v32 = v7;
      }
    }
    if( !FilterListInflectionPoint )
      break;
    v23 = wcsicmp(FilterListInflectionPoint, Str2);
    a3 = Str2;
    v24 = v23 == 0;
    v6 = Str1a;
    if( !v24 )
    {
      v25 = -1i64;
      do
        ++v25;
      while( FilterListInflectionPoint[v25] );
      a3 = Str2;
      v10 += 2 * v25 + 2;
      v26 = 2 * v25 + 2;
      v6 = Str1a;
      if( v9 )
      {
        v34 = v11;
        if( PnpMultiSzAppend(v9, (unsigned int *)&v34, FilterListInflectionPoint, &v29) )
        {
          v9 = v29;
        }
        else
        {
          v9 = 0i64;
          v8 = -1073741789;
          v29 = 0i64;
        }
        v6 = Str1a;
        v11 -= v26;
        a3 = Str2;
      }
    }
  }
  if( v10 )
  {
    v27 = v10 + 2;
    *(_DWORD *)a6 = v27;
    if( !v9 || a5 < v27 )
      return(unsigned int)-1073741789;
  }
  else
  {
    return(unsigned int)-1073741275;
  }
  return v8;
}

Referenced by:

CmGetDeviceCompoundFiltersWorker
CmGetInstallerClassCompoundFiltersWorker