PiPnpRtlSetObjectProperty

INT64 __fastcall PiPnpRtlSetObjectProperty(
        INT64 a1,
        WCHAR *a2,
        UINT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        WCHAR *pszSrc,
        UINT64 a9,
        UINT64 a10){
  unsigned int v11; 
  int v13; 
  int v14; 
  char *v15; 
  unsigned int i; 
  _QWORD *v17; 
  __int64 v18; 
  __int64 v19; 
  int v20; 
  int v21; 
  __int64 v22; 
  int v23; 
  unsigned int v24; 
  int v25; 
  __int64 v27; 
  __int64 v28; 
  int v29; 
  INT64(__stdcall *v30)(PVOID); 
  unsigned int v31; 
  _QWORD *v32; 
  __int64 v33; 
  bool v34; 
  __int64 v35; 
  __int64 v36; 
  __int64 v37; 
  _ETHREAD *CurrentThread; 
  __int64 v39; 
  __int64 v40; 
  WCHAR v41; 
  __int64 v42; 
  __int64 v43; 
  __int64 v44; 
  __int64 v45; 
  __int64 v46; 
  WCHAR v47; 
  __int64 v48; 
  bool v49; 
  __int64 v50; 
  int DeviceRegProp; 
  int ObjectProperty; 
  char v53; 
  ULONG v54; 
  int v55; 
  UINT64 OldConfigFlags; 
  int v57; 
  UINT64 NewConfigFlags; 
  __int64 v59; 
  unsigned int v60; 
  unsigned int v61; 
  __int64 v62; 
  struct _UNICODE_STRING DestinationString; 
  __int64 v64; 
  __int128 v65; 
  GUID Guid; 
  v62 = a1;
  v11 = a3;
  v59 = a4;
  v64 = a5;
  v61 = 0;
  v13 = 0;
  v60 = 0;
  v54 = 0;
  v57 = 0;
  OldConfigFlags = 0i64;
  LODWORD(NewConfigFlags) = 0;
  v55 = 0;
  v53 = 0;
  DestinationString = 0i64;
  Guid = 0i64;
  v65 = 0i64;
  if( (_DWORD)a3 != 1 )
  {
    if( (_DWORD)a3 == 3 )
    {
      if( *(_DWORD *)(a6 + 16) == 256 )
      {
        v48 = *(_QWORD *)a6 - *(_QWORD *)&DEVPKEY_Device_InstanceId.fmtid.Data1;
        if( *(_QWORD *)a6 == *(_QWORD *)&DEVPKEY_Device_InstanceId.fmtid.Data1 )
          v48 = *(_QWORD *)(a6 + 8) - *(_QWORD *)DEVPKEY_Device_InstanceId.fmtid.Data4;
        v49 = v48 == 0;
LABEL_95:
        if( v49 )
          return(unsigned int)-1073741790;
      }
    }
    else if( (_DWORD)a3 == 5 )
    {
      v29 = *(_DWORD *)(a6 + 16);
      v30 = PiPnpRtlContainerReadOnlyProps;
      v31 = 0;
      while( 1 )
      {
        v32 = *(_QWORD **)v30;
        if( v29 == *(_DWORD *)(*(_QWORD *)v30 + 16i64) )
        {
          v43 = *(_QWORD *)a6 - *v32;
          if( *(_QWORD *)a6 == *v32 )
            v43 = *(_QWORD *)(a6 + 8) - v32[1];
          if( !v43 )
            return(unsigned int)-1073741790;
        }
        ++v31;
        v30 = (INT64(__stdcall *)(PVOID))((char *)v30 + 8);
        if( v31 >= 2 )
        {
          if( v29 == 105 )
          {
            v33 = *(_QWORD *)a6 - *(_QWORD *)&DEVPKEY_DeviceContainer_ConfigFlags.fmtid.Data1;
            if( *(_QWORD *)a6 == *(_QWORD *)&DEVPKEY_DeviceContainer_ConfigFlags.fmtid.Data1 )
              v33 = *(_QWORD *)(a6 + 8) - *(_QWORD *)DEVPKEY_DeviceContainer_ConfigFlags.fmtid.Data4;
            if( !v33 )
            {
              v34 = (_DWORD)a7 == 7;
              goto LABEL_43;
            }
          }
          break;
        }
      }
    }
LABEL_9:
    v18 = *(_QWORD *)DEVPKEY_Device_ConfigFlags.fmtid.Data4;
    v19 = *(_QWORD *)&DEVPKEY_Device_ConfigFlags.fmtid.Data1;
    goto LABEL_10;
  }
  v14 = *(_DWORD *)(a6 + 16);
  v15 = (char *)&PiPnpRtlDeviceReadOnlyProps;
  for( i = 0; i < 0xD; ++i )
  {
    v17 = *(_QWORD **)v15;
    if( v14 == *(_DWORD *)(*(_QWORD *)v15 + 16i64) )
    {
      v28 = *(_QWORD *)a6 - *v17;
      if( *(_QWORD *)a6 == *v17 )
        v28 = *(_QWORD *)(a6 + 8) - v17[1];
      if( !v28 )
        return(unsigned int)-1073741790;
    }
    v15 += 8;
  }
  if( v14 != 12 )
  {
    if( v14 == 3 )
    {
      v36 = *(_QWORD *)a6 - *(_QWORD *)&DEVPKEY_Device_HardwareIds.fmtid.Data1;
      if( *(_QWORD *)a6 == *(_QWORD *)&DEVPKEY_Device_HardwareIds.fmtid.Data1 )
        v36 = *(_QWORD *)(a6 + 8) - *(_QWORD *)DEVPKEY_Device_HardwareIds.fmtid.Data4;
      if( !v36 )
        goto LABEL_94;
    }
    if( v14 == 4 )
    {
      v42 = *(_QWORD *)a6 - *(_QWORD *)&DEVPKEY_Device_CompatibleIds.fmtid.Data1;
      if( *(_QWORD *)a6 == *(_QWORD *)&DEVPKEY_Device_CompatibleIds.fmtid.Data1 )
        v42 = *(_QWORD *)(a6 + 8) - *(_QWORD *)DEVPKEY_Device_CompatibleIds.fmtid.Data4;
      if( !v42 )
      {
LABEL_94:
        v49 = CmIsRootEnumeratedDevice(a2) == 0;
        goto LABEL_95;
      }
    }
    else if( v14 == 2 )
    {
      v35 = *(_QWORD *)a6 - DEVPKEY_Device_PanelId;
      if( *(_QWORD *)a6 == DEVPKEY_Device_PanelId )
        v35 = *(_QWORD *)(a6 + 8) + 0x5292C1A216403965i64;
      if( !v35 )
      {
        if( !pszSrc
          || (unsigned int)a9 < 2
          || (_DWORD)a7 != 18
          || pszSrc[((unsigned __int64)(unsigned int)a9 >> 1) - 1]
          || (int)CmSplitDevicePanelId(pszSrc, &Guid, &v61, &v60) < 0
          || (int)PnpGetObjectProperty(
                    a1,
                    (__int64)a2,
                    1i64,
                    v59,
                    0i64,
                    (__int64)&DEVPKEY_Device_ContainerId,
                    &v55,
                    (unsigned __int64)&v65,
                    16,
                    &v54,
                    0) < 0
          || v55 != 13
          || v54 != 16 )
        {
          return(unsigned int)-1073741811;
        }
        v50 = v65 - *(_QWORD *)&Guid.Data1;
        if( (_QWORD)v65 == *(_QWORD *)&Guid.Data1 )
          v50 = *((_QWORD *)&v65 + 1) - *(_QWORD *)Guid.Data4;
        v34 = v50 == 0;
LABEL_43:
        if( !v34 )
          return(unsigned int)-1073741811;
      }
    }
    goto LABEL_9;
  }
  v19 = *(_QWORD *)&DEVPKEY_Device_ConfigFlags.fmtid.Data1;
  v18 = *(_QWORD *)DEVPKEY_Device_ConfigFlags.fmtid.Data4;
  v44 = *(_QWORD *)a6 - *(_QWORD *)&DEVPKEY_Device_ConfigFlags.fmtid.Data1;
  if( *(_QWORD *)a6 == *(_QWORD *)&DEVPKEY_Device_ConfigFlags.fmtid.Data1 )
    v44 = *(_QWORD *)(a6 + 8) - *(_QWORD *)DEVPKEY_Device_ConfigFlags.fmtid.Data4;
  if( !v44 && (!pszSrc || (_DWORD)a9 != 4) )
    return(unsigned int)-1073741811;
LABEL_10:
  v20 = 5;
  if( v11 == 1 )
  {
    v21 = *(_DWORD *)(a6 + 16);
    switch( v21 )
    {
      case 10:
        v37 = *(_QWORD *)a6 - *(_QWORD *)&DEVPKEY_Device_ClassGuid.fmtid.Data1;
        if( *(_QWORD *)a6 == *(_QWORD *)&DEVPKEY_Device_ClassGuid.fmtid.Data1 )
          v37 = *(_QWORD *)(a6 + 8) - *(_QWORD *)DEVPKEY_Device_ClassGuid.fmtid.Data4;
        if( !v37 )
        {
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          --*((_WORD *)CurrentThread + 242);
          ExAcquireResourceExclusiveLite(&PnpRegistryDeviceResource, 1u);
          v53 = 1;
        }
        break;
      case 12:
        v45 = *(_QWORD *)a6 - v19;
        if( *(_QWORD *)a6 == v19 )
          v45 = *(_QWORD *)(a6 + 8) - v18;
        if( !v45 && (unsigned __int8)SeAuditingWithTokenForSubcategory(0x89ui64, 0i64) )
        {
          v54 = 4;
          DeviceRegProp = CmGetDeviceRegProp(
                            v62,
                            a2,
                            v59,
                            11,
                            (__int64)&v57,
                            (__int64)&OldConfigFlags,
                            (__int64)&v54,
                            0);
          if( DeviceRegProp < 0 || v54 != 4 || v57 != 4 )
            LODWORD(OldConfigFlags) = 0;
          LODWORD(NewConfigFlags) = *(_DWORD *)pszSrc;
        }
        break;
      case 5:
        v39 = *(_QWORD *)a6 - DEVPKEY_Device_InstallError;
        if( *(_QWORD *)a6 == DEVPKEY_Device_InstallError )
          v39 = *(_QWORD *)(a6 + 8) - 0x293B573F92A15394i64;
        if( !v39 && (unsigned __int8)SeAuditingWithTokenForSubcategory(0x89ui64, 0i64) )
        {
          v54 = 4;
          ObjectProperty = PnpGetObjectProperty(
                             v62,
                             (__int64)a2,
                             1i64,
                             v59,
                             0i64,
                             (__int64)&DEVPKEY_Device_InstallError,
                             &v55,
                             (unsigned __int64)&OldConfigFlags + 4,
                             4,
                             &v54,
                             0);
          if( ObjectProperty < 0 || v54 != 4 || v55 != 23 )
            HIDWORD(OldConfigFlags) = 0;
          if( (_DWORD)a9 == 4 && (_DWORD)a7 == 23 )
            v13 = *(_DWORD *)pszSrc;
        }
        break;
    }
  }
  v22 = v62;
  v23 = PnpSetObjectProperty(v62, (__int64)a2, v11, v59, v64, a6, a7, (__int64)pszSrc, a9, a10);
  v24 = v11 - 1;
  if( v24 )
  {
    if( v24 == 2 && v23 >= 0 && *(_DWORD *)(a6 + 16) == 9 )
    {
      v27 = *(_QWORD *)a6 - *(_QWORD *)&DEVPKEY_Device_PhysicalDeviceLocation.fmtid.Data1;
      if( *(_QWORD *)a6 == *(_QWORD *)&DEVPKEY_Device_PhysicalDeviceLocation.fmtid.Data1 )
        v27 = *(_QWORD *)(a6 + 8) - *(_QWORD *)DEVPKEY_Device_PhysicalDeviceLocation.fmtid.Data4;
      if( !v27 )
        CmUpdateDevicePanelInterface(v22, (__int64)a2, v59);
    }
    goto LABEL_17;
  }
  v25 = *(_DWORD *)(a6 + 16);
  if( v25 == 12 )
  {
    v46 = *(_QWORD *)a6 - *(_QWORD *)&DEVPKEY_Device_ConfigFlags.fmtid.Data1;
    if( *(_QWORD *)a6 == *(_QWORD *)&DEVPKEY_Device_ConfigFlags.fmtid.Data1 )
      v46 = *(_QWORD *)(a6 + 8) - *(_QWORD *)DEVPKEY_Device_ConfigFlags.fmtid.Data4;
    if( !v46 && (unsigned __int8)SeAuditingWithTokenForSubcategory(0x89ui64, 0i64) )
    {
      RtlInitUnicodeString(&DestinationString, a2, v47);
      PiAuditDeviceEnableDisableRequest(
        &DestinationString,
        (unsigned int)OldConfigFlags,
        (unsigned int)NewConfigFlags,
        v23 >= 0);
    }
    goto LABEL_17;
  }
  if( v25 == 5 )
  {
    v40 = *(_QWORD *)a6 - DEVPKEY_Device_InstallError;
    if( *(_QWORD *)a6 == DEVPKEY_Device_InstallError )
      v40 = *(_QWORD *)(a6 + 8) - 0x293B573F92A15394i64;
    if( !v40 && (unsigned __int8)SeAuditingWithTokenForSubcategory(0x89ui64, 0i64) )
    {
      RtlInitUnicodeString(&DestinationString, a2, v41);
      if( HIDWORD(OldConfigFlags) == -536870328 )
      {
        if( v13 == -536870328 )
          goto LABEL_17;
        v20 = 6;
      }
      else if( v13 != -536870328 )
      {
        goto LABEL_17;
      }
      PiAuditDeviceOperation((__int64)&DestinationString, v20, v23 >= 0);
    }
  }
LABEL_17:
  if( v53 )
  {
    ExReleaseResourceLite(&PnpRegistryDeviceResource);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  return(unsigned int)v23;
}

Referenced by:

PiCMSetObjectProperty
PiDevCfgSetObjectProperty
PiDqIrpPropertySet
PiSwPropertySet
PnpSetDeviceInterfacePropertyData
PnpSetDevicePropertyData