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>