aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine')
-rw-r--r--src/burn/engine/apply.cpp17
-rw-r--r--src/burn/engine/dependency.cpp132
-rw-r--r--src/burn/engine/dependency.h3
-rw-r--r--src/burn/engine/elevation.cpp45
-rw-r--r--src/burn/engine/elevation.h3
-rw-r--r--src/burn/engine/package.h7
-rw-r--r--src/burn/engine/plan.cpp19
-rw-r--r--src/burn/engine/plan.h1
8 files changed, 146 insertions, 81 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp
index 9185e33a..2168cba6 100644
--- a/src/burn/engine/apply.cpp
+++ b/src/burn/engine/apply.cpp
@@ -252,7 +252,8 @@ static HRESULT ExecuteMsuPackage(
252static HRESULT ExecutePackageProviderAction( 252static HRESULT ExecutePackageProviderAction(
253 __in BURN_ENGINE_STATE* pEngineState, 253 __in BURN_ENGINE_STATE* pEngineState,
254 __in BURN_EXECUTE_ACTION* pAction, 254 __in BURN_EXECUTE_ACTION* pAction,
255 __in BURN_EXECUTE_CONTEXT* pContext 255 __in BURN_EXECUTE_CONTEXT* pContext,
256 __in BOOL fRollback
256 ); 257 );
257static HRESULT ExecuteDependencyAction( 258static HRESULT ExecuteDependencyAction(
258 __in BURN_ENGINE_STATE* pEngineState, 259 __in BURN_ENGINE_STATE* pEngineState,
@@ -2351,7 +2352,7 @@ static HRESULT DoExecuteAction(
2351 break; 2352 break;
2352 2353
2353 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER: 2354 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER:
2354 hr = ExecutePackageProviderAction(pEngineState, pExecuteAction, pContext); 2355 hr = ExecutePackageProviderAction(pEngineState, pExecuteAction, pContext, FALSE);
2355 ExitOnFailure(hr, "Failed to execute package provider registration action."); 2356 ExitOnFailure(hr, "Failed to execute package provider registration action.");
2356 break; 2357 break;
2357 2358
@@ -2474,7 +2475,7 @@ static HRESULT DoRollbackActions(
2474 break; 2475 break;
2475 2476
2476 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER: 2477 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER:
2477 hr = ExecutePackageProviderAction(pEngineState, pRollbackAction, pContext); 2478 hr = ExecutePackageProviderAction(pEngineState, pRollbackAction, pContext, TRUE);
2478 IgnoreRollbackError(hr, "Failed to rollback package provider action."); 2479 IgnoreRollbackError(hr, "Failed to rollback package provider action.");
2479 break; 2480 break;
2480 2481
@@ -2887,19 +2888,23 @@ LExit:
2887static HRESULT ExecutePackageProviderAction( 2888static HRESULT ExecutePackageProviderAction(
2888 __in BURN_ENGINE_STATE* pEngineState, 2889 __in BURN_ENGINE_STATE* pEngineState,
2889 __in BURN_EXECUTE_ACTION* pAction, 2890 __in BURN_EXECUTE_ACTION* pAction,
2890 __in BURN_EXECUTE_CONTEXT* /*pContext*/ 2891 __in BURN_EXECUTE_CONTEXT* pContext,
2892 __in BOOL fRollback
2891 ) 2893 )
2892{ 2894{
2893 HRESULT hr = S_OK; 2895 HRESULT hr = S_OK;
2894 2896
2897 Assert(pContext->fRollback == fRollback);
2898 UNREFERENCED_PARAMETER(pContext);
2899
2895 if (pAction->packageProvider.pPackage->fPerMachine) 2900 if (pAction->packageProvider.pPackage->fPerMachine)
2896 { 2901 {
2897 hr = ElevationExecutePackageProviderAction(pEngineState->companionConnection.hPipe, pAction); 2902 hr = ElevationExecutePackageProviderAction(pEngineState->companionConnection.hPipe, pAction, fRollback);
2898 ExitOnFailure(hr, "Failed to register the package provider on per-machine package."); 2903 ExitOnFailure(hr, "Failed to register the package provider on per-machine package.");
2899 } 2904 }
2900 else 2905 else
2901 { 2906 {
2902 hr = DependencyExecutePackageProviderAction(pAction); 2907 hr = DependencyExecutePackageProviderAction(pAction, fRollback);
2903 ExitOnFailure(hr, "Failed to register the package provider on per-user package."); 2908 ExitOnFailure(hr, "Failed to register the package provider on per-user package.");
2904 } 2909 }
2905 2910
diff --git a/src/burn/engine/dependency.cpp b/src/burn/engine/dependency.cpp
index e94b0e93..8f568f28 100644
--- a/src/burn/engine/dependency.cpp
+++ b/src/burn/engine/dependency.cpp
@@ -59,11 +59,17 @@ static LPCWSTR GetPackageProviderId(
59 ); 59 );
60 60
61static HRESULT RegisterPackageProvider( 61static 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
63 ); 67 );
64 68
65static void UnregisterPackageProvider( 69static void UnregisterPackageProvider(
66 __in const BURN_PACKAGE* pPackage 70 __in const BURN_DEPENDENCY_PROVIDER* pProvider,
71 __in LPCWSTR wzPackageId,
72 __in HKEY hkRoot
67 ); 73 );
68 74
69static HRESULT RegisterPackageDependency( 75static HRESULT RegisterPackageDependency(
@@ -489,6 +495,8 @@ extern "C" HRESULT DependencyPlanPackageBegin(
489 { 495 {
490 pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE; 496 pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE;
491 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; 497 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
498
499 // Assume the compatible package has the same exact providers.
492 pPackage->compatiblePackage.fRemove = FALSE; 500 pPackage->compatiblePackage.fRemove = FALSE;
493 } 501 }
494 else 502 else
@@ -511,8 +519,22 @@ extern "C" HRESULT DependencyPlanPackageBegin(
511 519
512 if (!fAllImportedProviders) 520 if (!fAllImportedProviders)
513 { 521 {
514 pPackage->providerExecute = dependencyExecuteAction; 522 for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
515 pPackage->providerRollback = dependencyRollbackAction; 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 }
516 } 538 }
517 } 539 }
518 540
@@ -556,14 +578,13 @@ extern "C" HRESULT DependencyPlanPackage(
556 } 578 }
557 579
558 // Add the provider rollback plan. 580 // Add the provider rollback plan.
559 if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerRollback) 581 if (pPackage->fProviderRollback)
560 { 582 {
561 hr = PlanAppendRollbackAction(pPlan, &pAction); 583 hr = PlanAppendRollbackAction(pPlan, &pAction);
562 ExitOnFailure(hr, "Failed to append provider rollback action."); 584 ExitOnFailure(hr, "Failed to append provider rollback action.");
563 585
564 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; 586 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER;
565 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); 587 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage);
566 pAction->packageProvider.action = pPackage->providerRollback;
567 588
568 // Put a checkpoint before the execute action so that rollback happens 589 // Put a checkpoint before the execute action so that rollback happens
569 // if execute fails. 590 // if execute fails.
@@ -573,7 +594,7 @@ extern "C" HRESULT DependencyPlanPackage(
573 594
574 // Add the provider execute plan. This comes after rollback so if something goes wrong 595 // Add the provider execute plan. This comes after rollback so if something goes wrong
575 // rollback will try to clean up after us. 596 // rollback will try to clean up after us.
576 if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerExecute) 597 if (pPackage->fProviderExecute)
577 { 598 {
578 if (NULL != pdwInsertSequence) 599 if (NULL != pdwInsertSequence)
579 { 600 {
@@ -592,7 +613,6 @@ extern "C" HRESULT DependencyPlanPackage(
592 613
593 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; 614 pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER;
594 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); 615 pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage);
595 pAction->packageProvider.action = pPackage->providerExecute;
596 } 616 }
597 617
598LExit: 618LExit:
@@ -627,26 +647,39 @@ LExit:
627} 647}
628 648
629extern "C" HRESULT DependencyExecutePackageProviderAction( 649extern "C" HRESULT DependencyExecutePackageProviderAction(
630 __in const BURN_EXECUTE_ACTION* pAction 650 __in const BURN_EXECUTE_ACTION* pAction,
651 __in BOOL fRollback
631 ) 652 )
632{ 653{
633 AssertSz(BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER == pAction->type, "Execute action type not supported by this function."); 654 AssertSz(BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER == pAction->type, "Execute action type not supported by this function.");
634 655
635 HRESULT hr = S_OK; 656 HRESULT hr = S_OK;
636 const BURN_PACKAGE* pPackage = pAction->packageProvider.pPackage; 657 const BURN_PACKAGE* pPackage = pAction->packageProvider.pPackage;
658 HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
659 LPCWSTR wzId = GetPackageProviderId(pPackage);
637 660
638 // Register or unregister the package provider(s). 661 for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i)
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)
645 { 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 }
647 } 681 }
648 682
649LExit:
650 if (!pPackage->fVital) 683 if (!pPackage->fVital)
651 { 684 {
652 hr = S_OK; 685 hr = S_OK;
@@ -1175,7 +1208,7 @@ static void CalculateDependencyActionStates(
1175 case BOOTSTRAPPER_ACTION_STATE_INSTALL: __fallthrough; 1208 case BOOTSTRAPPER_ACTION_STATE_INSTALL: __fallthrough;
1176 case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough; 1209 case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough;
1177 case BOOTSTRAPPER_ACTION_STATE_REPAIR: __fallthrough; 1210 case BOOTSTRAPPER_ACTION_STATE_REPAIR: __fallthrough;
1178 case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE: __fallthrough; 1211 case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE:
1179 *pDependencyExecuteAction = BURN_DEPENDENCY_ACTION_REGISTER; 1212 *pDependencyExecuteAction = BURN_DEPENDENCY_ACTION_REGISTER;
1180 break; 1213 break;
1181 } 1214 }
@@ -1188,7 +1221,7 @@ static void CalculateDependencyActionStates(
1188 switch (pPackage->currentState) 1221 switch (pPackage->currentState)
1189 { 1222 {
1190 case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough; 1223 case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough;
1191 case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: __fallthrough; 1224 case BOOTSTRAPPER_PACKAGE_STATE_ABSENT:
1192 *pDependencyRollbackAction = BURN_DEPENDENCY_ACTION_UNREGISTER; 1225 *pDependencyRollbackAction = BURN_DEPENDENCY_ACTION_UNREGISTER;
1193 break; 1226 break;
1194 } 1227 }
@@ -1291,32 +1324,25 @@ static LPCWSTR GetPackageProviderId(
1291} 1324}
1292 1325
1293static HRESULT RegisterPackageProvider( 1326static 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
1295 ) 1332 )
1296{ 1333{
1297 HRESULT hr = S_OK; 1334 HRESULT hr = S_OK;
1298 1335
1299 if (pPackage->rgDependencyProviders) 1336 if (!pProvider->fImported)
1300 { 1337 {
1301 HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 1338 LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_REGISTER, pProvider->sczKey, pProvider->sczVersion, wzPackageId);
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);
1311 1339
1312 hr = DepRegisterDependency(hkRoot, pProvider->sczKey, pProvider->sczVersion, pProvider->sczDisplayName, wzId, 0); 1340 hr = DepRegisterDependency(hkRoot, pProvider->sczKey, pProvider->sczVersion, pProvider->sczDisplayName, wzPackageProviderId, 0);
1313 ExitOnFailure(hr, "Failed to register the package dependency provider: %ls", pProvider->sczKey); 1341 ExitOnFailure(hr, "Failed to register the package dependency provider: %ls", pProvider->sczKey);
1314 }
1315 }
1316 } 1342 }
1317 1343
1318LExit: 1344LExit:
1319 if (!pPackage->fVital) 1345 if (!fVital)
1320 { 1346 {
1321 hr = S_OK; 1347 hr = S_OK;
1322 } 1348 }
@@ -1325,36 +1351,28 @@ LExit:
1325} 1351}
1326 1352
1327/******************************************************************** 1353/********************************************************************
1328 UnregisterPackageProvider - Removes each dependency provider 1354 UnregisterPackageProvider - Removes the dependency provider.
1329 for the package (if not imported from the package itself).
1330 1355
1331 Note: Does not check for existing dependents before removing the key. 1356 Note: Does not check for existing dependents before removing the key.
1332*********************************************************************/ 1357*********************************************************************/
1333static void UnregisterPackageProvider( 1358static void UnregisterPackageProvider(
1334 __in const BURN_PACKAGE* pPackage 1359 __in const BURN_DEPENDENCY_PROVIDER* pProvider,
1360 __in LPCWSTR wzPackageId,
1361 __in HKEY hkRoot
1335 ) 1362 )
1336{ 1363{
1337 HRESULT hr = S_OK; 1364 HRESULT hr = S_OK;
1338 HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1339 1365
1340 if (pPackage->rgDependencyProviders) 1366 if (!pProvider->fImported)
1341 { 1367 {
1342 for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) 1368 hr = DepUnregisterDependency(hkRoot, pProvider->sczKey);
1369 if (SUCCEEDED(hr))
1343 { 1370 {
1344 const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; 1371 LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED, pProvider->sczKey, wzPackageId);
1345 1372 }
1346 if (!pProvider->fImported) 1373 else if (FAILED(hr) && E_FILENOTFOUND != hr)
1347 { 1374 {
1348 hr = DepUnregisterDependency(hkRoot, pProvider->sczKey); 1375 LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_FAILED, pProvider->sczKey, wzPackageId, hr);
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 }
1358 } 1376 }
1359 } 1377 }
1360} 1378}
diff --git a/src/burn/engine/dependency.h b/src/burn/engine/dependency.h
index 41718066..0e558554 100644
--- a/src/burn/engine/dependency.h
+++ b/src/burn/engine/dependency.h
@@ -150,7 +150,8 @@ HRESULT DependencyPlanPackageComplete(
150 150
151*********************************************************************/ 151*********************************************************************/
152HRESULT DependencyExecutePackageProviderAction( 152HRESULT DependencyExecutePackageProviderAction(
153 __in const BURN_EXECUTE_ACTION* pAction 153 __in const BURN_EXECUTE_ACTION* pAction,
154 __in BOOL fRollback
154 ); 155 );
155 156
156/******************************************************************** 157/********************************************************************
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp
index eafc08ee..75679acd 100644
--- a/src/burn/engine/elevation.cpp
+++ b/src/burn/engine/elevation.cpp
@@ -1305,7 +1305,8 @@ LExit:
1305 1305
1306extern "C" HRESULT ElevationExecutePackageProviderAction( 1306extern "C" HRESULT ElevationExecutePackageProviderAction(
1307 __in HANDLE hPipe, 1307 __in HANDLE hPipe,
1308 __in BURN_EXECUTE_ACTION* pExecuteAction 1308 __in BURN_EXECUTE_ACTION* pExecuteAction,
1309 __in BOOL fRollback
1309 ) 1310 )
1310{ 1311{
1311 HRESULT hr = S_OK; 1312 HRESULT hr = S_OK;
@@ -1318,8 +1319,17 @@ extern "C" HRESULT ElevationExecutePackageProviderAction(
1318 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->packageProvider.pPackage->sczId); 1319 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->packageProvider.pPackage->sczId);
1319 ExitOnFailure(hr, "Failed to write package id to message buffer."); 1320 ExitOnFailure(hr, "Failed to write package id to message buffer.");
1320 1321
1321 hr = BuffWriteNumber(&pbData, &cbData, pExecuteAction->packageProvider.action); 1322 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)fRollback);
1322 ExitOnFailure(hr, "Failed to write action to message buffer."); 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 }
1323 1333
1324 // Send the message. 1334 // Send the message.
1325 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PACKAGE_PROVIDER, pbData, cbData, NULL, NULL, &dwResult); 1335 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PACKAGE_PROVIDER, pbData, cbData, NULL, NULL, &dwResult);
@@ -2840,7 +2850,7 @@ static HRESULT OnExecuteMsiPackage(
2840 SIZE_T iData = 0; 2850 SIZE_T iData = 0;
2841 LPWSTR sczPackage = NULL; 2851 LPWSTR sczPackage = NULL;
2842 HWND hwndParent = NULL; 2852 HWND hwndParent = NULL;
2843 BOOL fRollback = 0; 2853 BOOL fRollback = FALSE;
2844 BURN_EXECUTE_ACTION executeAction = { }; 2854 BURN_EXECUTE_ACTION executeAction = { };
2845 BOOTSTRAPPER_APPLY_RESTART msiRestart = BOOTSTRAPPER_APPLY_RESTART_NONE; 2855 BOOTSTRAPPER_APPLY_RESTART msiRestart = BOOTSTRAPPER_APPLY_RESTART_NONE;
2846 2856
@@ -2946,7 +2956,7 @@ static HRESULT OnExecuteMspPackage(
2946 SIZE_T iData = 0; 2956 SIZE_T iData = 0;
2947 LPWSTR sczPackage = NULL; 2957 LPWSTR sczPackage = NULL;
2948 HWND hwndParent = NULL; 2958 HWND hwndParent = NULL;
2949 BOOL fRollback = 0; 2959 BOOL fRollback = FALSE;
2950 BURN_EXECUTE_ACTION executeAction = { }; 2960 BURN_EXECUTE_ACTION executeAction = { };
2951 BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE; 2961 BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE;
2952 2962
@@ -3117,7 +3127,7 @@ static HRESULT OnUninstallMsiCompatiblePackage(
3117 LPWSTR sczPackageId = NULL; 3127 LPWSTR sczPackageId = NULL;
3118 LPWSTR sczCompatiblePackageId = NULL; 3128 LPWSTR sczCompatiblePackageId = NULL;
3119 HWND hwndParent = NULL; 3129 HWND hwndParent = NULL;
3120 BOOL fRollback = 0; 3130 BOOL fRollback = FALSE;
3121 BURN_EXECUTE_ACTION executeAction = { }; 3131 BURN_EXECUTE_ACTION executeAction = { };
3122 BURN_PACKAGE* pPackage = NULL; 3132 BURN_PACKAGE* pPackage = NULL;
3123 BURN_COMPATIBLE_PACKAGE* pCompatiblePackage = NULL; 3133 BURN_COMPATIBLE_PACKAGE* pCompatiblePackage = NULL;
@@ -3195,6 +3205,7 @@ static HRESULT OnExecutePackageProviderAction(
3195 HRESULT hr = S_OK; 3205 HRESULT hr = S_OK;
3196 SIZE_T iData = 0; 3206 SIZE_T iData = 0;
3197 LPWSTR sczPackage = NULL; 3207 LPWSTR sczPackage = NULL;
3208 BOOL fRollback = FALSE;
3198 BURN_EXECUTE_ACTION executeAction = { }; 3209 BURN_EXECUTE_ACTION executeAction = { };
3199 3210
3200 executeAction.type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; 3211 executeAction.type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER;
@@ -3203,9 +3214,6 @@ static HRESULT OnExecutePackageProviderAction(
3203 hr = BuffReadString(pbData, cbData, &iData, &sczPackage); 3214 hr = BuffReadString(pbData, cbData, &iData, &sczPackage);
3204 ExitOnFailure(hr, "Failed to read package id from message buffer."); 3215 ExitOnFailure(hr, "Failed to read package id from message buffer.");
3205 3216
3206 hr = BuffReadNumber(pbData, cbData, &iData, reinterpret_cast<DWORD*>(&executeAction.packageProvider.action));
3207 ExitOnFailure(hr, "Failed to read action.");
3208
3209 // Find the package again. 3217 // Find the package again.
3210 hr = PackageFindById(pPackages, sczPackage, &executeAction.packageProvider.pPackage); 3218 hr = PackageFindById(pPackages, sczPackage, &executeAction.packageProvider.pPackage);
3211 if (E_NOTFOUND == hr) 3219 if (E_NOTFOUND == hr)
@@ -3214,8 +3222,25 @@ static HRESULT OnExecutePackageProviderAction(
3214 } 3222 }
3215 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 3223 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3216 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
3217 // Execute the package provider action. 3242 // Execute the package provider action.
3218 hr = DependencyExecutePackageProviderAction(&executeAction); 3243 hr = DependencyExecutePackageProviderAction(&executeAction, fRollback);
3219 ExitOnFailure(hr, "Failed to execute package provider action."); 3244 ExitOnFailure(hr, "Failed to execute package provider action.");
3220 3245
3221LExit: 3246LExit:
diff --git a/src/burn/engine/elevation.h b/src/burn/engine/elevation.h
index 9659ef89..f5b56f02 100644
--- a/src/burn/engine/elevation.h
+++ b/src/burn/engine/elevation.h
@@ -139,7 +139,8 @@ HRESULT ElevationUninstallMsiCompatiblePackage(
139 ); 139 );
140HRESULT ElevationExecutePackageProviderAction( 140HRESULT ElevationExecutePackageProviderAction(
141 __in HANDLE hPipe, 141 __in HANDLE hPipe,
142 __in BURN_EXECUTE_ACTION* pExecuteAction 142 __in BURN_EXECUTE_ACTION* pExecuteAction,
143 __in BOOL fRollback
143 ); 144 );
144HRESULT ElevationExecutePackageDependencyAction( 145HRESULT ElevationExecutePackageDependencyAction(
145 __in HANDLE hPipe, 146 __in HANDLE hPipe,
diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h
index eb812e20..6fae0c10 100644
--- a/src/burn/engine/package.h
+++ b/src/burn/engine/package.h
@@ -195,6 +195,9 @@ typedef struct _BURN_DEPENDENCY_PROVIDER
195 195
196 DEPENDENCY* rgDependents; // only valid after Detect. 196 DEPENDENCY* rgDependents; // only valid after Detect.
197 UINT cDependents; // 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.
198} BURN_DEPENDENCY_PROVIDER; 201} BURN_DEPENDENCY_PROVIDER;
199 202
200typedef struct _BURN_ROLLBACK_BOUNDARY 203typedef struct _BURN_ROLLBACK_BOUNDARY
@@ -267,8 +270,8 @@ typedef struct _BURN_PACKAGE
267 BOOL fPlannedUncache; // only valid during Plan. 270 BOOL fPlannedUncache; // only valid during Plan.
268 BOOTSTRAPPER_ACTION_STATE execute; // only valid during Plan. 271 BOOTSTRAPPER_ACTION_STATE execute; // only valid during Plan.
269 BOOTSTRAPPER_ACTION_STATE rollback; // only valid during Plan. 272 BOOTSTRAPPER_ACTION_STATE rollback; // only valid during Plan.
270 BURN_DEPENDENCY_ACTION providerExecute; // only valid during Plan. 273 BOOL fProviderExecute; // only valid during Plan.
271 BURN_DEPENDENCY_ACTION providerRollback; // only valid during Plan. 274 BOOL fProviderRollback; // only valid during Plan.
272 BURN_DEPENDENCY_ACTION dependencyExecute; // only valid during Plan. 275 BURN_DEPENDENCY_ACTION dependencyExecute; // only valid during Plan.
273 BURN_DEPENDENCY_ACTION dependencyRollback; // only valid during Plan. 276 BURN_DEPENDENCY_ACTION dependencyRollback; // only valid during Plan.
274 BOOL fDependencyManagerWasHere; // only valid during Plan. 277 BOOL fDependencyManagerWasHere; // only valid during Plan.
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp
index a25b17d7..27eee3fb 100644
--- a/src/burn/engine/plan.cpp
+++ b/src/burn/engine/plan.cpp
@@ -1922,8 +1922,8 @@ static void ResetPlannedPackageState(
1922 pPackage->fPlannedUncache = FALSE; 1922 pPackage->fPlannedUncache = FALSE;
1923 pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE; 1923 pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE;
1924 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; 1924 pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
1925 pPackage->providerExecute = BURN_DEPENDENCY_ACTION_NONE; 1925 pPackage->fProviderExecute = FALSE;
1926 pPackage->providerRollback = BURN_DEPENDENCY_ACTION_NONE; 1926 pPackage->fProviderRollback = FALSE;
1927 pPackage->dependencyExecute = BURN_DEPENDENCY_ACTION_NONE; 1927 pPackage->dependencyExecute = BURN_DEPENDENCY_ACTION_NONE;
1928 pPackage->dependencyRollback = BURN_DEPENDENCY_ACTION_NONE; 1928 pPackage->dependencyRollback = BURN_DEPENDENCY_ACTION_NONE;
1929 pPackage->fDependencyManagerWasHere = FALSE; 1929 pPackage->fDependencyManagerWasHere = FALSE;
@@ -1969,6 +1969,14 @@ static void ResetPlannedPackageState(
1969 } 1969 }
1970 } 1970 }
1971 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
1972 ResetPlannedPayloadGroupState(&pPackage->payloads); 1980 ResetPlannedPayloadGroupState(&pPackage->payloads);
1973} 1981}
1974 1982
@@ -2637,7 +2645,12 @@ static void ExecuteActionLog(
2637 break; 2645 break;
2638 2646
2639 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER: 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 }
2641 break; 2654 break;
2642 2655
2643 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY: 2656 case BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY:
diff --git a/src/burn/engine/plan.h b/src/burn/engine/plan.h
index 15092210..61953168 100644
--- a/src/burn/engine/plan.h
+++ b/src/burn/engine/plan.h
@@ -208,7 +208,6 @@ typedef struct _BURN_EXECUTE_ACTION
208 struct 208 struct
209 { 209 {
210 BURN_PACKAGE* pPackage; 210 BURN_PACKAGE* pPackage;
211 BURN_DEPENDENCY_ACTION action;
212 } packageProvider; 211 } packageProvider;
213 struct 212 struct
214 { 213 {