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.