aboutsummaryrefslogtreecommitdiff
path: root/src/engine/msiengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/msiengine.cpp')
-rw-r--r--src/engine/msiengine.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp
index 4f6062ea..269fc831 100644
--- a/src/engine/msiengine.cpp
+++ b/src/engine/msiengine.cpp
@@ -789,7 +789,7 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
789 { 789 {
790 case BOOTSTRAPPER_PACKAGE_STATE_PRESENT: __fallthrough; 790 case BOOTSTRAPPER_PACKAGE_STATE_PRESENT: __fallthrough;
791 case BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED: 791 case BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED:
792 if (BOOTSTRAPPER_REQUEST_STATE_PRESENT == pPackage->requested || BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested) 792 if (BOOTSTRAPPER_REQUEST_STATE_PRESENT == pPackage->requested || BOOTSTRAPPER_REQUEST_STATE_MEND == pPackage->requested || BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested)
793 { 793 {
794 hr = VerCompareParsedVersions(pVersion, pInstalledVersion, &nCompareResult); 794 hr = VerCompareParsedVersions(pVersion, pInstalledVersion, &nCompareResult);
795 ExitOnFailure(hr, "Failed to compare '%ls' to '%ls' for planning.", pVersion->sczVersion, pInstalledVersion->sczVersion); 795 ExitOnFailure(hr, "Failed to compare '%ls' to '%ls' for planning.", pVersion->sczVersion, pInstalledVersion->sczVersion);
@@ -801,6 +801,10 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
801 { 801 {
802 execute = BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE; 802 execute = BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE;
803 } 803 }
804 else if (BOOTSTRAPPER_REQUEST_STATE_MEND == pPackage->requested)
805 {
806 execute = BOOTSTRAPPER_ACTION_STATE_MEND;
807 }
804 else if (BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested) 808 else if (BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested)
805 { 809 {
806 execute = BOOTSTRAPPER_ACTION_STATE_REPAIR; 810 execute = BOOTSTRAPPER_ACTION_STATE_REPAIR;
@@ -829,6 +833,7 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
829 switch (pPackage->requested) 833 switch (pPackage->requested)
830 { 834 {
831 case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; 835 case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough;
836 case BOOTSTRAPPER_REQUEST_STATE_MEND: __fallthrough;
832 case BOOTSTRAPPER_REQUEST_STATE_REPAIR: 837 case BOOTSTRAPPER_REQUEST_STATE_REPAIR:
833 execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; 838 execute = BOOTSTRAPPER_ACTION_STATE_INSTALL;
834 break; 839 break;
@@ -844,6 +849,7 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
844 switch (pPackage->requested) 849 switch (pPackage->requested)
845 { 850 {
846 case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; 851 case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough;
852 case BOOTSTRAPPER_REQUEST_STATE_MEND: __fallthrough;
847 case BOOTSTRAPPER_REQUEST_STATE_REPAIR: 853 case BOOTSTRAPPER_REQUEST_STATE_REPAIR:
848 execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; 854 execute = BOOTSTRAPPER_ACTION_STATE_INSTALL;
849 break; 855 break;
@@ -887,10 +893,12 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
887 case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough; 893 case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough;
888 case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: __fallthrough; 894 case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: __fallthrough;
889 case BOOTSTRAPPER_PACKAGE_STATE_CACHED: 895 case BOOTSTRAPPER_PACKAGE_STATE_CACHED:
890 // If we requested to put the package on the machine then remove the package during rollback 896 // If the package is uninstallable and we requested to put the package on the machine then
891 // if the package is uninstallable. 897 // remove the package during rollback.
892 if ((BOOTSTRAPPER_REQUEST_STATE_PRESENT == pPackage->requested || BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested) && 898 if (pPackage->fUninstallable &&
893 pPackage->fUninstallable) 899 (BOOTSTRAPPER_REQUEST_STATE_PRESENT == pPackage->requested ||
900 BOOTSTRAPPER_REQUEST_STATE_MEND == pPackage->requested ||
901 BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested))
894 { 902 {
895 rollback = BOOTSTRAPPER_ACTION_STATE_UNINSTALL; 903 rollback = BOOTSTRAPPER_ACTION_STATE_UNINSTALL;
896 } 904 }
@@ -1228,11 +1236,12 @@ extern "C" HRESULT MsiEngineExecutePackage(
1228 break; 1236 break;
1229 1237
1230 case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough; 1238 case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough;
1239 case BOOTSTRAPPER_ACTION_STATE_MEND: __fallthrough;
1231 case BOOTSTRAPPER_ACTION_STATE_REPAIR: 1240 case BOOTSTRAPPER_ACTION_STATE_REPAIR:
1232 { 1241 {
1233 LPCWSTR wzReinstallAll = (BOOTSTRAPPER_ACTION_STATE_MODIFY == pExecuteAction->msiPackage.action || 1242 LPCWSTR wzReinstallAll = (BOOTSTRAPPER_ACTION_STATE_MODIFY == pExecuteAction->msiPackage.action ||
1234 pExecuteAction->msiPackage.pPackage->Msi.cFeatures) ? L"" : L" REINSTALL=ALL"; 1243 pExecuteAction->msiPackage.pPackage->Msi.cFeatures) ? L"" : L" REINSTALL=ALL";
1235 LPCWSTR wzReinstallMode = (BOOTSTRAPPER_ACTION_STATE_MODIFY == pExecuteAction->msiPackage.action) ? L"o" : L"e"; 1244 LPCWSTR wzReinstallMode = (BOOTSTRAPPER_ACTION_STATE_MODIFY == pExecuteAction->msiPackage.action || BOOTSTRAPPER_ACTION_STATE_MEND == pExecuteAction->msiPackage.action) ? L"o" : L"e";
1236 1245
1237 hr = StrAllocFormattedSecure(&sczProperties, L"%ls%ls REINSTALLMODE=\"cmus%ls\" REBOOT=ReallySuppress", sczProperties ? sczProperties : L"", wzReinstallAll, wzReinstallMode); 1246 hr = StrAllocFormattedSecure(&sczProperties, L"%ls%ls REINSTALLMODE=\"cmus%ls\" REBOOT=ReallySuppress", sczProperties ? sczProperties : L"", wzReinstallAll, wzReinstallMode);
1238 ExitOnFailure(hr, "Failed to add reinstall mode and reboot suppression properties on repair."); 1247 ExitOnFailure(hr, "Failed to add reinstall mode and reboot suppression properties on repair.");