From 513286d4798572cc82a78554ef15ef2fe79f407e Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Thu, 21 May 2020 14:13:16 +1000 Subject: WIXBUG:5980 Fix bugs around INSTALLUILEVEL_SOURCERESONLY. Apply requires a valid hWnd since otherwise a source resolution prompt could hang the bundle. Burn now defaults to INSTALLUILEVEL_NONE by itself if the bundle is not showing UI. --- src/engine/EngineForApplication.cpp | 6 ++++++ src/engine/core.cpp | 8 ++++---- src/engine/msiengine.cpp | 14 +++++++++++--- src/engine/msiengine.h | 2 ++ src/engine/mspengine.cpp | 9 ++++++--- src/engine/mspengine.h | 1 + src/engine/plan.cpp | 20 +++++++++++++------- src/engine/plan.h | 4 ++++ 8 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/engine/EngineForApplication.cpp b/src/engine/EngineForApplication.cpp index c3600c7b..e559b438 100644 --- a/src/engine/EngineForApplication.cpp +++ b/src/engine/EngineForApplication.cpp @@ -709,6 +709,12 @@ static HRESULT BAEngineApply( { HRESULT hr = S_OK; + ExitOnNull(pArgs->hwndParent, hr, E_INVALIDARG, "BA passed NULL hwndParent to Apply."); + if (!::IsWindow(pArgs->hwndParent)) + { + ExitOnFailure(hr = E_INVALIDARG, "BA passed invalid hwndParent to Apply."); + } + if (!::PostThreadMessageW(pContext->dwThreadId, WM_BURN_APPLY, 0, reinterpret_cast(pArgs->hwndParent))) { ExitWithLastError(hr, "Failed to post apply message."); diff --git a/src/engine/core.cpp b/src/engine/core.cpp index c153f162..26e74588 100644 --- a/src/engine/core.cpp +++ b/src/engine/core.cpp @@ -431,7 +431,7 @@ extern "C" HRESULT CorePlan( ExitOnFailure(hr, "Failed to plan the layout of the bundle."); // Plan the packages' layout. - hr = PlanPackages(&pEngineState->registration, &pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, FALSE, pEngineState->command.relationType, sczLayoutDirectory, &hSyncpointEvent); + hr = PlanPackages(&pEngineState->registration, &pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, FALSE, pEngineState->command.display, pEngineState->command.relationType, sczLayoutDirectory, &hSyncpointEvent); ExitOnFailure(hr, "Failed to plan packages."); } else if (BOOTSTRAPPER_ACTION_UPDATE_REPLACE == action || BOOTSTRAPPER_ACTION_UPDATE_REPLACE_EMBEDDED == action) @@ -440,7 +440,7 @@ extern "C" HRESULT CorePlan( pUpgradeBundlePackage = &pEngineState->update.package; - hr = PlanUpdateBundle(&pEngineState->userExperience, pUpgradeBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.relationType, &hSyncpointEvent); + hr = PlanUpdateBundle(&pEngineState->userExperience, pUpgradeBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent); ExitOnFailure(hr, "Failed to plan update."); } else if (pEngineState->registration.fEnabledForwardCompatibleBundle) @@ -449,7 +449,7 @@ extern "C" HRESULT CorePlan( pForwardCompatibleBundlePackage = &pEngineState->registration.forwardCompatibleBundle; - hr = PlanPassThroughBundle(&pEngineState->userExperience, pForwardCompatibleBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.relationType, &hSyncpointEvent); + hr = PlanPassThroughBundle(&pEngineState->userExperience, pForwardCompatibleBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent); ExitOnFailure(hr, "Failed to plan passthrough."); } else // doing an action that modifies the machine state. @@ -471,7 +471,7 @@ extern "C" HRESULT CorePlan( hr = PlanRelatedBundlesBegin(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->plan); ExitOnFailure(hr, "Failed to plan related bundles."); - hr = PlanPackages(&pEngineState->registration, &pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->registration.fInstalled, pEngineState->command.relationType, NULL, &hSyncpointEvent); + hr = PlanPackages(&pEngineState->registration, &pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->registration.fInstalled, pEngineState->command.display, pEngineState->command.relationType, NULL, &hSyncpointEvent); ExitOnFailure(hr, "Failed to plan packages."); // Schedule the update of related bundles last. diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp index 3f89dde9..8b8121c1 100644 --- a/src/engine/msiengine.cpp +++ b/src/engine/msiengine.cpp @@ -873,6 +873,7 @@ LExit: // PlanAdd - adds the calculated execute and rollback actions for the package. // extern "C" HRESULT MsiEnginePlanAddPackage( + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in BURN_PACKAGE* pPackage, __in BURN_PLAN* pPlan, @@ -928,7 +929,7 @@ extern "C" HRESULT MsiEnginePlanAddPackage( pAction->msiPackage.rgFeatures = rgRollbackFeatureActions; rgRollbackFeatureActions = NULL; - hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, FALSE, pAction->msiPackage.action, + hr = MsiEngineCalculateInstallUiLevel(display, pUserExperience, pPackage->sczId, FALSE, pAction->msiPackage.action, &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler); ExitOnFailure(hr, "Failed to get msi ui options."); @@ -954,7 +955,7 @@ extern "C" HRESULT MsiEnginePlanAddPackage( pAction->msiPackage.rgFeatures = rgFeatureActions; rgFeatureActions = NULL; - hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, TRUE, pAction->msiPackage.action, + hr = MsiEngineCalculateInstallUiLevel(display, pUserExperience, pPackage->sczId, TRUE, pAction->msiPackage.action, &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler); ExitOnFailure(hr, "Failed to get msi ui options."); @@ -1416,6 +1417,7 @@ LExit: } extern "C" HRESULT MsiEngineCalculateInstallUiLevel( + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in LPCWSTR wzPackageId, __in BOOL fExecute, @@ -1425,9 +1427,15 @@ extern "C" HRESULT MsiEngineCalculateInstallUiLevel( __out BOOL* pfDisableExternalUiHandler ) { - *pUiLevel = static_cast(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY); + *pUiLevel = INSTALLUILEVEL_NONE; *pfDisableExternalUiHandler = FALSE; + if (BOOTSTRAPPER_DISPLAY_FULL == display || + BOOTSTRAPPER_DISPLAY_PASSIVE == display) + { + *pUiLevel = static_cast(*pUiLevel | INSTALLUILEVEL_SOURCERESONLY); + } + switch (actionState) { case BOOTSTRAPPER_ACTION_STATE_UNINSTALL: diff --git a/src/engine/msiengine.h b/src/engine/msiengine.h index cbe80262..04c375c2 100644 --- a/src/engine/msiengine.h +++ b/src/engine/msiengine.h @@ -32,6 +32,7 @@ HRESULT MsiEnginePlanCalculatePackage( __out_opt BOOL* pfBARequestedCache ); HRESULT MsiEnginePlanAddPackage( + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in BURN_PACKAGE* pPackage, __in BURN_PLAN* pPlan, @@ -67,6 +68,7 @@ HRESULT MsiEngineConcatProperties( __in BOOL fObfuscateHiddenVariables ); HRESULT MsiEngineCalculateInstallUiLevel( + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in LPCWSTR wzPackageId, __in BOOL fExecute, diff --git a/src/engine/mspengine.cpp b/src/engine/mspengine.cpp index 0dddb366..57321d75 100644 --- a/src/engine/mspengine.cpp +++ b/src/engine/mspengine.cpp @@ -44,6 +44,7 @@ static void DeterminePatchChainedTarget( __out BOOL* pfSlipstreamed ); static HRESULT PlanTargetProduct( + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in BOOL fRollback, __in BURN_PLAN* pPlan, @@ -396,6 +397,7 @@ LExit: // PlanAdd - adds the calculated execute and rollback actions for the package. // extern "C" HRESULT MspEnginePlanAddPackage( + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in BURN_PACKAGE* pPackage, __in BURN_PLAN* pPlan, @@ -433,13 +435,13 @@ extern "C" HRESULT MspEnginePlanAddPackage( if (BOOTSTRAPPER_ACTION_STATE_NONE != pTargetProduct->execute) { - hr = PlanTargetProduct(pUserExperience, FALSE, pPlan, pLog, pVariables, pTargetProduct->execute, pPackage, pTargetProduct, hCacheEvent); + hr = PlanTargetProduct(display, pUserExperience, FALSE, pPlan, pLog, pVariables, pTargetProduct->execute, pPackage, pTargetProduct, hCacheEvent); ExitOnFailure(hr, "Failed to plan target product."); } if (BOOTSTRAPPER_ACTION_STATE_NONE != pTargetProduct->rollback) { - hr = PlanTargetProduct(pUserExperience, TRUE, pPlan, pLog, pVariables, pTargetProduct->rollback, pPackage, pTargetProduct, hCacheEvent); + hr = PlanTargetProduct(display, pUserExperience, TRUE, pPlan, pLog, pVariables, pTargetProduct->rollback, pPackage, pTargetProduct, hCacheEvent); ExitOnFailure(hr, "Failed to plan rollack target product."); } } @@ -877,6 +879,7 @@ static void DeterminePatchChainedTarget( } static HRESULT PlanTargetProduct( + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in BOOL fRollback, __in BURN_PLAN* pPlan, @@ -934,7 +937,7 @@ static HRESULT PlanTargetProduct( hr = StrAllocString(&pAction->mspTarget.sczTargetProductCode, pTargetProduct->wzTargetProductCode, 0); ExitOnFailure(hr, "Failed to copy target product code."); - hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, !fRollback, pAction->mspTarget.action, + hr = MsiEngineCalculateInstallUiLevel(display, pUserExperience, pPackage->sczId, !fRollback, pAction->mspTarget.action, &pAction->mspTarget.actionMsiProperty, &pAction->mspTarget.uiLevel, &pAction->mspTarget.fDisableExternalUiHandler); ExitOnFailure(hr, "Failed to get msp ui options."); diff --git a/src/engine/mspengine.h b/src/engine/mspengine.h index 0f323e57..1f0c31df 100644 --- a/src/engine/mspengine.h +++ b/src/engine/mspengine.h @@ -38,6 +38,7 @@ HRESULT MspEnginePlanCalculatePackage( __out_opt BOOL* pfBARequestedCache ); HRESULT MspEnginePlanAddPackage( + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in BURN_PACKAGE* pPackage, __in BURN_PLAN* pPlan, diff --git a/src/engine/plan.cpp b/src/engine/plan.cpp index 02f5be23..0b040bf8 100644 --- a/src/engine/plan.cpp +++ b/src/engine/plan.cpp @@ -31,6 +31,7 @@ static HRESULT ProcessPackage( __in BURN_PACKAGE* pPackage, __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, + __in BOOTSTRAPPER_DISPLAY display, __in BOOTSTRAPPER_RELATION_TYPE relationType, __in_z_opt LPCWSTR wzLayoutDirectory, __inout HANDLE* phSyncpointEvent, @@ -472,6 +473,7 @@ extern "C" HRESULT PlanPackages( __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, __in BOOL fBundleInstalled, + __in BOOTSTRAPPER_DISPLAY display, __in BOOTSTRAPPER_RELATION_TYPE relationType, __in_z_opt LPCWSTR wzLayoutDirectory, __inout HANDLE* phSyncpointEvent @@ -509,7 +511,7 @@ extern "C" HRESULT PlanPackages( } } - hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices); + hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, display, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices); ExitOnFailure(hr, "Failed to process package."); // Attempt to remove orphaned packages during uninstall. Currently only MSI packages are supported and should not require source. @@ -534,7 +536,7 @@ extern "C" HRESULT PlanPackages( ExitOnFailure(hr, "Failed to copy installed ProductCode"); // Process the compatible MSI package like any other. - hr = ProcessPackage(fBundlePerMachine, pPackage, pUX, pPlan, pCompatiblePackage, pLog, pVariables, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices); + hr = ProcessPackage(fBundlePerMachine, pPackage, pUX, pPlan, pCompatiblePackage, pLog, pVariables, display, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices); ExitOnFailure(hr, "Failed to process compatible package."); if (BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pCompatiblePackage->execute) @@ -785,6 +787,7 @@ extern "C" HRESULT PlanPassThroughBundle( __in BURN_PLAN* pPlan, __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, + __in BOOTSTRAPPER_DISPLAY display, __in BOOTSTRAPPER_RELATION_TYPE relationType, __inout HANDLE* phSyncpointEvent ) @@ -794,7 +797,7 @@ extern "C" HRESULT PlanPassThroughBundle( BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; // Plan passthrough package. - hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL); + hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, display, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL); ExitOnFailure(hr, "Failed to process passthrough package."); // If we still have an open rollback boundary, complete it. @@ -818,6 +821,7 @@ extern "C" HRESULT PlanUpdateBundle( __in BURN_PLAN* pPlan, __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, + __in BOOTSTRAPPER_DISPLAY display, __in BOOTSTRAPPER_RELATION_TYPE relationType, __inout HANDLE* phSyncpointEvent ) @@ -827,7 +831,7 @@ extern "C" HRESULT PlanUpdateBundle( BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; // Plan update package. - hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL); + hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, display, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL); ExitOnFailure(hr, "Failed to process update package."); // If we still have an open rollback boundary, complete it. @@ -853,6 +857,7 @@ static HRESULT ProcessPackage( __in BURN_PACKAGE* pPackage, __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, + __in BOOTSTRAPPER_DISPLAY display, __in BOOTSTRAPPER_RELATION_TYPE relationType, __in_z_opt LPCWSTR wzLayoutDirectory, __inout HANDLE* phSyncpointEvent, @@ -906,7 +911,7 @@ static HRESULT ProcessPackage( } } - hr = PlanExecutePackage(fBundlePerMachine, pUX, pPlan, pPackage, pLog, pVariables, phSyncpointEvent); + hr = PlanExecutePackage(fBundlePerMachine, display, pUX, pPlan, pPackage, pLog, pVariables, phSyncpointEvent); ExitOnFailure(hr, "Failed to plan execute package."); if (pPackage->fUninstallable && pNonpermanentPackageIndices) @@ -1086,6 +1091,7 @@ LExit: extern "C" HRESULT PlanExecutePackage( __in BOOL fPerMachine, + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in BURN_PLAN* pPlan, __in BURN_PACKAGE* pPackage, @@ -1150,11 +1156,11 @@ extern "C" HRESULT PlanExecutePackage( break; case BURN_PACKAGE_TYPE_MSI: - hr = MsiEnginePlanAddPackage(pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire); + hr = MsiEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire); break; case BURN_PACKAGE_TYPE_MSP: - hr = MspEnginePlanAddPackage(pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire); + hr = MspEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire); break; case BURN_PACKAGE_TYPE_MSU: diff --git a/src/engine/plan.h b/src/engine/plan.h index 89f4b4bf..db9745e9 100644 --- a/src/engine/plan.h +++ b/src/engine/plan.h @@ -408,6 +408,7 @@ HRESULT PlanPackages( __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, __in BOOL fBundleInstalled, + __in BOOTSTRAPPER_DISPLAY display, __in BOOTSTRAPPER_RELATION_TYPE relationType, __in_z_opt LPCWSTR wzLayoutDirectory, __inout HANDLE* phSyncpointEvent @@ -426,6 +427,7 @@ HRESULT PlanPassThroughBundle( __in BURN_PLAN* pPlan, __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, + __in BOOTSTRAPPER_DISPLAY display, __in BOOTSTRAPPER_RELATION_TYPE relationType, __inout HANDLE* phSyncpointEvent ); @@ -435,6 +437,7 @@ HRESULT PlanUpdateBundle( __in BURN_PLAN* pPlan, __in BURN_LOGGING* pLog, __in BURN_VARIABLES* pVariables, + __in BOOTSTRAPPER_DISPLAY display, __in BOOTSTRAPPER_RELATION_TYPE relationType, __inout HANDLE* phSyncpointEvent ); @@ -453,6 +456,7 @@ HRESULT PlanCachePackage( ); HRESULT PlanExecutePackage( __in BOOL fPerMachine, + __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in BURN_PLAN* pPlan, __in BURN_PACKAGE* pPackage, -- cgit v1.2.3-55-g6feb