CmGetMatchingDeviceListForSubkey

__int64 __fastcall CmGetMatchingDeviceListForSubkey(
        __int64 a1,
        const WCHAR *a2,
        char a3,
        __int64 a4,
        __int64 a5,
        _WORD *a6,
        unsigned int a7,
        unsigned int *a8){
  int CachedContextBaseKey; 
  WCHAR *v11; 
  int v12; 
  __int64 v13; 
  int v14; 
  VOID *PoolWithTag; 
  __int64 v16; 
  unsigned int v17; 
  unsigned int v18; 
  WCHAR *v20; 
  UINT64 dwFlags; 
  HANDLE Handle; 
  char *v23; 
  v23 = 0i64;
  *a8 = 0;
  Handle = 0i64;
  if( a7 )
    *a6 = 0;
  CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(a1, 5, (__int64 *)&v23);
  if( CachedContextBaseKey >= 0 )
  {
    v11 = (WCHAR *)a2;
    v12 = 0;
    if( a2 )
    {
      while( *v11 && *v11 != 92 )
      {
        if( (unsigned int)++v12 > 2 )
        {
          CachedContextBaseKey = -1073741811;
          goto LABEL_17;
        }
        v20 = wcschr(v11, 0x5Cu);
        if( v20 )
        {
          v11 = v20 + 1;
          if( v11 )
            continue;
        }
        goto LABEL_5;
      }
      CachedContextBaseKey = -1073741811;
    }
LABEL_5:
    if( CachedContextBaseKey >= 0 )
    {
      v13 = 0i64;
      if( a1 )
        v13 = *(_QWORD *)(a1 + 224);
      v14 = SysCtxRegOpenKey(v13, v23, a2, 0, 8u, &Handle);
      CachedContextBaseKey = v14;
      if( v14 == -1073741444 )
      {
        CachedContextBaseKey = -1073741595;
      }
      else if( v14 >= 0 )
      {
        PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x1B8ui64, 0x52504E50ui64);
        v16 = (__int64)PoolWithTag;
        if( PoolWithTag )
        {
          memset((INT64)PoolWithTag + 4, 0i64);
          LODWORD(dwFlags) = 2304;
          *(_DWORD *)v16 = v12 + 1;
          RtlStringCchCopyExW((WCHAR *)(v16 + 4), 0xC8ui64, (WCHAR *)a2, 0i64, 0i64, dwFlags);
          *(_BYTE *)(v16 + 404) = a3;
          *(_QWORD *)(v16 + 408) = a4;
          *(_QWORD *)(v16 + 416) = a5;
          *(_QWORD *)(v16 + 424) = a6;
          *(_DWORD *)(v16 + 432) = a7;
          *(_DWORD *)(v16 + 436) = 0;
          CachedContextBaseKey = PnpCtxRegEnumKeyWithCallback(a1, Handle, (__int64)CmEnumSubkeyCallback, v16);
          if( CachedContextBaseKey >= 0 )
          {
            v17 = *(_DWORD *)(v16 + 436);
            *a8 = v17;
            if( v17 )
            {
              v18 = v17 + 1;
              *a8 = v18;
              if( a6 && a7 >= v18 )
                a6[v18 - 1] = 0;
              else
                CachedContextBaseKey = -1073741789;
            }
          }
          ExFreePoolWithTag((PVOID)v16, 0);
        }
        else
        {
          CachedContextBaseKey = -1073741801;
        }
      }
    }
  }
LABEL_17:
  if( Handle )
    ZwClose(Handle);
  return(unsigned int)CachedContextBaseKey;
}

Referenced by:

CmGetMatchingDeviceList
CmGetMatchingFilteredDeviceListWorker