CmGetDeclarativeFilterList
NTSTATUS __stdcall CmGetDeclarativeFilterList(
INT64 a1,
INT64 a2,
const WCHAR *a3,
const WCHAR *a4,
const WCHAR *a5,
_WORD *a6,
UINT64 a7,
UINT64 *a8){
const wchar_t *v9;
NTSTATUS v11;
_WORD *pszDest;
int v13;
int v14;
NTSTATUS appended;
INT64 v16;
NTSTATUS v17;
NTSTATUS v18;
__int64 v19;
INT64 v21;
INT64 v22[2];
const WCHAR *v23;
v23 = a4;
v9 = a3;
LODWORD(v22[0]) = 0;
v11 = 0;
pszDest = 0i64;
v13 = 0;
v14 = 0;
if( a6 )
{
if( (unsigned int)a7 < 2 )
return -1073741811;
v14 = a7;
pszDest = a6;
*a6 = 0;
}
if( !a3 )
{
LODWORD(v21) = v14;
appended = CmAppendDeclarativeDefaultFilters(a1, a2, a5, (INT64)a4, (UINT64)pszDest, v21, (INT64)v22);
v13 = v22[0];
v11 = appended;
goto LABEL_26;
}
if( *a3 )
{
while( 1 )
{
if( !wcsicmp(v9, a4) )
{
LODWORD(v21) = v14;
v17 = CmAppendDeclarativeDefaultFilters(a1, a2, a5, v16, (UINT64)pszDest, v21, (INT64)v22);
if( v17 == -1073741789 )
{
v11 = -1073741789;
pszDest = 0i64;
}
else if( v17 < 0 )
{
v11 = v17;
break;
}
v13 += LODWORD(v22[0]);
if( pszDest )
{
v14 -= LODWORD(v22[0]);
pszDest += (unsigned __int64)LODWORD(v22[0]) >> 1;
}
}
v18 = CmAppendDeclarativeFilterLevel(a1, (VOID *)a2, v9, (__int64)pszDest, v14, v22);
if( v18 == -1073741789 )
{
v11 = -1073741789;
pszDest = 0i64;
}
else if( (int)(v18 + 0x80000000) >= 0 && v18 != -1073741772 )
{
v11 = v18;
break;
}
v13 += LODWORD(v22[0]);
if( pszDest )
{
v14 -= LODWORD(v22[0]);
pszDest += (unsigned __int64)LODWORD(v22[0]) >> 1;
}
v19 = -1i64;
do
++v19;
while( v9[v19] );
v9 += v19 + 1;
if( !*v9 )
break;
a4 = v23;
}
}
LABEL_26:
*(_DWORD *)a8 = v13 + 2;
if( v11 >= 0 && v13 + 2 > (unsigned int)a7 )
return -1073741789;
return v11;
}Referenced by:
CmGetDeviceCompoundFiltersWorker
CmGetInstallerClassCompoundFiltersWorker