CmServiceFilterCallback
char __fastcall CmServiceFilterCallback(__int64 a1, const wchar_t *a2, __int64 a3, __int64 a4){
unsigned int v4;
const wchar_t *v6;
__int64 v7;
char v8;
WCHAR *v9;
__int64 v10;
int DeviceRegProp;
unsigned int v12;
void *v13;
VOID *v14;
int *v15;
int v16;
int *v17;
unsigned int v18;
int InstallerClassRegProp;
void *v20;
VOID *PoolWithTag;
unsigned int v22;
WCHAR *i;
__int64 v24;
__int64(__fastcall *v25)(__int64, const wchar_t *, __int64, _QWORD);
SIZE_T NumberOfBytes;
int v28;
unsigned int v29;
unsigned int v30;
const wchar_t *v31;
int v32[2];
int v33[2];
int *v34;
__int64 v35;
UNICODE_STRING String2;
struct _UNICODE_STRING DestinationString;
char v38[76];
__int16 v39;
v4 = 0;
v29 = a3;
v31 = a2;
v35 = a1;
NumberOfBytes = 0i64;
v6 = a2;
v7 = a1;
v8 = 0;
DestinationString = 0i64;
String2 = 0i64;
if( !a4 )
return v8;
v9 = *(WCHAR **)a4;
if( !*(_QWORD *)a4 || !*v9 )
{
v8 = 1;
goto LABEL_66;
}
if( (int)RtlInitUnicodeStringEx(&DestinationString, v9) < 0 )
return v8;
v10 = *(_QWORD *)(a4 + 8);
while( 1 )
{
LODWORD(NumberOfBytes) = *(_DWORD *)(a4 + 16);
DeviceRegProp = CmGetDeviceRegProp(v7, v6, 0i64, 5, (__int64)&NumberOfBytes + 4, v10, (__int64)&NumberOfBytes, 0);
v12 = NumberOfBytes;
if( !DeviceRegProp && (unsigned int)NumberOfBytes < 2 )
goto LABEL_14;
if( DeviceRegProp != -1073741789 )
goto LABEL_25;
if( (unsigned int)NumberOfBytes < 2 )
{
LABEL_14:
DeviceRegProp = -1073741811;
LABEL_15:
v15 = v32;
v32[0] = 1;
v34 = v32;
v32[1] = 2;
v30 = 0;
v33[0] = 18;
v33[1] = 19;
while( 1 )
{
v16 = *v15;
v28 = v16;
if( v16 == 2 )
{
LODWORD(NumberOfBytes) = 78;
DeviceRegProp = CmGetDeviceRegProp(
v7,
v6,
0i64,
9,
(__int64)&NumberOfBytes + 4,
(__int64)v38,
(__int64)&NumberOfBytes,
0);
if( DeviceRegProp < 0 || HIDWORD(NumberOfBytes) != 1 || (unsigned int)NumberOfBytes < 2 )
return v8;
v16 = v28;
v39 = 0;
}
v17 = v33;
do
{
while( 1 )
{
v18 = *(_DWORD *)(a4 + 16);
LODWORD(NumberOfBytes) = v18;
if( v16 == 1 )
{
InstallerClassRegProp = CmGetDeviceRegProp(
v7,
v31,
0i64,
*v17,
(__int64)&NumberOfBytes + 4,
*(_QWORD *)(a4 + 8),
(__int64)&NumberOfBytes,
0);
LABEL_31:
DeviceRegProp = InstallerClassRegProp;
v18 = NumberOfBytes;
goto LABEL_32;
}
if( v16 == 2 )
{
InstallerClassRegProp = CmGetInstallerClassRegProp(
v7,
(__int64)v38,
0i64,
*v17,
(__int64)&NumberOfBytes + 4,
*(_QWORD *)(a4 + 8),
(__int64)&NumberOfBytes);
goto LABEL_31;
}
LABEL_32:
if( !DeviceRegProp && v18 < 2 )
{
LABEL_34:
DeviceRegProp = -1073741811;
goto LABEL_59;
}
if( DeviceRegProp != -1073741789 )
break;
if( v18 < 2 )
goto LABEL_34;
v20 = *(void **)(a4 + 8);
if( v20 )
{
ExFreePoolWithTag(v20, 0);
v18 = NumberOfBytes;
}
PoolWithTag = ExAllocatePoolWithTag(PagedPool, v18, 0x52504E50ui64);
*(_QWORD *)(a4 + 8) = PoolWithTag;
if( !PoolWithTag )
{
*(_DWORD *)(a4 + 16) = 0;
DeviceRegProp = -1073741801;
break;
}
v16 = v28;
*(_DWORD *)(a4 + 16) = NumberOfBytes;
}
if( DeviceRegProp >= 0 && HIDWORD(NumberOfBytes) == 7 )
{
v22 = *(_DWORD *)(a4 + 16);
if( v22 > 2 )
{
*(_WORD *)(*(_QWORD *)(a4 + 8) + 2 * ((unsigned __int64)v22 >> 1) - 2) = 0;
v22 = *(_DWORD *)(a4 + 16);
}
if( v22 > 4 )
*(_WORD *)(*(_QWORD *)(a4 + 8) + 2 * ((unsigned __int64)v22 >> 1) - 4) = 0;
for( i = *(WCHAR **)(a4 + 8); *i; i += v24 + 1 )
{
if( (int)RtlInitUnicodeStringEx(&String2, i) >= 0
&& RtlEqualUnicodeString(&DestinationString, &String2, 1u) )
{
v8 = 1;
break;
}
v24 = -1i64;
do
++v24;
while( i[v24] );
}
if( v8 )
{
v6 = v31;
goto LABEL_65;
}
v7 = v35;
}
LABEL_59:
v16 = v28;
++v4;
++v17;
}
while( v4 < 2 );
v6 = v31;
v4 = 0;
v15 = v34 + 1;
++v30;
++v34;
if( v30 >= 2 )
return v8;
}
}
v13 = *(void **)(a4 + 8);
if( v13 )
{
ExFreePoolWithTag(v13, 0);
v12 = NumberOfBytes;
}
v14 = ExAllocatePoolWithTag(PagedPool, v12, 0x52504E50ui64);
*(_QWORD *)(a4 + 8) = v14;
v10 = (__int64)v14;
if( !v14 )
break;
*(_DWORD *)(a4 + 16) = NumberOfBytes;
}
*(_DWORD *)(a4 + 16) = 0;
DeviceRegProp = -1073741801;
LABEL_25:
if( DeviceRegProp )
goto LABEL_15;
*(_WORD *)(*(_QWORD *)(a4 + 8) + 2 * ((unsigned __int64)*(unsigned int *)(a4 + 16) >> 1) - 2) = 0;
if( (int)RtlInitUnicodeStringEx(&String2, *(WCHAR **)(a4 + 8)) < 0
|| !RtlEqualUnicodeString(&DestinationString, &String2, 1u) )
{
goto LABEL_15;
}
v8 = 1;
LABEL_65:
a3 = v29;
LABEL_66:
v25 = *(__int64(__fastcall **)(__int64, const wchar_t *, __int64, _QWORD))(a4 + 24);
if( v25 )
return v25(v35, v6, a3, *(_QWORD *)(a4 + 32));
return v8;
}Referenced by:
No references.