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 | |
| 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')
| -rw-r--r-- | src/burn/engine/msuengine.cpp | 21 | ||||
| -rw-r--r-- | src/burn/engine/package.cpp | 6 | ||||
| -rw-r--r-- | src/burn/engine/package.h | 1 |
3 files changed, 20 insertions, 8 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: |
diff --git a/src/burn/engine/package.cpp b/src/burn/engine/package.cpp index 72da817f..8a80194e 100644 --- a/src/burn/engine/package.cpp +++ b/src/burn/engine/package.cpp | |||
| @@ -161,7 +161,6 @@ extern "C" HRESULT PackagesParseFromXml( | |||
| 161 | // @Permanent | 161 | // @Permanent |
| 162 | hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fPermanent); | 162 | hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fPermanent); |
| 163 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Permanent."); | 163 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Permanent."); |
| 164 | pPackage->fCanAffectRegistration = !pPackage->fPermanent; | ||
| 165 | 164 | ||
| 166 | // @Vital | 165 | // @Vital |
| 167 | hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pPackage->fVital); | 166 | hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pPackage->fVital); |
| @@ -244,6 +243,9 @@ extern "C" HRESULT PackagesParseFromXml( | |||
| 244 | case BURN_PACKAGE_TYPE_EXE: | 243 | case BURN_PACKAGE_TYPE_EXE: |
| 245 | fUninstallable = pPackage->Exe.fUninstallable; | 244 | fUninstallable = pPackage->Exe.fUninstallable; |
| 246 | break; | 245 | break; |
| 246 | case BURN_PACKAGE_TYPE_MSU: | ||
| 247 | fUninstallable = pPackage->Msu.fUninstallable; | ||
| 248 | break; | ||
| 247 | } | 249 | } |
| 248 | 250 | ||
| 249 | if (!fUninstallable) | 251 | if (!fUninstallable) |
| @@ -252,6 +254,8 @@ extern "C" HRESULT PackagesParseFromXml( | |||
| 252 | } | 254 | } |
| 253 | } | 255 | } |
| 254 | 256 | ||
| 257 | pPackage->fCanAffectRegistration = !pPackage->fPermanent; | ||
| 258 | |||
| 255 | // parse payload references | 259 | // parse payload references |
| 256 | hr = ParsePayloadRefsFromXml(pPackage, pPayloads, pixnNode); | 260 | hr = ParsePayloadRefsFromXml(pPackage, pPayloads, pixnNode); |
| 257 | ExitOnFailure(hr, "Failed to parse payload references."); | 261 | ExitOnFailure(hr, "Failed to parse payload references."); |
diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h index 91bad1bc..bbd74ac9 100644 --- a/src/burn/engine/package.h +++ b/src/burn/engine/package.h | |||
| @@ -371,6 +371,7 @@ typedef struct _BURN_PACKAGE | |||
| 371 | { | 371 | { |
| 372 | LPWSTR sczDetectCondition; | 372 | LPWSTR sczDetectCondition; |
| 373 | LPWSTR sczKB; | 373 | LPWSTR sczKB; |
| 374 | BOOL fUninstallable; | ||
| 374 | } Msu; | 375 | } Msu; |
| 375 | }; | 376 | }; |
| 376 | } BURN_PACKAGE; | 377 | } BURN_PACKAGE; |
