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;