@joebigelow / wix / commits / 50cb451b

WIXFEAT:6164 Give BA control over UI level and handler.

Sean Hall committed May 14, 2020 at 19:59 UTC 50cb451bcee148afd9768086c1bb5ed4f75562df
16 files changed +237 -90
src/engine/apply.cpp
+4 -4
@@ -2064,7 +2064,7 @@ static HRESULT ExecuteExePackage(
2064 fBeginCalled = TRUE;
2065
2066 // Send package execute begin to BA.
2067 - hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->exePackage.pPackage->sczId, !fRollback, pExecuteAction->exePackage.action);
2067 + hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->exePackage.pPackage->sczId, !fRollback, pExecuteAction->exePackage.action, INSTALLUILEVEL_NOCHANGE, false);
2068 ExitOnRootFailure(hr, "BA aborted execute EXE package begin.");
2069
2070 message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS;
@@ -2133,7 +2133,7 @@ static HRESULT ExecuteMsiPackage(
2133 fBeginCalled = TRUE;
2134
2135 // Send package execute begin to BA.
2136 - hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msiPackage.pPackage->sczId, !fRollback, pExecuteAction->msiPackage.action);
2136 + hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msiPackage.pPackage->sczId, !fRollback, pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.uiLevel, pExecuteAction->msiPackage.fDisableExternalUiHandler);
2137 ExitOnRootFailure(hr, "BA aborted execute MSI package begin.");
2138
2139 // execute package
@@ -2188,7 +2188,7 @@ static HRESULT ExecuteMspPackage(
2188 fBeginCalled = TRUE;
2189
2190 // Send package execute begin to BA.
2191 - hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->mspTarget.pPackage->sczId, !fRollback, pExecuteAction->mspTarget.action);
2191 + hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->mspTarget.pPackage->sczId, !fRollback, pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.uiLevel, pExecuteAction->mspTarget.fDisableExternalUiHandler);
2192 ExitOnRootFailure(hr, "BA aborted execute MSP package begin.");
2193
2194 // Now send all the patches that target this product code.
@@ -2255,7 +2255,7 @@ static HRESULT ExecuteMsuPackage(
2255 fBeginCalled = TRUE;
2256
2257 // Send package execute begin to BA.
2258 - hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msuPackage.pPackage->sczId, !fRollback, pExecuteAction->msuPackage.action);
2258 + hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msuPackage.pPackage->sczId, !fRollback, pExecuteAction->msuPackage.action, INSTALLUILEVEL_NOCHANGE, false);
2259 ExitOnRootFailure(hr, "BA aborted execute MSU package begin.");
2260
2261 message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS;
src/engine/core.cpp
+4 -4
@@ -431,7 +431,7 @@ extern "C" HRESULT CorePlan(
431 ExitOnFailure(hr, "Failed to plan the layout of the bundle.");
432
433 // Plan the packages' layout.
434 - hr = PlanPackages(&pEngineState->registration, &pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, FALSE, pEngineState->command.display, pEngineState->command.relationType, sczLayoutDirectory, &hSyncpointEvent);
434 + hr = PlanPackages(&pEngineState->registration, &pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, FALSE, pEngineState->command.relationType, sczLayoutDirectory, &hSyncpointEvent);
435 ExitOnFailure(hr, "Failed to plan packages.");
436 }
437 else if (BOOTSTRAPPER_ACTION_UPDATE_REPLACE == action || BOOTSTRAPPER_ACTION_UPDATE_REPLACE_EMBEDDED == action)
@@ -440,7 +440,7 @@ extern "C" HRESULT CorePlan(
440
441 pUpgradeBundlePackage = &pEngineState->update.package;
442
443 - hr = PlanUpdateBundle(&pEngineState->userExperience, pUpgradeBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent);
443 + hr = PlanUpdateBundle(&pEngineState->userExperience, pUpgradeBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.relationType, &hSyncpointEvent);
444 ExitOnFailure(hr, "Failed to plan update.");
445 }
446 else if (pEngineState->registration.fEnabledForwardCompatibleBundle)
@@ -449,7 +449,7 @@ extern "C" HRESULT CorePlan(
449
450 pForwardCompatibleBundlePackage = &pEngineState->registration.forwardCompatibleBundle;
451
452 - hr = PlanPassThroughBundle(&pEngineState->userExperience, pForwardCompatibleBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent);
452 + hr = PlanPassThroughBundle(&pEngineState->userExperience, pForwardCompatibleBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.relationType, &hSyncpointEvent);
453 ExitOnFailure(hr, "Failed to plan passthrough.");
454 }
455 else // doing an action that modifies the machine state.
@@ -471,7 +471,7 @@ extern "C" HRESULT CorePlan(
471 hr = PlanRelatedBundlesBegin(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->plan);
472 ExitOnFailure(hr, "Failed to plan related bundles.");
473
474 - 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);
474 + hr = PlanPackages(&pEngineState->registration, &pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->registration.fInstalled, pEngineState->command.relationType, NULL, &hSyncpointEvent);
475 ExitOnFailure(hr, "Failed to plan packages.");
476
477 // Schedule the update of related bundles last.
src/engine/elevation.cpp
+24
@@ -821,9 +821,15 @@ extern "C" HRESULT ElevationExecuteMsiPackage(
821 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->msiPackage.sczLogPath);
822 ExitOnFailure(hr, "Failed to write package log to message buffer.");
823
824 + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.actionMsiProperty);
825 + ExitOnFailure(hr, "Failed to write actionMsiProperty to message buffer.");
826 +
827 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.uiLevel);
828 ExitOnFailure(hr, "Failed to write UI level to message buffer.");
829
830 + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.fDisableExternalUiHandler);
831 + ExitOnFailure(hr, "Failed to write fDisableExternalUiHandler to message buffer.");
832 +
833 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.action);
834 ExitOnFailure(hr, "Failed to write action to message buffer.");
835
@@ -897,9 +903,15 @@ extern "C" HRESULT ElevationExecuteMspPackage(
903 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->mspTarget.sczLogPath);
904 ExitOnFailure(hr, "Failed to write package log to message buffer.");
905
906 + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.actionMsiProperty);
907 + ExitOnFailure(hr, "Failed to write actionMsiProperty to message buffer.");
908 +
909 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.uiLevel);
910 ExitOnFailure(hr, "Failed to write UI level to message buffer.");
911
912 + hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.fDisableExternalUiHandler);
913 + ExitOnFailure(hr, "Failed to write fDisableExternalUiHandler to message buffer.");
914 +
915 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.action);
916 ExitOnFailure(hr, "Failed to write action to message buffer.");
917
@@ -2237,9 +2249,15 @@ static HRESULT OnExecuteMsiPackage(
2249 hr = BuffReadString(pbData, cbData, &iData, &executeAction.msiPackage.sczLogPath);
2250 ExitOnFailure(hr, "Failed to read package log.");
2251
2252 + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.actionMsiProperty);
2253 + ExitOnFailure(hr, "Failed to read actionMsiProperty.");
2254 +
2255 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.uiLevel);
2256 ExitOnFailure(hr, "Failed to read UI level.");
2257
2258 + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.fDisableExternalUiHandler);
2259 + ExitOnFailure(hr, "Failed to read fDisableExternalUiHandler.");
2260 +
2261 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.action);
2262 ExitOnFailure(hr, "Failed to read action.");
2263
@@ -2334,9 +2352,15 @@ static HRESULT OnExecuteMspPackage(
2352 hr = BuffReadString(pbData, cbData, &iData, &executeAction.mspTarget.sczLogPath);
2353 ExitOnFailure(hr, "Failed to read package log.");
2354
2355 + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.actionMsiProperty);
2356 + ExitOnFailure(hr, "Failed to read actionMsiProperty.");
2357 +
2358 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.uiLevel);
2359 ExitOnFailure(hr, "Failed to read UI level.");
2360
2361 + hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.fDisableExternalUiHandler);
2362 + ExitOnFailure(hr, "Failed to read fDisableExternalUiHandler.");
2363 +
2364 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.action);
2365 ExitOnFailure(hr, "Failed to read action.");
2366
src/engine/engine.vcxproj
+4 -4
@@ -2,8 +2,8 @@
2 <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4 <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 - <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.15\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.15\build\WixToolset.BootstrapperCore.Native.props')" />
6 - <Import Project="..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props')" />
5 + <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.16\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.16\build\WixToolset.BootstrapperCore.Native.props')" />
6 + <Import Project="..\..\packages\WixToolset.DUtil.4.0.23\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.23\build\WixToolset.DUtil.props')" />
7
8 <ItemGroup Label="ProjectConfigurations">
9 <ProjectConfiguration Include="Debug|Win32">
@@ -166,8 +166,8 @@ rc.exe -fo "$(OutDir)engine.res" "$(IntDir)engine.messages.rc"</Command>
166 <PropertyGroup>
167 <ErrorText>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}.</ErrorText>
168 </PropertyGroup>
169 - <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.15\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.15\build\WixToolset.BootstrapperCore.Native.props'))" />
170 - <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props'))" />
169 + <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.16\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.16\build\WixToolset.BootstrapperCore.Native.props'))" />
170 + <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.23\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.23\build\WixToolset.DUtil.props'))" />
171 <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets'))" />
172 </Target>
173 </Project>
src/engine/msiengine.cpp
+87 -30
@@ -4,7 +4,10 @@
4
5
6 // constants
7 -
7 +#define BURNMSIINSTALL_PROPERTY_NAME L"BURNMSIINSTALL"
8 +#define BURNMSIMODIFY_PROPERTY_NAME L"BURNMSIMODIFY"
9 +#define BURNMSIREPAIR_PROPERTY_NAME L"BURNMSIREPAIR"
10 +#define BURNMSIUNINSTALL_PROPERTY_NAME L"BURNMSIUNINSTALL"
11
12 // structs
13
@@ -79,10 +82,6 @@ extern "C" HRESULT MsiEngineParsePackageFromXml(
82 hr = FileVersionFromStringEx(scz, 0, &pPackage->Msi.qwVersion);
83 ExitOnFailure(hr, "Failed to parse @Version: %ls", scz);
84
82 - // @DisplayInternalUI
83 - hr = XmlGetYesNoAttribute(pixnMsiPackage, L"DisplayInternalUI", &pPackage->Msi.fDisplayInternalUI);
84 - ExitOnFailure(hr, "Failed to get @DisplayInternalUI.");
85 -
85 // @UpgradeCode
86 hr = XmlGetAttributeEx(pixnMsiPackage, L"UpgradeCode", &pPackage->Msi.sczUpgradeCode);
87 if (E_NOTFOUND != hr)
@@ -874,7 +873,7 @@ LExit:
873 // PlanAdd - adds the calculated execute and rollback actions for the package.
874 //
875 extern "C" HRESULT MsiEnginePlanAddPackage(
877 - __in BOOTSTRAPPER_DISPLAY display,
876 + __in BURN_USER_EXPERIENCE* pUserExperience,
877 __in BURN_PACKAGE* pPackage,
878 __in BURN_PLAN* pPlan,
879 __in BURN_LOGGING* pLog,
@@ -926,10 +925,13 @@ extern "C" HRESULT MsiEnginePlanAddPackage(
925 pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE;
926 pAction->msiPackage.pPackage = pPackage;
927 pAction->msiPackage.action = pPackage->rollback;
929 - pAction->msiPackage.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msi.fDisplayInternalUI, display, pAction->msiPackage.action);
928 pAction->msiPackage.rgFeatures = rgRollbackFeatureActions;
929 rgRollbackFeatureActions = NULL;
930
931 + hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, FALSE, pAction->msiPackage.action,
932 + &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler);
933 + ExitOnFailure(hr, "Failed to get msi ui options.");
934 +
935 LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors.
936 pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes;
937
@@ -949,10 +951,13 @@ extern "C" HRESULT MsiEnginePlanAddPackage(
951 pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE;
952 pAction->msiPackage.pPackage = pPackage;
953 pAction->msiPackage.action = pPackage->execute;
952 - pAction->msiPackage.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msi.fDisplayInternalUI, display, pAction->msiPackage.action);
954 pAction->msiPackage.rgFeatures = rgFeatureActions;
955 rgFeatureActions = NULL;
956
957 + hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, TRUE, pAction->msiPackage.action,
958 + &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler);
959 + ExitOnFailure(hr, "Failed to get msi ui options.");
960 +
961 LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors.
962 pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes;
963 }
@@ -1073,7 +1078,6 @@ extern "C" HRESULT MsiEngineAddCompatiblePackage(
1078 }
1079
1080 pCompatiblePackage->type = BURN_PACKAGE_TYPE_MSI;
1076 - pCompatiblePackage->Msi.fDisplayInternalUI = pPackage->Msi.fDisplayInternalUI;
1081
1082 if (ppCompatiblePackage)
1083 {
@@ -1161,8 +1165,16 @@ extern "C" HRESULT MsiEngineExecutePackage(
1165 VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->msiPackage.action, TRUE);
1166
1167 // Wire up the external UI handler and logging.
1164 - hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->msiPackage.uiLevel, hwndParent, pvContext, fRollback, &context);
1165 - ExitOnFailure(hr, "Failed to initialize external UI handler.");
1168 + if (pExecuteAction->msiPackage.fDisableExternalUiHandler)
1169 + {
1170 + hr = WiuInitializeInternalUI(pExecuteAction->msiPackage.uiLevel, hwndParent, &context);
1171 + ExitOnFailure(hr, "Failed to initialize internal UI for MSI package.");
1172 + }
1173 + else
1174 + {
1175 + hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->msiPackage.uiLevel, hwndParent, pvContext, fRollback, &context);
1176 + ExitOnFailure(hr, "Failed to initialize external UI handler.");
1177 + }
1178
1179 if (pExecuteAction->msiPackage.sczLogPath && *pExecuteAction->msiPackage.sczLogPath)
1180 {
@@ -1191,6 +1203,12 @@ extern "C" HRESULT MsiEngineExecutePackage(
1203 hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, pExecuteAction->msiPackage.rgSlipstreamPatches, &sczObfuscatedProperties);
1204 ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string.");
1205
1206 + hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczProperties);
1207 + ExitOnFailure(hr, "Failed to add action property to argument string.");
1208 +
1209 + hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczObfuscatedProperties);
1210 + ExitOnFailure(hr, "Failed to add action property to obfuscated argument string.");
1211 +
1212 LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pExecuteAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L"");
1213
1214 //
@@ -1300,6 +1318,40 @@ LExit:
1318 return hr;
1319 }
1320
1321 +extern "C" HRESULT MsiEngineConcatActionProperty(
1322 + __in BURN_MSI_PROPERTY actionMsiProperty,
1323 + __deref_out_z LPWSTR* psczProperties
1324 + )
1325 +{
1326 + HRESULT hr = S_OK;
1327 + LPCWSTR wzPropertyName = NULL;
1328 +
1329 + switch (actionMsiProperty)
1330 + {
1331 + case BURN_MSI_PROPERTY_INSTALL:
1332 + wzPropertyName = BURNMSIINSTALL_PROPERTY_NAME;
1333 + break;
1334 + case BURN_MSI_PROPERTY_MODIFY:
1335 + wzPropertyName = BURNMSIMODIFY_PROPERTY_NAME;
1336 + break;
1337 + case BURN_MSI_PROPERTY_REPAIR:
1338 + wzPropertyName = BURNMSIREPAIR_PROPERTY_NAME;
1339 + break;
1340 + case BURN_MSI_PROPERTY_UNINSTALL:
1341 + wzPropertyName = BURNMSIUNINSTALL_PROPERTY_NAME;
1342 + break;
1343 + }
1344 +
1345 + if (wzPropertyName)
1346 + {
1347 + hr = StrAllocConcatFormattedSecure(psczProperties, L" %ls=1", wzPropertyName);
1348 + ExitOnFailure(hr, "Failed to add burn action property.");
1349 + }
1350 +
1351 +LExit:
1352 + return hr;
1353 +}
1354 +
1355 // The contents of psczProperties may be sensitive, should keep encrypted and SecureZeroFree.
1356 extern "C" HRESULT MsiEngineConcatProperties(
1357 __in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties,
@@ -1363,31 +1415,36 @@ LExit:
1415 return hr;
1416 }
1417
1366 -extern "C" INSTALLUILEVEL MsiEngineCalculateInstallUiLevel(
1367 - __in BOOL fDisplayInternalUI,
1368 - __in BOOTSTRAPPER_DISPLAY display,
1369 - __in BOOTSTRAPPER_ACTION_STATE actionState
1418 +extern "C" HRESULT MsiEngineCalculateInstallUiLevel(
1419 + __in BURN_USER_EXPERIENCE* pUserExperience,
1420 + __in LPCWSTR wzPackageId,
1421 + __in BOOL fExecute,
1422 + __in BOOTSTRAPPER_ACTION_STATE actionState,
1423 + __out BURN_MSI_PROPERTY* pActionMsiProperty,
1424 + __out INSTALLUILEVEL* pUiLevel,
1425 + __out BOOL* pfDisableExternalUiHandler
1426 )
1427 {
1372 - // Assume there will be no internal UI displayed.
1373 - INSTALLUILEVEL uiLevel = static_cast<INSTALLUILEVEL>(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY);
1428 + *pUiLevel = static_cast<INSTALLUILEVEL>(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY);
1429 + *pfDisableExternalUiHandler = FALSE;
1430
1375 - // suppress internal UI during uninstall to mimic ARP and "msiexec /x" behavior
1376 - if (fDisplayInternalUI && BOOTSTRAPPER_ACTION_STATE_UNINSTALL != actionState && BOOTSTRAPPER_ACTION_STATE_REPAIR != actionState)
1431 + switch (actionState)
1432 {
1378 - switch (display)
1379 - {
1380 - case BOOTSTRAPPER_DISPLAY_FULL:
1381 - uiLevel = INSTALLUILEVEL_FULL;
1382 - break;
1383 -
1384 - case BOOTSTRAPPER_DISPLAY_PASSIVE:
1385 - uiLevel = INSTALLUILEVEL_REDUCED;
1386 - break;
1387 - }
1433 + case BOOTSTRAPPER_ACTION_STATE_UNINSTALL:
1434 + *pActionMsiProperty = BURN_MSI_PROPERTY_UNINSTALL;
1435 + break;
1436 + case BOOTSTRAPPER_ACTION_STATE_REPAIR:
1437 + *pActionMsiProperty = BURN_MSI_PROPERTY_REPAIR;
1438 + break;
1439 + case BOOTSTRAPPER_ACTION_STATE_MODIFY:
1440 + *pActionMsiProperty = BURN_MSI_PROPERTY_MODIFY;
1441 + break;
1442 + default:
1443 + *pActionMsiProperty = BURN_MSI_PROPERTY_INSTALL;
1444 + break;
1445 }
1446
1390 - return uiLevel;
1447 + return UserExperienceOnPlanMsiPackage(pUserExperience, wzPackageId, fExecute, actionState, pActionMsiProperty, pUiLevel, pfDisableExternalUiHandler);
1448 }
1449
1450
src/engine/msiengine.h
+13 -5
@@ -32,7 +32,7 @@ HRESULT MsiEnginePlanCalculatePackage(
32 __out_opt BOOL* pfBARequestedCache
33 );
34 HRESULT MsiEnginePlanAddPackage(
35 - __in BOOTSTRAPPER_DISPLAY display,
35 + __in BURN_USER_EXPERIENCE* pUserExperience,
36 __in BURN_PACKAGE* pPackage,
37 __in BURN_PLAN* pPlan,
38 __in BURN_LOGGING* pLog,
@@ -54,6 +54,10 @@ HRESULT MsiEngineExecutePackage(
54 __in LPVOID pvContext,
55 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
56 );
57 +HRESULT MsiEngineConcatActionProperty(
58 + __in BURN_MSI_PROPERTY actionMsiProperty,
59 + __deref_out_z LPWSTR* psczProperties
60 + );
61 HRESULT MsiEngineConcatProperties(
62 __in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties,
63 __in DWORD cProperties,
@@ -62,10 +66,14 @@ HRESULT MsiEngineConcatProperties(
66 __deref_out_z LPWSTR* psczProperties,
67 __in BOOL fObfuscateHiddenVariables
68 );
65 -INSTALLUILEVEL MsiEngineCalculateInstallUiLevel(
66 - __in BOOL fDisplayInternalUI,
67 - __in BOOTSTRAPPER_DISPLAY display,
68 - __in BOOTSTRAPPER_ACTION_STATE actionState
69 +HRESULT MsiEngineCalculateInstallUiLevel(
70 + __in BURN_USER_EXPERIENCE* pUserExperience,
71 + __in LPCWSTR wzPackageId,
72 + __in BOOL fExecute,
73 + __in BOOTSTRAPPER_ACTION_STATE actionState,
74 + __out BURN_MSI_PROPERTY* pActionMsiProperty,
75 + __out INSTALLUILEVEL* pUiLevel,
76 + __out BOOL* pfDisableExternalUiHandler
77 );
78
79 #if defined(__cplusplus)
src/engine/mspengine.cpp
+25 -13
@@ -44,7 +44,7 @@ static void DeterminePatchChainedTarget(
44 __out BOOL* pfSlipstreamed
45 );
46 static HRESULT PlanTargetProduct(
47 - __in BOOTSTRAPPER_DISPLAY display,
47 + __in BURN_USER_EXPERIENCE* pUserExperience,
48 __in BOOL fRollback,
49 __in BURN_PLAN* pPlan,
50 __in BURN_LOGGING* pLog,
@@ -73,10 +73,6 @@ extern "C" HRESULT MspEngineParsePackageFromXml(
73 hr = XmlGetAttributeEx(pixnMspPackage, L"PatchXml", &pPackage->Msp.sczApplicabilityXml);
74 ExitOnFailure(hr, "Failed to get @PatchXml.");
75
76 - // @DisplayInternalUI
77 - hr = XmlGetYesNoAttribute(pixnMspPackage, L"DisplayInternalUI", &pPackage->Msp.fDisplayInternalUI);
78 - ExitOnFailure(hr, "Failed to get @DisplayInternalUI.");
79 -
76 // Read properties.
77 hr = MsiEngineParsePropertiesFromXml(pixnMspPackage, &pPackage->Msp.rgProperties, &pPackage->Msp.cProperties);
78 ExitOnFailure(hr, "Failed to parse properties from XML.");
@@ -400,7 +396,7 @@ LExit:
396 // PlanAdd - adds the calculated execute and rollback actions for the package.
397 //
398 extern "C" HRESULT MspEnginePlanAddPackage(
403 - __in BOOTSTRAPPER_DISPLAY display,
399 + __in BURN_USER_EXPERIENCE* pUserExperience,
400 __in BURN_PACKAGE* pPackage,
401 __in BURN_PLAN* pPlan,
402 __in BURN_LOGGING* pLog,
@@ -437,13 +433,13 @@ extern "C" HRESULT MspEnginePlanAddPackage(
433
434 if (BOOTSTRAPPER_ACTION_STATE_NONE != pTargetProduct->execute)
435 {
440 - hr = PlanTargetProduct(display, FALSE, pPlan, pLog, pVariables, pTargetProduct->execute, pPackage, pTargetProduct, hCacheEvent);
436 + hr = PlanTargetProduct(pUserExperience, FALSE, pPlan, pLog, pVariables, pTargetProduct->execute, pPackage, pTargetProduct, hCacheEvent);
437 ExitOnFailure(hr, "Failed to plan target product.");
438 }
439
440 if (BOOTSTRAPPER_ACTION_STATE_NONE != pTargetProduct->rollback)
441 {
446 - hr = PlanTargetProduct(display, TRUE, pPlan, pLog, pVariables, pTargetProduct->rollback, pPackage, pTargetProduct, hCacheEvent);
442 + hr = PlanTargetProduct(pUserExperience, TRUE, pPlan, pLog, pVariables, pTargetProduct->rollback, pPackage, pTargetProduct, hCacheEvent);
443 ExitOnFailure(hr, "Failed to plan rollack target product.");
444 }
445 }
@@ -464,7 +460,6 @@ extern "C" HRESULT MspEngineExecutePackage(
460 )
461 {
462 HRESULT hr = S_OK;
467 - INSTALLUILEVEL uiLevel = pExecuteAction->mspTarget.pPackage->Msp.fDisplayInternalUI ? INSTALLUILEVEL_DEFAULT : static_cast<INSTALLUILEVEL>(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY);
463 WIU_MSI_EXECUTE_CONTEXT context = { };
464 WIU_RESTART restart = WIU_RESTART_NONE;
465
@@ -517,8 +512,16 @@ extern "C" HRESULT MspEngineExecutePackage(
512 VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->mspTarget.action, TRUE);
513
514 // Wire up the external UI handler and logging.
520 - hr = WiuInitializeExternalUI(pfnMessageHandler, uiLevel, hwndParent, pvContext, fRollback, &context);
521 - ExitOnFailure(hr, "Failed to initialize external UI handler.");
515 + if (pExecuteAction->mspTarget.fDisableExternalUiHandler)
516 + {
517 + hr = WiuInitializeInternalUI(pExecuteAction->mspTarget.uiLevel, hwndParent, &context);
518 + ExitOnFailure(hr, "Failed to initialize internal UI for MSP package.");
519 + }
520 + else
521 + {
522 + hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->mspTarget.uiLevel, hwndParent, pvContext, fRollback, &context);
523 + ExitOnFailure(hr, "Failed to initialize external UI handler.");
524 + }
525
526 //if (BURN_LOGGING_LEVEL_DEBUG == logLevel)
527 //{
@@ -538,6 +541,12 @@ extern "C" HRESULT MspEngineExecutePackage(
541 hr = MsiEngineConcatProperties(pExecuteAction->mspTarget.pPackage->Msp.rgProperties, pExecuteAction->mspTarget.pPackage->Msp.cProperties, pVariables, fRollback, &sczObfuscatedProperties, TRUE);
542 ExitOnFailure(hr, "Failed to add properties to obfuscated argument string.");
543
544 + hr = MsiEngineConcatActionProperty(pExecuteAction->mspTarget.actionMsiProperty, &sczProperties);
545 + ExitOnFailure(hr, "Failed to add action property to argument string.");
546 +
547 + hr = MsiEngineConcatActionProperty(pExecuteAction->mspTarget.actionMsiProperty, &sczObfuscatedProperties);
548 + ExitOnFailure(hr, "Failed to add action property to obfuscated argument string.");
549 +
550 LogId(REPORT_STANDARD, MSG_APPLYING_PATCH_PACKAGE, pExecuteAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pExecuteAction->mspTarget.action), sczPatches, sczObfuscatedProperties, pExecuteAction->mspTarget.sczTargetProductCode);
551
552 //
@@ -868,7 +877,7 @@ static void DeterminePatchChainedTarget(
877 }
878
879 static HRESULT PlanTargetProduct(
871 - __in BOOTSTRAPPER_DISPLAY display,
880 + __in BURN_USER_EXPERIENCE* pUserExperience,
881 __in BOOL fRollback,
882 __in BURN_PLAN* pPlan,
883 __in BURN_LOGGING* pLog,
@@ -920,12 +929,15 @@ static HRESULT PlanTargetProduct(
929 pAction->mspTarget.action = actionState;
930 pAction->mspTarget.pPackage = pPackage;
931 pAction->mspTarget.fPerMachineTarget = (MSIINSTALLCONTEXT_MACHINE == pTargetProduct->context);
923 - pAction->mspTarget.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msp.fDisplayInternalUI, display, pAction->mspTarget.action);
932 pAction->mspTarget.pChainedTargetPackage = pTargetProduct->pChainedTargetPackage;
933 pAction->mspTarget.fSlipstream = pTargetProduct->fSlipstream;
934 hr = StrAllocString(&pAction->mspTarget.sczTargetProductCode, pTargetProduct->wzTargetProductCode, 0);
935 ExitOnFailure(hr, "Failed to copy target product code.");
936
937 + hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, !fRollback, pAction->mspTarget.action,
938 + &pAction->mspTarget.actionMsiProperty, &pAction->mspTarget.uiLevel, &pAction->mspTarget.fDisableExternalUiHandler);
939 + ExitOnFailure(hr, "Failed to get msp ui options.");
940 +
941 // If this is a per-machine target product, then the plan needs to be per-machine as well.
942 if (pAction->mspTarget.fPerMachineTarget)
943 {
src/engine/mspengine.h
+1 -1
@@ -38,7 +38,7 @@ HRESULT MspEnginePlanCalculatePackage(
38 __out_opt BOOL* pfBARequestedCache
39 );
40 HRESULT MspEnginePlanAddPackage(
41 - __in BOOTSTRAPPER_DISPLAY display,
41 + __in BURN_USER_EXPERIENCE* pUserExperience,
42 __in BURN_PACKAGE* pPackage,
43 __in BURN_PLAN* pPlan,
44 __in BURN_LOGGING* pLog,
src/engine/package.h
-2
@@ -239,7 +239,6 @@ typedef struct _BURN_PACKAGE
239 DWORD64 qwVersion;
240 LPWSTR sczInstalledProductCode;
241 DWORD64 qwInstalledVersion;
242 - BOOL fDisplayInternalUI;
242 LPWSTR sczUpgradeCode;
243
244 BURN_MSIPROPERTY* rgProperties;
@@ -261,7 +260,6 @@ typedef struct _BURN_PACKAGE
260 {
261 LPWSTR sczPatchCode;
262 LPWSTR sczApplicabilityXml;
264 - BOOL fDisplayInternalUI;
263
264 BURN_MSIPROPERTY* rgProperties;
265 DWORD cProperties;
src/engine/packages.config
+2 -2
@@ -1,6 +1,6 @@
1 <?xml version="1.0" encoding="utf-8"?>
2 <packages>
3 <package id="Nerdbank.GitVersioning" version="2.1.65" targetFramework="native" developmentDependency="true" />
4 - <package id="WixToolset.BootstrapperCore.Native" version="4.0.15" targetFramework="native" />
5 - <package id="WixToolset.DUtil" version="4.0.18" targetFramework="native" />
4 + <package id="WixToolset.BootstrapperCore.Native" version="4.0.16" targetFramework="native" />
5 + <package id="WixToolset.DUtil" version="4.0.23" targetFramework="native" />
6 </packages>
\ No newline at end of file
src/engine/plan.cpp
+9 -15
@@ -31,7 +31,6 @@ static HRESULT ProcessPackage(
31 __in BURN_PACKAGE* pPackage,
32 __in BURN_LOGGING* pLog,
33 __in BURN_VARIABLES* pVariables,
34 - __in BOOTSTRAPPER_DISPLAY display,
34 __in BOOTSTRAPPER_RELATION_TYPE relationType,
35 __in_z_opt LPCWSTR wzLayoutDirectory,
36 __inout HANDLE* phSyncpointEvent,
@@ -473,7 +472,6 @@ extern "C" HRESULT PlanPackages(
472 __in BURN_LOGGING* pLog,
473 __in BURN_VARIABLES* pVariables,
474 __in BOOL fBundleInstalled,
476 - __in BOOTSTRAPPER_DISPLAY display,
475 __in BOOTSTRAPPER_RELATION_TYPE relationType,
476 __in_z_opt LPCWSTR wzLayoutDirectory,
477 __inout HANDLE* phSyncpointEvent
@@ -511,7 +509,7 @@ extern "C" HRESULT PlanPackages(
509 }
510 }
511
514 - hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, display, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices);
512 + hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices);
513 ExitOnFailure(hr, "Failed to process package.");
514
515 // 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(
534 ExitOnFailure(hr, "Failed to copy installed ProductCode");
535
536 // Process the compatible MSI package like any other.
539 - hr = ProcessPackage(fBundlePerMachine, pPackage, pUX, pPlan, pCompatiblePackage, pLog, pVariables, display, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices);
537 + hr = ProcessPackage(fBundlePerMachine, pPackage, pUX, pPlan, pCompatiblePackage, pLog, pVariables, relationType, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary, &nonpermanentPackageIndices);
538 ExitOnFailure(hr, "Failed to process compatible package.");
539
540 if (BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pCompatiblePackage->execute)
@@ -787,7 +785,6 @@ extern "C" HRESULT PlanPassThroughBundle(
785 __in BURN_PLAN* pPlan,
786 __in BURN_LOGGING* pLog,
787 __in BURN_VARIABLES* pVariables,
790 - __in BOOTSTRAPPER_DISPLAY display,
788 __in BOOTSTRAPPER_RELATION_TYPE relationType,
789 __inout HANDLE* phSyncpointEvent
790 )
@@ -797,7 +794,7 @@ extern "C" HRESULT PlanPassThroughBundle(
794 BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL;
795
796 // Plan passthrough package.
800 - hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, display, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL);
797 + hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL);
798 ExitOnFailure(hr, "Failed to process passthrough package.");
799
800 // If we still have an open rollback boundary, complete it.
@@ -821,7 +818,6 @@ extern "C" HRESULT PlanUpdateBundle(
818 __in BURN_PLAN* pPlan,
819 __in BURN_LOGGING* pLog,
820 __in BURN_VARIABLES* pVariables,
824 - __in BOOTSTRAPPER_DISPLAY display,
821 __in BOOTSTRAPPER_RELATION_TYPE relationType,
822 __inout HANDLE* phSyncpointEvent
823 )
@@ -831,7 +827,7 @@ extern "C" HRESULT PlanUpdateBundle(
827 BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL;
828
829 // Plan update package.
834 - hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, display, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL);
830 + hr = ProcessPackage(fBundlePerMachine, NULL, pUX, pPlan, pPackage, pLog, pVariables, relationType, NULL, phSyncpointEvent, &pRollbackBoundary, NULL);
831 ExitOnFailure(hr, "Failed to process update package.");
832
833 // If we still have an open rollback boundary, complete it.
@@ -857,7 +853,6 @@ static HRESULT ProcessPackage(
853 __in BURN_PACKAGE* pPackage,
854 __in BURN_LOGGING* pLog,
855 __in BURN_VARIABLES* pVariables,
860 - __in BOOTSTRAPPER_DISPLAY display,
856 __in BOOTSTRAPPER_RELATION_TYPE relationType,
857 __in_z_opt LPCWSTR wzLayoutDirectory,
858 __inout HANDLE* phSyncpointEvent,
@@ -911,7 +906,7 @@ static HRESULT ProcessPackage(
906 }
907 }
908
914 - hr = PlanExecutePackage(fBundlePerMachine, display, pUX, pPlan, pPackage, pLog, pVariables, phSyncpointEvent);
909 + hr = PlanExecutePackage(fBundlePerMachine, pUX, pPlan, pPackage, pLog, pVariables, phSyncpointEvent);
910 ExitOnFailure(hr, "Failed to plan execute package.");
911
912 if (pPackage->fUninstallable && pNonpermanentPackageIndices)
@@ -1091,7 +1086,6 @@ LExit:
1086
1087 extern "C" HRESULT PlanExecutePackage(
1088 __in BOOL fPerMachine,
1094 - __in BOOTSTRAPPER_DISPLAY display,
1089 __in BURN_USER_EXPERIENCE* pUserExperience,
1090 __in BURN_PLAN* pPlan,
1091 __in BURN_PACKAGE* pPackage,
@@ -1156,11 +1150,11 @@ extern "C" HRESULT PlanExecutePackage(
1150 break;
1151
1152 case BURN_PACKAGE_TYPE_MSI:
1159 - hr = MsiEnginePlanAddPackage(display, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire);
1153 + hr = MsiEnginePlanAddPackage(pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire);
1154 break;
1155
1156 case BURN_PACKAGE_TYPE_MSP:
1163 - hr = MspEnginePlanAddPackage(display, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire);
1157 + hr = MspEnginePlanAddPackage(pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire);
1158 break;
1159
1160 case BURN_PACKAGE_TYPE_MSU:
@@ -3074,7 +3068,7 @@ static void ExecuteActionLog(
3068 break;
3069
3070 case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE:
3077 - 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);
3071 + 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);
3072 for (DWORD j = 0; j < pAction->msiPackage.cPatches; ++j)
3073 {
3074 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(
3076 break;
3077
3078 case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET:
3085 - 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);
3079 + 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);
3080 for (DWORD j = 0; j < pAction->mspTarget.cOrderedPatches; ++j)
3081 {
3082 LogStringLine(REPORT_STANDARD, " Patch[%u]: order: %u, msp package id: %ls", j, pAction->mspTarget.rgOrderedPatches[j].dwOrder, pAction->mspTarget.rgOrderedPatches[j].pPackage->sczId);
src/engine/plan.h
+4 -4
@@ -245,7 +245,9 @@ typedef struct _BURN_EXECUTE_ACTION
245 BURN_PACKAGE* pPackage;
246 LPWSTR sczLogPath;
247 DWORD dwLoggingAttributes;
248 + BURN_MSI_PROPERTY actionMsiProperty;
249 INSTALLUILEVEL uiLevel;
250 + BOOL fDisableExternalUiHandler;
251 BOOTSTRAPPER_ACTION_STATE action;
252
253 BOOTSTRAPPER_FEATURE_ACTION* rgFeatures;
@@ -262,7 +264,9 @@ typedef struct _BURN_EXECUTE_ACTION
264 BOOL fSlipstream;
265 BOOL fPerMachineTarget;
266 LPWSTR sczLogPath;
267 + BURN_MSI_PROPERTY actionMsiProperty;
268 INSTALLUILEVEL uiLevel;
269 + BOOL fDisableExternalUiHandler;
270 BOOTSTRAPPER_ACTION_STATE action;
271
272 BURN_ORDERED_PATCHES* rgOrderedPatches;
@@ -404,7 +408,6 @@ HRESULT PlanPackages(
408 __in BURN_LOGGING* pLog,
409 __in BURN_VARIABLES* pVariables,
410 __in BOOL fBundleInstalled,
407 - __in BOOTSTRAPPER_DISPLAY display,
411 __in BOOTSTRAPPER_RELATION_TYPE relationType,
412 __in_z_opt LPCWSTR wzLayoutDirectory,
413 __inout HANDLE* phSyncpointEvent
@@ -423,7 +426,6 @@ HRESULT PlanPassThroughBundle(
426 __in BURN_PLAN* pPlan,
427 __in BURN_LOGGING* pLog,
428 __in BURN_VARIABLES* pVariables,
426 - __in BOOTSTRAPPER_DISPLAY display,
429 __in BOOTSTRAPPER_RELATION_TYPE relationType,
430 __inout HANDLE* phSyncpointEvent
431 );
@@ -433,7 +435,6 @@ HRESULT PlanUpdateBundle(
435 __in BURN_PLAN* pPlan,
436 __in BURN_LOGGING* pLog,
437 __in BURN_VARIABLES* pVariables,
436 - __in BOOTSTRAPPER_DISPLAY display,
438 __in BOOTSTRAPPER_RELATION_TYPE relationType,
439 __inout HANDLE* phSyncpointEvent
440 );
@@ -452,7 +453,6 @@ HRESULT PlanCachePackage(
453 );
454 HRESULT PlanExecutePackage(
455 __in BOOL fPerMachine,
455 - __in BOOTSTRAPPER_DISPLAY display,
456 __in BURN_USER_EXPERIENCE* pUserExperience,
457 __in BURN_PLAN* pPlan,
458 __in BURN_PACKAGE* pPackage,
src/engine/userexperience.cpp
+45 -2
@@ -97,7 +97,7 @@ extern "C" HRESULT UserExperienceLoad(
97 args.pCommand = pCommand;
98 args.pfnBootstrapperEngineProc = EngineForApplicationProc;
99 args.pvBootstrapperEngineProcContext = pEngineContext;
100 - args.qwEngineAPIVersion = MAKEQWORDVERSION(0, 0, 0, 7); // TODO: need to decide whether to keep this, and if so when to update it.
100 + args.qwEngineAPIVersion = MAKEQWORDVERSION(2020, 5, 14, 0);
101
102 results.cbSize = sizeof(BOOTSTRAPPER_CREATE_RESULTS);
103
@@ -1211,7 +1211,9 @@ EXTERN_C BAAPI UserExperienceOnExecutePackageBegin(
1211 __in BURN_USER_EXPERIENCE* pUserExperience,
1212 __in_z LPCWSTR wzPackageId,
1213 __in BOOL fExecute,
1214 - __in BOOTSTRAPPER_ACTION_STATE action
1214 + __in BOOTSTRAPPER_ACTION_STATE action,
1215 + __in INSTALLUILEVEL uiLevel,
1216 + __in BOOL fDisableExternalUiHandler
1217 )
1218 {
1219 HRESULT hr = S_OK;
@@ -1222,6 +1224,8 @@ EXTERN_C BAAPI UserExperienceOnExecutePackageBegin(
1224 args.wzPackageId = wzPackageId;
1225 args.fExecute = fExecute;
1226 args.action = action;
1227 + args.uiLevel = uiLevel;
1228 + args.fDisableExternalUiHandler = fDisableExternalUiHandler;
1229
1230 results.cbSize = sizeof(results);
1231
@@ -1526,6 +1530,45 @@ LExit:
1530 return hr;
1531 }
1532
1533 +EXTERN_C BAAPI UserExperienceOnPlanMsiPackage(
1534 + __in BURN_USER_EXPERIENCE* pUserExperience,
1535 + __in_z LPCWSTR wzPackageId,
1536 + __in BOOL fExecute,
1537 + __in BOOTSTRAPPER_ACTION_STATE action,
1538 + __inout BURN_MSI_PROPERTY* pActionMsiProperty,
1539 + __inout INSTALLUILEVEL* pUiLevel,
1540 + __inout BOOL* pfDisableExternalUiHandler
1541 + )
1542 +{
1543 + HRESULT hr = S_OK;
1544 + BA_ONPLANMSIPACKAGE_ARGS args = { };
1545 + BA_ONPLANMSIPACKAGE_RESULTS results = { };
1546 +
1547 + args.cbSize = sizeof(args);
1548 + args.wzPackageId = wzPackageId;
1549 + args.fExecute = fExecute;
1550 + args.action = action;
1551 +
1552 + results.cbSize = sizeof(results);
1553 + results.actionMsiProperty = *pActionMsiProperty;
1554 + results.uiLevel = *pUiLevel;
1555 + results.fDisableExternalUiHandler = *pfDisableExternalUiHandler;
1556 +
1557 + hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE, &args, &results, pUserExperience->pvBAProcContext);
1558 + ExitOnFailure(hr, "BA OnPlanMsiPackage failed.");
1559 +
1560 + if (results.fCancel)
1561 + {
1562 + hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT);
1563 + }
1564 + *pActionMsiProperty = results.actionMsiProperty;
1565 + *pUiLevel = results.uiLevel;
1566 + *pfDisableExternalUiHandler = results.fDisableExternalUiHandler;
1567 +
1568 +LExit:
1569 + return hr;
1570 +}
1571 +
1572 EXTERN_C BAAPI UserExperienceOnPlanPackageBegin(
1573 __in BURN_USER_EXPERIENCE* pUserExperience,
1574 __in_z LPCWSTR wzPackageId,
src/engine/userexperience.h
+12 -1
@@ -294,7 +294,9 @@ BAAPI UserExperienceOnExecutePackageBegin(
294 __in BURN_USER_EXPERIENCE* pUserExperience,
295 __in_z LPCWSTR wzPackageId,
296 __in BOOL fExecute,
297 - __in BOOTSTRAPPER_ACTION_STATE action
297 + __in BOOTSTRAPPER_ACTION_STATE action,
298 + __in INSTALLUILEVEL uiLevel,
299 + __in BOOL fDisableExternalUiHandler
300 );
301 BAAPI UserExperienceOnExecutePackageComplete(
302 __in BURN_USER_EXPERIENCE* pUserExperience,
@@ -354,6 +356,15 @@ BAAPI UserExperienceOnPlanMsiFeature(
356 __in_z LPCWSTR wzFeatureId,
357 __inout BOOTSTRAPPER_FEATURE_STATE* pRequestedState
358 );
359 +BAAPI UserExperienceOnPlanMsiPackage(
360 + __in BURN_USER_EXPERIENCE* pUserExperience,
361 + __in_z LPCWSTR wzPackageId,
362 + __in BOOL fExecute,
363 + __in BOOTSTRAPPER_ACTION_STATE action,
364 + __inout BURN_MSI_PROPERTY* pActionMsiProperty,
365 + __inout INSTALLUILEVEL* pUiLevel,
366 + __inout BOOL* pfDisableExternalUiHandler
367 + );
368 BAAPI UserExperienceOnPlanPackageBegin(
369 __in BURN_USER_EXPERIENCE* pUserExperience,
370 __in_z LPCWSTR wzPackageId,
src/stub/packages.config
+1 -1
@@ -1,5 +1,5 @@
1 <?xml version="1.0" encoding="utf-8"?>
2 <packages>
3 <package id="Nerdbank.GitVersioning" version="2.1.65" targetFramework="native" developmentDependency="true" />
4 - <package id="WixToolset.DUtil" version="4.0.18" targetFramework="native" />
4 + <package id="WixToolset.DUtil" version="4.0.23" targetFramework="native" />
5 </packages>
\ No newline at end of file
src/stub/stub.vcxproj
+2 -2
@@ -2,7 +2,7 @@
2 <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4 <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 - <Import Project="..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props')" />
5 + <Import Project="..\..\packages\WixToolset.DUtil.4.0.23\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.23\build\WixToolset.DUtil.props')" />
6
7 <ItemGroup Label="ProjectConfigurations">
8 <ProjectConfiguration Include="Debug|Win32">
@@ -94,6 +94,6 @@
94 <ErrorText>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}.</ErrorText>
95 </PropertyGroup>
96 <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets'))" />
97 - <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props'))" />
97 + <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.23\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.23\build\WixToolset.DUtil.props'))" />
98 </Target>
99 </Project>