PiDcUpdateDeviceContainerMembership

NTSTATUS __stdcall PiDcUpdateDeviceContainerMembership(
        WCHAR *DeviceInstanceId,
        VOID *DeviceInstanceKey,
        WCHAR *BaseContainerId){
  int DeviceRegProp; 
  __int64 v7; 
  UINT64 *CmRegPropType; 
  UINT64 *CmRegPropTypea; 
  UINT64 *CmRegPropTypeb; 
  UINT8 *PropertyBuffer; 
  UINT64 *PropertySize; 
  UINT64 Flags; 
  UINT8 *Flagsa; 
  UINT8 DeviceAlreadyInContainer[16]; 
  HPNPOPCTX *hPnpOpCtx; 
  UINT8 v18[80]; 
  WCHAR PrevContainerId[40]; 
  WCHAR ContainerId[40]; 

  DeviceAlreadyInContainer[0] = 0;
  hPnpOpCtx = 0i64;
  *(_QWORD *)&DeviceAlreadyInContainer[4] = 0i64;
  DeviceRegProp = PiPnpRtlBeginOperation(&hPnpOpCtx);
  if( DeviceRegProp >= 0 )
  {
    LODWORD(Flags) = 0;
    *(_DWORD *)&DeviceAlreadyInContainer[4] = 78;
    DeviceRegProp = CmGetDeviceRegProp(
                      *(&stru_140CF2E80 + 607),
                      DeviceInstanceId,
                      DeviceInstanceKey,
                      37i64,
                      (UINT64 *)&DeviceAlreadyInContainer[8],
                      v18,
                      (UINT64 *)&DeviceAlreadyInContainer[4],
                      Flags);
    if( DeviceRegProp >= 0 && wcsicmp(BaseContainerId, (const wchar_t *)v18) )
    {
      DeviceRegProp = CmGetDeviceContainerIdFromBase(
                        *(&stru_140CF2E80 + 607),
                        DeviceInstanceId,
                        (const WCHAR *)v18,
                        PrevContainerId,
                        (UINT64)CmRegPropType);
      if( DeviceRegProp < 0 )
        goto LABEL_15;
      DeviceRegProp = CmRemoveDeviceFromContainer(
                        *(&stru_140CF2E80 + 607),
                        PrevContainerId,
                        (WCHAR *)v18,
                        DeviceInstanceId,
                        (WCHAR *)CmRegPropTypeb,
                        (WCHAR *)PropertyBuffer,
                        (WCHAR *)PropertySize,
                        Flagsa,
                        *(INT64 *)DeviceAlreadyInContainer,
                        DeviceAlreadyInContainer[8]);
      if( DeviceRegProp < 0 )
        goto LABEL_15;
      PiDcResetChildDeviceContainers(DeviceInstanceId, PrevContainerId);
    }
    else if( DeviceRegProp == -1073741275 )
    {
      DeviceRegProp = 0;
    }
    if( DeviceRegProp >= 0 )
    {
      DeviceRegProp = CmGetDeviceContainerIdFromBase(
                        *(&stru_140CF2E80 + 607),
                        DeviceInstanceId,
                        BaseContainerId,
                        ContainerId,
                        (UINT64)CmRegPropType);
      if( DeviceRegProp >= 0 )
      {
        v7 = -1i64;
        do
          ++v7;
        while( BaseContainerId[v7] );
        LODWORD(Flagsa) = 0;
        LODWORD(PropertySize) = 2 * v7 + 2;
        LODWORD(CmRegPropTypea) = 1;
        DeviceRegProp = CmSetDeviceRegProp(
                          *(&stru_140CF2E80 + 607),
                          DeviceInstanceId,
                          DeviceInstanceKey,
                          CM_REG_PROP_BASE_CONTAINERID,
                          (UINT64)CmRegPropTypea,
                          (UINT8 *)BaseContainerId,
                          (UINT64)PropertySize,
                          (UINT64)Flagsa);
        if( DeviceRegProp >= 0 )
        {
          if( wcscmp((PWCHAR)L"{00000000-0000-0000-0000-000000000000}", BaseContainerId) )
          {
            DeviceRegProp = CmAddDeviceToContainer(
                              *(&stru_140CF2E80 + 607),
                              ContainerId,
                              BaseContainerId,
                              DeviceInstanceId,
                              DeviceAlreadyInContainer);
            if( DeviceRegProp >= 0 && !DeviceAlreadyInContainer[0] )
              PiDcContainerRequiresConfiguration(ContainerId);
          }
        }
      }
    }
  }
LABEL_15:
  if( hPnpOpCtx )
    PiPnpRtlEndOperation(hPnpOpCtx);
  return DeviceRegProp;
}

Referenced by:

PiProcessNewDeviceNode
PipProcessStartPhase3