CmGetMatchingFilteredDeviceListWorker

__int64 __fastcall CmGetMatchingFilteredDeviceListWorker(
        __int64 a1,
        const WCHAR *a2,
        int a3,
        char (__fastcall *a4)(__int64 a1, const wchar_t *a2, unsigned int a3, __int64 a4),
        __int64 *a5,
        _WORD *a6,
        unsigned int a7,
        unsigned int *a8,
        __int16 a9){
  char(__fastcall *v9)(__int64, const wchar_t *, unsigned int, __int64); 
  unsigned int MatchingDeviceListForSubkey; 
  __int64 *v11; 
  _WORD *v14; 
  unsigned int v15; 
  unsigned int *v16; 
  __int64 v17[3]; 
  const WCHAR *v18; 
  PVOID P; 
  __int64 v20; 
  char(__fastcall *v21)(__int64, const wchar_t *, unsigned int, __int64); 
  __int64 *v22; 
  v9 = a4;
  *a8 = 0;
  if( a7 )
    *a6 = 0;
  if( (a3 & 0xFFFFFE00) != 0 || a9 )
    return(unsigned int)-1073741811;
  if( (a3 & 0x7C) != 0 )
  {
    if( !a2 )
      return(unsigned int)-1073741811;
    return(unsigned int)CmGetDeviceRelationsList(a1, a2, a3, (__int64)a6, a7, (__int64)a8);
  }
  if( (a3 & 2) == 0 )
  {
    if( (a3 & 0x80u) != 0 )
    {
      if( !a2 )
        return(unsigned int)-1073741811;
      v16 = a8;
      v15 = a7;
      v17[2] = (__int64)a5;
      v11 = v17;
      v14 = a6;
      a4 = CmClassFilterCallback;
      v17[0] = (__int64)a2;
      v17[1] = (__int64)v9;
      return(unsigned int)CmGetMatchingDeviceListForSubkey(
                             a1,
                             0i64,
                             BYTE1(a3) & 1,
                             (__int64)a4,
                             (__int64)v11,
                             v14,
                             v15,
                             v16);
    }
    if( (a3 & 1) == 0 )
    {
      v11 = a5;
      v16 = a8;
      v15 = a7;
      v14 = a6;
      return(unsigned int)CmGetMatchingDeviceListForSubkey(
                             a1,
                             0i64,
                             BYTE1(a3) & 1,
                             (__int64)a4,
                             (__int64)v11,
                             v14,
                             v15,
                             v16);
    }
    if( !a2 )
      return(unsigned int)-1073741811;
    return(unsigned int)CmGetMatchingDeviceListForSubkey(a1, a2, BYTE1(a3) & 1, (__int64)a4, (__int64)a5, a6, a7, a8);
  }
  if( !a2 )
    return(unsigned int)-1073741811;
  v22 = a5;
  v18 = a2;
  v20 = 0i64;
  P = 0i64;
  v21 = a4;
  MatchingDeviceListForSubkey = CmGetMatchingDeviceListForSubkey(
                                  a1,
                                  0i64,
                                  BYTE1(a3) & 1,
                                  (__int64)CmServiceFilterCallback,
                                  (__int64)&v18,
                                  a6,
                                  a7,
                                  a8);
  if( P )
    ExFreePoolWithTag(P, 0);
  return MatchingDeviceListForSubkey;
}

Referenced by:

CmGetMatchingFilteredDeviceList