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 | |
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.
-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; |