@joebigelow / wix-1 / commits / eae94502

Plan each dependency provider individually.

Refactoring for #6510

Sean Hall committed Jan 31, 2022 at 16:19 UTC eae94502fe8e7ca601161360a7d31e93edc88763
9 files changed +187 -113
src/burn/engine/apply.cpp
+11 -6
@@ -252,7 +252,8 @@ static HRESULT ExecuteMsuPackage(
252 static HRESULT ExecutePackageProviderAction(
253 __in BURN_ENGINE_STATE* pEngineState,
254 __in BURN_EXECUTE_ACTION* pAction,
255 - __in BURN_EXECUTE_CONTEXT* pContext
255 + __in BURN_EXECUTE_CONTEXT* pContext,
256 + __in BOOL fRollback
257 );
258 static HRESULT ExecuteDependencyAction(
259 __in BURN_ENGINE_STATE* pEngineState,
@@ -2351,7 +2352,7 @@ static HRESULT DoExecuteAction(
2352 break;
2353
2354 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER:
2354 - hr = ExecutePackageProviderAction(pEngineState, pExecuteAction, pContext);
2355 + hr = ExecutePackageProviderAction(pEngineState, pExecuteAction, pContext, FALSE);
2356 ExitOnFailure(hr, "Failed to execute package provider registration action.");
2357 break;
2358
@@ -2474,7 +2475,7 @@ static HRESULT DoRollbackActions(
2475 break;
2476
2477 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER:
2477 - hr = ExecutePackageProviderAction(pEngineState, pRollbackAction, pContext);
2478 + hr = ExecutePackageProviderAction(pEngineState, pRollbackAction, pContext, TRUE);
2479 IgnoreRollbackError(hr, "Failed to rollback package provider action.");
2480 break;
2481
@@ -2887,19 +2888,23 @@ LExit:
2888 static HRESULT ExecutePackageProviderAction(
2889 __in BURN_ENGINE_STATE* pEngineState,
2890 __in BURN_EXECUTE_ACTION* pAction,
2890 - __in BURN_EXECUTE_CONTEXT* /*pContext*/
2891 + __in BURN_EXECUTE_CONTEXT* pContext,
2892 + __in BOOL fRollback
2893 )
2894 {
2895 HRESULT hr = S_OK;
2896
2897 + Assert(pContext->fRollback == fRollback);
2898 + UNREFERENCED_PARAMETER(pContext);
2899 +
2900 if (pAction->packageProvider.pPackage->fPerMachine)
2901 {
2897 - hr = ElevationExecutePackageProviderAction(pEngineState->companionConnection.hPipe, pAction);
2902 + hr = ElevationExecutePackageProviderAction(pEngineState->companionConnection.hPipe, pAction, fRollback);
2903 ExitOnFailure(hr, "Failed to register the package provider on per-machine package.");
2904 }
2905 else
2906 {
2902 - hr = DependencyExecutePackageProviderAction(pAction);
2907 + hr = DependencyExecutePackageProviderAction(pAction, fRollback);
2908 ExitOnFailure(hr, "Failed to register the package provider on per-user package.");
2909 }
2910
src/burn/engine/dependency.cpp
+75 -57
@@ -59,11 +59,17 @@ static LPCWSTR GetPackageProviderId(
59 );
60
61 static HRESULT RegisterPackageProvider(
62 - __in const BURN_PACKAGE* pPackage
62 + __in const BURN_DEPENDENCY_PROVIDER* pProvider,
63 + __in LPCWSTR wzPackageId,
64 + __in LPCWSTR wzPackageProviderId,
65 + __in HKEY hkRoot,
66 + __in BOOL fVital
67 );
68
69 static void UnregisterPackageProvider(
66 - __in const BURN_PACKAGE* pPackage
70 + __in const BURN_DEPENDENCY_PROVIDER* pProvider,
71 + __in LPCWSTR wzPackageId,
72 + __in HKEY hkRoot
73 );
74
75 static HRESULT RegisterPackageDependency(
@@ -489,6 +495,8 @@ extern "C" HRESULT DependencyPlanPackageBegin(
495 {
496 pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE;
497 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
498 +
499 + // Assume the compatible package has the same exact providers.
500 pPackage->compatiblePackage.fRemove = FALSE;
501 }
502 else
@@ -511,8 +519,22 @@ extern "C" HRESULT DependencyPlanPackageBegin(
519
520 if (!fAllImportedProviders)
521 {
514 - pPackage->providerExecute = dependencyExecuteAction;
515 - pPackage->providerRollback = dependencyRollbackAction;
522 + for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
523 + {
524 + BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i];
525 + pProvider->providerExecute = dependencyExecuteAction;
526 + pProvider->providerRollback = dependencyRollbackAction;
527 + }
528 +
529 + if (BURN_DEPENDENCY_ACTION_NONE != dependencyExecuteAction)
530 + {
531 + pPackage->fProviderExecute = TRUE;
532 + }
533 +
534 + if (BURN_DEPENDENCY_ACTION_NONE != dependencyRollbackAction)
535 + {
536 + pPackage->fProviderRollback = TRUE;
537 + }
538 }
539 }
540
@@ -556,14 +578,13 @@ extern "C" HRESULT DependencyPlanPackage(
578 }
579
580 // Add the provider rollback plan.
559 - if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerRollback)
581 + if (pPackage->fProviderRollback)
582 {
583 hr = PlanAppendRollbackAction(pPlan, &pAction);
584 ExitOnFailure(hr, "Failed to append provider rollback action.");
585
586 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER;
587 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage);
566 - pAction->packageProvider.action = pPackage->providerRollback;
588
589 // Put a checkpoint before the execute action so that rollback happens
590 // if execute fails.
@@ -573,7 +594,7 @@ extern "C" HRESULT DependencyPlanPackage(
594
595 // Add the provider execute plan. This comes after rollback so if something goes wrong
596 // rollback will try to clean up after us.
576 - if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerExecute)
597 + if (pPackage->fProviderExecute)
598 {
599 if (NULL != pdwInsertSequence)
600 {
@@ -592,7 +613,6 @@ extern "C" HRESULT DependencyPlanPackage(
613
614 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER;
615 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage);
595 - pAction->packageProvider.action = pPackage->providerExecute;
616 }
617
618 LExit:
@@ -627,26 +647,39 @@ LExit:
647 }
648
649 extern "C" HRESULT DependencyExecutePackageProviderAction(
630 - __in const BURN_EXECUTE_ACTION* pAction
650 + __in const BURN_EXECUTE_ACTION* pAction,
651 + __in BOOL fRollback
652 )
653 {
654 AssertSz(BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER == pAction->type, "Execute action type not supported by this function.");
655
656 HRESULT hr = S_OK;
657 const BURN_PACKAGE* pPackage = pAction->packageProvider.pPackage;
658 + HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
659 + LPCWSTR wzId = GetPackageProviderId(pPackage);
660
638 - // Register or unregister the package provider(s).
639 - if (BURN_DEPENDENCY_ACTION_REGISTER == pAction->packageProvider.action)
640 - {
641 - hr = RegisterPackageProvider(pPackage);
642 - ExitOnFailure(hr, "Failed to register the package providers.");
643 - }
644 - else if (BURN_DEPENDENCY_ACTION_UNREGISTER == pAction->packageProvider.action)
661 + for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
662 {
646 - UnregisterPackageProvider(pPackage);
663 + const BURN_DEPENDENCY_PROVIDER* pProvider = pPackage->rgDependencyProviders + i;
664 + BURN_DEPENDENCY_ACTION action = fRollback ? pProvider->providerRollback : pProvider->providerExecute;
665 + HRESULT hrProvider = S_OK;
666 +
667 + // Register or unregister the package provider.
668 + switch (action)
669 + {
670 + case BURN_DEPENDENCY_ACTION_REGISTER:
671 + hrProvider = RegisterPackageProvider(pProvider, pPackage->sczId, wzId, hkRoot, pPackage->fVital);
672 + if (SUCCEEDED(hr) && FAILED(hrProvider))
673 + {
674 + hr = hrProvider;
675 + }
676 + break;
677 + case BURN_DEPENDENCY_ACTION_UNREGISTER:
678 + UnregisterPackageProvider(pProvider, pPackage->sczId, hkRoot);
679 + break;
680 + }
681 }
682
649 -LExit:
683 if (!pPackage->fVital)
684 {
685 hr = S_OK;
@@ -1175,7 +1208,7 @@ static void CalculateDependencyActionStates(
1208 case BOOTSTRAPPER_ACTION_STATE_INSTALL: __fallthrough;
1209 case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough;
1210 case BOOTSTRAPPER_ACTION_STATE_REPAIR: __fallthrough;
1178 - case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE: __fallthrough;
1211 + case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE:
1212 *pDependencyExecuteAction = BURN_DEPENDENCY_ACTION_REGISTER;
1213 break;
1214 }
@@ -1188,7 +1221,7 @@ static void CalculateDependencyActionStates(
1221 switch (pPackage->currentState)
1222 {
1223 case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough;
1191 - case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: __fallthrough;
1224 + case BOOTSTRAPPER_PACKAGE_STATE_ABSENT:
1225 *pDependencyRollbackAction = BURN_DEPENDENCY_ACTION_UNREGISTER;
1226 break;
1227 }
@@ -1291,32 +1324,25 @@ static LPCWSTR GetPackageProviderId(
1324 }
1325
1326 static HRESULT RegisterPackageProvider(
1294 - __in const BURN_PACKAGE* pPackage
1327 + __in const BURN_DEPENDENCY_PROVIDER* pProvider,
1328 + __in LPCWSTR wzPackageId,
1329 + __in LPCWSTR wzPackageProviderId,
1330 + __in HKEY hkRoot,
1331 + __in BOOL fVital
1332 )
1333 {
1334 HRESULT hr = S_OK;
1335
1299 - if (pPackage->rgDependencyProviders)
1336 + if (!pProvider->fImported)
1337 {
1301 - HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1302 - LPCWSTR wzId = GetPackageProviderId(pPackage);
1303 -
1304 - for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
1305 - {
1306 - const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i];
1307 -
1308 - if (!pProvider->fImported)
1309 - {
1310 - LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_REGISTER, pProvider->sczKey, pProvider->sczVersion, pPackage->sczId);
1338 + LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_REGISTER, pProvider->sczKey, pProvider->sczVersion, wzPackageId);
1339
1312 - hr = DepRegisterDependency(hkRoot, pProvider->sczKey, pProvider->sczVersion, pProvider->sczDisplayName, wzId, 0);
1313 - ExitOnFailure(hr, "Failed to register the package dependency provider: %ls", pProvider->sczKey);
1314 - }
1315 - }
1340 + hr = DepRegisterDependency(hkRoot, pProvider->sczKey, pProvider->sczVersion, pProvider->sczDisplayName, wzPackageProviderId, 0);
1341 + ExitOnFailure(hr, "Failed to register the package dependency provider: %ls", pProvider->sczKey);
1342 }
1343
1344 LExit:
1319 - if (!pPackage->fVital)
1345 + if (!fVital)
1346 {
1347 hr = S_OK;
1348 }
@@ -1325,36 +1351,28 @@ LExit:
1351 }
1352
1353 /********************************************************************
1328 - UnregisterPackageProvider - Removes each dependency provider
1329 - for the package (if not imported from the package itself).
1354 + UnregisterPackageProvider - Removes the dependency provider.
1355
1356 Note: Does not check for existing dependents before removing the key.
1357 *********************************************************************/
1358 static void UnregisterPackageProvider(
1334 - __in const BURN_PACKAGE* pPackage
1359 + __in const BURN_DEPENDENCY_PROVIDER* pProvider,
1360 + __in LPCWSTR wzPackageId,
1361 + __in HKEY hkRoot
1362 )
1363 {
1364 HRESULT hr = S_OK;
1338 - HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1365
1340 - if (pPackage->rgDependencyProviders)
1366 + if (!pProvider->fImported)
1367 {
1342 - for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
1368 + hr = DepUnregisterDependency(hkRoot, pProvider->sczKey);
1369 + if (SUCCEEDED(hr))
1370 {
1344 - const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i];
1345 -
1346 - if (!pProvider->fImported)
1347 - {
1348 - hr = DepUnregisterDependency(hkRoot, pProvider->sczKey);
1349 - if (SUCCEEDED(hr))
1350 - {
1351 - LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED, pProvider->sczKey, pPackage->sczId);
1352 - }
1353 - else if (FAILED(hr) && E_FILENOTFOUND != hr)
1354 - {
1355 - LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_FAILED, pProvider->sczKey, pPackage->sczId, hr);
1356 - }
1357 - }
1371 + LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED, pProvider->sczKey, wzPackageId);
1372 + }
1373 + else if (FAILED(hr) && E_FILENOTFOUND != hr)
1374 + {
1375 + LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_FAILED, pProvider->sczKey, wzPackageId, hr);
1376 }
1377 }
1378 }
src/burn/engine/dependency.h
+2 -1
@@ -150,7 +150,8 @@ HRESULT DependencyPlanPackageComplete(
150
151 *********************************************************************/
152 HRESULT DependencyExecutePackageProviderAction(
153 - __in const BURN_EXECUTE_ACTION* pAction
153 + __in const BURN_EXECUTE_ACTION* pAction,
154 + __in BOOL fRollback
155 );
156
157 /********************************************************************
src/burn/engine/elevation.cpp
+35 -10
@@ -1305,7 +1305,8 @@ LExit:
1305
1306 extern "C" HRESULT ElevationExecutePackageProviderAction(
1307 __in HANDLE hPipe,
1308 - __in BURN_EXECUTE_ACTION* pExecuteAction
1308 + __in BURN_EXECUTE_ACTION* pExecuteAction,
1309 + __in BOOL fRollback
1310 )
1311 {
1312 HRESULT hr = S_OK;
@@ -1318,8 +1319,17 @@ extern "C" HRESULT ElevationExecutePackageProviderAction(
1319 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->packageProvider.pPackage->sczId);
1320 ExitOnFailure(hr, "Failed to write package id to message buffer.");
1321
1321 - hr = BuffWriteNumber(&pbData, &cbData, pExecuteAction->packageProvider.action);
1322 - ExitOnFailure(hr, "Failed to write action to message buffer.");
1322 + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)fRollback);
1323 + ExitOnFailure(hr, "Failed to write rollback flag to message buffer.");
1324 +
1325 + // Provider actions.
1326 + for (DWORD i = 0; i < pExecuteAction->packageProvider.pPackage->cDependencyProviders; ++i)
1327 + {
1328 + BURN_DEPENDENCY_PROVIDER* pProvider = pExecuteAction->packageProvider.pPackage->rgDependencyProviders + i;
1329 + BURN_DEPENDENCY_ACTION* pAction = fRollback ? &pProvider->providerRollback : &pProvider->providerExecute;
1330 + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)*pAction);
1331 + ExitOnFailure(hr, "Failed to write provider action to message buffer.");
1332 + }
1333
1334 // Send the message.
1335 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PACKAGE_PROVIDER, pbData, cbData, NULL, NULL, &dwResult);
@@ -2840,7 +2850,7 @@ static HRESULT OnExecuteMsiPackage(
2850 SIZE_T iData = 0;
2851 LPWSTR sczPackage = NULL;
2852 HWND hwndParent = NULL;
2843 - BOOL fRollback = 0;
2853 + BOOL fRollback = FALSE;
2854 BURN_EXECUTE_ACTION executeAction = { };
2855 BOOTSTRAPPER_APPLY_RESTART msiRestart = BOOTSTRAPPER_APPLY_RESTART_NONE;
2856
@@ -2946,7 +2956,7 @@ static HRESULT OnExecuteMspPackage(
2956 SIZE_T iData = 0;
2957 LPWSTR sczPackage = NULL;
2958 HWND hwndParent = NULL;
2949 - BOOL fRollback = 0;
2959 + BOOL fRollback = FALSE;
2960 BURN_EXECUTE_ACTION executeAction = { };
2961 BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE;
2962
@@ -3117,7 +3127,7 @@ static HRESULT OnUninstallMsiCompatiblePackage(
3127 LPWSTR sczPackageId = NULL;
3128 LPWSTR sczCompatiblePackageId = NULL;
3129 HWND hwndParent = NULL;
3120 - BOOL fRollback = 0;
3130 + BOOL fRollback = FALSE;
3131 BURN_EXECUTE_ACTION executeAction = { };
3132 BURN_PACKAGE* pPackage = NULL;
3133 BURN_COMPATIBLE_PACKAGE* pCompatiblePackage = NULL;
@@ -3195,6 +3205,7 @@ static HRESULT OnExecutePackageProviderAction(
3205 HRESULT hr = S_OK;
3206 SIZE_T iData = 0;
3207 LPWSTR sczPackage = NULL;
3208 + BOOL fRollback = FALSE;
3209 BURN_EXECUTE_ACTION executeAction = { };
3210
3211 executeAction.type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER;
@@ -3203,9 +3214,6 @@ static HRESULT OnExecutePackageProviderAction(
3214 hr = BuffReadString(pbData, cbData, &iData, &sczPackage);
3215 ExitOnFailure(hr, "Failed to read package id from message buffer.");
3216
3206 - hr = BuffReadNumber(pbData, cbData, &iData, reinterpret_cast<DWORD*>(&executeAction.packageProvider.action));
3207 - ExitOnFailure(hr, "Failed to read action.");
3208 -
3217 // Find the package again.
3218 hr = PackageFindById(pPackages, sczPackage, &executeAction.packageProvider.pPackage);
3219 if (E_NOTFOUND == hr)
@@ -3214,8 +3222,25 @@ static HRESULT OnExecutePackageProviderAction(
3222 }
3223 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3224
3225 + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&fRollback);
3226 + ExitOnFailure(hr, "Failed to read rollback flag.");
3227 +
3228 + // Read provider actions.
3229 + for (DWORD i = 0; i < executeAction.packageProvider.pPackage->cDependencyProviders; ++i)
3230 + {
3231 + BURN_DEPENDENCY_PROVIDER* pProvider = executeAction.packageProvider.pPackage->rgDependencyProviders + i;
3232 + BURN_DEPENDENCY_ACTION* pAction = fRollback ? &pProvider->providerRollback : &pProvider->providerExecute;
3233 + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)pAction);
3234 + ExitOnFailure(hr, "Failed to read provider action.");
3235 + }
3236 +
3237 + if (!executeAction.packageProvider.pPackage->fPerMachine)
3238 + {
3239 + ExitWithRootFailure(hr, E_INVALIDARG, "ExecutePackageProviderAction called for per-user package.");
3240 + }
3241 +
3242 // Execute the package provider action.
3218 - hr = DependencyExecutePackageProviderAction(&executeAction);
3243 + hr = DependencyExecutePackageProviderAction(&executeAction, fRollback);
3244 ExitOnFailure(hr, "Failed to execute package provider action.");
3245
3246 LExit:
src/burn/engine/elevation.h
+2 -1
@@ -139,7 +139,8 @@ HRESULT ElevationUninstallMsiCompatiblePackage(
139 );
140 HRESULT ElevationExecutePackageProviderAction(
141 __in HANDLE hPipe,
142 - __in BURN_EXECUTE_ACTION* pExecuteAction
142 + __in BURN_EXECUTE_ACTION* pExecuteAction,
143 + __in BOOL fRollback
144 );
145 HRESULT ElevationExecutePackageDependencyAction(
146 __in HANDLE hPipe,
src/burn/engine/package.h
+5 -2
@@ -195,6 +195,9 @@ typedef struct _BURN_DEPENDENCY_PROVIDER
195
196 DEPENDENCY* rgDependents; // only valid after Detect.
197 UINT cDependents; // only valid after Detect.
198 +
199 + BURN_DEPENDENCY_ACTION providerExecute; // only valid during Plan.
200 + BURN_DEPENDENCY_ACTION providerRollback; // only valid during Plan.
201 } BURN_DEPENDENCY_PROVIDER;
202
203 typedef struct _BURN_ROLLBACK_BOUNDARY
@@ -267,8 +270,8 @@ typedef struct _BURN_PACKAGE
270 BOOL fPlannedUncache; // only valid during Plan.
271 BOOTSTRAPPER_ACTION_STATE execute; // only valid during Plan.
272 BOOTSTRAPPER_ACTION_STATE rollback; // only valid during Plan.
270 - BURN_DEPENDENCY_ACTION providerExecute; // only valid during Plan.
271 - BURN_DEPENDENCY_ACTION providerRollback; // only valid during Plan.
273 + BOOL fProviderExecute; // only valid during Plan.
274 + BOOL fProviderRollback; // only valid during Plan.
275 BURN_DEPENDENCY_ACTION dependencyExecute; // only valid during Plan.
276 BURN_DEPENDENCY_ACTION dependencyRollback; // only valid during Plan.
277 BOOL fDependencyManagerWasHere; // only valid during Plan.
src/burn/engine/plan.cpp
+16 -3
@@ -1922,8 +1922,8 @@ static void ResetPlannedPackageState(
1922 pPackage->fPlannedUncache = FALSE;
1923 pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE;
1924 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
1925 - pPackage->providerExecute = BURN_DEPENDENCY_ACTION_NONE;
1926 - pPackage->providerRollback = BURN_DEPENDENCY_ACTION_NONE;
1925 + pPackage->fProviderExecute = FALSE;
1926 + pPackage->fProviderRollback = FALSE;
1927 pPackage->dependencyExecute = BURN_DEPENDENCY_ACTION_NONE;
1928 pPackage->dependencyRollback = BURN_DEPENDENCY_ACTION_NONE;
1929 pPackage->fDependencyManagerWasHere = FALSE;
@@ -1969,6 +1969,14 @@ static void ResetPlannedPackageState(
1969 }
1970 }
1971
1972 + for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
1973 + {
1974 + BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i];
1975 +
1976 + pProvider->providerExecute = BURN_DEPENDENCY_ACTION_NONE;
1977 + pProvider->providerRollback = BURN_DEPENDENCY_ACTION_NONE;
1978 + }
1979 +
1980 ResetPlannedPayloadGroupState(&pPackage->payloads);
1981 }
1982
@@ -2637,7 +2645,12 @@ static void ExecuteActionLog(
2645 break;
2646
2647 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER:
2640 - LogStringLine(PlanDumpLevel, "%ls action[%u]: PACKAGE_PROVIDER package id: %ls, action: %hs", wzBase, iAction, pAction->packageProvider.pPackage->sczId, LoggingDependencyActionToString(pAction->packageProvider.action));
2648 + LogStringLine(PlanDumpLevel, "%ls action[%u]: PACKAGE_PROVIDER package id: %ls", wzBase, iAction, pAction->packageProvider.pPackage->sczId);
2649 + for (DWORD j = 0; j < pAction->packageProvider.pPackage->cDependencyProviders; ++j)
2650 + {
2651 + const BURN_DEPENDENCY_PROVIDER* pProvider = pAction->packageProvider.pPackage->rgDependencyProviders + j;
2652 + LogStringLine(PlanDumpLevel, " Provider[%u]: key: %ls, action: %hs", j, pProvider->sczKey, LoggingDependencyActionToString(fRollback ? pProvider->providerRollback : pProvider->providerExecute));
2653 + }
2654 break;
2655
2656 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY:
src/burn/engine/plan.h
-1
@@ -208,7 +208,6 @@ typedef struct _BURN_EXECUTE_ACTION
208 struct
209 {
210 BURN_PACKAGE* pPackage;
211 - BURN_DEPENDENCY_ACTION action;
211 } packageProvider;
212 struct
213 {
src/burn/test/BurnUnitTest/PlanTest.cpp
+41 -32
@@ -18,6 +18,9 @@ static BOOTSTRAPPER_REQUEST_STATE vPackageRequestState = BOOTSTRAPPER_REQUEST_ST
18 static BOOL vfUseRelatedBundleRequestState = FALSE;
19 static BOOTSTRAPPER_REQUEST_STATE vRelatedBundleRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE;
20
21 +static BURN_DEPENDENCY_ACTION registerActions1[] = { BURN_DEPENDENCY_ACTION_REGISTER };
22 +static BURN_DEPENDENCY_ACTION unregisterActions1[] = { BURN_DEPENDENCY_ACTION_UNREGISTER };
23 +
24 namespace Microsoft
25 {
26 namespace Tools
@@ -90,7 +93,7 @@ namespace Bootstrapper
93 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
94 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
95 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
93 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
96 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", registerActions1, 1);
97 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
98 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
99 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -105,7 +108,7 @@ namespace Bootstrapper
108 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
109 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageB");
110 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
108 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_REGISTER);
111 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", registerActions1, 1);
112 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
113 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
114 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
@@ -114,7 +117,7 @@ namespace Bootstrapper
117 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
118 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageC");
119 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
117 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_REGISTER);
120 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", registerActions1, 1);
121 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
122 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
123 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
@@ -131,7 +134,7 @@ namespace Bootstrapper
134 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
135 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
136 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
134 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
137 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
138 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
139 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
140 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -145,7 +148,7 @@ namespace Bootstrapper
148 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageB");
149 dwExecuteCheckpointId += 1; // cache checkpoints
150 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
148 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_UNREGISTER);
151 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", unregisterActions1, 1);
152 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
153 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
154 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -153,7 +156,7 @@ namespace Bootstrapper
156 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageC");
157 dwExecuteCheckpointId += 1; // cache checkpoints
158 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
156 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_UNREGISTER);
159 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", unregisterActions1, 1);
160 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
161 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
162 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -217,13 +220,13 @@ namespace Bootstrapper
220 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
221 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
222 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
220 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_UNREGISTER);
223 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", unregisterActions1, 1);
224 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
225 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
226 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
227 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
228 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
226 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_UNREGISTER);
229 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", unregisterActions1, 1);
230 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
231 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
232 ValidateExecuteCommitMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ");
@@ -233,7 +236,7 @@ namespace Bootstrapper
236 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
237 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
238 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
236 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
239 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
240 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
241 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
242 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -248,12 +251,12 @@ namespace Bootstrapper
251 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
252 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
253 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
251 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_REGISTER);
254 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", registerActions1, 1);
255 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
256 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
257 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
258 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
256 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_REGISTER);
259 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", registerActions1, 1);
260 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
261 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
262 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -261,7 +264,7 @@ namespace Bootstrapper
264 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
265 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
266 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
264 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
267 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", registerActions1, 1);
268 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
269 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
270 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -327,7 +330,7 @@ namespace Bootstrapper
330 DWORD dwExecuteCheckpointId = 1;
331 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
332 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
330 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
333 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
334 ValidateUninstallMsiCompatiblePackage(pPlan, fRollback, dwIndex++, L"PackageA", 0);
335 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
336 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -404,7 +407,7 @@ namespace Bootstrapper
407 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
408 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
409 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
407 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
410 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", registerActions1, 1);
411 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
412 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
413 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -420,7 +423,7 @@ namespace Bootstrapper
423 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
424 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
425 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
423 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
426 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
427 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
428 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
429 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -498,7 +501,7 @@ namespace Bootstrapper
501 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
502 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
503 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
501 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
504 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
505 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
506 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
507 ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
@@ -559,7 +562,7 @@ namespace Bootstrapper
562 DWORD dwExecuteCheckpointId = 1;
563 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
564 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
562 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
565 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
566 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
567 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
568 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -637,7 +640,7 @@ namespace Bootstrapper
640 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
641 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
642 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
640 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
643 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", registerActions1, 1);
644 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
645 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
646 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -713,7 +716,7 @@ namespace Bootstrapper
716 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
717 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
718 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
716 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
719 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", registerActions1, 1);
720 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
721 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
722 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -730,7 +733,7 @@ namespace Bootstrapper
733 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
734 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
735 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
733 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
736 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
737 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
738 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
739 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -854,7 +857,7 @@ namespace Bootstrapper
857 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
858 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
859 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
857 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
860 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
861 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
862 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
863 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -868,7 +871,7 @@ namespace Bootstrapper
871 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
872 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
873 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
871 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
874 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", registerActions1, 1);
875 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
876 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
877 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -1011,14 +1014,14 @@ namespace Bootstrapper
1014 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1015 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageA");
1016 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1014 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
1017 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", registerActions1, 1);
1018 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1019 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
1020 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1021 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
1022 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1023 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1021 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_REGISTER);
1024 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", registerActions1, 1);
1025 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);
1026 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
1027 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -1037,14 +1040,14 @@ namespace Bootstrapper
1040 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1041 dwExecuteCheckpointId += 1; // cache checkpoints
1042 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1040 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
1043 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
1044 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1045 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
1046 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1047 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
1048 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1049 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1047 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_UNREGISTER);
1050 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", unregisterActions1, 1);
1051 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1052 pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, TRUE);
1053 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
@@ -1108,14 +1111,14 @@ namespace Bootstrapper
1111 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1112 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
1113 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1111 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_UNREGISTER);
1114 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", unregisterActions1, 1);
1115 pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, TRUE);
1116 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
1117 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1118 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1119 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
1120 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1118 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
1121 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", unregisterActions1, 1);
1122 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1123 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
1124 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -1129,14 +1132,14 @@ namespace Bootstrapper
1132 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
1133 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
1134 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1132 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_REGISTER);
1135 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", registerActions1, 1);
1136 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1137 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);
1138 ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
1139 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1140 ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
1141 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1139 - ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
1142 + ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", registerActions1, 1);
1143 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
1144 ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
1145 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -1711,13 +1714,19 @@ namespace Bootstrapper
1714 __in BOOL fRollback,
1715 __in DWORD dwIndex,
1716 __in LPCWSTR wzPackageId,
1714 - __in BURN_DEPENDENCY_ACTION action
1717 + __in BURN_DEPENDENCY_ACTION* rgActions,
1718 + __in DWORD cActions
1719 )
1720 {
1721 BURN_EXECUTE_ACTION* pAction = ValidateExecuteActionExists(pPlan, fRollback, dwIndex);
1722 Assert::Equal<DWORD>(BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER, pAction->type);
1723 NativeAssert::StringEqual(wzPackageId, pAction->packageProvider.pPackage->sczId);
1720 - Assert::Equal<DWORD>(action, pAction->packageProvider.action);
1724 + Assert::Equal<DWORD>(cActions, pAction->packageProvider.pPackage->cDependencyProviders);
1725 + for (DWORD i = 0; i < cActions; ++i)
1726 + {
1727 + const BURN_DEPENDENCY_PROVIDER* pProvider = pAction->packageProvider.pPackage->rgDependencyProviders + i;
1728 + Assert::Equal<DWORD>(rgActions[i], fRollback ? pProvider->providerRollback : pProvider->providerExecute);
1729 + }
1730 Assert::Equal<BOOL>(FALSE, pAction->fDeleted);
1731 }
1732