CmMergeFilterLists

NTSTATUS __fastcall CmMergeFilterLists(WCHAR *Str1, WCHAR *a2, WCHAR *a3, WCHAR *a4, INT64 a5, INT64 a6){
  WCHAR *v6; 
  WCHAR *v7; 
  NTSTATUS v8; 
  WCHAR *v9; 
  int v10; 
  int v11; 
  WCHAR *FilterListInflectionPoint; 
  wchar_t *v13; 
  __int64 v14; 
  int v15; 
  __int64 v16; 
  __int64 v17; 
  wchar_t *i; 
  __int64 v19; 
  int v20; 
  __int64 v21; 
  __int64 v22; 
  int v23; 
  bool v24; 
  __int64 v25; 
  int v26; 
  unsigned int v27; 
  WCHAR *v29; 
  WCHAR *v30; 
  wchar_t *Str1a; 
  WCHAR *v32; 
  wchar_t *Str2; 
  UINT64 pulSize; 

  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 )
          {
            LODWORD(pulSize) = v11;
            if( (unsigned __int8)PnpMultiSzAppend(v9, &pulSize, v13) )
            {
              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 = v13;
    if( *v13 )
    {
      v17 = -1i64;
      do
        ++v17;
      while( v13[v17] );
      Str1a = &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 )
        {
          LODWORD(pulSize) = v11;
          if( (unsigned __int8)PnpMultiSzAppend(v9, &pulSize, i) )
          {
            v9 = v29;
          }
          else
          {
            v9 = 0i64;
            v29 = 0i64;
            v8 = -1073741789;
          }
          v11 -= v20;
        }
        v21 = -1i64;
        do
          ++v21;
        while( i[v21] );
        FilterListInflectionPoint = v30;
      }
      v7 = i;
      v32 = i;
      if( *i )
      {
        v22 = -1i64;
        do
          ++v22;
        while( i[v22] );
        v7 = &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 )
      {
        LODWORD(pulSize) = v11;
        if( (unsigned __int8)PnpMultiSzAppend(v9, &pulSize, FilterListInflectionPoint) )
        {
          v9 = v29;
        }
        else
        {
          v9 = 0i64;
          v8 = -1073741789;
          v29 = 0i64;
        }
        v6 = Str1a;
        v11 -= v26;
        a3 = Str2;
      }
    }
  }
  if( !v10 )
    return -1073741275;
  v27 = v10 + 2;
  *(_DWORD *)a6 = v27;
  if( !v9 || (unsigned int)a5 < v27 )
    return -1073741789;
  return v8;
}

Referenced by:

CmGetDeviceCompoundFiltersWorker
CmGetInstallerClassCompoundFiltersWorker