PiDqActionDataGetChangedProperties

NTSTATUS __stdcall PiDqActionDataGetChangedProperties(
        VOID *SecurityContext,
        PNP_OBJECT_TYPE ObjectType,
        WCHAR *ObjectName,
        UINT8 GetInBestLocale,
        WCHAR *PreferredLanguages,
        _DEVPROPCOMPKEY *RequestedProperties,
        UINT64 RequestedPropertyCount,
        PI_PNPRTL_OBJECT_EVENT *ObjectEvent,
        _DEVPROPERTY **Properties,
        UINT64 *PropertyCount){
  PI_PNPRTL_OBJECT_EVENT *v10; 
  int v11; 
  unsigned int v12; 
  __int64 v13; 
  VOID *v14; 
  PI_PNPRTL_OBJECT_EVENT *v15; 
  int v16; 
  _DEVPROPCOMPKEY *v17; 
  __int64 v18; 
  PI_PNPRTL_OBJECT_EVENT v19; 
  PNP_OBJECT_TYPE v20; 
  WCHAR *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; 
  UINT64 *v40; 
  UINT64 v41; 
  int v44; 
  VOID *Handle; 
  _DEVPROPERTY **v46; 
  WCHAR *ObjectNamea; 
  PI_PNPRTL_OBJECT_EVENT *v48; 
  WCHAR *v49; 
  HPNPOPCTX *hPnpOpCtx; 
  _SECURITY_SUBJECT_CONTEXT *SecurityContexta; 
  _DEVPROPERTY Property; 

  v10 = ObjectEvent;
  v49 = PreferredLanguages;
  SecurityContexta = (_SECURITY_SUBJECT_CONTEXT *)SecurityContext;
  v11 = 0;
  Handle = 0i64;
  v12 = 0;
  hPnpOpCtx = 0i64;
  *(_DWORD *)PropertyCount = 0;
  ObjectNamea = ObjectName;
  v48 = ObjectEvent;
  v46 = Properties;
  memset(&Property, 0, sizeof(Property));
  PiPnpRtlBeginOperation(&hPnpOpCtx);
  v13 = 0i64;
  v44 = 0;
  if( !ObjectEvent[19] )
    goto LABEL_34;
  while( 1 )
  {
    v14 = 0i64;
    v15 = &v10[8 * v13];
    if( RequestedProperties )
    {
      v16 = 0;
      if( !(_DWORD)RequestedPropertyCount )
        goto LABEL_33;
      while( 1 )
      {
        v17 = &RequestedProperties[v16];
        if( v15[24] == v17->Key.pid )
        {
          v18 = *((_QWORD *)v15 + 10) - *(_QWORD *)&v17->Key.fmtid.Data1;
          if( !v18 )
            v18 = *((_QWORD *)v15 + 11) - *(_QWORD *)v17->Key.fmtid.Data4;
          if( !v18 )
          {
            v19 = v15[25];
            if( v19 == v17->Store && (!*((_QWORD *)v15 + 13) || GetInBestLocale) )
              break;
          }
        }
        if( ++v16 >= (unsigned int)RequestedPropertyCount )
          goto LABEL_33;
      }
    }
    else
    {
      v19 = v15[25];
    }
    if( !v19 )
      break;
    if( v19 != 1 )
    {
      v11 = -1073741811;
      goto LABEL_34;
    }
    v20 = 0;
    if( !Handle )
    {
      v11 = PiDqOpenObjectRegKey(
              DEVPROP_STORE_USER,
              ObjectNamea,
              ObjectType,
              1ui64,
              0,
              SecurityContexta,
              &Handle,
              v40,
              v41);
      if( v11 == -1073741772 )
      {
        Handle = (VOID *)-1i64;
        v11 = 0;
      }
    }
    v14 = Handle;
    if( Handle != (VOID *)-1i64 )
      goto LABEL_14;
LABEL_33:
    v10 = v48;
    v13 = (unsigned int)(v44 + 1);
    v44 = v13;
    if( (unsigned int)v13 >= v48[19] )
      goto LABEL_34;
  }
  v20 = ObjectType;
LABEL_14:
  if( v11 < 0 )
    goto LABEL_34;
  if( !GetInBestLocale )
  {
    v34 = *(unsigned int *)PropertyCount;
    if( v12 <= (unsigned int)v34 )
    {
      if( (_DWORD)RequestedPropertyCount )
      {
        v12 = RequestedPropertyCount;
      }
      else
      {
        v39 = 5;
        if( (unsigned int)v48[19] > 5 )
          v39 = v48[19];
        v12 += v39;
      }
      v11 = PiDqGrowPropertyArray((const VOID **)v46, v34, v12);
      if( v11 < 0 )
        goto LABEL_34;
    }
    v11 = PiDqPnPGetObjectProperty(
            ObjectNamea,
            v20,
            v14,
            (_DEVPROPKEY *)v15 + 4,
            (_DEVPROPSTORE)v15[25],
            *((WCHAR **)v15 + 13),
            &(*v46)[*(unsigned int *)PropertyCount]);
    if( v11 < 0 )
      goto LABEL_34;
LABEL_32:
    ++*(_DWORD *)PropertyCount;
    goto LABEL_33;
  }
  v11 = PiDqPnPGetObjectPropertyInBestLocale(
          ObjectNamea,
          v20,
          v14,
          (_DEVPROPKEY *)v15 + 4,
          (_DEVPROPSTORE)v15[25],
          v49,
          &Property);
  if( v11 >= 0 )
  {
    v21 = v49;
    LocaleName = Property.CompKey.LocaleName;
    while( 1 )
    {
      v23 = (const wchar_t *)((unsigned __int64)v21 & -(__int64)(*v21 != 0));
      v24 = (const wchar_t *)*((_QWORD *)v15 + 13);
      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 = (WCHAR *)&v23[v25 + 1];
    }
    v26 = *(_DWORD *)PropertyCount;
    v27 = 0;
    v28 = v46;
    if( *(_DWORD *)PropertyCount )
    {
      v35 = *v46;
      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((__int64)&Property, 0x58706E50u);
      goto LABEL_33;
    }
LABEL_27:
    if( v12 > v26 )
      goto LABEL_31;
    if( (_DWORD)RequestedPropertyCount )
    {
      v12 = RequestedPropertyCount;
    }
    else
    {
      v38 = 5;
      if( (unsigned int)v48[19] > 5 )
        v38 = v48[19];
      v12 += v38;
    }
    v11 = PiDqGrowPropertyArray((const VOID **)v46, v26, v12);
    if( v11 >= 0 )
    {
LABEL_31:
      v29 = *(_OWORD *)&Property.CompKey.Key.pid;
      v30 = *v28;
      v31 = *(unsigned int *)PropertyCount;
      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((__int64)&Property, 0x58706E50u);
  }
LABEL_34:
  if( (char *)Handle - 1 <= (char *)0xFFFFFFFFFFFFFFFDi64 )
    ZwClose((_HANDLE)Handle);
  if( hPnpOpCtx )
    PiPnpRtlEndOperation(hPnpOpCtx);
  return v11;
}

Referenced by:

PiDqActionDataCreate