PiDqActionDataGetChangedProperties

INT64 __fastcall PiDqActionDataGetChangedProperties(
        VOID *a1,
        UINT64 a2,
        INT64 a3,
        CHAR a4,
        INT64 a5,
        INT64 a6,
        UINT64 MaxPropertyCount,
        INT64 a8,
        INT64 a9,
        INT64 a10){
  INT64 v10; 
  int v11; 
  unsigned int v12; 
  __int64 v13; 
  char *v14; 
  __int64 v15; 
  unsigned int v16; 
  INT64 v17; 
  __int64 v18; 
  int v19; 
  unsigned int v20; 
  NTSTRSAFE_PCWSTR v21; 
  const wchar_t *LocaleName; 
  const wchar_t *v23; 
  const wchar_t *v24; 
  __int64 v25; 
  unsigned int v26; 
  unsigned int v27; 
  _DEVPROPERTY **v28; 
  __int128 v29; 
  _DEVPROPERTY *v30; 
  __int64 v31; 
  __int128 v32; 
  UINT64 v34; 
  _DEVPROPERTY *v35; 
  __int64 v36; 
  __int64 v37; 
  int v38; 
  int v39; 
  INT64 v40; 
  unsigned int v42; 
  int v43; 
  HANDLE Handle; 
  _DEVPROPERTY **Properties; 
  INT64 v46; 
  INT64 v47; 
  NTSTRSAFE_PCWSTR v48; 
  PVOID P; 
  VOID *v50; 
  DEVPROPERTY Property; 
  v10 = a8;
  v48 = (NTSTRSAFE_PCWSTR)a5;
  v50 = a1;
  v11 = 0;
  Handle = 0i64;
  v12 = 0;
  P = 0i64;
  *(_DWORD *)a10 = 0;
  v46 = a3;
  v42 = a2;
  v47 = a8;
  Properties = (_DEVPROPERTY **)a9;
  memset(&Property, 0, sizeof(Property));
  PiPnpRtlBeginOperation((__int64 **)&P);
  v13 = 0i64;
  v43 = 0;
  if( !*(_DWORD *)(a8 + 76) )
    goto LABEL_34;
  while( 1 )
  {
    v14 = 0i64;
    v15 = 32 * v13 + v10;
    if( a6 )
    {
      v16 = 0;
      if( !(_DWORD)MaxPropertyCount )
        goto LABEL_33;
      while( 1 )
      {
        v17 = a6 + 32i64 * v16;
        if( *(_DWORD *)(v15 + 96) == *(_DWORD *)(v17 + 16) )
        {
          v18 = *(_QWORD *)(v15 + 80) - *(_QWORD *)v17;
          if( !v18 )
            v18 = *(_QWORD *)(v15 + 88) - *(_QWORD *)(v17 + 8);
          if( !v18 )
          {
            v19 = *(_DWORD *)(v15 + 100);
            if( v19 == *(_DWORD *)(v17 + 20) && (!*(_QWORD *)(v15 + 104) || a4) )
              break;
          }
        }
        if( ++v16 >= (unsigned int)MaxPropertyCount )
          goto LABEL_33;
      }
    }
    else
    {
      v19 = *(_DWORD *)(v15 + 100);
    }
    if( !v19 )
      break;
    if( v19 != 1 )
    {
      v11 = -1073741811;
      goto LABEL_34;
    }
    v20 = 0;
    if( !Handle )
    {
      v11 = PiDqOpenObjectRegKey(1, v46, v42, 1, 0, (__int64)v50, (__int64)&Handle);
      if( v11 == -1073741772 )
      {
        Handle = (HANDLE)-1i64;
        v11 = 0;
      }
    }
    v14 = (char *)Handle;
    if( Handle != (HANDLE)-1i64 )
      goto LABEL_14;
LABEL_33:
    v10 = v47;
    v13 = (unsigned int)(v43 + 1);
    v43 = v13;
    if( (unsigned int)v13 >= *(_DWORD *)(v47 + 76) )
      goto LABEL_34;
  }
  v20 = v42;
LABEL_14:
  if( v11 < 0 )
    goto LABEL_34;
  if( !a4 )
  {
    v34 = *(unsigned int *)a10;
    if( v12 <= (unsigned int)v34 )
    {
      if( (_DWORD)MaxPropertyCount )
      {
        v12 = MaxPropertyCount;
      }
      else
      {
        v39 = 5;
        if( *(_DWORD *)(v47 + 76) > 5u )
          v39 = *(_DWORD *)(v47 + 76);
        v12 += v39;
      }
      v11 = PiDqGrowPropertyArray((const _DEVPROPERTY **)Properties, v34, v12);
      if( v11 < 0 )
        goto LABEL_34;
    }
    v11 = PiDqPnPGetObjectProperty(
            v46,
            v20,
            v14,
            v15 + 80,
            *(_DWORD *)(v15 + 100),
            *(NTSTRSAFE_PCWSTR *)(v15 + 104),
            (__int64)&(*Properties)[*(unsigned int *)a10]);
    if( v11 < 0 )
      goto LABEL_34;
LABEL_32:
    ++*(_DWORD *)a10;
    goto LABEL_33;
  }
  LODWORD(v40) = *(_DWORD *)(v15 + 100);
  v11 = PiDqPnPGetObjectPropertyInBestLocale(v46, v20, v14, v15 + 80, v40, (WCHAR *)v48, &Property);
  if( v11 >= 0 )
  {
    v21 = v48;
    LocaleName = Property.CompKey.LocaleName;
    while( 1 )
    {
      v23 = (const wchar_t *)((unsigned __int64)v21 & -(__int64)(*v21 != 0));
      v24 = *(const wchar_t **)(v15 + 104);
      if( v24 == v23 || v24 && v23 && !wcsicmp(v24, v23) )
        break;
      if( LocaleName == v23 || LocaleName && (!v23 || !wcsicmp(LocaleName, v23)) || !v23 )
        goto LABEL_59;
      v25 = -1i64;
      do
        ++v25;
      while( v23[v25] );
      v21 = &v23[v25 + 1];
    }
    v26 = *(_DWORD *)a10;
    v27 = 0;
    v28 = Properties;
    if( *(_DWORD *)a10 )
    {
      v35 = *Properties;
      while( 1 )
      {
        v36 = v27;
        if( Property.CompKey.Key.pid == v35[v36].CompKey.Key.pid )
        {
          v37 = *(_QWORD *)&Property.CompKey.Key.fmtid.Data1 - *(_QWORD *)&v35[v36].CompKey.Key.fmtid.Data1;
          if( *(_QWORD *)&Property.CompKey.Key.fmtid.Data1 == *(_QWORD *)&v35[v36].CompKey.Key.fmtid.Data1 )
            v37 = *(_QWORD *)Property.CompKey.Key.fmtid.Data4 - *(_QWORD *)v35[v36].CompKey.Key.fmtid.Data4;
          if( !v37 && Property.CompKey.Store == v35[v36].CompKey.Store )
            break;
        }
        if( ++v27 >= v26 )
          goto LABEL_27;
      }
LABEL_59:
      PnpFreeDevProperty(&Property, 0x58706E50ui64);
      goto LABEL_33;
    }
LABEL_27:
    if( v12 > v26 )
      goto LABEL_31;
    if( (_DWORD)MaxPropertyCount )
    {
      v12 = MaxPropertyCount;
    }
    else
    {
      v38 = 5;
      if( *(_DWORD *)(v47 + 76) > 5u )
        v38 = *(_DWORD *)(v47 + 76);
      v12 += v38;
    }
    v11 = PiDqGrowPropertyArray((const _DEVPROPERTY **)Properties, v26, v12);
    if( v11 >= 0 )
    {
LABEL_31:
      v29 = *(_OWORD *)&Property.CompKey.Key.pid;
      v30 = *v28;
      v31 = *(unsigned int *)a10;
      v30[v31].CompKey.Key.fmtid = Property.CompKey.Key.fmtid;
      v32 = *(_OWORD *)&Property.Type;
      *(_OWORD *)&v30[v31].CompKey.Key.pid = v29;
      *(_OWORD *)&v30[v31].Type = v32;
      goto LABEL_32;
    }
    PnpFreeDevProperty(&Property, 0x58706E50ui64);
  }
LABEL_34:
  if( (char *)Handle - 1 <= (char *)0xFFFFFFFFFFFFFFFDi64 )
    ZwClose(Handle);
  if( P )
    PiPnpRtlEndOperation(P);
  return(unsigned int)v11;
}

Referenced by:

PiDqActionDataCreate