aboutsummaryrefslogtreecommitdiff
path: root/src/engine/msiengine.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-05-14 19:59:06 +1000
committerSean Hall <r.sean.hall@gmail.com>2020-05-16 21:42:51 +1000
commit50cb451bcee148afd9768086c1bb5ed4f75562df (patch)
treeb4a28ef01446f2afd02b803af28ee6c628816cee /src/engine/msiengine.cpp
parentd232c5621fe336b1f563b69be7637c93e795e151 (diff)
downloadwix-50cb451bcee148afd9768086c1bb5ed4f75562df.tar.gz
wix-50cb451bcee148afd9768086c1bb5ed4f75562df.tar.bz2
wix-50cb451bcee148afd9768086c1bb5ed4f75562df.zip
WIXFEAT:6164 Give BA control over UI level and handler.
Diffstat (limited to 'src/engine/msiengine.cpp')
-rw-r--r--src/engine/msiengine.cpp117
1 files changed, 87 insertions, 30 deletions
diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp
index 17571ac5..3f89dde9 100644
--- a/src/engine/msiengine.cpp
+++ b/src/engine/msiengine.cpp
@@ -4,7 +4,10 @@
4 4
5 5
6// constants 6// constants
7 7#define BURNMSIINSTALL_PROPERTY_NAME L"BURNMSIINSTALL"
8#define BURNMSIMODIFY_PROPERTY_NAME L"BURNMSIMODIFY"
9#define BURNMSIREPAIR_PROPERTY_NAME L"BURNMSIREPAIR"
10#define BURNMSIUNINSTALL_PROPERTY_NAME L"BURNMSIUNINSTALL"
8 11
9// structs 12// structs
10 13
@@ -79,10 +82,6 @@ extern "C" HRESULT MsiEngineParsePackageFromXml(
79 hr = FileVersionFromStringEx(scz, 0, &pPackage->Msi.qwVersion); 82 hr = FileVersionFromStringEx(scz, 0, &pPackage->Msi.qwVersion);
80 ExitOnFailure(hr, "Failed to parse @Version: %ls", scz); 83 ExitOnFailure(hr, "Failed to parse @Version: %ls", scz);
81 84
82 // @DisplayInternalUI
83 hr = XmlGetYesNoAttribute(pixnMsiPackage, L"DisplayInternalUI", &pPackage->Msi.fDisplayInternalUI);
84 ExitOnFailure(hr, "Failed to get @DisplayInternalUI.");
85
86 // @UpgradeCode 85 // @UpgradeCode
87 hr = XmlGetAttributeEx(pixnMsiPackage, L"UpgradeCode", &pPackage->Msi.sczUpgradeCode); 86 hr = XmlGetAttributeEx(pixnMsiPackage, L"UpgradeCode", &pPackage->Msi.sczUpgradeCode);
88 if (E_NOTFOUND != hr) 87 if (E_NOTFOUND != hr)
@@ -874,7 +873,7 @@ LExit:
874// PlanAdd - adds the calculated execute and rollback actions for the package. 873// PlanAdd - adds the calculated execute and rollback actions for the package.
875// 874//
876extern "C" HRESULT MsiEnginePlanAddPackage( 875extern "C" HRESULT MsiEnginePlanAddPackage(
877 __in BOOTSTRAPPER_DISPLAY display, 876 __in BURN_USER_EXPERIENCE* pUserExperience,
878 __in BURN_PACKAGE* pPackage, 877 __in BURN_PACKAGE* pPackage,
879 __in BURN_PLAN* pPlan, 878 __in BURN_PLAN* pPlan,
880 __in BURN_LOGGING* pLog, 879 __in BURN_LOGGING* pLog,
@@ -926,10 +925,13 @@ extern "C" HRESULT MsiEnginePlanAddPackage(
926 pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE; 925 pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE;
927 pAction->msiPackage.pPackage = pPackage; 926 pAction->msiPackage.pPackage = pPackage;
928 pAction->msiPackage.action = pPackage->rollback; 927 pAction->msiPackage.action = pPackage->rollback;
929 pAction->msiPackage.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msi.fDisplayInternalUI, display, pAction->msiPackage.action);
930 pAction->msiPackage.rgFeatures = rgRollbackFeatureActions; 928 pAction->msiPackage.rgFeatures = rgRollbackFeatureActions;
931 rgRollbackFeatureActions = NULL; 929 rgRollbackFeatureActions = NULL;
932 930
931 hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, FALSE, pAction->msiPackage.action,
932 &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler);
933 ExitOnFailure(hr, "Failed to get msi ui options.");
934
933 LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors. 935 LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors.
934 pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; 936 pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes;
935 937
@@ -949,10 +951,13 @@ extern "C" HRESULT MsiEnginePlanAddPackage(
949 pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE; 951 pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE;
950 pAction->msiPackage.pPackage = pPackage; 952 pAction->msiPackage.pPackage = pPackage;
951 pAction->msiPackage.action = pPackage->execute; 953 pAction->msiPackage.action = pPackage->execute;
952 pAction->msiPackage.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msi.fDisplayInternalUI, display, pAction->msiPackage.action);
953 pAction->msiPackage.rgFeatures = rgFeatureActions; 954 pAction->msiPackage.rgFeatures = rgFeatureActions;
954 rgFeatureActions = NULL; 955 rgFeatureActions = NULL;
955 956
957 hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, TRUE, pAction->msiPackage.action,
958 &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler);
959 ExitOnFailure(hr, "Failed to get msi ui options.");
960
956 LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors. 961 LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors.
957 pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; 962 pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes;
958 } 963 }
@@ -1073,7 +1078,6 @@ extern "C" HRESULT MsiEngineAddCompatiblePackage(
1073 } 1078 }
1074 1079
1075 pCompatiblePackage->type = BURN_PACKAGE_TYPE_MSI; 1080 pCompatiblePackage->type = BURN_PACKAGE_TYPE_MSI;
1076 pCompatiblePackage->Msi.fDisplayInternalUI = pPackage->Msi.fDisplayInternalUI;
1077 1081
1078 if (ppCompatiblePackage) 1082 if (ppCompatiblePackage)
1079 { 1083 {
@@ -1161,8 +1165,16 @@ extern "C" HRESULT MsiEngineExecutePackage(
1161 VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->msiPackage.action, TRUE); 1165 VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->msiPackage.action, TRUE);
1162 1166
1163 // Wire up the external UI handler and logging. 1167 // Wire up the external UI handler and logging.
1164 hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->msiPackage.uiLevel, hwndParent, pvContext, fRollback, &context); 1168 if (pExecuteAction->msiPackage.fDisableExternalUiHandler)
1165 ExitOnFailure(hr, "Failed to initialize external UI handler."); 1169 {
1170 hr = WiuInitializeInternalUI(pExecuteAction->msiPackage.uiLevel, hwndParent, &context);
1171 ExitOnFailure(hr, "Failed to initialize internal UI for MSI package.");
1172 }
1173 else
1174 {
1175 hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->msiPackage.uiLevel, hwndParent, pvContext, fRollback, &context);
1176 ExitOnFailure(hr, "Failed to initialize external UI handler.");
1177 }
1166 1178
1167 if (pExecuteAction->msiPackage.sczLogPath && *pExecuteAction->msiPackage.sczLogPath) 1179 if (pExecuteAction->msiPackage.sczLogPath && *pExecuteAction->msiPackage.sczLogPath)
1168 { 1180 {
@@ -1191,6 +1203,12 @@ extern "C" HRESULT MsiEngineExecutePackage(
1191 hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, pExecuteAction->msiPackage.rgSlipstreamPatches, &sczObfuscatedProperties); 1203 hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, pExecuteAction->msiPackage.rgSlipstreamPatches, &sczObfuscatedProperties);
1192 ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string."); 1204 ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string.");
1193 1205
1206 hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczProperties);
1207 ExitOnFailure(hr, "Failed to add action property to argument string.");
1208
1209 hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczObfuscatedProperties);
1210 ExitOnFailure(hr, "Failed to add action property to obfuscated argument string.");
1211
1194 LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pExecuteAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L""); 1212 LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pExecuteAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L"");
1195 1213
1196 // 1214 //
@@ -1300,6 +1318,40 @@ LExit:
1300 return hr; 1318 return hr;
1301} 1319}
1302 1320
1321extern "C" HRESULT MsiEngineConcatActionProperty(
1322 __in BURN_MSI_PROPERTY actionMsiProperty,
1323 __deref_out_z LPWSTR* psczProperties
1324 )
1325{
1326 HRESULT hr = S_OK;
1327 LPCWSTR wzPropertyName = NULL;
1328
1329 switch (actionMsiProperty)
1330 {
1331 case BURN_MSI_PROPERTY_INSTALL:
1332 wzPropertyName = BURNMSIINSTALL_PROPERTY_NAME;
1333 break;
1334 case BURN_MSI_PROPERTY_MODIFY:
1335 wzPropertyName = BURNMSIMODIFY_PROPERTY_NAME;
1336 break;
1337 case BURN_MSI_PROPERTY_REPAIR:
1338 wzPropertyName = BURNMSIREPAIR_PROPERTY_NAME;
1339 break;
1340 case BURN_MSI_PROPERTY_UNINSTALL:
1341 wzPropertyName = BURNMSIUNINSTALL_PROPERTY_NAME;
1342 break;
1343 }
1344
1345 if (wzPropertyName)
1346 {
1347 hr = StrAllocConcatFormattedSecure(psczProperties, L" %ls=1", wzPropertyName);
1348 ExitOnFailure(hr, "Failed to add burn action property.");
1349 }
1350
1351LExit:
1352 return hr;
1353}
1354
1303// The contents of psczProperties may be sensitive, should keep encrypted and SecureZeroFree. 1355// The contents of psczProperties may be sensitive, should keep encrypted and SecureZeroFree.
1304extern "C" HRESULT MsiEngineConcatProperties( 1356extern "C" HRESULT MsiEngineConcatProperties(
1305 __in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties, 1357 __in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties,
@@ -1363,31 +1415,36 @@ LExit:
1363 return hr; 1415 return hr;
1364} 1416}
1365 1417
1366extern "C" INSTALLUILEVEL MsiEngineCalculateInstallUiLevel( 1418extern "C" HRESULT MsiEngineCalculateInstallUiLevel(
1367 __in BOOL fDisplayInternalUI, 1419 __in BURN_USER_EXPERIENCE* pUserExperience,
1368 __in BOOTSTRAPPER_DISPLAY display, 1420 __in LPCWSTR wzPackageId,
1369 __in BOOTSTRAPPER_ACTION_STATE actionState 1421 __in BOOL fExecute,
1422 __in BOOTSTRAPPER_ACTION_STATE actionState,
1423 __out BURN_MSI_PROPERTY* pActionMsiProperty,
1424 __out INSTALLUILEVEL* pUiLevel,
1425 __out BOOL* pfDisableExternalUiHandler
1370 ) 1426 )
1371{ 1427{
1372 // Assume there will be no internal UI displayed. 1428 *pUiLevel = static_cast<INSTALLUILEVEL>(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY);
1373 INSTALLUILEVEL uiLevel = static_cast<INSTALLUILEVEL>(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY); 1429 *pfDisableExternalUiHandler = FALSE;
1374 1430
1375 // suppress internal UI during uninstall to mimic ARP and "msiexec /x" behavior 1431 switch (actionState)
1376 if (fDisplayInternalUI && BOOTSTRAPPER_ACTION_STATE_UNINSTALL != actionState && BOOTSTRAPPER_ACTION_STATE_REPAIR != actionState)
1377 { 1432 {
1378 switch (display) 1433 case BOOTSTRAPPER_ACTION_STATE_UNINSTALL:
1379 { 1434 *pActionMsiProperty = BURN_MSI_PROPERTY_UNINSTALL;
1380 case BOOTSTRAPPER_DISPLAY_FULL: 1435 break;
1381 uiLevel = INSTALLUILEVEL_FULL; 1436 case BOOTSTRAPPER_ACTION_STATE_REPAIR:
1382 break; 1437 *pActionMsiProperty = BURN_MSI_PROPERTY_REPAIR;
1383 1438 break;
1384 case BOOTSTRAPPER_DISPLAY_PASSIVE: 1439 case BOOTSTRAPPER_ACTION_STATE_MODIFY:
1385 uiLevel = INSTALLUILEVEL_REDUCED; 1440 *pActionMsiProperty = BURN_MSI_PROPERTY_MODIFY;
1386 break; 1441 break;
1387 } 1442 default:
1443 *pActionMsiProperty = BURN_MSI_PROPERTY_INSTALL;
1444 break;
1388 } 1445 }
1389 1446
1390 return uiLevel; 1447 return UserExperienceOnPlanMsiPackage(pUserExperience, wzPackageId, fExecute, actionState, pActionMsiProperty, pUiLevel, pfDisableExternalUiHandler);
1391} 1448}
1392 1449
1393 1450