summaryrefslogtreecommitdiff
path: root/src/burn/engine/apply.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/apply.cpp')
-rw-r--r--src/burn/engine/apply.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp
index 5cc63d02..73f8fc72 100644
--- a/src/burn/engine/apply.cpp
+++ b/src/burn/engine/apply.cpp
@@ -210,6 +210,11 @@ static HRESULT ExecuteRelatedBundle(
210 __out BOOL* pfSuspend, 210 __out BOOL* pfSuspend,
211 __out BOOTSTRAPPER_APPLY_RESTART* pRestart 211 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
212 ); 212 );
213static HRESULT DoRestoreRelatedBundleActions(
214 __in BURN_ENGINE_STATE* pEngineState,
215 __in BURN_EXECUTE_CONTEXT* pContext,
216 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
217 );
213static HRESULT ExecuteExePackage( 218static HRESULT ExecuteExePackage(
214 __in BURN_ENGINE_STATE* pEngineState, 219 __in BURN_ENGINE_STATE* pEngineState,
215 __in BURN_EXECUTE_ACTION* pExecuteAction, 220 __in BURN_EXECUTE_ACTION* pExecuteAction,
@@ -788,6 +793,9 @@ extern "C" HRESULT ApplyExecute(
788 { 793 {
789 if (pCheckpoint->pActiveRollbackBoundary->fVital) 794 if (pCheckpoint->pActiveRollbackBoundary->fVital)
790 { 795 {
796 hrRollback = DoRestoreRelatedBundleActions(pEngineState, &context, pRestart);
797 IgnoreRollbackError(hrRollback, "Failed rollback actions");
798
791 // If the rollback boundary is vital, end execution here. 799 // If the rollback boundary is vital, end execution here.
792 break; 800 break;
793 } 801 }
@@ -2590,6 +2598,48 @@ LExit:
2590 return hr; 2598 return hr;
2591} 2599}
2592 2600
2601static HRESULT DoRestoreRelatedBundleActions(
2602 __in BURN_ENGINE_STATE* pEngineState,
2603 __in BURN_EXECUTE_CONTEXT* pContext,
2604 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
2605 )
2606{
2607 HRESULT hr = S_OK;
2608 BOOL fRetryIgnored = FALSE;
2609 BOOL fSuspendIgnored = FALSE;
2610
2611 // execute restore related bundle actions
2612 for (DWORD i = 0; i < pEngineState->plan.cRestoreRelatedBundleActions; ++i)
2613 {
2614 BURN_EXECUTE_ACTION* pRestoreRelatedBundleAction = &pEngineState->plan.rgRestoreRelatedBundleActions[i];
2615 if (pRestoreRelatedBundleAction->fDeleted)
2616 {
2617 continue;
2618 }
2619
2620 BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE;
2621 switch (pRestoreRelatedBundleAction->type)
2622 {
2623 case BURN_EXECUTE_ACTION_TYPE_RELATED_BUNDLE:
2624 hr = ExecuteRelatedBundle(pEngineState, pRestoreRelatedBundleAction, pContext, TRUE, &fRetryIgnored, &fSuspendIgnored, &restart);
2625 IgnoreRollbackError(hr, "Failed to restore related bundle package.");
2626 break;
2627
2628 default:
2629 hr = E_UNEXPECTED;
2630 ExitOnFailure(hr, "Invalid restore related bundle action: %d.", pRestoreRelatedBundleAction->type);
2631 }
2632
2633 if (*pRestart < restart)
2634 {
2635 *pRestart = restart;
2636 }
2637 }
2638
2639LExit:
2640 return hr;
2641}
2642
2593static HRESULT ExecuteExePackage( 2643static HRESULT ExecuteExePackage(
2594 __in BURN_ENGINE_STATE* pEngineState, 2644 __in BURN_ENGINE_STATE* pEngineState,
2595 __in BURN_EXECUTE_ACTION* pExecuteAction, 2645 __in BURN_EXECUTE_ACTION* pExecuteAction,