diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-01-16 14:08:45 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-01-16 22:59:50 -0600 |
| commit | eee408f4f52823038ca6da83693efd135c8511c8 (patch) | |
| tree | 701088537801578a40c527eeec1e758714b05310 /src/burn/engine/msuengine.cpp | |
| parent | f5d880cc70ad7350b0da1ea825141f95cbdb4c7b (diff) | |
| download | wix-eee408f4f52823038ca6da83693efd135c8511c8.tar.gz wix-eee408f4f52823038ca6da83693efd135c8511c8.tar.bz2 wix-eee408f4f52823038ca6da83693efd135c8511c8.zip | |
Make Burn require a non-empty KB for MsuPackages to be uninstallable.
Diffstat (limited to 'src/burn/engine/msuengine.cpp')
| -rw-r--r-- | src/burn/engine/msuengine.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/burn/engine/msuengine.cpp b/src/burn/engine/msuengine.cpp index 4db425be..44386a6d 100644 --- a/src/burn/engine/msuengine.cpp +++ b/src/burn/engine/msuengine.cpp | |||
| @@ -39,6 +39,17 @@ extern "C" HRESULT MsuEngineParsePackageFromXml( | |||
| 39 | hr = XmlGetAttributeEx(pixnMsuPackage, L"DetectCondition", &pPackage->Msu.sczDetectCondition); | 39 | hr = XmlGetAttributeEx(pixnMsuPackage, L"DetectCondition", &pPackage->Msu.sczDetectCondition); |
| 40 | ExitOnFailure(hr, "Failed to get @DetectCondition."); | 40 | ExitOnFailure(hr, "Failed to get @DetectCondition."); |
| 41 | 41 | ||
| 42 | // We can only uninstall MSU packages if they have a KB and we are on Win7 or newer. | ||
| 43 | if (pPackage->Msu.sczKB && *pPackage->Msu.sczKB && ::IsWindows7OrGreater()) | ||
| 44 | { | ||
| 45 | pPackage->Msu.fUninstallable = TRUE; | ||
| 46 | } | ||
| 47 | else | ||
| 48 | { | ||
| 49 | pPackage->fPermanent = TRUE; | ||
| 50 | pPackage->Msu.fUninstallable = FALSE; | ||
| 51 | } | ||
| 52 | |||
| 42 | LExit: | 53 | LExit: |
| 43 | return hr; | 54 | return hr; |
| 44 | } | 55 | } |
| @@ -92,10 +103,6 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage( | |||
| 92 | HRESULT hr = S_OK; | 103 | HRESULT hr = S_OK; |
| 93 | BOOTSTRAPPER_ACTION_STATE execute = BOOTSTRAPPER_ACTION_STATE_NONE; | 104 | BOOTSTRAPPER_ACTION_STATE execute = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 94 | BOOTSTRAPPER_ACTION_STATE rollback = BOOTSTRAPPER_ACTION_STATE_NONE; | 105 | BOOTSTRAPPER_ACTION_STATE rollback = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 95 | BOOL fAllowUninstall = FALSE; | ||
| 96 | |||
| 97 | // We can only uninstall MSU packages if they have a KB and we are on Win7 or newer. | ||
| 98 | fAllowUninstall = pPackage->Msu.sczKB && *pPackage->Msu.sczKB && ::IsWindows7OrGreater(); | ||
| 99 | 106 | ||
| 100 | // execute action | 107 | // execute action |
| 101 | switch (pPackage->currentState) | 108 | switch (pPackage->currentState) |
| @@ -110,11 +117,11 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage( | |||
| 110 | 117 | ||
| 111 | case BOOTSTRAPPER_REQUEST_STATE_ABSENT: __fallthrough; | 118 | case BOOTSTRAPPER_REQUEST_STATE_ABSENT: __fallthrough; |
| 112 | case BOOTSTRAPPER_REQUEST_STATE_CACHE: | 119 | case BOOTSTRAPPER_REQUEST_STATE_CACHE: |
| 113 | execute = fAllowUninstall && !pPackage->fPermanent ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; | 120 | execute = !pPackage->fPermanent ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; |
| 114 | break; | 121 | break; |
| 115 | 122 | ||
| 116 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: | 123 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: |
| 117 | execute = fAllowUninstall ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; | 124 | execute = pPackage->Msu.fUninstallable ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; |
| 118 | break; | 125 | break; |
| 119 | 126 | ||
| 120 | default: | 127 | default: |
| @@ -166,7 +173,7 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage( | |||
| 166 | { | 173 | { |
| 167 | case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; | 174 | case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; |
| 168 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: | 175 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: |
| 169 | rollback = fAllowUninstall ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; | 176 | rollback = !pPackage->fPermanent ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; |
| 170 | break; | 177 | break; |
| 171 | 178 | ||
| 172 | default: | 179 | default: |
