diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-02-01 18:54:54 -0600 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-02-04 22:16:10 -0600 |
commit | cede270b2bd3da6bd8d5205b8834e786c8d6c1ce (patch) | |
tree | fc37ad41e0a03f67fc2a8946231e519551cdcc95 /src/engine/msiengine.cpp | |
parent | f1f1a124df59e8639c2bcbfa7d3a4b37fb348bb7 (diff) | |
download | wix-cede270b2bd3da6bd8d5205b8834e786c8d6c1ce.tar.gz wix-cede270b2bd3da6bd8d5205b8834e786c8d6c1ce.tar.bz2 wix-cede270b2bd3da6bd8d5205b8834e786c8d6c1ce.zip |
Remove feature to uninstall compatible orphaned MSI packages.
Diffstat (limited to 'src/engine/msiengine.cpp')
-rw-r--r-- | src/engine/msiengine.cpp | 156 |
1 files changed, 0 insertions, 156 deletions
diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp index 688be7af..5bccb375 100644 --- a/src/engine/msiengine.cpp +++ b/src/engine/msiengine.cpp | |||
@@ -325,7 +325,6 @@ extern "C" void MsiEnginePackageUninitialize( | |||
325 | { | 325 | { |
326 | ReleaseStr(pPackage->Msi.sczProductCode); | 326 | ReleaseStr(pPackage->Msi.sczProductCode); |
327 | ReleaseStr(pPackage->Msi.sczUpgradeCode); | 327 | ReleaseStr(pPackage->Msi.sczUpgradeCode); |
328 | ReleaseStr(pPackage->Msi.sczInstalledProductCode); | ||
329 | 328 | ||
330 | // free features | 329 | // free features |
331 | if (pPackage->Msi.rgFeatures) | 330 | if (pPackage->Msi.rgFeatures) |
@@ -404,8 +403,6 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
404 | int nCompareResult = 0; | 403 | int nCompareResult = 0; |
405 | LPWSTR sczInstalledVersion = NULL; | 404 | LPWSTR sczInstalledVersion = NULL; |
406 | LPWSTR sczInstalledLanguage = NULL; | 405 | LPWSTR sczInstalledLanguage = NULL; |
407 | LPWSTR sczInstalledProductCode = NULL; | ||
408 | LPWSTR sczInstalledProviderKey = NULL; | ||
409 | INSTALLSTATE installState = INSTALLSTATE_UNKNOWN; | 406 | INSTALLSTATE installState = INSTALLSTATE_UNKNOWN; |
410 | BOOTSTRAPPER_RELATED_OPERATION operation = BOOTSTRAPPER_RELATED_OPERATION_NONE; | 407 | BOOTSTRAPPER_RELATED_OPERATION operation = BOOTSTRAPPER_RELATED_OPERATION_NONE; |
411 | BOOTSTRAPPER_RELATED_OPERATION relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_NONE; | 408 | BOOTSTRAPPER_RELATED_OPERATION relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_NONE; |
@@ -457,42 +454,6 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
457 | } | 454 | } |
458 | else if (HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) == hr || HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) == hr) // package not present. | 455 | else if (HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) == hr || HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) == hr) // package not present. |
459 | { | 456 | { |
460 | // Check for newer, compatible packages based on a fixed provider key. | ||
461 | hr = DependencyDetectProviderKeyPackageId(pPackage, &sczInstalledProviderKey, &sczInstalledProductCode); | ||
462 | if (SUCCEEDED(hr)) | ||
463 | { | ||
464 | hr = WiuGetProductInfoEx(sczInstalledProductCode, NULL, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion); | ||
465 | if (SUCCEEDED(hr)) | ||
466 | { | ||
467 | hr = VerParseVersion(sczInstalledVersion, 0, FALSE, &pVersion); | ||
468 | ExitOnFailure(hr, "Failed to parse dependency version: '%ls' for ProductCode: %ls", sczInstalledVersion, sczInstalledProductCode); | ||
469 | |||
470 | if (pVersion->fInvalid) | ||
471 | { | ||
472 | LogId(REPORT_WARNING, MSG_DETECTED_MSI_PACKAGE_INVALID_VERSION, sczInstalledProductCode, sczInstalledVersion); | ||
473 | } | ||
474 | |||
475 | // compare versions | ||
476 | hr = VerCompareParsedVersions(pPackage->Msi.pVersion, pVersion, &nCompareResult); | ||
477 | ExitOnFailure(hr, "Failed to compare version '%ls' to dependency version: '%ls'", pPackage->Msi.pVersion->sczVersion, pVersion->sczVersion); | ||
478 | |||
479 | if (nCompareResult < 0) | ||
480 | { | ||
481 | LogId(REPORT_STANDARD, MSG_DETECTED_COMPATIBLE_PACKAGE_FROM_PROVIDER, pPackage->sczId, sczInstalledProviderKey, sczInstalledProductCode, sczInstalledVersion, pPackage->Msi.sczProductCode); | ||
482 | |||
483 | hr = UserExperienceOnDetectCompatibleMsiPackage(pUserExperience, pPackage->sczId, sczInstalledProductCode, pVersion); | ||
484 | ExitOnRootFailure(hr, "BA aborted detect compatible MSI package."); | ||
485 | |||
486 | hr = StrAllocString(&pPackage->Msi.sczInstalledProductCode, sczInstalledProductCode, 0); | ||
487 | ExitOnFailure(hr, "Failed to copy the installed ProductCode to the package."); | ||
488 | |||
489 | pPackage->Msi.pInstalledVersion = pVersion; | ||
490 | pPackage->Msi.fCompatibleInstalled = TRUE; | ||
491 | pVersion = NULL; | ||
492 | } | ||
493 | } | ||
494 | } | ||
495 | |||
496 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT; | 457 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT; |
497 | hr = S_OK; | 458 | hr = S_OK; |
498 | } | 459 | } |
@@ -701,8 +662,6 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
701 | } | 662 | } |
702 | 663 | ||
703 | LExit: | 664 | LExit: |
704 | ReleaseStr(sczInstalledProviderKey); | ||
705 | ReleaseStr(sczInstalledProductCode); | ||
706 | ReleaseStr(sczInstalledLanguage); | 665 | ReleaseStr(sczInstalledLanguage); |
707 | ReleaseStr(sczInstalledVersion); | 666 | ReleaseStr(sczInstalledVersion); |
708 | ReleaseVerutilVersion(pVersion); | 667 | ReleaseVerutilVersion(pVersion); |
@@ -1023,121 +982,6 @@ LExit: | |||
1023 | return hr; | 982 | return hr; |
1024 | } | 983 | } |
1025 | 984 | ||
1026 | extern "C" HRESULT MsiEngineAddCompatiblePackage( | ||
1027 | __in BURN_PACKAGES* pPackages, | ||
1028 | __in const BURN_PACKAGE* pPackage, | ||
1029 | __out_opt BURN_PACKAGE** ppCompatiblePackage | ||
1030 | ) | ||
1031 | { | ||
1032 | Assert(BURN_PACKAGE_TYPE_MSI == pPackage->type); | ||
1033 | |||
1034 | HRESULT hr = S_OK; | ||
1035 | BURN_PACKAGE* pCompatiblePackage = NULL; | ||
1036 | LPWSTR sczInstalledVersion = NULL; | ||
1037 | |||
1038 | // Allocate enough memory all at once so pointers to packages within | ||
1039 | // aren't invalidated if we otherwise reallocated. | ||
1040 | hr = PackageEnsureCompatiblePackagesArray(pPackages); | ||
1041 | ExitOnFailure(hr, "Failed to allocate memory for compatible MSI package."); | ||
1042 | |||
1043 | pCompatiblePackage = pPackages->rgCompatiblePackages + pPackages->cCompatiblePackages; | ||
1044 | ++pPackages->cCompatiblePackages; | ||
1045 | |||
1046 | pCompatiblePackage->type = BURN_PACKAGE_TYPE_MSI; | ||
1047 | |||
1048 | // Read in the compatible ProductCode if not already available. | ||
1049 | if (pPackage->Msi.sczInstalledProductCode) | ||
1050 | { | ||
1051 | hr = StrAllocString(&pCompatiblePackage->Msi.sczProductCode, pPackage->Msi.sczInstalledProductCode, 0); | ||
1052 | ExitOnFailure(hr, "Failed to copy installed ProductCode to compatible package."); | ||
1053 | } | ||
1054 | else | ||
1055 | { | ||
1056 | hr = DependencyDetectProviderKeyPackageId(pPackage, NULL, &pCompatiblePackage->Msi.sczProductCode); | ||
1057 | ExitOnFailure(hr, "Failed to detect compatible package from provider key."); | ||
1058 | } | ||
1059 | |||
1060 | // Read in the compatible ProductVersion if not already available. | ||
1061 | if (pPackage->Msi.pInstalledVersion) | ||
1062 | { | ||
1063 | hr = VerCopyVersion(pPackage->Msi.pInstalledVersion, &pCompatiblePackage->Msi.pVersion); | ||
1064 | ExitOnFailure(hr, "Failed to copy version for compatible package."); | ||
1065 | } | ||
1066 | else | ||
1067 | { | ||
1068 | hr = WiuGetProductInfoEx(pCompatiblePackage->Msi.sczProductCode, NULL, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion); | ||
1069 | ExitOnFailure(hr, "Failed to read version from compatible package."); | ||
1070 | |||
1071 | hr = VerParseVersion(sczInstalledVersion, 0, FALSE, &pCompatiblePackage->Msi.pVersion); | ||
1072 | ExitOnFailure(hr, "Failed to parse version: '%ls' for ProductCode: %ls", sczInstalledVersion, pCompatiblePackage->Msi.sczProductCode); | ||
1073 | |||
1074 | if (pCompatiblePackage->Msi.pVersion->fInvalid) | ||
1075 | { | ||
1076 | LogId(REPORT_WARNING, MSG_DETECTED_MSI_PACKAGE_INVALID_VERSION, pCompatiblePackage->Msi.sczProductCode, sczInstalledVersion); | ||
1077 | } | ||
1078 | } | ||
1079 | |||
1080 | // For now, copy enough information to support uninstalling the newer, compatible package. | ||
1081 | hr = StrAllocString(&pCompatiblePackage->sczId, pCompatiblePackage->Msi.sczProductCode, 0); | ||
1082 | ExitOnFailure(hr, "Failed to copy installed ProductCode as compatible package ID."); | ||
1083 | |||
1084 | pCompatiblePackage->fPerMachine = pPackage->fPerMachine; | ||
1085 | pCompatiblePackage->fUninstallable = pPackage->fUninstallable; | ||
1086 | pCompatiblePackage->cacheType = pPackage->cacheType; | ||
1087 | |||
1088 | // Removing compatible packages is best effort. | ||
1089 | pCompatiblePackage->fVital = FALSE; | ||
1090 | |||
1091 | // Format a suitable log path variable from the original package. | ||
1092 | hr = StrAllocFormatted(&pCompatiblePackage->sczLogPathVariable, L"%ls_Compatible", pPackage->sczLogPathVariable); | ||
1093 | ExitOnFailure(hr, "Failed to format log path variable for compatible package."); | ||
1094 | |||
1095 | // Use the default cache ID generation from the binder. | ||
1096 | hr = StrAllocFormatted(&pCompatiblePackage->sczCacheId, L"%lsv%ls", pCompatiblePackage->sczId, pCompatiblePackage->Msi.pVersion->sczVersion); | ||
1097 | ExitOnFailure(hr, "Failed to format cache ID for compatible package."); | ||
1098 | |||
1099 | pCompatiblePackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT; | ||
1100 | pCompatiblePackage->cache = BURN_CACHE_STATE_PARTIAL; // Cannot know if it's complete or not. | ||
1101 | |||
1102 | // Copy all the providers to ensure no dependents. | ||
1103 | if (pPackage->cDependencyProviders) | ||
1104 | { | ||
1105 | pCompatiblePackage->rgDependencyProviders = (BURN_DEPENDENCY_PROVIDER*)MemAlloc(sizeof(BURN_DEPENDENCY_PROVIDER) * pPackage->cDependencyProviders, TRUE); | ||
1106 | ExitOnNull(pCompatiblePackage->rgDependencyProviders, hr, E_OUTOFMEMORY, "Failed to allocate for compatible package providers."); | ||
1107 | |||
1108 | for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) | ||
1109 | { | ||
1110 | BURN_DEPENDENCY_PROVIDER* pProvider = pPackage->rgDependencyProviders + i; | ||
1111 | BURN_DEPENDENCY_PROVIDER* pCompatibleProvider = pCompatiblePackage->rgDependencyProviders + i; | ||
1112 | |||
1113 | // Only need to copy the key for uninstall. | ||
1114 | hr = StrAllocString(&pCompatibleProvider->sczKey, pProvider->sczKey, 0); | ||
1115 | ExitOnFailure(hr, "Failed to copy the compatible provider key."); | ||
1116 | |||
1117 | // Assume the package version is the same as the provider version. | ||
1118 | hr = StrAllocString(&pCompatibleProvider->sczVersion, pCompatiblePackage->Msi.pVersion->sczVersion, 0); | ||
1119 | ExitOnFailure(hr, "Failed to copy the compatible provider version."); | ||
1120 | |||
1121 | // Assume provider keys are similarly authored for this package. | ||
1122 | pCompatibleProvider->fImported = pProvider->fImported; | ||
1123 | } | ||
1124 | |||
1125 | pCompatiblePackage->cDependencyProviders = pPackage->cDependencyProviders; | ||
1126 | } | ||
1127 | |||
1128 | pCompatiblePackage->type = BURN_PACKAGE_TYPE_MSI; | ||
1129 | |||
1130 | if (ppCompatiblePackage) | ||
1131 | { | ||
1132 | *ppCompatiblePackage = pCompatiblePackage; | ||
1133 | } | ||
1134 | |||
1135 | LExit: | ||
1136 | ReleaseStr(sczInstalledVersion); | ||
1137 | |||
1138 | return hr; | ||
1139 | } | ||
1140 | |||
1141 | extern "C" HRESULT MsiEngineBeginTransaction( | 985 | extern "C" HRESULT MsiEngineBeginTransaction( |
1142 | __in LPCWSTR wzName | 986 | __in LPCWSTR wzName |
1143 | ) | 987 | ) |