diff options
| author | Nir Bar <nir.bar@panel-sw.co.il> | 2022-12-06 13:22:41 +0200 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-12-12 21:50:39 -0600 |
| commit | 50e24e9cf2084b6cb67b5d8fc509163061408bb6 (patch) | |
| tree | 05c9df57480eb6308c3462c13847b43288f9dbb4 /src/burn/engine/apply.cpp | |
| parent | c54f3083489827a1e57c6fd7f3d76f62ddc6e85e (diff) | |
| download | wix-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/engine/apply.cpp')
| -rw-r--r-- | src/burn/engine/apply.cpp | 48 |
1 files changed, 32 insertions, 16 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( | |||
| 300 | static HRESULT ExecuteMsiCommitTransaction( | 300 | static 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 | ); |
| 305 | static HRESULT ExecuteMsiRollbackTransaction( | 306 | static 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 | ); |
| 310 | static void ResetTransactionRegistrationState( | 312 | static 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: | |||
| 3381 | static HRESULT ExecuteMsiCommitTransaction( | 3383 | static 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( | |||
| 3414 | LExit: | 3418 | LExit: |
| 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: | |||
| 3423 | static HRESULT ExecuteMsiRollbackTransaction( | 3432 | static 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 | ||
| 3450 | LExit: | 3461 | LExit: |
| @@ -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; |
