aboutsummaryrefslogtreecommitdiff
path: root/src/burn
diff options
context:
space:
mode:
authorBob Arnson <bob@firegiant.com>2026-02-04 20:47:04 -0500
committerBob Arnson <bob@firegiant.com>2026-02-04 20:47:04 -0500
commitedccb203c421d2bd820062024088c6698424d9ee (patch)
tree6b47c3eb5ca53bd9f79f3d032dc1a596d411bf38 /src/burn
parenta3d3963f806117ce123d95e8b77e73e1c1545b25 (diff)
downloadwix-edccb203c421d2bd820062024088c6698424d9ee.tar.gz
wix-edccb203c421d2bd820062024088c6698424d9ee.tar.bz2
wix-edccb203c421d2bd820062024088c6698424d9ee.zip
Support dual-purpose packages in Burn.bob/ConfigurableScopeBundles
Fixes https://github.com/wixtoolset/issues/issues/8958
Diffstat (limited to 'src/burn')
-rw-r--r--src/burn/engine/apply.cpp2
-rw-r--r--src/burn/engine/baengine.cpp5
-rw-r--r--src/burn/engine/baengine.h1
-rw-r--r--src/burn/engine/cache.cpp8
-rw-r--r--src/burn/engine/core.cpp42
-rw-r--r--src/burn/engine/core.h5
-rw-r--r--src/burn/engine/dependency.cpp72
-rw-r--r--src/burn/engine/elevation.cpp43
-rw-r--r--src/burn/engine/engine.cpp7
-rw-r--r--src/burn/engine/engine.mc29
-rw-r--r--src/burn/engine/engine.vcxproj17
-rw-r--r--src/burn/engine/externalengine.cpp6
-rw-r--r--src/burn/engine/externalengine.h5
-rw-r--r--src/burn/engine/logging.cpp36
-rw-r--r--src/burn/engine/logging.h7
-rw-r--r--src/burn/engine/msiengine.cpp49
-rw-r--r--src/burn/engine/msiengine.h2
-rw-r--r--src/burn/engine/mspengine.cpp4
-rw-r--r--src/burn/engine/package.cpp48
-rw-r--r--src/burn/engine/package.h7
-rw-r--r--src/burn/engine/plan.cpp73
-rw-r--r--src/burn/engine/plan.h12
-rw-r--r--src/burn/engine/registration.cpp287
-rw-r--r--src/burn/engine/registration.h11
-rw-r--r--src/burn/engine/relatedbundle.cpp4
-rw-r--r--src/burn/engine/uithread.cpp2
-rw-r--r--src/burn/engine/variable.cpp2
-rw-r--r--src/burn/test/BurnUnitTest/ApprovedExeTest.cpp8
-rw-r--r--src/burn/test/BurnUnitTest/BurnTestException.h14
-rw-r--r--src/burn/test/BurnUnitTest/BurnTestFixture.h8
-rw-r--r--src/burn/test/BurnUnitTest/BurnUnitTest.h8
-rw-r--r--src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj19
-rw-r--r--src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj.filters18
-rw-r--r--src/burn/test/BurnUnitTest/CacheTest.cpp10
-rw-r--r--src/burn/test/BurnUnitTest/ElevationTest.cpp8
-rw-r--r--src/burn/test/BurnUnitTest/EmbeddedTest.cpp8
-rw-r--r--src/burn/test/BurnUnitTest/ExitCodeTest.cpp12
-rw-r--r--src/burn/test/BurnUnitTest/LoggingTest.cpp8
-rw-r--r--src/burn/test/BurnUnitTest/ManifestHelpers.cpp8
-rw-r--r--src/burn/test/BurnUnitTest/ManifestHelpers.h8
-rw-r--r--src/burn/test/BurnUnitTest/ManifestTest.cpp10
-rw-r--r--src/burn/test/BurnUnitTest/PlanTest.cpp393
-rw-r--r--src/burn/test/BurnUnitTest/RegistrationTest.cpp56
-rw-r--r--src/burn/test/BurnUnitTest/RelatedBundleTest.cpp14
-rw-r--r--src/burn/test/BurnUnitTest/SearchTest.cpp8
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/AllPmouBundle_manifest.xml46
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/AllPuomBundle_manifest.xml46
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/BasicFunctionality_BundleA_manifest.xml4
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/BundlePackage_Multiple_manifest.xml8
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/ExePackage_PerUserArpEntry_manifest.xml6
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/Failure_BundleD_manifest.xml6
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/MsiTransaction_BundleAv1_manifest.xml8
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml4
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/PerMachineBundle_manifest.xml33
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/PerUserBundle_manifest.xml33
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/PmPmouBundle_manifest.xml59
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuPmouBundle_manifest.xml72
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuPuomBundle_manifest.xml72
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuomBundle_manifest.xml59
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/PuPmouBundle_manifest.xml59
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/PuPuomBundle_manifest.xml59
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/PuomBundlePackage_manifest.xml26
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_manifest.xml8
-rw-r--r--src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml6
-rw-r--r--src/burn/test/BurnUnitTest/VariableHelpers.cpp8
-rw-r--r--src/burn/test/BurnUnitTest/VariableHelpers.h8
-rw-r--r--src/burn/test/BurnUnitTest/VariableTest.cpp8
-rw-r--r--src/burn/test/BurnUnitTest/VariantTest.cpp8
68 files changed, 1638 insertions, 412 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp
index e4e76a6c..68aded71 100644
--- a/src/burn/engine/apply.cpp
+++ b/src/burn/engine/apply.cpp
@@ -632,7 +632,7 @@ extern "C" HRESULT ApplyCache(
632 { 632 {
633 hr = ElevationCachePreparePackage(hPipe, pPackage); 633 hr = ElevationCachePreparePackage(hPipe, pPackage);
634 } 634 }
635 LogExitOnFailure(hr, MSG_CACHE_PREPARE_PACKAGE_FAILED, "Cache prepare package failed: %ls", pPackage->sczId, NULL, NULL); 635 LogExitOnFailure(hr, MSG_CACHE_PREPARE_PACKAGE_FAILED, "Cache prepare package failed: %ls", pPackage->sczId);
636 } 636 }
637 637
638 hr = ApplyCachePackage(&cacheContext, pPackage); 638 hr = ApplyCachePackage(&cacheContext, pPackage);
diff --git a/src/burn/engine/baengine.cpp b/src/burn/engine/baengine.cpp
index d1704ad9..e48f71c0 100644
--- a/src/burn/engine/baengine.cpp
+++ b/src/burn/engine/baengine.cpp
@@ -1134,12 +1134,15 @@ static HRESULT BAEnginePlan(
1134 hr = BuffReaderReadNumber(pReaderArgs, reinterpret_cast<DWORD*>(&args.action)); 1134 hr = BuffReaderReadNumber(pReaderArgs, reinterpret_cast<DWORD*>(&args.action));
1135 ExitOnFailure(hr, "Failed to read plan action of BAEnginePlan args."); 1135 ExitOnFailure(hr, "Failed to read plan action of BAEnginePlan args.");
1136 1136
1137 hr = BuffReaderReadNumber(pReaderArgs, reinterpret_cast<DWORD*>(&args.plannedScope));
1138 ExitOnFailure(hr, "Failed to read plan scope of BAEnginePlan args.");
1139
1137 // Read results. 1140 // Read results.
1138 hr = BuffReaderReadNumber(pReaderResults, &results.dwApiVersion); 1141 hr = BuffReaderReadNumber(pReaderResults, &results.dwApiVersion);
1139 ExitOnFailure(hr, "Failed to read API version of BAEnginePlan results."); 1142 ExitOnFailure(hr, "Failed to read API version of BAEnginePlan results.");
1140 1143
1141 // Execute. 1144 // Execute.
1142 hr = ExternalEnginePlan(pContext, args.action); 1145 hr = ExternalEnginePlan(pContext, args.action, args.plannedScope);
1143 ExitOnFailure(hr, "Failed to plan in the engine."); 1146 ExitOnFailure(hr, "Failed to plan in the engine.");
1144 1147
1145 // Pack result. 1148 // Pack result.
diff --git a/src/burn/engine/baengine.h b/src/burn/engine/baengine.h
index 97cfea9c..39e5ae0b 100644
--- a/src/burn/engine/baengine.h
+++ b/src/burn/engine/baengine.h
@@ -31,6 +31,7 @@ typedef struct _BAENGINE_ACTION
31 struct 31 struct
32 { 32 {
33 BOOTSTRAPPER_ACTION action; 33 BOOTSTRAPPER_ACTION action;
34 BOOTSTRAPPER_SCOPE plannedScope;
34 } plan; 35 } plan;
35 struct 36 struct
36 { 37 {
diff --git a/src/burn/engine/cache.cpp b/src/burn/engine/cache.cpp
index c85a1be4..21bd42be 100644
--- a/src/burn/engine/cache.cpp
+++ b/src/burn/engine/cache.cpp
@@ -36,8 +36,8 @@ static HRESULT SecurePerMachineCacheRoot(
36static HRESULT CreateCompletedPath( 36static HRESULT CreateCompletedPath(
37 __in BURN_CACHE* pCache, 37 __in BURN_CACHE* pCache,
38 __in BOOL fPerMachine, 38 __in BOOL fPerMachine,
39 __in LPCWSTR wzCacheId, 39 __in_z LPCWSTR wzId,
40 __in LPCWSTR wzFilePath, 40 __in_z_opt LPCWSTR wzFilePath,
41 __out_z LPWSTR* psczCachePath 41 __out_z LPWSTR* psczCachePath
42 ); 42 );
43static HRESULT CreateUnverifiedPath( 43static HRESULT CreateUnverifiedPath(
@@ -1658,8 +1658,8 @@ LExit:
1658static HRESULT CreateCompletedPath( 1658static HRESULT CreateCompletedPath(
1659 __in BURN_CACHE* pCache, 1659 __in BURN_CACHE* pCache,
1660 __in BOOL fPerMachine, 1660 __in BOOL fPerMachine,
1661 __in LPCWSTR wzId, 1661 __in_z LPCWSTR wzId,
1662 __in LPCWSTR wzFilePath, 1662 __in_z_opt LPCWSTR wzFilePath,
1663 __out_z LPWSTR* psczCachePath 1663 __out_z LPWSTR* psczCachePath
1664 ) 1664 )
1665{ 1665{
diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp
index 2dfa4857..7937bd65 100644
--- a/src/burn/engine/core.cpp
+++ b/src/burn/engine/core.cpp
@@ -379,7 +379,7 @@ extern "C" HRESULT CoreDetect(
379 pEngineState->registration.fEligibleForCleanup = FALSE; 379 pEngineState->registration.fEligibleForCleanup = FALSE;
380 } 380 }
381 381
382 LogId(REPORT_STANDARD, MSG_DETECTED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingBoolToString(pPackage->fCached), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->installRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->cacheRegistrationState)); 382 LogId(REPORT_STANDARD, MSG_DETECTED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingBoolToString(pPackage->fCached), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->installRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->cacheRegistrationState), LoggingPackageScopeToString(pPackage->scope));
383 383
384 if (BURN_PACKAGE_TYPE_MSI == pPackage->type) 384 if (BURN_PACKAGE_TYPE_MSI == pPackage->type)
385 { 385 {
@@ -424,8 +424,9 @@ LExit:
424 424
425extern "C" HRESULT CorePlan( 425extern "C" HRESULT CorePlan(
426 __in BURN_ENGINE_STATE* pEngineState, 426 __in BURN_ENGINE_STATE* pEngineState,
427 __in BOOTSTRAPPER_ACTION action 427 __in BOOTSTRAPPER_ACTION action,
428 ) 428 __in BOOTSTRAPPER_SCOPE plannedScope
429)
429{ 430{
430 HRESULT hr = S_OK; 431 HRESULT hr = S_OK;
431 BOOL fPlanBegan = FALSE; 432 BOOL fPlanBegan = FALSE;
@@ -433,7 +434,7 @@ extern "C" HRESULT CorePlan(
433 BURN_PACKAGE* pForwardCompatibleBundlePackage = NULL; 434 BURN_PACKAGE* pForwardCompatibleBundlePackage = NULL;
434 BOOL fContinuePlanning = TRUE; // assume we won't skip planning due to dependencies. 435 BOOL fContinuePlanning = TRUE; // assume we won't skip planning due to dependencies.
435 436
436 LogId(REPORT_STANDARD, MSG_PLAN_BEGIN, pEngineState->packages.cPackages, LoggingBurnActionToString(action)); 437 LogId(REPORT_STANDARD, MSG_PLAN_BEGIN, pEngineState->packages.cPackages, LoggingBurnActionToString(action), LoggingBundleScopeToString(plannedScope));
437 438
438 fPlanBegan = TRUE; 439 fPlanBegan = TRUE;
439 hr = BACallbackOnPlanBegin(&pEngineState->userExperience, pEngineState->packages.cPackages); 440 hr = BACallbackOnPlanBegin(&pEngineState->userExperience, pEngineState->packages.cPackages);
@@ -452,12 +453,13 @@ extern "C" HRESULT CorePlan(
452 pEngineState->fPlanned = FALSE; 453 pEngineState->fPlanned = FALSE;
453 PlanReset(&pEngineState->plan, &pEngineState->variables, &pEngineState->containers, &pEngineState->packages, &pEngineState->layoutPayloads); 454 PlanReset(&pEngineState->plan, &pEngineState->variables, &pEngineState->containers, &pEngineState->packages, &pEngineState->layoutPayloads);
454 455
455 hr = PlanSetVariables(action, &pEngineState->variables); 456 hr = PlanSetVariables(action, pEngineState->registration.scope, pEngineState->plan.plannedScope, &pEngineState->variables);
456 ExitOnFailure(hr, "Failed to update action."); 457 ExitOnFailure(hr, "Failed to update plan variables.");
457 458
458 // Remember the overall action state in the plan since it shapes the changes 459 // Remember the overall action state in the plan since it shapes the changes
459 // we make everywhere. 460 // we make everywhere.
460 pEngineState->plan.action = action; 461 pEngineState->plan.action = action;
462 pEngineState->plan.plannedScope = plannedScope;
461 pEngineState->plan.pCache = &pEngineState->cache; 463 pEngineState->plan.pCache = &pEngineState->cache;
462 pEngineState->plan.pCommand = &pEngineState->command; 464 pEngineState->plan.pCommand = &pEngineState->command;
463 pEngineState->plan.pInternalCommand = &pEngineState->internalCommand; 465 pEngineState->plan.pInternalCommand = &pEngineState->internalCommand;
@@ -467,6 +469,17 @@ extern "C" HRESULT CorePlan(
467 pEngineState->plan.fDisableRollback = pEngineState->fDisableRollback || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == pEngineState->plan.action; 469 pEngineState->plan.fDisableRollback = pEngineState->fDisableRollback || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == pEngineState->plan.action;
468 pEngineState->plan.fPlanPackageCacheRollback = BOOTSTRAPPER_REGISTRATION_TYPE_NONE == pEngineState->registration.detectedRegistrationType; 470 pEngineState->plan.fPlanPackageCacheRollback = BOOTSTRAPPER_REGISTRATION_TYPE_NONE == pEngineState->registration.detectedRegistrationType;
469 471
472 hr = PlanPackagesAndBundleScope(pEngineState->packages.rgPackages, pEngineState->packages.cPackages, pEngineState->plan.plannedScope, pEngineState->registration.scope, pEngineState->command.commandLineScope, &pEngineState->plan.plannedScope, &pEngineState->registration.fPerMachine);
473 ExitOnFailure(hr, "Failed to determine packages and bundle scope.");
474
475 if (BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER == pEngineState->registration.scope || BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE == pEngineState->registration.scope)
476 {
477 LogId(REPORT_STANDARD, MSG_PLAN_CONFIGURED_SCOPE, LoggingInstallScopeToString(pEngineState->registration.fPerMachine));
478 }
479
480 hr = RegistrationSetPaths(&pEngineState->registration, &pEngineState->cache);
481 ExitOnFailure(hr, "Failed to set registration paths.");
482
470 // Set resume commandline 483 // Set resume commandline
471 hr = PlanSetResumeCommand(&pEngineState->plan, &pEngineState->registration, &pEngineState->log); 484 hr = PlanSetResumeCommand(&pEngineState->plan, &pEngineState->registration, &pEngineState->log);
472 ExitOnFailure(hr, "Failed to set resume command"); 485 ExitOnFailure(hr, "Failed to set resume command");
@@ -475,7 +488,7 @@ extern "C" HRESULT CorePlan(
475 ExitOnFailure(hr, "Failed to initialize the dependencies for the plan."); 488 ExitOnFailure(hr, "Failed to initialize the dependencies for the plan.");
476 489
477 hr = RegistrationPlanInitialize(&pEngineState->registration); 490 hr = RegistrationPlanInitialize(&pEngineState->registration);
478 ExitOnFailure(hr, "Failed to initialize registration for the plan."); 491 ExitOnFailure(hr, "Failed to initialize the plan for registration.");
479 492
480 if (BOOTSTRAPPER_ACTION_LAYOUT == action) 493 if (BOOTSTRAPPER_ACTION_LAYOUT == action)
481 { 494 {
@@ -556,6 +569,9 @@ extern "C" HRESULT CorePlan(
556 LogPackages(pUpgradeBundlePackage, pForwardCompatibleBundlePackage, &pEngineState->packages, &pEngineState->registration.relatedBundles, action); 569 LogPackages(pUpgradeBundlePackage, pForwardCompatibleBundlePackage, &pEngineState->packages, &pEngineState->registration.relatedBundles, action);
557 } 570 }
558 571
572 hr = PlanSetVariables(action, pEngineState->registration.scope, pEngineState->plan.plannedScope, &pEngineState->variables);
573 ExitOnFailure(hr, "Failed to update plan variables after planning.");
574
559 PlanDump(&pEngineState->plan); 575 PlanDump(&pEngineState->plan);
560 576
561LExit: 577LExit:
@@ -1331,7 +1347,7 @@ extern "C" void CoreCleanup(
1331 ExitFunction(); 1347 ExitFunction();
1332 } 1348 }
1333 1349
1334 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 1350 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1335 ExitOnFailure(hr, "Plan during cleanup failed"); 1351 ExitOnFailure(hr, "Plan during cleanup failed");
1336 1352
1337 hr = CoreApply(pEngineState, pEngineState->hMessageWindow); 1353 hr = CoreApply(pEngineState, pEngineState->hMessageWindow);
@@ -1470,6 +1486,14 @@ extern "C" HRESULT CoreParseCommandLine(
1470 { 1486 {
1471 pInternalCommand->fDisableSystemRestore = TRUE; 1487 pInternalCommand->fDisableSystemRestore = TRUE;
1472 } 1488 }
1489 else if (CSTR_EQUAL == ::CompareStringOrdinal(&argv[i][1], -1, L"peruser", -1, TRUE))
1490 {
1491 pCommand->commandLineScope = BOOTSTRAPPER_SCOPE_PER_USER;
1492 }
1493 else if (CSTR_EQUAL == ::CompareStringOrdinal(&argv[i][1], -1, L"permachine", -1, TRUE))
1494 {
1495 pCommand->commandLineScope = BOOTSTRAPPER_SCOPE_PER_MACHINE;
1496 }
1473 else if (CSTR_EQUAL == ::CompareStringOrdinal(&argv[i][1], -1, L"originalsource", -1, TRUE)) 1497 else if (CSTR_EQUAL == ::CompareStringOrdinal(&argv[i][1], -1, L"originalsource", -1, TRUE))
1474 { 1498 {
1475 if (i + 1 >= argc) 1499 if (i + 1 >= argc)
@@ -2346,7 +2370,7 @@ static void LogPackages(
2346 LogRollbackBoundary(pPackage->pRollbackBoundaryBackward); 2370 LogRollbackBoundary(pPackage->pRollbackBoundaryBackward);
2347 } 2371 }
2348 2372
2349 LogId(REPORT_STANDARD, MSG_PLANNED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingRequestStateToString(pPackage->defaultRequested), LoggingRequestStateToString(pPackage->requested), LoggingActionStateToString(pPackage->execute), LoggingActionStateToString(pPackage->rollback), LoggingCacheTypeToString(pPackage->authoredCacheType), LoggingCacheTypeToString(pPackage->cacheType), LoggingPlannedCacheToString(pPackage), LoggingBoolToString(pPackage->fPlannedUncache), LoggingDependencyActionToString(pPackage->dependencyExecute), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedInstallRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedCacheRegistrationState)); 2373 LogId(REPORT_STANDARD, MSG_PLANNED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingRequestStateToString(pPackage->defaultRequested), LoggingRequestStateToString(pPackage->requested), LoggingActionStateToString(pPackage->execute), LoggingActionStateToString(pPackage->rollback), LoggingCacheTypeToString(pPackage->authoredCacheType), LoggingCacheTypeToString(pPackage->cacheType), LoggingPlannedCacheToString(pPackage), LoggingBoolToString(pPackage->fPlannedUncache), LoggingDependencyActionToString(pPackage->dependencyExecute), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedInstallRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedCacheRegistrationState), LoggingInstallScopeToString(pPackage->fPerMachine));
2350 2374
2351 if (BURN_PACKAGE_TYPE_MSI == pPackage->type) 2375 if (BURN_PACKAGE_TYPE_MSI == pPackage->type)
2352 { 2376 {
diff --git a/src/burn/engine/core.h b/src/burn/engine/core.h
index cf615e35..75c0c941 100644
--- a/src/burn/engine/core.h
+++ b/src/burn/engine/core.h
@@ -45,7 +45,9 @@ const LPCWSTR BURN_BUNDLE_EXECUTE_PACKAGE_ACTION = L"WixBundleExecutePackageActi
45const LPCWSTR BURN_BUNDLE_FORCED_RESTART_PACKAGE = L"WixBundleForcedRestartPackage"; 45const LPCWSTR BURN_BUNDLE_FORCED_RESTART_PACKAGE = L"WixBundleForcedRestartPackage";
46const LPCWSTR BURN_BUNDLE_INSTALLED = L"WixBundleInstalled"; 46const LPCWSTR BURN_BUNDLE_INSTALLED = L"WixBundleInstalled";
47const LPCWSTR BURN_BUNDLE_ELEVATED = L"WixBundleElevated"; 47const LPCWSTR BURN_BUNDLE_ELEVATED = L"WixBundleElevated";
48const LPCWSTR BURN_BUNDLE_PLANNED_SCOPE = L"WixBundlePlannedScope";
48const LPCWSTR BURN_BUNDLE_PROVIDER_KEY = L"WixBundleProviderKey"; 49const LPCWSTR BURN_BUNDLE_PROVIDER_KEY = L"WixBundleProviderKey";
50const LPCWSTR BURN_BUNDLE_SCOPE = L"WixBundleScope";
49const LPCWSTR BURN_BUNDLE_SOURCE_PROCESS_PATH = L"WixBundleSourceProcessPath"; 51const LPCWSTR BURN_BUNDLE_SOURCE_PROCESS_PATH = L"WixBundleSourceProcessPath";
50const LPCWSTR BURN_BUNDLE_SOURCE_PROCESS_FOLDER = L"WixBundleSourceProcessFolder"; 52const LPCWSTR BURN_BUNDLE_SOURCE_PROCESS_FOLDER = L"WixBundleSourceProcessFolder";
51const LPCWSTR BURN_BUNDLE_TAG = L"WixBundleTag"; 53const LPCWSTR BURN_BUNDLE_TAG = L"WixBundleTag";
@@ -243,7 +245,8 @@ HRESULT CoreDetect(
243 ); 245 );
244HRESULT CorePlan( 246HRESULT CorePlan(
245 __in BURN_ENGINE_STATE* pEngineState, 247 __in BURN_ENGINE_STATE* pEngineState,
246 __in BOOTSTRAPPER_ACTION action 248 __in BOOTSTRAPPER_ACTION action,
249 __in BOOTSTRAPPER_SCOPE scope
247 ); 250 );
248HRESULT CoreElevate( 251HRESULT CoreElevate(
249 __in BURN_ENGINE_STATE* pEngineState, 252 __in BURN_ENGINE_STATE* pEngineState,
diff --git a/src/burn/engine/dependency.cpp b/src/burn/engine/dependency.cpp
index 94a8a1e4..7cd0db9f 100644
--- a/src/burn/engine/dependency.cpp
+++ b/src/burn/engine/dependency.cpp
@@ -12,6 +12,7 @@ const LPCWSTR vcszIgnoreDependenciesDelim = L";";
12 12
13static HRESULT DetectPackageDependents( 13static HRESULT DetectPackageDependents(
14 __in BURN_PACKAGE* pPackage, 14 __in BURN_PACKAGE* pPackage,
15 __in BOOL fPackagePerMachine,
15 __in const BURN_REGISTRATION* pRegistration 16 __in const BURN_REGISTRATION* pRegistration
16 ); 17 );
17 18
@@ -249,7 +250,22 @@ extern "C" HRESULT DependencyDetectProviderKeyBundleCode(
249{ 250{
250 HRESULT hr = S_OK; 251 HRESULT hr = S_OK;
251 252
252 hr = DepGetProviderInformation(pRegistration->hkRoot, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleCode, NULL, NULL); 253 // For configurable packages, check both scopes because until planning,
254 // we can't know their planned scope.
255 if (pRegistration->hkRoot)
256 {
257 hr = DepGetProviderInformation(pRegistration->hkRoot, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleCode, NULL, NULL);
258 }
259 else
260 {
261 hr = DepGetProviderInformation(HKEY_LOCAL_MACHINE, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleCode, NULL, NULL);
262
263 if (E_NOTFOUND == hr)
264 {
265 hr = DepGetProviderInformation(HKEY_CURRENT_USER, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleCode, NULL, NULL);
266 }
267 }
268
253 if (E_NOTFOUND == hr) 269 if (E_NOTFOUND == hr)
254 { 270 {
255 ReleaseNullStr(pRegistration->sczDetectedProviderKeyBundleCode); 271 ReleaseNullStr(pRegistration->sczDetectedProviderKeyBundleCode);
@@ -284,7 +300,21 @@ extern "C" HRESULT DependencyDetectBundle(
284 hr = DependencyDetectProviderKeyBundleCode(pRegistration); 300 hr = DependencyDetectProviderKeyBundleCode(pRegistration);
285 ExitOnFailure(hr, "Failed to detect provider key bundle code."); 301 ExitOnFailure(hr, "Failed to detect provider key bundle code.");
286 302
287 hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, NULL, &pRegistration->rgDependents, &pRegistration->cDependents); 303 // For configurable packages, check both scopes because until planning,
304 // we can't know their planned scope.
305 if (pRegistration->hkRoot)
306 {
307 hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, NULL, &pRegistration->rgDependents, &pRegistration->cDependents);
308 }
309 else
310 {
311 hr = DepCheckDependents(HKEY_LOCAL_MACHINE, pRegistration->sczProviderKey, 0, NULL, &pRegistration->rgDependents, &pRegistration->cDependents);
312
313 if (E_NOTFOUND == hr)
314 {
315 hr = DepCheckDependents(HKEY_CURRENT_USER, pRegistration->sczProviderKey, 0, NULL, &pRegistration->rgDependents, &pRegistration->cDependents);
316 }
317 }
288 ExitOnPathFailure(hr, fExists, "Failed dependents check on bundle."); 318 ExitOnPathFailure(hr, fExists, "Failed dependents check on bundle.");
289 319
290 if (pDependencies->fSelfDependent || pDependencies->fActiveParent) 320 if (pDependencies->fSelfDependent || pDependencies->fActiveParent)
@@ -292,13 +322,13 @@ extern "C" HRESULT DependencyDetectBundle(
292 for (DWORD i = 0; i < pRegistration->cDependents; ++i) 322 for (DWORD i = 0; i < pRegistration->cDependents; ++i)
293 { 323 {
294 DEPENDENCY* pDependent = pRegistration->rgDependents + i; 324 DEPENDENCY* pDependent = pRegistration->rgDependents + i;
295 325
296 if (pDependencies->fActiveParent && CSTR_EQUAL == ::CompareStringOrdinal(pDependencies->wzActiveParent, -1, pDependent->sczKey, -1, TRUE)) 326 if (pDependent && pDependencies->fActiveParent && CSTR_EQUAL == ::CompareStringOrdinal(pDependencies->wzActiveParent, -1, pDependent->sczKey, -1, TRUE))
297 { 327 {
298 pRegistration->fParentRegisteredAsDependent = TRUE; 328 pRegistration->fParentRegisteredAsDependent = TRUE;
299 } 329 }
300 330
301 if (pDependencies->fSelfDependent && CSTR_EQUAL == ::CompareStringOrdinal(pDependencies->wzSelfDependent, -1, pDependent->sczKey, -1, TRUE)) 331 if (pDependent && pDependencies->fSelfDependent && CSTR_EQUAL == ::CompareStringOrdinal(pDependencies->wzSelfDependent, -1, pDependent->sczKey, -1, TRUE))
302 { 332 {
303 pRegistration->fSelfRegisteredAsDependent = TRUE; 333 pRegistration->fSelfRegisteredAsDependent = TRUE;
304 } 334 }
@@ -316,11 +346,24 @@ extern "C" HRESULT DependencyDetectChainPackage(
316{ 346{
317 HRESULT hr = S_OK; 347 HRESULT hr = S_OK;
318 348
319 hr = DetectPackageDependents(pPackage, pRegistration); 349 if (BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE == pPackage->scope || BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER == pPackage->scope)
320 ExitOnFailure(hr, "Failed to detect dependents for package '%ls'", pPackage->sczId); 350 {
351 // For configurable packages, check both scopes because until planning,
352 // we can't know their planned scope.
353 hr = DetectPackageDependents(pPackage, /*fPerMachine*/TRUE, pRegistration);
354 ExitOnFailure(hr, "Failed to detect per-machine dependents for configurable package '%ls'", pPackage->sczId);
355
356 hr = DetectPackageDependents(pPackage, /*fPerMachine*/FALSE, pRegistration);
357 ExitOnFailure(hr, "Failed to detect per-user dependents for configurable package '%ls'", pPackage->sczId);
358 }
359 else
360 {
361 hr = DetectPackageDependents(pPackage, pPackage->fPerMachine, pRegistration);
362 ExitOnFailure(hr, "Failed to detect dependents for %hs package '%ls'", LoggingInstallScopeToString(pPackage->fPerMachine), pPackage->sczId);
363 }
321 364
322 hr = DependencyDetectCompatibleEntry(pPackage, pRegistration); 365 hr = DependencyDetectCompatibleEntry(pPackage, pRegistration);
323 ExitOnFailure(hr, "Failed to detect compatible package for package '%ls'", pPackage->sczId); 366 ExitOnFailure(hr, "Failed to detect compatible package for %hs package '%ls'", LoggingInstallScopeToString(pPackage->fPerMachine), pPackage->sczId);
324 367
325LExit: 368LExit:
326 return hr; 369 return hr;
@@ -336,7 +379,7 @@ extern "C" HRESULT DependencyDetectRelatedBundle(
336 379
337 if (pRelatedBundle->fPlannable) 380 if (pRelatedBundle->fPlannable)
338 { 381 {
339 hr = DetectPackageDependents(pPackage, pRegistration); 382 hr = DetectPackageDependents(pPackage, pPackage->fPerMachine, pRegistration);
340 ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId); 383 ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId);
341 } 384 }
342 385
@@ -626,7 +669,7 @@ LExit:
626} 669}
627 670
628extern "C" HRESULT DependencyPlanPackage( 671extern "C" HRESULT DependencyPlanPackage(
629 __in_opt DWORD *pdwInsertSequence, 672 __in_opt DWORD* pdwInsertSequence,
630 __in const BURN_PACKAGE* pPackage, 673 __in const BURN_PACKAGE* pPackage,
631 __in BURN_PLAN* pPlan 674 __in BURN_PLAN* pPlan
632 ) 675 )
@@ -946,18 +989,19 @@ LExit:
946 989
947static HRESULT DetectPackageDependents( 990static HRESULT DetectPackageDependents(
948 __in BURN_PACKAGE* pPackage, 991 __in BURN_PACKAGE* pPackage,
992 __in BOOL fPackagePerMachine,
949 __in const BURN_REGISTRATION* pRegistration 993 __in const BURN_REGISTRATION* pRegistration
950 ) 994 )
951{ 995{
952 HRESULT hr = S_OK; 996 HRESULT hr = S_OK;
953 HKEY hkHive = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 997 HKEY hkHive = fPackagePerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
954 BOOL fCanIgnorePresence = pPackage->fCanAffectRegistration && 0 < pPackage->cDependencyProviders && 998 BOOL fCanIgnorePresence = pPackage->fCanAffectRegistration && 0 < pPackage->cDependencyProviders &&
955 (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->cacheRegistrationState || BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->installRegistrationState); 999 (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->cacheRegistrationState || BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->installRegistrationState);
956 BOOL fBundleRegisteredAsDependent = FALSE; 1000 BOOL fBundleRegisteredAsDependent = FALSE;
957 1001
958 // There's currently no point in getting the dependents if the scope doesn't match, 1002 // There's currently no point in getting the dependents if the scope doesn't match,
959 // because they will just get ignored. 1003 // because they will just get ignored.
960 if (pRegistration->fPerMachine != pPackage->fPerMachine) 1004 if (pRegistration->fPerMachine != fPackagePerMachine)
961 { 1005 {
962 ExitFunction(); 1006 ExitFunction();
963 } 1007 }
@@ -979,7 +1023,7 @@ static HRESULT DetectPackageDependents(
979 { 1023 {
980 DEPENDENCY* pDependent = pProvider->rgDependents + iDependent; 1024 DEPENDENCY* pDependent = pProvider->rgDependents + iDependent;
981 1025
982 if (CSTR_EQUAL == ::CompareStringOrdinal(pRegistration->sczCode, -1, pDependent->sczKey, -1, TRUE)) 1026 if (pDependent && CSTR_EQUAL == ::CompareStringOrdinal(pRegistration->sczCode, -1, pDependent->sczKey, -1, TRUE))
983 { 1027 {
984 pProvider->fBundleRegisteredAsDependent = TRUE; 1028 pProvider->fBundleRegisteredAsDependent = TRUE;
985 fBundleRegisteredAsDependent = TRUE; 1029 fBundleRegisteredAsDependent = TRUE;
@@ -994,10 +1038,12 @@ static HRESULT DetectPackageDependents(
994 { 1038 {
995 pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_IGNORED; 1039 pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_IGNORED;
996 } 1040 }
1041
997 if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->installRegistrationState) 1042 if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->installRegistrationState)
998 { 1043 {
999 pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_IGNORED; 1044 pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_IGNORED;
1000 } 1045 }
1046
1001 if (BURN_PACKAGE_TYPE_MSP == pPackage->type) 1047 if (BURN_PACKAGE_TYPE_MSP == pPackage->type)
1002 { 1048 {
1003 for (DWORD i = 0; i < pPackage->Msp.cTargetProductCodes; ++i) 1049 for (DWORD i = 0; i < pPackage->Msp.cTargetProductCodes; ++i)
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp
index ef87841f..711ce4af 100644
--- a/src/burn/engine/elevation.cpp
+++ b/src/burn/engine/elevation.cpp
@@ -1191,7 +1191,6 @@ extern "C" HRESULT ElevationExecuteMsiPackage(
1191 hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData); 1191 hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData);
1192 ExitOnFailure(hr, "Failed to write variables."); 1192 ExitOnFailure(hr, "Failed to write variables.");
1193 1193
1194
1195 // send message 1194 // send message
1196 context.pfnMessageHandler = pfnMessageHandler; 1195 context.pfnMessageHandler = pfnMessageHandler;
1197 context.pvContext = pvContext; 1196 context.pvContext = pvContext;
@@ -2572,6 +2571,11 @@ static HRESULT OnSessionBegin(
2572 ExitOnFailure(hr, "Failed to read variables."); 2571 ExitOnFailure(hr, "Failed to read variables.");
2573 2572
2574 // Begin session in per-machine process. 2573 // Begin session in per-machine process.
2574 pRegistration->fPerMachine = TRUE;
2575
2576 hr = RegistrationSetPaths(pRegistration, pCache);
2577 ExitOnFailure(hr, "Failed to set elevated registration paths.");
2578
2575 hr = RegistrationSessionBegin(sczEngineWorkingPath, pRegistration, pCache, pVariables, dwRegistrationOperations, qwEstimatedSize, (BOOTSTRAPPER_REGISTRATION_TYPE)dwRegistrationType); 2579 hr = RegistrationSessionBegin(sczEngineWorkingPath, pRegistration, pCache, pVariables, dwRegistrationOperations, qwEstimatedSize, (BOOTSTRAPPER_REGISTRATION_TYPE)dwRegistrationType);
2576 ExitOnFailure(hr, "Failed to begin registration session."); 2580 ExitOnFailure(hr, "Failed to begin registration session.");
2577 2581
@@ -2657,6 +2661,8 @@ static HRESULT OnCachePreparePackage(
2657 { 2661 {
2658 hr = PackageFindById(pPackages, scz, &pPackage); 2662 hr = PackageFindById(pPackages, scz, &pPackage);
2659 ExitOnFailure(hr, "Failed to find package: %ls", scz); 2663 ExitOnFailure(hr, "Failed to find package: %ls", scz);
2664
2665 pPackage->fPerMachine = TRUE;
2660 } 2666 }
2661 else 2667 else
2662 { 2668 {
@@ -2698,6 +2704,8 @@ static HRESULT OnCacheCompletePayload(
2698 { 2704 {
2699 hr = PackageFindById(pPackages, scz, &pPackage); 2705 hr = PackageFindById(pPackages, scz, &pPackage);
2700 ExitOnFailure(hr, "Failed to find package: %ls", scz); 2706 ExitOnFailure(hr, "Failed to find package: %ls", scz);
2707
2708 pPackage->fPerMachine = TRUE;
2701 } 2709 }
2702 2710
2703 hr = BuffReadString(pbData, cbData, &iData, &scz); 2711 hr = BuffReadString(pbData, cbData, &iData, &scz);
@@ -2717,8 +2725,8 @@ static HRESULT OnCacheCompletePayload(
2717 2725
2718 if (pPackage && pPayload) // complete payload. 2726 if (pPackage && pPayload) // complete payload.
2719 { 2727 {
2720 hr = CacheCompletePayload(pCache, pPackage->fPerMachine, pPayload, pPackage->sczCacheId, sczUnverifiedPath, fMove, BurnCacheMessageHandler, ElevatedProgressRoutine, hPipe); 2728 hr = CacheCompletePayload(pCache, TRUE/*fPerMachine*/, pPayload, pPackage->sczCacheId, sczUnverifiedPath, fMove, BurnCacheMessageHandler, ElevatedProgressRoutine, hPipe);
2721 ExitOnFailure(hr, "Failed to cache payload: %ls", pPayload->sczKey); 2729 ExitOnFailure(hr, "Failed to cache per-machine payload: %ls", pPayload->sczKey);
2722 } 2730 }
2723 else 2731 else
2724 { 2732 {
@@ -2755,6 +2763,8 @@ static HRESULT OnCacheVerifyPayload(
2755 { 2763 {
2756 hr = PackageFindById(pPackages, scz, &pPackage); 2764 hr = PackageFindById(pPackages, scz, &pPackage);
2757 ExitOnFailure(hr, "Failed to find package: %ls", scz); 2765 ExitOnFailure(hr, "Failed to find package: %ls", scz);
2766
2767 pPackage->fPerMachine = TRUE;
2758 } 2768 }
2759 2769
2760 hr = BuffReadString(pbData, cbData, &iData, &scz); 2770 hr = BuffReadString(pbData, cbData, &iData, &scz);
@@ -2970,6 +2980,8 @@ static HRESULT OnExecuteBundlePackage(
2970 hr = PackageFindById(pPackages, sczPackage, &executeAction.bundlePackage.pPackage); 2980 hr = PackageFindById(pPackages, sczPackage, &executeAction.bundlePackage.pPackage);
2971 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 2981 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
2972 2982
2983 executeAction.bundlePackage.pPackage->fPerMachine = TRUE;
2984
2973 if (BURN_PACKAGE_TYPE_BUNDLE != executeAction.bundlePackage.pPackage->type) 2985 if (BURN_PACKAGE_TYPE_BUNDLE != executeAction.bundlePackage.pPackage->type)
2974 { 2986 {
2975 ExitWithRootFailure(hr, E_INVALIDARG, "Package is not a BUNDLE package: %ls", sczPackage); 2987 ExitWithRootFailure(hr, E_INVALIDARG, "Package is not a BUNDLE package: %ls", sczPackage);
@@ -3052,6 +3064,8 @@ static HRESULT OnExecuteExePackage(
3052 hr = PackageFindById(pPackages, sczPackage, &executeAction.exePackage.pPackage); 3064 hr = PackageFindById(pPackages, sczPackage, &executeAction.exePackage.pPackage);
3053 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 3065 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3054 3066
3067 executeAction.exePackage.pPackage->fPerMachine = TRUE;
3068
3055 if (BURN_PACKAGE_TYPE_EXE != executeAction.exePackage.pPackage->type) 3069 if (BURN_PACKAGE_TYPE_EXE != executeAction.exePackage.pPackage->type)
3056 { 3070 {
3057 ExitWithRootFailure(hr, E_INVALIDARG, "Package is not an EXE package: %ls", sczPackage); 3071 ExitWithRootFailure(hr, E_INVALIDARG, "Package is not an EXE package: %ls", sczPackage);
@@ -3113,6 +3127,8 @@ static HRESULT OnExecuteMsiPackage(
3113 hr = PackageFindById(pPackages, sczPackage, &executeAction.msiPackage.pPackage); 3127 hr = PackageFindById(pPackages, sczPackage, &executeAction.msiPackage.pPackage);
3114 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 3128 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3115 3129
3130 executeAction.msiPackage.pPackage->fPerMachine = TRUE;
3131
3116 hr = BuffReadPointer(pbData, cbData, &iData, (DWORD_PTR*)&hwndParent); 3132 hr = BuffReadPointer(pbData, cbData, &iData, (DWORD_PTR*)&hwndParent);
3117 ExitOnFailure(hr, "Failed to read parent hwnd."); 3133 ExitOnFailure(hr, "Failed to read parent hwnd.");
3118 3134
@@ -3205,6 +3221,8 @@ static HRESULT OnExecuteMspPackage(
3205 hr = PackageFindById(pPackages, sczPackage, &executeAction.mspTarget.pPackage); 3221 hr = PackageFindById(pPackages, sczPackage, &executeAction.mspTarget.pPackage);
3206 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 3222 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3207 3223
3224 executeAction.mspTarget.pPackage->fPerMachine = TRUE;
3225
3208 hr = BuffReadPointer(pbData, cbData, &iData, (DWORD_PTR*)&hwndParent); 3226 hr = BuffReadPointer(pbData, cbData, &iData, (DWORD_PTR*)&hwndParent);
3209 ExitOnFailure(hr, "Failed to read parent hwnd."); 3227 ExitOnFailure(hr, "Failed to read parent hwnd.");
3210 3228
@@ -3246,6 +3264,8 @@ static HRESULT OnExecuteMspPackage(
3246 3264
3247 hr = PackageFindById(pPackages, sczPackage, &executeAction.mspTarget.rgOrderedPatches[i].pPackage); 3265 hr = PackageFindById(pPackages, sczPackage, &executeAction.mspTarget.rgOrderedPatches[i].pPackage);
3248 ExitOnFailure(hr, "Failed to find ordered patch package: %ls", sczPackage); 3266 ExitOnFailure(hr, "Failed to find ordered patch package: %ls", sczPackage);
3267
3268 executeAction.mspTarget.rgOrderedPatches[i].pPackage->fPerMachine = TRUE;
3249 } 3269 }
3250 } 3270 }
3251 3271
@@ -3310,6 +3330,8 @@ static HRESULT OnExecuteMsuPackage(
3310 hr = PackageFindById(pPackages, sczPackage, &executeAction.msuPackage.pPackage); 3330 hr = PackageFindById(pPackages, sczPackage, &executeAction.msuPackage.pPackage);
3311 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 3331 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3312 3332
3333 executeAction.msuPackage.pPackage->fPerMachine = TRUE;
3334
3313 if (BURN_PACKAGE_TYPE_MSU != executeAction.msuPackage.pPackage->type) 3335 if (BURN_PACKAGE_TYPE_MSU != executeAction.msuPackage.pPackage->type)
3314 { 3336 {
3315 ExitWithRootFailure(hr, E_INVALIDARG, "Package is not an MSU package: %ls", sczPackage); 3337 ExitWithRootFailure(hr, E_INVALIDARG, "Package is not an MSU package: %ls", sczPackage);
@@ -3371,6 +3393,8 @@ static HRESULT OnUninstallMsiCompatiblePackage(
3371 hr = PackageFindById(pPackages, sczPackageId, &pPackage); 3393 hr = PackageFindById(pPackages, sczPackageId, &pPackage);
3372 ExitOnFailure(hr, "Failed to find package: %ls", sczPackageId); 3394 ExitOnFailure(hr, "Failed to find package: %ls", sczPackageId);
3373 3395
3396 pPackage->fPerMachine = TRUE;
3397
3374 executeAction.uninstallMsiCompatiblePackage.pParentPackage = pPackage; 3398 executeAction.uninstallMsiCompatiblePackage.pParentPackage = pPackage;
3375 pCompatiblePackage = &pPackage->compatiblePackage; 3399 pCompatiblePackage = &pPackage->compatiblePackage;
3376 3400
@@ -3424,6 +3448,8 @@ static HRESULT OnExecutePackageProviderAction(
3424 } 3448 }
3425 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 3449 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3426 3450
3451 executeAction.packageProvider.pPackage->fPerMachine;
3452
3427 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&fRollback); 3453 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&fRollback);
3428 ExitOnFailure(hr, "Failed to read rollback flag."); 3454 ExitOnFailure(hr, "Failed to read rollback flag.");
3429 3455
@@ -3436,11 +3462,6 @@ static HRESULT OnExecutePackageProviderAction(
3436 ExitOnFailure(hr, "Failed to read provider action."); 3462 ExitOnFailure(hr, "Failed to read provider action.");
3437 } 3463 }
3438 3464
3439 if (!executeAction.packageProvider.pPackage->fPerMachine)
3440 {
3441 ExitWithRootFailure(hr, E_INVALIDARG, "ExecutePackageProviderAction called for per-user package.");
3442 }
3443
3444 // Execute the package provider action. 3465 // Execute the package provider action.
3445 hr = DependencyExecutePackageProviderAction(&executeAction, fRollback); 3466 hr = DependencyExecutePackageProviderAction(&executeAction, fRollback);
3446 ExitOnFailure(hr, "Failed to execute package provider action."); 3467 ExitOnFailure(hr, "Failed to execute package provider action.");
@@ -3479,6 +3500,8 @@ static HRESULT OnExecutePackageDependencyAction(
3479 } 3500 }
3480 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 3501 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3481 3502
3503 executeAction.packageDependency.pPackage->fPerMachine = TRUE;
3504
3482 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&fRollback); 3505 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&fRollback);
3483 ExitOnFailure(hr, "Failed to read rollback flag."); 3506 ExitOnFailure(hr, "Failed to read rollback flag.");
3484 3507
@@ -3784,6 +3807,8 @@ static HRESULT OnCleanCompatiblePackage(
3784 hr = PackageFindById(pPackages, sczPackageId, &pPackage); 3807 hr = PackageFindById(pPackages, sczPackageId, &pPackage);
3785 ExitOnFailure(hr, "Failed to find package: %ls", sczPackageId); 3808 ExitOnFailure(hr, "Failed to find package: %ls", sczPackageId);
3786 3809
3810 pPackage->fPerMachine = TRUE;
3811
3787 pCompatiblePackage = &pPackage->compatiblePackage; 3812 pCompatiblePackage = &pPackage->compatiblePackage;
3788 3813
3789 if (!pCompatiblePackage->fDetected || !pCompatiblePackage->compatibleEntry.sczId || !pCompatiblePackage->sczCacheId || !*pCompatiblePackage->sczCacheId) 3814 if (!pCompatiblePackage->fDetected || !pCompatiblePackage->compatibleEntry.sczId || !pCompatiblePackage->sczCacheId || !*pCompatiblePackage->sczCacheId)
@@ -3826,6 +3851,8 @@ static HRESULT OnCleanPackage(
3826 hr = PackageFindById(pPackages, sczPackage, &pPackage); 3851 hr = PackageFindById(pPackages, sczPackage, &pPackage);
3827 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 3852 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3828 3853
3854 pPackage->fPerMachine = TRUE;
3855
3829 // Remove the package from the cache. 3856 // Remove the package from the cache.
3830 hr = CacheRemovePackage(pCache, TRUE, pPackage->sczId, pPackage->sczCacheId); 3857 hr = CacheRemovePackage(pCache, TRUE, pPackage->sczId, pPackage->sczCacheId);
3831 ExitOnFailure(hr, "Failed to remove from cache package: %ls", pPackage->sczId); 3858 ExitOnFailure(hr, "Failed to remove from cache package: %ls", pPackage->sczId);
diff --git a/src/burn/engine/engine.cpp b/src/burn/engine/engine.cpp
index d432f732..8423da41 100644
--- a/src/burn/engine/engine.cpp
+++ b/src/burn/engine/engine.cpp
@@ -16,11 +16,6 @@ static HRESULT InitializeEngineState(
16static void UninitializeEngineState( 16static void UninitializeEngineState(
17 __in BURN_ENGINE_STATE* pEngineState 17 __in BURN_ENGINE_STATE* pEngineState
18 ); 18 );
19#if 0
20static HRESULT RunUntrusted(
21 __in BURN_ENGINE_STATE* pEngineState
22 );
23#endif
24static HRESULT RunNormal( 19static HRESULT RunNormal(
25 __in HINSTANCE hInstance, 20 __in HINSTANCE hInstance,
26 __in BURN_ENGINE_STATE* pEngineState 21 __in BURN_ENGINE_STATE* pEngineState
@@ -812,7 +807,7 @@ static HRESULT ProcessMessage(
812 break; 807 break;
813 808
814 case WM_BURN_PLAN: 809 case WM_BURN_PLAN:
815 hr = CorePlan(pEngineState, pAction->plan.action); 810 hr = CorePlan(pEngineState, pAction->plan.action, pAction->plan.plannedScope);
816 break; 811 break;
817 812
818 case WM_BURN_ELEVATE: 813 case WM_BURN_ELEVATE:
diff --git a/src/burn/engine/engine.mc b/src/burn/engine/engine.mc
index 776f7832..8e2f1a2e 100644
--- a/src/burn/engine/engine.mc
+++ b/src/burn/engine/engine.mc
@@ -271,7 +271,7 @@ MessageId=101
271Severity=Success 271Severity=Success
272SymbolicName=MSG_DETECTED_PACKAGE 272SymbolicName=MSG_DETECTED_PACKAGE
273Language=English 273Language=English
274Detected package: %1!ls!, state: %2!hs!, cached: %3!hs!, install registration state: %4!hs!, cache registration state: %5!hs! 274Detected package: %1!ls!, state: %2!hs!, authored scope: %6!hs!, cached: %3!hs!, install registration state: %4!hs!, cache registration state: %5!hs!
275. 275.
276 276
277MessageId=102 277MessageId=102
@@ -404,14 +404,21 @@ MessageId=200
404Severity=Success 404Severity=Success
405SymbolicName=MSG_PLAN_BEGIN 405SymbolicName=MSG_PLAN_BEGIN
406Language=English 406Language=English
407Plan begin, %1!u! packages, action: %2!hs! 407Plan begin, %1!u! packages, action: %2!hs!, planned scope: %3!hs!
408.
409
410MessageId=226
411Severity=Success
412SymbolicName=MSG_PLAN_CONFIGURED_SCOPE
413Language=English
414Planned configurable scope: %1!hs!
408. 415.
409 416
410MessageId=201 417MessageId=201
411Severity=Success 418Severity=Success
412SymbolicName=MSG_PLANNED_PACKAGE 419SymbolicName=MSG_PLANNED_PACKAGE
413Language=English 420Language=English
414Planned package: %1!ls!, state: %2!hs!, default requested: %3!hs!, ba requested: %4!hs!, execute: %5!hs!, rollback: %6!hs!, default cache strategy: %7!hs!, ba requested strategy: %8!hs!, cache: %9!hs!, uncache: %10!hs!, dependency: %11!hs!, expected install registration state: %12!hs!, expected cache registration state: %13!hs! 421Planned package: %1!ls!, state: %2!hs!, default requested: %3!hs!, ba requested: %4!hs!, execute: %5!hs!, rollback: %6!hs!, scope: %14!hs!, default cache strategy: %7!hs!, ba requested strategy: %8!hs!, cache: %9!hs!, uncache: %10!hs!, dependency: %11!hs!, expected install registration state: %12!hs!, expected cache registration state: %13!hs!
415. 422.
416 423
417MessageId=203 424MessageId=203
@@ -782,7 +789,7 @@ MessageId=328
782Severity=Warning 789Severity=Warning
783SymbolicName=MSG_DEPENDENCY_PACKAGE_DEPENDENT 790SymbolicName=MSG_DEPENDENCY_PACKAGE_DEPENDENT
784Language=English 791Language=English
785Found dependent: %1!ls!, name: %2!ls! 792 Found dependent: %1!ls!, name: %2!ls!
786. 793.
787 794
788MessageId=329 795MessageId=329
@@ -1288,3 +1295,17 @@ SymbolicName=MSG_DEPENDENCY_PACKAGE_DEPENDENTS_OVERRIDDEN
1288Language=English 1295Language=English
1289BA requested to uninstall package: %1!ls!, despite dependents: 1296BA requested to uninstall package: %1!ls!, despite dependents:
1290. 1297.
1298MessageId=702
1299Severity=Warning
1300SymbolicName=MSG_SCOPE_IGNORED_BA_SCOPE
1301Language=English
1302Scope command-line switch ignored because the bootstrapper application already specified a scope.
1303.
1304
1305MessageId=703
1306Severity=Warning
1307SymbolicName=MSG_SCOPE_IGNORED_UNCONFIGURABLE
1308Language=English
1309Scope command-line switch ignored because the bundle doesn't have any packages with configurable scope.
1310.
1311
diff --git a/src/burn/engine/engine.vcxproj b/src/burn/engine/engine.vcxproj
index 98556ea6..5ab9f1ce 100644
--- a/src/burn/engine/engine.vcxproj
+++ b/src/burn/engine/engine.vcxproj
@@ -1,6 +1,5 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> 2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 3<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <ItemGroup Label="ProjectConfigurations"> 4 <ItemGroup Label="ProjectConfigurations">
6 <ProjectConfiguration Include="Debug|Win32"> 5 <ProjectConfiguration Include="Debug|Win32">
@@ -28,7 +27,6 @@
28 <Platform>ARM64</Platform> 27 <Platform>ARM64</Platform>
29 </ProjectConfiguration> 28 </ProjectConfiguration>
30 </ItemGroup> 29 </ItemGroup>
31
32 <PropertyGroup Label="Globals"> 30 <PropertyGroup Label="Globals">
33 <ProjectGuid>{8119537D-E1D9-6591-D51A-49768A2F9C37}</ProjectGuid> 31 <ProjectGuid>{8119537D-E1D9-6591-D51A-49768A2F9C37}</ProjectGuid>
34 <ConfigurationType>StaticLibrary</ConfigurationType> 32 <ConfigurationType>StaticLibrary</ConfigurationType>
@@ -37,20 +35,15 @@
37 <Description>Native component of WixToolset.Burn</Description> 35 <Description>Native component of WixToolset.Burn</Description>
38 <CustomBuildBeforeTargets>ClCompile</CustomBuildBeforeTargets> 36 <CustomBuildBeforeTargets>ClCompile</CustomBuildBeforeTargets>
39 </PropertyGroup> 37 </PropertyGroup>
40
41 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 38 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
42 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> 39 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
43
44 <PropertyGroup> 40 <PropertyGroup>
45 <ProjectAdditionalIncludeDirectories>..\..\api\burn\inc;$(BurnGeneratedHeaderDirectory);$(ProjectAdditionalIncludeDirectories)</ProjectAdditionalIncludeDirectories> 41 <ProjectAdditionalIncludeDirectories>..\..\api\burn\inc;$(BurnGeneratedHeaderDirectory);$(ProjectAdditionalIncludeDirectories)</ProjectAdditionalIncludeDirectories>
46 </PropertyGroup> 42 </PropertyGroup>
47
48 <ImportGroup Label="ExtensionSettings"> 43 <ImportGroup Label="ExtensionSettings">
49 </ImportGroup> 44 </ImportGroup>
50
51 <ImportGroup Label="Shared"> 45 <ImportGroup Label="Shared">
52 </ImportGroup> 46 </ImportGroup>
53
54 <ItemGroup> 47 <ItemGroup>
55 <ClCompile Include="apply.cpp" /> 48 <ClCompile Include="apply.cpp" />
56 <ClCompile Include="approvedexe.cpp" /> 49 <ClCompile Include="approvedexe.cpp" />
@@ -97,7 +90,6 @@
97 <ClCompile Include="variable.cpp" /> 90 <ClCompile Include="variable.cpp" />
98 <ClCompile Include="variant.cpp" /> 91 <ClCompile Include="variant.cpp" />
99 </ItemGroup> 92 </ItemGroup>
100
101 <ItemGroup> 93 <ItemGroup>
102 <ClInclude Include="apply.h" /> 94 <ClInclude Include="apply.h" />
103 <ClInclude Include="approvedexe.h" /> 95 <ClInclude Include="approvedexe.h" />
@@ -147,7 +139,6 @@
147 <ClInclude Include="variable.h" /> 139 <ClInclude Include="variable.h" />
148 <ClInclude Include="variant.h" /> 140 <ClInclude Include="variant.h" />
149 </ItemGroup> 141 </ItemGroup>
150
151 <ItemDefinitionGroup> 142 <ItemDefinitionGroup>
152 <CustomBuildStep> 143 <CustomBuildStep>
153 <Message>Compiling message file...</Message> 144 <Message>Compiling message file...</Message>
@@ -157,7 +148,6 @@ rc.exe -fo "$(OutDir)engine.res" "$(IntDir)engine.messages.rc"</Command>
157 <Outputs>$(IntDir)engine.messages.h;$(IntDir)engine.messages.rc</Outputs> 148 <Outputs>$(IntDir)engine.messages.h;$(IntDir)engine.messages.rc</Outputs>
158 </CustomBuildStep> 149 </CustomBuildStep>
159 </ItemDefinitionGroup> 150 </ItemDefinitionGroup>
160
161 <Target Name="SetWixVersion" BeforeTargets="ClCompile"> 151 <Target Name="SetWixVersion" BeforeTargets="ClCompile">
162 <PropertyGroup> 152 <PropertyGroup>
163 <rmj>$(SomeVerInfoMajor)</rmj> 153 <rmj>$(SomeVerInfoMajor)</rmj>
@@ -172,11 +162,12 @@ rc.exe -fo "$(OutDir)engine.res" "$(IntDir)engine.messages.rc"</Command>
172 </ItemGroup> 162 </ItemGroup>
173 <WriteLinesToFile Overwrite="true" File="$(BurnGeneratedHeaderDirectory)engine.version.h" Lines="@(BurnVersionLines)" /> 163 <WriteLinesToFile Overwrite="true" File="$(BurnGeneratedHeaderDirectory)engine.version.h" Lines="@(BurnVersionLines)" />
174 </Target> 164 </Target>
175
176 <ItemGroup> 165 <ItemGroup>
177 <PackageReference Include="WixToolset.DUtil" /> 166 <PackageReference Include="WixToolset.DUtil" />
178 <PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="All" /> 167 <PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="All" />
179 </ItemGroup> 168 </ItemGroup>
180 169 <ItemGroup>
170 <None Include="engine.mc" />
171 </ItemGroup>
181 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 172 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
182</Project> 173</Project> \ No newline at end of file
diff --git a/src/burn/engine/externalengine.cpp b/src/burn/engine/externalengine.cpp
index 352d184c..d4814dc1 100644
--- a/src/burn/engine/externalengine.cpp
+++ b/src/burn/engine/externalengine.cpp
@@ -633,8 +633,9 @@ LExit:
633 633
634HRESULT ExternalEnginePlan( 634HRESULT ExternalEnginePlan(
635 __in BAENGINE_CONTEXT* pEngineContext, 635 __in BAENGINE_CONTEXT* pEngineContext,
636 __in const BOOTSTRAPPER_ACTION action 636 __in const BOOTSTRAPPER_ACTION action,
637 ) 637 __in const BOOTSTRAPPER_SCOPE plannedScope
638)
638{ 639{
639 HRESULT hr = S_OK; 640 HRESULT hr = S_OK;
640 BAENGINE_ACTION* pAction = NULL; 641 BAENGINE_ACTION* pAction = NULL;
@@ -649,6 +650,7 @@ HRESULT ExternalEnginePlan(
649 650
650 pAction->dwMessage = WM_BURN_PLAN; 651 pAction->dwMessage = WM_BURN_PLAN;
651 pAction->plan.action = action; 652 pAction->plan.action = action;
653 pAction->plan.plannedScope = plannedScope;
652 654
653 hr = EnqueueAction(pEngineContext, &pAction); 655 hr = EnqueueAction(pEngineContext, &pAction);
654 ExitOnFailure(hr, "Failed to enqueue plan action."); 656 ExitOnFailure(hr, "Failed to enqueue plan action.");
diff --git a/src/burn/engine/externalengine.h b/src/burn/engine/externalengine.h
index 9b95e645..1053d0c0 100644
--- a/src/burn/engine/externalengine.h
+++ b/src/burn/engine/externalengine.h
@@ -146,8 +146,9 @@ HRESULT ExternalEngineDetect(
146 146
147HRESULT ExternalEnginePlan( 147HRESULT ExternalEnginePlan(
148 __in BAENGINE_CONTEXT* pEngineContext, 148 __in BAENGINE_CONTEXT* pEngineContext,
149 __in const BOOTSTRAPPER_ACTION action 149 __in const BOOTSTRAPPER_ACTION action,
150 ); 150 __in const BOOTSTRAPPER_SCOPE plannedScope
151);
151 152
152HRESULT ExternalEngineElevate( 153HRESULT ExternalEngineElevate(
153 __in BAENGINE_CONTEXT* pEngineContext, 154 __in BAENGINE_CONTEXT* pEngineContext,
diff --git a/src/burn/engine/logging.cpp b/src/burn/engine/logging.cpp
index 52123499..47f52d27 100644
--- a/src/burn/engine/logging.cpp
+++ b/src/burn/engine/logging.cpp
@@ -968,6 +968,42 @@ extern "C" LPCSTR LoggingInstallScopeToString(
968 return fPerMachine ? "PerMachine" : "PerUser"; 968 return fPerMachine ? "PerMachine" : "PerUser";
969} 969}
970 970
971extern "C" LPCSTR LoggingPackageScopeToString(
972 __in BOOTSTRAPPER_PACKAGE_SCOPE scope
973 )
974{
975 switch (scope)
976 {
977 case BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE:
978 return "PerMachine";
979 case BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER:
980 return "PerMachineOrUser";
981 case BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE:
982 return "PerUserOrMachine";
983 case BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER:
984 return "PerUser";
985 default:
986 return "Invalid";
987 }
988}
989
990extern "C" LPCSTR LoggingBundleScopeToString(
991 __in BOOTSTRAPPER_SCOPE scope
992 )
993{
994 switch (scope)
995 {
996 case BOOTSTRAPPER_SCOPE_DEFAULT:
997 return "Default";
998 case BOOTSTRAPPER_SCOPE_PER_MACHINE:
999 return "PerMachine";
1000 case BOOTSTRAPPER_SCOPE_PER_USER:
1001 return "PerUser";
1002 default:
1003 return "Invalid";
1004 }
1005}
1006
971 1007
972// internal function declarations 1008// internal function declarations
973 1009
diff --git a/src/burn/engine/logging.h b/src/burn/engine/logging.h
index b28a53d4..76103732 100644
--- a/src/burn/engine/logging.h
+++ b/src/burn/engine/logging.h
@@ -202,6 +202,13 @@ LPCSTR LoggingInstallScopeToString(
202 __in BOOL fPerMachine 202 __in BOOL fPerMachine
203 ); 203 );
204 204
205LPCSTR LoggingPackageScopeToString(
206 __in BOOTSTRAPPER_PACKAGE_SCOPE scope
207 );
208
209LPCSTR LoggingBundleScopeToString(
210 __in BOOTSTRAPPER_SCOPE scope
211 );
205 212
206#if defined(__cplusplus) 213#if defined(__cplusplus)
207} 214}
diff --git a/src/burn/engine/msiengine.cpp b/src/burn/engine/msiengine.cpp
index a1379054..11bb8a0e 100644
--- a/src/burn/engine/msiengine.cpp
+++ b/src/burn/engine/msiengine.cpp
@@ -454,7 +454,18 @@ extern "C" HRESULT MsiEngineDetectPackage(
454 454
455 // detect self by product code 455 // detect self by product code
456 // TODO: what to do about MSIINSTALLCONTEXT_USERMANAGED? 456 // TODO: what to do about MSIINSTALLCONTEXT_USERMANAGED?
457 hr = WiuGetProductInfoEx(pPackage->Msi.sczProductCode, NULL, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion); 457 if (BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER == pPackage->scope || BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE == pPackage->scope)
458 {
459 hr = WiuGetProductInfoEx(pPackage->Msi.sczProductCode, NULL, MSIINSTALLCONTEXT_MACHINE, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion);
460 if (FAILED(hr))
461 {
462 hr = WiuGetProductInfoEx(pPackage->Msi.sczProductCode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion);
463 }
464 }
465 else
466 {
467 hr = WiuGetProductInfoEx(pPackage->Msi.sczProductCode, NULL, pPackage->scope == BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion);
468 }
458 if (SUCCEEDED(hr)) 469 if (SUCCEEDED(hr))
459 { 470 {
460 fDetectFeatures = TRUE; 471 fDetectFeatures = TRUE;
@@ -777,7 +788,18 @@ extern "C" HRESULT MsiEngineDetectCompatiblePackage(
777 ExitFunction(); 788 ExitFunction();
778 } 789 }
779 790
780 hr = WiuGetProductInfoEx(wzCompatibleProductCode, NULL, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczVersion); 791 if (BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER == pPackage->scope || BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE == pPackage->scope)
792 {
793 hr = WiuGetProductInfoEx(wzCompatibleProductCode, NULL, MSIINSTALLCONTEXT_MACHINE, INSTALLPROPERTY_VERSIONSTRING, &sczVersion);
794 if (FAILED(hr))
795 {
796 hr = WiuGetProductInfoEx(wzCompatibleProductCode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczVersion);
797 }
798 }
799 else
800 {
801 hr = WiuGetProductInfoEx(wzCompatibleProductCode, NULL, pPackage->scope == BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczVersion);
802 }
781 if (HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) == hr || HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) == hr || E_INVALIDARG == hr) 803 if (HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) == hr || HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) == hr || E_INVALIDARG == hr)
782 { 804 {
783 ExitFunction1(hr = S_OK); 805 ExitFunction1(hr = S_OK);
@@ -1336,10 +1358,10 @@ extern "C" HRESULT MsiEngineExecutePackage(
1336 hr = ConcatPatchProperty(pCache, pPackage, fRollback, &sczObfuscatedProperties); 1358 hr = ConcatPatchProperty(pCache, pPackage, fRollback, &sczObfuscatedProperties);
1337 ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string."); 1359 ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string.");
1338 1360
1339 hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, 0 != pPackage->Msi.cFeatures, &sczProperties); 1361 hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, 0 != pPackage->Msi.cFeatures, pExecuteAction->msiPackage.pPackage->scope, pExecuteAction->msiPackage.pPackage->fPerMachine, &sczProperties);
1340 ExitOnFailure(hr, "Failed to add action property to argument string."); 1362 ExitOnFailure(hr, "Failed to add action property to argument string.");
1341 1363
1342 hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, 0 != pPackage->Msi.cFeatures, &sczObfuscatedProperties); 1364 hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, 0 != pPackage->Msi.cFeatures, pPackage->scope, pPackage->fPerMachine, &sczObfuscatedProperties);
1343 ExitOnFailure(hr, "Failed to add action property to obfuscated argument string."); 1365 ExitOnFailure(hr, "Failed to add action property to obfuscated argument string.");
1344 1366
1345 LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L""); 1367 LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L"");
@@ -1449,7 +1471,7 @@ extern "C" HRESULT MsiEngineUninstallCompatiblePackage(
1449 ExitOnFailure(hr, "Failed to enable logging for compatible package: %ls to: %ls", pCompatibleEntry->sczId, pExecuteAction->uninstallMsiCompatiblePackage.sczLogPath); 1471 ExitOnFailure(hr, "Failed to enable logging for compatible package: %ls to: %ls", pCompatibleEntry->sczId, pExecuteAction->uninstallMsiCompatiblePackage.sczLogPath);
1450 } 1472 }
1451 1473
1452 hr = MsiEngineConcatBurnProperties(action, burnMsiProperty, fileVersioning, TRUE, FALSE, &sczProperties); 1474 hr = MsiEngineConcatBurnProperties(action, burnMsiProperty, fileVersioning, TRUE, FALSE, pParentPackage->scope, pParentPackage->fPerMachine, &sczProperties);
1453 ExitOnFailure(hr, "Failed to add action property to argument string."); 1475 ExitOnFailure(hr, "Failed to add action property to argument string.");
1454 1476
1455 LogId(REPORT_STANDARD, MSG_APPLYING_ORPHAN_COMPATIBLE_PACKAGE, LoggingRollbackOrExecute(fRollback), pCompatibleEntry->sczId, pParentPackage->sczId, LoggingActionStateToString(action), sczProperties ? sczProperties : L""); 1477 LogId(REPORT_STANDARD, MSG_APPLYING_ORPHAN_COMPATIBLE_PACKAGE, LoggingRollbackOrExecute(fRollback), pCompatibleEntry->sczId, pParentPackage->sczId, LoggingActionStateToString(action), sczProperties ? sczProperties : L"");
@@ -1491,6 +1513,8 @@ extern "C" HRESULT MsiEngineConcatBurnProperties(
1491 __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning, 1513 __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning,
1492 __in BOOL fMsiPackage, 1514 __in BOOL fMsiPackage,
1493 __in BOOL fFeatureSelectionEnabled, 1515 __in BOOL fFeatureSelectionEnabled,
1516 __in BOOTSTRAPPER_PACKAGE_SCOPE scope,
1517 __in BOOL fPlannedPerMachineScope,
1494 __deref_out_z LPWSTR* psczProperties 1518 __deref_out_z LPWSTR* psczProperties
1495 ) 1519 )
1496{ 1520{
@@ -1534,6 +1558,7 @@ extern "C" HRESULT MsiEngineConcatBurnProperties(
1534 break; 1558 break;
1535 } 1559 }
1536 1560
1561 // Append properties used by WixUI (and usable otherwise) to adjust internal UI behavior.
1537 switch (actionMsiProperty) 1562 switch (actionMsiProperty)
1538 { 1563 {
1539 case BURN_MSI_PROPERTY_INSTALL: 1564 case BURN_MSI_PROPERTY_INSTALL:
@@ -1581,6 +1606,20 @@ extern "C" HRESULT MsiEngineConcatBurnProperties(
1581 ExitOnFailure(hr, "Failed to add reinstall mode."); 1606 ExitOnFailure(hr, "Failed to add reinstall mode.");
1582 } 1607 }
1583 1608
1609 if (BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE == scope || BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER == scope)
1610 {
1611 if (fPlannedPerMachineScope)
1612 {
1613 hr = StrAllocConcatFormattedSecure(psczProperties, L" MSIINSTALLPERUSER=\"\"");
1614 ExitOnFailure(hr, "Failed to add per-machine scope properties.");
1615 }
1616 else
1617 {
1618 hr = StrAllocConcatFormattedSecure(psczProperties, L" MSIINSTALLPERUSER=\"1\"");
1619 ExitOnFailure(hr, "Failed to add per-user scope properties.");
1620 }
1621 }
1622
1584 hr = StrAllocConcatSecure(psczProperties, L" REBOOT=ReallySuppress", 0); 1623 hr = StrAllocConcatSecure(psczProperties, L" REBOOT=ReallySuppress", 0);
1585 ExitOnFailure(hr, "Failed to add reboot suppression property."); 1624 ExitOnFailure(hr, "Failed to add reboot suppression property.");
1586 1625
diff --git a/src/burn/engine/msiengine.h b/src/burn/engine/msiengine.h
index 862c4f6a..d4660dc8 100644
--- a/src/burn/engine/msiengine.h
+++ b/src/burn/engine/msiengine.h
@@ -93,6 +93,8 @@ HRESULT MsiEngineConcatBurnProperties(
93 __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning, 93 __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning,
94 __in BOOL fMsiPackage, 94 __in BOOL fMsiPackage,
95 __in BOOL fFeatureSelectionEnabled, 95 __in BOOL fFeatureSelectionEnabled,
96 __in BOOTSTRAPPER_PACKAGE_SCOPE scope,
97 __in BOOL fPlannedPerMachineScope,
96 __deref_out_z LPWSTR* psczProperties 98 __deref_out_z LPWSTR* psczProperties
97 ); 99 );
98HRESULT MsiEngineConcatPackageProperties( 100HRESULT MsiEngineConcatPackageProperties(
diff --git a/src/burn/engine/mspengine.cpp b/src/burn/engine/mspengine.cpp
index e8ef7fcb..18be3cc6 100644
--- a/src/burn/engine/mspengine.cpp
+++ b/src/burn/engine/mspengine.cpp
@@ -676,10 +676,10 @@ extern "C" HRESULT MspEngineExecutePackage(
676 } 676 }
677 677
678 // Always add Burn properties last. 678 // Always add Burn properties last.
679 hr = MsiEngineConcatBurnProperties(pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.actionMsiProperty, pExecuteAction->mspTarget.fileVersioning, FALSE, FALSE, &sczProperties); 679 hr = MsiEngineConcatBurnProperties(pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.actionMsiProperty, pExecuteAction->mspTarget.fileVersioning, FALSE, FALSE, pExecuteAction->mspTarget.pPackage->scope, pExecuteAction->mspTarget.pPackage->fPerMachine, &sczProperties);
680 ExitOnFailure(hr, "Failed to add action property to argument string."); 680 ExitOnFailure(hr, "Failed to add action property to argument string.");
681 681
682 hr = MsiEngineConcatBurnProperties(pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.actionMsiProperty, pExecuteAction->mspTarget.fileVersioning, FALSE, FALSE, &sczObfuscatedProperties); 682 hr = MsiEngineConcatBurnProperties(pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.actionMsiProperty, pExecuteAction->mspTarget.fileVersioning, FALSE, FALSE, pExecuteAction->mspTarget.pPackage->scope, pExecuteAction->mspTarget.pPackage->fPerMachine, &sczObfuscatedProperties);
683 ExitOnFailure(hr, "Failed to add action property to obfuscated argument string."); 683 ExitOnFailure(hr, "Failed to add action property to obfuscated argument string.");
684 684
685 LogId(REPORT_STANDARD, MSG_APPLYING_PATCH_PACKAGE, pExecuteAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pExecuteAction->mspTarget.action), sczPatches, sczObfuscatedProperties, pExecuteAction->mspTarget.sczTargetProductCode); 685 LogId(REPORT_STANDARD, MSG_APPLYING_PATCH_PACKAGE, pExecuteAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pExecuteAction->mspTarget.action), sczPatches, sczObfuscatedProperties, pExecuteAction->mspTarget.sczTargetProductCode);
diff --git a/src/burn/engine/package.cpp b/src/burn/engine/package.cpp
index 3bf676ba..61b73dc6 100644
--- a/src/burn/engine/package.cpp
+++ b/src/burn/engine/package.cpp
@@ -154,9 +154,12 @@ extern "C" HRESULT PackagesParseFromXml(
154 hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize); 154 hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize);
155 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallSize."); 155 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallSize.");
156 156
157 // @PerMachine 157 // @Scope
158 hr = XmlGetYesNoAttribute(pixnNode, L"PerMachine", &pPackage->fPerMachine); 158 hr = PackageParseScopeFromXml(pixnNode, &pPackage->scope);
159 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @PerMachine."); 159 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Scope.");
160
161 // Shortcut for static per-machine or per-user packages.
162 pPackage->fPerMachine = BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE == pPackage->scope;
160 163
161 // @Permanent 164 // @Permanent
162 hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fPermanent); 165 hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fPermanent);
@@ -593,6 +596,45 @@ LExit:
593 return hr; 596 return hr;
594} 597}
595 598
599extern "C" HRESULT PackageParseScopeFromXml(
600 __in IXMLDOMNode* pixn,
601 __in BOOTSTRAPPER_PACKAGE_SCOPE* pScope
602)
603{
604 HRESULT hr = S_OK;
605 LPWSTR scz = NULL;
606
607 hr = XmlGetAttributeEx(pixn, L"Scope", &scz);
608 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Scope.");
609
610 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, scz, -1, L"perMachine", -1))
611 {
612 *pScope = BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE;
613 }
614 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, scz, -1, L"perUser", -1))
615 {
616 *pScope = BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER;
617 }
618 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, scz, -1, L"perUserOrMachine", -1))
619 {
620 *pScope = BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE;
621 }
622 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, scz, -1, L"perMachineOrUser", -1))
623 {
624 *pScope = BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER;
625 }
626 else
627 {
628 hr = E_UNEXPECTED;
629 ExitOnRootFailure(hr, "Invalid scope: %ls", scz);
630 }
631
632LExit:
633 ReleaseStr(scz);
634
635 return hr;
636}
637
596 638
597// internal function declarations 639// internal function declarations
598 640
diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h
index d596d7c0..5397e9cc 100644
--- a/src/burn/engine/package.h
+++ b/src/burn/engine/package.h
@@ -268,7 +268,8 @@ typedef struct _BURN_PACKAGE
268 268
269 LPWSTR sczInstallCondition; 269 LPWSTR sczInstallCondition;
270 LPWSTR sczRepairCondition; 270 LPWSTR sczRepairCondition;
271 BOOL fPerMachine; 271 BOOTSTRAPPER_PACKAGE_SCOPE scope;
272 BOOL fPerMachine; // only valid after Plan (for PUOM/PMOU packages).
272 BOOL fPermanent; 273 BOOL fPermanent;
273 BOOL fVital; 274 BOOL fVital;
274 BOOL fCanAffectRegistration; 275 BOOL fCanAffectRegistration;
@@ -483,6 +484,10 @@ HRESULT PackageFindRollbackBoundaryById(
483 __in_z LPCWSTR wzId, 484 __in_z LPCWSTR wzId,
484 __out BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary 485 __out BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary
485 ); 486 );
487HRESULT PackageParseScopeFromXml(
488 __in IXMLDOMNode* pixn,
489 __in BOOTSTRAPPER_PACKAGE_SCOPE* pScope
490 );
486 491
487 492
488#if defined(__cplusplus) 493#if defined(__cplusplus)
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp
index edc09033..6c46269b 100644
--- a/src/burn/engine/plan.cpp
+++ b/src/burn/engine/plan.cpp
@@ -278,7 +278,7 @@ extern "C" void PlanReset(
278 } 278 }
279 } 279 }
280 280
281 PlanSetVariables(BOOTSTRAPPER_ACTION_UNKNOWN, pVariables); 281 PlanSetVariables(BOOTSTRAPPER_ACTION_UNKNOWN, BOOTSTRAPPER_PACKAGE_SCOPE_INVALID, BOOTSTRAPPER_SCOPE_DEFAULT, pVariables);
282} 282}
283 283
284extern "C" void PlanUninitializeExecuteAction( 284extern "C" void PlanUninitializeExecuteAction(
@@ -332,6 +332,8 @@ extern "C" void PlanUninitializeExecuteAction(
332 332
333extern "C" HRESULT PlanSetVariables( 333extern "C" HRESULT PlanSetVariables(
334 __in BOOTSTRAPPER_ACTION action, 334 __in BOOTSTRAPPER_ACTION action,
335 __in BOOTSTRAPPER_PACKAGE_SCOPE authoredScope,
336 __in BOOTSTRAPPER_SCOPE plannedScope,
335 __in BURN_VARIABLES* pVariables 337 __in BURN_VARIABLES* pVariables
336 ) 338 )
337{ 339{
@@ -340,6 +342,12 @@ extern "C" HRESULT PlanSetVariables(
340 hr = VariableSetNumeric(pVariables, BURN_BUNDLE_ACTION, action, TRUE); 342 hr = VariableSetNumeric(pVariables, BURN_BUNDLE_ACTION, action, TRUE);
341 ExitOnFailure(hr, "Failed to set the bundle action built-in variable."); 343 ExitOnFailure(hr, "Failed to set the bundle action built-in variable.");
342 344
345 hr = VariableSetNumeric(pVariables, BURN_BUNDLE_SCOPE, authoredScope, TRUE);
346 ExitOnFailure(hr, "Failed to set the bundle authored scope built-in variable.");
347
348 hr = VariableSetNumeric(pVariables, BURN_BUNDLE_PLANNED_SCOPE, plannedScope, TRUE);
349 ExitOnFailure(hr, "Failed to set the bundle planned scope built-in variable.");
350
343LExit: 351LExit:
344 return hr; 352 return hr;
345} 353}
@@ -812,6 +820,66 @@ LExit:
812 return hr; 820 return hr;
813} 821}
814 822
823extern "C" HRESULT PlanPackagesAndBundleScope(
824 __in BURN_PACKAGE* rgPackages,
825 __in DWORD cPackages,
826 __in BOOTSTRAPPER_SCOPE scope,
827 __in BOOTSTRAPPER_PACKAGE_SCOPE authoredScope,
828 __in BOOTSTRAPPER_SCOPE commandLineScope,
829 __out BOOTSTRAPPER_SCOPE* pResultingScope,
830 __out BOOL* pfRegistrationPerMachine
831)
832{
833 HRESULT hr = S_OK;
834 BOOL fRegistrationPerMachine = TRUE;
835
836 // If a scope was specified on the command line and the BA didn't set a scope,
837 // let the command-line switch override.
838 if (BOOTSTRAPPER_SCOPE_DEFAULT != commandLineScope)
839 {
840 if (BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER == authoredScope || BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE == authoredScope)
841 {
842 if (BOOTSTRAPPER_SCOPE_DEFAULT == scope)
843 {
844 scope = commandLineScope;
845 }
846 else
847 {
848 LogId(REPORT_STANDARD, MSG_SCOPE_IGNORED_BA_SCOPE);
849 }
850 }
851 else
852 {
853 LogId(REPORT_STANDARD, MSG_SCOPE_IGNORED_UNCONFIGURABLE);
854 }
855 }
856
857 for (DWORD i = 0; i < cPackages; ++i)
858 {
859 BURN_PACKAGE* pPackage = rgPackages + i;
860
861 pPackage->fPerMachine =
862 (BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE == pPackage->scope)
863 || (BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER == pPackage->scope &&
864 (BOOTSTRAPPER_SCOPE_DEFAULT == scope || BOOTSTRAPPER_SCOPE_PER_MACHINE == scope))
865 || (BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE == pPackage->scope &&
866 BOOTSTRAPPER_SCOPE_PER_MACHINE == scope);
867
868 // Any per-user package makes the registration per-user as well.
869 if (!pPackage->fPerMachine)
870 {
871 fRegistrationPerMachine = FALSE;
872 }
873 }
874
875 *pResultingScope = scope;
876 *pfRegistrationPerMachine = fRegistrationPerMachine;
877
878//LExit:
879 return hr;
880}
881
882
815static HRESULT PlanPackagesHelper( 883static HRESULT PlanPackagesHelper(
816 __in BURN_PACKAGE* rgPackages, 884 __in BURN_PACKAGE* rgPackages,
817 __in DWORD cPackages, 885 __in DWORD cPackages,
@@ -2971,7 +3039,7 @@ static void ExecuteActionLog(
2971 break; 3039 break;
2972 3040
2973 case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE: 3041 case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE:
2974 LogStringLine(PlanDumpLevel, "%ls action[%u]: MSI_PACKAGE package id: %ls, action: %hs, action msi property: %ls, ui level: %u, disable externaluihandler: %hs, file versioning: %hs, log path: %ls, logging attrib: %u", wzBase, iAction, pAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pAction->msiPackage.action), LoggingBurnMsiPropertyToString(pAction->msiPackage.actionMsiProperty), pAction->msiPackage.uiLevel, LoggingBoolToString(pAction->msiPackage.fDisableExternalUiHandler), LoggingMsiFileVersioningToString(pAction->msiPackage.fileVersioning), pAction->msiPackage.sczLogPath, pAction->msiPackage.dwLoggingAttributes); 3042 LogStringLine(PlanDumpLevel, "%ls action[%u]: MSI_PACKAGE package id: %ls, scope: %hs, action: %hs, action msi property: %ls, ui level: %u, disable externaluihandler: %hs, file versioning: %hs, log path: %ls, logging attrib: %u", wzBase, iAction, pAction->msiPackage.pPackage->sczId, LoggingPackageScopeToString(pAction->msiPackage.pPackage->scope), LoggingActionStateToString(pAction->msiPackage.action), LoggingBurnMsiPropertyToString(pAction->msiPackage.actionMsiProperty), pAction->msiPackage.uiLevel, LoggingBoolToString(pAction->msiPackage.fDisableExternalUiHandler), LoggingMsiFileVersioningToString(pAction->msiPackage.fileVersioning), pAction->msiPackage.sczLogPath, pAction->msiPackage.dwLoggingAttributes);
2975 for (DWORD j = 0; j < pAction->msiPackage.pPackage->Msi.cSlipstreamMspPackages; ++j) 3043 for (DWORD j = 0; j < pAction->msiPackage.pPackage->Msi.cSlipstreamMspPackages; ++j)
2976 { 3044 {
2977 const BURN_SLIPSTREAM_MSP* pSlipstreamMsp = pAction->msiPackage.pPackage->Msi.rgSlipstreamMsps + j; 3045 const BURN_SLIPSTREAM_MSP* pSlipstreamMsp = pAction->msiPackage.pPackage->Msi.rgSlipstreamMsps + j;
@@ -3083,6 +3151,7 @@ extern "C" void PlanDump(
3083 LogStringLine(PlanDumpLevel, " bundle code: %ls", pPlan->wzBundleCode); 3151 LogStringLine(PlanDumpLevel, " bundle code: %ls", pPlan->wzBundleCode);
3084 LogStringLine(PlanDumpLevel, " bundle provider key: %ls", pPlan->wzBundleProviderKey); 3152 LogStringLine(PlanDumpLevel, " bundle provider key: %ls", pPlan->wzBundleProviderKey);
3085 LogStringLine(PlanDumpLevel, " use-forward-compatible: %hs", LoggingTrueFalseToString(pPlan->fEnabledForwardCompatibleBundle)); 3153 LogStringLine(PlanDumpLevel, " use-forward-compatible: %hs", LoggingTrueFalseToString(pPlan->fEnabledForwardCompatibleBundle));
3154 LogStringLine(PlanDumpLevel, " planned scope: %hs", LoggingBundleScopeToString(pPlan->plannedScope));
3086 LogStringLine(PlanDumpLevel, " per-machine: %hs", LoggingTrueFalseToString(pPlan->fPerMachine)); 3155 LogStringLine(PlanDumpLevel, " per-machine: %hs", LoggingTrueFalseToString(pPlan->fPerMachine));
3087 LogStringLine(PlanDumpLevel, " can affect machine state: %hs", LoggingTrueFalseToString(pPlan->fCanAffectMachineState)); 3156 LogStringLine(PlanDumpLevel, " can affect machine state: %hs", LoggingTrueFalseToString(pPlan->fCanAffectMachineState));
3088 LogStringLine(PlanDumpLevel, " disable-rollback: %hs", LoggingTrueFalseToString(pPlan->fDisableRollback)); 3157 LogStringLine(PlanDumpLevel, " disable-rollback: %hs", LoggingTrueFalseToString(pPlan->fDisableRollback));
diff --git a/src/burn/engine/plan.h b/src/burn/engine/plan.h
index 03b1423d..a20d7c76 100644
--- a/src/burn/engine/plan.h
+++ b/src/burn/engine/plan.h
@@ -249,6 +249,7 @@ typedef struct _BURN_CLEAN_ACTION
249typedef struct _BURN_PLAN 249typedef struct _BURN_PLAN
250{ 250{
251 BOOTSTRAPPER_ACTION action; 251 BOOTSTRAPPER_ACTION action;
252 BOOTSTRAPPER_SCOPE plannedScope;
252 BURN_CACHE* pCache; 253 BURN_CACHE* pCache;
253 BOOTSTRAPPER_COMMAND* pCommand; 254 BOOTSTRAPPER_COMMAND* pCommand;
254 BURN_ENGINE_COMMAND* pInternalCommand; 255 BURN_ENGINE_COMMAND* pInternalCommand;
@@ -328,6 +329,8 @@ void PlanUninitializeExecuteAction(
328 ); 329 );
329HRESULT PlanSetVariables( 330HRESULT PlanSetVariables(
330 __in BOOTSTRAPPER_ACTION action, 331 __in BOOTSTRAPPER_ACTION action,
332 __in BOOTSTRAPPER_PACKAGE_SCOPE authoredScope,
333 __in BOOTSTRAPPER_SCOPE plannedScope,
331 __in BURN_VARIABLES* pVariables 334 __in BURN_VARIABLES* pVariables
332 ); 335 );
333HRESULT PlanDefaultRelatedBundlePlanType( 336HRESULT PlanDefaultRelatedBundlePlanType(
@@ -479,6 +482,15 @@ HRESULT PlanSetResumeCommand(
479void PlanDump( 482void PlanDump(
480 __in BURN_PLAN* pPlan 483 __in BURN_PLAN* pPlan
481 ); 484 );
485HRESULT PlanPackagesAndBundleScope(
486 __in BURN_PACKAGE* rgPackages,
487 __in DWORD cPackages,
488 __in BOOTSTRAPPER_SCOPE scope,
489 __in BOOTSTRAPPER_PACKAGE_SCOPE authoredScope,
490 __in BOOTSTRAPPER_SCOPE commandLineScope,
491 __out BOOTSTRAPPER_SCOPE* pResultingScope,
492 __out BOOL* pfPerMachine
493);
482 494
483#if defined(__cplusplus) 495#if defined(__cplusplus)
484} 496}
diff --git a/src/burn/engine/registration.cpp b/src/burn/engine/registration.cpp
index 9733e92c..fa1b024a 100644
--- a/src/burn/engine/registration.cpp
+++ b/src/burn/engine/registration.cpp
@@ -39,10 +39,6 @@ static HRESULT ParseSoftwareTagsFromXml(
39 __out BURN_SOFTWARE_TAG** prgSoftwareTags, 39 __out BURN_SOFTWARE_TAG** prgSoftwareTags,
40 __out DWORD* pcSoftwareTags 40 __out DWORD* pcSoftwareTags
41 ); 41 );
42static HRESULT SetPaths(
43 __in BURN_REGISTRATION* pRegistration,
44 __in BURN_CACHE* pCache
45 );
46static HRESULT GetBundleManufacturer( 42static HRESULT GetBundleManufacturer(
47 __in BURN_REGISTRATION* pRegistration, 43 __in BURN_REGISTRATION* pRegistration,
48 __in BURN_VARIABLES* pVariables, 44 __in BURN_VARIABLES* pVariables,
@@ -108,6 +104,15 @@ static HRESULT UpdateEstimatedSize(
108 ); 104 );
109static BOOL IsWuRebootPending(); 105static BOOL IsWuRebootPending();
110static BOOL IsRegistryRebootPending(); 106static BOOL IsRegistryRebootPending();
107static HRESULT RegistrationDetectResumeTypeByHive(
108 __in HKEY hkRegistrationRoot,
109 __in BURN_REGISTRATION* pRegistration,
110 __out BOOTSTRAPPER_RESUME_TYPE* pResumeType
111);
112static HRESULT DetectInstalled(
113 __in BURN_REGISTRATION* pRegistration,
114 __in HKEY hkRoot
115);
111 116
112// function definitions 117// function definitions
113 118
@@ -163,9 +168,9 @@ extern "C" HRESULT RegistrationParseFromXml(
163 hr = XmlGetAttributeEx(pixnRegistrationNode, L"ExecutableName", &pRegistration->sczExecutableName); 168 hr = XmlGetAttributeEx(pixnRegistrationNode, L"ExecutableName", &pRegistration->sczExecutableName);
164 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @ExecutableName."); 169 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @ExecutableName.");
165 170
166 // @PerMachine 171 // @Scope
167 hr = XmlGetYesNoAttribute(pixnRegistrationNode, L"PerMachine", &pRegistration->fPerMachine); 172 hr = PackageParseScopeFromXml(pixnRegistrationNode, &pRegistration->scope);
168 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @PerMachine."); 173 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Scope.");
169 174
170 // select ARP node 175 // select ARP node
171 hr = XmlSelectSingleNode(pixnRegistrationNode, L"Arp", &pixnArpNode); 176 hr = XmlSelectSingleNode(pixnRegistrationNode, L"Arp", &pixnArpNode);
@@ -285,8 +290,18 @@ extern "C" HRESULT RegistrationParseFromXml(
285 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Classification."); 290 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Classification.");
286 } 291 }
287 292
288 hr = SetPaths(pRegistration, pCache); 293 // Handle the easy case of build-time bundle scope early.
289 ExitOnFailure(hr, "Failed to set registration paths."); 294 if (BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE == pRegistration->scope || BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER == pRegistration->scope)
295 {
296 pRegistration->fPerMachine = BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE == pRegistration->scope;
297
298 hr = RegistrationSetPaths(pRegistration, pCache);
299 ExitOnFailure(hr, "Failed to set registration paths for fixed scope.");
300 }
301 else
302 {
303 pRegistration->hkRoot = reinterpret_cast<HKEY>(0ull);
304 }
290 305
291LExit: 306LExit:
292 ReleaseObject(pixnRegistrationNode); 307 ReleaseObject(pixnRegistrationNode);
@@ -452,31 +467,28 @@ LExit:
452 467
453extern "C" HRESULT RegistrationDetectInstalled( 468extern "C" HRESULT RegistrationDetectInstalled(
454 __in BURN_REGISTRATION* pRegistration 469 __in BURN_REGISTRATION* pRegistration
455 ) 470)
456{ 471{
457 HRESULT hr = S_OK; 472 HRESULT hr = S_OK;
458 HKEY hkRegistration = NULL;
459 DWORD dwInstalled = 0;
460 473
461 pRegistration->fCached = FileExistsEx(pRegistration->sczCacheExecutablePath, NULL); 474 if (pRegistration->hkRoot)
462 pRegistration->detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE;
463
464 // open registration key
465 hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_QUERY_VALUE, &hkRegistration);
466 if (SUCCEEDED(hr))
467 { 475 {
468 hr = RegReadNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, &dwInstalled); 476 hr = DetectInstalled(pRegistration, pRegistration->hkRoot);
469
470 pRegistration->detectedRegistrationType = (1 == dwInstalled) ? BOOTSTRAPPER_REGISTRATION_TYPE_FULL : BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS;
471 } 477 }
472 478 else
473 // Not finding the key or value is okay.
474 if (E_FILENOTFOUND == hr || E_PATHNOTFOUND == hr)
475 { 479 {
476 hr = S_OK; 480 // For PUOM/PMOU bundles, check per-machine then fall back to per-user.
481 hr = DetectInstalled(pRegistration, HKEY_LOCAL_MACHINE);
482 ExitOnFailure(hr, "Failed to detect HKEY_LOCAL_MACHINE bundle registration install state.");
483
484 if (BOOTSTRAPPER_REGISTRATION_TYPE_NONE == pRegistration->detectedRegistrationType)
485 {
486 hr = DetectInstalled(pRegistration, HKEY_CURRENT_USER);
487 ExitOnFailure(hr, "Failed to detect HKEY_CURRENT_USER bundle registration install state.");
488 }
477 } 489 }
478 490
479 ReleaseRegKey(hkRegistration); 491LExit:
480 return hr; 492 return hr;
481} 493}
482 494
@@ -488,63 +500,26 @@ extern "C" HRESULT RegistrationDetectInstalled(
488extern "C" HRESULT RegistrationDetectResumeType( 500extern "C" HRESULT RegistrationDetectResumeType(
489 __in BURN_REGISTRATION* pRegistration, 501 __in BURN_REGISTRATION* pRegistration,
490 __out BOOTSTRAPPER_RESUME_TYPE* pResumeType 502 __out BOOTSTRAPPER_RESUME_TYPE* pResumeType
491 ) 503)
492{ 504{
493 HRESULT hr = S_OK; 505 HRESULT hr = S_OK;
494 HKEY hkRegistration = NULL;
495 BOOL fExists = FALSE;
496 DWORD dwResume = 0;
497 506
498 // open registration key 507 if (pRegistration->hkRoot)
499 hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_QUERY_VALUE, &hkRegistration);
500 ExitOnPathFailure(hr, fExists, "Failed to open registration key.");
501
502 if (!fExists)
503 { 508 {
504 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_NONE; 509 hr = RegistrationDetectResumeTypeByHive(pRegistration->hkRoot, pRegistration, pResumeType);
505 ExitFunction();
506 } 510 }
507 511 else
508 // read Resume value
509 hr = RegReadNumber(hkRegistration, L"Resume", &dwResume);
510 ExitOnPathFailure(hr, fExists, "Failed to read Resume value.");
511
512 if (!fExists)
513 {
514 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_INVALID;
515 ExitFunction();
516 }
517
518 switch (dwResume)
519 { 512 {
520 case BURN_RESUME_MODE_ACTIVE: 513 hr = RegistrationDetectResumeTypeByHive(HKEY_LOCAL_MACHINE, pRegistration, pResumeType);
521 // a previous run was interrupted
522 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_INTERRUPTED;
523 break;
524
525 case BURN_RESUME_MODE_SUSPEND:
526 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_SUSPEND;
527 break;
528
529 case BURN_RESUME_MODE_ARP:
530 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_ARP;
531 break;
532
533 case BURN_RESUME_MODE_REBOOT_PENDING:
534 // The volatile pending registry doesn't exist (checked above) which means
535 // the system was successfully restarted.
536 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_REBOOT;
537 break;
538 514
539 default: 515 if (BOOTSTRAPPER_RESUME_TYPE_NONE == *pResumeType)
540 // the value stored in the registry is not valid 516 {
541 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_INVALID; 517 hr = RegistrationDetectResumeTypeByHive(HKEY_CURRENT_USER, pRegistration, pResumeType);
542 break; 518 }
543 } 519 }
520 ExitOnFailure(hr, "Failed to find bundle registration: %ls", pRegistration->sczRegistrationKey);
544 521
545LExit: 522LExit:
546 ReleaseRegKey(hkRegistration);
547
548 return hr; 523 return hr;
549} 524}
550 525
@@ -889,7 +864,7 @@ extern "C" HRESULT RegistrationSessionEnd(
889 864
890 // Open registration key. 865 // Open registration key.
891 hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_WRITE, &hkRegistration); 866 hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_WRITE, &hkRegistration);
892 ExitOnFailure(hr, "Failed to open registration key."); 867 ExitOnFailure(hr, "Failed to open registration key for ending session.");
893 868
894 // update display name 869 // update display name
895 hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS == registrationType); 870 hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS == registrationType);
@@ -1068,6 +1043,39 @@ extern "C" HRESULT RegistrationGetResumeCommandLine(
1068 return hr; 1043 return hr;
1069} 1044}
1070 1045
1046extern "C" HRESULT RegistrationSetPaths(
1047 __in BURN_REGISTRATION* pRegistration,
1048 __in BURN_CACHE* pCache
1049 )
1050{
1051 HRESULT hr = S_OK;
1052 LPWSTR sczCacheDirectory = NULL;
1053
1054 // save registration key root
1055 pRegistration->hkRoot = pRegistration->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1056
1057 // build uninstall registry key path
1058 hr = StrAllocFormatted(&pRegistration->sczRegistrationKey, L"%ls\\%ls", BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY, pRegistration->sczCode);
1059 ExitOnFailure(hr, "Failed to build uninstall registry key path.");
1060
1061 // build cache directory
1062 hr = CacheGetCompletedPath(pCache, pRegistration->fPerMachine, pRegistration->sczCode, &sczCacheDirectory);
1063 ExitOnFailure(hr, "Failed to build cache directory.");
1064
1065 // build cached executable path
1066 hr = PathConcatRelativeToFullyQualifiedBase(sczCacheDirectory, pRegistration->sczExecutableName, &pRegistration->sczCacheExecutablePath);
1067 ExitOnFailure(hr, "Failed to build cached executable path.");
1068
1069 // build state file path
1070 hr = StrAllocFormatted(&pRegistration->sczStateFile, L"%ls\\state.rsm", sczCacheDirectory);
1071 ExitOnFailure(hr, "Failed to build state file path.");
1072
1073LExit:
1074 ReleaseStr(sczCacheDirectory);
1075
1076 return hr;
1077}
1078
1071 1079
1072// internal helper functions 1080// internal helper functions
1073 1081
@@ -1141,38 +1149,6 @@ LExit:
1141 return hr; 1149 return hr;
1142} 1150}
1143 1151
1144static HRESULT SetPaths(
1145 __in BURN_REGISTRATION* pRegistration,
1146 __in BURN_CACHE* pCache
1147 )
1148{
1149 HRESULT hr = S_OK;
1150 LPWSTR sczCacheDirectory = NULL;
1151
1152 // save registration key root
1153 pRegistration->hkRoot = pRegistration->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1154
1155 // build uninstall registry key path
1156 hr = StrAllocFormatted(&pRegistration->sczRegistrationKey, L"%ls\\%ls", BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY, pRegistration->sczCode);
1157 ExitOnFailure(hr, "Failed to build uninstall registry key path.");
1158
1159 // build cache directory
1160 hr = CacheGetCompletedPath(pCache, pRegistration->fPerMachine, pRegistration->sczCode, &sczCacheDirectory);
1161 ExitOnFailure(hr, "Failed to build cache directory.");
1162
1163 // build cached executable path
1164 hr = PathConcatRelativeToFullyQualifiedBase(sczCacheDirectory, pRegistration->sczExecutableName, &pRegistration->sczCacheExecutablePath);
1165 ExitOnFailure(hr, "Failed to build cached executable path.");
1166
1167 // build state file path
1168 hr = StrAllocFormatted(&pRegistration->sczStateFile, L"%ls\\state.rsm", sczCacheDirectory);
1169 ExitOnFailure(hr, "Failed to build state file path.");
1170
1171LExit:
1172 ReleaseStr(sczCacheDirectory);
1173 return hr;
1174}
1175
1176static HRESULT GetBundleManufacturer( 1152static HRESULT GetBundleManufacturer(
1177 __in BURN_REGISTRATION* pRegistration, 1153 __in BURN_REGISTRATION* pRegistration,
1178 __in BURN_VARIABLES* pVariables, 1154 __in BURN_VARIABLES* pVariables,
@@ -1703,3 +1679,102 @@ static BOOL IsRegistryRebootPending()
1703 1679
1704 return fRebootPending; 1680 return fRebootPending;
1705} 1681}
1682
1683static HRESULT RegistrationDetectResumeTypeByHive(
1684 __in HKEY hkRegistrationRoot,
1685 __in BURN_REGISTRATION* pRegistration,
1686 __out BOOTSTRAPPER_RESUME_TYPE* pResumeType
1687)
1688{
1689 HRESULT hr = S_OK;
1690 HKEY hkRegistration = NULL;
1691 BOOL fExists = FALSE;
1692 DWORD dwResume = 0;
1693
1694 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_NONE;
1695
1696 // open registration key
1697 hr = RegOpen(hkRegistrationRoot, pRegistration->sczRegistrationKey, KEY_QUERY_VALUE, &hkRegistration);
1698 ExitOnPathFailure(hr, fExists, "Failed to open registration key.");
1699
1700 if (!fExists)
1701 {
1702 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_NONE;
1703 ExitFunction();
1704 }
1705
1706 // read Resume value
1707 hr = RegReadNumber(hkRegistration, L"Resume", &dwResume);
1708 ExitOnPathFailure(hr, fExists, "Failed to read Resume value.");
1709
1710 if (!fExists)
1711 {
1712 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_INVALID;
1713 ExitFunction();
1714 }
1715
1716 switch (dwResume)
1717 {
1718 case BURN_RESUME_MODE_ACTIVE:
1719 // a previous run was interrupted
1720 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_INTERRUPTED;
1721 break;
1722
1723 case BURN_RESUME_MODE_SUSPEND:
1724 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_SUSPEND;
1725 break;
1726
1727 case BURN_RESUME_MODE_ARP:
1728 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_ARP;
1729 break;
1730
1731 case BURN_RESUME_MODE_REBOOT_PENDING:
1732 // The volatile pending registry doesn't exist (checked above) which means
1733 // the system was successfully restarted.
1734 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_REBOOT;
1735 break;
1736
1737 default:
1738 // the value stored in the registry is not valid
1739 *pResumeType = BOOTSTRAPPER_RESUME_TYPE_INVALID;
1740 break;
1741 }
1742
1743LExit:
1744 ReleaseRegKey(hkRegistration);
1745
1746 return hr;
1747}
1748
1749static HRESULT DetectInstalled(
1750 __in BURN_REGISTRATION* pRegistration,
1751 __in HKEY hkRoot
1752)
1753{
1754 HRESULT hr = S_OK;
1755 HKEY hkRegistration = NULL;
1756 DWORD dwInstalled = 0;
1757
1758 pRegistration->fCached = pRegistration->sczCacheExecutablePath && FileExistsEx(pRegistration->sczCacheExecutablePath, NULL);
1759 pRegistration->detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE;
1760
1761 // open registration key
1762 hr = RegOpen(hkRoot, pRegistration->sczRegistrationKey, KEY_QUERY_VALUE, &hkRegistration);
1763 if (SUCCEEDED(hr))
1764 {
1765 hr = RegReadNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, &dwInstalled);
1766
1767 pRegistration->detectedRegistrationType = (1 == dwInstalled) ? BOOTSTRAPPER_REGISTRATION_TYPE_FULL : BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS;
1768 }
1769
1770 // Not finding the key or value is okay.
1771 if (E_FILENOTFOUND == hr || E_PATHNOTFOUND == hr)
1772 {
1773 hr = S_OK;
1774 }
1775
1776 ReleaseRegKey(hkRegistration);
1777
1778 return hr;
1779}
1780
diff --git a/src/burn/engine/registration.h b/src/burn/engine/registration.h
index 326f21c6..e83b75b6 100644
--- a/src/burn/engine/registration.h
+++ b/src/burn/engine/registration.h
@@ -94,11 +94,12 @@ typedef struct _BURN_SOFTWARE_TAGS
94 94
95typedef struct _BURN_REGISTRATION 95typedef struct _BURN_REGISTRATION
96{ 96{
97 BOOL fPerMachine; 97 BOOL fPerMachine; // For PUOM/PMOU bundles, only valid after planning.
98 BOOL fForceSystemComponent; 98 BOOL fForceSystemComponent;
99 BOOL fDisableResume; 99 BOOL fDisableResume;
100 BOOL fCached; 100 BOOL fCached;
101 BOOTSTRAPPER_REGISTRATION_TYPE detectedRegistrationType; 101 BOOTSTRAPPER_REGISTRATION_TYPE detectedRegistrationType;
102 BOOTSTRAPPER_PACKAGE_SCOPE scope;
102 LPWSTR sczCode; 103 LPWSTR sczCode;
103 LPWSTR sczTag; 104 LPWSTR sczTag;
104 105
@@ -167,7 +168,7 @@ HRESULT RegistrationParseFromXml(
167 __in BURN_REGISTRATION* pRegistration, 168 __in BURN_REGISTRATION* pRegistration,
168 __in BURN_CACHE* pCache, 169 __in BURN_CACHE* pCache,
169 __in IXMLDOMNode* pixnBundle 170 __in IXMLDOMNode* pixnBundle
170 ); 171);
171void RegistrationUninitialize( 172void RegistrationUninitialize(
172 __in BURN_REGISTRATION* pRegistration 173 __in BURN_REGISTRATION* pRegistration
173 ); 174 );
@@ -191,7 +192,7 @@ HRESULT RegistrationDetectRelatedBundles(
191 ); 192 );
192HRESULT RegistrationPlanInitialize( 193HRESULT RegistrationPlanInitialize(
193 __in BURN_REGISTRATION* pRegistration 194 __in BURN_REGISTRATION* pRegistration
194 ); 195);
195HRESULT RegistrationSessionBegin( 196HRESULT RegistrationSessionBegin(
196 __in_z LPCWSTR wzEngineWorkingPath, 197 __in_z LPCWSTR wzEngineWorkingPath,
197 __in BURN_REGISTRATION* pRegistration, 198 __in BURN_REGISTRATION* pRegistration,
@@ -225,6 +226,10 @@ HRESULT RegistrationGetResumeCommandLine(
225 __in const BURN_REGISTRATION* pRegistration, 226 __in const BURN_REGISTRATION* pRegistration,
226 __deref_out_z LPWSTR* psczResumeCommandLine 227 __deref_out_z LPWSTR* psczResumeCommandLine
227 ); 228 );
229HRESULT RegistrationSetPaths(
230 __in BURN_REGISTRATION* pRegistration,
231 __in BURN_CACHE* pCache
232 );
228 233
229 234
230#if defined(__cplusplus) 235#if defined(__cplusplus)
diff --git a/src/burn/engine/relatedbundle.cpp b/src/burn/engine/relatedbundle.cpp
index c9aa7170..d0b97af0 100644
--- a/src/burn/engine/relatedbundle.cpp
+++ b/src/burn/engine/relatedbundle.cpp
@@ -22,7 +22,7 @@ static __callback int __cdecl CompareRelatedBundlesPlan(
22 ); 22 );
23static BUNDLE_QUERY_CALLBACK_RESULT CALLBACK QueryRelatedBundlesCallback( 23static BUNDLE_QUERY_CALLBACK_RESULT CALLBACK QueryRelatedBundlesCallback(
24 __in const BUNDLE_QUERY_RELATED_BUNDLE_RESULT* pBundle, 24 __in const BUNDLE_QUERY_RELATED_BUNDLE_RESULT* pBundle,
25 __in_opt LPVOID pvContext 25 __in LPVOID pvContext
26 ); 26 );
27static HRESULT LoadIfRelatedBundle( 27static HRESULT LoadIfRelatedBundle(
28 __in const BUNDLE_QUERY_RELATED_BUNDLE_RESULT* pBundle, 28 __in const BUNDLE_QUERY_RELATED_BUNDLE_RESULT* pBundle,
@@ -258,7 +258,7 @@ static __callback int __cdecl CompareRelatedBundlesPlan(
258 258
259static BUNDLE_QUERY_CALLBACK_RESULT CALLBACK QueryRelatedBundlesCallback( 259static BUNDLE_QUERY_CALLBACK_RESULT CALLBACK QueryRelatedBundlesCallback(
260 __in const BUNDLE_QUERY_RELATED_BUNDLE_RESULT* pBundle, 260 __in const BUNDLE_QUERY_RELATED_BUNDLE_RESULT* pBundle,
261 __in_opt LPVOID pvContext 261 __in LPVOID pvContext
262 ) 262 )
263{ 263{
264 HRESULT hr = S_OK; 264 HRESULT hr = S_OK;
diff --git a/src/burn/engine/uithread.cpp b/src/burn/engine/uithread.cpp
index 9beb9f80..1f7db965 100644
--- a/src/burn/engine/uithread.cpp
+++ b/src/burn/engine/uithread.cpp
@@ -123,7 +123,7 @@ static DWORD WINAPI ThreadProc(
123 info.pEngineState = pEngineState; 123 info.pEngineState = pEngineState;
124 124
125 // Create the window to handle reboots without activating it. 125 // Create the window to handle reboots without activating it.
126 hWnd = ::CreateWindowExW(WS_EX_NOACTIVATE, wc.lpszClassName, NULL, WS_POPUP, 0, 0, 0, 0, HWND_DESKTOP, NULL, pContext->hInstance, &info); 126 hWnd = ::CreateWindowExW(WS_EX_NOACTIVATE, wc.lpszClassName, BURN_UITHREAD_CLASS_WINDOW, WS_POPUP, 0, 0, 0, 0, HWND_DESKTOP, NULL, pContext->hInstance, &info);
127 ExitOnNullWithLastError(hWnd, hr, "Failed to create Burn UI thread window."); 127 ExitOnNullWithLastError(hWnd, hr, "Failed to create Burn UI thread window.");
128 128
129 ::ShowWindow(hWnd, SW_SHOWNA); 129 ::ShowWindow(hWnd, SW_SHOWNA);
diff --git a/src/burn/engine/variable.cpp b/src/burn/engine/variable.cpp
index a795d76c..1b7dc4d1 100644
--- a/src/burn/engine/variable.cpp
+++ b/src/burn/engine/variable.cpp
@@ -305,6 +305,8 @@ extern "C" HRESULT VariableInitialize(
305 {BURN_BUNDLE_TAG, InitializeVariableString, (DWORD_PTR)L"", FALSE, TRUE}, 305 {BURN_BUNDLE_TAG, InitializeVariableString, (DWORD_PTR)L"", FALSE, TRUE},
306 {BURN_BUNDLE_UILEVEL, InitializeVariableNumeric, 0, FALSE, TRUE}, 306 {BURN_BUNDLE_UILEVEL, InitializeVariableNumeric, 0, FALSE, TRUE},
307 {BURN_BUNDLE_VERSION, InitializeVariableVersion, (DWORD_PTR)L"0", FALSE, TRUE}, 307 {BURN_BUNDLE_VERSION, InitializeVariableVersion, (DWORD_PTR)L"0", FALSE, TRUE},
308 {BURN_BUNDLE_SCOPE, InitializeVariableNumeric, 0, FALSE, TRUE},
309 {BURN_BUNDLE_PLANNED_SCOPE, InitializeVariableNumeric, 0, FALSE, TRUE},
308 }; 310 };
309 311
310 const WELL_KNOWN_VARIABLE_DECLARATION vrgWellKnownVariableNames[] = 312 const WELL_KNOWN_VARIABLE_DECLARATION vrgWellKnownVariableNames[] =
diff --git a/src/burn/test/BurnUnitTest/ApprovedExeTest.cpp b/src/burn/test/BurnUnitTest/ApprovedExeTest.cpp
index da51f1f8..6798d3cb 100644
--- a/src/burn/test/BurnUnitTest/ApprovedExeTest.cpp
+++ b/src/burn/test/BurnUnitTest/ApprovedExeTest.cpp
@@ -2,11 +2,7 @@
2 2
3#include "precomp.h" 3#include "precomp.h"
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -308,5 +304,3 @@ namespace Bootstrapper
308} 304}
309} 305}
310} 306}
311}
312}
diff --git a/src/burn/test/BurnUnitTest/BurnTestException.h b/src/burn/test/BurnUnitTest/BurnTestException.h
index b9467926..b6055041 100644
--- a/src/burn/test/BurnUnitTest/BurnTestException.h
+++ b/src/burn/test/BurnUnitTest/BurnTestException.h
@@ -2,11 +2,7 @@
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. 2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3 3
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -35,8 +31,6 @@ namespace Bootstrapper
35} 31}
36} 32}
37} 33}
38}
39}
40 34
41// this class is used by __TestThrowOnFailure_Format() below to deallocate 35// this class is used by __TestThrowOnFailure_Format() below to deallocate
42// the string created after the function call has returned 36// the string created after the function call has returned
@@ -83,6 +77,6 @@ LExit:
83} 77}
84#pragma warning (pop) 78#pragma warning (pop)
85 79
86#define TestThrowOnFailure(hr, s) if (FAILED(hr)) { throw gcnew Microsoft::Tools::WindowsInstallerXml::Test::Bootstrapper::BurnTestException(hr, gcnew System::String(s)); } 80#define TestThrowOnFailure(hr, s) if (FAILED(hr)) { throw gcnew WixToolset::Test::Bootstrapper::BurnTestException(hr, gcnew System::String(s)); }
87#define TestThrowOnFailure1(hr, s, p) if (FAILED(hr)) { throw gcnew Microsoft::Tools::WindowsInstallerXml::Test::Bootstrapper::BurnTestException(hr, gcnew System::String(__TestThrowOnFailure_Format(s, p))); } 81#define TestThrowOnFailure1(hr, s, p) if (FAILED(hr)) { throw gcnew WixToolset::Test::Bootstrapper::BurnTestException(hr, gcnew System::String(__TestThrowOnFailure_Format(s, p))); }
88#define TestThrowOnFailure2(hr, s, p1, p2) if (FAILED(hr)) { throw gcnew Microsoft::Tools::WindowsInstallerXml::Test::Bootstrapper::BurnTestException(hr, gcnew System::String(__TestThrowOnFailure_Format(s, p1, p2))); } 82#define TestThrowOnFailure2(hr, s, p1, p2) if (FAILED(hr)) { throw gcnew WixToolset::Test::Bootstrapper::BurnTestException(hr, gcnew System::String(__TestThrowOnFailure_Format(s, p1, p2))); }
diff --git a/src/burn/test/BurnUnitTest/BurnTestFixture.h b/src/burn/test/BurnUnitTest/BurnTestFixture.h
index 35acba67..95fd6fe5 100644
--- a/src/burn/test/BurnUnitTest/BurnTestFixture.h
+++ b/src/burn/test/BurnUnitTest/BurnTestFixture.h
@@ -2,11 +2,7 @@
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. 2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3 3
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -71,5 +67,3 @@ namespace Bootstrapper
71} 67}
72} 68}
73} 69}
74}
75}
diff --git a/src/burn/test/BurnUnitTest/BurnUnitTest.h b/src/burn/test/BurnUnitTest/BurnUnitTest.h
index ed1d2956..33cfe46d 100644
--- a/src/burn/test/BurnUnitTest/BurnUnitTest.h
+++ b/src/burn/test/BurnUnitTest/BurnUnitTest.h
@@ -2,11 +2,7 @@
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. 2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3 3
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -44,5 +40,3 @@ namespace Bootstrapper
44} 40}
45} 41}
46} 42}
47}
48}
diff --git a/src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj b/src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj
index 9704efa5..c741789e 100644
--- a/src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj
+++ b/src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj
@@ -22,7 +22,6 @@
22 <Platform>x64</Platform> 22 <Platform>x64</Platform>
23 </ProjectConfiguration> 23 </ProjectConfiguration>
24 </ItemGroup> 24 </ItemGroup>
25
26 <PropertyGroup Label="Globals"> 25 <PropertyGroup Label="Globals">
27 <ProjectTypes>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}</ProjectTypes> 26 <ProjectTypes>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}</ProjectTypes>
28 <ProjectGuid>{9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}</ProjectGuid> 27 <ProjectGuid>{9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}</ProjectGuid>
@@ -34,15 +33,12 @@
34 <SignOutput>false</SignOutput> 33 <SignOutput>false</SignOutput>
35 <IsWixTestProject>true</IsWixTestProject> 34 <IsWixTestProject>true</IsWixTestProject>
36 </PropertyGroup> 35 </PropertyGroup>
37
38 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 36 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
39 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> 37 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
40
41 <PropertyGroup> 38 <PropertyGroup>
42 <ProjectAdditionalIncludeDirectories>$(ProjectAdditionalIncludeDirectories);$(BurnGeneratedHeaderDirectory);..\..\engine;..\..\..\api\burn\inc;..\..\..\libs\dutil\WixToolset.Dutil\inc</ProjectAdditionalIncludeDirectories> 39 <ProjectAdditionalIncludeDirectories>$(ProjectAdditionalIncludeDirectories);$(BurnGeneratedHeaderDirectory);..\..\engine;..\..\..\api\burn\inc;..\..\..\libs\dutil\WixToolset.Dutil\inc</ProjectAdditionalIncludeDirectories>
43 <ProjectAdditionalLinkLibraries>cabinet.lib;crypt32.lib;msi.lib;rpcrt4.lib;shlwapi.lib;userenv.lib;wininet.lib;wintrust.lib;$(RootBuildFolder)libs\$(Configuration)\$(WixNativeSdkLibraryToolset)\$(PlatformTarget)\dutil.lib;engine.res</ProjectAdditionalLinkLibraries> 40 <ProjectAdditionalLinkLibraries>cabinet.lib;crypt32.lib;msi.lib;rpcrt4.lib;shlwapi.lib;userenv.lib;wininet.lib;wintrust.lib;$(RootBuildFolder)libs\$(Configuration)\$(WixNativeSdkLibraryToolset)\$(PlatformTarget)\dutil.lib;engine.res</ProjectAdditionalLinkLibraries>
44 </PropertyGroup> 41 </PropertyGroup>
45
46 <ItemGroup> 42 <ItemGroup>
47 <ClCompile Include="AssemblyInfo.cpp" /> 43 <ClCompile Include="AssemblyInfo.cpp" />
48 <ClCompile Include="ApprovedExeTest.cpp" /> 44 <ClCompile Include="ApprovedExeTest.cpp" />
@@ -76,11 +72,9 @@
76 <ClInclude Include="TestRegistryFixture.h" /> 72 <ClInclude Include="TestRegistryFixture.h" />
77 <ClInclude Include="VariableHelpers.h" /> 73 <ClInclude Include="VariableHelpers.h" />
78 </ItemGroup> 74 </ItemGroup>
79
80 <ItemGroup> 75 <ItemGroup>
81 <ResourceCompile Include="BurnUnitTest.rc" /> 76 <ResourceCompile Include="BurnUnitTest.rc" />
82 </ItemGroup> 77 </ItemGroup>
83
84 <ItemGroup> 78 <ItemGroup>
85 <None Include="TestData\CacheTest\CacheSignatureTest.File" CopyToOutputDirectory="PreserveNewest" /> 79 <None Include="TestData\CacheTest\CacheSignatureTest.File" CopyToOutputDirectory="PreserveNewest" />
86 <None Include="TestData\PlanTest\BasicFunctionality_BundleA_manifest.xml" CopyToOutputDirectory="PreserveNewest" /> 80 <None Include="TestData\PlanTest\BasicFunctionality_BundleA_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
@@ -91,14 +85,23 @@
91 <None Include="TestData\PlanTest\MsuPackageFixture_manifest.xml" CopyToOutputDirectory="PreserveNewest" /> 85 <None Include="TestData\PlanTest\MsuPackageFixture_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
92 <None Include="TestData\PlanTest\Slipstream_BundleA_manifest.xml" CopyToOutputDirectory="PreserveNewest" /> 86 <None Include="TestData\PlanTest\Slipstream_BundleA_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
93 <None Include="TestData\PlanTest\Slipstream_BundleA_modified_manifest.xml" CopyToOutputDirectory="PreserveNewest" /> 87 <None Include="TestData\PlanTest\Slipstream_BundleA_modified_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
88 <None Include="TestData\PlanTest\AllPmouBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
89 <None Include="TestData\PlanTest\AllPuomBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
90 <None Include="TestData\PlanTest\PerUserBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
91 <None Include="TestData\PlanTest\PerMachineBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
92 <None Include="TestData\PlanTest\PuPmouBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
93 <None Include="TestData\PlanTest\PuPuomBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
94 <None Include="TestData\PlanTest\PmPuomBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
95 <None Include="TestData\PlanTest\PmPmouBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
96 <None Include="TestData\PlanTest\PmPuPmouBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
97 <None Include="TestData\PlanTest\PmPuPuomBundle_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
98 <None Include="TestData\PlanTest\PuomBundlePackage_manifest.xml" CopyToOutputDirectory="PreserveNewest" />
94 </ItemGroup> 99 </ItemGroup>
95
96 <ItemGroup> 100 <ItemGroup>
97 <ProjectReference Include="..\..\engine\engine.vcxproj"> 101 <ProjectReference Include="..\..\engine\engine.vcxproj">
98 <Project>{8119537D-E1D9-6591-D51A-49770A2F9C37}</Project> 102 <Project>{8119537D-E1D9-6591-D51A-49770A2F9C37}</Project>
99 </ProjectReference> 103 </ProjectReference>
100 </ItemGroup> 104 </ItemGroup>
101
102 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 105 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
103 <Import Project="..\..\..\internal\WixInternal.TestSupport.Native\build\WixInternal.TestSupport.Native.targets" /> 106 <Import Project="..\..\..\internal\WixInternal.TestSupport.Native\build\WixInternal.TestSupport.Native.targets" />
104</Project> 107</Project>
diff --git a/src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj.filters b/src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj.filters
index aac5ab8b..0c458f48 100644
--- a/src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj.filters
+++ b/src/burn/test/BurnUnitTest/BurnUnitTest.vcxproj.filters
@@ -98,4 +98,20 @@
98 <Filter>Resource Files</Filter> 98 <Filter>Resource Files</Filter>
99 </ResourceCompile> 99 </ResourceCompile>
100 </ItemGroup> 100 </ItemGroup>
101</Project> 101 <ItemGroup>
102 <None Include="$(MSBuildThisFileDirectory)xunit.runner.visualstudio.testadapter.dll" />
103 <None Include="$(MSBuildThisFileDirectory)xunit.abstractions.dll" />
104 <None Include="$(MSBuildThisFileDirectory)xunit.runner.reporters.net452.dll" />
105 <None Include="$(MSBuildThisFileDirectory)xunit.runner.utility.net452.dll" />
106 <None Include="TestData\CacheTest\CacheSignatureTest.File" />
107 <None Include="TestData\PlanTest\BasicFunctionality_BundleA_manifest.xml" />
108 <None Include="TestData\PlanTest\BundlePackage_Multiple_manifest.xml" />
109 <None Include="TestData\PlanTest\ExePackage_PerUserArpEntry_manifest.xml" />
110 <None Include="TestData\PlanTest\Failure_BundleD_manifest.xml" />
111 <None Include="TestData\PlanTest\PuomWithPerMachineBundle_manifest.xml" />
112 <None Include="TestData\PlanTest\MsiTransaction_BundleAv1_manifest.xml" />
113 <None Include="TestData\PlanTest\MsuPackageFixture_manifest.xml" />
114 <None Include="TestData\PlanTest\Slipstream_BundleA_manifest.xml" />
115 <None Include="TestData\PlanTest\Slipstream_BundleA_modified_manifest.xml" />
116 </ItemGroup>
117</Project> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/CacheTest.cpp b/src/burn/test/BurnUnitTest/CacheTest.cpp
index 8e3660b2..c142e673 100644
--- a/src/burn/test/BurnUnitTest/CacheTest.cpp
+++ b/src/burn/test/BurnUnitTest/CacheTest.cpp
@@ -23,11 +23,7 @@ typedef struct _CACHE_TEST_CONTEXT
23{ 23{
24} CACHE_TEST_CONTEXT; 24} CACHE_TEST_CONTEXT;
25 25
26namespace Microsoft 26namespace WixToolset
27{
28namespace Tools
29{
30namespace WindowsInstallerXml
31{ 27{
32namespace Test 28namespace Test
33{ 29{
@@ -158,7 +154,7 @@ namespace Bootstrapper
158 hr = StrAllocHexDecode(L"25e61cd83485062b70713aebddd3fe4992826cb121466fddc8de3eacb1e42f39d4bdd8455d95eec8c9529ced4c0296ab861931fe2c86df2f2b4e8d259a6d9223", &pb, &cb); 154 hr = StrAllocHexDecode(L"25e61cd83485062b70713aebddd3fe4992826cb121466fddc8de3eacb1e42f39d4bdd8455d95eec8c9529ced4c0296ab861931fe2c86df2f2b4e8d259a6d9223", &pb, &cb);
159 Assert::Equal(S_OK, hr); 155 Assert::Equal(S_OK, hr);
160 156
161 package.fPerMachine = FALSE; 157 package.scope = BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER;
162 package.sczCacheId = L"Bootstrapper.CacheTest.CacheSignatureTest"; 158 package.sczCacheId = L"Bootstrapper.CacheTest.CacheSignatureTest";
163 payload.sczKey = L"CacheSignatureTest.PayloadKey"; 159 payload.sczKey = L"CacheSignatureTest.PayloadKey";
164 payload.sczFilePath = L"CacheSignatureTest.File"; 160 payload.sczFilePath = L"CacheSignatureTest.File";
@@ -192,8 +188,6 @@ namespace Bootstrapper
192} 188}
193} 189}
194} 190}
195}
196}
197 191
198static HRESULT CALLBACK CacheTestEventRoutine( 192static HRESULT CALLBACK CacheTestEventRoutine(
199 __in BURN_CACHE_MESSAGE* /*pMessage*/, 193 __in BURN_CACHE_MESSAGE* /*pMessage*/,
diff --git a/src/burn/test/BurnUnitTest/ElevationTest.cpp b/src/burn/test/BurnUnitTest/ElevationTest.cpp
index 81e9f93e..feacdb7c 100644
--- a/src/burn/test/BurnUnitTest/ElevationTest.cpp
+++ b/src/burn/test/BurnUnitTest/ElevationTest.cpp
@@ -25,11 +25,7 @@ static HRESULT ProcessChildMessages(
25 __out DWORD* pdwResult 25 __out DWORD* pdwResult
26 ); 26 );
27 27
28namespace Microsoft 28namespace WixToolset
29{
30namespace Tools
31{
32namespace WindowsInstallerXml
33{ 29{
34namespace Test 30namespace Test
35{ 31{
@@ -92,8 +88,6 @@ namespace Bootstrapper
92} 88}
93} 89}
94} 90}
95}
96}
97 91
98 92
99static BOOL STDAPICALLTYPE ElevateTest_ShellExecuteExW( 93static BOOL STDAPICALLTYPE ElevateTest_ShellExecuteExW(
diff --git a/src/burn/test/BurnUnitTest/EmbeddedTest.cpp b/src/burn/test/BurnUnitTest/EmbeddedTest.cpp
index a19790ad..33f03282 100644
--- a/src/burn/test/BurnUnitTest/EmbeddedTest.cpp
+++ b/src/burn/test/BurnUnitTest/EmbeddedTest.cpp
@@ -33,11 +33,7 @@ static int EmbeddedTest_GenericMessageHandler(
33 __in LPVOID pvContext 33 __in LPVOID pvContext
34 ); 34 );
35 35
36namespace Microsoft 36namespace WixToolset
37{
38namespace Tools
39{
40namespace WindowsInstallerXml
41{ 37{
42namespace Test 38namespace Test
43{ 39{
@@ -84,8 +80,6 @@ namespace Bootstrapper
84} 80}
85} 81}
86} 82}
87}
88}
89 83
90 84
91static BOOL STDAPICALLTYPE EmbeddedTest_CreateProcessW( 85static BOOL STDAPICALLTYPE EmbeddedTest_CreateProcessW(
diff --git a/src/burn/test/BurnUnitTest/ExitCodeTest.cpp b/src/burn/test/BurnUnitTest/ExitCodeTest.cpp
index 9b66f4c0..0529fa45 100644
--- a/src/burn/test/BurnUnitTest/ExitCodeTest.cpp
+++ b/src/burn/test/BurnUnitTest/ExitCodeTest.cpp
@@ -2,11 +2,7 @@
2 2
3#include "precomp.h" 3#include "precomp.h"
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -328,7 +324,7 @@ static void LoadEngineState(
328 L"<BurnManifest>" 324 L"<BurnManifest>"
329 L" <Payload Id='test.exe' FilePath='test.exe' Packaging='external' SourcePath='test.exe' Hash='000000000000' FileSize='1' />" 325 L" <Payload Id='test.exe' FilePath='test.exe' Packaging='external' SourcePath='test.exe' Hash='000000000000' FileSize='1' />"
330 L" <Chain>" 326 L" <Chain>"
331 L" <ExePackage Id='Custom' Cache='remove' CacheId='test.exe' InstallSize='1' Size='1' PerMachine='no' Permanent='yes' Vital='yes' DetectCondition='' InstallArguments='[ExeExitCode]' UninstallArguments='' Uninstallable='no' RepairArguments='' Repairable='no' Protocol='none' DetectionType='condition'>" 327 L" <ExePackage Id='Custom' Cache='remove' CacheId='test.exe' InstallSize='1' Size='1' Scope='peruser' Permanent='yes' Vital='yes' DetectCondition='' InstallArguments='[ExeExitCode]' UninstallArguments='' Uninstallable='no' RepairArguments='' Repairable='no' Protocol='none' DetectionType='condition'>"
332 L" <ExitCode Code='0' Type='2' />" 328 L" <ExitCode Code='0' Type='2' />"
333 L" <ExitCode Code='3' Type='3' />" 329 L" <ExitCode Code='3' Type='3' />"
334 L" <ExitCode Code='4' Type='4' />" 330 L" <ExitCode Code='4' Type='4' />"
@@ -349,7 +345,7 @@ static void LoadEngineState(
349 L" <ExitCode Code='*' Type='1' />" 345 L" <ExitCode Code='*' Type='1' />"
350 L" <PayloadRef Id='test.exe' />" 346 L" <PayloadRef Id='test.exe' />"
351 L" </ExePackage>" 347 L" </ExePackage>"
352 L" <ExePackage Id='Standard' Cache='remove' CacheId='test.exe' InstallSize='1' Size='1' PerMachine='no' Permanent='yes' Vital='yes' DetectCondition='' InstallArguments='[ExeExitCode]' UninstallArguments='' Uninstallable='no' RepairArguments='' Repairable='no' Protocol='none' DetectionType='condition'>" 348 L" <ExePackage Id='Standard' Cache='remove' CacheId='test.exe' InstallSize='1' Size='1' Scope='peruser' Permanent='yes' Vital='yes' DetectCondition='' InstallArguments='[ExeExitCode]' UninstallArguments='' Uninstallable='no' RepairArguments='' Repairable='no' Protocol='none' DetectionType='condition'>"
353 L" <PayloadRef Id='test.exe' />" 349 L" <PayloadRef Id='test.exe' />"
354 L" </ExePackage>" 350 L" </ExePackage>"
355 L" </Chain>" 351 L" </Chain>"
@@ -376,5 +372,3 @@ static void LoadEngineState(
376} 372}
377} 373}
378} 374}
379}
380}
diff --git a/src/burn/test/BurnUnitTest/LoggingTest.cpp b/src/burn/test/BurnUnitTest/LoggingTest.cpp
index ed74c875..7619b913 100644
--- a/src/burn/test/BurnUnitTest/LoggingTest.cpp
+++ b/src/burn/test/BurnUnitTest/LoggingTest.cpp
@@ -2,11 +2,7 @@
2 2
3#include "precomp.h" 3#include "precomp.h"
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -64,5 +60,3 @@ namespace Bootstrapper
64} 60}
65} 61}
66} 62}
67}
68}
diff --git a/src/burn/test/BurnUnitTest/ManifestHelpers.cpp b/src/burn/test/BurnUnitTest/ManifestHelpers.cpp
index 96d5fab4..b68504aa 100644
--- a/src/burn/test/BurnUnitTest/ManifestHelpers.cpp
+++ b/src/burn/test/BurnUnitTest/ManifestHelpers.cpp
@@ -7,11 +7,7 @@ using namespace System;
7using namespace Xunit; 7using namespace Xunit;
8 8
9 9
10namespace Microsoft 10namespace WixToolset
11{
12namespace Tools
13{
14namespace WindowsInstallerXml
15{ 11{
16namespace Test 12namespace Test
17{ 13{
@@ -37,5 +33,3 @@ namespace Bootstrapper
37} 33}
38} 34}
39} 35}
40}
41}
diff --git a/src/burn/test/BurnUnitTest/ManifestHelpers.h b/src/burn/test/BurnUnitTest/ManifestHelpers.h
index e3e57555..e3c97c64 100644
--- a/src/burn/test/BurnUnitTest/ManifestHelpers.h
+++ b/src/burn/test/BurnUnitTest/ManifestHelpers.h
@@ -2,11 +2,7 @@
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. 2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3 3
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -20,5 +16,3 @@ void LoadBundleXmlHelper(LPCWSTR wzDocument, IXMLDOMElement** ppixeBundle);
20} 16}
21} 17}
22} 18}
23}
24}
diff --git a/src/burn/test/BurnUnitTest/ManifestTest.cpp b/src/burn/test/BurnUnitTest/ManifestTest.cpp
index 4959cee0..4e6bac24 100644
--- a/src/burn/test/BurnUnitTest/ManifestTest.cpp
+++ b/src/burn/test/BurnUnitTest/ManifestTest.cpp
@@ -2,11 +2,7 @@
2 2
3#include "precomp.h" 3#include "precomp.h"
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -40,7 +36,7 @@ namespace Bootstrapper
40 " <UX PrimaryPayloadId='ux.exe'>" 36 " <UX PrimaryPayloadId='ux.exe'>"
41 " <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='u0' />" 37 " <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='u0' />"
42 " </UX>" 38 " </UX>"
43 " <Registration Code='{D54F896D-1952-43e6-9C67-B5652240618C}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='no' />" 39 " <Registration Code='{D54F896D-1952-43e6-9C67-B5652240618C}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe' Scope='peruser' />"
44 " <Variable Id='Variable1' Type='numeric' Value='1' Hidden='no' Persisted='no' />" 40 " <Variable Id='Variable1' Type='numeric' Value='1' Hidden='no' Persisted='no' />"
45 " <RegistrySearch Id='Search1' Type='exists' Root='HKLM' Key='SOFTWARE\\Microsoft' Variable='Variable1' Condition='0' />" 41 " <RegistrySearch Id='Search1' Type='exists' Root='HKLM' Key='SOFTWARE\\Microsoft' Variable='Variable1' Condition='0' />"
46 "</BurnManifest>"; 42 "</BurnManifest>";
@@ -67,5 +63,3 @@ namespace Bootstrapper
67} 63}
68} 64}
69} 65}
70}
71}
diff --git a/src/burn/test/BurnUnitTest/PlanTest.cpp b/src/burn/test/BurnUnitTest/PlanTest.cpp
index e2850a62..7e7d84cc 100644
--- a/src/burn/test/BurnUnitTest/PlanTest.cpp
+++ b/src/burn/test/BurnUnitTest/PlanTest.cpp
@@ -2,12 +2,20 @@
2 2
3#include "precomp.h" 3#include "precomp.h"
4 4
5#if TODO_REIMPLEMENT
5static HRESULT WINAPI PlanTestBAProc( 6static HRESULT WINAPI PlanTestBAProc(
6 __in BOOTSTRAPPER_APPLICATION_MESSAGE message, 7 __in BOOTSTRAPPER_APPLICATION_MESSAGE message,
7 __in const LPVOID pvArgs, 8 __in const LPVOID pvArgs,
8 __inout LPVOID pvResults, 9 __inout LPVOID pvResults,
9 __in_opt LPVOID pvContext 10 __in_opt LPVOID pvContext
10 ); 11 );
12#endif
13
14struct REDIRECTED_LOGGING_CONTEXT
15{
16 LPSTR pszBuffer;
17};
18
11 19
12static LPCWSTR wzArpEntryExeManifestFileName = L"ExePackage_PerUserArpEntry_manifest.xml"; 20static LPCWSTR wzArpEntryExeManifestFileName = L"ExePackage_PerUserArpEntry_manifest.xml";
13static LPCWSTR wzMsiTransactionManifestFileName = L"MsiTransaction_BundleAv1_manifest.xml"; 21static LPCWSTR wzMsiTransactionManifestFileName = L"MsiTransaction_BundleAv1_manifest.xml";
@@ -28,11 +36,7 @@ static BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE vRelatedBundlePlanType = BOOTSTRAPP
28static BURN_DEPENDENCY_ACTION registerActions1[] = { BURN_DEPENDENCY_ACTION_REGISTER }; 36static BURN_DEPENDENCY_ACTION registerActions1[] = { BURN_DEPENDENCY_ACTION_REGISTER };
29static BURN_DEPENDENCY_ACTION unregisterActions1[] = { BURN_DEPENDENCY_ACTION_UNREGISTER }; 37static BURN_DEPENDENCY_ACTION unregisterActions1[] = { BURN_DEPENDENCY_ACTION_UNREGISTER };
30 38
31namespace Microsoft 39namespace WixToolset
32{
33namespace Tools
34{
35namespace WindowsInstallerXml
36{ 40{
37namespace Test 41namespace Test
38{ 42{
@@ -43,12 +47,314 @@ namespace Bootstrapper
43 47
44 public ref class PlanTest : BurnUnitTest 48 public ref class PlanTest : BurnUnitTest
45 { 49 {
50 private:
51 void ScopeTest(
52 LPCWSTR wzManifestFileName,
53 BOOL fDefaultPlanPerMachine,
54 BOOL fDefaultRegistrationPerMachine,
55 BOOL fPerUserPlanPerMachine,
56 BOOL fPerUserRegistrationPerMachine,
57 BOOL fPerMachinePlanPerMachine,
58 BOOL fPerMachineRegistrationPerMachine
59 )
60 {
61 HRESULT hr = S_OK;
62 BURN_ENGINE_STATE engineState = { };
63 BURN_ENGINE_STATE* pEngineState = &engineState;
64 BURN_PLAN* pPlan = &engineState.plan;
65
66 InitializeEngineStateForCorePlan(wzManifestFileName, pEngineState);
67 DetectAttachedContainerAsAttached(pEngineState);
68 DetectPermanentPackagesAsPresentAndCached(pEngineState);
69
70 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
71 NativeAssert::Succeeded(hr, "CorePlan default failed");
72
73 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
74 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_DEFAULT, pPlan->plannedScope);
75 Assert::Equal<DWORD>(fDefaultPlanPerMachine, pPlan->fPerMachine);
76 Assert::Equal<DWORD>(fDefaultRegistrationPerMachine, engineState.registration.fPerMachine);
77
78 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_PER_USER);
79 NativeAssert::Succeeded(hr, "CorePlan per-user failed");
80
81 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
82 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_PER_USER, pPlan->plannedScope);
83 Assert::Equal<DWORD>(fPerUserPlanPerMachine, pPlan->fPerMachine);
84 Assert::Equal<DWORD>(fPerUserRegistrationPerMachine, engineState.registration.fPerMachine);
85
86 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_PER_MACHINE);
87 NativeAssert::Succeeded(hr, "CorePlan per-machine failed");
88
89 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
90 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_PER_MACHINE, pPlan->plannedScope);
91 Assert::Equal<DWORD>(fPerMachinePlanPerMachine, pPlan->fPerMachine);
92 Assert::Equal<DWORD>(fPerMachineRegistrationPerMachine, engineState.registration.fPerMachine);
93 }
94
46 public: 95 public:
47 PlanTest(BurnTestFixture^ fixture) : BurnUnitTest(fixture) 96 PlanTest(BurnTestFixture^ fixture) : BurnUnitTest(fixture)
48 { 97 {
49 } 98 }
50 99
51 [Fact] 100 [Fact]
101 void CommandLineScopeTestNoop()
102 {
103 HRESULT hr = S_OK;
104 BURN_ENGINE_STATE engineState = { };
105 BURN_ENGINE_STATE* pEngineState = &engineState;
106 BURN_PLAN* pPlan = &engineState.plan;
107
108 engineState.command.commandLineScope = BOOTSTRAPPER_SCOPE_PER_MACHINE;
109
110 InitializeEngineStateForCorePlan(L"AllPmouBundle_manifest.xml", pEngineState);
111 DetectAttachedContainerAsAttached(pEngineState);
112 DetectPermanentPackagesAsPresentAndCached(pEngineState);
113
114 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_PER_USER);
115 NativeAssert::Succeeded(hr, "CorePlan default failed");
116
117 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
118 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_PER_USER, pPlan->plannedScope);
119 Assert::Equal<DWORD>(FALSE, pPlan->fPerMachine);
120 Assert::Equal<DWORD>(FALSE, engineState.registration.fPerMachine);
121 }
122
123 [Fact]
124 void CommandLineScopePerUserTest()
125 {
126 HRESULT hr = S_OK;
127 BURN_ENGINE_STATE engineState = { };
128 BURN_ENGINE_STATE* pEngineState = &engineState;
129 BURN_PLAN* pPlan = &engineState.plan;
130
131 engineState.command.commandLineScope = BOOTSTRAPPER_SCOPE_PER_USER;
132
133 InitializeEngineStateForCorePlan(L"AllPmouBundle_manifest.xml", pEngineState);
134 DetectAttachedContainerAsAttached(pEngineState);
135 DetectPermanentPackagesAsPresentAndCached(pEngineState);
136
137 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
138 NativeAssert::Succeeded(hr, "CorePlan default failed");
139
140 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
141 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_PER_USER, pPlan->plannedScope);
142 Assert::Equal<DWORD>(FALSE, pPlan->fPerMachine);
143 Assert::Equal<DWORD>(FALSE, engineState.registration.fPerMachine);
144 }
145
146 [Fact]
147 void CommandLineScopePerMachineTest()
148 {
149 HRESULT hr = S_OK;
150 BURN_ENGINE_STATE engineState = { };
151 BURN_ENGINE_STATE* pEngineState = &engineState;
152 BURN_PLAN* pPlan = &engineState.plan;
153
154 engineState.command.commandLineScope = BOOTSTRAPPER_SCOPE_PER_MACHINE;
155
156 InitializeEngineStateForCorePlan(L"AllPmouBundle_manifest.xml", pEngineState);
157 DetectAttachedContainerAsAttached(pEngineState);
158 DetectPermanentPackagesAsPresentAndCached(pEngineState);
159
160 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
161 NativeAssert::Succeeded(hr, "CorePlan default failed");
162
163 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
164 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_PER_MACHINE, pPlan->plannedScope);
165 Assert::Equal<DWORD>(TRUE, pPlan->fPerMachine);
166 Assert::Equal<DWORD>(TRUE, engineState.registration.fPerMachine);
167 }
168
169 [Fact]
170 void BundlePackageScopeTestNoop()
171 {
172 HRESULT hr = S_OK;
173 BURN_ENGINE_STATE engineState = { };
174 BURN_ENGINE_STATE* pEngineState = &engineState;
175 BURN_PLAN* pPlan = &engineState.plan;
176
177 engineState.command.commandLineScope = BOOTSTRAPPER_SCOPE_PER_MACHINE;
178
179 InitializeEngineStateForCorePlan(L"PuomBundlePackage_manifest.xml", pEngineState);
180 DetectAttachedContainerAsAttached(pEngineState);
181 DetectPermanentPackagesAsPresentAndCached(pEngineState);
182
183 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_PER_USER);
184 NativeAssert::Succeeded(hr, "CorePlan default failed");
185
186 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
187 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_PER_USER, pPlan->plannedScope);
188 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_DEFAULT, engineState.packages.rgPackages[0].fPerMachine);
189 Assert::Equal<DWORD>(FALSE, pPlan->fPerMachine);
190 Assert::Equal<DWORD>(FALSE, engineState.registration.fPerMachine);
191 }
192
193 [Fact]
194 void BundlePackageScopeTestSucceeds()
195 {
196 HRESULT hr = S_OK;
197 BURN_ENGINE_STATE engineState = { };
198 BURN_ENGINE_STATE* pEngineState = &engineState;
199 BURN_PLAN* pPlan = &engineState.plan;
200
201 engineState.command.commandLineScope = BOOTSTRAPPER_SCOPE_PER_MACHINE;
202
203 InitializeEngineStateForCorePlan(L"PuomBundlePackage_manifest.xml", pEngineState);
204 DetectAttachedContainerAsAttached(pEngineState);
205 DetectPermanentPackagesAsPresentAndCached(pEngineState);
206
207 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
208 NativeAssert::Succeeded(hr, "CorePlan default failed");
209
210 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
211 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_PER_MACHINE, pPlan->plannedScope);
212 Assert::Equal<DWORD>(BOOTSTRAPPER_SCOPE_PER_MACHINE, engineState.packages.rgPackages[0].fPerMachine);
213 Assert::Equal<DWORD>(TRUE, pPlan->fPerMachine);
214 Assert::Equal<DWORD>(TRUE, engineState.registration.fPerMachine);
215 }
216
217 [Fact]
218 void AllPerUserScopeTest()
219 {
220 ScopeTest(
221 L"PerUserBundle_manifest.xml",
222 FALSE /*fDefaultPlanPerMachine*/,
223 FALSE /*fDefaultRegistrationPerMachine*/,
224 FALSE /*fPerUserPlanPerMachine*/,
225 FALSE /*fPerUserRegistrationPerMachine*/,
226 FALSE /*fPerMachinePlanPerMachine*/,
227 FALSE /*fPerMachineRegistrationPerMachine*/
228 );
229 }
230
231 [Fact]
232 void AllPerMachineScopeTest()
233 {
234 ScopeTest(
235 L"PerMachineBundle_manifest.xml",
236 TRUE /*fDefaultPlanPerMachine*/,
237 TRUE /*fDefaultRegistrationPerMachine*/,
238 TRUE /*fPerUserPlanPerMachine*/,
239 TRUE /*fPerUserRegistrationPerMachine*/,
240 TRUE /*fPerMachinePlanPerMachine*/,
241 TRUE /*fPerMachineRegistrationPerMachine*/
242 );
243 }
244
245 [Fact]
246 void AllPerMachineOrUserPackagesScopeTest()
247 {
248 ScopeTest(
249 L"AllPmouBundle_manifest.xml",
250 TRUE /*fDefaultPlanPerMachine*/,
251 TRUE /*fDefaultRegistrationPerMachine*/,
252 FALSE /*fPerUserPlanPerMachine*/,
253 FALSE /*fPerUserRegistrationPerMachine*/,
254 TRUE /*fPerMachinePlanPerMachine*/,
255 TRUE /*fPerMachineRegistrationPerMachine*/
256 );
257 }
258
259 [Fact]
260 void AllPerUserOrMachinePackagesScopeTest()
261 {
262 ScopeTest(
263 L"AllPuomBundle_manifest.xml",
264 FALSE /*fDefaultPlanPerMachine*/,
265 FALSE /*fDefaultRegistrationPerMachine*/,
266 FALSE /*fPerUserPlanPerMachine*/,
267 FALSE /*fPerUserRegistrationPerMachine*/,
268 TRUE /*fPerMachinePlanPerMachine*/,
269 TRUE /*fPerMachineRegistrationPerMachine*/
270 );
271 }
272
273 [Fact]
274 void PerMachineAndPerMachineOrUserScopeTest()
275 {
276 ScopeTest(
277 L"PmPmouBundle_manifest.xml",
278 TRUE /*fDefaultPlanPerMachine*/,
279 TRUE /*fDefaultRegistrationPerMachine*/,
280 TRUE /*fPerUserPlanPerMachine*/,
281 FALSE /*fPerUserRegistrationPerMachine*/,
282 TRUE /*fPerMachinePlanPerMachine*/,
283 TRUE /*fPerMachineRegistrationPerMachine*/
284 );
285 }
286
287 [Fact]
288 void PerMachineAndPerUserOrMachineScopeTest()
289 {
290 ScopeTest(
291 L"PmPuomBundle_manifest.xml",
292 TRUE /*fDefaultPlanPerMachine*/,
293 FALSE /*fDefaultRegistrationPerMachine*/,
294 TRUE /*fPerUserPlanPerMachine*/,
295 FALSE /*fPerUserRegistrationPerMachine*/,
296 TRUE /*fPerMachinePlanPerMachine*/,
297 TRUE /*fPerMachineRegistrationPerMachine*/
298 );
299 }
300
301 [Fact]
302 void PerMachineAndPerUserAndPerMachineOrUserScopeTest()
303 {
304 ScopeTest(
305 L"PmPuPmouBundle_manifest.xml",
306 TRUE /*fDefaultPlanPerMachine*/,
307 FALSE /*fDefaultRegistrationPerMachine*/,
308 TRUE /*fPerUserPlanPerMachine*/,
309 FALSE /*fPerUserRegistrationPerMachine*/,
310 TRUE /*fPerMachinePlanPerMachine*/,
311 FALSE /*fPerMachineRegistrationPerMachine*/
312 );
313 }
314
315 [Fact]
316 void PerMachineAndPerUserAndPerUserOrMachineScopeTest()
317 {
318 ScopeTest(
319 L"PmPuPuomBundle_manifest.xml",
320 TRUE /*fDefaultPlanPerMachine*/,
321 FALSE /*fDefaultRegistrationPerMachine*/,
322 TRUE /*fPerUserPlanPerMachine*/,
323 FALSE /*fPerUserRegistrationPerMachine*/,
324 TRUE /*fPerMachinePlanPerMachine*/,
325 FALSE /*fPerMachineRegistrationPerMachine*/
326 );
327 }
328
329 [Fact]
330 void PerUserAndPerMachineOrUserScopeTest()
331 {
332 ScopeTest(
333 L"PuPmouBundle_manifest.xml",
334 TRUE /*fDefaultPlanPerMachine*/,
335 FALSE /*fDefaultRegistrationPerMachine*/,
336 FALSE /*fPerUserPlanPerMachine*/,
337 FALSE /*fPerUserRegistrationPerMachine*/,
338 TRUE /*fPerMachinePlanPerMachine*/,
339 FALSE /*fPerMachineRegistrationPerMachine*/
340 );
341 }
342
343 [Fact]
344 void PerUserAndPerUserOrMachineScopeTest()
345 {
346 ScopeTest(
347 L"PuPuomBundle_manifest.xml",
348 FALSE /*fDefaultPlanPerMachine*/,
349 FALSE /*fDefaultRegistrationPerMachine*/,
350 FALSE /*fPerUserPlanPerMachine*/,
351 FALSE /*fPerUserRegistrationPerMachine*/,
352 TRUE /*fPerMachinePlanPerMachine*/,
353 FALSE /*fPerMachineRegistrationPerMachine*/
354 );
355 }
356
357 [Fact]
52 void ArpEntryExeInstallTest() 358 void ArpEntryExeInstallTest()
53 { 359 {
54 HRESULT hr = S_OK; 360 HRESULT hr = S_OK;
@@ -60,7 +366,7 @@ namespace Bootstrapper
60 DetectAttachedContainerAsAttached(pEngineState); 366 DetectAttachedContainerAsAttached(pEngineState);
61 DetectPermanentPackagesAsPresentAndCached(pEngineState); 367 DetectPermanentPackagesAsPresentAndCached(pEngineState);
62 368
63 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 369 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
64 NativeAssert::Succeeded(hr, "CorePlan failed"); 370 NativeAssert::Succeeded(hr, "CorePlan failed");
65 371
66 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 372 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -154,12 +460,13 @@ namespace Bootstrapper
154 460
155 pEngineState->packages.rgPackages[1].currentState = BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE; 461 pEngineState->packages.rgPackages[1].currentState = BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE;
156 462
157 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 463 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
158 NativeAssert::Succeeded(hr, "CorePlan failed"); 464 NativeAssert::Succeeded(hr, "CorePlan failed");
159 465
160 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 466 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
161 NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleCode); 467 NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleCode);
162 NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleProviderKey); 468 NativeAssert::StringEqual(L"{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}", pPlan->wzBundleProviderKey);
469
163 Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle); 470 Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
164 Assert::Equal<BOOL>(FALSE, pPlan->fPerMachine); 471 Assert::Equal<BOOL>(FALSE, pPlan->fPerMachine);
165 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState); 472 Assert::Equal<BOOL>(TRUE, pPlan->fCanAffectMachineState);
@@ -233,7 +540,7 @@ namespace Bootstrapper
233 InitializeEngineStateForCorePlan(wzArpEntryExeManifestFileName, pEngineState); 540 InitializeEngineStateForCorePlan(wzArpEntryExeManifestFileName, pEngineState);
234 DetectPackagesAsPresentAndCached(pEngineState); 541 DetectPackagesAsPresentAndCached(pEngineState);
235 542
236 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 543 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
237 NativeAssert::Succeeded(hr, "CorePlan failed"); 544 NativeAssert::Succeeded(hr, "CorePlan failed");
238 545
239 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 546 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -326,9 +633,11 @@ namespace Bootstrapper
326 DetectPackagesAsAbsent(pEngineState); 633 DetectPackagesAsAbsent(pEngineState);
327 DetectRelatedBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"1.0.0.0", BOOTSTRAPPER_RELATION_UPGRADE); 634 DetectRelatedBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"1.0.0.0", BOOTSTRAPPER_RELATION_UPGRADE);
328 635
329 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 636 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
330 NativeAssert::Succeeded(hr, "CorePlan failed"); 637 NativeAssert::Succeeded(hr, "CorePlan failed");
331 638
639 PlanDump(pPlan);
640
332 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 641 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
333 NativeAssert::StringEqual(L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", pPlan->wzBundleCode); 642 NativeAssert::StringEqual(L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", pPlan->wzBundleCode);
334 NativeAssert::StringEqual(L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", pPlan->wzBundleProviderKey); 643 NativeAssert::StringEqual(L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", pPlan->wzBundleProviderKey);
@@ -486,7 +795,7 @@ namespace Bootstrapper
486 InitializeEngineStateForCorePlan(wzMsiTransactionManifestFileName, pEngineState); 795 InitializeEngineStateForCorePlan(wzMsiTransactionManifestFileName, pEngineState);
487 DetectPackagesAsPresentAndCached(pEngineState); 796 DetectPackagesAsPresentAndCached(pEngineState);
488 797
489 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 798 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
490 NativeAssert::Succeeded(hr, "CorePlan failed"); 799 NativeAssert::Succeeded(hr, "CorePlan failed");
491 800
492 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 801 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -627,7 +936,7 @@ namespace Bootstrapper
627 DetectAttachedContainerAsAttached(pEngineState); 936 DetectAttachedContainerAsAttached(pEngineState);
628 DetectPermanentPackagesAsPresentAndCached(pEngineState); 937 DetectPermanentPackagesAsPresentAndCached(pEngineState);
629 938
630 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 939 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
631 NativeAssert::Succeeded(hr, "CorePlan failed"); 940 NativeAssert::Succeeded(hr, "CorePlan failed");
632 941
633 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 942 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -742,7 +1051,7 @@ namespace Bootstrapper
742 DetectAttachedContainerAsAttached(pEngineState); 1051 DetectAttachedContainerAsAttached(pEngineState);
743 DetectPackagesAsPresentAndCached(pEngineState); 1052 DetectPackagesAsPresentAndCached(pEngineState);
744 1053
745 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_REPAIR); 1054 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_REPAIR, BOOTSTRAPPER_SCOPE_DEFAULT);
746 NativeAssert::Succeeded(hr, "CorePlan failed"); 1055 NativeAssert::Succeeded(hr, "CorePlan failed");
747 1056
748 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_REPAIR, pPlan->action); 1057 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_REPAIR, pPlan->action);
@@ -836,7 +1145,7 @@ namespace Bootstrapper
836 DetectAttachedContainerAsAttached(pEngineState); 1145 DetectAttachedContainerAsAttached(pEngineState);
837 DetectPackagesAsPresentAndCached(pEngineState); 1146 DetectPackagesAsPresentAndCached(pEngineState);
838 1147
839 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 1148 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
840 NativeAssert::Succeeded(hr, "CorePlan failed"); 1149 NativeAssert::Succeeded(hr, "CorePlan failed");
841 1150
842 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 1151 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -955,7 +1264,7 @@ namespace Bootstrapper
955 DetectPackagesAsAbsent(pEngineState); 1264 DetectPackagesAsAbsent(pEngineState);
956 DetectCompatibleMsiPackage(pEngineState, pEngineState->packages.rgPackages, L"{C24F3903-38E7-4D44-8037-D9856B3C5046}", L"2.0.0.0"); 1265 DetectCompatibleMsiPackage(pEngineState, pEngineState->packages.rgPackages, L"{C24F3903-38E7-4D44-8037-D9856B3C5046}", L"2.0.0.0");
957 1266
958 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 1267 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
959 NativeAssert::Succeeded(hr, "CorePlan failed"); 1268 NativeAssert::Succeeded(hr, "CorePlan failed");
960 1269
961 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 1270 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -1055,7 +1364,7 @@ namespace Bootstrapper
1055 vfUseRelatedBundlePlanType = TRUE; 1364 vfUseRelatedBundlePlanType = TRUE;
1056 vRelatedBundlePlanType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_UPGRADE; 1365 vRelatedBundlePlanType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_UPGRADE;
1057 1366
1058 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 1367 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1059 NativeAssert::Succeeded(hr, "CorePlan failed"); 1368 NativeAssert::Succeeded(hr, "CorePlan failed");
1060 1369
1061 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 1370 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -1174,7 +1483,7 @@ namespace Bootstrapper
1174 BURN_RELATED_BUNDLE* pRelatedBundle = DetectRelatedBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"0.9.0.0", BOOTSTRAPPER_RELATION_UPGRADE); 1483 BURN_RELATED_BUNDLE* pRelatedBundle = DetectRelatedBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"0.9.0.0", BOOTSTRAPPER_RELATION_UPGRADE);
1175 pRelatedBundle->fPlannable = FALSE; 1484 pRelatedBundle->fPlannable = FALSE;
1176 1485
1177 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 1486 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1178 NativeAssert::Succeeded(hr, "CorePlan failed"); 1487 NativeAssert::Succeeded(hr, "CorePlan failed");
1179 1488
1180 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 1489 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -1276,7 +1585,7 @@ namespace Bootstrapper
1276 DetectAttachedContainerAsAttached(pEngineState); 1585 DetectAttachedContainerAsAttached(pEngineState);
1277 DetectPermanentPackagesAsPresentAndCached(pEngineState); 1586 DetectPermanentPackagesAsPresentAndCached(pEngineState);
1278 1587
1279 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 1588 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1280 NativeAssert::Succeeded(hr, "CorePlan failed"); 1589 NativeAssert::Succeeded(hr, "CorePlan failed");
1281 1590
1282 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 1591 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -1369,7 +1678,7 @@ namespace Bootstrapper
1369 DetectAttachedContainerAsAttached(pEngineState); 1678 DetectAttachedContainerAsAttached(pEngineState);
1370 DetectPermanentPackagesAsPresentAndCached(pEngineState); 1679 DetectPermanentPackagesAsPresentAndCached(pEngineState);
1371 1680
1372 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_LAYOUT); 1681 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_LAYOUT, BOOTSTRAPPER_SCOPE_DEFAULT);
1373 NativeAssert::Succeeded(hr, "CorePlan failed"); 1682 NativeAssert::Succeeded(hr, "CorePlan failed");
1374 1683
1375 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_LAYOUT, pPlan->action); 1684 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_LAYOUT, pPlan->action);
@@ -1452,7 +1761,7 @@ namespace Bootstrapper
1452 DetectPackagesAsAbsent(pEngineState); 1761 DetectPackagesAsAbsent(pEngineState);
1453 DetectRelatedBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"0.9.0.0", BOOTSTRAPPER_RELATION_UPGRADE); 1762 DetectRelatedBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"0.9.0.0", BOOTSTRAPPER_RELATION_UPGRADE);
1454 1763
1455 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_CACHE); 1764 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_CACHE, BOOTSTRAPPER_SCOPE_DEFAULT);
1456 NativeAssert::Succeeded(hr, "CorePlan failed"); 1765 NativeAssert::Succeeded(hr, "CorePlan failed");
1457 1766
1458 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_CACHE, pPlan->action); 1767 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_CACHE, pPlan->action);
@@ -1541,7 +1850,7 @@ namespace Bootstrapper
1541 DetectPackagesAsAbsent(pEngineState); 1850 DetectPackagesAsAbsent(pEngineState);
1542 DetectRelatedBundle(pEngineState, L"{AF8355C9-CCDD-4D61-BF5F-EA5F948D8F01}", L"1.1.0.0", BOOTSTRAPPER_RELATION_UPGRADE); 1851 DetectRelatedBundle(pEngineState, L"{AF8355C9-CCDD-4D61-BF5F-EA5F948D8F01}", L"1.1.0.0", BOOTSTRAPPER_RELATION_UPGRADE);
1543 1852
1544 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 1853 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1545 NativeAssert::Succeeded(hr, "CorePlan failed"); 1854 NativeAssert::Succeeded(hr, "CorePlan failed");
1546 1855
1547 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 1856 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -1616,7 +1925,7 @@ namespace Bootstrapper
1616 vfUseRelatedBundleRequestState = TRUE; 1925 vfUseRelatedBundleRequestState = TRUE;
1617 vRelatedBundleRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT; 1926 vRelatedBundleRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT;
1618 1927
1619 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 1928 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1620 NativeAssert::Succeeded(hr, "CorePlan failed"); 1929 NativeAssert::Succeeded(hr, "CorePlan failed");
1621 1930
1622 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 1931 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -1705,7 +2014,7 @@ namespace Bootstrapper
1705 vfUseRelatedBundleRequestState = TRUE; 2014 vfUseRelatedBundleRequestState = TRUE;
1706 vRelatedBundleRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT; 2015 vRelatedBundleRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT;
1707 2016
1708 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 2017 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1709 NativeAssert::Succeeded(hr, "CorePlan failed"); 2018 NativeAssert::Succeeded(hr, "CorePlan failed");
1710 2019
1711 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 2020 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -1798,7 +2107,7 @@ namespace Bootstrapper
1798 DetectPackagesAsAbsent(pEngineState); 2107 DetectPackagesAsAbsent(pEngineState);
1799 DetectRelatedBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"0.9.0.0", BOOTSTRAPPER_RELATION_UPGRADE); 2108 DetectRelatedBundle(pEngineState, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", L"0.9.0.0", BOOTSTRAPPER_RELATION_UPGRADE);
1800 2109
1801 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 2110 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1802 NativeAssert::Succeeded(hr, "CorePlan failed"); 2111 NativeAssert::Succeeded(hr, "CorePlan failed");
1803 2112
1804 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 2113 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -1904,7 +2213,7 @@ namespace Bootstrapper
1904 2213
1905 pEngineState->registration.detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; 2214 pEngineState->registration.detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL;
1906 2215
1907 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_MODIFY); 2216 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_MODIFY, BOOTSTRAPPER_SCOPE_DEFAULT);
1908 NativeAssert::Succeeded(hr, "CorePlan failed"); 2217 NativeAssert::Succeeded(hr, "CorePlan failed");
1909 2218
1910 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_MODIFY, pPlan->action); 2219 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_MODIFY, pPlan->action);
@@ -1983,7 +2292,7 @@ namespace Bootstrapper
1983 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState); 2292 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState);
1984 DetectPackagesAsPresentAndCached(pEngineState); 2293 DetectPackagesAsPresentAndCached(pEngineState);
1985 2294
1986 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 2295 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1987 NativeAssert::Succeeded(hr, "CorePlan failed"); 2296 NativeAssert::Succeeded(hr, "CorePlan failed");
1988 2297
1989 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 2298 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -2084,7 +2393,7 @@ namespace Bootstrapper
2084 DetectPackagesAsPresentAndCached(pEngineState); 2393 DetectPackagesAsPresentAndCached(pEngineState);
2085 DetectBundleDependent(pEngineState, L"{29855EB1-724D-4285-A89C-5D37D8549DCD}"); 2394 DetectBundleDependent(pEngineState, L"{29855EB1-724D-4285-A89C-5D37D8549DCD}");
2086 2395
2087 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 2396 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
2088 NativeAssert::Succeeded(hr, "CorePlan failed"); 2397 NativeAssert::Succeeded(hr, "CorePlan failed");
2089 2398
2090 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 2399 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -2154,7 +2463,7 @@ namespace Bootstrapper
2154 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState); 2463 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState);
2155 DetectAsRelatedUpgradeBundle(&engineState, L"{02940F3E-C83E-452D-BFCF-C943777ACEAE}", L"2.0.0.0"); 2464 DetectAsRelatedUpgradeBundle(&engineState, L"{02940F3E-C83E-452D-BFCF-C943777ACEAE}", L"2.0.0.0");
2156 2465
2157 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 2466 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
2158 NativeAssert::Succeeded(hr, "CorePlan failed"); 2467 NativeAssert::Succeeded(hr, "CorePlan failed");
2159 2468
2160 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 2469 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -2240,7 +2549,7 @@ namespace Bootstrapper
2240 pEngineState->packages.rgPackages[0].currentState = BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED; 2549 pEngineState->packages.rgPackages[0].currentState = BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED;
2241 pEngineState->packages.rgPackages[0].Msi.operation = BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE; 2550 pEngineState->packages.rgPackages[0].Msi.operation = BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE;
2242 2551
2243 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 2552 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
2244 NativeAssert::Succeeded(hr, "CorePlan failed"); 2553 NativeAssert::Succeeded(hr, "CorePlan failed");
2245 2554
2246 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 2555 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -2328,7 +2637,7 @@ namespace Bootstrapper
2328 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState); 2637 InitializeEngineStateForCorePlan(wzSingleMsiManifestFileName, pEngineState);
2329 DetectPackagesAsPresentAndCached(pEngineState); 2638 DetectPackagesAsPresentAndCached(pEngineState);
2330 2639
2331 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL); 2640 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
2332 NativeAssert::Succeeded(hr, "CorePlan failed"); 2641 NativeAssert::Succeeded(hr, "CorePlan failed");
2333 2642
2334 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL, pPlan->action); 2643 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL, pPlan->action);
@@ -2430,7 +2739,7 @@ namespace Bootstrapper
2430 DetectAttachedContainerAsAttached(pEngineState); 2739 DetectAttachedContainerAsAttached(pEngineState);
2431 DetectPackagesAsAbsent(pEngineState); 2740 DetectPackagesAsAbsent(pEngineState);
2432 2741
2433 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 2742 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
2434 NativeAssert::Succeeded(hr, "CorePlan failed"); 2743 NativeAssert::Succeeded(hr, "CorePlan failed");
2435 2744
2436 llPlannedAction = VariableGetNumericHelper(&engineState.variables, BURN_BUNDLE_ACTION); 2745 llPlannedAction = VariableGetNumericHelper(&engineState.variables, BURN_BUNDLE_ACTION);
@@ -2523,7 +2832,7 @@ namespace Bootstrapper
2523 DetectPermanentPackagesAsPresentAndCached(pEngineState); 2832 DetectPermanentPackagesAsPresentAndCached(pEngineState);
2524 PlanTestDetectPatchInitialize(pEngineState); 2833 PlanTestDetectPatchInitialize(pEngineState);
2525 2834
2526 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 2835 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
2527 NativeAssert::Succeeded(hr, "CorePlan failed"); 2836 NativeAssert::Succeeded(hr, "CorePlan failed");
2528 2837
2529 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 2838 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -2587,8 +2896,14 @@ namespace Bootstrapper
2587 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", registerActions1, 1); 2896 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", registerActions1, 1);
2588 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 2897 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2589 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 2898 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2899
2900
2590 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", registerActions1, 1); 2901 ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", registerActions1, 1);
2902
2903
2591 pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_INSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, TRUE); 2904 pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_INSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, TRUE);
2905
2906
2592 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA"); 2907 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
2593 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); 2908 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2594 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", registerActions1, 1); 2909 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", registerActions1, 1);
@@ -2654,7 +2969,7 @@ namespace Bootstrapper
2654 InitializeEngineStateForCorePlan(wzSlipstreamManifestFileName, pEngineState); 2969 InitializeEngineStateForCorePlan(wzSlipstreamManifestFileName, pEngineState);
2655 DetectPackagesAsPresentAndCached(pEngineState); 2970 DetectPackagesAsPresentAndCached(pEngineState);
2656 2971
2657 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 2972 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
2658 NativeAssert::Succeeded(hr, "CorePlan failed"); 2973 NativeAssert::Succeeded(hr, "CorePlan failed");
2659 2974
2660 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 2975 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -2784,7 +3099,7 @@ namespace Bootstrapper
2784 vfUsePackageRequestState = TRUE; 3099 vfUsePackageRequestState = TRUE;
2785 vPackageRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT; 3100 vPackageRequestState = BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT;
2786 3101
2787 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 3102 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
2788 NativeAssert::Succeeded(hr, "CorePlan failed"); 3103 NativeAssert::Succeeded(hr, "CorePlan failed");
2789 3104
2790 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action); 3105 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_UNINSTALL, pPlan->action);
@@ -2885,7 +3200,7 @@ namespace Bootstrapper
2885 InitializeEngineStateForCorePlan(wzSlipstreamModifiedManifestFileName, pEngineState); 3200 InitializeEngineStateForCorePlan(wzSlipstreamModifiedManifestFileName, pEngineState);
2886 DetectPackagesAsAbsent(pEngineState); 3201 DetectPackagesAsAbsent(pEngineState);
2887 3202
2888 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); 3203 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
2889 NativeAssert::Succeeded(hr, "CorePlan failed"); 3204 NativeAssert::Succeeded(hr, "CorePlan failed");
2890 3205
2891 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); 3206 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
@@ -3031,7 +3346,7 @@ namespace Bootstrapper
3031 Assert::True(FileExistsEx(sczFilePath, NULL), "Test file does not exist."); 3346 Assert::True(FileExistsEx(sczFilePath, NULL), "Test file does not exist.");
3032 3347
3033 hr = ManifestLoadXmlFromFile(sczFilePath, pEngineState); 3348 hr = ManifestLoadXmlFromFile(sczFilePath, pEngineState);
3034 NativeAssert::Succeeded(hr, "Failed to load manifest."); 3349 NativeAssert::Succeeded(hr, "Failed to load test manifest.");
3035 } 3350 }
3036 finally 3351 finally
3037 { 3352 {
@@ -3222,7 +3537,7 @@ namespace Bootstrapper
3222 for (DWORD j = 0; j < pPackage->Msi.cSlipstreamMspPackages; ++j) 3537 for (DWORD j = 0; j < pPackage->Msi.cSlipstreamMspPackages; ++j)
3223 { 3538 {
3224 BURN_PACKAGE* pMspPackage = pPackage->Msi.rgSlipstreamMsps[j].pMspPackage; 3539 BURN_PACKAGE* pMspPackage = pPackage->Msi.rgSlipstreamMsps[j].pMspPackage;
3225 MspEngineAddDetectedTargetProduct(&pEngineState->packages, pMspPackage, j, pPackage->Msi.sczProductCode, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED); 3540 MspEngineAddDetectedTargetProduct(&pEngineState->packages, pMspPackage, j, pPackage->Msi.sczProductCode, pPackage->scope == BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED);
3226 3541
3227 BURN_MSPTARGETPRODUCT* pTargetProduct = pMspPackage->Msp.rgTargetProducts + (pMspPackage->Msp.cTargetProductCodes - 1); 3542 BURN_MSPTARGETPRODUCT* pTargetProduct = pMspPackage->Msp.rgTargetProducts + (pMspPackage->Msp.cTargetProductCodes - 1);
3228 pTargetProduct->patchPackageState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT; 3543 pTargetProduct->patchPackageState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT;
@@ -3759,8 +4074,8 @@ namespace Bootstrapper
3759 void ValidatePlannedProvider( 4074 void ValidatePlannedProvider(
3760 __in BURN_PLAN* pPlan, 4075 __in BURN_PLAN* pPlan,
3761 __in UINT uIndex, 4076 __in UINT uIndex,
3762 __in LPCWSTR wzKey, 4077 __in_z LPCWSTR wzKey,
3763 __in LPCWSTR wzName 4078 __in_z_opt LPCWSTR wzName
3764 ) 4079 )
3765 { 4080 {
3766 Assert::InRange(uIndex + 1u, 1u, pPlan->cPlannedProviders); 4081 Assert::InRange(uIndex + 1u, 1u, pPlan->cPlannedProviders);
@@ -3811,8 +4126,6 @@ namespace Bootstrapper
3811} 4126}
3812} 4127}
3813} 4128}
3814}
3815}
3816 4129
3817#if TODO_REIMPLEMENT 4130#if TODO_REIMPLEMENT
3818 4131
diff --git a/src/burn/test/BurnUnitTest/RegistrationTest.cpp b/src/burn/test/BurnUnitTest/RegistrationTest.cpp
index 3068eb6a..1c43c442 100644
--- a/src/burn/test/BurnUnitTest/RegistrationTest.cpp
+++ b/src/burn/test/BurnUnitTest/RegistrationTest.cpp
@@ -9,11 +9,7 @@
9#define TEST_BUNDLE_UPGRADE_CODE L"{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}" 9#define TEST_BUNDLE_UPGRADE_CODE L"{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}"
10 10
11 11
12namespace Microsoft 12namespace WixToolset
13{
14namespace Tools
15{
16namespace WindowsInstallerXml
17{ 13{
18namespace Test 14namespace Test
19{ 15{
@@ -73,7 +69,7 @@ namespace Bootstrapper
73 L" <UX PrimaryPayloadId='ux.exe'>" 69 L" <UX PrimaryPayloadId='ux.exe'>"
74 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />" 70 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />"
75 L" </UX>" 71 L" </UX>"
76 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='no'>" 72 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Scope='peruser' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe'>"
77 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='1.0.0.0' />" 73 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='1.0.0.0' />"
78 L" </Registration>" 74 L" </Registration>"
79 L"</Bundle>"; 75 L"</Bundle>";
@@ -93,6 +89,12 @@ namespace Bootstrapper
93 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle); 89 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle);
94 TestThrowOnFailure(hr, L"Failed to parse registration from XML."); 90 TestThrowOnFailure(hr, L"Failed to parse registration from XML.");
95 91
92 hr = RegistrationSetPaths(&registration, &cache);
93 TestThrowOnFailure(hr, "Failed to set registration paths.");
94
95 hr = RegistrationPlanInitialize(&registration);
96 TestThrowOnFailure(hr, "Failed to initialize registration for the plan.");
97
96 plan.action = BOOTSTRAPPER_ACTION_INSTALL; 98 plan.action = BOOTSTRAPPER_ACTION_INSTALL;
97 plan.pCommand = &command; 99 plan.pCommand = &command;
98 plan.pInternalCommand = &internalCommand; 100 plan.pInternalCommand = &internalCommand;
@@ -173,7 +175,7 @@ namespace Bootstrapper
173 L" <UX PrimaryPayloadId='ux.exe'>" 175 L" <UX PrimaryPayloadId='ux.exe'>"
174 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />" 176 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />"
175 L" </UX>" 177 L" </UX>"
176 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='no'>" 178 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Scope='peruser' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe'>"
177 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='Product1' InProgressDisplayName='Product1 Installation' DisplayVersion='1.0.0.0' />" 179 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='Product1' InProgressDisplayName='Product1 Installation' DisplayVersion='1.0.0.0' />"
178 L" </Registration>" 180 L" </Registration>"
179 L"</Bundle>"; 181 L"</Bundle>";
@@ -193,6 +195,12 @@ namespace Bootstrapper
193 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle); 195 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle);
194 TestThrowOnFailure(hr, L"Failed to parse registration from XML."); 196 TestThrowOnFailure(hr, L"Failed to parse registration from XML.");
195 197
198 hr = RegistrationSetPaths(&registration, &cache);
199 TestThrowOnFailure(hr, "Failed to set registration paths.");
200
201 hr = RegistrationPlanInitialize(&registration);
202 TestThrowOnFailure(hr, "Failed to initialize registration for the plan.");
203
196 plan.action = BOOTSTRAPPER_ACTION_INSTALL; 204 plan.action = BOOTSTRAPPER_ACTION_INSTALL;
197 plan.pCommand = &command; 205 plan.pCommand = &command;
198 plan.pInternalCommand = &internalCommand; 206 plan.pInternalCommand = &internalCommand;
@@ -294,7 +302,7 @@ namespace Bootstrapper
294 L" <UX PrimaryPayloadId='ux.exe'>" 302 L" <UX PrimaryPayloadId='ux.exe'>"
295 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />" 303 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />"
296 L" </UX>" 304 L" </UX>"
297 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Tag='foo' ProviderKey='bar' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='no'>" 305 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Scope='peruser' Tag='foo' ProviderKey='bar' Version='1.0.0.0' ExecutableName='setup.exe'>"
298 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='Product1' DisplayVersion='1.0.0.0' />" 306 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='Product1' DisplayVersion='1.0.0.0' />"
299 L" </Registration>" 307 L" </Registration>"
300 L"</Bundle>"; 308 L"</Bundle>";
@@ -314,6 +322,12 @@ namespace Bootstrapper
314 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle); 322 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle);
315 TestThrowOnFailure(hr, L"Failed to parse registration from XML."); 323 TestThrowOnFailure(hr, L"Failed to parse registration from XML.");
316 324
325 hr = RegistrationSetPaths(&registration, &cache);
326 TestThrowOnFailure(hr, "Failed to set registration paths.");
327
328 hr = RegistrationPlanInitialize(&registration);
329 TestThrowOnFailure(hr, "Failed to initialize registration for the plan.");
330
317 plan.action = BOOTSTRAPPER_ACTION_INSTALL; 331 plan.action = BOOTSTRAPPER_ACTION_INSTALL;
318 plan.pCommand = &command; 332 plan.pCommand = &command;
319 plan.pInternalCommand = &internalCommand; 333 plan.pInternalCommand = &internalCommand;
@@ -415,7 +429,7 @@ namespace Bootstrapper
415 L" <UX PrimaryPayloadId='ux.exe'>" 429 L" <UX PrimaryPayloadId='ux.exe'>"
416 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />" 430 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />"
417 L" </UX>" 431 L" </UX>"
418 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='no'>" 432 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Scope='peruser' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe'>"
419 L" <Arp Register='yes' DisplayName='DisplayName1' DisplayVersion='1.2.3.4' Publisher='Publisher1' HelpLink='http://www.microsoft.com/help'" 433 L" <Arp Register='yes' DisplayName='DisplayName1' DisplayVersion='1.2.3.4' Publisher='Publisher1' HelpLink='http://www.microsoft.com/help'"
420 L" HelpTelephone='555-555-5555' AboutUrl='http://www.microsoft.com/about' UpdateUrl='http://www.microsoft.com/update'" 434 L" HelpTelephone='555-555-5555' AboutUrl='http://www.microsoft.com/about' UpdateUrl='http://www.microsoft.com/update'"
421 L" Comments='Comments1' Contact='Contact1' DisableModify='yes' DisableRemove='yes' />" 435 L" Comments='Comments1' Contact='Contact1' DisableModify='yes' DisableRemove='yes' />"
@@ -437,6 +451,12 @@ namespace Bootstrapper
437 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle); 451 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle);
438 TestThrowOnFailure(hr, L"Failed to parse registration from XML."); 452 TestThrowOnFailure(hr, L"Failed to parse registration from XML.");
439 453
454 hr = RegistrationSetPaths(&registration, &cache);
455 TestThrowOnFailure(hr, "Failed to set registration paths.");
456
457 hr = RegistrationPlanInitialize(&registration);
458 TestThrowOnFailure(hr, "Failed to initialize registration for the plan.");
459
440 plan.action = BOOTSTRAPPER_ACTION_INSTALL; 460 plan.action = BOOTSTRAPPER_ACTION_INSTALL;
441 plan.pCommand = &command; 461 plan.pCommand = &command;
442 plan.pInternalCommand = &internalCommand; 462 plan.pInternalCommand = &internalCommand;
@@ -554,7 +574,7 @@ namespace Bootstrapper
554 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />" 574 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />"
555 L" </UX>" 575 L" </UX>"
556 L" <RelatedBundle Code='" TEST_BUNDLE_UPGRADE_CODE L"' Action='Upgrade' />" 576 L" <RelatedBundle Code='" TEST_BUNDLE_UPGRADE_CODE L"' Action='Upgrade' />"
557 L" <Registration Code='" TEST_BUNDLE_ID L"' Tag='foo' ProviderKey='" TEST_BUNDLE_ID L"' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='no'>" 577 L" <Registration Code='" TEST_BUNDLE_ID L"' Scope='peruser' Tag='foo' ProviderKey='" TEST_BUNDLE_ID L"' Version='1.0.0.0' ExecutableName='setup.exe'>"
558 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='1.0.0.0' />" 578 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='1.0.0.0' />"
559 L" </Registration>" 579 L" </Registration>"
560 L" <Variable Id='MyBurnVariable1' Type='numeric' Value='0' Hidden='no' Persisted='yes' />" 580 L" <Variable Id='MyBurnVariable1' Type='numeric' Value='0' Hidden='no' Persisted='yes' />"
@@ -582,6 +602,12 @@ namespace Bootstrapper
582 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle); 602 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle);
583 TestThrowOnFailure(hr, L"Failed to parse registration from XML."); 603 TestThrowOnFailure(hr, L"Failed to parse registration from XML.");
584 604
605 hr = RegistrationSetPaths(&registration, &cache);
606 TestThrowOnFailure(hr, "Failed to set registration paths.");
607
608 hr = RegistrationPlanInitialize(&registration);
609 TestThrowOnFailure(hr, "Failed to initialize registration for the plan.");
610
585 plan.action = BOOTSTRAPPER_ACTION_INSTALL; 611 plan.action = BOOTSTRAPPER_ACTION_INSTALL;
586 plan.pCommand = &command; 612 plan.pCommand = &command;
587 plan.pInternalCommand = &internalCommand; 613 plan.pInternalCommand = &internalCommand;
@@ -694,7 +720,7 @@ namespace Bootstrapper
694 L" <UX PrimaryPayloadId='ux.exe'>" 720 L" <UX PrimaryPayloadId='ux.exe'>"
695 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />" 721 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' Hash='000000000000' />"
696 L" </UX>" 722 L" </UX>"
697 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='no'>" 723 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' UpgradeCode='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Scope='peruser' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe'>"
698 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='1.0.0.0' />" 724 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='1.0.0.0' />"
699 L" </Registration>" 725 L" </Registration>"
700 L" <Variable Id='MyBurnVariable1' Type='numeric' Value='0' Hidden='no' Persisted='yes' />" 726 L" <Variable Id='MyBurnVariable1' Type='numeric' Value='0' Hidden='no' Persisted='yes' />"
@@ -720,6 +746,12 @@ namespace Bootstrapper
720 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle); 746 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle);
721 TestThrowOnFailure(hr, L"Failed to parse registration from XML."); 747 TestThrowOnFailure(hr, L"Failed to parse registration from XML.");
722 748
749 hr = RegistrationSetPaths(&registration, &cache);
750 TestThrowOnFailure(hr, "Failed to set registration paths.");
751
752 hr = RegistrationPlanInitialize(&registration);
753 TestThrowOnFailure(hr, "Failed to initialize registration for the plan.");
754
723 plan.action = BOOTSTRAPPER_ACTION_INSTALL; 755 plan.action = BOOTSTRAPPER_ACTION_INSTALL;
724 plan.pCommand = &command; 756 plan.pCommand = &command;
725 plan.pInternalCommand = &internalCommand; 757 plan.pInternalCommand = &internalCommand;
@@ -882,5 +914,3 @@ namespace Bootstrapper
882} 914}
883} 915}
884} 916}
885}
886}
diff --git a/src/burn/test/BurnUnitTest/RelatedBundleTest.cpp b/src/burn/test/BurnUnitTest/RelatedBundleTest.cpp
index 9feb85d6..dcccc589 100644
--- a/src/burn/test/BurnUnitTest/RelatedBundleTest.cpp
+++ b/src/burn/test/BurnUnitTest/RelatedBundleTest.cpp
@@ -3,11 +3,7 @@
3#include "precomp.h" 3#include "precomp.h"
4 4
5 5
6namespace Microsoft 6namespace WixToolset
7{
8namespace Tools
9{
10namespace WindowsInstallerXml
11{ 7{
12namespace Test 8namespace Test
13{ 9{
@@ -49,7 +45,7 @@ namespace Bootstrapper
49 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' />" 45 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' />"
50 L" </UX>" 46 L" </UX>"
51 L" <RelatedBundle Code='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Action='Upgrade' />" 47 L" <RelatedBundle Code='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Action='Upgrade' />"
52 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe' PerMachine='yes'>" 48 L" <Registration Code='{D54F896D-1952-43E6-9C67-B5652240618C}' Tag='foo' ProviderKey='foo' Version='1.0.0.0' ExecutableName='setup.exe'>"
53 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='1.0.0.0' />" 49 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='1.0.0.0' />"
54 L" </Registration>" 50 L" </Registration>"
55 L"</Bundle>"; 51 L"</Bundle>";
@@ -63,7 +59,7 @@ namespace Bootstrapper
63 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle); 59 hr = RegistrationParseFromXml(&registration, &cache, pixeBundle);
64 TestThrowOnFailure(hr, L"Failed to parse registration from XML."); 60 TestThrowOnFailure(hr, L"Failed to parse registration from XML.");
65 61
66 RelatedBundlesInitializeForScope(registration.fPerMachine, &registration, &relatedBundles); 62 RelatedBundlesInitializeForScope(/*registration.fPlannedPerMachineScope*/TRUE, &registration, &relatedBundles);
67 63
68 Assert::Equal(1lu, relatedBundles.cRelatedBundles); 64 Assert::Equal(1lu, relatedBundles.cRelatedBundles);
69 65
@@ -101,7 +97,7 @@ namespace Bootstrapper
101 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' />" 97 L" <Payload Id='ux.exe' FilePath='ux.exe' Packaging='embedded' SourcePath='ux.exe' />"
102 L" </UX>" 98 L" </UX>"
103 L" <RelatedBundle Code='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Action='Upgrade' />" 99 L" <RelatedBundle Code='{89FDAE1F-8CC1-48B9-B930-3945E0D3E7F0}' Action='Upgrade' />"
104 L" <Registration Code='{3DB49D3D-1FB8-4147-A465-BBE8BFD0DAD0}' Tag='foo' ProviderKey='foo' Version='4.0.0.0' ExecutableName='setup.exe' PerMachine='no'>" 100 L" <Registration Code='{3DB49D3D-1FB8-4147-A465-BBE8BFD0DAD0}' Tag='foo' ProviderKey='foo' Version='4.0.0.0' ExecutableName='setup.exe'>"
105 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='4.0.0.0' />" 101 L" <Arp Register='yes' Publisher='WiX Toolset' DisplayName='RegisterBasicTest' DisplayVersion='4.0.0.0' />"
106 L" </Registration>" 102 L" </Registration>"
107 L"</Bundle>"; 103 L"</Bundle>";
@@ -195,5 +191,3 @@ namespace Bootstrapper
195} 191}
196} 192}
197} 193}
198}
199}
diff --git a/src/burn/test/BurnUnitTest/SearchTest.cpp b/src/burn/test/BurnUnitTest/SearchTest.cpp
index e3c714cb..ac6119de 100644
--- a/src/burn/test/BurnUnitTest/SearchTest.cpp
+++ b/src/burn/test/BurnUnitTest/SearchTest.cpp
@@ -33,11 +33,7 @@ using namespace System;
33using namespace Xunit; 33using namespace Xunit;
34using namespace Microsoft::Win32; 34using namespace Microsoft::Win32;
35 35
36namespace Microsoft 36namespace WixToolset
37{
38namespace Tools
39{
40namespace WindowsInstallerXml
41{ 37{
42namespace Test 38namespace Test
43{ 39{
@@ -595,8 +591,6 @@ namespace Bootstrapper
595} 591}
596} 592}
597} 593}
598}
599}
600 594
601 595
602static INSTALLSTATE WINAPI MsiComponentSearchTest_MsiGetComponentPathW( 596static INSTALLSTATE WINAPI MsiComponentSearchTest_MsiGetComponentPathW(
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/AllPmouBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/AllPmouBundle_manifest.xml
new file mode 100644
index 00000000..8be9f5b9
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/AllPmouBundle_manifest.xml
@@ -0,0 +1,46 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="AllPmouBundle" Extension="log" />
4 <RelatedBundle Code="{F5172FB5-DC8E-5671-A533-A6C4ED8B226A}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="65634" Hash="142E90105EC2705DA169B29ED252A7829AA9EF3CC9B55EB5CD47DFC93035B57E7C1C1E64D1D92C9B54BA4653A5D0B18CFD675E4B7A5AEA7B833D643D84DF8B96" FilePath="AllPmouBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PmouPkg1.msi" FilePath="PmouPkg1.msi" FileSize="32768" Hash="BCBB4F1C48953D23BE56CD7D5005BB38CB02C7BAC4AF30F87B7ADF7715EA721D28A3FCFC025D26FD5DC069BAB69F462577C3212C1BFE3707FCCE60FF3F3ED12C" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <Payload Id="PmouPkg2.msi" FilePath="PmouPkg2.msi" FileSize="32768" Hash="C3BABBCCC0FDA4ACE44D28C60FAB2CA76C00655A405CF6F7A3593F9130FCF47AD18C4DAE1A32D5C0177F58DBAE00CBF7EDCA027BEE19B96E0145A3FA00811B51" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
16 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
17 <Registration BundleId="AllPmouBundle" Code="{CA3BE971-4A75-46D1-BA74-005F9C7B8F6F}" ExecutableName="AllPmouBundle.exe" Scope="perMachineOrUser" Tag="" Version="1.0.0.0" ProviderKey="{CA3BE971-4A75-46D1-BA74-005F9C7B8F6F}">
18 <Arp DisplayName="AllPmouBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
19 </Registration>
20 <Chain>
21 <MsiPackage Id="PmouPkg1.msi" Cache="keep" CacheId="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}v1.0.0.0" InstallSize="279" Size="32768" Scope="perMachineOrUser" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PmouPkg1.msi" RollbackLogPathVariable="WixBundleRollbackLog_PmouPkg1.msi" ProductCode="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}" Language="1033" Version="1.0.0.0" UpgradeCode="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}">
22 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
23 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
24 <Provides Key="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}_v1.0.0.0" Version="1.0.0.0" DisplayName="PmouPkg1" />
25 <RelatedPackage Id="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
26 <Language Id="1033" />
27 </RelatedPackage>
28 <RelatedPackage Id="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
29 <Language Id="1033" />
30 </RelatedPackage>
31 <PayloadRef Id="PmouPkg1.msi" />
32 </MsiPackage>
33 <MsiPackage Id="PmouPkg2.msi" Cache="keep" CacheId="{1B1D793E-4026-48CA-B088-F919E70440AC}v1.0.0.0" InstallSize="279" Size="32768" Scope="perMachineOrUser" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PmouPkg2.msi" RollbackLogPathVariable="WixBundleRollbackLog_PmouPkg2.msi" ProductCode="{1B1D793E-4026-48CA-B088-F919E70440AC}" Language="1033" Version="1.0.0.0" UpgradeCode="{98F763B3-EA17-5AE5-AD47-21004FB34B24}">
34 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
35 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
36 <Provides Key="{1B1D793E-4026-48CA-B088-F919E70440AC}_v1.0.0.0" Version="1.0.0.0" DisplayName="PmouPkg2" />
37 <RelatedPackage Id="{98F763B3-EA17-5AE5-AD47-21004FB34B24}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
38 <Language Id="1033" />
39 </RelatedPackage>
40 <RelatedPackage Id="{98F763B3-EA17-5AE5-AD47-21004FB34B24}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
41 <Language Id="1033" />
42 </RelatedPackage>
43 <PayloadRef Id="PmouPkg2.msi" />
44 </MsiPackage>
45 </Chain>
46</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/AllPuomBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/AllPuomBundle_manifest.xml
new file mode 100644
index 00000000..a3cbd183
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/AllPuomBundle_manifest.xml
@@ -0,0 +1,46 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="AllPuomBundle" Extension="log" />
4 <RelatedBundle Code="{689DDFCE-6492-596F-92DC-341CCDF59ABB}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="65634" Hash="541AB7BED551A38137C7C965D46FF4817DE6E22C89AF98EC9461939024D6B39E7ACF9C3F526F4B567E73364289E7CE24FD84973F7B2151514F09E165FABE6234" FilePath="AllPuomBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PuomPkg1.msi" FilePath="PuomPkg1.msi" FileSize="32768" Hash="EF19E061C2647AD42E39A1721299D5D970F1E42CE6636ACA53009DC0D0D1F8B6F2FD516B7D3EEDAAF1EEDA364D54DA6C18FB929C385EC1BDDA08AEA50370B357" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <Payload Id="PuomPkg2.msi" FilePath="PuomPkg2.msi" FileSize="32768" Hash="F927CE9CD3272AF6571E39C72A68E6BD6808D944B6893B09253887B1942E1C043EC5E1E1E758D3C261FF8B566121EE809C4CBCB931D00EBF14CC6CFE24001292" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
16 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
17 <Registration BundleId="AllPuomBundle" Code="{37A6F602-178E-4A32-B766-EDC2CB81274B}" ExecutableName="AllPuomBundle.exe" Scope="perUserOrMachine" Tag="" Version="1.0.0.0" ProviderKey="{37A6F602-178E-4A32-B766-EDC2CB81274B}">
18 <Arp DisplayName="AllPuomBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
19 </Registration>
20 <Chain>
21 <MsiPackage Id="PuomPkg1.msi" Cache="keep" CacheId="{167C572B-D847-4BCF-9693-C8B5EB6350CD}v1.0.0.0" InstallSize="279" Size="32768" Scope="perUserOrMachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PuomPkg1.msi" RollbackLogPathVariable="WixBundleRollbackLog_PuomPkg1.msi" ProductCode="{167C572B-D847-4BCF-9693-C8B5EB6350CD}" Language="1033" Version="1.0.0.0" UpgradeCode="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}">
22 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
23 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
24 <Provides Key="{167C572B-D847-4BCF-9693-C8B5EB6350CD}_v1.0.0.0" Version="1.0.0.0" DisplayName="PuomPkg1" />
25 <RelatedPackage Id="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
26 <Language Id="1033" />
27 </RelatedPackage>
28 <RelatedPackage Id="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
29 <Language Id="1033" />
30 </RelatedPackage>
31 <PayloadRef Id="PuomPkg1.msi" />
32 </MsiPackage>
33 <MsiPackage Id="PuomPkg2.msi" Cache="keep" CacheId="{07617017-CE68-4F88-981A-4629835C9BD2}v1.0.0.0" InstallSize="279" Size="32768" Scope="perUserOrMachine" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PuomPkg2.msi" RollbackLogPathVariable="WixBundleRollbackLog_PuomPkg2.msi" ProductCode="{07617017-CE68-4F88-981A-4629835C9BD2}" Language="1033" Version="1.0.0.0" UpgradeCode="{C977A922-168B-59F0-84FD-CAB89DB314E0}">
34 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
35 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
36 <Provides Key="{07617017-CE68-4F88-981A-4629835C9BD2}_v1.0.0.0" Version="1.0.0.0" DisplayName="PuomPkg2" />
37 <RelatedPackage Id="{C977A922-168B-59F0-84FD-CAB89DB314E0}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
38 <Language Id="1033" />
39 </RelatedPackage>
40 <RelatedPackage Id="{C977A922-168B-59F0-84FD-CAB89DB314E0}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
41 <Language Id="1033" />
42 </RelatedPackage>
43 <PayloadRef Id="PuomPkg2.msi" />
44 </MsiPackage>
45 </Chain>
46</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/BasicFunctionality_BundleA_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/BasicFunctionality_BundleA_manifest.xml
index f3848eda..b19b911f 100644
--- a/src/burn/test/BurnUnitTest/TestData/PlanTest/BasicFunctionality_BundleA_manifest.xml
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/BasicFunctionality_BundleA_manifest.xml
@@ -15,11 +15,11 @@
15 <Payload Id="PackageA" FilePath="PackageA.msi" FileSize="32768" Hash="89C61F8A105A81B08036401152A1FDE67CDC0158" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /> 15 <Payload Id="PackageA" FilePath="PackageA.msi" FileSize="32768" Hash="89C61F8A105A81B08036401152A1FDE67CDC0158" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
16 <Payload Id="cab9Ins_fTP3wNwq5Gxo41ch5VUPaQ" FilePath="1a.cab" FileSize="975" Hash="11DE5863C4B2A8762D0EE23FE25B7774CA07676B" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" /> 16 <Payload Id="cab9Ins_fTP3wNwq5Gxo41ch5VUPaQ" FilePath="1a.cab" FileSize="975" Hash="11DE5863C4B2A8762D0EE23FE25B7774CA07676B" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
17 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /> 17 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
18 <Registration Code="{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}" ExecutableName="BundleA.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}"> 18 <Registration Code="{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}" ExecutableName="BundleA.exe" Scope="permachine" Tag="" Version="1.0.0.0" ProviderKey="{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}">
19 <Arp Register="yes" DisplayName="~BasicFunctionalityTests - BundleA" DisplayVersion="1.0.0.0" /> 19 <Arp Register="yes" DisplayName="~BasicFunctionalityTests - BundleA" DisplayVersion="1.0.0.0" />
20 </Registration> 20 </Registration>
21 <Chain> 21 <Chain>
22 <MsiPackage Id="PackageA" Cache="keep" CacheId="{64633047-D172-4BBB-B202-64337D15C952}v1.0.0.0" InstallSize="1951" Size="33743" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{64633047-D172-4BBB-B202-64337D15C952}" Language="1033" Version="1.0.0.0" UpgradeCode="{7FD50F1B-D134-4365-923C-DFA160F74738}"> 22 <MsiPackage Id="PackageA" Cache="keep" CacheId="{64633047-D172-4BBB-B202-64337D15C952}v1.0.0.0" InstallSize="1951" Size="33743" Scope="permachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{64633047-D172-4BBB-B202-64337D15C952}" Language="1033" Version="1.0.0.0" UpgradeCode="{7FD50F1B-D134-4365-923C-DFA160F74738}">
23 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /> 23 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
24 <MsiProperty Id="MSIFASTINSTALL" Value="7" /> 24 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
25 <Provides Key="{64633047-D172-4BBB-B202-64337D15C952}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - PackageA" /> 25 <Provides Key="{64633047-D172-4BBB-B202-64337D15C952}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - PackageA" />
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/BundlePackage_Multiple_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/BundlePackage_Multiple_manifest.xml
index 988bbfe0..651b491d 100644
--- a/src/burn/test/BurnUnitTest/TestData/PlanTest/BundlePackage_Multiple_manifest.xml
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/BundlePackage_Multiple_manifest.xml
@@ -46,19 +46,19 @@
46 <Payload Id="PackageA" FilePath="BundleA.exe" FileSize="5241635" Hash="20E1AFF76DE4693CB2876DC6BCCA0152DB16BE49AEDE2CD581C03FC39AB89DEA12BC25CB435F06E4D7D2B4443CE8A8935D5E92E2E49A4981B60A273980E4B29B" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /> 46 <Payload Id="PackageA" FilePath="BundleA.exe" FileSize="5241635" Hash="20E1AFF76DE4693CB2876DC6BCCA0152DB16BE49AEDE2CD581C03FC39AB89DEA12BC25CB435F06E4D7D2B4443CE8A8935D5E92E2E49A4981B60A273980E4B29B" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
47 <Payload Id="PackageB" FilePath="BundleB_x64.exe" FileSize="10450821" Hash="43A58873D61D6E0FA83F6C5266F2F05FEA9BC85D11C195493B7FD9F0B4AA799C1EFCB78D76DCED32124D2EC62A4E7114B62CDE6F0B87E42A7E28CDBB0DA0FF8E" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" /> 47 <Payload Id="PackageB" FilePath="BundleB_x64.exe" FileSize="10450821" Hash="43A58873D61D6E0FA83F6C5266F2F05FEA9BC85D11C195493B7FD9F0B4AA799C1EFCB78D76DCED32124D2EC62A4E7114B62CDE6F0B87E42A7E28CDBB0DA0FF8E" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
48 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /> 48 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
49 <Registration Code="{35192ED0-C70A-49B2-9D12-3B1FA39B5E6F}" ExecutableName="MultipleBundlePackagesBundle.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{35192ED0-C70A-49B2-9D12-3B1FA39B5E6F}"> 49 <Registration Code="{35192ED0-C70A-49B2-9D12-3B1FA39B5E6F}" ExecutableName="MultipleBundlePackagesBundle.exe" Scope="permachine" Tag="" Version="1.0.0.0" ProviderKey="{35192ED0-C70A-49B2-9D12-3B1FA39B5E6F}">
50 <Arp Register="yes" DisplayName="~BundlePackageTests - MultipleBundlePackagesBundle" DisplayVersion="1.0.0.0" /> 50 <Arp Register="yes" DisplayName="~BundlePackageTests - MultipleBundlePackagesBundle" DisplayVersion="1.0.0.0" />
51 </Registration> 51 </Registration>
52 <Chain> 52 <Chain>
53 <ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" Uninstallable="no" RepairArguments="" Repairable="no" Protocol="netfx4" DetectionType="condition"> 53 <ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" Scope="permachine" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" Uninstallable="no" RepairArguments="" Repairable="no" Protocol="netfx4" DetectionType="condition">
54 <PayloadRef Id="NetFx48Web" /> 54 <PayloadRef Id="NetFx48Web" />
55 </ExePackage> 55 </ExePackage>
56 <BundlePackage Id="PackageA" Cache="keep" CacheId="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}v1.0.0.0" InstallSize="2169" Size="5241635" Version="1.0.0.0" PerMachine="yes" Permanent="no" Vital="yes" RepairCondition="0" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" BundleCode="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}" InstallArguments="" UninstallArguments="" RepairArguments="" SupportsBurnProtocol="yes" Win64="no"> 56 <BundlePackage Id="PackageA" Cache="keep" CacheId="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}v1.0.0.0" InstallSize="2169" Size="5241635" Version="1.0.0.0" Scope="permachine" Permanent="no" Vital="yes" RepairCondition="0" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" BundleCode="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}" InstallArguments="" UninstallArguments="" RepairArguments="" SupportsBurnProtocol="yes" Win64="no">
57 <Provides Key="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - BundleA" Imported="yes" /> 57 <Provides Key="{B39CEE4D-CCD7-4797-BE3A-6613BD1DC4BE}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - BundleA" Imported="yes" />
58 <RelatedBundle Code="{8C7E2C47-1EE7-4BBE-99A2-EAB7F3693F48}" Action="Upgrade" /> 58 <RelatedBundle Code="{8C7E2C47-1EE7-4BBE-99A2-EAB7F3693F48}" Action="Upgrade" />
59 <PayloadRef Id="PackageA" /> 59 <PayloadRef Id="PackageA" />
60 </BundlePackage> 60 </BundlePackage>
61 <BundlePackage Id="PackageB" Cache="keep" CacheId="{7506235A-7C59-4750-82C7-EB460A87ED3A}v1.0.0.0" InstallSize="1441497" Size="10450821" Version="1.0.0.0" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageB" RollbackLogPathVariable="WixBundleRollbackLog_PackageB" BundleCode="{7506235A-7C59-4750-82C7-EB460A87ED3A}" InstallArguments="" UninstallArguments="" RepairArguments="" SupportsBurnProtocol="yes" Win64="yes"> 61 <BundlePackage Id="PackageB" Cache="keep" CacheId="{7506235A-7C59-4750-82C7-EB460A87ED3A}v1.0.0.0" InstallSize="1441497" Size="10450821" Version="1.0.0.0" Scope="permachine" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageB" RollbackLogPathVariable="WixBundleRollbackLog_PackageB" BundleCode="{7506235A-7C59-4750-82C7-EB460A87ED3A}" InstallArguments="" UninstallArguments="" RepairArguments="" SupportsBurnProtocol="yes" Win64="yes">
62 <Provides Key="{7506235A-7C59-4750-82C7-EB460A87ED3A}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - BundleB_x64" Imported="yes" /> 62 <Provides Key="{7506235A-7C59-4750-82C7-EB460A87ED3A}" Version="1.0.0.0" DisplayName="~BasicFunctionalityTests - BundleB_x64" Imported="yes" />
63 <RelatedBundle Code="{79F45B7A-D990-46E4-819B-078D87C3321A}" Action="Upgrade" /> 63 <RelatedBundle Code="{79F45B7A-D990-46E4-819B-078D87C3321A}" Action="Upgrade" />
64 <PayloadRef Id="PackageB" /> 64 <PayloadRef Id="PackageB" />
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/ExePackage_PerUserArpEntry_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/ExePackage_PerUserArpEntry_manifest.xml
index a5dfc188..51d86d4a 100644
--- a/src/burn/test/BurnUnitTest/TestData/PlanTest/ExePackage_PerUserArpEntry_manifest.xml
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/ExePackage_PerUserArpEntry_manifest.xml
@@ -46,14 +46,14 @@
46 <Payload Id="TestExe.exe" FilePath="TestExe.exe" FileSize="23552" Hash="8A3CAD62E7C15EE88B3B78A5F61EFA6D4C9AED67049075688A641EE65E1526589797B0C52398DEB520A7911E41F2A6F73C178D19C9FFBC03ECF964A822E6438E" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /> 46 <Payload Id="TestExe.exe" FilePath="TestExe.exe" FileSize="23552" Hash="8A3CAD62E7C15EE88B3B78A5F61EFA6D4C9AED67049075688A641EE65E1526589797B0C52398DEB520A7911E41F2A6F73C178D19C9FFBC03ECF964A822E6438E" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
47 <Payload Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" FilePath="TestExe.exe.config" FileSize="387" Hash="8C819A9E835F3921FA80C5C783AB0C42DDAADF0C0F2BEF8630EA122ABCB9DC8EAF0B14E061C46B37C92F55114BB09A8D5B1B613947A76A648953F2C63C0ACA63" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" /> 47 <Payload Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" FilePath="TestExe.exe.config" FileSize="387" Hash="8C819A9E835F3921FA80C5C783AB0C42DDAADF0C0F2BEF8630EA122ABCB9DC8EAF0B14E061C46B37C92F55114BB09A8D5B1B613947A76A648953F2C63C0ACA63" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
48 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /> 48 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
49 <Registration Code="{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}" ExecutableName="PerUserArpEntryExePackage.exe" PerMachine="no" Tag="" Version="1.0.0.0" ProviderKey="{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}"> 49 <Registration Code="{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}" ExecutableName="PerUserArpEntryExePackage.exe" Scope="peruser" Tag="" Version="1.0.0.0" ProviderKey="{9C459DAD-0E64-40C8-8C9F-4F68E46AB223}">
50 <Arp DisplayName="~ExePackageTests - PerUserArpEntryExePackage" DisplayVersion="1.0.0.0" /> 50 <Arp DisplayName="~ExePackageTests - PerUserArpEntryExePackage" DisplayVersion="1.0.0.0" />
51 </Registration> 51 </Registration>
52 <Chain> 52 <Chain>
53 <ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" RepairArguments="" Repairable="no" DetectionType="condition" DetectCondition="NETFRAMEWORK45 &gt;= 528040" Protocol="netfx4"> 53 <ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" Scope="permachine" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" RepairArguments="" Repairable="no" DetectionType="condition" DetectCondition="NETFRAMEWORK45 &gt;= 528040" Protocol="netfx4">
54 <PayloadRef Id="NetFx48Web" /> 54 <PayloadRef Id="NetFx48Web" />
55 </ExePackage> 55 </ExePackage>
56 <ExePackage Id="TestExe" Cache="keep" CacheId="8A3CAD62E7C15EE88B3B78A5F61EFA6D4C9AED67049075688A641EE65E1526589797B0C52398DEB520A7911E41F2A6F73C178D19C9FFBC03ECF964A822E6438E" InstallSize="23939" Size="23939" PerMachine="no" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_TestExe" RollbackLogPathVariable="WixBundleRollbackLog_TestExe" InstallArguments="/regw &quot;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF},DisplayVersion,String,1.0.0.0&quot; /regw &quot;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF},QuietUninstallString,String,\&quot;[WixBundleExecutePackageCacheFolder]testexe.exe\&quot; /regd \&quot;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF}\&quot;&quot;" RepairArguments="" Repairable="no" DetectionType="arp" ArpId="{9B5300C7-9B34-4670-9614-185B02AB87EF}" ArpDisplayVersion="1.0.0.0"> 56 <ExePackage Id="TestExe" Cache="keep" CacheId="8A3CAD62E7C15EE88B3B78A5F61EFA6D4C9AED67049075688A641EE65E1526589797B0C52398DEB520A7911E41F2A6F73C178D19C9FFBC03ECF964A822E6438E" InstallSize="23939" Size="23939" Scope="peruser" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_TestExe" RollbackLogPathVariable="WixBundleRollbackLog_TestExe" InstallArguments="/regw &quot;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF},DisplayVersion,String,1.0.0.0&quot; /regw &quot;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF},QuietUninstallString,String,\&quot;[WixBundleExecutePackageCacheFolder]testexe.exe\&quot; /regd \&quot;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9B5300C7-9B34-4670-9614-185B02AB87EF}\&quot;&quot;" RepairArguments="" Repairable="no" DetectionType="arp" ArpId="{9B5300C7-9B34-4670-9614-185B02AB87EF}" ArpDisplayVersion="1.0.0.0">
57 <PayloadRef Id="TestExe.exe" /> 57 <PayloadRef Id="TestExe.exe" />
58 <PayloadRef Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" /> 58 <PayloadRef Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" />
59 </ExePackage> 59 </ExePackage>
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/Failure_BundleD_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/Failure_BundleD_manifest.xml
index f3cfb179..84370c44 100644
--- a/src/burn/test/BurnUnitTest/TestData/PlanTest/Failure_BundleD_manifest.xml
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/Failure_BundleD_manifest.xml
@@ -47,14 +47,14 @@
47 <Payload Id="TestExe.exe" FilePath="TestExe.exe" FileSize="23552" Hash="4344604ECBA4DFE5DE7C680CB1AA5BD6FAA29BF95CE07740F02878C2BB1EF6DE6432944A0DB79B034D1C6F68CF80842EEE442EA8A551816E52D3F68901C50AB9" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /> 47 <Payload Id="TestExe.exe" FilePath="TestExe.exe" FileSize="23552" Hash="4344604ECBA4DFE5DE7C680CB1AA5BD6FAA29BF95CE07740F02878C2BB1EF6DE6432944A0DB79B034D1C6F68CF80842EEE442EA8A551816E52D3F68901C50AB9" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
48 <Payload Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" FilePath="TestExe.exe.config" FileSize="387" Hash="8C819A9E835F3921FA80C5C783AB0C42DDAADF0C0F2BEF8630EA122ABCB9DC8EAF0B14E061C46B37C92F55114BB09A8D5B1B613947A76A648953F2C63C0ACA63" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" /> 48 <Payload Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" FilePath="TestExe.exe.config" FileSize="387" Hash="8C819A9E835F3921FA80C5C783AB0C42DDAADF0C0F2BEF8630EA122ABCB9DC8EAF0B14E061C46B37C92F55114BB09A8D5B1B613947A76A648953F2C63C0ACA63" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
49 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /> 49 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
50 <Registration Code="{9C184683-04FB-49AD-9D79-65101BDC3EE3}" ExecutableName="BundleD.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{9C184683-04FB-49AD-9D79-65101BDC3EE3}"> 50 <Registration Code="{9C184683-04FB-49AD-9D79-65101BDC3EE3}" ExecutableName="BundleD.exe" Scope="permachine" Tag="" Version="1.0.0.0" ProviderKey="{9C184683-04FB-49AD-9D79-65101BDC3EE3}">
51 <Arp Register="yes" DisplayName="~FailureTests - BundleD" DisplayVersion="1.0.0.0" /> 51 <Arp Register="yes" DisplayName="~FailureTests - BundleD" DisplayVersion="1.0.0.0" />
52 </Registration> 52 </Registration>
53 <Chain> 53 <Chain>
54 <ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" Uninstallable="no" RepairArguments="" Repairable="no" Protocol="netfx4" DetectionType="condition"> 54 <ExePackage Id="NetFx48Web" Cache="remove" CacheId="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" InstallSize="1439328" Size="1439328" Scope="permachine" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" Uninstallable="no" RepairArguments="" Repairable="no" Protocol="netfx4" DetectionType="condition">
55 <PayloadRef Id="NetFx48Web" /> 55 <PayloadRef Id="NetFx48Web" />
56 </ExePackage> 56 </ExePackage>
57 <ExePackage Id="ExeA" Cache="remove" CacheId="4344604ECBA4DFE5DE7C680CB1AA5BD6FAA29BF95CE07740F02878C2BB1EF6DE6432944A0DB79B034D1C6F68CF80842EEE442EA8A551816E52D3F68901C50AB9" InstallSize="23939" Size="23939" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_ExeA" RollbackLogPathVariable="WixBundleRollbackLog_ExeA" DetectCondition="ExeA_Version AND ExeA_Version &gt;= v1.0.0.0" InstallArguments="/s 5000 /regw &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0&quot;" UninstallArguments="/regd &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version&quot;" Uninstallable="yes" RepairArguments="/regw &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0&quot;" Repairable="yes" DetectionType="condition"> 57 <ExePackage Id="ExeA" Cache="remove" CacheId="4344604ECBA4DFE5DE7C680CB1AA5BD6FAA29BF95CE07740F02878C2BB1EF6DE6432944A0DB79B034D1C6F68CF80842EEE442EA8A551816E52D3F68901C50AB9" InstallSize="23939" Size="23939" Scope="permachine" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_ExeA" RollbackLogPathVariable="WixBundleRollbackLog_ExeA" DetectCondition="ExeA_Version AND ExeA_Version &gt;= v1.0.0.0" InstallArguments="/s 5000 /regw &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0&quot;" UninstallArguments="/regd &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version&quot;" Uninstallable="yes" RepairArguments="/regw &quot;HKLM\Software\WiX\Tests\FailureTests\ExeA,Version,String,1.0.0.0&quot;" Repairable="yes" DetectionType="condition">
58 <PayloadRef Id="TestExe.exe" /> 58 <PayloadRef Id="TestExe.exe" />
59 <PayloadRef Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" /> 59 <PayloadRef Id="paygJp32KbpyjbVEQFNbl5_izmhdZw" />
60 </ExePackage> 60 </ExePackage>
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/MsiTransaction_BundleAv1_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/MsiTransaction_BundleAv1_manifest.xml
index 2047f495..c6f7a6eb 100644
--- a/src/burn/test/BurnUnitTest/TestData/PlanTest/MsiTransaction_BundleAv1_manifest.xml
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/MsiTransaction_BundleAv1_manifest.xml
@@ -20,11 +20,11 @@
20 <Payload Id="cab3wekki1le1R8RPDV2B8_g8jcjZc" FilePath="1cv1.cab" FileSize="975" Hash="11DE5863C4B2A8762D0EE23FE25B7774CA07676B" Packaging="embedded" SourcePath="a5" Container="WixAttachedContainer" /> 20 <Payload Id="cab3wekki1le1R8RPDV2B8_g8jcjZc" FilePath="1cv1.cab" FileSize="975" Hash="11DE5863C4B2A8762D0EE23FE25B7774CA07676B" Packaging="embedded" SourcePath="a5" Container="WixAttachedContainer" />
21 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /> 21 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
22 <RollbackBoundary Id="rbaOCA08D8ky7uBOK71_6FWz1K3TuQ" Vital="yes" Transaction="yes" /> 22 <RollbackBoundary Id="rbaOCA08D8ky7uBOK71_6FWz1K3TuQ" Vital="yes" Transaction="yes" />
23 <Registration Code="{E6469F05-BDC8-4EB8-B218-67412543EFAA}" ExecutableName="BundleAv1.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{E6469F05-BDC8-4EB8-B218-67412543EFAA}"> 23 <Registration Code="{E6469F05-BDC8-4EB8-B218-67412543EFAA}" ExecutableName="BundleAv1.exe" Scope="permachine" Tag="" Version="1.0.0.0" ProviderKey="{E6469F05-BDC8-4EB8-B218-67412543EFAA}">
24 <Arp Register="yes" DisplayName="~MsiTransactionTests - BundleAv1" DisplayVersion="1.0.0.0" /> 24 <Arp Register="yes" DisplayName="~MsiTransactionTests - BundleAv1" DisplayVersion="1.0.0.0" />
25 </Registration> 25 </Registration>
26 <Chain> 26 <Chain>
27 <MsiPackage Id="PackageA" Cache="keep" CacheId="{01E6B748-7B95-4BA9-976D-B6F35076CEF4}v1.0.0.0" InstallSize="1951" Size="33743" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{01E6B748-7B95-4BA9-976D-B6F35076CEF4}" Language="1033" Version="1.0.0.0" UpgradeCode="{7772FCDF-5FDB-497D-B5DF-C6D17D667976}"> 27 <MsiPackage Id="PackageA" Cache="keep" CacheId="{01E6B748-7B95-4BA9-976D-B6F35076CEF4}v1.0.0.0" InstallSize="1951" Size="33743" Scope="permachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{01E6B748-7B95-4BA9-976D-B6F35076CEF4}" Language="1033" Version="1.0.0.0" UpgradeCode="{7772FCDF-5FDB-497D-B5DF-C6D17D667976}">
28 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /> 28 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
29 <MsiProperty Id="MSIFASTINSTALL" Value="7" /> 29 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
30 <Provides Key="{01E6B748-7B95-4BA9-976D-B6F35076CEF4}" Version="1.0.0.0" DisplayName="~MsiTransactionTests - PackageA" /> 30 <Provides Key="{01E6B748-7B95-4BA9-976D-B6F35076CEF4}" Version="1.0.0.0" DisplayName="~MsiTransactionTests - PackageA" />
@@ -37,7 +37,7 @@
37 <PayloadRef Id="PackageA" /> 37 <PayloadRef Id="PackageA" />
38 <PayloadRef Id="cab9Ins_fTP3wNwq5Gxo41ch5VUPaQ" /> 38 <PayloadRef Id="cab9Ins_fTP3wNwq5Gxo41ch5VUPaQ" />
39 </MsiPackage> 39 </MsiPackage>
40 <MsiPackage Id="PackageB" Cache="keep" CacheId="{D1D01094-23CE-4AF0-84B6-4A1A133F21D3}v1.0.0.0" InstallSize="1951" Size="33743" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryForward="rbaOCA08D8ky7uBOK71_6FWz1K3TuQ" LogPathVariable="WixBundleLog_PackageB" RollbackLogPathVariable="WixBundleRollbackLog_PackageB" ProductCode="{D1D01094-23CE-4AF0-84B6-4A1A133F21D3}" Language="1033" Version="1.0.0.0" UpgradeCode="{EAFC0C6B-626E-415C-8132-536FBD19F49B}"> 40 <MsiPackage Id="PackageB" Cache="keep" CacheId="{D1D01094-23CE-4AF0-84B6-4A1A133F21D3}v1.0.0.0" InstallSize="1951" Size="33743" Scope="permachine" Permanent="no" Vital="yes" RollbackBoundaryForward="rbaOCA08D8ky7uBOK71_6FWz1K3TuQ" LogPathVariable="WixBundleLog_PackageB" RollbackLogPathVariable="WixBundleRollbackLog_PackageB" ProductCode="{D1D01094-23CE-4AF0-84B6-4A1A133F21D3}" Language="1033" Version="1.0.0.0" UpgradeCode="{EAFC0C6B-626E-415C-8132-536FBD19F49B}">
41 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /> 41 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
42 <MsiProperty Id="MSIFASTINSTALL" Value="7" /> 42 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
43 <Provides Key="{D1D01094-23CE-4AF0-84B6-4A1A133F21D3}" Version="1.0.0.0" DisplayName="~MsiTransactionTests - PackageBv1" /> 43 <Provides Key="{D1D01094-23CE-4AF0-84B6-4A1A133F21D3}" Version="1.0.0.0" DisplayName="~MsiTransactionTests - PackageBv1" />
@@ -50,7 +50,7 @@
50 <PayloadRef Id="PackageB" /> 50 <PayloadRef Id="PackageB" />
51 <PayloadRef Id="cablKtJUKxAbhSMIBwQU6vJ_CDsIkE" /> 51 <PayloadRef Id="cablKtJUKxAbhSMIBwQU6vJ_CDsIkE" />
52 </MsiPackage> 52 </MsiPackage>
53 <MsiPackage Id="PackageC" Cache="keep" CacheId="{A497C5E5-C78B-4F0B-BF72-B33E1DB1C4B8}v1.0.0.0" InstallSize="1951" Size="33743" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="rbaOCA08D8ky7uBOK71_6FWz1K3TuQ" LogPathVariable="WixBundleLog_PackageC" RollbackLogPathVariable="WixBundleRollbackLog_PackageC" ProductCode="{A497C5E5-C78B-4F0B-BF72-B33E1DB1C4B8}" Language="1033" Version="1.0.0.0" UpgradeCode="{A18BDC12-DAEC-43EE-87D1-31B2C2BC6269}"> 53 <MsiPackage Id="PackageC" Cache="keep" CacheId="{A497C5E5-C78B-4F0B-BF72-B33E1DB1C4B8}v1.0.0.0" InstallSize="1951" Size="33743" Scope="permachine" Permanent="no" Vital="yes" RollbackBoundaryBackward="rbaOCA08D8ky7uBOK71_6FWz1K3TuQ" LogPathVariable="WixBundleLog_PackageC" RollbackLogPathVariable="WixBundleRollbackLog_PackageC" ProductCode="{A497C5E5-C78B-4F0B-BF72-B33E1DB1C4B8}" Language="1033" Version="1.0.0.0" UpgradeCode="{A18BDC12-DAEC-43EE-87D1-31B2C2BC6269}">
54 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /> 54 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
55 <MsiProperty Id="MSIFASTINSTALL" Value="7" /> 55 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
56 <Provides Key="{A497C5E5-C78B-4F0B-BF72-B33E1DB1C4B8}" Version="1.0.0.0" DisplayName="~MsiTransactionTests - PackageCv1" /> 56 <Provides Key="{A497C5E5-C78B-4F0B-BF72-B33E1DB1C4B8}" Version="1.0.0.0" DisplayName="~MsiTransactionTests - PackageCv1" />
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml
index 4fd1d75a..6e678d12 100644
--- a/src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml
@@ -10,11 +10,11 @@
10 <Container Id="WixAttachedContainer" FileSize="119" Hash="06D28293FD57CD231E125EF9C82418A488928A98832A6937A77A3283A17A5C37F8D619C51759319A57E8F8A948FA73E8C5814185A0114130F3213AB268073555" FilePath="test.exe" AttachedIndex="1" Attached="yes" Primary="yes" /> 10 <Container Id="WixAttachedContainer" FileSize="119" Hash="06D28293FD57CD231E125EF9C82418A488928A98832A6937A77A3283A17A5C37F8D619C51759319A57E8F8A948FA73E8C5814185A0114130F3213AB268073555" FilePath="test.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
11 <Payload Id="test.msu" FilePath="test.msu" FileSize="28" Hash="B040F02D2F90E04E9AFBDC91C00CEB5DF97D48E205D96DC0A44E10AF8870794DAE62CA70224F12BE9112AA730BBE470CA81FB5617AAC690E832F3F84510E92BA" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /> 11 <Payload Id="test.msu" FilePath="test.msu" FileSize="28" Hash="B040F02D2F90E04E9AFBDC91C00CEB5DF97D48E205D96DC0A44E10AF8870794DAE62CA70224F12BE9112AA730BBE470CA81FB5617AAC690E832F3F84510E92BA" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
12 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /> 12 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
13 <Registration Code="{06077C60-DC46-4F4A-8D3C-05F869187191}" ExecutableName="test.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{06077C60-DC46-4F4A-8D3C-05F869187191}"> 13 <Registration Code="{06077C60-DC46-4F4A-8D3C-05F869187191}" ExecutableName="test.exe" Scope="permachine" Tag="" Version="1.0.0.0" ProviderKey="{06077C60-DC46-4F4A-8D3C-05F869187191}">
14 <Arp Register="yes" DisplayName="BurnBundle" DisplayVersion="1.0.0.0" Publisher="Example Corporation" /> 14 <Arp Register="yes" DisplayName="BurnBundle" DisplayVersion="1.0.0.0" Publisher="Example Corporation" />
15 </Registration> 15 </Registration>
16 <Chain> 16 <Chain>
17 <MsuPackage Id="test.msu" Cache="keep" CacheId="B040F02D2F90E04E9AFBDC91C00CEB5DF97D48E205D96DC0A44E10AF8870794DAE62CA70224F12BE9112AA730BBE470CA81FB5617AAC690E832F3F84510E92BA" InstallSize="28" Size="28" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" DetectCondition="DetectedTheMsu"> 17 <MsuPackage Id="test.msu" Cache="keep" CacheId="B040F02D2F90E04E9AFBDC91C00CEB5DF97D48E205D96DC0A44E10AF8870794DAE62CA70224F12BE9112AA730BBE470CA81FB5617AAC690E832F3F84510E92BA" InstallSize="28" Size="28" Scope="permachine" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" DetectCondition="DetectedTheMsu">
18 <PayloadRef Id="test.msu" /> 18 <PayloadRef Id="test.msu" />
19 </MsuPackage> 19 </MsuPackage>
20 </Chain> 20 </Chain>
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/PerMachineBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/PerMachineBundle_manifest.xml
new file mode 100644
index 00000000..66864c70
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/PerMachineBundle_manifest.xml
@@ -0,0 +1,33 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="PerMachineBundle" Extension="log" />
4 <RelatedBundle Code="{650EDC96-0BDF-512A-A544-4E5D7DD5D11E}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="32839" Hash="5BE3F4AAE711DB99A43B248F380EFB9F069C7D85F2C6D20D2B25033AABEDA09BCCF5203C2A99A7DB02D040168785EBB0260DC4073FEF2677F3760821B0948202" FilePath="PerMachineBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PerMachinePkg.msi" FilePath="PerMachinePkg.msi" FileSize="32768" Hash="4458C6B56290B207657AFB52DC20729FEDDA76799F21C14A7095E08CFB68CF382C5487CD53535CF24C16610066203ADFC29F25489BDE54290D1E480B7DED8FA6" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
16 <Registration BundleId="PerMachineBundle" Code="{3B58FF9C-2B33-417F-8240-10DA7FD7A6C4}" ExecutableName="PerMachineBundle.exe" Scope="perMachine" Tag="" Version="1.0.0.0" ProviderKey="{3B58FF9C-2B33-417F-8240-10DA7FD7A6C4}">
17 <Arp DisplayName="PerMachineBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
18 </Registration>
19 <Chain>
20 <MsiPackage Id="PerMachinePkg.msi" Cache="keep" CacheId="{DD544949-52BA-432B-925E-9BF0C4DB4B83}v1.0.0.0" InstallSize="283" Size="32768" Scope="perMachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerMachinePkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerMachinePkg.msi" ProductCode="{DD544949-52BA-432B-925E-9BF0C4DB4B83}" Language="1033" Version="1.0.0.0" UpgradeCode="{40B2312E-4395-5299-A08F-5B2744AA5A39}">
21 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
22 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
23 <Provides Key="{DD544949-52BA-432B-925E-9BF0C4DB4B83}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerMachinePkg" />
24 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
25 <Language Id="1033" />
26 </RelatedPackage>
27 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
28 <Language Id="1033" />
29 </RelatedPackage>
30 <PayloadRef Id="PerMachinePkg.msi" />
31 </MsiPackage>
32 </Chain>
33</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/PerUserBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/PerUserBundle_manifest.xml
new file mode 100644
index 00000000..6c26f708
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/PerUserBundle_manifest.xml
@@ -0,0 +1,33 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="PerUserBundle" Extension="log" />
4 <RelatedBundle Code="{DEB06D62-A48E-5455-920C-DC8E2DD660F9}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="32839" Hash="CF67D7D05B0449D5221DE5FB08E93DC85A8ECB4AC8E3614DCB63B9FE9010F08FE71A29FC55D6E4383CE73ED5420A5E73628B314932F229E7E0FBBC262522F68C" FilePath="PerUserBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PerUserPkg.msi" FilePath="PerUserPkg.msi" FileSize="32768" Hash="26CA1B74EFC52FA969279450110B6A9472E629004EF5655A661D8609A7E4DDB76CA220E5DB6FC2AE554415D9A4E28567014F48EF978EFDEE0B4431E81498572F" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
16 <Registration BundleId="PerUserBundle" Code="{7786E965-CCB4-42B2-AA90-F2652EE3B5C5}" ExecutableName="PerUserBundle.exe" Scope="perUser" Tag="" Version="1.0.0.0" ProviderKey="{7786E965-CCB4-42B2-AA90-F2652EE3B5C5}">
17 <Arp DisplayName="PerUserBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
18 </Registration>
19 <Chain>
20 <MsiPackage Id="PerUserPkg.msi" Cache="keep" CacheId="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}v1.0.0.0" InstallSize="274" Size="32768" Scope="perUser" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerUserPkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerUserPkg.msi" ProductCode="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}" Language="1033" Version="1.0.0.0" UpgradeCode="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}">
21 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
22 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
23 <Provides Key="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerUserPkg" />
24 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
25 <Language Id="1033" />
26 </RelatedPackage>
27 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
28 <Language Id="1033" />
29 </RelatedPackage>
30 <PayloadRef Id="PerUserPkg.msi" />
31 </MsiPackage>
32 </Chain>
33</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPmouBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPmouBundle_manifest.xml
new file mode 100644
index 00000000..47ce485a
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPmouBundle_manifest.xml
@@ -0,0 +1,59 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="PmPmouBundle" Extension="log" />
4 <RelatedBundle Code="{62D1B851-3DC9-58B7-B923-71A0F75703E0}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="98429" Hash="27A597EF7C5C69BDFE548E655FB4ACE548F379EBCC24EF56401BD22D3EECC0A904A68595FE5D3F448B7137A9B03A5EA2C0B422E3003DD293C7E73E2E4FE9D43B" FilePath="PmPmouBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PerMachinePkg.msi" FilePath="PerMachinePkg.msi" FileSize="32768" Hash="4458C6B56290B207657AFB52DC20729FEDDA76799F21C14A7095E08CFB68CF382C5487CD53535CF24C16610066203ADFC29F25489BDE54290D1E480B7DED8FA6" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <Payload Id="PmouPkg1.msi" FilePath="PmouPkg1.msi" FileSize="32768" Hash="BCBB4F1C48953D23BE56CD7D5005BB38CB02C7BAC4AF30F87B7ADF7715EA721D28A3FCFC025D26FD5DC069BAB69F462577C3212C1BFE3707FCCE60FF3F3ED12C" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
16 <Payload Id="PmouPkg2.msi" FilePath="PmouPkg2.msi" FileSize="32768" Hash="C3BABBCCC0FDA4ACE44D28C60FAB2CA76C00655A405CF6F7A3593F9130FCF47AD18C4DAE1A32D5C0177F58DBAE00CBF7EDCA027BEE19B96E0145A3FA00811B51" Packaging="embedded" SourcePath="a2" Container="WixAttachedContainer" />
17 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
18 <Registration BundleId="PmPmouBundle" Code="{91B17F62-3EC0-4BDB-9094-A00B3B575E5B}" ExecutableName="PmPmouBundle.exe" Scope="perMachineOrUser" Tag="" Version="1.0.0.0" ProviderKey="{91B17F62-3EC0-4BDB-9094-A00B3B575E5B}">
19 <Arp DisplayName="PmPmouBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
20 </Registration>
21 <Chain>
22 <MsiPackage Id="PerMachinePkg.msi" Cache="keep" CacheId="{DD544949-52BA-432B-925E-9BF0C4DB4B83}v1.0.0.0" InstallSize="283" Size="32768" Scope="perMachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerMachinePkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerMachinePkg.msi" ProductCode="{DD544949-52BA-432B-925E-9BF0C4DB4B83}" Language="1033" Version="1.0.0.0" UpgradeCode="{40B2312E-4395-5299-A08F-5B2744AA5A39}">
23 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
24 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
25 <Provides Key="{DD544949-52BA-432B-925E-9BF0C4DB4B83}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerMachinePkg" />
26 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
27 <Language Id="1033" />
28 </RelatedPackage>
29 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
30 <Language Id="1033" />
31 </RelatedPackage>
32 <PayloadRef Id="PerMachinePkg.msi" />
33 </MsiPackage>
34 <MsiPackage Id="PmouPkg1.msi" Cache="keep" CacheId="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}v1.0.0.0" InstallSize="279" Size="32768" Scope="perMachineOrUser" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PmouPkg1.msi" RollbackLogPathVariable="WixBundleRollbackLog_PmouPkg1.msi" ProductCode="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}" Language="1033" Version="1.0.0.0" UpgradeCode="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}">
35 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
36 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
37 <Provides Key="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}_v1.0.0.0" Version="1.0.0.0" DisplayName="PmouPkg1" />
38 <RelatedPackage Id="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
39 <Language Id="1033" />
40 </RelatedPackage>
41 <RelatedPackage Id="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
42 <Language Id="1033" />
43 </RelatedPackage>
44 <PayloadRef Id="PmouPkg1.msi" />
45 </MsiPackage>
46 <MsiPackage Id="PmouPkg2.msi" Cache="keep" CacheId="{1B1D793E-4026-48CA-B088-F919E70440AC}v1.0.0.0" InstallSize="279" Size="32768" Scope="perMachineOrUser" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PmouPkg2.msi" RollbackLogPathVariable="WixBundleRollbackLog_PmouPkg2.msi" ProductCode="{1B1D793E-4026-48CA-B088-F919E70440AC}" Language="1033" Version="1.0.0.0" UpgradeCode="{98F763B3-EA17-5AE5-AD47-21004FB34B24}">
47 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
48 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
49 <Provides Key="{1B1D793E-4026-48CA-B088-F919E70440AC}_v1.0.0.0" Version="1.0.0.0" DisplayName="PmouPkg2" />
50 <RelatedPackage Id="{98F763B3-EA17-5AE5-AD47-21004FB34B24}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
51 <Language Id="1033" />
52 </RelatedPackage>
53 <RelatedPackage Id="{98F763B3-EA17-5AE5-AD47-21004FB34B24}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
54 <Language Id="1033" />
55 </RelatedPackage>
56 <PayloadRef Id="PmouPkg2.msi" />
57 </MsiPackage>
58 </Chain>
59</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuPmouBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuPmouBundle_manifest.xml
new file mode 100644
index 00000000..86c1b1b0
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuPmouBundle_manifest.xml
@@ -0,0 +1,72 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="PmPuPmouBundle" Extension="log" />
4 <RelatedBundle Code="{F04C3701-1AC4-5C1D-8B26-400FB0C9F52A}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="131224" Hash="4F6D2A7D5A20E974F7708B50FF149D18B2739FC2CC9AF779D291FD1A4BFA7CC523E4D1DC2D7C372E519AE9FD1253329FE3182C172F2B43ED91E167AE2A9C5343" FilePath="PmPuPmouBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PerMachinePkg.msi" FilePath="PerMachinePkg.msi" FileSize="32768" Hash="4458C6B56290B207657AFB52DC20729FEDDA76799F21C14A7095E08CFB68CF382C5487CD53535CF24C16610066203ADFC29F25489BDE54290D1E480B7DED8FA6" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <Payload Id="PmouPkg1.msi" FilePath="PmouPkg1.msi" FileSize="32768" Hash="BCBB4F1C48953D23BE56CD7D5005BB38CB02C7BAC4AF30F87B7ADF7715EA721D28A3FCFC025D26FD5DC069BAB69F462577C3212C1BFE3707FCCE60FF3F3ED12C" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
16 <Payload Id="PmouPkg2.msi" FilePath="PmouPkg2.msi" FileSize="32768" Hash="C3BABBCCC0FDA4ACE44D28C60FAB2CA76C00655A405CF6F7A3593F9130FCF47AD18C4DAE1A32D5C0177F58DBAE00CBF7EDCA027BEE19B96E0145A3FA00811B51" Packaging="embedded" SourcePath="a2" Container="WixAttachedContainer" />
17 <Payload Id="PerUserPkg.msi" FilePath="PerUserPkg.msi" FileSize="32768" Hash="26CA1B74EFC52FA969279450110B6A9472E629004EF5655A661D8609A7E4DDB76CA220E5DB6FC2AE554415D9A4E28567014F48EF978EFDEE0B4431E81498572F" Packaging="embedded" SourcePath="a3" Container="WixAttachedContainer" />
18 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
19 <Registration BundleId="PmPuPmouBundle" Code="{6D7831C5-3A3B-481E-B048-E150DB402C74}" ExecutableName="PmPuPmouBundle.exe" Scope="perUser" Tag="" Version="1.0.0.0" ProviderKey="{6D7831C5-3A3B-481E-B048-E150DB402C74}">
20 <Arp DisplayName="PmPuPmouBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
21 </Registration>
22 <Chain>
23 <MsiPackage Id="PerMachinePkg.msi" Cache="keep" CacheId="{DD544949-52BA-432B-925E-9BF0C4DB4B83}v1.0.0.0" InstallSize="283" Size="32768" Scope="perMachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerMachinePkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerMachinePkg.msi" ProductCode="{DD544949-52BA-432B-925E-9BF0C4DB4B83}" Language="1033" Version="1.0.0.0" UpgradeCode="{40B2312E-4395-5299-A08F-5B2744AA5A39}">
24 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
25 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
26 <Provides Key="{DD544949-52BA-432B-925E-9BF0C4DB4B83}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerMachinePkg" />
27 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
28 <Language Id="1033" />
29 </RelatedPackage>
30 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
31 <Language Id="1033" />
32 </RelatedPackage>
33 <PayloadRef Id="PerMachinePkg.msi" />
34 </MsiPackage>
35 <MsiPackage Id="PmouPkg1.msi" Cache="keep" CacheId="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}v1.0.0.0" InstallSize="279" Size="32768" Scope="perMachineOrUser" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PmouPkg1.msi" RollbackLogPathVariable="WixBundleRollbackLog_PmouPkg1.msi" ProductCode="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}" Language="1033" Version="1.0.0.0" UpgradeCode="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}">
36 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
37 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
38 <Provides Key="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}_v1.0.0.0" Version="1.0.0.0" DisplayName="PmouPkg1" />
39 <RelatedPackage Id="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
40 <Language Id="1033" />
41 </RelatedPackage>
42 <RelatedPackage Id="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
43 <Language Id="1033" />
44 </RelatedPackage>
45 <PayloadRef Id="PmouPkg1.msi" />
46 </MsiPackage>
47 <MsiPackage Id="PmouPkg2.msi" Cache="keep" CacheId="{1B1D793E-4026-48CA-B088-F919E70440AC}v1.0.0.0" InstallSize="279" Size="32768" Scope="perMachineOrUser" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PmouPkg2.msi" RollbackLogPathVariable="WixBundleRollbackLog_PmouPkg2.msi" ProductCode="{1B1D793E-4026-48CA-B088-F919E70440AC}" Language="1033" Version="1.0.0.0" UpgradeCode="{98F763B3-EA17-5AE5-AD47-21004FB34B24}">
48 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
49 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
50 <Provides Key="{1B1D793E-4026-48CA-B088-F919E70440AC}_v1.0.0.0" Version="1.0.0.0" DisplayName="PmouPkg2" />
51 <RelatedPackage Id="{98F763B3-EA17-5AE5-AD47-21004FB34B24}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
52 <Language Id="1033" />
53 </RelatedPackage>
54 <RelatedPackage Id="{98F763B3-EA17-5AE5-AD47-21004FB34B24}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
55 <Language Id="1033" />
56 </RelatedPackage>
57 <PayloadRef Id="PmouPkg2.msi" />
58 </MsiPackage>
59 <MsiPackage Id="PerUserPkg.msi" Cache="keep" CacheId="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}v1.0.0.0" InstallSize="274" Size="32768" Scope="perUser" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerUserPkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerUserPkg.msi" ProductCode="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}" Language="1033" Version="1.0.0.0" UpgradeCode="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}">
60 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
61 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
62 <Provides Key="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerUserPkg" />
63 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
64 <Language Id="1033" />
65 </RelatedPackage>
66 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
67 <Language Id="1033" />
68 </RelatedPackage>
69 <PayloadRef Id="PerUserPkg.msi" />
70 </MsiPackage>
71 </Chain>
72</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuPuomBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuPuomBundle_manifest.xml
new file mode 100644
index 00000000..4bbd5307
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuPuomBundle_manifest.xml
@@ -0,0 +1,72 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="PmPuPuomBundle" Extension="log" />
4 <RelatedBundle Code="{24F67952-8FCC-58B6-8A79-76F35525AAC4}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="131224" Hash="5A33E8012AC2E16CBD94668E8F871F023044CB37BE65C62A483C1896DC262C0F7D16C374405C28AE0F3AD000BEF8CED1858B9A7DBDEC9CDB2E01B7B67C506D1B" FilePath="PmPuPuomBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PerMachinePkg.msi" FilePath="PerMachinePkg.msi" FileSize="32768" Hash="4458C6B56290B207657AFB52DC20729FEDDA76799F21C14A7095E08CFB68CF382C5487CD53535CF24C16610066203ADFC29F25489BDE54290D1E480B7DED8FA6" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <Payload Id="PuomPkg1.msi" FilePath="PuomPkg1.msi" FileSize="32768" Hash="EF19E061C2647AD42E39A1721299D5D970F1E42CE6636ACA53009DC0D0D1F8B6F2FD516B7D3EEDAAF1EEDA364D54DA6C18FB929C385EC1BDDA08AEA50370B357" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
16 <Payload Id="PuomPkg2.msi" FilePath="PuomPkg2.msi" FileSize="32768" Hash="F927CE9CD3272AF6571E39C72A68E6BD6808D944B6893B09253887B1942E1C043EC5E1E1E758D3C261FF8B566121EE809C4CBCB931D00EBF14CC6CFE24001292" Packaging="embedded" SourcePath="a2" Container="WixAttachedContainer" />
17 <Payload Id="PerUserPkg.msi" FilePath="PerUserPkg.msi" FileSize="32768" Hash="26CA1B74EFC52FA969279450110B6A9472E629004EF5655A661D8609A7E4DDB76CA220E5DB6FC2AE554415D9A4E28567014F48EF978EFDEE0B4431E81498572F" Packaging="embedded" SourcePath="a3" Container="WixAttachedContainer" />
18 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
19 <Registration BundleId="PmPuPuomBundle" Code="{37290F81-A99C-4FBE-84F2-9A2E4742453C}" ExecutableName="PmPuPuomBundle.exe" Scope="perUser" Tag="" Version="1.0.0.0" ProviderKey="{37290F81-A99C-4FBE-84F2-9A2E4742453C}">
20 <Arp DisplayName="PmPuPuomBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
21 </Registration>
22 <Chain>
23 <MsiPackage Id="PerMachinePkg.msi" Cache="keep" CacheId="{DD544949-52BA-432B-925E-9BF0C4DB4B83}v1.0.0.0" InstallSize="283" Size="32768" Scope="perMachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerMachinePkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerMachinePkg.msi" ProductCode="{DD544949-52BA-432B-925E-9BF0C4DB4B83}" Language="1033" Version="1.0.0.0" UpgradeCode="{40B2312E-4395-5299-A08F-5B2744AA5A39}">
24 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
25 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
26 <Provides Key="{DD544949-52BA-432B-925E-9BF0C4DB4B83}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerMachinePkg" />
27 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
28 <Language Id="1033" />
29 </RelatedPackage>
30 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
31 <Language Id="1033" />
32 </RelatedPackage>
33 <PayloadRef Id="PerMachinePkg.msi" />
34 </MsiPackage>
35 <MsiPackage Id="PuomPkg1.msi" Cache="keep" CacheId="{167C572B-D847-4BCF-9693-C8B5EB6350CD}v1.0.0.0" InstallSize="279" Size="32768" Scope="perUserOrMachine" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PuomPkg1.msi" RollbackLogPathVariable="WixBundleRollbackLog_PuomPkg1.msi" ProductCode="{167C572B-D847-4BCF-9693-C8B5EB6350CD}" Language="1033" Version="1.0.0.0" UpgradeCode="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}">
36 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
37 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
38 <Provides Key="{167C572B-D847-4BCF-9693-C8B5EB6350CD}_v1.0.0.0" Version="1.0.0.0" DisplayName="PuomPkg1" />
39 <RelatedPackage Id="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
40 <Language Id="1033" />
41 </RelatedPackage>
42 <RelatedPackage Id="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
43 <Language Id="1033" />
44 </RelatedPackage>
45 <PayloadRef Id="PuomPkg1.msi" />
46 </MsiPackage>
47 <MsiPackage Id="PuomPkg2.msi" Cache="keep" CacheId="{07617017-CE68-4F88-981A-4629835C9BD2}v1.0.0.0" InstallSize="279" Size="32768" Scope="perUserOrMachine" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PuomPkg2.msi" RollbackLogPathVariable="WixBundleRollbackLog_PuomPkg2.msi" ProductCode="{07617017-CE68-4F88-981A-4629835C9BD2}" Language="1033" Version="1.0.0.0" UpgradeCode="{C977A922-168B-59F0-84FD-CAB89DB314E0}">
48 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
49 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
50 <Provides Key="{07617017-CE68-4F88-981A-4629835C9BD2}_v1.0.0.0" Version="1.0.0.0" DisplayName="PuomPkg2" />
51 <RelatedPackage Id="{C977A922-168B-59F0-84FD-CAB89DB314E0}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
52 <Language Id="1033" />
53 </RelatedPackage>
54 <RelatedPackage Id="{C977A922-168B-59F0-84FD-CAB89DB314E0}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
55 <Language Id="1033" />
56 </RelatedPackage>
57 <PayloadRef Id="PuomPkg2.msi" />
58 </MsiPackage>
59 <MsiPackage Id="PerUserPkg.msi" Cache="keep" CacheId="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}v1.0.0.0" InstallSize="274" Size="32768" Scope="perUser" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerUserPkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerUserPkg.msi" ProductCode="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}" Language="1033" Version="1.0.0.0" UpgradeCode="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}">
60 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
61 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
62 <Provides Key="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerUserPkg" />
63 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
64 <Language Id="1033" />
65 </RelatedPackage>
66 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
67 <Language Id="1033" />
68 </RelatedPackage>
69 <PayloadRef Id="PerUserPkg.msi" />
70 </MsiPackage>
71 </Chain>
72</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuomBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuomBundle_manifest.xml
new file mode 100644
index 00000000..6ea9e9bd
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/PmPuomBundle_manifest.xml
@@ -0,0 +1,59 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="PmPuomBundle" Extension="log" />
4 <RelatedBundle Code="{24038F27-3104-5E4E-987B-1C1F81A88D56}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="98429" Hash="5AF2416362232E3DED34FDBAA37EBA07FAA96526A87DDA64609762CC95B85DD95D4CB3F907A0D331C9A19D89121737C8A54E78DD65A4979189B040A4521F2115" FilePath="PmPuomBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PerMachinePkg.msi" FilePath="PerMachinePkg.msi" FileSize="32768" Hash="4458C6B56290B207657AFB52DC20729FEDDA76799F21C14A7095E08CFB68CF382C5487CD53535CF24C16610066203ADFC29F25489BDE54290D1E480B7DED8FA6" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <Payload Id="PuomPkg1.msi" FilePath="PuomPkg1.msi" FileSize="32768" Hash="EF19E061C2647AD42E39A1721299D5D970F1E42CE6636ACA53009DC0D0D1F8B6F2FD516B7D3EEDAAF1EEDA364D54DA6C18FB929C385EC1BDDA08AEA50370B357" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
16 <Payload Id="PuomPkg2.msi" FilePath="PuomPkg2.msi" FileSize="32768" Hash="F927CE9CD3272AF6571E39C72A68E6BD6808D944B6893B09253887B1942E1C043EC5E1E1E758D3C261FF8B566121EE809C4CBCB931D00EBF14CC6CFE24001292" Packaging="embedded" SourcePath="a2" Container="WixAttachedContainer" />
17 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
18 <Registration BundleId="PmPuomBundle" Code="{8D5DB5A9-22B1-475E-AC99-CA7E9179B94F}" ExecutableName="PmPuomBundle.exe" Scope="perUserOrMachine" Tag="" Version="1.0.0.0" ProviderKey="{8D5DB5A9-22B1-475E-AC99-CA7E9179B94F}">
19 <Arp DisplayName="PmPuomBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
20 </Registration>
21 <Chain>
22 <MsiPackage Id="PerMachinePkg.msi" Cache="keep" CacheId="{DD544949-52BA-432B-925E-9BF0C4DB4B83}v1.0.0.0" InstallSize="283" Size="32768" Scope="perMachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerMachinePkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerMachinePkg.msi" ProductCode="{DD544949-52BA-432B-925E-9BF0C4DB4B83}" Language="1033" Version="1.0.0.0" UpgradeCode="{40B2312E-4395-5299-A08F-5B2744AA5A39}">
23 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
24 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
25 <Provides Key="{DD544949-52BA-432B-925E-9BF0C4DB4B83}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerMachinePkg" />
26 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
27 <Language Id="1033" />
28 </RelatedPackage>
29 <RelatedPackage Id="{40B2312E-4395-5299-A08F-5B2744AA5A39}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
30 <Language Id="1033" />
31 </RelatedPackage>
32 <PayloadRef Id="PerMachinePkg.msi" />
33 </MsiPackage>
34 <MsiPackage Id="PuomPkg1.msi" Cache="keep" CacheId="{167C572B-D847-4BCF-9693-C8B5EB6350CD}v1.0.0.0" InstallSize="279" Size="32768" Scope="perUserOrMachine" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PuomPkg1.msi" RollbackLogPathVariable="WixBundleRollbackLog_PuomPkg1.msi" ProductCode="{167C572B-D847-4BCF-9693-C8B5EB6350CD}" Language="1033" Version="1.0.0.0" UpgradeCode="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}">
35 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
36 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
37 <Provides Key="{167C572B-D847-4BCF-9693-C8B5EB6350CD}_v1.0.0.0" Version="1.0.0.0" DisplayName="PuomPkg1" />
38 <RelatedPackage Id="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
39 <Language Id="1033" />
40 </RelatedPackage>
41 <RelatedPackage Id="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
42 <Language Id="1033" />
43 </RelatedPackage>
44 <PayloadRef Id="PuomPkg1.msi" />
45 </MsiPackage>
46 <MsiPackage Id="PuomPkg2.msi" Cache="keep" CacheId="{07617017-CE68-4F88-981A-4629835C9BD2}v1.0.0.0" InstallSize="279" Size="32768" Scope="perUserOrMachine" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PuomPkg2.msi" RollbackLogPathVariable="WixBundleRollbackLog_PuomPkg2.msi" ProductCode="{07617017-CE68-4F88-981A-4629835C9BD2}" Language="1033" Version="1.0.0.0" UpgradeCode="{C977A922-168B-59F0-84FD-CAB89DB314E0}">
47 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
48 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
49 <Provides Key="{07617017-CE68-4F88-981A-4629835C9BD2}_v1.0.0.0" Version="1.0.0.0" DisplayName="PuomPkg2" />
50 <RelatedPackage Id="{C977A922-168B-59F0-84FD-CAB89DB314E0}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
51 <Language Id="1033" />
52 </RelatedPackage>
53 <RelatedPackage Id="{C977A922-168B-59F0-84FD-CAB89DB314E0}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
54 <Language Id="1033" />
55 </RelatedPackage>
56 <PayloadRef Id="PuomPkg2.msi" />
57 </MsiPackage>
58 </Chain>
59</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/PuPmouBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/PuPmouBundle_manifest.xml
new file mode 100644
index 00000000..79bb2500
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/PuPmouBundle_manifest.xml
@@ -0,0 +1,59 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="PuPmouBundle" Extension="log" />
4 <RelatedBundle Code="{92C1B57B-1972-5EB7-BB59-B4D230D806C7}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="98429" Hash="787872CCF9B905BE17725AD6F4DA2C8ACE196AA7BB90B54421E5029D85FF1F70BB51A91FAD81D2F7E09A956430866E208EF2A51681822501A39B791B88703F20" FilePath="PuPmouBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PmouPkg1.msi" FilePath="PmouPkg1.msi" FileSize="32768" Hash="BCBB4F1C48953D23BE56CD7D5005BB38CB02C7BAC4AF30F87B7ADF7715EA721D28A3FCFC025D26FD5DC069BAB69F462577C3212C1BFE3707FCCE60FF3F3ED12C" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <Payload Id="PmouPkg2.msi" FilePath="PmouPkg2.msi" FileSize="32768" Hash="C3BABBCCC0FDA4ACE44D28C60FAB2CA76C00655A405CF6F7A3593F9130FCF47AD18C4DAE1A32D5C0177F58DBAE00CBF7EDCA027BEE19B96E0145A3FA00811B51" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
16 <Payload Id="PerUserPkg.msi" FilePath="PerUserPkg.msi" FileSize="32768" Hash="26CA1B74EFC52FA969279450110B6A9472E629004EF5655A661D8609A7E4DDB76CA220E5DB6FC2AE554415D9A4E28567014F48EF978EFDEE0B4431E81498572F" Packaging="embedded" SourcePath="a2" Container="WixAttachedContainer" />
17 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
18 <Registration BundleId="PuPmouBundle" Code="{E974001C-97B1-4FF7-B1E3-B2CAACF1FF4A}" ExecutableName="PuPmouBundle.exe" Scope="perUser" Tag="" Version="1.0.0.0" ProviderKey="{E974001C-97B1-4FF7-B1E3-B2CAACF1FF4A}">
19 <Arp DisplayName="PuPmouBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
20 </Registration>
21 <Chain>
22 <MsiPackage Id="PmouPkg1.msi" Cache="keep" CacheId="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}v1.0.0.0" InstallSize="279" Size="32768" Scope="perMachineOrUser" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PmouPkg1.msi" RollbackLogPathVariable="WixBundleRollbackLog_PmouPkg1.msi" ProductCode="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}" Language="1033" Version="1.0.0.0" UpgradeCode="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}">
23 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
24 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
25 <Provides Key="{E46705B9-D2F9-4BE8-8270-F1A11196A9D4}_v1.0.0.0" Version="1.0.0.0" DisplayName="PmouPkg1" />
26 <RelatedPackage Id="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
27 <Language Id="1033" />
28 </RelatedPackage>
29 <RelatedPackage Id="{B0DA1185-5CF5-55A3-8351-01F1AD3E50CE}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
30 <Language Id="1033" />
31 </RelatedPackage>
32 <PayloadRef Id="PmouPkg1.msi" />
33 </MsiPackage>
34 <MsiPackage Id="PmouPkg2.msi" Cache="keep" CacheId="{1B1D793E-4026-48CA-B088-F919E70440AC}v1.0.0.0" InstallSize="279" Size="32768" Scope="perMachineOrUser" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PmouPkg2.msi" RollbackLogPathVariable="WixBundleRollbackLog_PmouPkg2.msi" ProductCode="{1B1D793E-4026-48CA-B088-F919E70440AC}" Language="1033" Version="1.0.0.0" UpgradeCode="{98F763B3-EA17-5AE5-AD47-21004FB34B24}">
35 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
36 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
37 <Provides Key="{1B1D793E-4026-48CA-B088-F919E70440AC}_v1.0.0.0" Version="1.0.0.0" DisplayName="PmouPkg2" />
38 <RelatedPackage Id="{98F763B3-EA17-5AE5-AD47-21004FB34B24}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
39 <Language Id="1033" />
40 </RelatedPackage>
41 <RelatedPackage Id="{98F763B3-EA17-5AE5-AD47-21004FB34B24}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
42 <Language Id="1033" />
43 </RelatedPackage>
44 <PayloadRef Id="PmouPkg2.msi" />
45 </MsiPackage>
46 <MsiPackage Id="PerUserPkg.msi" Cache="keep" CacheId="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}v1.0.0.0" InstallSize="274" Size="32768" Scope="perUser" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerUserPkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerUserPkg.msi" ProductCode="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}" Language="1033" Version="1.0.0.0" UpgradeCode="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}">
47 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
48 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
49 <Provides Key="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerUserPkg" />
50 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
51 <Language Id="1033" />
52 </RelatedPackage>
53 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
54 <Language Id="1033" />
55 </RelatedPackage>
56 <PayloadRef Id="PerUserPkg.msi" />
57 </MsiPackage>
58 </Chain>
59</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/PuPuomBundle_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/PuPuomBundle_manifest.xml
new file mode 100644
index 00000000..20dc0102
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/PuPuomBundle_manifest.xml
@@ -0,0 +1,59 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="PuPuomBundle" Extension="log" />
4 <RelatedBundle Code="{B0E91543-B4AC-5229-A871-3310CC2C32DF}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="98429" Hash="29DF486489C9075258FB216672D76A4BB5BEC498157964F641EA360DB2C80EE37B737654A54B6F1FBB2E96E727A80B2B708AD69534EE9CE0E29ACEF09704896D" FilePath="PuPuomBundle.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="PuomPkg1.msi" FilePath="PuomPkg1.msi" FileSize="32768" Hash="EF19E061C2647AD42E39A1721299D5D970F1E42CE6636ACA53009DC0D0D1F8B6F2FD516B7D3EEDAAF1EEDA364D54DA6C18FB929C385EC1BDDA08AEA50370B357" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <Payload Id="PuomPkg2.msi" FilePath="PuomPkg2.msi" FileSize="32768" Hash="F927CE9CD3272AF6571E39C72A68E6BD6808D944B6893B09253887B1942E1C043EC5E1E1E758D3C261FF8B566121EE809C4CBCB931D00EBF14CC6CFE24001292" Packaging="embedded" SourcePath="a1" Container="WixAttachedContainer" />
16 <Payload Id="PerUserPkg.msi" FilePath="PerUserPkg.msi" FileSize="32768" Hash="26CA1B74EFC52FA969279450110B6A9472E629004EF5655A661D8609A7E4DDB76CA220E5DB6FC2AE554415D9A4E28567014F48EF978EFDEE0B4431E81498572F" Packaging="embedded" SourcePath="a2" Container="WixAttachedContainer" />
17 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
18 <Registration BundleId="PuPuomBundle" Code="{6440CE0F-C219-4559-A051-97A655C4230A}" ExecutableName="PuPuomBundle.exe" Scope="perUser" Tag="" Version="1.0.0.0" ProviderKey="{6440CE0F-C219-4559-A051-97A655C4230A}">
19 <Arp DisplayName="PuPuomBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
20 </Registration>
21 <Chain>
22 <MsiPackage Id="PuomPkg1.msi" Cache="keep" CacheId="{167C572B-D847-4BCF-9693-C8B5EB6350CD}v1.0.0.0" InstallSize="279" Size="32768" Scope="perUserOrMachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PuomPkg1.msi" RollbackLogPathVariable="WixBundleRollbackLog_PuomPkg1.msi" ProductCode="{167C572B-D847-4BCF-9693-C8B5EB6350CD}" Language="1033" Version="1.0.0.0" UpgradeCode="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}">
23 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
24 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
25 <Provides Key="{167C572B-D847-4BCF-9693-C8B5EB6350CD}_v1.0.0.0" Version="1.0.0.0" DisplayName="PuomPkg1" />
26 <RelatedPackage Id="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
27 <Language Id="1033" />
28 </RelatedPackage>
29 <RelatedPackage Id="{AC3A2D0C-CB37-5F8B-8CE1-9233B963E5BB}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
30 <Language Id="1033" />
31 </RelatedPackage>
32 <PayloadRef Id="PuomPkg1.msi" />
33 </MsiPackage>
34 <MsiPackage Id="PuomPkg2.msi" Cache="keep" CacheId="{07617017-CE68-4F88-981A-4629835C9BD2}v1.0.0.0" InstallSize="279" Size="32768" Scope="perUserOrMachine" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PuomPkg2.msi" RollbackLogPathVariable="WixBundleRollbackLog_PuomPkg2.msi" ProductCode="{07617017-CE68-4F88-981A-4629835C9BD2}" Language="1033" Version="1.0.0.0" UpgradeCode="{C977A922-168B-59F0-84FD-CAB89DB314E0}">
35 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
36 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
37 <Provides Key="{07617017-CE68-4F88-981A-4629835C9BD2}_v1.0.0.0" Version="1.0.0.0" DisplayName="PuomPkg2" />
38 <RelatedPackage Id="{C977A922-168B-59F0-84FD-CAB89DB314E0}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
39 <Language Id="1033" />
40 </RelatedPackage>
41 <RelatedPackage Id="{C977A922-168B-59F0-84FD-CAB89DB314E0}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
42 <Language Id="1033" />
43 </RelatedPackage>
44 <PayloadRef Id="PuomPkg2.msi" />
45 </MsiPackage>
46 <MsiPackage Id="PerUserPkg.msi" Cache="keep" CacheId="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}v1.0.0.0" InstallSize="274" Size="32768" Scope="perUser" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PerUserPkg.msi" RollbackLogPathVariable="WixBundleRollbackLog_PerUserPkg.msi" ProductCode="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}" Language="1033" Version="1.0.0.0" UpgradeCode="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}">
47 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
48 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
49 <Provides Key="{7DA760D5-30A8-4A32-A2E0-1563E0C99CEB}_v1.0.0.0" Version="1.0.0.0" DisplayName="PerUserPkg" />
50 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MaxVersion="1.0.0.0" MaxInclusive="no" OnlyDetect="no" LangInclusive="yes">
51 <Language Id="1033" />
52 </RelatedPackage>
53 <RelatedPackage Id="{0D1FCBA3-488C-5309-B67C-E00C8B3FCADD}" MinVersion="1.0.0.0" MinInclusive="no" OnlyDetect="yes" LangInclusive="yes">
54 <Language Id="1033" />
55 </RelatedPackage>
56 <PayloadRef Id="PerUserPkg.msi" />
57 </MsiPackage>
58 </Chain>
59</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/PuomBundlePackage_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/PuomBundlePackage_manifest.xml
new file mode 100644
index 00000000..60123409
--- /dev/null
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/PuomBundlePackage_manifest.xml
@@ -0,0 +1,26 @@
1<?xml version="1.0" encoding="utf-8"?>
2<BurnManifest EngineVersion="7.0.0.54" ProtocolVersion="1" Win64="no" xmlns="http://wixtoolset.org/schemas/v4/2008/Burn">
3 <Log PathVariable="WixBundleLog" Prefix="AllPuomBundle" Extension="log" />
4 <RelatedBundle Code="{689DDFCE-6492-596F-92DC-341CCDF59ABB}" Action="Upgrade" />
5 <UX PrimaryPayloadId="WixStandardBootstrapperApplication_X86">
6 <Payload Id="payberKyKpNVb0s10isnONgjD92jYc" FilePath="thm.xml" SourcePath="u0" />
7 <Payload Id="payXE.1bvyKgymWAWeJwB8BL4ifPGo" FilePath="thm.wxl" SourcePath="u1" />
8 <Payload Id="pay8cUoxSucOqsVErqhu1LEW8wSG1s" FilePath="logo.png" SourcePath="u2" />
9 <Payload Id="WixStandardBootstrapperApplication_X86" FilePath="wixstdba.exe" SourcePath="u3" />
10 <Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u4" />
11 <Payload Id="uxmKgAFS4cS31ZH_Myfqo5J4kHixQ" FilePath="BootstrapperExtensionData.xml" SourcePath="u5" />
12 </UX>
13 <Container Id="WixAttachedContainer" FileSize="6212364" Hash="62B3BCE91659C71B4382EBE5699FDB0D9A903D5293EB6EC9211D401590C72F9A0C755F28F88D0A70BB7716710457B5480A8EBC9FEC6E103A30F2A03A301AFD10" FilePath="PuomBundlePackage.exe" AttachedIndex="1" Attached="yes" Primary="yes" />
14 <Payload Id="AllPuomBundle.exe" FilePath="AllPuomBundle.exe" FileSize="6210781" Hash="99C28419B07FDFC7C89AAB483FE7B2BB35102556959E9F2169CAB8A25FCFF2583F7B1079A69CB902ACDD3EE390E890AC9C9D54A108D70BFBB4AF26EC61AB4929" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" />
15 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
16 <Registration BundleId="AllPuomBundle" Code="{AF0B0375-34C0-4BEF-9411-ACD15D2084CB}" ExecutableName="PuomBundlePackage.exe" Scope="perUserOrMachine" Tag="" Version="1.0.0.0" ProviderKey="{AF0B0375-34C0-4BEF-9411-ACD15D2084CB}">
17 <Arp DisplayName="AllPuomBundle" DisplayVersion="1.0.0.0" Publisher="Acme" />
18 </Registration>
19 <Chain>
20 <BundlePackage Id="AllPuomBundle.exe" Cache="keep" CacheId="{37A6F602-178E-4A32-B766-EDC2CB81274B}v1.0.0.0" InstallSize="558" Size="6210781" Scope="perUserOrMachine" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_AllPuomBundle.exe" RollbackLogPathVariable="WixBundleRollbackLog_AllPuomBundle.exe" BundleCode="{37A6F602-178E-4A32-B766-EDC2CB81274B}" Version="1.0.0.0" InstallArguments="" UninstallArguments="" RepairArguments="" SupportsBurnProtocol="yes" Win64="no" HideARP="yes">
21 <Provides Key="{37A6F602-178E-4A32-B766-EDC2CB81274B}" Version="1.0.0.0" DisplayName="AllPuomBundle" Imported="yes" />
22 <RelatedBundle Code="{689DDFCE-6492-596F-92DC-341CCDF59ABB}" Action="Upgrade" />
23 <PayloadRef Id="AllPuomBundle.exe" />
24 </BundlePackage>
25 </Chain>
26</BurnManifest> \ No newline at end of file
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_manifest.xml
index 495bbf05..e4075796 100644
--- a/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_manifest.xml
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_manifest.xml
@@ -45,14 +45,14 @@
45 <Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" /> 45 <Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" />
46 <Payload Id="PatchA" FilePath="PatchA.msp" FileSize="20480" Hash="FABC6C18E4A778E127E84CDF67F93A291CAEC8BB" Packaging="external" SourcePath="PatchA.msp" /> 46 <Payload Id="PatchA" FilePath="PatchA.msp" FileSize="20480" Hash="FABC6C18E4A778E127E84CDF67F93A291CAEC8BB" Packaging="external" SourcePath="PatchA.msp" />
47 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /> 47 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
48 <Registration Code="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{22D1DDBA-284D-40A7-BD14-95EA07906F21}"> 48 <Registration Code="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" Scope="permachine" Tag="" Version="1.0.0.0" ProviderKey="{22D1DDBA-284D-40A7-BD14-95EA07906F21}">
49 <Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" /> 49 <Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" />
50 </Registration> 50 </Registration>
51 <Chain> 51 <Chain>
52 <ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="yes" Protocol="netfx4" DetectionType="condition"> 52 <ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" Scope="permachine" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="yes" Protocol="netfx4" DetectionType="condition">
53 <PayloadRef Id="NetFx48Web" /> 53 <PayloadRef Id="NetFx48Web" />
54 </ExePackage> 54 </ExePackage>
55 <MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" PerMachine="yes" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}"> 55 <MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" Scope="permachine" Permanent="no" Vital="yes" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}">
56 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /> 56 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
57 <MsiProperty Id="MSIFASTINSTALL" Value="7" /> 57 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
58 <SlipstreamMsp Id="PatchA" /> 58 <SlipstreamMsp Id="PatchA" />
@@ -65,7 +65,7 @@
65 </RelatedPackage> 65 </RelatedPackage>
66 <PayloadRef Id="PackageA" /> 66 <PayloadRef Id="PackageA" />
67 </MsiPackage> 67 </MsiPackage>
68 <MspPackage Id="PatchA" Cache="keep" CacheId="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" InstallSize="20480" Size="20480" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PatchA" RollbackLogPathVariable="WixBundleRollbackLog_PatchA" PatchCode="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" PatchXml="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;MsiPatch xmlns=&quot;http://www.microsoft.com/msi/patch_applicability.xsd&quot; SchemaVersion=&quot;1.0.0.0&quot; PatchGUID=&quot;{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}&quot; MinMsiVersion=&quot;5&quot; TargetsRTM=&quot;true&quot;&gt;&lt;TargetProduct MinMsiVersion=&quot;500&quot;&gt;&lt;TargetProductCode Validate=&quot;true&quot;&gt;{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}&lt;/TargetProductCode&gt;&lt;TargetVersion Validate=&quot;true&quot; ComparisonType=&quot;Equal&quot; ComparisonFilter=&quot;MajorMinorUpdate&quot;&gt;1.0.0.0&lt;/TargetVersion&gt;&lt;UpdatedVersion&gt;1.0.1.0&lt;/UpdatedVersion&gt;&lt;TargetLanguage Validate=&quot;false&quot;&gt;1033&lt;/TargetLanguage&gt;&lt;UpdatedLanguages&gt;1033&lt;/UpdatedLanguages&gt;&lt;UpgradeCode Validate=&quot;true&quot;&gt;{DB87BB66-FE5D-4293-81AC-EE313D3F864B}&lt;/UpgradeCode&gt;&lt;/TargetProduct&gt;&lt;TargetProductCode&gt;{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}&lt;/TargetProductCode&gt;&lt;/MsiPatch&gt;"> 68 <MspPackage Id="PatchA" Cache="keep" CacheId="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" InstallSize="20480" Size="20480" Scope="permachine" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PatchA" RollbackLogPathVariable="WixBundleRollbackLog_PatchA" PatchCode="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" PatchXml="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;MsiPatch xmlns=&quot;http://www.microsoft.com/msi/patch_applicability.xsd&quot; SchemaVersion=&quot;1.0.0.0&quot; PatchGUID=&quot;{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}&quot; MinMsiVersion=&quot;5&quot; TargetsRTM=&quot;true&quot;&gt;&lt;TargetProduct MinMsiVersion=&quot;500&quot;&gt;&lt;TargetProductCode Validate=&quot;true&quot;&gt;{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}&lt;/TargetProductCode&gt;&lt;TargetVersion Validate=&quot;true&quot; ComparisonType=&quot;Equal&quot; ComparisonFilter=&quot;MajorMinorUpdate&quot;&gt;1.0.0.0&lt;/TargetVersion&gt;&lt;UpdatedVersion&gt;1.0.1.0&lt;/UpdatedVersion&gt;&lt;TargetLanguage Validate=&quot;false&quot;&gt;1033&lt;/TargetLanguage&gt;&lt;UpdatedLanguages&gt;1033&lt;/UpdatedLanguages&gt;&lt;UpgradeCode Validate=&quot;true&quot;&gt;{DB87BB66-FE5D-4293-81AC-EE313D3F864B}&lt;/UpgradeCode&gt;&lt;/TargetProduct&gt;&lt;TargetProductCode&gt;{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}&lt;/TargetProductCode&gt;&lt;/MsiPatch&gt;">
69 <Provides Key="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" DisplayName="SlipstreamTests - Patch A" /> 69 <Provides Key="{0A5113E3-06A5-4CE0-8E83-9EB42F6764A6}" DisplayName="SlipstreamTests - Patch A" />
70 <PayloadRef Id="PatchA" /> 70 <PayloadRef Id="PatchA" />
71 </MspPackage> 71 </MspPackage>
diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml
index de73c66f..1d9fcbee 100644
--- a/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml
+++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/Slipstream_BundleA_modified_manifest.xml
@@ -44,14 +44,14 @@
44 <Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1479400" Hash="5A84A8E612E270E27D0061D58DB6B470153BE1F9" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" /> 44 <Payload Id="NetFx48Web" FilePath="redist\ndp48-web.exe" FileSize="1479400" Hash="5A84A8E612E270E27D0061D58DB6B470153BE1F9" DownloadUrl="https://go.microsoft.com/fwlink/?LinkId=2085155" Packaging="external" SourcePath="redist\ndp48-web.exe" />
45 <Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" /> 45 <Payload Id="PackageA" FilePath="PackageAv1.msi" FileSize="32768" Hash="2369B16B7219B3C834DFBC5D2AF8B2EF8803D43D" Packaging="external" SourcePath="PackageAv1.msi" />
46 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /> 46 <RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" />
47 <Registration Code="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{DC94A8E0-4BF4-4026-B80B-2755DAFC05D3}"> 47 <Registration Code="{22D1DDBA-284D-40A7-BD14-95EA07906F21}" ExecutableName="BundleA.exe" Scope="permachine" Tag="" Version="1.0.0.0" ProviderKey="{DC94A8E0-4BF4-4026-B80B-2755DAFC05D3}">
48 <Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" /> 48 <Arp Register="yes" DisplayName="~SlipstreamTests - BundleA" DisplayVersion="1.0.0.0" />
49 </Registration> 49 </Registration>
50 <Chain> 50 <Chain>
51 <ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="no" Protocol="netfx4" DetectionType="condition"> 51 <ExePackage Id="NetFx48Web" Cache="keep" CacheId="5A84A8E612E270E27D0061D58DB6B470153BE1F9" InstallSize="1479400" Size="1479400" Scope="permachine" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" LogPathVariable="NetFx48WebLog" RollbackLogPathVariable="WixBundleRollbackLog_NetFx48Web" DetectCondition="NETFRAMEWORK45 &gt;= 528040" InstallArguments="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="" RepairArguments="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx48WebLog].html&quot;" Repairable="yes" Uninstallable="no" Protocol="netfx4" DetectionType="condition">
52 <PayloadRef Id="NetFx48Web" /> 52 <PayloadRef Id="NetFx48Web" />
53 </ExePackage> 53 </ExePackage>
54 <MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}"> 54 <MsiPackage Id="PackageA" Cache="keep" CacheId="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}v1.0.0.0" InstallSize="2103" Size="32768" Scope="permachine" Permanent="no" Vital="yes" RollbackBoundaryBackward="WixDefaultBoundary" LogPathVariable="WixBundleLog_PackageA" RollbackLogPathVariable="WixBundleRollbackLog_PackageA" ProductCode="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Language="1033" Version="1.0.0.0" UpgradeCode="{DB87BB66-FE5D-4293-81AC-EE313D3F864B}">
55 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" /> 55 <MsiProperty Id="ARPSYSTEMCOMPONENT" Value="1" />
56 <MsiProperty Id="MSIFASTINSTALL" Value="7" /> 56 <MsiProperty Id="MSIFASTINSTALL" Value="7" />
57 <Provides Key="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Version="1.0.0.0" DisplayName="~SlipstreamTests - PackageA" /> 57 <Provides Key="{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}" Version="1.0.0.0" DisplayName="~SlipstreamTests - PackageA" />
diff --git a/src/burn/test/BurnUnitTest/VariableHelpers.cpp b/src/burn/test/BurnUnitTest/VariableHelpers.cpp
index 40f958f8..b1106492 100644
--- a/src/burn/test/BurnUnitTest/VariableHelpers.cpp
+++ b/src/burn/test/BurnUnitTest/VariableHelpers.cpp
@@ -7,11 +7,7 @@ using namespace System;
7using namespace Xunit; 7using namespace Xunit;
8 8
9 9
10namespace Microsoft 10namespace WixToolset
11{
12namespace Tools
13{
14namespace WindowsInstallerXml
15{ 11{
16namespace Test 12namespace Test
17{ 13{
@@ -213,5 +209,3 @@ namespace Bootstrapper
213} 209}
214} 210}
215} 211}
216}
217}
diff --git a/src/burn/test/BurnUnitTest/VariableHelpers.h b/src/burn/test/BurnUnitTest/VariableHelpers.h
index d460c60f..4783c48c 100644
--- a/src/burn/test/BurnUnitTest/VariableHelpers.h
+++ b/src/burn/test/BurnUnitTest/VariableHelpers.h
@@ -2,11 +2,7 @@
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. 2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3 3
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -32,5 +28,3 @@ int VariableGetTypeHelper(BURN_VARIABLES* pVariables, LPCWSTR wzVariable);
32} 28}
33} 29}
34} 30}
35}
36}
diff --git a/src/burn/test/BurnUnitTest/VariableTest.cpp b/src/burn/test/BurnUnitTest/VariableTest.cpp
index 2e2c36c9..7bd6f20a 100644
--- a/src/burn/test/BurnUnitTest/VariableTest.cpp
+++ b/src/burn/test/BurnUnitTest/VariableTest.cpp
@@ -4,11 +4,7 @@
4#undef GetTempPath 4#undef GetTempPath
5#undef GetEnvironmentVariable 5#undef GetEnvironmentVariable
6 6
7namespace Microsoft 7namespace WixToolset
8{
9namespace Tools
10{
11namespace WindowsInstallerXml
12{ 8{
13namespace Test 9namespace Test
14{ 10{
@@ -618,5 +614,3 @@ namespace Bootstrapper
618} 614}
619} 615}
620} 616}
621}
622}
diff --git a/src/burn/test/BurnUnitTest/VariantTest.cpp b/src/burn/test/BurnUnitTest/VariantTest.cpp
index 035864cf..8dd44a5d 100644
--- a/src/burn/test/BurnUnitTest/VariantTest.cpp
+++ b/src/burn/test/BurnUnitTest/VariantTest.cpp
@@ -2,11 +2,7 @@
2 2
3#include "precomp.h" 3#include "precomp.h"
4 4
5namespace Microsoft 5namespace WixToolset
6{
7namespace Tools
8{
9namespace WindowsInstallerXml
10{ 6{
11namespace Test 7namespace Test
12{ 8{
@@ -215,5 +211,3 @@ namespace Bootstrapper
215} 211}
216} 212}
217} 213}
218}
219}