diff options
Diffstat (limited to 'src/engine/msiengine.cpp')
-rw-r--r-- | src/engine/msiengine.cpp | 21 |
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."); |