@joebigelow / wix / commits / eee408f4

Make Burn require a non-empty KB for MsuPackages to be uninstallable.

Sean Hall committed Jan 16, 2022 at 14:08 UTC eee408f4f52823038ca6da83693efd135c8511c8
3 files changed +20 -8
src/burn/engine/msuengine.cpp
+14 -7
@@ -39,6 +39,17 @@ extern "C" HRESULT MsuEngineParsePackageFromXml(
39 hr = XmlGetAttributeEx(pixnMsuPackage, L"DetectCondition", &pPackage->Msu.sczDetectCondition);
40 ExitOnFailure(hr, "Failed to get @DetectCondition.");
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 +
53 LExit:
54 return hr;
55 }
@@ -92,10 +103,6 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage(
103 HRESULT hr = S_OK;
104 BOOTSTRAPPER_ACTION_STATE execute = 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();
106
107 // execute action
108 switch (pPackage->currentState)
@@ -110,11 +117,11 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage(
117
118 case BOOTSTRAPPER_REQUEST_STATE_ABSENT: __fallthrough;
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;
121 break;
122
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;
125 break;
126
127 default:
@@ -166,7 +173,7 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage(
173 {
174 case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough;
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;
177 break;
178
179 default:
src/burn/engine/package.cpp
+5 -1
@@ -161,7 +161,6 @@ extern "C" HRESULT PackagesParseFromXml(
161 // @Permanent
162 hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fPermanent);
163 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Permanent.");
164 - pPackage->fCanAffectRegistration = !pPackage->fPermanent;
164
165 // @Vital
166 hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pPackage->fVital);
@@ -244,6 +243,9 @@ extern "C" HRESULT PackagesParseFromXml(
243 case BURN_PACKAGE_TYPE_EXE:
244 fUninstallable = pPackage->Exe.fUninstallable;
245 break;
246 + case BURN_PACKAGE_TYPE_MSU:
247 + fUninstallable = pPackage->Msu.fUninstallable;
248 + break;
249 }
250
251 if (!fUninstallable)
@@ -252,6 +254,8 @@ extern "C" HRESULT PackagesParseFromXml(
254 }
255 }
256
257 + pPackage->fCanAffectRegistration = !pPackage->fPermanent;
258 +
259 // parse payload references
260 hr = ParsePayloadRefsFromXml(pPackage, pPayloads, pixnNode);
261 ExitOnFailure(hr, "Failed to parse payload references.");
src/burn/engine/package.h
+1
@@ -371,6 +371,7 @@ typedef struct _BURN_PACKAGE
371 {
372 LPWSTR sczDetectCondition;
373 LPWSTR sczKB;
374 + BOOL fUninstallable;
375 } Msu;
376 };
377 } BURN_PACKAGE;