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