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