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