CmGetInstallerClassCompoundFiltersWorker
NTSTATUS __stdcall CmGetInstallerClassCompoundFiltersWorker(
INT64 a1,
INT64 rdx0,
VOID *r8,
VOID *r9,
INT64 arg20,
INT64 arg28,
INT64 a7,
WCHAR *a4,
INT64 a5,
INT64 a10){
VOID **v10;
__int64 v14;
__int64 *v15;
__int64 *v16;
VOID **PoolWithTag;
int ObjectProperty;
WCHAR *v19;
NTSTATUS InstallerClassMappedPropertyFromRegProp;
NTSTATUS v21;
INT64 v22;
VOID **v23;
UINT64 *PropertyType;
INT64 a6;
INT64 v27;
INT64 v28;
INT64 v29;
INT64 v30;
UINT64 NumberOfBytes;
WCHAR *a3;
PVOID P;
PVOID v34;
INT64 v35;
WCHAR *a2;
INT64 v37;
v10 = 0i64;
LODWORD(a3) = 0;
P = 0i64;
NumberOfBytes = 0i64;
a2 = 0i64;
v34 = 0i64;
if( (int)PnpCtxRegQueryInfoKey(a1, r9, &a3, 0i64, 0i64, 0i64, 0i64) < 0 || !(_DWORD)a3 )
goto LABEL_44;
if( *(_DWORD *)(arg20 + 16) != 20 )
goto LABEL_8;
v14 = *(_QWORD *)arg20 - DEVPKEY_DeviceClass_CompoundUpperFilters;
if( *(_QWORD *)arg20 == DEVPKEY_DeviceClass_CompoundUpperFilters )
v14 = *(_QWORD *)(arg20 + 8) - 0x4B88D2ECD9DBB9A9i64;
if( v14 )
{
LABEL_8:
v37 = (INT64)DEVPKEY_DeviceClass_LowerFilterLevels;
v15 = DEVPKEY_DeviceClass_LowerFilterCache;
a3 = L"*Lower";
v16 = DEVPKEY_DeviceClass_LowerFilterDefaultLevel;
}
else
{
v37 = (INT64)DEVPKEY_DeviceClass_UpperFilterLevels;
v15 = (__int64 *)&DEVPKEY_DeviceClass_UpperFilterCache;
a3 = (WCHAR *)L"*Upper";
v16 = (__int64 *)&DEVPKEY_DeviceClass_UpperFilterDefaultLevel;
}
v35 = (INT64)v15;
if( PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, (INT64)v15, (INT64)&NumberOfBytes + 4, 0i64) == -1073741789
&& HIDWORD(NumberOfBytes) == 8210 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
v10 = PoolWithTag;
if( !PoolWithTag )
return -1073741801;
ObjectProperty = PnpGetObjectProperty(
a1,
rdx0,
2i64,
(INT64)r8,
0i64,
v35,
(INT64)&NumberOfBytes + 4,
(INT64)PoolWithTag);
if( ObjectProperty < 0 )
goto LABEL_47;
v19 = (WCHAR *)rdx0;
goto LABEL_15;
}
v21 = PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, (INT64)v16, (INT64)&NumberOfBytes + 4, 0i64);
ObjectProperty = v21;
if( v21 == -1073741789 && HIDWORD(NumberOfBytes) == 18 )
{
P = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
if( !P )
return -1073741801;
a6 = (INT64)v16;
v19 = (WCHAR *)rdx0;
ObjectProperty = PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, a6, (INT64)&NumberOfBytes + 4, (INT64)P);
if( ObjectProperty < 0 )
goto LABEL_45;
v22 = v37;
if( PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, v37, (INT64)&NumberOfBytes + 4, 0i64) == -1073741789 )
{
v23 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
v34 = v23;
if( !v23 )
goto LABEL_23;
ObjectProperty = PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, v22, (INT64)&NumberOfBytes + 4, (INT64)v23);
if( ObjectProperty < 0 )
goto LABEL_45;
LODWORD(v29) = 0;
ObjectProperty = CmGetDeclarativeFilterList(
a1,
(INT64)r9,
(const WCHAR *)v34,
(const WCHAR *)P,
a3,
0i64,
v29,
&NumberOfBytes);
if( !ObjectProperty )
ObjectProperty = -1073741762;
if( ObjectProperty != -1073741789 )
goto LABEL_45;
v10 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
if( !v10 )
goto LABEL_23;
LODWORD(v30) = NumberOfBytes;
ObjectProperty = CmGetDeclarativeFilterList(
a1,
(INT64)r9,
(const WCHAR *)v34,
(const WCHAR *)P,
a3,
v10,
v30,
&NumberOfBytes);
if( ObjectProperty < 0 )
goto LABEL_45;
PnpSetObjectProperty(a1, rdx0, 2u, (INT64)r8, 0i64, v35, 8210, (__int64)v10, NumberOfBytes, 0);
LABEL_15:
LODWORD(v27) = 0;
InstallerClassMappedPropertyFromRegProp = CmGetInstallerClassMappedPropertyFromRegProp(
(HPNPCTX *)a1,
v19,
r8,
(_DEVPROPKEY *)arg28,
(UINT64 *)((char *)&NumberOfBytes + 4),
0i64,
v27,
&NumberOfBytes);
if( InstallerClassMappedPropertyFromRegProp == -1073741275 )
{
LODWORD(NumberOfBytes) = 0;
goto LABEL_37;
}
if( InstallerClassMappedPropertyFromRegProp != -1073741789 )
{
ObjectProperty = InstallerClassMappedPropertyFromRegProp;
goto LABEL_45;
}
if( !(_DWORD)NumberOfBytes || !(_DWORD)a5 )
{
LABEL_37:
LODWORD(PropertyType) = a5;
ObjectProperty = CmMergeFilterLists((WCHAR *)v10, a2, a3, a4, (INT64)PropertyType, a10);
if( (int)(ObjectProperty + 0x80000000) < 0 || ObjectProperty == -1073741789 )
*(_DWORD *)a7 = 8210;
goto LABEL_45;
}
a2 = (WCHAR *)ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
if( a2 )
{
LODWORD(v28) = NumberOfBytes;
ObjectProperty = CmGetInstallerClassMappedPropertyFromRegProp(
(HPNPCTX *)a1,
v19,
r8,
(_DEVPROPKEY *)arg28,
(UINT64 *)((char *)&NumberOfBytes + 4),
(UINT8 *)a2,
v28,
&NumberOfBytes);
if( ObjectProperty >= 0 )
goto LABEL_37;
LABEL_45:
if( P )
ExFreePoolWithTag(P, 0);
LABEL_47:
if( v10 )
ExFreePoolWithTag(v10, 0);
if( a2 )
ExFreePoolWithTag(a2, 0);
if( v34 )
ExFreePoolWithTag(v34, 0);
return ObjectProperty;
}
LABEL_23:
ObjectProperty = -1073741801;
goto LABEL_45;
}
LABEL_44:
ObjectProperty = -1073741275;
goto LABEL_45;
}
if( HIDWORD(NumberOfBytes) != 8210 || v21 == -1073739509 || !v21 )
return -1073741275;
return ObjectProperty;
}Referenced by:
CmGetInstallerClassCompoundFilters