CmGetDeviceCompoundFilters
NTSTATUS __stdcall CmGetDeviceCompoundFilters(
INT64 a1,
WCHAR *a2,
VOID *a3,
INT64 r9,
UINT64 *a5,
WCHAR *a6,
INT64 a7,
UINT64 *a8){
NTSTATUS v8;
const DEVPROPKEY *v13;
NTSTATUS DeviceCompoundFiltersWorker;
VOID *v15;
__int64 v16;
int v17;
__int64 v19;
UINT64 DesiredAccess;
INT64 v21;
_REPARSE_DATA_BUFFER *ReparseBuffer;
VOID *Handle;
v8 = 0;
ReparseBuffer = 0i64;
Handle = 0i64;
if( *(_DWORD *)(r9 + 16) != 22 )
goto LABEL_2;
v19 = *(_QWORD *)r9 - DEVPKEY_Device_CompoundUpperFilters;
if( *(_QWORD *)r9 == DEVPKEY_Device_CompoundUpperFilters )
v19 = *(_QWORD *)(r9 + 8) - 0x293B573F92A15394i64;
v13 = &DEVPKEY_Device_UpperFilters;
if( v19 )
LABEL_2:
v13 = &DEVPKEY_Device_LowerFilters;
if( a3 )
{
v15 = a3;
ReparseBuffer = (_REPARSE_DATA_BUFFER *)a3;
}
else
{
LODWORD(DesiredAccess) = 33554433;
DeviceCompoundFiltersWorker = CmOpenDeviceRegKey(
(HPNPCTX *)a1,
a2,
CM_KEY_TYPE_DEVICE_INSTANCE,
0i64,
DesiredAccess,
0,
(VOID **)&ReparseBuffer,
0i64);
if( DeviceCompoundFiltersWorker < 0 )
{
LABEL_27:
v8 = DeviceCompoundFiltersWorker;
goto LABEL_11;
}
v15 = ReparseBuffer;
}
if( a1 )
v16 = *(_QWORD *)(a1 + 224);
else
v16 = 0i64;
if( SysCtxRegOpenKey(v16, v15, L"Filters", 0, 0x2001Fu, &Handle) >= 0 )
{
LODWORD(v21) = a7;
DeviceCompoundFiltersWorker = CmGetDeviceCompoundFiltersWorker(
a1,
a2,
(INT64)ReparseBuffer,
Handle,
r9,
(INT64)v13,
(INT64)a5,
a6,
v21,
(INT64)a8);
if( DeviceCompoundFiltersWorker != -1073741772
&& DeviceCompoundFiltersWorker != -1073741444
&& DeviceCompoundFiltersWorker != -1073741275 )
{
if( DeviceCompoundFiltersWorker >= 0 )
goto LABEL_11;
goto LABEL_27;
}
}
CmGetDeviceMappedPropertyFromRegProp((_IRP *)a1, (_FILE_OBJECT *)a2, ReparseBuffer);
if( v17 < 0 )
v8 = v17;
LABEL_11:
if( Handle )
ZwClose((_HANDLE)Handle);
if( ReparseBuffer && !a3 )
ZwClose((_HANDLE)ReparseBuffer);
return v8;
}Referenced by:
CmGetDeviceMappedPropertyFromComposite