From 50cb451bcee148afd9768086c1bb5ed4f75562df Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Thu, 14 May 2020 19:59:06 +1000 Subject: WIXFEAT:6164 Give BA control over UI level and handler. --- src/engine/apply.cpp | 8 +-- src/engine/core.cpp | 8 +-- src/engine/elevation.cpp | 24 +++++++++ src/engine/engine.vcxproj | 8 +-- src/engine/msiengine.cpp | 117 +++++++++++++++++++++++++++++++----------- src/engine/msiengine.h | 18 +++++-- src/engine/mspengine.cpp | 38 +++++++++----- src/engine/mspengine.h | 2 +- src/engine/package.h | 2 - src/engine/packages.config | 4 +- src/engine/plan.cpp | 24 ++++----- src/engine/plan.h | 8 +-- src/engine/userexperience.cpp | 47 ++++++++++++++++- src/engine/userexperience.h | 13 ++++- src/stub/packages.config | 2 +- src/stub/stub.vcxproj | 4 +- 16 files changed, 237 insertions(+), 90 deletions(-) (limited to 'src') diff --git a/src/engine/apply.cpp b/src/engine/apply.cpp index ee11cdee..eae7c681 100644 --- a/src/engine/apply.cpp +++ b/src/engine/apply.cpp @@ -2064,7 +2064,7 @@ static HRESULT ExecuteExePackage( fBeginCalled = TRUE; // Send package execute begin to BA. - hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->exePackage.pPackage->sczId, !fRollback, pExecuteAction->exePackage.action); + hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->exePackage.pPackage->sczId, !fRollback, pExecuteAction->exePackage.action, INSTALLUILEVEL_NOCHANGE, false); ExitOnRootFailure(hr, "BA aborted execute EXE package begin."); message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS; @@ -2133,7 +2133,7 @@ static HRESULT ExecuteMsiPackage( fBeginCalled = TRUE; // Send package execute begin to BA. - hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msiPackage.pPackage->sczId, !fRollback, pExecuteAction->msiPackage.action); + hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msiPackage.pPackage->sczId, !fRollback, pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.uiLevel, pExecuteAction->msiPackage.fDisableExternalUiHandler); ExitOnRootFailure(hr, "BA aborted execute MSI package begin."); // execute package @@ -2188,7 +2188,7 @@ static HRESULT ExecuteMspPackage( fBeginCalled = TRUE; // Send package execute begin to BA. - hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->mspTarget.pPackage->sczId, !fRollback, pExecuteAction->mspTarget.action); + hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->mspTarget.pPackage->sczId, !fRollback, pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.uiLevel, pExecuteAction->mspTarget.fDisableExternalUiHandler); ExitOnRootFailure(hr, "BA aborted execute MSP package begin."); // Now send all the patches that target this product code. @@ -2255,7 +2255,7 @@ static HRESULT ExecuteMsuPackage( fBeginCalled = TRUE; // Send package execute begin to BA. - hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msuPackage.pPackage->sczId, !fRollback, pExecuteAction->msuPackage.action); + hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msuPackage.pPackage->sczId, !fRollback, pExecuteAction->msuPackage.action, INSTALLUILEVEL_NOCHANGE, false); ExitOnRootFailure(hr, "BA aborted execute MSU package begin."); message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS; diff --git a/src/engine/core.cpp b/src/engine/core.cpp index 26e74588..c153f162 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.display, pEngineState->command.relationType, sczLayoutDirectory, &hSyncpointEvent); + hr = PlanPackages(&pEngineState->registration, &pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, FALSE, 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.display, pEngineState->command.relationType, &hSyncpointEvent); + hr = PlanUpdateBundle(&pEngineState->userExperience, pUpgradeBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, 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.display, pEngineState->command.relationType, &hSyncpointEvent); + hr = PlanPassThroughBundle(&pEngineState->userExperience, pForwardCompatibleBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, 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.display, pEngineState->command.relationType, NULL, &hSyncpointEvent); + hr = PlanPackages(&pEngineState->registration, &pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->registration.fInstalled, pEngineState->command.relationType, NULL, &hSyncpointEvent); ExitOnFailure(hr, "Failed to plan packages."); // Schedule the update of related bundles last. diff --git a/src/engine/elevation.cpp b/src/engine/elevation.cpp index 0b96c300..d0652270 100644 --- a/src/engine/elevation.cpp +++ b/src/engine/elevation.cpp @@ -821,9 +821,15 @@ extern "C" HRESULT ElevationExecuteMsiPackage( hr = BuffWriteString(&pbData, &cbData, pExecuteAction->msiPackage.sczLogPath); ExitOnFailure(hr, "Failed to write package log to message buffer."); + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.actionMsiProperty); + ExitOnFailure(hr, "Failed to write actionMsiProperty to message buffer."); + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.uiLevel); ExitOnFailure(hr, "Failed to write UI level to message buffer."); + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.fDisableExternalUiHandler); + ExitOnFailure(hr, "Failed to write fDisableExternalUiHandler to message buffer."); + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.action); ExitOnFailure(hr, "Failed to write action to message buffer."); @@ -897,9 +903,15 @@ extern "C" HRESULT ElevationExecuteMspPackage( hr = BuffWriteString(&pbData, &cbData, pExecuteAction->mspTarget.sczLogPath); ExitOnFailure(hr, "Failed to write package log to message buffer."); + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.actionMsiProperty); + ExitOnFailure(hr, "Failed to write actionMsiProperty to message buffer."); + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.uiLevel); ExitOnFailure(hr, "Failed to write UI level to message buffer."); + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.fDisableExternalUiHandler); + ExitOnFailure(hr, "Failed to write fDisableExternalUiHandler to message buffer."); + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.action); ExitOnFailure(hr, "Failed to write action to message buffer."); @@ -2237,9 +2249,15 @@ static HRESULT OnExecuteMsiPackage( hr = BuffReadString(pbData, cbData, &iData, &executeAction.msiPackage.sczLogPath); ExitOnFailure(hr, "Failed to read package log."); + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.actionMsiProperty); + ExitOnFailure(hr, "Failed to read actionMsiProperty."); + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.uiLevel); ExitOnFailure(hr, "Failed to read UI level."); + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.fDisableExternalUiHandler); + ExitOnFailure(hr, "Failed to read fDisableExternalUiHandler."); + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.action); ExitOnFailure(hr, "Failed to read action."); @@ -2334,9 +2352,15 @@ static HRESULT OnExecuteMspPackage( hr = BuffReadString(pbData, cbData, &iData, &executeAction.mspTarget.sczLogPath); ExitOnFailure(hr, "Failed to read package log."); + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.actionMsiProperty); + ExitOnFailure(hr, "Failed to read actionMsiProperty."); + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.uiLevel); ExitOnFailure(hr, "Failed to read UI level."); + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.fDisableExternalUiHandler); + ExitOnFailure(hr, "Failed to read fDisableExternalUiHandler."); + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.action); ExitOnFailure(hr, "Failed to read action."); diff --git a/src/engine/engine.vcxproj b/src/engine/engine.vcxproj index 6fd9d64a..80b67b7d 100644 --- a/src/engine/engine.vcxproj +++ b/src/engine/engine.vcxproj @@ -2,8 +2,8 @@ - - + + @@ -166,8 +166,8 @@ rc.exe -fo "$(OutDir)engine.res" "$(IntDir)engine.messages.rc" This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + + diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp index 17571ac5..3f89dde9 100644 --- a/src/engine/msiengine.cpp +++ b/src/engine/msiengine.cpp @@ -4,7 +4,10 @@ // constants - +#define BURNMSIINSTALL_PROPERTY_NAME L"BURNMSIINSTALL" +#define BURNMSIMODIFY_PROPERTY_NAME L"BURNMSIMODIFY" +#define BURNMSIREPAIR_PROPERTY_NAME L"BURNMSIREPAIR" +#define BURNMSIUNINSTALL_PROPERTY_NAME L"BURNMSIUNINSTALL" // structs @@ -79,10 +82,6 @@ extern "C" HRESULT MsiEngineParsePackageFromXml( hr = FileVersionFromStringEx(scz, 0, &pPackage->Msi.qwVersion); ExitOnFailure(hr, "Failed to parse @Version: %ls", scz); - // @DisplayInternalUI - hr = XmlGetYesNoAttribute(pixnMsiPackage, L"DisplayInternalUI", &pPackage->Msi.fDisplayInternalUI); - ExitOnFailure(hr, "Failed to get @DisplayInternalUI."); - // @UpgradeCode hr = XmlGetAttributeEx(pixnMsiPackage, L"UpgradeCode", &pPackage->Msi.sczUpgradeCode); if (E_NOTFOUND != hr) @@ -874,7 +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, __in BURN_LOGGING* pLog, @@ -926,10 +925,13 @@ extern "C" HRESULT MsiEnginePlanAddPackage( pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE; pAction->msiPackage.pPackage = pPackage; pAction->msiPackage.action = pPackage->rollback; - pAction->msiPackage.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msi.fDisplayInternalUI, display, pAction->msiPackage.action); pAction->msiPackage.rgFeatures = rgRollbackFeatureActions; rgRollbackFeatureActions = NULL; + hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, FALSE, pAction->msiPackage.action, + &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler); + ExitOnFailure(hr, "Failed to get msi ui options."); + LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors. pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; @@ -949,10 +951,13 @@ extern "C" HRESULT MsiEnginePlanAddPackage( pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE; pAction->msiPackage.pPackage = pPackage; pAction->msiPackage.action = pPackage->execute; - pAction->msiPackage.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msi.fDisplayInternalUI, display, pAction->msiPackage.action); pAction->msiPackage.rgFeatures = rgFeatureActions; rgFeatureActions = NULL; + hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, TRUE, pAction->msiPackage.action, + &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler); + ExitOnFailure(hr, "Failed to get msi ui options."); + LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors. pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; } @@ -1073,7 +1078,6 @@ extern "C" HRESULT MsiEngineAddCompatiblePackage( } pCompatiblePackage->type = BURN_PACKAGE_TYPE_MSI; - pCompatiblePackage->Msi.fDisplayInternalUI = pPackage->Msi.fDisplayInternalUI; if (ppCompatiblePackage) { @@ -1161,8 +1165,16 @@ extern "C" HRESULT MsiEngineExecutePackage( VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->msiPackage.action, TRUE); // Wire up the external UI handler and logging. - hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->msiPackage.uiLevel, hwndParent, pvContext, fRollback, &context); - ExitOnFailure(hr, "Failed to initialize external UI handler."); + if (pExecuteAction->msiPackage.fDisableExternalUiHandler) + { + hr = WiuInitializeInternalUI(pExecuteAction->msiPackage.uiLevel, hwndParent, &context); + ExitOnFailure(hr, "Failed to initialize internal UI for MSI package."); + } + else + { + hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->msiPackage.uiLevel, hwndParent, pvContext, fRollback, &context); + ExitOnFailure(hr, "Failed to initialize external UI handler."); + } if (pExecuteAction->msiPackage.sczLogPath && *pExecuteAction->msiPackage.sczLogPath) { @@ -1191,6 +1203,12 @@ extern "C" HRESULT MsiEngineExecutePackage( hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, pExecuteAction->msiPackage.rgSlipstreamPatches, &sczObfuscatedProperties); ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string."); + hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczProperties); + ExitOnFailure(hr, "Failed to add action property to argument string."); + + hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczObfuscatedProperties); + ExitOnFailure(hr, "Failed to add action property to obfuscated argument string."); + LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pExecuteAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L""); // @@ -1300,6 +1318,40 @@ LExit: return hr; } +extern "C" HRESULT MsiEngineConcatActionProperty( + __in BURN_MSI_PROPERTY actionMsiProperty, + __deref_out_z LPWSTR* psczProperties + ) +{ + HRESULT hr = S_OK; + LPCWSTR wzPropertyName = NULL; + + switch (actionMsiProperty) + { + case BURN_MSI_PROPERTY_INSTALL: + wzPropertyName = BURNMSIINSTALL_PROPERTY_NAME; + break; + case BURN_MSI_PROPERTY_MODIFY: + wzPropertyName = BURNMSIMODIFY_PROPERTY_NAME; + break; + case BURN_MSI_PROPERTY_REPAIR: + wzPropertyName = BURNMSIREPAIR_PROPERTY_NAME; + break; + case BURN_MSI_PROPERTY_UNINSTALL: + wzPropertyName = BURNMSIUNINSTALL_PROPERTY_NAME; + break; + } + + if (wzPropertyName) + { + hr = StrAllocConcatFormattedSecure(psczProperties, L" %ls=1", wzPropertyName); + ExitOnFailure(hr, "Failed to add burn action property."); + } + +LExit: + return hr; +} + // The contents of psczProperties may be sensitive, should keep encrypted and SecureZeroFree. extern "C" HRESULT MsiEngineConcatProperties( __in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties, @@ -1363,31 +1415,36 @@ LExit: return hr; } -extern "C" INSTALLUILEVEL MsiEngineCalculateInstallUiLevel( - __in BOOL fDisplayInternalUI, - __in BOOTSTRAPPER_DISPLAY display, - __in BOOTSTRAPPER_ACTION_STATE actionState +extern "C" HRESULT MsiEngineCalculateInstallUiLevel( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in LPCWSTR wzPackageId, + __in BOOL fExecute, + __in BOOTSTRAPPER_ACTION_STATE actionState, + __out BURN_MSI_PROPERTY* pActionMsiProperty, + __out INSTALLUILEVEL* pUiLevel, + __out BOOL* pfDisableExternalUiHandler ) { - // Assume there will be no internal UI displayed. - INSTALLUILEVEL uiLevel = static_cast(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY); + *pUiLevel = static_cast(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY); + *pfDisableExternalUiHandler = FALSE; - // suppress internal UI during uninstall to mimic ARP and "msiexec /x" behavior - if (fDisplayInternalUI && BOOTSTRAPPER_ACTION_STATE_UNINSTALL != actionState && BOOTSTRAPPER_ACTION_STATE_REPAIR != actionState) + switch (actionState) { - switch (display) - { - case BOOTSTRAPPER_DISPLAY_FULL: - uiLevel = INSTALLUILEVEL_FULL; - break; - - case BOOTSTRAPPER_DISPLAY_PASSIVE: - uiLevel = INSTALLUILEVEL_REDUCED; - break; - } + case BOOTSTRAPPER_ACTION_STATE_UNINSTALL: + *pActionMsiProperty = BURN_MSI_PROPERTY_UNINSTALL; + break; + case BOOTSTRAPPER_ACTION_STATE_REPAIR: + *pActionMsiProperty = BURN_MSI_PROPERTY_REPAIR; + break; + case BOOTSTRAPPER_ACTION_STATE_MODIFY: + *pActionMsiProperty = BURN_MSI_PROPERTY_MODIFY; + break; + default: + *pActionMsiProperty = BURN_MSI_PROPERTY_INSTALL; + break; } - return uiLevel; + return UserExperienceOnPlanMsiPackage(pUserExperience, wzPackageId, fExecute, actionState, pActionMsiProperty, pUiLevel, pfDisableExternalUiHandler); } diff --git a/src/engine/msiengine.h b/src/engine/msiengine.h index 2a8ebfd5..cbe80262 100644 --- a/src/engine/msiengine.h +++ b/src/engine/msiengine.h @@ -32,7 +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, __in BURN_LOGGING* pLog, @@ -54,6 +54,10 @@ HRESULT MsiEngineExecutePackage( __in LPVOID pvContext, __out BOOTSTRAPPER_APPLY_RESTART* pRestart ); +HRESULT MsiEngineConcatActionProperty( + __in BURN_MSI_PROPERTY actionMsiProperty, + __deref_out_z LPWSTR* psczProperties + ); HRESULT MsiEngineConcatProperties( __in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties, __in DWORD cProperties, @@ -62,10 +66,14 @@ HRESULT MsiEngineConcatProperties( __deref_out_z LPWSTR* psczProperties, __in BOOL fObfuscateHiddenVariables ); -INSTALLUILEVEL MsiEngineCalculateInstallUiLevel( - __in BOOL fDisplayInternalUI, - __in BOOTSTRAPPER_DISPLAY display, - __in BOOTSTRAPPER_ACTION_STATE actionState +HRESULT MsiEngineCalculateInstallUiLevel( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in LPCWSTR wzPackageId, + __in BOOL fExecute, + __in BOOTSTRAPPER_ACTION_STATE actionState, + __out BURN_MSI_PROPERTY* pActionMsiProperty, + __out INSTALLUILEVEL* pUiLevel, + __out BOOL* pfDisableExternalUiHandler ); #if defined(__cplusplus) diff --git a/src/engine/mspengine.cpp b/src/engine/mspengine.cpp index 463799e6..0dddb366 100644 --- a/src/engine/mspengine.cpp +++ b/src/engine/mspengine.cpp @@ -44,7 +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, __in BURN_LOGGING* pLog, @@ -73,10 +73,6 @@ extern "C" HRESULT MspEngineParsePackageFromXml( hr = XmlGetAttributeEx(pixnMspPackage, L"PatchXml", &pPackage->Msp.sczApplicabilityXml); ExitOnFailure(hr, "Failed to get @PatchXml."); - // @DisplayInternalUI - hr = XmlGetYesNoAttribute(pixnMspPackage, L"DisplayInternalUI", &pPackage->Msp.fDisplayInternalUI); - ExitOnFailure(hr, "Failed to get @DisplayInternalUI."); - // Read properties. hr = MsiEngineParsePropertiesFromXml(pixnMspPackage, &pPackage->Msp.rgProperties, &pPackage->Msp.cProperties); ExitOnFailure(hr, "Failed to parse properties from XML."); @@ -400,7 +396,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, __in BURN_LOGGING* pLog, @@ -437,13 +433,13 @@ extern "C" HRESULT MspEnginePlanAddPackage( if (BOOTSTRAPPER_ACTION_STATE_NONE != pTargetProduct->execute) { - hr = PlanTargetProduct(display, FALSE, pPlan, pLog, pVariables, pTargetProduct->execute, pPackage, pTargetProduct, hCacheEvent); + hr = PlanTargetProduct(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(display, TRUE, pPlan, pLog, pVariables, pTargetProduct->rollback, pPackage, pTargetProduct, hCacheEvent); + hr = PlanTargetProduct(pUserExperience, TRUE, pPlan, pLog, pVariables, pTargetProduct->rollback, pPackage, pTargetProduct, hCacheEvent); ExitOnFailure(hr, "Failed to plan rollack target product."); } } @@ -464,7 +460,6 @@ extern "C" HRESULT MspEngineExecutePackage( ) { HRESULT hr = S_OK; - INSTALLUILEVEL uiLevel = pExecuteAction->mspTarget.pPackage->Msp.fDisplayInternalUI ? INSTALLUILEVEL_DEFAULT : static_cast(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY); WIU_MSI_EXECUTE_CONTEXT context = { }; WIU_RESTART restart = WIU_RESTART_NONE; @@ -517,8 +512,16 @@ extern "C" HRESULT MspEngineExecutePackage( VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->mspTarget.action, TRUE); // Wire up the external UI handler and logging. - hr = WiuInitializeExternalUI(pfnMessageHandler, uiLevel, hwndParent, pvContext, fRollback, &context); - ExitOnFailure(hr, "Failed to initialize external UI handler."); + if (pExecuteAction->mspTarget.fDisableExternalUiHandler) + { + hr = WiuInitializeInternalUI(pExecuteAction->mspTarget.uiLevel, hwndParent, &context); + ExitOnFailure(hr, "Failed to initialize internal UI for MSP package."); + } + else + { + hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->mspTarget.uiLevel, hwndParent, pvContext, fRollback, &context); + ExitOnFailure(hr, "Failed to initialize external UI handler."); + } //if (BURN_LOGGING_LEVEL_DEBUG == logLevel) //{ @@ -538,6 +541,12 @@ extern "C" HRESULT MspEngineExecutePackage( hr = MsiEngineConcatProperties(pExecuteAction->mspTarget.pPackage->Msp.rgProperties, pExecuteAction->mspTarget.pPackage->Msp.cProperties, pVariables, fRollback, &sczObfuscatedProperties, TRUE); ExitOnFailure(hr, "Failed to add properties to obfuscated argument string."); + hr = MsiEngineConcatActionProperty(pExecuteAction->mspTarget.actionMsiProperty, &sczProperties); + ExitOnFailure(hr, "Failed to add action property to argument string."); + + hr = MsiEngineConcatActionProperty(pExecuteAction->mspTarget.actionMsiProperty, &sczObfuscatedProperties); + ExitOnFailure(hr, "Failed to add action property to obfuscated argument string."); + LogId(REPORT_STANDARD, MSG_APPLYING_PATCH_PACKAGE, pExecuteAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pExecuteAction->mspTarget.action), sczPatches, sczObfuscatedProperties, pExecuteAction->mspTarget.sczTargetProductCode); // @@ -868,7 +877,7 @@ static void DeterminePatchChainedTarget( } static HRESULT PlanTargetProduct( - __in BOOTSTRAPPER_DISPLAY display, + __in BURN_USER_EXPERIENCE* pUserExperience, __in BOOL fRollback, __in BURN_PLAN* pPlan, __in BURN_LOGGING* pLog, @@ -920,12 +929,15 @@ static HRESULT PlanTargetProduct( pAction->mspTarget.action = actionState; pAction->mspTarget.pPackage = pPackage; pAction->mspTarget.fPerMachineTarget = (MSIINSTALLCONTEXT_MACHINE == pTargetProduct->context); - pAction->mspTarget.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msp.fDisplayInternalUI, display, pAction->mspTarget.action); pAction->mspTarget.pChainedTargetPackage = pTargetProduct->pChainedTargetPackage; pAction->mspTarget.fSlipstream = pTargetProduct->fSlipstream; 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, + &pAction->mspTarget.actionMsiProperty, &pAction->mspTarget.uiLevel, &pAction->mspTarget.fDisableExternalUiHandler); + ExitOnFailure(hr, "Failed to get msp ui options."); + // If this is a per-machine target product, then the plan needs to be per-machine as well. if (pAction->mspTarget.fPerMachineTarget) { diff --git a/src/engine/mspengine.h b/src/engine/mspengine.h index 9f585720..0f323e57 100644 --- a/src/engine/mspengine.h +++ b/src/engine/mspengine.h @@ -38,7 +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, __in BURN_LOGGING* pLog, diff --git a/src/engine/package.h b/src/engine/package.h index c295378e..05965a16 100644 --- a/src/engine/package.h +++ b/src/engine/package.h @@ -239,7 +239,6 @@ typedef struct _BURN_PACKAGE DWORD64 qwVersion; LPWSTR sczInstalledProductCode; DWORD64 qwInstalledVersion; - BOOL fDisplayInternalUI; LPWSTR sczUpgradeCode; BURN_MSIPROPERTY* rgProperties; @@ -261,7 +260,6 @@ typedef struct _BURN_PACKAGE { LPWSTR sczPatchCode; LPWSTR sczApplicabilityXml; - BOOL fDisplayInternalUI; BURN_MSIPROPERTY* rgProperties; DWORD cProperties; diff --git a/src/engine/packages.config b/src/engine/packages.config index e9b2d190..251df9d0 100644 --- a/src/engine/packages.config +++ b/src/engine/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file diff --git a/src/engine/plan.cpp b/src/engine/plan.cpp index 01c7a31d..02f5be23 100644 --- a/src/engine/plan.cpp +++ b/src/engine/plan.cpp @@ -31,7 +31,6 @@ 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, @@ -473,7 +472,6 @@ 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 @@ -511,7 +509,7 @@ extern "C" HRESULT PlanPackages( } } - hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, display, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices); + hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, 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. @@ -536,7 +534,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, display, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices); + hr = ProcessPackage(fBundlePerMachine, pPackage, pUX, pPlan, pCompatiblePackage, pLog, pVariables, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices); ExitOnFailure(hr, "Failed to process compatible package."); if (BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pCompatiblePackage->execute) @@ -787,7 +785,6 @@ 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 ) @@ -797,7 +794,7 @@ extern "C" HRESULT PlanPassThroughBundle( BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; // Plan passthrough package. - hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, display, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL); + hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL); ExitOnFailure(hr, "Failed to process passthrough package."); // If we still have an open rollback boundary, complete it. @@ -821,7 +818,6 @@ 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 ) @@ -831,7 +827,7 @@ extern "C" HRESULT PlanUpdateBundle( BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; // Plan update package. - hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, display, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL); + hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL); ExitOnFailure(hr, "Failed to process update package."); // If we still have an open rollback boundary, complete it. @@ -857,7 +853,6 @@ 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, @@ -911,7 +906,7 @@ static HRESULT ProcessPackage( } } - hr = PlanExecutePackage(fBundlePerMachine, display, pUX, pPlan, pPackage, pLog, pVariables, phSyncpointEvent); + hr = PlanExecutePackage(fBundlePerMachine, pUX, pPlan, pPackage, pLog, pVariables, phSyncpointEvent); ExitOnFailure(hr, "Failed to plan execute package."); if (pPackage->fUninstallable && pNonpermanentPackageIndices) @@ -1091,7 +1086,6 @@ 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, @@ -1156,11 +1150,11 @@ extern "C" HRESULT PlanExecutePackage( break; case BURN_PACKAGE_TYPE_MSI: - hr = MsiEnginePlanAddPackage(display, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire); + hr = MsiEnginePlanAddPackage(pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire); break; case BURN_PACKAGE_TYPE_MSP: - hr = MspEnginePlanAddPackage(display, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire); + hr = MspEnginePlanAddPackage(pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire); break; case BURN_PACKAGE_TYPE_MSU: @@ -3074,7 +3068,7 @@ static void ExecuteActionLog( break; case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE: - LogStringLine(REPORT_STANDARD, "%ls action[%u]: MSI_PACKAGE package id: %ls, action: %hs, ui level: %u, log path: %ls, logging attrib: %u", wzBase, iAction, pAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pAction->msiPackage.action), pAction->msiPackage.uiLevel, pAction->msiPackage.sczLogPath, pAction->msiPackage.dwLoggingAttributes); + LogStringLine(REPORT_STANDARD, "%ls action[%u]: MSI_PACKAGE package id: %ls, action: %hs, action msi property: %u, ui level: %u, disable externaluihandler: %ls, log path: %ls, logging attrib: %u", wzBase, iAction, pAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pAction->msiPackage.action), pAction->msiPackage.actionMsiProperty, pAction->msiPackage.uiLevel, pAction->msiPackage.fDisableExternalUiHandler ? L"yes" : L"no", pAction->msiPackage.sczLogPath, pAction->msiPackage.dwLoggingAttributes); for (DWORD j = 0; j < pAction->msiPackage.cPatches; ++j) { LogStringLine(REPORT_STANDARD, " Patch[%u]: order: %u, msp package id: %ls", j, pAction->msiPackage.rgOrderedPatches->dwOrder, pAction->msiPackage.rgOrderedPatches[j].dwOrder, pAction->msiPackage.rgOrderedPatches[j].pPackage->sczId); @@ -3082,7 +3076,7 @@ static void ExecuteActionLog( break; case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET: - LogStringLine(REPORT_STANDARD, "%ls action[%u]: MSP_TARGET package id: %ls, action: %hs, target product code: %ls, target per-machine: %ls, ui level: %u, log path: %ls", wzBase, iAction, pAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pAction->mspTarget.action), pAction->mspTarget.sczTargetProductCode, pAction->mspTarget.fPerMachineTarget ? L"yes" : L"no", pAction->mspTarget.uiLevel, pAction->mspTarget.sczLogPath); + LogStringLine(REPORT_STANDARD, "%ls action[%u]: MSP_TARGET package id: %ls, action: %hs, target product code: %ls, target per-machine: %ls, action msi property: %u, ui level: %u, disable externaluihandler: %ls, log path: %ls", wzBase, iAction, pAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pAction->mspTarget.action), pAction->mspTarget.sczTargetProductCode, pAction->mspTarget.fPerMachineTarget ? L"yes" : L"no", pAction->mspTarget.actionMsiProperty, pAction->mspTarget.uiLevel, pAction->mspTarget.fDisableExternalUiHandler ? L"yes" : L"no", pAction->mspTarget.sczLogPath); for (DWORD j = 0; j < pAction->mspTarget.cOrderedPatches; ++j) { LogStringLine(REPORT_STANDARD, " Patch[%u]: order: %u, msp package id: %ls", j, pAction->mspTarget.rgOrderedPatches[j].dwOrder, pAction->mspTarget.rgOrderedPatches[j].pPackage->sczId); diff --git a/src/engine/plan.h b/src/engine/plan.h index 54cfe59d..89f4b4bf 100644 --- a/src/engine/plan.h +++ b/src/engine/plan.h @@ -245,7 +245,9 @@ typedef struct _BURN_EXECUTE_ACTION BURN_PACKAGE* pPackage; LPWSTR sczLogPath; DWORD dwLoggingAttributes; + BURN_MSI_PROPERTY actionMsiProperty; INSTALLUILEVEL uiLevel; + BOOL fDisableExternalUiHandler; BOOTSTRAPPER_ACTION_STATE action; BOOTSTRAPPER_FEATURE_ACTION* rgFeatures; @@ -262,7 +264,9 @@ typedef struct _BURN_EXECUTE_ACTION BOOL fSlipstream; BOOL fPerMachineTarget; LPWSTR sczLogPath; + BURN_MSI_PROPERTY actionMsiProperty; INSTALLUILEVEL uiLevel; + BOOL fDisableExternalUiHandler; BOOTSTRAPPER_ACTION_STATE action; BURN_ORDERED_PATCHES* rgOrderedPatches; @@ -404,7 +408,6 @@ 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 @@ -423,7 +426,6 @@ 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 ); @@ -433,7 +435,6 @@ 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 ); @@ -452,7 +453,6 @@ HRESULT PlanCachePackage( ); HRESULT PlanExecutePackage( __in BOOL fPerMachine, - __in BOOTSTRAPPER_DISPLAY display, __in BURN_USER_EXPERIENCE* pUserExperience, __in BURN_PLAN* pPlan, __in BURN_PACKAGE* pPackage, diff --git a/src/engine/userexperience.cpp b/src/engine/userexperience.cpp index 24fc1ec7..dd59a431 100644 --- a/src/engine/userexperience.cpp +++ b/src/engine/userexperience.cpp @@ -97,7 +97,7 @@ extern "C" HRESULT UserExperienceLoad( args.pCommand = pCommand; args.pfnBootstrapperEngineProc = EngineForApplicationProc; args.pvBootstrapperEngineProcContext = pEngineContext; - args.qwEngineAPIVersion = MAKEQWORDVERSION(0, 0, 0, 7); // TODO: need to decide whether to keep this, and if so when to update it. + args.qwEngineAPIVersion = MAKEQWORDVERSION(2020, 5, 14, 0); results.cbSize = sizeof(BOOTSTRAPPER_CREATE_RESULTS); @@ -1211,7 +1211,9 @@ EXTERN_C BAAPI UserExperienceOnExecutePackageBegin( __in BURN_USER_EXPERIENCE* pUserExperience, __in_z LPCWSTR wzPackageId, __in BOOL fExecute, - __in BOOTSTRAPPER_ACTION_STATE action + __in BOOTSTRAPPER_ACTION_STATE action, + __in INSTALLUILEVEL uiLevel, + __in BOOL fDisableExternalUiHandler ) { HRESULT hr = S_OK; @@ -1222,6 +1224,8 @@ EXTERN_C BAAPI UserExperienceOnExecutePackageBegin( args.wzPackageId = wzPackageId; args.fExecute = fExecute; args.action = action; + args.uiLevel = uiLevel; + args.fDisableExternalUiHandler = fDisableExternalUiHandler; results.cbSize = sizeof(results); @@ -1526,6 +1530,45 @@ LExit: return hr; } +EXTERN_C BAAPI UserExperienceOnPlanMsiPackage( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in_z LPCWSTR wzPackageId, + __in BOOL fExecute, + __in BOOTSTRAPPER_ACTION_STATE action, + __inout BURN_MSI_PROPERTY* pActionMsiProperty, + __inout INSTALLUILEVEL* pUiLevel, + __inout BOOL* pfDisableExternalUiHandler + ) +{ + HRESULT hr = S_OK; + BA_ONPLANMSIPACKAGE_ARGS args = { }; + BA_ONPLANMSIPACKAGE_RESULTS results = { }; + + args.cbSize = sizeof(args); + args.wzPackageId = wzPackageId; + args.fExecute = fExecute; + args.action = action; + + results.cbSize = sizeof(results); + results.actionMsiProperty = *pActionMsiProperty; + results.uiLevel = *pUiLevel; + results.fDisableExternalUiHandler = *pfDisableExternalUiHandler; + + hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE, &args, &results, pUserExperience->pvBAProcContext); + ExitOnFailure(hr, "BA OnPlanMsiPackage failed."); + + if (results.fCancel) + { + hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); + } + *pActionMsiProperty = results.actionMsiProperty; + *pUiLevel = results.uiLevel; + *pfDisableExternalUiHandler = results.fDisableExternalUiHandler; + +LExit: + return hr; +} + EXTERN_C BAAPI UserExperienceOnPlanPackageBegin( __in BURN_USER_EXPERIENCE* pUserExperience, __in_z LPCWSTR wzPackageId, diff --git a/src/engine/userexperience.h b/src/engine/userexperience.h index 7d2b743d..a5a97ffa 100644 --- a/src/engine/userexperience.h +++ b/src/engine/userexperience.h @@ -294,7 +294,9 @@ BAAPI UserExperienceOnExecutePackageBegin( __in BURN_USER_EXPERIENCE* pUserExperience, __in_z LPCWSTR wzPackageId, __in BOOL fExecute, - __in BOOTSTRAPPER_ACTION_STATE action + __in BOOTSTRAPPER_ACTION_STATE action, + __in INSTALLUILEVEL uiLevel, + __in BOOL fDisableExternalUiHandler ); BAAPI UserExperienceOnExecutePackageComplete( __in BURN_USER_EXPERIENCE* pUserExperience, @@ -354,6 +356,15 @@ BAAPI UserExperienceOnPlanMsiFeature( __in_z LPCWSTR wzFeatureId, __inout BOOTSTRAPPER_FEATURE_STATE* pRequestedState ); +BAAPI UserExperienceOnPlanMsiPackage( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in_z LPCWSTR wzPackageId, + __in BOOL fExecute, + __in BOOTSTRAPPER_ACTION_STATE action, + __inout BURN_MSI_PROPERTY* pActionMsiProperty, + __inout INSTALLUILEVEL* pUiLevel, + __inout BOOL* pfDisableExternalUiHandler + ); BAAPI UserExperienceOnPlanPackageBegin( __in BURN_USER_EXPERIENCE* pUserExperience, __in_z LPCWSTR wzPackageId, diff --git a/src/stub/packages.config b/src/stub/packages.config index 478af2c6..e8115bfa 100644 --- a/src/stub/packages.config +++ b/src/stub/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/src/stub/stub.vcxproj b/src/stub/stub.vcxproj index 7af42fa9..ce43e0e6 100644 --- a/src/stub/stub.vcxproj +++ b/src/stub/stub.vcxproj @@ -2,7 +2,7 @@ - + @@ -94,6 +94,6 @@ This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}. - + -- cgit v1.2.3-55-g6feb