aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-01-16 14:08:45 -0600
committerSean Hall <r.sean.hall@gmail.com>2022-01-16 22:59:50 -0600
commiteee408f4f52823038ca6da83693efd135c8511c8 (patch)
tree701088537801578a40c527eeec1e758714b05310
parentf5d880cc70ad7350b0da1ea825141f95cbdb4c7b (diff)
downloadwix-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.cpp21
-rw-r--r--src/burn/engine/package.cpp6
-rw-r--r--src/burn/engine/package.h1
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
42LExit: 53LExit:
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;