CmGetDeviceCompoundFiltersWorker
NTSTATUS __stdcall CmGetDeviceCompoundFiltersWorker(
INT64 a1,
WCHAR *rdx0,
INT64 a3,
VOID *r9,
INT64 arg20,
INT64 arg28,
INT64 a7,
WCHAR *a4,
INT64 a9,
INT64 a10){
WCHAR *v13;
VOID **v14;
VOID **v15;
__int64 v16;
__int64 *v17;
__int64 *v18;
__int64 *v19;
VOID **PoolWithTag;
int ObjectProperty;
_REPARSE_DATA_BUFFER *v22;
int v23;
NTSTATUS v24;
VOID **v25;
int v26;
char *a5;
INT64 a6;
INT64 v30;
INT64 v31;
UINT64 NumberOfBytes;
INT64 v33;
PVOID P;
INT64 v35;
WCHAR *a2;
LODWORD(v33) = 0;
v13 = 0i64;
v14 = 0i64;
a2 = 0i64;
v15 = 0i64;
P = 0i64;
NumberOfBytes = 0i64;
if( (int)PnpCtxRegQueryInfoKey(0i64, r9, &v33, 0i64, 0i64, 0i64, 0i64) < 0 || !(_DWORD)v33 )
goto LABEL_46;
if( *(_DWORD *)(arg20 + 16) != 22 )
goto LABEL_8;
v16 = *(_QWORD *)arg20 - DEVPKEY_Device_CompoundUpperFilters;
if( *(_QWORD *)arg20 == DEVPKEY_Device_CompoundUpperFilters )
v16 = *(_QWORD *)(arg20 + 8) - 0x293B573F92A15394i64;
if( v16 )
{
LABEL_8:
v17 = DEVPKEY_Device_LowerFilterCache;
v18 = DEVPKEY_Device_LowerFilterLevels;
v19 = DEVPKEY_Device_LowerFilterDefaultLevel;
v13 = L"*Lower";
}
else
{
v17 = (__int64 *)&DEVPKEY_Device_UpperFilterCache;
v18 = DEVPKEY_Device_UpperFilterLevels;
v19 = (__int64 *)&DEVPKEY_Device_UpperFilterDefaultLevel;
v13 = (WCHAR *)L"*Upper";
}
v33 = (INT64)v18;
v35 = (INT64)v17;
if( PnpGetObjectProperty(a1, (INT64)rdx0, 1i64, a3, 0i64, (INT64)v17, (INT64)&NumberOfBytes + 4, 0i64) == -1073741789
&& HIDWORD(NumberOfBytes) == 8210 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
v15 = PoolWithTag;
if( !PoolWithTag )
return -1073741801;
ObjectProperty = PnpGetObjectProperty(
a1,
(INT64)rdx0,
1i64,
a3,
0i64,
v35,
(INT64)&NumberOfBytes + 4,
(INT64)PoolWithTag);
if( ObjectProperty < 0 )
goto LABEL_50;
v22 = (_REPARSE_DATA_BUFFER *)a3;
LABEL_15:
a5 = (char *)&NumberOfBytes + 4;
CmGetDeviceMappedPropertyFromRegProp((_IRP *)a1, (_FILE_OBJECT *)rdx0, v22);
ObjectProperty = v23;
if( v23 == -1073741275 )
{
LODWORD(NumberOfBytes) = 0;
goto LABEL_39;
}
if( v23 != -1073741789 )
{
LABEL_47:
if( v14 && v14 != (VOID **)v13 )
ExFreePoolWithTag(v14, 0);
LABEL_50:
if( v15 )
ExFreePoolWithTag(v15, 0);
if( a2 )
ExFreePoolWithTag(a2, 0);
if( P )
ExFreePoolWithTag(P, 0);
return ObjectProperty;
}
if( !(_DWORD)NumberOfBytes || !(_DWORD)a9 )
{
LABEL_39:
LODWORD(a5) = a9;
ObjectProperty = CmMergeFilterLists((WCHAR *)v15, a2, v13, a4, (INT64)a5, a10);
if( (int)(ObjectProperty + 0x80000000) < 0 || ObjectProperty == -1073741789 )
*(_DWORD *)a7 = 8210;
goto LABEL_47;
}
a2 = (WCHAR *)ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
if( a2 )
{
a5 = (char *)&NumberOfBytes + 4;
CmGetDeviceMappedPropertyFromRegProp((_IRP *)a1, (_FILE_OBJECT *)rdx0, v22);
ObjectProperty = v26;
if( v26 >= 0 )
goto LABEL_39;
goto LABEL_47;
}
LABEL_23:
ObjectProperty = -1073741801;
goto LABEL_47;
}
v24 = PnpGetObjectProperty(a1, (INT64)rdx0, 1i64, a3, 0i64, (INT64)v19, (INT64)&NumberOfBytes + 4, 0i64);
ObjectProperty = v24;
if( v24 == -1073741789 )
{
if( HIDWORD(NumberOfBytes) == 18 )
{
v14 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
if( !v14 )
return -1073741801;
a6 = (INT64)v19;
v22 = (_REPARSE_DATA_BUFFER *)a3;
ObjectProperty = PnpGetObjectProperty(a1, (INT64)rdx0, 1i64, a3, 0i64, a6, (INT64)&NumberOfBytes + 4, (INT64)v14);
if( ObjectProperty < 0 )
goto LABEL_47;
if( PnpGetObjectProperty(a1, (INT64)rdx0, 1i64, a3, 0i64, v33, (INT64)&NumberOfBytes + 4, 0i64) == -1073741789 )
{
v25 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
P = v25;
if( !v25 )
goto LABEL_23;
ObjectProperty = PnpGetObjectProperty(
a1,
(INT64)rdx0,
1i64,
a3,
0i64,
v33,
(INT64)&NumberOfBytes + 4,
(INT64)v25);
if( ObjectProperty < 0 )
goto LABEL_47;
goto LABEL_28;
}
LABEL_46:
ObjectProperty = -1073741275;
goto LABEL_47;
}
}
else if( v24 == -1073741275 )
{
v22 = (_REPARSE_DATA_BUFFER *)a3;
v14 = (VOID **)v13;
LABEL_28:
LODWORD(v30) = 0;
ObjectProperty = CmGetDeclarativeFilterList(
a1,
(INT64)r9,
(const WCHAR *)P,
(const WCHAR *)v14,
v13,
0i64,
v30,
&NumberOfBytes);
if( !ObjectProperty )
ObjectProperty = -1073741762;
if( ObjectProperty != -1073741789 )
goto LABEL_47;
v15 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
if( !v15 )
goto LABEL_23;
LODWORD(v31) = NumberOfBytes;
ObjectProperty = CmGetDeclarativeFilterList(
a1,
(INT64)r9,
(const WCHAR *)P,
(const WCHAR *)v14,
v13,
v15,
v31,
&NumberOfBytes);
if( ObjectProperty < 0 )
goto LABEL_47;
PnpSetObjectProperty(a1, (INT64)rdx0, 1u, (INT64)v22, 0i64, v35, 8210, (__int64)v15, NumberOfBytes, 0);
goto LABEL_15;
}
if( HIDWORD(NumberOfBytes) != 8210 || v24 == -1073739509 || !v24 )
return -1073741275;
return ObjectProperty;
}Referenced by:
CmGetDeviceCompoundFilters