aboutsummaryrefslogtreecommitdiff
path: root/src/burn
diff options
context:
space:
mode:
authorNir Bar <nir.bar@panel-sw.co.il>2022-12-06 13:22:41 +0200
committerSean Hall <r.sean.hall@gmail.com>2022-12-12 21:50:39 -0600
commit50e24e9cf2084b6cb67b5d8fc509163061408bb6 (patch)
tree05c9df57480eb6308c3462c13847b43288f9dbb4 /src/burn
parentc54f3083489827a1e57c6fd7f3d76f62ddc6e85e (diff)
downloadwix-50e24e9cf2084b6cb67b5d8fc509163061408bb6.tar.gz
wix-50e24e9cf2084b6cb67b5d8fc509163061408bb6.tar.bz2
wix-50e24e9cf2084b6cb67b5d8fc509163061408bb6.zip
Use MSI transaction end result to detect whether reboot is needed
Diffstat (limited to 'src/burn')
-rw-r--r--src/burn/engine/apply.cpp48
-rw-r--r--src/burn/engine/elevation.cpp80
-rw-r--r--src/burn/engine/elevation.h10
-rw-r--r--src/burn/engine/msiengine.cpp42
-rw-r--r--src/burn/engine/msiengine.h6
-rw-r--r--src/burn/engine/userexperience.cpp38
-rw-r--r--src/burn/engine/userexperience.h12
7 files changed, 167 insertions, 69 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp
index 8fbaa76e..9a1a7bf9 100644
--- a/src/burn/engine/apply.cpp
+++ b/src/burn/engine/apply.cpp
@@ -300,12 +300,14 @@ static HRESULT ExecuteMsiBeginTransaction(
300static HRESULT ExecuteMsiCommitTransaction( 300static HRESULT ExecuteMsiCommitTransaction(
301 __in BURN_ENGINE_STATE* pEngineState, 301 __in BURN_ENGINE_STATE* pEngineState,
302 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, 302 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
303 __in BURN_EXECUTE_CONTEXT* pContext 303 __in BURN_EXECUTE_CONTEXT* pContext,
304 __out BOOTSTRAPPER_APPLY_RESTART *pRestart
304 ); 305 );
305static HRESULT ExecuteMsiRollbackTransaction( 306static HRESULT ExecuteMsiRollbackTransaction(
306 __in BURN_ENGINE_STATE* pEngineState, 307 __in BURN_ENGINE_STATE* pEngineState,
307 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, 308 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
308 __in BURN_EXECUTE_CONTEXT* pContext 309 __in BURN_EXECUTE_CONTEXT* pContext,
310 __out BOOTSTRAPPER_APPLY_RESTART *pRestart
309 ); 311 );
310static void ResetTransactionRegistrationState( 312static void ResetTransactionRegistrationState(
311 __in BURN_ENGINE_STATE* pEngineState, 313 __in BURN_ENGINE_STATE* pEngineState,
@@ -645,7 +647,7 @@ extern "C" HRESULT ApplyCache(
645 Assert(pPlan->sczLayoutDirectory); 647 Assert(pPlan->sczLayoutDirectory);
646 hr = ApplyLayoutContainer(&cacheContext, pCacheAction->container.pContainer); 648 hr = ApplyLayoutContainer(&cacheContext, pCacheAction->container.pContainer);
647 ExitOnFailure(hr, "Failed cache action: %ls", L"layout container"); 649 ExitOnFailure(hr, "Failed cache action: %ls", L"layout container");
648 650
649 break; 651 break;
650 652
651 case BURN_CACHE_ACTION_TYPE_SIGNAL_SYNCPOINT: 653 case BURN_CACHE_ACTION_TYPE_SIGNAL_SYNCPOINT:
@@ -793,7 +795,7 @@ extern "C" HRESULT ApplyExecute(
793 795
794 if (pCheckpoint && pCheckpoint->pActiveRollbackBoundary && pCheckpoint->pActiveRollbackBoundary->fActiveTransaction) 796 if (pCheckpoint && pCheckpoint->pActiveRollbackBoundary && pCheckpoint->pActiveRollbackBoundary->fActiveTransaction)
795 { 797 {
796 hrRollback = ExecuteMsiCommitTransaction(pEngineState, pCheckpoint->pActiveRollbackBoundary, &context); 798 hrRollback = ExecuteMsiCommitTransaction(pEngineState, pCheckpoint->pActiveRollbackBoundary, &context, pRestart);
797 IgnoreRollbackError(hrRollback, "Failed commit transaction from disable rollback"); 799 IgnoreRollbackError(hrRollback, "Failed commit transaction from disable rollback");
798 } 800 }
799 801
@@ -806,7 +808,7 @@ extern "C" HRESULT ApplyExecute(
806 // If inside a MSI transaction, roll it back. 808 // If inside a MSI transaction, roll it back.
807 if (pCheckpoint->pActiveRollbackBoundary && pCheckpoint->pActiveRollbackBoundary->fActiveTransaction) 809 if (pCheckpoint->pActiveRollbackBoundary && pCheckpoint->pActiveRollbackBoundary->fActiveTransaction)
808 { 810 {
809 hrRollback = ExecuteMsiRollbackTransaction(pEngineState, pCheckpoint->pActiveRollbackBoundary, &context); 811 hrRollback = ExecuteMsiRollbackTransaction(pEngineState, pCheckpoint->pActiveRollbackBoundary, &context, pRestart);
810 IgnoreRollbackError(hrRollback, "Failed rolling back transaction"); 812 IgnoreRollbackError(hrRollback, "Failed rolling back transaction");
811 } 813 }
812 814
@@ -2058,13 +2060,13 @@ static HRESULT DownloadPayload(
2058 cacheCallback.pfnProgress = CacheProgressRoutine; 2060 cacheCallback.pfnProgress = CacheProgressRoutine;
2059 cacheCallback.pfnCancel = NULL; // TODO: set this 2061 cacheCallback.pfnCancel = NULL; // TODO: set this
2060 cacheCallback.pv = pProgress; 2062 cacheCallback.pv = pProgress;
2061 2063
2062 authenticationData.pUX = pProgress->pCacheContext->pUX; 2064 authenticationData.pUX = pProgress->pCacheContext->pUX;
2063 authenticationData.wzPackageOrContainerId = wzPackageOrContainerId; 2065 authenticationData.wzPackageOrContainerId = wzPackageOrContainerId;
2064 authenticationData.wzPayloadId = wzPayloadId; 2066 authenticationData.wzPayloadId = wzPayloadId;
2065 authenticationCallback.pv = static_cast<LPVOID>(&authenticationData); 2067 authenticationCallback.pv = static_cast<LPVOID>(&authenticationData);
2066 authenticationCallback.pfnAuthenticate = &AuthenticationRequired; 2068 authenticationCallback.pfnAuthenticate = &AuthenticationRequired;
2067 2069
2068 hr = DownloadUrl(pDownloadSource, qwDownloadSize, wzDestinationPath, &cacheCallback, &authenticationCallback); 2070 hr = DownloadUrl(pDownloadSource, qwDownloadSize, wzDestinationPath, &cacheCallback, &authenticationCallback);
2069 ExitOnFailure(hr, "Failed attempt to download URL: '%ls' to: '%ls'", pDownloadSource->sczUrl, wzDestinationPath); 2071 ExitOnFailure(hr, "Failed attempt to download URL: '%ls' to: '%ls'", pDownloadSource->sczUrl, wzDestinationPath);
2070 2072
@@ -2526,7 +2528,7 @@ static HRESULT DoExecuteAction(
2526 break; 2528 break;
2527 2529
2528 case BURN_EXECUTE_ACTION_TYPE_COMMIT_MSI_TRANSACTION: 2530 case BURN_EXECUTE_ACTION_TYPE_COMMIT_MSI_TRANSACTION:
2529 hr = ExecuteMsiCommitTransaction(pEngineState, pExecuteAction->msiTransaction.pRollbackBoundary, pContext); 2531 hr = ExecuteMsiCommitTransaction(pEngineState, pExecuteAction->msiTransaction.pRollbackBoundary, pContext, &restart);
2530 ExitOnFailure(hr, "Failed to execute commit MSI transaction action."); 2532 ExitOnFailure(hr, "Failed to execute commit MSI transaction action.");
2531 break; 2533 break;
2532 2534
@@ -3381,11 +3383,13 @@ LExit:
3381static HRESULT ExecuteMsiCommitTransaction( 3383static HRESULT ExecuteMsiCommitTransaction(
3382 __in BURN_ENGINE_STATE* pEngineState, 3384 __in BURN_ENGINE_STATE* pEngineState,
3383 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, 3385 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
3384 __in BURN_EXECUTE_CONTEXT* /*pContext*/ 3386 __in BURN_EXECUTE_CONTEXT* pContext,
3387 __out BOOTSTRAPPER_APPLY_RESTART *pRestart
3385 ) 3388 )
3386{ 3389{
3387 HRESULT hr = S_OK; 3390 HRESULT hr = S_OK;
3388 BOOL fCommitBeginCalled = FALSE; 3391 BOOL fCommitBeginCalled = FALSE;
3392 BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION action = BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION_NONE;
3389 3393
3390 if (!pRollbackBoundary->fActiveTransaction) 3394 if (!pRollbackBoundary->fActiveTransaction)
3391 { 3395 {
@@ -3398,12 +3402,12 @@ static HRESULT ExecuteMsiCommitTransaction(
3398 3402
3399 if (pEngineState->plan.fPerMachine) 3403 if (pEngineState->plan.fPerMachine)
3400 { 3404 {
3401 hr = ElevationMsiCommitTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary); 3405 hr = ElevationMsiCommitTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary, MsiExecuteMessageHandler, pContext, pRestart);
3402 ExitOnFailure(hr, "Failed to commit an elevated MSI transaction."); 3406 ExitOnFailure(hr, "Failed to commit an elevated MSI transaction.");
3403 } 3407 }
3404 else 3408 else
3405 { 3409 {
3406 hr = MsiEngineCommitTransaction(pRollbackBoundary); 3410 hr = MsiEngineCommitTransaction(pRollbackBoundary, pRestart);
3407 } 3411 }
3408 3412
3409 // Assume that MsiEndTransaction can only be called once for each MsiBeginTransaction. 3413 // Assume that MsiEndTransaction can only be called once for each MsiBeginTransaction.
@@ -3414,7 +3418,12 @@ static HRESULT ExecuteMsiCommitTransaction(
3414LExit: 3418LExit:
3415 if (fCommitBeginCalled) 3419 if (fCommitBeginCalled)
3416 { 3420 {
3417 UserExperienceOnCommitMsiTransactionComplete(&pEngineState->userExperience, pRollbackBoundary->sczId, hr); 3421 UserExperienceOnCommitMsiTransactionComplete(&pEngineState->userExperience, pRollbackBoundary->sczId, hr, *pRestart, &action);
3422
3423 if (action == BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION_RESTART)
3424 {
3425 *pRestart = BOOTSTRAPPER_APPLY_RESTART_INITIATED;
3426 }
3418 } 3427 }
3419 3428
3420 return hr; 3429 return hr;
@@ -3423,11 +3432,13 @@ LExit:
3423static HRESULT ExecuteMsiRollbackTransaction( 3432static HRESULT ExecuteMsiRollbackTransaction(
3424 __in BURN_ENGINE_STATE* pEngineState, 3433 __in BURN_ENGINE_STATE* pEngineState,
3425 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, 3434 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
3426 __in BURN_EXECUTE_CONTEXT* /*pContext*/ 3435 __in BURN_EXECUTE_CONTEXT* pContext,
3436 __out BOOTSTRAPPER_APPLY_RESTART *pRestart
3427 ) 3437 )
3428{ 3438{
3429 HRESULT hr = S_OK; 3439 HRESULT hr = S_OK;
3430 BOOL fRollbackBeginCalled = FALSE; 3440 BOOL fRollbackBeginCalled = FALSE;
3441 BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION action = BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION_NONE;
3431 3442
3432 if (!pRollbackBoundary->fActiveTransaction) 3443 if (!pRollbackBoundary->fActiveTransaction)
3433 { 3444 {
@@ -3439,12 +3450,12 @@ static HRESULT ExecuteMsiRollbackTransaction(
3439 3450
3440 if (pEngineState->plan.fPerMachine) 3451 if (pEngineState->plan.fPerMachine)
3441 { 3452 {
3442 hr = ElevationMsiRollbackTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary); 3453 hr = ElevationMsiRollbackTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary, MsiExecuteMessageHandler, pContext, pRestart);
3443 ExitOnFailure(hr, "Failed to rollback an elevated MSI transaction."); 3454 ExitOnFailure(hr, "Failed to rollback an elevated MSI transaction.");
3444 } 3455 }
3445 else 3456 else
3446 { 3457 {
3447 hr = MsiEngineRollbackTransaction(pRollbackBoundary); 3458 hr = MsiEngineRollbackTransaction(pRollbackBoundary, pRestart);
3448 } 3459 }
3449 3460
3450LExit: 3461LExit:
@@ -3454,7 +3465,12 @@ LExit:
3454 3465
3455 if (fRollbackBeginCalled) 3466 if (fRollbackBeginCalled)
3456 { 3467 {
3457 UserExperienceOnRollbackMsiTransactionComplete(&pEngineState->userExperience, pRollbackBoundary->sczId, hr); 3468 UserExperienceOnRollbackMsiTransactionComplete(&pEngineState->userExperience, pRollbackBoundary->sczId, hr, *pRestart, &action);
3469
3470 if (action == BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION_RESTART)
3471 {
3472 *pRestart = BOOTSTRAPPER_APPLY_RESTART_INITIATED;
3473 }
3458 } 3474 }
3459 3475
3460 return hr; 3476 return hr;
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp
index 154c407d..63a76c2c 100644
--- a/src/burn/engine/elevation.cpp
+++ b/src/burn/engine/elevation.cpp
@@ -371,12 +371,14 @@ static HRESULT OnMsiBeginTransaction(
371static HRESULT OnMsiCommitTransaction( 371static HRESULT OnMsiCommitTransaction(
372 __in BURN_PACKAGES* pPackages, 372 __in BURN_PACKAGES* pPackages,
373 __in BYTE* pbData, 373 __in BYTE* pbData,
374 __in SIZE_T cbData 374 __in SIZE_T cbData,
375 __out BOOTSTRAPPER_APPLY_RESTART *pRestart
375 ); 376 );
376static HRESULT OnMsiRollbackTransaction( 377static HRESULT OnMsiRollbackTransaction(
377 __in BURN_PACKAGES* pPackages, 378 __in BURN_PACKAGES* pPackages,
378 __in BYTE* pbData, 379 __in BYTE* pbData,
379 __in SIZE_T cbData 380 __in SIZE_T cbData,
381 __out BOOTSTRAPPER_APPLY_RESTART *pRestart
380 ); 382 );
381static HRESULT ElevatedOnPauseAUBegin( 383static HRESULT ElevatedOnPauseAUBegin(
382 __in HANDLE hPipe 384 __in HANDLE hPipe
@@ -496,7 +498,7 @@ extern "C" HRESULT ElevationApplyInitialize(
496 498
497 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)!pPlan->pInternalCommand->fDisableSystemRestore); 499 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)!pPlan->pInternalCommand->fDisableSystemRestore);
498 ExitOnFailure(hr, "Failed to write system restore point action to message buffer."); 500 ExitOnFailure(hr, "Failed to write system restore point action to message buffer.");
499 501
500 hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData); 502 hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData);
501 ExitOnFailure(hr, "Failed to write variables."); 503 ExitOnFailure(hr, "Failed to write variables.");
502 504
@@ -544,7 +546,7 @@ LExit:
544} 546}
545 547
546/******************************************************************* 548/*******************************************************************
547 ElevationSessionBegin - 549 ElevationSessionBegin -
548 550
549*******************************************************************/ 551*******************************************************************/
550extern "C" HRESULT ElevationSessionBegin( 552extern "C" HRESULT ElevationSessionBegin(
@@ -602,7 +604,7 @@ LExit:
602} 604}
603 605
604/******************************************************************* 606/*******************************************************************
605 ElevationSessionEnd - 607 ElevationSessionEnd -
606 608
607*******************************************************************/ 609*******************************************************************/
608extern "C" HRESULT ElevationSessionEnd( 610extern "C" HRESULT ElevationSessionEnd(
@@ -648,7 +650,7 @@ LExit:
648} 650}
649 651
650/******************************************************************* 652/*******************************************************************
651 ElevationSaveState - 653 ElevationSaveState -
652 654
653*******************************************************************/ 655*******************************************************************/
654HRESULT ElevationSaveState( 656HRESULT ElevationSaveState(
@@ -697,7 +699,7 @@ LExit:
697} 699}
698 700
699/******************************************************************* 701/*******************************************************************
700 ElevationCacheCompletePayload - 702 ElevationCacheCompletePayload -
701 703
702*******************************************************************/ 704*******************************************************************/
703extern "C" HRESULT ElevationCacheCompletePayload( 705extern "C" HRESULT ElevationCacheCompletePayload(
@@ -785,7 +787,7 @@ LExit:
785} 787}
786 788
787/******************************************************************* 789/*******************************************************************
788 ElevationCacheCleanup - 790 ElevationCacheCleanup -
789 791
790*******************************************************************/ 792*******************************************************************/
791extern "C" HRESULT ElevationCacheCleanup( 793extern "C" HRESULT ElevationCacheCleanup(
@@ -838,7 +840,7 @@ LExit:
838} 840}
839 841
840/******************************************************************* 842/*******************************************************************
841 ElevationExecuteRelatedBundle - 843 ElevationExecuteRelatedBundle -
842 844
843*******************************************************************/ 845*******************************************************************/
844extern "C" HRESULT ElevationExecuteRelatedBundle( 846extern "C" HRESULT ElevationExecuteRelatedBundle(
@@ -899,7 +901,7 @@ LExit:
899} 901}
900 902
901/******************************************************************* 903/*******************************************************************
902 ElevationExecuteBundlePackage - 904 ElevationExecuteBundlePackage -
903 905
904*******************************************************************/ 906*******************************************************************/
905extern "C" HRESULT ElevationExecuteBundlePackage( 907extern "C" HRESULT ElevationExecuteBundlePackage(
@@ -963,7 +965,7 @@ LExit:
963} 965}
964 966
965/******************************************************************* 967/*******************************************************************
966 ElevationExecuteExePackage - 968 ElevationExecuteExePackage -
967 969
968*******************************************************************/ 970*******************************************************************/
969extern "C" HRESULT ElevationExecuteExePackage( 971extern "C" HRESULT ElevationExecuteExePackage(
@@ -1047,12 +1049,16 @@ LExit:
1047 1049
1048extern "C" HRESULT ElevationMsiCommitTransaction( 1050extern "C" HRESULT ElevationMsiCommitTransaction(
1049 __in HANDLE hPipe, 1051 __in HANDLE hPipe,
1050 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 1052 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
1053 __in PFN_MSIEXECUTEMESSAGEHANDLER pfnMessageHandler,
1054 __in LPVOID pvContext,
1055 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
1051 ) 1056 )
1052{ 1057{
1053 HRESULT hr = S_OK; 1058 HRESULT hr = S_OK;
1054 BYTE* pbData = NULL; 1059 BYTE* pbData = NULL;
1055 SIZE_T cbData = 0; 1060 SIZE_T cbData = 0;
1061 BURN_ELEVATION_MSI_MESSAGE_CONTEXT context = { };
1056 DWORD dwResult = ERROR_SUCCESS; 1062 DWORD dwResult = ERROR_SUCCESS;
1057 1063
1058 // serialize message data 1064 // serialize message data
@@ -1062,10 +1068,15 @@ extern "C" HRESULT ElevationMsiCommitTransaction(
1062 hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath); 1068 hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath);
1063 ExitOnFailure(hr, "Failed to write transaction log path to message buffer."); 1069 ExitOnFailure(hr, "Failed to write transaction log path to message buffer.");
1064 1070
1065 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION, pbData, cbData, NULL, NULL, &dwResult); 1071 // send message
1072 context.pfnMessageHandler = pfnMessageHandler;
1073 context.pvContext = pvContext;
1074
1075 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION, pbData, cbData, ProcessMsiPackageMessages, &context, &dwResult);
1066 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION message to per-machine process."); 1076 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION message to per-machine process.");
1067 1077
1068 hr = static_cast<HRESULT>(dwResult); 1078 hr = static_cast<HRESULT>(dwResult);
1079 *pRestart = context.restart;
1069 1080
1070LExit: 1081LExit:
1071 ReleaseBuffer(pbData); 1082 ReleaseBuffer(pbData);
@@ -1075,12 +1086,16 @@ LExit:
1075 1086
1076extern "C" HRESULT ElevationMsiRollbackTransaction( 1087extern "C" HRESULT ElevationMsiRollbackTransaction(
1077 __in HANDLE hPipe, 1088 __in HANDLE hPipe,
1078 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 1089 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
1090 __in PFN_MSIEXECUTEMESSAGEHANDLER pfnMessageHandler,
1091 __in LPVOID pvContext,
1092 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
1079 ) 1093 )
1080{ 1094{
1081 HRESULT hr = S_OK; 1095 HRESULT hr = S_OK;
1082 BYTE* pbData = NULL; 1096 BYTE* pbData = NULL;
1083 SIZE_T cbData = 0; 1097 SIZE_T cbData = 0;
1098 BURN_ELEVATION_MSI_MESSAGE_CONTEXT context = { };
1084 DWORD dwResult = ERROR_SUCCESS; 1099 DWORD dwResult = ERROR_SUCCESS;
1085 1100
1086 // serialize message data 1101 // serialize message data
@@ -1090,10 +1105,15 @@ extern "C" HRESULT ElevationMsiRollbackTransaction(
1090 hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath); 1105 hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath);
1091 ExitOnFailure(hr, "Failed to write transaction log path to message buffer."); 1106 ExitOnFailure(hr, "Failed to write transaction log path to message buffer.");
1092 1107
1093 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION, pbData, cbData, NULL, NULL, &dwResult); 1108 // send message
1109 context.pfnMessageHandler = pfnMessageHandler;
1110 context.pvContext = pvContext;
1111
1112 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION, pbData, cbData, ProcessMsiPackageMessages, &context, &dwResult);
1094 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION message to per-machine process."); 1113 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION message to per-machine process.");
1095 1114
1096 hr = static_cast<HRESULT>(dwResult); 1115 hr = static_cast<HRESULT>(dwResult);
1116 *pRestart = context.restart;
1097 1117
1098LExit: 1118LExit:
1099 ReleaseBuffer(pbData); 1119 ReleaseBuffer(pbData);
@@ -1104,7 +1124,7 @@ LExit:
1104 1124
1105 1125
1106/******************************************************************* 1126/*******************************************************************
1107 ElevationExecuteMsiPackage - 1127 ElevationExecuteMsiPackage -
1108 1128
1109*******************************************************************/ 1129*******************************************************************/
1110extern "C" HRESULT ElevationExecuteMsiPackage( 1130extern "C" HRESULT ElevationExecuteMsiPackage(
@@ -1189,7 +1209,7 @@ LExit:
1189} 1209}
1190 1210
1191/******************************************************************* 1211/*******************************************************************
1192 ElevationExecuteMspPackage - 1212 ElevationExecuteMspPackage -
1193 1213
1194*******************************************************************/ 1214*******************************************************************/
1195extern "C" HRESULT ElevationExecuteMspPackage( 1215extern "C" HRESULT ElevationExecuteMspPackage(
@@ -1269,7 +1289,7 @@ LExit:
1269} 1289}
1270 1290
1271/******************************************************************* 1291/*******************************************************************
1272 ElevationExecuteMsuPackage - 1292 ElevationExecuteMsuPackage -
1273 1293
1274*******************************************************************/ 1294*******************************************************************/
1275extern "C" HRESULT ElevationExecuteMsuPackage( 1295extern "C" HRESULT ElevationExecuteMsuPackage(
@@ -1480,7 +1500,7 @@ LExit:
1480} 1500}
1481 1501
1482/******************************************************************* 1502/*******************************************************************
1483 ElevationCleanPackage - 1503 ElevationCleanPackage -
1484 1504
1485*******************************************************************/ 1505*******************************************************************/
1486extern "C" HRESULT ElevationCleanPackage( 1506extern "C" HRESULT ElevationCleanPackage(
@@ -1545,7 +1565,7 @@ LExit:
1545} 1565}
1546 1566
1547/******************************************************************* 1567/*******************************************************************
1548 ElevationChildPumpMessages - 1568 ElevationChildPumpMessages -
1549 1569
1550*******************************************************************/ 1570*******************************************************************/
1551extern "C" HRESULT ElevationChildPumpMessages( 1571extern "C" HRESULT ElevationChildPumpMessages(
@@ -1875,7 +1895,7 @@ static HRESULT ProcessGenericExecuteMessages(
1875 1895
1876 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &message.dwUIHint); 1896 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &message.dwUIHint);
1877 ExitOnFailure(hr, "Failed to allowed results."); 1897 ExitOnFailure(hr, "Failed to allowed results.");
1878 1898
1879 // Process the message. 1899 // Process the message.
1880 switch (pMsg->dwMessage) 1900 switch (pMsg->dwMessage)
1881 { 1901 {
@@ -2052,7 +2072,7 @@ static HRESULT ProcessMsiPackageMessages(
2052 ExitOnRootFailure(hr, "Invalid package message."); 2072 ExitOnRootFailure(hr, "Invalid package message.");
2053 break; 2073 break;
2054 } 2074 }
2055 2075
2056 // send message 2076 // send message
2057 *pdwResult = (DWORD)pContext->pfnMessageHandler(&message, pContext->pvContext); 2077 *pdwResult = (DWORD)pContext->pfnMessageHandler(&message, pContext->pvContext);
2058 2078
@@ -2154,11 +2174,13 @@ static HRESULT ProcessElevatedChildMessage(
2154 break; 2174 break;
2155 2175
2156 case BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION: 2176 case BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION:
2157 hrResult = OnMsiCommitTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData); 2177 hrResult = OnMsiCommitTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData, &restart);
2178 fSendRestart = TRUE;
2158 break; 2179 break;
2159 2180
2160 case BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION: 2181 case BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION:
2161 hrResult = OnMsiRollbackTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData); 2182 hrResult = OnMsiRollbackTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData, &restart);
2183 fSendRestart = TRUE;
2162 break; 2184 break;
2163 2185
2164 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE: 2186 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE:
@@ -3922,7 +3944,8 @@ LExit:
3922static HRESULT OnMsiCommitTransaction( 3944static HRESULT OnMsiCommitTransaction(
3923 __in BURN_PACKAGES* pPackages, 3945 __in BURN_PACKAGES* pPackages,
3924 __in BYTE* pbData, 3946 __in BYTE* pbData,
3925 __in SIZE_T cbData 3947 __in SIZE_T cbData,
3948 __out BOOTSTRAPPER_APPLY_RESTART *pRestart
3926 ) 3949 )
3927{ 3950{
3928 HRESULT hr = S_OK; 3951 HRESULT hr = S_OK;
@@ -3946,7 +3969,7 @@ static HRESULT OnMsiCommitTransaction(
3946 pRollbackBoundary->sczLogPath = sczLogPath; 3969 pRollbackBoundary->sczLogPath = sczLogPath;
3947 } 3970 }
3948 3971
3949 hr = MsiEngineCommitTransaction(pRollbackBoundary); 3972 hr = MsiEngineCommitTransaction(pRollbackBoundary, pRestart);
3950 3973
3951LExit: 3974LExit:
3952 ReleaseStr(sczId); 3975 ReleaseStr(sczId);
@@ -3963,7 +3986,8 @@ LExit:
3963static HRESULT OnMsiRollbackTransaction( 3986static HRESULT OnMsiRollbackTransaction(
3964 __in BURN_PACKAGES* pPackages, 3987 __in BURN_PACKAGES* pPackages,
3965 __in BYTE* pbData, 3988 __in BYTE* pbData,
3966 __in SIZE_T cbData 3989 __in SIZE_T cbData,
3990 __out BOOTSTRAPPER_APPLY_RESTART *pRestart
3967 ) 3991 )
3968{ 3992{
3969 HRESULT hr = S_OK; 3993 HRESULT hr = S_OK;
@@ -3987,7 +4011,7 @@ static HRESULT OnMsiRollbackTransaction(
3987 pRollbackBoundary->sczLogPath = sczLogPath; 4011 pRollbackBoundary->sczLogPath = sczLogPath;
3988 } 4012 }
3989 4013
3990 hr = MsiEngineRollbackTransaction(pRollbackBoundary); 4014 hr = MsiEngineRollbackTransaction(pRollbackBoundary, pRestart);
3991 4015
3992LExit: 4016LExit:
3993 ReleaseStr(sczId); 4017 ReleaseStr(sczId);
diff --git a/src/burn/engine/elevation.h b/src/burn/engine/elevation.h
index 810287a3..02019977 100644
--- a/src/burn/engine/elevation.h
+++ b/src/burn/engine/elevation.h
@@ -191,11 +191,17 @@ HRESULT ElevationMsiBeginTransaction(
191 ); 191 );
192HRESULT ElevationMsiCommitTransaction( 192HRESULT ElevationMsiCommitTransaction(
193 __in HANDLE hPipe, 193 __in HANDLE hPipe,
194 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 194 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
195 __in PFN_MSIEXECUTEMESSAGEHANDLER pfnMessageHandler,
196 __in LPVOID pvContext,
197 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
195 ); 198 );
196HRESULT ElevationMsiRollbackTransaction( 199HRESULT ElevationMsiRollbackTransaction(
197 __in HANDLE hPipe, 200 __in HANDLE hPipe,
198 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 201 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
202 __in PFN_MSIEXECUTEMESSAGEHANDLER pfnMessageHandler,
203 __in LPVOID pvContext,
204 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
199 ); 205 );
200 206
201#ifdef __cplusplus 207#ifdef __cplusplus
diff --git a/src/burn/engine/msiengine.cpp b/src/burn/engine/msiengine.cpp
index 2c1b0d4f..fec995e0 100644
--- a/src/burn/engine/msiengine.cpp
+++ b/src/burn/engine/msiengine.cpp
@@ -1139,33 +1139,65 @@ LExit:
1139} 1139}
1140 1140
1141extern "C" HRESULT MsiEngineCommitTransaction( 1141extern "C" HRESULT MsiEngineCommitTransaction(
1142 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 1142 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
1143 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
1143 ) 1144 )
1144{ 1145{
1145 HRESULT hr = S_OK; 1146 HRESULT hr = S_OK;
1147 WIU_RESTART restart = WIU_RESTART_NONE;
1146 1148
1147 LogId(REPORT_STANDARD, MSG_MSI_TRANSACTION_COMMIT, pRollbackBoundary->sczId); 1149 LogId(REPORT_STANDARD, MSG_MSI_TRANSACTION_COMMIT, pRollbackBoundary->sczId);
1148 1150
1149 hr = WiuEndTransaction(MSITRANSACTIONSTATE_COMMIT, WIU_LOG_DEFAULT | INSTALLLOGMODE_VERBOSE, pRollbackBoundary->sczLogPath); 1151 hr = WiuEndTransaction(MSITRANSACTIONSTATE_COMMIT, WIU_LOG_DEFAULT | INSTALLLOGMODE_VERBOSE, pRollbackBoundary->sczLogPath, &restart);
1150 ExitOnFailure(hr, "Failed to commit the MSI transaction"); 1152 ExitOnFailure(hr, "Failed to commit the MSI transaction");
1151 1153
1152LExit: 1154LExit:
1155 switch (restart)
1156 {
1157 case WIU_RESTART_NONE:
1158 *pRestart = BOOTSTRAPPER_APPLY_RESTART_NONE;
1159 break;
1160
1161 case WIU_RESTART_REQUIRED:
1162 *pRestart = BOOTSTRAPPER_APPLY_RESTART_REQUIRED;
1163 break;
1164
1165 case WIU_RESTART_INITIATED:
1166 *pRestart = BOOTSTRAPPER_APPLY_RESTART_INITIATED;
1167 break;
1168 }
1153 1169
1154 return hr; 1170 return hr;
1155} 1171}
1156 1172
1157extern "C" HRESULT MsiEngineRollbackTransaction( 1173extern "C" HRESULT MsiEngineRollbackTransaction(
1158 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 1174 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
1175 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
1159 ) 1176 )
1160{ 1177{
1161 HRESULT hr = S_OK; 1178 HRESULT hr = S_OK;
1179 WIU_RESTART restart = WIU_RESTART_NONE;
1162 1180
1163 LogId(REPORT_WARNING, MSG_MSI_TRANSACTION_ROLLBACK, pRollbackBoundary->sczId); 1181 LogId(REPORT_WARNING, MSG_MSI_TRANSACTION_ROLLBACK, pRollbackBoundary->sczId);
1164 1182
1165 hr = WiuEndTransaction(MSITRANSACTIONSTATE_ROLLBACK, WIU_LOG_DEFAULT | INSTALLLOGMODE_VERBOSE, pRollbackBoundary->sczLogPath); 1183 hr = WiuEndTransaction(MSITRANSACTIONSTATE_ROLLBACK, WIU_LOG_DEFAULT | INSTALLLOGMODE_VERBOSE, pRollbackBoundary->sczLogPath, &restart);
1166 ExitOnFailure(hr, "Failed to rollback the MSI transaction"); 1184 ExitOnFailure(hr, "Failed to rollback the MSI transaction");
1167 1185
1168LExit: 1186LExit:
1187 switch (restart)
1188 {
1189 case WIU_RESTART_NONE:
1190 *pRestart = BOOTSTRAPPER_APPLY_RESTART_NONE;
1191 break;
1192
1193 case WIU_RESTART_REQUIRED:
1194 *pRestart = BOOTSTRAPPER_APPLY_RESTART_REQUIRED;
1195 break;
1196
1197 case WIU_RESTART_INITIATED:
1198 *pRestart = BOOTSTRAPPER_APPLY_RESTART_INITIATED;
1199 break;
1200 }
1169 1201
1170 return hr; 1202 return hr;
1171} 1203}
@@ -1246,7 +1278,7 @@ extern "C" HRESULT MsiEngineExecutePackage(
1246 1278
1247 // Best effort to set the execute package action variable. 1279 // Best effort to set the execute package action variable.
1248 VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->msiPackage.action, TRUE); 1280 VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->msiPackage.action, TRUE);
1249 1281
1250 // Wire up the external UI handler and logging. 1282 // Wire up the external UI handler and logging.
1251 if (pExecuteAction->msiPackage.fDisableExternalUiHandler) 1283 if (pExecuteAction->msiPackage.fDisableExternalUiHandler)
1252 { 1284 {
diff --git a/src/burn/engine/msiengine.h b/src/burn/engine/msiengine.h
index bc356fab..862c4f6a 100644
--- a/src/burn/engine/msiengine.h
+++ b/src/burn/engine/msiengine.h
@@ -60,10 +60,12 @@ HRESULT MsiEngineBeginTransaction(
60 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 60 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary
61 ); 61 );
62HRESULT MsiEngineCommitTransaction( 62HRESULT MsiEngineCommitTransaction(
63 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 63 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
64 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
64 ); 65 );
65HRESULT MsiEngineRollbackTransaction( 66HRESULT MsiEngineRollbackTransaction(
66 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 67 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
68 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
67 ); 69 );
68HRESULT MsiEngineExecutePackage( 70HRESULT MsiEngineExecutePackage(
69 __in_opt HWND hwndParent, 71 __in_opt HWND hwndParent,
diff --git a/src/burn/engine/userexperience.cpp b/src/burn/engine/userexperience.cpp
index 28429394..372ca901 100644
--- a/src/burn/engine/userexperience.cpp
+++ b/src/burn/engine/userexperience.cpp
@@ -35,7 +35,7 @@ static HRESULT SendBAMessageFromInactiveEngine(
35// function definitions 35// function definitions
36 36
37/******************************************************************* 37/*******************************************************************
38 UserExperienceParseFromXml - 38 UserExperienceParseFromXml -
39 39
40*******************************************************************/ 40*******************************************************************/
41extern "C" HRESULT UserExperienceParseFromXml( 41extern "C" HRESULT UserExperienceParseFromXml(
@@ -72,7 +72,7 @@ LExit:
72} 72}
73 73
74/******************************************************************* 74/*******************************************************************
75 UserExperienceUninitialize - 75 UserExperienceUninitialize -
76 76
77*******************************************************************/ 77*******************************************************************/
78extern "C" void UserExperienceUninitialize( 78extern "C" void UserExperienceUninitialize(
@@ -87,7 +87,7 @@ extern "C" void UserExperienceUninitialize(
87} 87}
88 88
89/******************************************************************* 89/*******************************************************************
90 UserExperienceLoad - 90 UserExperienceLoad -
91 91
92*******************************************************************/ 92*******************************************************************/
93extern "C" HRESULT UserExperienceLoad( 93extern "C" HRESULT UserExperienceLoad(
@@ -129,7 +129,7 @@ LExit:
129} 129}
130 130
131/******************************************************************* 131/*******************************************************************
132 UserExperienceUnload - 132 UserExperienceUnload -
133 133
134*******************************************************************/ 134*******************************************************************/
135extern "C" HRESULT UserExperienceUnload( 135extern "C" HRESULT UserExperienceUnload(
@@ -380,7 +380,7 @@ EXTERN_C BAAPI UserExperienceOnBeginMsiTransactionBegin(
380 args.wzTransactionId = wzTransactionId; 380 args.wzTransactionId = wzTransactionId;
381 381
382 results.cbSize = sizeof(results); 382 results.cbSize = sizeof(results);
383 383
384 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN, &args, &results); 384 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN, &args, &results);
385 ExitOnFailure(hr, "BA OnBeginMsiTransactionBegin failed."); 385 ExitOnFailure(hr, "BA OnBeginMsiTransactionBegin failed.");
386 386
@@ -1017,7 +1017,7 @@ EXTERN_C BAAPI UserExperienceOnCommitMsiTransactionBegin(
1017 args.wzTransactionId = wzTransactionId; 1017 args.wzTransactionId = wzTransactionId;
1018 1018
1019 results.cbSize = sizeof(results); 1019 results.cbSize = sizeof(results);
1020 1020
1021 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN, &args, &results); 1021 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN, &args, &results);
1022 ExitOnFailure(hr, "BA OnCommitMsiTransactionBegin failed."); 1022 ExitOnFailure(hr, "BA OnCommitMsiTransactionBegin failed.");
1023 1023
@@ -1033,8 +1033,10 @@ LExit:
1033EXTERN_C BAAPI UserExperienceOnCommitMsiTransactionComplete( 1033EXTERN_C BAAPI UserExperienceOnCommitMsiTransactionComplete(
1034 __in BURN_USER_EXPERIENCE* pUserExperience, 1034 __in BURN_USER_EXPERIENCE* pUserExperience,
1035 __in LPCWSTR wzTransactionId, 1035 __in LPCWSTR wzTransactionId,
1036 __in HRESULT hrStatus 1036 __in HRESULT hrStatus,
1037 ) 1037 __in BOOTSTRAPPER_APPLY_RESTART restart,
1038 __inout BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION* pAction
1039)
1038{ 1040{
1039 HRESULT hr = S_OK; 1041 HRESULT hr = S_OK;
1040 BA_ONCOMMITMSITRANSACTIONCOMPLETE_ARGS args = { }; 1042 BA_ONCOMMITMSITRANSACTIONCOMPLETE_ARGS args = { };
@@ -1043,12 +1045,17 @@ EXTERN_C BAAPI UserExperienceOnCommitMsiTransactionComplete(
1043 args.cbSize = sizeof(args); 1045 args.cbSize = sizeof(args);
1044 args.wzTransactionId = wzTransactionId; 1046 args.wzTransactionId = wzTransactionId;
1045 args.hrStatus = hrStatus; 1047 args.hrStatus = hrStatus;
1048 args.restart = restart;
1049 args.recommendation = *pAction;
1046 1050
1047 results.cbSize = sizeof(results); 1051 results.cbSize = sizeof(results);
1052 results.action = *pAction;
1048 1053
1049 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE, &args, &results); 1054 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE, &args, &results);
1050 ExitOnFailure(hr, "BA OnCommitMsiTransactionComplete failed."); 1055 ExitOnFailure(hr, "BA OnCommitMsiTransactionComplete failed.");
1051 1056
1057 *pAction = results.action;
1058
1052LExit: 1059LExit:
1053 return hr; 1060 return hr;
1054} 1061}
@@ -1908,7 +1915,7 @@ EXTERN_C BAAPI UserExperienceOnPauseAUBegin(
1908 args.cbSize = sizeof(args); 1915 args.cbSize = sizeof(args);
1909 1916
1910 results.cbSize = sizeof(results); 1917 results.cbSize = sizeof(results);
1911 1918
1912 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN, &args, &results); 1919 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN, &args, &results);
1913 ExitOnFailure(hr, "BA OnPauseAUBegin failed."); 1920 ExitOnFailure(hr, "BA OnPauseAUBegin failed.");
1914 1921
@@ -2523,7 +2530,7 @@ EXTERN_C BAAPI UserExperienceOnRollbackMsiTransactionBegin(
2523 args.wzTransactionId = wzTransactionId; 2530 args.wzTransactionId = wzTransactionId;
2524 2531
2525 results.cbSize = sizeof(results); 2532 results.cbSize = sizeof(results);
2526 2533
2527 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN, &args, &results); 2534 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN, &args, &results);
2528 ExitOnFailure(hr, "BA OnRollbackMsiTransactionBegin failed."); 2535 ExitOnFailure(hr, "BA OnRollbackMsiTransactionBegin failed.");
2529 2536
@@ -2534,7 +2541,9 @@ LExit:
2534EXTERN_C BAAPI UserExperienceOnRollbackMsiTransactionComplete( 2541EXTERN_C BAAPI UserExperienceOnRollbackMsiTransactionComplete(
2535 __in BURN_USER_EXPERIENCE* pUserExperience, 2542 __in BURN_USER_EXPERIENCE* pUserExperience,
2536 __in LPCWSTR wzTransactionId, 2543 __in LPCWSTR wzTransactionId,
2537 __in HRESULT hrStatus 2544 __in HRESULT hrStatus,
2545 __in BOOTSTRAPPER_APPLY_RESTART restart,
2546 __inout BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION *pAction
2538 ) 2547 )
2539{ 2548{
2540 HRESULT hr = S_OK; 2549 HRESULT hr = S_OK;
@@ -2544,12 +2553,17 @@ EXTERN_C BAAPI UserExperienceOnRollbackMsiTransactionComplete(
2544 args.cbSize = sizeof(args); 2553 args.cbSize = sizeof(args);
2545 args.wzTransactionId = wzTransactionId; 2554 args.wzTransactionId = wzTransactionId;
2546 args.hrStatus = hrStatus; 2555 args.hrStatus = hrStatus;
2556 args.restart = restart;
2557 args.recommendation = *pAction;
2547 2558
2548 results.cbSize = sizeof(results); 2559 results.cbSize = sizeof(results);
2560 results.action = *pAction;
2549 2561
2550 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE, &args, &results); 2562 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE, &args, &results);
2551 ExitOnFailure(hr, "BA OnRollbackMsiTransactionComplete failed."); 2563 ExitOnFailure(hr, "BA OnRollbackMsiTransactionComplete failed.");
2552 2564
2565 *pAction = results.action;
2566
2553LExit: 2567LExit:
2554 return hr; 2568 return hr;
2555} 2569}
@@ -2651,7 +2665,7 @@ EXTERN_C BAAPI UserExperienceOnSystemRestorePointBegin(
2651 args.cbSize = sizeof(args); 2665 args.cbSize = sizeof(args);
2652 2666
2653 results.cbSize = sizeof(results); 2667 results.cbSize = sizeof(results);
2654 2668
2655 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN, &args, &results); 2669 hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN, &args, &results);
2656 ExitOnFailure(hr, "BA OnSystemRestorePointBegin failed."); 2670 ExitOnFailure(hr, "BA OnSystemRestorePointBegin failed.");
2657 2671
diff --git a/src/burn/engine/userexperience.h b/src/burn/engine/userexperience.h
index e342da03..4f15c5d7 100644
--- a/src/burn/engine/userexperience.h
+++ b/src/burn/engine/userexperience.h
@@ -251,8 +251,10 @@ BAAPI UserExperienceOnCommitMsiTransactionBegin(
251BAAPI UserExperienceOnCommitMsiTransactionComplete( 251BAAPI UserExperienceOnCommitMsiTransactionComplete(
252 __in BURN_USER_EXPERIENCE* pUserExperience, 252 __in BURN_USER_EXPERIENCE* pUserExperience,
253 __in LPCWSTR wzTransactionId, 253 __in LPCWSTR wzTransactionId,
254 __in HRESULT hrStatus 254 __in HRESULT hrStatus,
255 ); 255 __in BOOTSTRAPPER_APPLY_RESTART restart,
256 __inout BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION* pAction
257);
256BAAPI UserExperienceOnDetectBegin( 258BAAPI UserExperienceOnDetectBegin(
257 __in BURN_USER_EXPERIENCE* pUserExperience, 259 __in BURN_USER_EXPERIENCE* pUserExperience,
258 __in BOOL fCached, 260 __in BOOL fCached,
@@ -567,8 +569,10 @@ BAAPI UserExperienceOnRollbackMsiTransactionBegin(
567BAAPI UserExperienceOnRollbackMsiTransactionComplete( 569BAAPI UserExperienceOnRollbackMsiTransactionComplete(
568 __in BURN_USER_EXPERIENCE* pUserExperience, 570 __in BURN_USER_EXPERIENCE* pUserExperience,
569 __in LPCWSTR wzTransactionId, 571 __in LPCWSTR wzTransactionId,
570 __in HRESULT hrStatus 572 __in HRESULT hrStatus,
571 ); 573 __in BOOTSTRAPPER_APPLY_RESTART restart,
574 __inout BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION* pAction
575);
572BAAPI UserExperienceOnSetUpdateBegin( 576BAAPI UserExperienceOnSetUpdateBegin(
573 __in BURN_USER_EXPERIENCE* pUserExperience 577 __in BURN_USER_EXPERIENCE* pUserExperience
574 ); 578 );