PiDcUpdateDeviceContainerMembership

NTSTATUS __stdcall PiDcUpdateDeviceContainerMembership(
        PWCHAR DeviceInstanceId,
        PVOID DeviceInstanceKey,
        PWCHAR BaseContainerId){
  NTSTATUS DeviceRegProp; 
  __int64 v7; 
  char v9[4]; 
  int v10; 
  int v11; 
  PVOID P; 
  wchar_t Str2[40]; 
  __int16 PrevContainerId[40]; 
  wchar_t ContainerId[40]; 
  v9[0] = 0;
  P = 0i64;
  v11 = 0;
  v10 = 0;
  DeviceRegProp = PiPnpRtlBeginOperation((__int64 **)&P);
  if( DeviceRegProp >= 0 )
  {
    v10 = 78;
    DeviceRegProp = CmGetDeviceRegProp(
                      PiPnpRtlCtx,
                      DeviceInstanceId,
                      (__int64)DeviceInstanceKey,
                      37,
                      (__int64)&v11,
                      (__int64)Str2,
                      (__int64)&v10,
                      0);
    if( DeviceRegProp >= 0 && wcsicmp(BaseContainerId, Str2) )
    {
      DeviceRegProp = CmGetDeviceContainerIdFromBase(PiPnpRtlCtx, DeviceInstanceId, Str2, (wchar_t *)PrevContainerId);
      if( DeviceRegProp < 0 )
        goto LABEL_15;
      DeviceRegProp = CmRemoveDeviceFromContainer(
                        PiPnpRtlCtx,
                        (const WCHAR *)PrevContainerId,
                        (__int64)Str2,
                        (__int64)DeviceInstanceId);
      if( DeviceRegProp < 0 )
        goto LABEL_15;
      PiDcResetChildDeviceContainers(DeviceInstanceId, (const WCHAR *)PrevContainerId);
    }
    else if( DeviceRegProp == -1073741275 )
    {
      DeviceRegProp = 0;
    }
    if( DeviceRegProp >= 0 )
    {
      DeviceRegProp = CmGetDeviceContainerIdFromBase(PiPnpRtlCtx, DeviceInstanceId, BaseContainerId, ContainerId);
      if( DeviceRegProp >= 0 )
      {
        v7 = -1i64;
        do
          ++v7;
        while( BaseContainerId[v7] );
        DeviceRegProp = CmSetDeviceRegProp(
                          PiPnpRtlCtx,
                          DeviceInstanceId,
                          (__int64)DeviceInstanceKey,
                          0x25u,
                          1u,
                          (__int64)BaseContainerId,
                          2 * (int)v7 + 2,
                          0);
        if( DeviceRegProp >= 0 )
        {
          if( wcscmp((PWCHAR)L"{00000000-0000-0000-0000-000000000000}", BaseContainerId) )
          {
            DeviceRegProp = CmAddDeviceToContainer(PiPnpRtlCtx, ContainerId, BaseContainerId, DeviceInstanceId, v9);
            if( DeviceRegProp >= 0 && !v9[0] )
              PiDcContainerRequiresConfiguration(ContainerId);
          }
        }
      }
    }
  }
LABEL_15:
  if( P )
    PiPnpRtlEndOperation(P);
  return DeviceRegProp;
}

Referenced by:

PiProcessNewDeviceNode
PipProcessStartPhase3