From fbc1a73743368211d5d8c7fc0625adf6eb9ca50c Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 18 Mar 2022 20:16:07 -0500 Subject: Add checkpoint so Exe and Msu packages rollback after being cancelled. Fixes 5950 --- src/burn/engine/exeengine.cpp | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) (limited to 'src/burn/engine/exeengine.cpp') diff --git a/src/burn/engine/exeengine.cpp b/src/burn/engine/exeengine.cpp index 4c3c6fb0..a1049006 100644 --- a/src/burn/engine/exeengine.cpp +++ b/src/burn/engine/exeengine.cpp @@ -276,30 +276,33 @@ extern "C" HRESULT ExeEnginePlanAddPackage( hr = DependencyPlanPackage(NULL, pPackage, pPlan); ExitOnFailure(hr, "Failed to plan package dependency actions."); - // add execute action - if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->execute) + // add rollback action + if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->rollback) { - hr = PlanAppendExecuteAction(pPlan, &pAction); - ExitOnFailure(hr, "Failed to append execute action."); + hr = PlanAppendRollbackAction(pPlan, &pAction); + ExitOnFailure(hr, "Failed to append rollback action."); pAction->type = BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE; pAction->exePackage.pPackage = pPackage; - pAction->exePackage.action = pPackage->execute; + pAction->exePackage.action = pPackage->rollback; - LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, NULL); // ignore errors. + LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, NULL); // ignore errors. + + hr = PlanExecuteCheckpoint(pPlan); + ExitOnFailure(hr, "Failed to append execute checkpoint."); } - // add rollback action - if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->rollback) + // add execute action + if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->execute) { - hr = PlanAppendRollbackAction(pPlan, &pAction); - ExitOnFailure(hr, "Failed to append rollback action."); + hr = PlanAppendExecuteAction(pPlan, &pAction); + ExitOnFailure(hr, "Failed to append execute action."); pAction->type = BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE; pAction->exePackage.pPackage = pPackage; - pAction->exePackage.action = pPackage->rollback; + pAction->exePackage.action = pPackage->execute; - LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, NULL); // ignore errors. + LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, NULL); // ignore errors. } LExit: @@ -493,6 +496,10 @@ extern "C" HRESULT ExeEngineRunProcess( ExitWithLastError(hr, "Failed to CreateProcess on path: %ls", wzExecutablePath); } + message.type = GENERIC_EXECUTE_MESSAGE_PROCESS_STARTED; + message.dwUIHint = MB_OK; + pfnGenericMessageHandler(&message, pvContext); + if (fFireAndForget) { ::WaitForInputIdle(pi.hProcess, 5000); @@ -504,6 +511,7 @@ extern "C" HRESULT ExeEngineRunProcess( // Wait for the executable process while sending fake progress to allow cancel. do { + memset(&message, 0, sizeof(message)); message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS; message.dwUIHint = MB_OKCANCEL; message.progress.dwPercentage = 50; @@ -546,6 +554,11 @@ extern "C" HRESULT ExeEngineRunProcess( } } while (HRESULT_FROM_WIN32(WAIT_TIMEOUT) == hr); + memset(&message, 0, sizeof(message)); + message.type = GENERIC_EXECUTE_MESSAGE_PROCESS_COMPLETED; + message.dwUIHint = MB_OK; + pfnGenericMessageHandler(&message, pvContext); + if (fDelayedCancel) { ExitWithRootFailure(hr, HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT), "Bootstrapper application cancelled during package process progress, exit code: 0x%x", *pdwExitCode); -- cgit v1.2.3-55-g6feb