@joebigelow / wix-1 / commits / 19d85eed

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