aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/msuengine.cpp
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 /src/burn/engine/msuengine.cpp
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.
Diffstat (limited to 'src/burn/engine/msuengine.cpp')
-rw-r--r--src/burn/engine/msuengine.cpp21
1 files changed, 14 insertions, 7 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: