Add ability to customize file versioning rules for MsiPackage and MspPackage.
Fixes #5911
Sean Hall committed
Dec 7, 2021 at 17:34 UTC
19d85eed389fbd964f64c2fbb85e40ec20439d26
20 files changed
+250
-118
src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h
+9
@@ -115,6 +115,13 @@ enum BOOTSTRAPPER_PACKAGE_CONDITION_RESULT
115
BOOTSTRAPPER_PACKAGE_CONDITION_TRUE,
116
};
117
118
+enum BOOTSTRAPPER_MSI_FILE_VERSIONING
119
+{
120
+ BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, //o
121
+ BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER_OR_EQUAL, //e
122
+ BOOTSTRAPPER_MSI_FILE_VERSIONING_ALL, //a
123
+};
124
+
125
enum BOOTSTRAPPER_APPLICATION_MESSAGE
126
{
127
BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTBEGIN,
@@ -1058,6 +1065,7 @@ struct BA_ONPLANMSIPACKAGE_ARGS
1065
LPCWSTR wzPackageId;
1066
BOOL fExecute; // false means rollback.
1067
BOOTSTRAPPER_ACTION_STATE action;
1068
+ BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning;
1069
};
1070
1071
struct BA_ONPLANMSIPACKAGE_RESULTS
@@ -1067,6 +1075,7 @@ struct BA_ONPLANMSIPACKAGE_RESULTS
1075
BURN_MSI_PROPERTY actionMsiProperty;
1076
INSTALLUILEVEL uiLevel;
1077
BOOL fDisableExternalUiHandler;
1078
+ BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning;
1079
};
1080
1081
struct BA_ONPLANNEDPACKAGE_ARGS
src/api/burn/WixToolset.Mba.Core/BootstrapperApplication.cs
+3
-2
@@ -1433,15 +1433,16 @@ namespace WixToolset.Mba.Core
1433
return args.HResult;
1434
}
1435
1436
- int IBootstrapperApplication.OnPlanMsiPackage(string wzPackageId, bool fExecute, ActionState action, ref bool fCancel, ref BURN_MSI_PROPERTY actionMsiProperty, ref INSTALLUILEVEL uiLevel, ref bool fDisableExternalUiHandler)
1436
+ int IBootstrapperApplication.OnPlanMsiPackage(string wzPackageId, bool fExecute, ActionState action, BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning, ref bool fCancel, ref BURN_MSI_PROPERTY actionMsiProperty, ref INSTALLUILEVEL uiLevel, ref bool fDisableExternalUiHandler, ref BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning)
1437
{
1438
- PlanMsiPackageEventArgs args = new PlanMsiPackageEventArgs(wzPackageId, fExecute, action, fCancel, actionMsiProperty, uiLevel, fDisableExternalUiHandler);
1438
+ PlanMsiPackageEventArgs args = new PlanMsiPackageEventArgs(wzPackageId, fExecute, action, recommendedFileVersioning, fCancel, actionMsiProperty, uiLevel, fDisableExternalUiHandler, fileVersioning);
1439
this.OnPlanMsiPackage(args);
1440
1441
fCancel = args.Cancel;
1442
actionMsiProperty = args.ActionMsiProperty;
1443
uiLevel = args.UiLevel;
1444
fDisableExternalUiHandler = args.DisableExternalUiHandler;
1445
+ fileVersioning = args.FileVersioning;
1446
return args.HResult;
1447
}
1448
src/api/burn/WixToolset.Mba.Core/EventArgs.cs
+13
-1
@@ -902,15 +902,17 @@ namespace WixToolset.Mba.Core
902
public class PlanMsiPackageEventArgs : CancellableHResultEventArgs
903
{
904
/// <summary />
905
- public PlanMsiPackageEventArgs(string packageId, bool shouldExecute, ActionState action, bool cancelRecommendation, BURN_MSI_PROPERTY actionMsiProperty, INSTALLUILEVEL uiLevel, bool disableExternalUiHandler)
905
+ public PlanMsiPackageEventArgs(string packageId, bool shouldExecute, ActionState action, BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning, bool cancelRecommendation, BURN_MSI_PROPERTY actionMsiProperty, INSTALLUILEVEL uiLevel, bool disableExternalUiHandler, BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning)
906
: base(cancelRecommendation)
907
{
908
this.PackageId = packageId;
909
this.ShouldExecute = shouldExecute;
910
this.Action = action;
911
+ this.RecommendedFileVersioning = recommendedFileVersioning;
912
this.ActionMsiProperty = actionMsiProperty;
913
this.UiLevel = uiLevel;
914
this.DisableExternalUiHandler = disableExternalUiHandler;
915
+ this.FileVersioning = fileVersioning;
916
}
917
918
/// <summary>
@@ -928,6 +930,11 @@ namespace WixToolset.Mba.Core
930
/// </summary>
931
public ActionState Action { get; private set; }
932
933
+ /// <summary>
934
+ /// Gets the recommended file versioning for the package.
935
+ /// </summary>
936
+ public BOOTSTRAPPER_MSI_FILE_VERSIONING RecommendedFileVersioning { get; private set; }
937
+
938
/// <summary>
939
/// Gets or sets the requested MSI property to add.
940
/// </summary>
@@ -942,6 +949,11 @@ namespace WixToolset.Mba.Core
949
/// Gets or sets whether Burn is requested to set up an external UI handler.
950
/// </summary>
951
public bool DisableExternalUiHandler { get; set; }
952
+
953
+ /// <summary>
954
+ /// Gets or sets the requested file versioning.
955
+ /// </summary>
956
+ public BOOTSTRAPPER_MSI_FILE_VERSIONING FileVersioning { get; set; }
957
}
958
959
/// <summary>
src/api/burn/WixToolset.Mba.Core/IBootstrapperApplication.cs
+22
-9
@@ -373,24 +373,18 @@ namespace WixToolset.Mba.Core
373
/// <summary>
374
/// See <see cref="IDefaultBootstrapperApplication.PlanMsiPackage"/>.
375
/// </summary>
376
- /// <param name="wzPackageId"></param>
377
- /// <param name="fExecute"></param>
378
- /// <param name="action"></param>
379
- /// <param name="fCancel"></param>
380
- /// <param name="actionMsiProperty"></param>
381
- /// <param name="uiLevel"></param>
382
- /// <param name="fDisableExternalUiHandler"></param>
383
- /// <returns></returns>
376
[PreserveSig]
377
[return: MarshalAs(UnmanagedType.I4)]
378
int OnPlanMsiPackage(
379
[MarshalAs(UnmanagedType.LPWStr)] string wzPackageId,
380
[MarshalAs(UnmanagedType.Bool)] bool fExecute,
381
[MarshalAs(UnmanagedType.U4)] ActionState action,
382
+ [MarshalAs(UnmanagedType.U4)] BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning,
383
[MarshalAs(UnmanagedType.Bool)] ref bool fCancel,
384
[MarshalAs(UnmanagedType.U4)] ref BURN_MSI_PROPERTY actionMsiProperty,
385
[MarshalAs(UnmanagedType.U4)] ref INSTALLUILEVEL uiLevel,
393
- [MarshalAs(UnmanagedType.Bool)] ref bool fDisableExternalUiHandler
386
+ [MarshalAs(UnmanagedType.Bool)] ref bool fDisableExternalUiHandler,
387
+ [MarshalAs(UnmanagedType.U4)] ref BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning
388
);
389
390
/// <summary>
@@ -1851,6 +1845,25 @@ namespace WixToolset.Mba.Core
1845
SkipCleanup,
1846
}
1847
1848
+ /// <summary>
1849
+ /// The file versioning options for REINSTALLMODE, see https://docs.microsoft.com/en-us/windows/win32/msi/reinstallmode.
1850
+ /// </summary>
1851
+ public enum BOOTSTRAPPER_MSI_FILE_VERSIONING
1852
+ {
1853
+ /// <summary>
1854
+ /// o
1855
+ /// </summary>
1856
+ Older,
1857
+ /// <summary>
1858
+ /// e
1859
+ /// </summary>
1860
+ Equal,
1861
+ /// <summary>
1862
+ /// a
1863
+ /// </summary>
1864
+ All,
1865
+ }
1866
+
1867
/// <summary>
1868
/// The property Burn will add so the MSI can know the planned action for the package.
1869
/// </summary>
src/api/burn/balutil/inc/BalBaseBAFunctions.h
+3
-1
@@ -303,10 +303,12 @@ public: // IBootstrapperApplication
303
__in_z LPCWSTR /*wzPackageId*/,
304
__in BOOL /*fExecute*/,
305
__in BOOTSTRAPPER_ACTION_STATE /*action*/,
306
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING /*recommendedFileVersioning*/,
307
__inout BOOL* /*pfCancel*/,
308
__inout BURN_MSI_PROPERTY* /*pActionMsiProperty*/,
309
__inout INSTALLUILEVEL* /*pUiLevel*/,
309
- __inout BOOL* /*pfDisableExternalUiHandler*/
310
+ __inout BOOL* /*pfDisableExternalUiHandler*/,
311
+ __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* /*pFileVersioning*/
312
)
313
{
314
return S_OK;
src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h
+3
-1
@@ -319,10 +319,12 @@ public: // IBootstrapperApplication
319
__in_z LPCWSTR /*wzPackageId*/,
320
__in BOOL /*fExecute*/,
321
__in BOOTSTRAPPER_ACTION_STATE /*action*/,
322
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING /*recommendedFileVersioning*/,
323
__inout BOOL* pfCancel,
324
__inout BURN_MSI_PROPERTY* /*pActionMsiProperty*/,
325
__inout INSTALLUILEVEL* /*pUiLevel*/,
325
- __inout BOOL* /*pfDisableExternalUiHandler*/
326
+ __inout BOOL* /*pfDisableExternalUiHandler*/,
327
+ __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* /*pFileVersioning*/
328
)
329
{
330
*pfCancel |= CheckCanceled();
src/api/burn/balutil/inc/BalBaseBootstrapperApplicationProc.h
+1
-1
@@ -510,7 +510,7 @@ static HRESULT BalBaseBAProcOnPlanMsiPackage(
510
__inout BA_ONPLANMSIPACKAGE_RESULTS* pResults
511
)
512
{
513
- return pBA->OnPlanMsiPackage(pArgs->wzPackageId, pArgs->fExecute, pArgs->action, &pResults->fCancel, &pResults->actionMsiProperty, &pResults->uiLevel, &pResults->fDisableExternalUiHandler);
513
+ return pBA->OnPlanMsiPackage(pArgs->wzPackageId, pArgs->fExecute, pArgs->action, pArgs->recommendedFileVersioning, &pResults->fCancel, &pResults->actionMsiProperty, &pResults->uiLevel, &pResults->fDisableExternalUiHandler, &pResults->fileVersioning);
514
}
515
516
static HRESULT BalBaseBAProcOnBeginMsiTransactionBegin(
src/api/burn/balutil/inc/IBootstrapperApplication.h
+3
-1
@@ -208,10 +208,12 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A
208
__in_z LPCWSTR wzPackageId,
209
__in BOOL fExecute, // false means rollback.
210
__in BOOTSTRAPPER_ACTION_STATE action,
211
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning,
212
__inout BOOL* pfCancel,
213
__inout BURN_MSI_PROPERTY* pActionMsiProperty,
214
__inout INSTALLUILEVEL* pUiLevel,
214
- __inout BOOL* pfDisableExternalUiHandler
215
+ __inout BOOL* pfDisableExternalUiHandler,
216
+ __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* pFileVersioning
217
) = 0;
218
219
// OnPlanPackageComplete - called after the engine has completed getting the BA's input
src/burn/engine/elevation.cpp
+12
@@ -1002,6 +1002,9 @@ extern "C" HRESULT ElevationExecuteMsiPackage(
1002
hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.fDisableExternalUiHandler);
1003
ExitOnFailure(hr, "Failed to write fDisableExternalUiHandler to message buffer.");
1004
1005
+ hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.fileVersioning);
1006
+ ExitOnFailure(hr, "Failed to write fileVersioning to message buffer.");
1007
+
1008
hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->msiPackage.action);
1009
ExitOnFailure(hr, "Failed to write action to message buffer.");
1010
@@ -1083,6 +1086,9 @@ extern "C" HRESULT ElevationExecuteMspPackage(
1086
hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.fDisableExternalUiHandler);
1087
ExitOnFailure(hr, "Failed to write fDisableExternalUiHandler to message buffer.");
1088
1089
+ hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.fileVersioning);
1090
+ ExitOnFailure(hr, "Failed to write fileVersioning to message buffer.");
1091
+
1092
hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->mspTarget.action);
1093
ExitOnFailure(hr, "Failed to write action to message buffer.");
1094
@@ -2603,6 +2609,9 @@ static HRESULT OnExecuteMsiPackage(
2609
hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.fDisableExternalUiHandler);
2610
ExitOnFailure(hr, "Failed to read fDisableExternalUiHandler.");
2611
2612
+ hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.fileVersioning);
2613
+ ExitOnFailure(hr, "Failed to read fileVersioning.");
2614
+
2615
hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.msiPackage.action);
2616
ExitOnFailure(hr, "Failed to read action.");
2617
@@ -2703,6 +2712,9 @@ static HRESULT OnExecuteMspPackage(
2712
hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.fDisableExternalUiHandler);
2713
ExitOnFailure(hr, "Failed to read fDisableExternalUiHandler.");
2714
2715
+ hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.fileVersioning);
2716
+ ExitOnFailure(hr, "Failed to read fileVersioning.");
2717
+
2718
hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.mspTarget.action);
2719
ExitOnFailure(hr, "Failed to read action.");
2720
src/burn/engine/logging.cpp
+17
@@ -480,6 +480,23 @@ extern "C" LPCSTR LoggingPackageRegistrationStateToString(
480
}
481
}
482
483
+extern "C" LPCSTR LoggingMsiFileVersioningToString(
484
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning
485
+ )
486
+{
487
+ switch (fileVersioning)
488
+ {
489
+ case BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER:
490
+ return "o";
491
+ case BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER_OR_EQUAL:
492
+ return "e";
493
+ case BOOTSTRAPPER_MSI_FILE_VERSIONING_ALL:
494
+ return "a";
495
+ default:
496
+ return "Invalid";
497
+ }
498
+}
499
+
500
extern "C" LPCSTR LoggingMsiFeatureStateToString(
501
__in BOOTSTRAPPER_FEATURE_STATE featureState
502
)
src/burn/engine/logging.h
+4
@@ -106,6 +106,10 @@ LPCSTR LoggingPackageRegistrationStateToString(
106
__in BURN_PACKAGE_REGISTRATION_STATE registrationState
107
);
108
109
+LPCSTR LoggingMsiFileVersioningToString(
110
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning
111
+ );
112
+
113
LPCSTR LoggingMsiFeatureStateToString(
114
__in BOOTSTRAPPER_FEATURE_STATE featureState
115
);
src/burn/engine/msiengine.cpp
+93
-47
@@ -958,8 +958,8 @@ extern "C" HRESULT MsiEnginePlanAddPackage(
958
pAction->msiPackage.rgFeatures = rgRollbackFeatureActions;
959
rgRollbackFeatureActions = NULL;
960
961
- hr = MsiEngineCalculateInstallUiLevel(display, pUserExperience, pPackage->sczId, FALSE, pAction->msiPackage.action,
962
- &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler);
961
+ hr = MsiEnginePlanPackageOptions(display, pUserExperience, pPackage->sczId, FALSE, pAction->msiPackage.action,
962
+ &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler, &pAction->msiPackage.fileVersioning);
963
ExitOnFailure(hr, "Failed to get msi ui options.");
964
965
LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors.
@@ -984,8 +984,8 @@ extern "C" HRESULT MsiEnginePlanAddPackage(
984
pAction->msiPackage.rgFeatures = rgFeatureActions;
985
rgFeatureActions = NULL;
986
987
- hr = MsiEngineCalculateInstallUiLevel(display, pUserExperience, pPackage->sczId, TRUE, pAction->msiPackage.action,
988
- &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler);
987
+ hr = MsiEnginePlanPackageOptions(display, pUserExperience, pPackage->sczId, TRUE, pAction->msiPackage.action,
988
+ &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler, &pAction->msiPackage.fileVersioning);
989
ExitOnFailure(hr, "Failed to get msi ui options.");
990
991
LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors.
@@ -1153,10 +1153,10 @@ extern "C" HRESULT MsiEngineExecutePackage(
1153
}
1154
1155
// set up properties
1156
- hr = MsiEngineConcatProperties(pPackage->Msi.rgProperties, pPackage->Msi.cProperties, pVariables, fRollback, &sczProperties, FALSE);
1156
+ hr = MsiEngineConcatPackageProperties(pPackage->Msi.rgProperties, pPackage->Msi.cProperties, pVariables, fRollback, &sczProperties, FALSE);
1157
ExitOnFailure(hr, "Failed to add properties to argument string.");
1158
1159
- hr = MsiEngineConcatProperties(pPackage->Msi.rgProperties, pPackage->Msi.cProperties, pVariables, fRollback, &sczObfuscatedProperties, TRUE);
1159
+ hr = MsiEngineConcatPackageProperties(pPackage->Msi.rgProperties, pPackage->Msi.cProperties, pVariables, fRollback, &sczObfuscatedProperties, TRUE);
1160
ExitOnFailure(hr, "Failed to add obfuscated properties to argument string.");
1161
1162
// add feature action properties
@@ -1173,10 +1173,10 @@ extern "C" HRESULT MsiEngineExecutePackage(
1173
hr = ConcatPatchProperty(pCache, pPackage, fRollback, &sczObfuscatedProperties);
1174
ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string.");
1175
1176
- hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczProperties);
1176
+ hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, !pPackage->Msi.cFeatures, &sczProperties);
1177
ExitOnFailure(hr, "Failed to add action property to argument string.");
1178
1179
- hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczObfuscatedProperties);
1179
+ hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, !pPackage->Msi.cFeatures, &sczObfuscatedProperties);
1180
ExitOnFailure(hr, "Failed to add action property to obfuscated argument string.");
1181
1182
LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L"");
@@ -1187,9 +1187,6 @@ extern "C" HRESULT MsiEngineExecutePackage(
1187
switch (pExecuteAction->msiPackage.action)
1188
{
1189
case BOOTSTRAPPER_ACTION_STATE_INSTALL:
1190
- hr = StrAllocConcatSecure(&sczProperties, L" REBOOT=ReallySuppress", 0);
1191
- ExitOnFailure(hr, "Failed to add reboot suppression property on install.");
1192
-
1190
hr = WiuInstallProduct(sczMsiPath, sczProperties, &restart);
1191
ExitOnFailure(hr, "Failed to install MSI package.");
1192
@@ -1197,17 +1194,6 @@ extern "C" HRESULT MsiEngineExecutePackage(
1194
break;
1195
1196
case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE:
1200
- // If feature selection is not enabled, then reinstall the existing features to ensure they get
1201
- // updated.
1202
- if (0 == pPackage->Msi.cFeatures)
1203
- {
1204
- hr = StrAllocConcatSecure(&sczProperties, L" REINSTALL=ALL", 0);
1205
- ExitOnFailure(hr, "Failed to add reinstall all property on minor upgrade.");
1206
- }
1207
-
1208
- hr = StrAllocConcatSecure(&sczProperties, L" REINSTALLMODE=\"vomus\" REBOOT=ReallySuppress", 0);
1209
- ExitOnFailure(hr, "Failed to add reinstall mode and reboot suppression properties on minor upgrade.");
1210
-
1197
hr = WiuInstallProduct(sczMsiPath, sczProperties, &restart);
1198
ExitOnFailure(hr, "Failed to perform minor upgrade of MSI package.");
1199
@@ -1217,31 +1203,11 @@ extern "C" HRESULT MsiEngineExecutePackage(
1203
case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough;
1204
case BOOTSTRAPPER_ACTION_STATE_MEND: __fallthrough;
1205
case BOOTSTRAPPER_ACTION_STATE_REPAIR:
1220
- {
1221
- LPCWSTR wzReinstallAll = (BOOTSTRAPPER_ACTION_STATE_MODIFY == pExecuteAction->msiPackage.action ||
1222
- pPackage->Msi.cFeatures) ? L"" : L" REINSTALL=ALL";
1223
- LPCWSTR wzReinstallMode = (BOOTSTRAPPER_ACTION_STATE_MODIFY == pExecuteAction->msiPackage.action || BOOTSTRAPPER_ACTION_STATE_MEND == pExecuteAction->msiPackage.action) ? L"o" : L"e";
1224
-
1225
- hr = StrAllocFormattedSecure(&sczProperties, L"%ls%ls REINSTALLMODE=\"cmus%ls\" REBOOT=ReallySuppress", sczProperties ? sczProperties : L"", wzReinstallAll, wzReinstallMode);
1226
- ExitOnFailure(hr, "Failed to add reinstall mode and reboot suppression properties on repair.");
1227
- }
1228
-
1229
- // Ignore all dependencies, since the Burn engine already performed the check.
1230
- hr = StrAllocFormattedSecure(&sczProperties, L"%ls %ls=ALL", sczProperties, DEPENDENCY_IGNOREDEPENDENCIES);
1231
- ExitOnFailure(hr, "Failed to add the list of dependencies to ignore to the properties.");
1232
-
1206
hr = WiuInstallProduct(sczMsiPath, sczProperties, &restart);
1207
ExitOnFailure(hr, "Failed to run maintenance mode for MSI package.");
1208
break;
1209
1210
case BOOTSTRAPPER_ACTION_STATE_UNINSTALL:
1238
- hr = StrAllocConcatSecure(&sczProperties, L" REBOOT=ReallySuppress", 0);
1239
- ExitOnFailure(hr, "Failed to add reboot suppression property on uninstall.");
1240
-
1241
- // Ignore all dependencies, since the Burn engine already performed the check.
1242
- hr = StrAllocFormattedSecure(&sczProperties, L"%ls %ls=ALL", sczProperties, DEPENDENCY_IGNOREDEPENDENCIES);
1243
- ExitOnFailure(hr, "Failed to add the list of dependencies to ignore to the properties.");
1244
-
1211
hr = WiuConfigureProductEx(pPackage->Msi.sczProductCode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT, sczProperties, &restart);
1212
if (HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) == hr)
1213
{
@@ -1283,13 +1249,55 @@ LExit:
1249
return hr;
1250
}
1251
1286
-extern "C" HRESULT MsiEngineConcatActionProperty(
1252
+extern "C" HRESULT MsiEngineConcatBurnProperties(
1253
+ __in BOOTSTRAPPER_ACTION_STATE action,
1254
__in BURN_MSI_PROPERTY actionMsiProperty,
1255
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning,
1256
+ __in BOOL fMsiPackage,
1257
+ __in BOOL fFeatureSelectionEnabled,
1258
__deref_out_z LPWSTR* psczProperties
1259
)
1260
{
1261
HRESULT hr = S_OK;
1262
LPCWSTR wzPropertyName = NULL;
1263
+ LPCWSTR wzReinstallModeOptions = NULL;
1264
+ LPCWSTR wzFileVersioning = L"";
1265
+ BOOL fReinstallAll = FALSE;
1266
+ BOOL fIgnoreDependencies = FALSE;
1267
+
1268
+ switch (action)
1269
+ {
1270
+ case BOOTSTRAPPER_ACTION_STATE_INSTALL:
1271
+ wzReinstallModeOptions = L"mus";
1272
+ break;
1273
+ case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE:
1274
+ if (fMsiPackage)
1275
+ {
1276
+ // If feature selection is not enabled,
1277
+ // then reinstall the existing features to ensure they get updated.
1278
+ fReinstallAll = !fFeatureSelectionEnabled;
1279
+
1280
+ wzReinstallModeOptions = L"vmus";
1281
+ }
1282
+ break;
1283
+ case BOOTSTRAPPER_ACTION_STATE_REPAIR: __fallthrough;
1284
+ case BOOTSTRAPPER_ACTION_STATE_MEND: __fallthrough;
1285
+ case BOOTSTRAPPER_ACTION_STATE_MODIFY:
1286
+ if (fMsiPackage)
1287
+ {
1288
+ fReinstallAll = BOOTSTRAPPER_ACTION_STATE_MODIFY != action && !fFeatureSelectionEnabled;
1289
+ wzReinstallModeOptions = L"cmus";
1290
+ fIgnoreDependencies = TRUE;
1291
+ }
1292
+ else
1293
+ {
1294
+ wzReinstallModeOptions = L"mus";
1295
+ }
1296
+ break;
1297
+ case BOOTSTRAPPER_ACTION_STATE_UNINSTALL:
1298
+ fIgnoreDependencies = TRUE;
1299
+ break;
1300
+ }
1301
1302
switch (actionMsiProperty)
1303
{
@@ -1313,11 +1321,46 @@ extern "C" HRESULT MsiEngineConcatActionProperty(
1321
ExitOnFailure(hr, "Failed to add burn action property.");
1322
}
1323
1324
+ if (fReinstallAll)
1325
+ {
1326
+ hr = StrAllocConcatSecure(psczProperties, L" REINSTALL=ALL", 0);
1327
+ ExitOnFailure(hr, "Failed to add reinstall all property.");
1328
+ }
1329
+
1330
+ if (wzReinstallModeOptions)
1331
+ {
1332
+ switch (fileVersioning)
1333
+ {
1334
+ case BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER:
1335
+ wzFileVersioning = L"o";
1336
+ break;
1337
+ case BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER_OR_EQUAL:
1338
+ wzFileVersioning = L"e";
1339
+ break;
1340
+ case BOOTSTRAPPER_MSI_FILE_VERSIONING_ALL:
1341
+ wzFileVersioning = L"a";
1342
+ break;
1343
+ }
1344
+
1345
+ hr = StrAllocConcatFormattedSecure(psczProperties, L" REINSTALLMODE=\"%ls%ls\"", wzReinstallModeOptions, wzFileVersioning);
1346
+ ExitOnFailure(hr, "Failed to add reinstall mode.");
1347
+ }
1348
+
1349
+ hr = StrAllocConcatSecure(psczProperties, L" REBOOT=ReallySuppress", 0);
1350
+ ExitOnFailure(hr, "Failed to add reboot suppression property.");
1351
+
1352
+ if (fIgnoreDependencies)
1353
+ {
1354
+ // Ignore all dependencies, since the Burn engine already performed the check.
1355
+ hr = StrAllocConcatFormattedSecure(psczProperties, L" %ls=ALL", DEPENDENCY_IGNOREDEPENDENCIES);
1356
+ ExitOnFailure(hr, "Failed to add the list of dependencies to ignore to the properties.");
1357
+ }
1358
+
1359
LExit:
1360
return hr;
1361
}
1362
1320
-extern "C" HRESULT MsiEngineConcatProperties(
1363
+extern "C" HRESULT MsiEngineConcatPackageProperties(
1364
__in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties,
1365
__in DWORD cProperties,
1366
__in BURN_VARIABLES* pVariables,
@@ -1379,7 +1422,7 @@ LExit:
1422
return hr;
1423
}
1424
1382
-extern "C" HRESULT MsiEngineCalculateInstallUiLevel(
1425
+extern "C" HRESULT MsiEnginePlanPackageOptions(
1426
__in BOOTSTRAPPER_DISPLAY display,
1427
__in BURN_USER_EXPERIENCE* pUserExperience,
1428
__in LPCWSTR wzPackageId,
@@ -1387,11 +1430,13 @@ extern "C" HRESULT MsiEngineCalculateInstallUiLevel(
1430
__in BOOTSTRAPPER_ACTION_STATE actionState,
1431
__out BURN_MSI_PROPERTY* pActionMsiProperty,
1432
__out INSTALLUILEVEL* pUiLevel,
1390
- __out BOOL* pfDisableExternalUiHandler
1433
+ __out BOOL* pfDisableExternalUiHandler,
1434
+ __out BOOTSTRAPPER_MSI_FILE_VERSIONING* pFileVersioning
1435
)
1436
{
1437
*pUiLevel = INSTALLUILEVEL_NONE;
1438
*pfDisableExternalUiHandler = FALSE;
1439
+ *pFileVersioning = BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER;
1440
1441
if (BOOTSTRAPPER_DISPLAY_FULL == display ||
1442
BOOTSTRAPPER_DISPLAY_PASSIVE == display)
@@ -1406,6 +1451,7 @@ extern "C" HRESULT MsiEngineCalculateInstallUiLevel(
1451
break;
1452
case BOOTSTRAPPER_ACTION_STATE_REPAIR:
1453
*pActionMsiProperty = BURN_MSI_PROPERTY_REPAIR;
1454
+ *pFileVersioning = BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER_OR_EQUAL;
1455
break;
1456
case BOOTSTRAPPER_ACTION_STATE_MODIFY:
1457
*pActionMsiProperty = BURN_MSI_PROPERTY_MODIFY;
@@ -1415,7 +1461,7 @@ extern "C" HRESULT MsiEngineCalculateInstallUiLevel(
1461
break;
1462
}
1463
1418
- return UserExperienceOnPlanMsiPackage(pUserExperience, wzPackageId, fExecute, actionState, pActionMsiProperty, pUiLevel, pfDisableExternalUiHandler);
1464
+ return UserExperienceOnPlanMsiPackage(pUserExperience, wzPackageId, fExecute, actionState, pActionMsiProperty, pUiLevel, pfDisableExternalUiHandler, pFileVersioning);
1465
}
1466
1467
extern "C" void MsiEngineUpdateInstallRegistrationState(
src/burn/engine/msiengine.h
+9
-4
@@ -70,11 +70,15 @@ HRESULT MsiEngineExecutePackage(
70
__in LPVOID pvContext,
71
__out BOOTSTRAPPER_APPLY_RESTART* pRestart
72
);
73
-HRESULT MsiEngineConcatActionProperty(
73
+HRESULT MsiEngineConcatBurnProperties(
74
+ __in BOOTSTRAPPER_ACTION_STATE action,
75
__in BURN_MSI_PROPERTY actionMsiProperty,
76
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning,
77
+ __in BOOL fMsiPackage,
78
+ __in BOOL fFeatureSelectionEnabled,
79
__deref_out_z LPWSTR* psczProperties
80
);
77
-HRESULT MsiEngineConcatProperties(
81
+HRESULT MsiEngineConcatPackageProperties(
82
__in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties,
83
__in DWORD cProperties,
84
__in BURN_VARIABLES* pVariables,
@@ -82,7 +86,7 @@ HRESULT MsiEngineConcatProperties(
86
__deref_out_z LPWSTR* psczProperties,
87
__in BOOL fObfuscateHiddenVariables
88
);
85
-HRESULT MsiEngineCalculateInstallUiLevel(
89
+HRESULT MsiEnginePlanPackageOptions(
90
__in BOOTSTRAPPER_DISPLAY display,
91
__in BURN_USER_EXPERIENCE* pUserExperience,
92
__in LPCWSTR wzPackageId,
@@ -90,7 +94,8 @@ HRESULT MsiEngineCalculateInstallUiLevel(
94
__in BOOTSTRAPPER_ACTION_STATE actionState,
95
__out BURN_MSI_PROPERTY* pActionMsiProperty,
96
__out INSTALLUILEVEL* pUiLevel,
93
- __out BOOL* pfDisableExternalUiHandler
97
+ __out BOOL* pfDisableExternalUiHandler,
98
+ __out BOOTSTRAPPER_MSI_FILE_VERSIONING* pFileVersioning
99
);
100
void MsiEngineUpdateInstallRegistrationState(
101
__in BURN_EXECUTE_ACTION* pAction,
src/burn/engine/mspengine.cpp
+16
-22
@@ -629,16 +629,26 @@ extern "C" HRESULT MspEngineExecutePackage(
629
}
630
631
// set up properties
632
- hr = MsiEngineConcatProperties(pExecuteAction->mspTarget.pPackage->Msp.rgProperties, pExecuteAction->mspTarget.pPackage->Msp.cProperties, pVariables, fRollback, &sczProperties, FALSE);
632
+ hr = MsiEngineConcatPackageProperties(pExecuteAction->mspTarget.pPackage->Msp.rgProperties, pExecuteAction->mspTarget.pPackage->Msp.cProperties, pVariables, fRollback, &sczProperties, FALSE);
633
ExitOnFailure(hr, "Failed to add properties to argument string.");
634
635
- hr = MsiEngineConcatProperties(pExecuteAction->mspTarget.pPackage->Msp.rgProperties, pExecuteAction->mspTarget.pPackage->Msp.cProperties, pVariables, fRollback, &sczObfuscatedProperties, TRUE);
635
+ hr = MsiEngineConcatPackageProperties(pExecuteAction->mspTarget.pPackage->Msp.rgProperties, pExecuteAction->mspTarget.pPackage->Msp.cProperties, pVariables, fRollback, &sczObfuscatedProperties, TRUE);
636
ExitOnFailure(hr, "Failed to add properties to obfuscated argument string.");
637
638
- hr = MsiEngineConcatActionProperty(pExecuteAction->mspTarget.actionMsiProperty, &sczProperties);
638
+ if (BOOTSTRAPPER_ACTION_STATE_UNINSTALL != pExecuteAction->mspTarget.action)
639
+ {
640
+ hr = StrAllocConcatFormattedSecure(&sczProperties, L" PATCH=\"%ls\"", sczPatches);
641
+ ExitOnFailure(hr, "Failed to add PATCH property to argument string.");
642
+
643
+ hr = StrAllocConcatFormatted(&sczObfuscatedProperties, L" PATCH=\"%ls\"", sczPatches);
644
+ ExitOnFailure(hr, "Failed to add PATCH property to obfuscated argument string.");
645
+ }
646
+
647
+ // Always add Burn properties last.
648
+ hr = MsiEngineConcatBurnProperties(pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.actionMsiProperty, pExecuteAction->mspTarget.fileVersioning, FALSE, FALSE, &sczProperties);
649
ExitOnFailure(hr, "Failed to add action property to argument string.");
650
641
- hr = MsiEngineConcatActionProperty(pExecuteAction->mspTarget.actionMsiProperty, &sczObfuscatedProperties);
651
+ hr = MsiEngineConcatBurnProperties(pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.actionMsiProperty, pExecuteAction->mspTarget.fileVersioning, FALSE, FALSE, &sczObfuscatedProperties);
652
ExitOnFailure(hr, "Failed to add action property to obfuscated argument string.");
653
654
LogId(REPORT_STANDARD, MSG_APPLYING_PATCH_PACKAGE, pExecuteAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pExecuteAction->mspTarget.action), sczPatches, sczObfuscatedProperties, pExecuteAction->mspTarget.sczTargetProductCode);
@@ -650,27 +660,11 @@ extern "C" HRESULT MspEngineExecutePackage(
660
{
661
case BOOTSTRAPPER_ACTION_STATE_INSTALL: __fallthrough;
662
case BOOTSTRAPPER_ACTION_STATE_REPAIR:
653
- hr = StrAllocConcatSecure(&sczProperties, L" PATCH=\"", 0);
654
- ExitOnFailure(hr, "Failed to add PATCH property on install.");
655
-
656
- hr = StrAllocConcatSecure(&sczProperties, sczPatches, 0);
657
- ExitOnFailure(hr, "Failed to add patches to PATCH property on install.");
658
-
659
- hr = StrAllocConcatSecure(&sczProperties, L"\" REBOOT=ReallySuppress", 0);
660
- ExitOnFailure(hr, "Failed to add reboot suppression property on install.");
661
-
663
hr = WiuConfigureProductEx(pExecuteAction->mspTarget.sczTargetProductCode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT, sczProperties, &restart);
664
ExitOnFailure(hr, "Failed to install MSP package.");
665
break;
666
667
case BOOTSTRAPPER_ACTION_STATE_UNINSTALL:
667
- hr = StrAllocConcatSecure(&sczProperties, L" REBOOT=ReallySuppress", 0);
668
- ExitOnFailure(hr, "Failed to add reboot suppression property on uninstall.");
669
-
670
- // Ignore all dependencies, since the Burn engine already performed the check.
671
- hr = StrAllocFormattedSecure(&sczProperties, L"%ls %ls=ALL", sczProperties, DEPENDENCY_IGNOREDEPENDENCIES);
672
- ExitOnFailure(hr, "Failed to add the list of dependencies to ignore to the properties.");
673
-
668
hr = WiuRemovePatches(sczPatches, pExecuteAction->mspTarget.sczTargetProductCode, sczProperties, &restart);
669
ExitOnFailure(hr, "Failed to uninstall MSP package.");
670
break;
@@ -1128,8 +1122,8 @@ static HRESULT PlanTargetProduct(
1122
hr = StrAllocString(&pAction->mspTarget.sczTargetProductCode, pTargetProduct->wzTargetProductCode, 0);
1123
ExitOnFailure(hr, "Failed to copy target product code.");
1124
1131
- hr = MsiEngineCalculateInstallUiLevel(display, pUserExperience, pPackage->sczId, !fRollback, pAction->mspTarget.action,
1132
- &pAction->mspTarget.actionMsiProperty, &pAction->mspTarget.uiLevel, &pAction->mspTarget.fDisableExternalUiHandler);
1125
+ hr = MsiEnginePlanPackageOptions(display, pUserExperience, pPackage->sczId, !fRollback, pAction->mspTarget.action,
1126
+ &pAction->mspTarget.actionMsiProperty, &pAction->mspTarget.uiLevel, &pAction->mspTarget.fDisableExternalUiHandler, &pAction->mspTarget.fileVersioning);
1127
ExitOnFailure(hr, "Failed to get msp ui options.");
1128
1129
// If this is a per-machine target product, then the plan needs to be per-machine as well.
src/burn/engine/plan.cpp
+2
-2
@@ -2596,7 +2596,7 @@ static void ExecuteActionLog(
2596
break;
2597
2598
case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE:
2599
- LogStringLine(PlanDumpLevel, "%ls action[%u]: MSI_PACKAGE package id: %ls, action: %hs, action msi property: %ls, ui level: %u, disable externaluihandler: %ls, log path: %ls, logging attrib: %u", wzBase, iAction, pAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pAction->msiPackage.action), LoggingBurnMsiPropertyToString(pAction->msiPackage.actionMsiProperty), pAction->msiPackage.uiLevel, pAction->msiPackage.fDisableExternalUiHandler ? L"yes" : L"no", pAction->msiPackage.sczLogPath, pAction->msiPackage.dwLoggingAttributes);
2599
+ LogStringLine(PlanDumpLevel, "%ls action[%u]: MSI_PACKAGE package id: %ls, action: %hs, action msi property: %ls, ui level: %u, disable externaluihandler: %hs, file versioning: %hs, log path: %ls, logging attrib: %u", wzBase, iAction, pAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pAction->msiPackage.action), LoggingBurnMsiPropertyToString(pAction->msiPackage.actionMsiProperty), pAction->msiPackage.uiLevel, LoggingBoolToString(pAction->msiPackage.fDisableExternalUiHandler), LoggingMsiFileVersioningToString(pAction->msiPackage.fileVersioning), pAction->msiPackage.sczLogPath, pAction->msiPackage.dwLoggingAttributes);
2600
for (DWORD j = 0; j < pAction->msiPackage.pPackage->Msi.cSlipstreamMspPackages; ++j)
2601
{
2602
const BURN_SLIPSTREAM_MSP* pSlipstreamMsp = pAction->msiPackage.pPackage->Msi.rgSlipstreamMsps + j;
@@ -2605,7 +2605,7 @@ static void ExecuteActionLog(
2605
break;
2606
2607
case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET:
2608
- LogStringLine(PlanDumpLevel, "%ls action[%u]: MSP_TARGET package id: %ls, action: %hs, target product code: %ls, target per-machine: %ls, action msi property: %ls, 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", LoggingBurnMsiPropertyToString(pAction->mspTarget.actionMsiProperty), pAction->mspTarget.uiLevel, pAction->mspTarget.fDisableExternalUiHandler ? L"yes" : L"no", pAction->mspTarget.sczLogPath);
2608
+ LogStringLine(PlanDumpLevel, "%ls action[%u]: MSP_TARGET package id: %ls, action: %hs, target product code: %ls, target per-machine: %hs, action msi property: %ls, ui level: %u, disable externaluihandler: %hs, file versioning: %hs, log path: %ls", wzBase, iAction, pAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pAction->mspTarget.action), pAction->mspTarget.sczTargetProductCode, LoggingBoolToString(pAction->mspTarget.fPerMachineTarget), LoggingBurnMsiPropertyToString(pAction->mspTarget.actionMsiProperty), pAction->mspTarget.uiLevel, LoggingBoolToString(pAction->mspTarget.fDisableExternalUiHandler), LoggingMsiFileVersioningToString(pAction->mspTarget.fileVersioning), pAction->mspTarget.sczLogPath);
2609
for (DWORD j = 0; j < pAction->mspTarget.cOrderedPatches; ++j)
2610
{
2611
LogStringLine(PlanDumpLevel, " Patch[%u]: order: %u, msp package id: %ls", j, pAction->mspTarget.rgOrderedPatches[j].pTargetProduct->dwOrder, pAction->mspTarget.rgOrderedPatches[j].pPackage->sczId);
src/burn/engine/plan.h
+2
@@ -175,6 +175,7 @@ typedef struct _BURN_EXECUTE_ACTION
175
INSTALLUILEVEL uiLevel;
176
BOOL fDisableExternalUiHandler;
177
BOOTSTRAPPER_ACTION_STATE action;
178
+ BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning;
179
180
BOOTSTRAPPER_FEATURE_ACTION* rgFeatures;
181
} msiPackage;
@@ -190,6 +191,7 @@ typedef struct _BURN_EXECUTE_ACTION
191
INSTALLUILEVEL uiLevel;
192
BOOL fDisableExternalUiHandler;
193
BOOTSTRAPPER_ACTION_STATE action;
194
+ BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning;
195
196
BURN_ORDERED_PATCHES* rgOrderedPatches;
197
DWORD cOrderedPatches;
src/burn/engine/userexperience.cpp
+6
-2
@@ -104,7 +104,7 @@ extern "C" HRESULT UserExperienceLoad(
104
args.pCommand = pCommand;
105
args.pfnBootstrapperEngineProc = EngineForApplicationProc;
106
args.pvBootstrapperEngineProcContext = pEngineContext;
107
- args.qwEngineAPIVersion = MAKEQWORDVERSION(2021, 8, 10, 0);
107
+ args.qwEngineAPIVersion = MAKEQWORDVERSION(2021, 12, 7, 0);
108
109
results.cbSize = sizeof(BOOTSTRAPPER_CREATE_RESULTS);
110
@@ -1896,7 +1896,8 @@ EXTERN_C BAAPI UserExperienceOnPlanMsiPackage(
1896
__in BOOTSTRAPPER_ACTION_STATE action,
1897
__inout BURN_MSI_PROPERTY* pActionMsiProperty,
1898
__inout INSTALLUILEVEL* pUiLevel,
1899
- __inout BOOL* pfDisableExternalUiHandler
1899
+ __inout BOOL* pfDisableExternalUiHandler,
1900
+ __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* pFileVersioning
1901
)
1902
{
1903
HRESULT hr = S_OK;
@@ -1907,11 +1908,13 @@ EXTERN_C BAAPI UserExperienceOnPlanMsiPackage(
1908
args.wzPackageId = wzPackageId;
1909
args.fExecute = fExecute;
1910
args.action = action;
1911
+ args.recommendedFileVersioning = *pFileVersioning;
1912
1913
results.cbSize = sizeof(results);
1914
results.actionMsiProperty = *pActionMsiProperty;
1915
results.uiLevel = *pUiLevel;
1916
results.fDisableExternalUiHandler = *pfDisableExternalUiHandler;
1917
+ results.fileVersioning = args.recommendedFileVersioning;
1918
1919
hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE, &args, &results);
1920
ExitOnFailure(hr, "BA OnPlanMsiPackage failed.");
@@ -1923,6 +1926,7 @@ EXTERN_C BAAPI UserExperienceOnPlanMsiPackage(
1926
*pActionMsiProperty = results.actionMsiProperty;
1927
*pUiLevel = results.uiLevel;
1928
*pfDisableExternalUiHandler = results.fDisableExternalUiHandler;
1929
+ *pFileVersioning = results.fileVersioning;
1930
1931
LExit:
1932
return hr;
src/burn/engine/userexperience.h
+2
-1
@@ -440,7 +440,8 @@ BAAPI UserExperienceOnPlanMsiPackage(
440
__in BOOTSTRAPPER_ACTION_STATE action,
441
__inout BURN_MSI_PROPERTY* pActionMsiProperty,
442
__inout INSTALLUILEVEL* pUiLevel,
443
- __inout BOOL* pfDisableExternalUiHandler
443
+ __inout BOOL* pfDisableExternalUiHandler,
444
+ __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* pFileVersioning
445
);
446
BAAPI UserExperienceOnPlannedPackage(
447
__in BURN_USER_EXPERIENCE* pUserExperience,
src/burn/test/BurnUnitTest/PlanTest.cpp
+26
-22
@@ -87,7 +87,7 @@ namespace Bootstrapper
87
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
88
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
89
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
90
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
90
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
91
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
92
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
93
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -100,7 +100,7 @@ namespace Bootstrapper
100
ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageB");
101
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
102
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_REGISTER);
103
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
103
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
104
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
105
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
106
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -109,7 +109,7 @@ namespace Bootstrapper
109
ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"PackageC");
110
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
111
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_REGISTER);
112
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
112
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
113
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
114
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_REGISTER);
115
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -126,7 +126,7 @@ namespace Bootstrapper
126
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
127
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
128
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
129
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
129
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
130
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
131
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
132
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -209,13 +209,13 @@ namespace Bootstrapper
209
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageC", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
210
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
211
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageC", BURN_DEPENDENCY_ACTION_UNREGISTER);
212
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
212
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageC", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
213
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
214
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
215
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageB", L"{E6469F05-BDC8-4EB8-B218-67412543EFAA}", BURN_DEPENDENCY_ACTION_UNREGISTER);
216
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
217
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageB", BURN_DEPENDENCY_ACTION_UNREGISTER);
218
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
218
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageB", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
219
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
220
ValidateExecuteCommitMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ");
221
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -225,7 +225,7 @@ namespace Bootstrapper
225
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
226
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
227
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
228
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
228
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
229
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
230
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
231
Assert::Equal(dwIndex, pPlan->cExecuteActions);
@@ -251,7 +251,7 @@ namespace Bootstrapper
251
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
252
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
253
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
254
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
254
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
255
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
256
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
257
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -325,7 +325,7 @@ namespace Bootstrapper
325
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
326
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
327
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
328
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
328
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
329
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
330
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
331
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -340,7 +340,7 @@ namespace Bootstrapper
340
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
341
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
342
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
343
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
343
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
344
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
345
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
346
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -478,7 +478,7 @@ namespace Bootstrapper
478
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
479
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
480
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
481
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
481
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
482
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
483
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
484
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -494,7 +494,7 @@ namespace Bootstrapper
494
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
495
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
496
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
497
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
497
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
498
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
499
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_UNREGISTER);
500
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -615,7 +615,7 @@ namespace Bootstrapper
615
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
616
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
617
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
618
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
618
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
619
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
620
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
621
Assert::Equal(dwIndex, pPlan->cExecuteActions);
@@ -628,7 +628,7 @@ namespace Bootstrapper
628
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
629
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
630
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
631
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
631
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
632
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
633
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
634
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -768,13 +768,13 @@ namespace Bootstrapper
768
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
769
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
770
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
771
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
771
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
772
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
773
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
774
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
775
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
776
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_REGISTER);
777
- pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_INSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, TRUE);
777
+ pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_INSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, TRUE);
778
ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
779
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
780
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
@@ -793,14 +793,14 @@ namespace Bootstrapper
793
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
794
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
795
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
796
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
796
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
797
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
798
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
799
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
800
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
801
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_UNREGISTER);
802
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
803
- pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, TRUE);
803
+ pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, TRUE);
804
ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
805
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
806
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -862,7 +862,7 @@ namespace Bootstrapper
862
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PatchA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_UNREGISTER);
863
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
864
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_UNREGISTER);
865
- pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, TRUE);
865
+ pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, TRUE);
866
ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
867
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
868
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -870,7 +870,7 @@ namespace Bootstrapper
870
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
871
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_UNREGISTER);
872
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
873
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
873
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, BURN_MSI_PROPERTY_UNINSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
874
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
875
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
876
Assert::Equal(dwIndex, pPlan->cExecuteActions);
@@ -883,14 +883,14 @@ namespace Bootstrapper
883
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
884
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PatchA", BURN_DEPENDENCY_ACTION_REGISTER);
885
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
886
- pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_INSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, TRUE);
886
+ pExecuteAction = ValidateDeletedExecuteMspTarget(pPlan, fRollback, dwIndex++, L"PatchA", BOOTSTRAPPER_ACTION_STATE_INSTALL, L"{5FF7F534-3FFC-41E0-80CD-E6361E5E7B7B}", TRUE, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, TRUE);
887
ValidateExecuteMspTargetPatch(pExecuteAction, 0, L"PatchA");
888
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
889
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{22D1DDBA-284D-40A7-BD14-95EA07906F21}", BURN_DEPENDENCY_ACTION_REGISTER);
890
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
891
ValidateExecutePackageProvider(pPlan, fRollback, dwIndex++, L"PackageA", BURN_DEPENDENCY_ACTION_REGISTER);
892
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
893
- ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, 0);
893
+ ValidateExecuteMsiPackage(pPlan, fRollback, dwIndex++, L"PackageA", BOOTSTRAPPER_ACTION_STATE_INSTALL, BURN_MSI_PROPERTY_INSTALL, INSTALLUILEVEL_NONE, FALSE, BOOTSTRAPPER_MSI_FILE_VERSIONING_MISSING_OR_OLDER, 0);
894
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
895
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
896
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -1312,6 +1312,7 @@ namespace Bootstrapper
1312
__in BURN_MSI_PROPERTY actionMsiProperty,
1313
__in DWORD uiLevel,
1314
__in BOOL fDisableExternalUiHandler,
1315
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning,
1316
__in DWORD dwLoggingAttributes
1317
)
1318
{
@@ -1322,6 +1323,7 @@ namespace Bootstrapper
1323
Assert::Equal<DWORD>(actionMsiProperty, pAction->msiPackage.actionMsiProperty);
1324
Assert::Equal<DWORD>(uiLevel, pAction->msiPackage.uiLevel);
1325
Assert::Equal<BOOL>(fDisableExternalUiHandler, pAction->msiPackage.fDisableExternalUiHandler);
1326
+ Assert::Equal<DWORD>(fileVersioning, pAction->msiPackage.fileVersioning);
1327
NativeAssert::NotNull(pAction->msiPackage.sczLogPath);
1328
Assert::Equal<DWORD>(dwLoggingAttributes, pAction->msiPackage.dwLoggingAttributes);
1329
Assert::Equal<BOOL>(FALSE, pAction->fDeleted);
@@ -1338,6 +1340,7 @@ namespace Bootstrapper
1340
__in BURN_MSI_PROPERTY actionMsiProperty,
1341
__in DWORD uiLevel,
1342
__in BOOL fDisableExternalUiHandler,
1343
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING fileVersioning,
1344
__in BOOL fDeleted
1345
)
1346
{
@@ -1350,6 +1353,7 @@ namespace Bootstrapper
1353
Assert::Equal<DWORD>(actionMsiProperty, pAction->mspTarget.actionMsiProperty);
1354
Assert::Equal<DWORD>(uiLevel, pAction->mspTarget.uiLevel);
1355
Assert::Equal<BOOL>(fDisableExternalUiHandler, pAction->mspTarget.fDisableExternalUiHandler);
1356
+ Assert::Equal<DWORD>(fileVersioning, pAction->mspTarget.fileVersioning);
1357
NativeAssert::NotNull(pAction->mspTarget.sczLogPath);
1358
Assert::Equal<BOOL>(fDeleted, pAction->fDeleted);
1359
return pAction;
src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp
+4
-2
@@ -462,10 +462,12 @@ public: // IBootstrapperApplication
462
__in_z LPCWSTR wzPackageId,
463
__in BOOL fExecute,
464
__in BOOTSTRAPPER_ACTION_STATE action,
465
+ __in BOOTSTRAPPER_MSI_FILE_VERSIONING recommendedFileVersioning,
466
__inout BOOL* pfCancel,
467
__inout BURN_MSI_PROPERTY* pActionMsiProperty,
468
__inout INSTALLUILEVEL* pUiLevel,
468
- __inout BOOL* pfDisableExternalUiHandler
469
+ __inout BOOL* pfDisableExternalUiHandler,
470
+ __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* pFileVersioning
471
)
472
{
473
HRESULT hr = S_OK;
@@ -501,7 +503,7 @@ public: // IBootstrapperApplication
503
}
504
505
LExit:
504
- return __super::OnPlanMsiPackage(wzPackageId, fExecute, action, pfCancel, pActionMsiProperty, pUiLevel, pfDisableExternalUiHandler);
506
+ return __super::OnPlanMsiPackage(wzPackageId, fExecute, action, recommendedFileVersioning, pfCancel, pActionMsiProperty, pUiLevel, pfDisableExternalUiHandler, pFileVersioning);
507
}
508
509