PnpDeviceRaisePropertyChangeEventWorker

char __fastcall PnpDeviceRaisePropertyChangeEventWorker(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        __int64 a4,
        __int64 a5,
        void (__fastcall *a6)(__int64, __int64, __int64)){
  int v10; 
  char v11; 
  __int64 v12; 
  __int64 *v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  DEVPROPKEY ***v17; 
  unsigned int v18; 
  unsigned int v19; 
  __int64 v20; 
  DEVPROPKEY *v21; 
  char v22; 
  __int64 v23; 
  int v24; 
  DEVPROPKEY ***v25; 
  unsigned int v26; 
  __int64 v27; 
  DEVPROPKEY *v28; 
  int MatchingFilteredDeviceInterfaceList; 
  __int64 v30; 
  __int64 v31; 
  __int64 v32; 
  int ObjectProperty; 
  int v34; 
  __int64 *v35; 
  __int64 v36; 
  __int64 v37; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  __int64 v41; 
  ULONG v43; 
  _BYTE v44[24]; 
  int v45; 
  __int64 v46; 
  __int64 v47; 
  __int128 v48; 
  __int128 v49; 
  __int128 Source2; 
  __int16 v51[40]; 
  v46 = a2;
  v47 = a3;
  v45 = 0;
  v43 = 0;
  *(_OWORD *)&v44[8] = 0i64;
  Source2 = 0i64;
  v48 = 0i64;
  v49 = 0i64;
  if( a4 )
    goto LABEL_4;
  v10 = *(_DWORD *)(a5 + 16);
  if( v10 == 6 )
  {
    v40 = *(_QWORD *)a5 - *(_QWORD *)&DEVPKEY_Device_SessionId.fmtid.Data1;
    if( *(_QWORD *)a5 == *(_QWORD *)&DEVPKEY_Device_SessionId.fmtid.Data1 )
      v40 = *(_QWORD *)(a5 + 8) - *(_QWORD *)DEVPKEY_Device_SessionId.fmtid.Data4;
    if( !v40 )
      goto LABEL_69;
  }
  if( v10 != 100 )
    goto LABEL_4;
  v41 = *(_QWORD *)a5 - DEVPKEY_Device_RestrictedSD;
  if( *(_QWORD *)a5 == DEVPKEY_Device_RestrictedSD )
    v41 = *(_QWORD *)(a5 + 8) - 0x57C1C6A499921E96i64;
  if( v41 )
  {
LABEL_4:
    v11 = 0;
  }
  else
  {
LABEL_69:
    *(_QWORD *)v44 = 0i64;
    v11 = 1;
    a6(a1, a2, 1i64);
  }
  *(_QWORD *)v44 = a3;
  *(_QWORD *)&v44[8] = a4;
  *(_QWORD *)&v44[16] = a5;
  a6(a1, a2, 1i64);
  v12 = v46;
  v13 = &qword_140001D98;
  v14 = 12i64;
  do
  {
    v15 = 0i64;
    if( *(_DWORD *)v13 )
    {
      while( 1 )
      {
        v16 = *(_QWORD *)(*(v13 - 1) + 8 * v15);
        if( *(_DWORD *)(a5 + 16) == *(_DWORD *)(v16 + 16) )
        {
          v30 = *(_QWORD *)a5 - *(_QWORD *)v16;
          if( *(_QWORD *)a5 == *(_QWORD *)v16 )
            v30 = *(_QWORD *)(a5 + 8) - *(_QWORD *)(v16 + 8);
          if( !v30 )
            break;
        }
        v15 = (unsigned int)(v15 + 1);
        if( (unsigned int)v15 >= *(_DWORD *)v13 )
          goto LABEL_9;
      }
      *(_QWORD *)&v44[16] = v13[1];
      ((void(__fastcall *)(__int64, __int64, __int64, __int64, _BYTE *))a6)(a1, v12, 1i64, 4i64, v44);
    }
LABEL_9:
    v13 += 3;
    --v14;
  }
  while( v14 );
  v17 = &off_140001D30;
  v18 = 0;
  while( 1 )
  {
    v19 = *((_DWORD *)v17 + 2);
    v20 = 0i64;
    if( v19 )
      break;
LABEL_14:
    ++v18;
    v17 += 3;
    if( v18 >= 3 )
    {
      v22 = 0;
      goto LABEL_16;
    }
  }
  while( 1 )
  {
    v21 = (*v17)[v20];
    if( *(_DWORD *)(a5 + 16) == v21->pid )
    {
      v31 = *(_QWORD *)a5 - *(_QWORD *)&v21->fmtid.Data1;
      if( *(_QWORD *)a5 == *(_QWORD *)&v21->fmtid.Data1 )
        v31 = *(_QWORD *)(a5 + 8) - *(_QWORD *)v21->fmtid.Data4;
      if( !v31 )
        break;
    }
    v20 = (unsigned int)(v20 + 1);
    if( (unsigned int)v20 >= v19 )
      goto LABEL_14;
  }
  v22 = 1;
LABEL_16:
  if( v11 || v22 )
  {
    v23 = v46;
    ObjectProperty = PnpGetObjectProperty(
                       a1,
                       v46,
                       1i64,
                       v47,
                       0i64,
                       (__int64)&DEVPKEY_Device_ContainerId,
                       &v45,
                       (unsigned __int64)&Source2,
                       16,
                       &v43,
                       0);
    if( ObjectProperty == -1073741275 || ObjectProperty == -1073741772 )
      goto LABEL_19;
    if( ObjectProperty < 0 )
      goto LABEL_70;
    if( RtlCompareMemory(qword_14000A920, &Source2, 0x10ui64) == 16 )
      goto LABEL_19;
    PnpStringFromGuid((int *)&Source2, (wchar_t *)v51);
    if( v34 < 0 )
    {
LABEL_70:
      *(_QWORD *)v44 = 0i64;
      ((void(__fastcall *)(__int64, _QWORD, __int64, __int64, _BYTE *))a6)(a1, 0i64, 5i64, 1i64, v44);
      goto LABEL_19;
    }
    if( v11 )
    {
      *(_QWORD *)v44 = 0i64;
      ((void(__fastcall *)(__int64, __int16 *, __int64, __int64, _BYTE *))a6)(a1, v51, 5i64, 5i64, v44);
    }
    if( v22 )
    {
      v35 = &qword_140001D38;
      *(_OWORD *)v44 = 0i64;
      v36 = 3i64;
      do
      {
        v37 = 0i64;
        if( *(_DWORD *)v35 )
        {
          while( 1 )
          {
            v38 = *(_QWORD *)(*(v35 - 1) + 8 * v37);
            if( *(_DWORD *)(a5 + 16) == *(_DWORD *)(v38 + 16) )
            {
              v39 = *(_QWORD *)a5 - *(_QWORD *)v38;
              if( *(_QWORD *)a5 == *(_QWORD *)v38 )
                v39 = *(_QWORD *)(a5 + 8) - *(_QWORD *)(v38 + 8);
              if( !v39 )
                break;
            }
            v37 = (unsigned int)(v37 + 1);
            if( (unsigned int)v37 >= *(_DWORD *)v35 )
              goto LABEL_52;
          }
          *(_QWORD *)&v44[16] = v35[1];
          ((void(__fastcall *)(__int64, __int16 *, __int64, __int64, _BYTE *))a6)(a1, v51, 5i64, 4i64, v44);
        }
LABEL_52:
        v35 += 3;
        --v36;
      }
      while( v36 );
    }
  }
  else
  {
    v23 = v46;
  }
LABEL_19:
  v24 = 0;
  v25 = &off_140001D78;
  while( 1 )
  {
    v26 = *((_DWORD *)v25 + 2);
    v27 = 0i64;
    if( v26 )
      break;
LABEL_23:
    ++v24;
    v25 += 3;
    if( v24 )
    {
      LOBYTE(MatchingFilteredDeviceInterfaceList) = 0;
      goto LABEL_25;
    }
  }
  while( 1 )
  {
    v28 = (*v25)[v27];
    if( *(_DWORD *)(a5 + 16) == v28->pid )
    {
      v32 = *(_QWORD *)a5 - *(_QWORD *)&v28->fmtid.Data1;
      if( *(_QWORD *)a5 == *(_QWORD *)&v28->fmtid.Data1 )
        v32 = *(_QWORD *)(a5 + 8) - *(_QWORD *)v28->fmtid.Data4;
      if( !v32 )
        break;
    }
    v27 = (unsigned int)(v27 + 1);
    if( (unsigned int)v27 >= v26 )
      goto LABEL_23;
  }
  LOBYTE(MatchingFilteredDeviceInterfaceList) = 1;
LABEL_25:
  if( v11 || (_BYTE)MatchingFilteredDeviceInterfaceList )
  {
    *(_QWORD *)&v48 = a6;
    BYTE12(v49) = v11;
    if( (_BYTE)MatchingFilteredDeviceInterfaceList )
    {
      *((_QWORD *)&v48 + 1) = a5;
      *(_QWORD *)&v49 = &off_140001D78;
      DWORD2(v49) = 1;
    }
    MatchingFilteredDeviceInterfaceList = CmGetMatchingFilteredDeviceInterfaceList(
                                            a1,
                                            0i64,
                                            v23,
                                            0,
                                            (__int64)PnpUpdateInterfacesCallback,
                                            (__int64)&v48,
                                            0i64,
                                            0,
                                            (__int64)&v43,
                                            0);
    if( MatchingFilteredDeviceInterfaceList < 0 )
    {
      *(_QWORD *)v44 = 0i64;
      LOBYTE(MatchingFilteredDeviceInterfaceList) = ((__int64(__fastcall *)(__int64, _QWORD, __int64, __int64, _BYTE *))a6)(
                                                      a1,
                                                      0i64,
                                                      3i64,
                                                      1i64,
                                                      v44);
    }
  }
  return MatchingFilteredDeviceInterfaceList;
}

Referenced by:

PnpObjectRaisePropertyChangeEvent