@joebigelow / wix / commits / 339fc1d2

Remove support for uninstalling MSU package.

Fixes 6749

Sean Hall committed Jul 21, 2022 at 16:29 UTC 339fc1d2148e6b7fe8cd664e81ee65e51405aa23
5 files changed +12 -99
src/burn/engine/msuengine.cpp
+6 -91
@@ -31,24 +31,12 @@ extern "C" HRESULT MsuEngineParsePackageFromXml(
31 {
32 HRESULT hr = S_OK;
33
34 - // @KB
35 - hr = XmlGetAttributeEx(pixnMsuPackage, L"KB", &pPackage->Msu.sczKB);
36 - ExitOnFailure(hr, "Failed to get @KB.");
37 -
34 // @DetectCondition
35 hr = XmlGetAttributeEx(pixnMsuPackage, L"DetectCondition", &pPackage->Msu.sczDetectCondition);
40 - ExitOnFailure(hr, "Failed to get @DetectCondition.");
36 + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @DetectCondition.");
37
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 - }
38 + // Uninstalling MSU packages isn't supported because newer OS's don't allow silent uninstallation.
39 + pPackage->fPermanent = TRUE;
40
41 LExit:
42 return hr;
@@ -58,7 +46,6 @@ extern "C" void MsuEnginePackageUninitialize(
46 __in BURN_PACKAGE* pPackage
47 )
48 {
61 - ReleaseNullStr(pPackage->Msu.sczKB);
49 ReleaseNullStr(pPackage->Msu.sczDetectCondition);
50 }
51
@@ -108,30 +95,7 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage(
95 switch (pPackage->currentState)
96 {
97 case BOOTSTRAPPER_PACKAGE_STATE_PRESENT:
111 - switch (pPackage->requested)
112 - {
113 - case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough;
114 - case BOOTSTRAPPER_REQUEST_STATE_REPAIR:
115 - execute = BOOTSTRAPPER_ACTION_STATE_NONE;
116 - break;
117 -
118 - case BOOTSTRAPPER_REQUEST_STATE_ABSENT: __fallthrough;
119 - case BOOTSTRAPPER_REQUEST_STATE_CACHE:
120 - execute = !pPackage->fPermanent ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE;
121 - break;
122 -
123 - case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT:
124 - execute = pPackage->Msu.fUninstallable ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE;
125 - break;
126 -
127 - case BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT:
128 - execute = BOOTSTRAPPER_ACTION_STATE_INSTALL;
129 - break;
130 -
131 - default:
132 - execute = BOOTSTRAPPER_ACTION_STATE_NONE;
133 - break;
134 - }
98 + execute = BOOTSTRAPPER_ACTION_STATE_NONE;
99 break;
100
101 case BOOTSTRAPPER_PACKAGE_STATE_ABSENT:
@@ -143,10 +107,6 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage(
107 execute = BOOTSTRAPPER_ACTION_STATE_INSTALL;
108 break;
109
146 - case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT:
147 - execute = pPackage->Msu.fUninstallable ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE;
148 - break;
149 -
110 default:
111 execute = BOOTSTRAPPER_ACTION_STATE_NONE;
112 break;
@@ -161,41 +121,7 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage(
121 // Calculate the rollback action if there is an execute action.
122 if (BOOTSTRAPPER_ACTION_STATE_NONE != execute)
123 {
164 - switch (pPackage->currentState)
165 - {
166 - case BOOTSTRAPPER_PACKAGE_STATE_PRESENT:
167 - switch (pPackage->requested)
168 - {
169 - case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: __fallthrough;
170 - case BOOTSTRAPPER_REQUEST_STATE_ABSENT:
171 - rollback = BOOTSTRAPPER_ACTION_STATE_INSTALL;
172 - break;
173 -
174 - default:
175 - rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
176 - break;
177 - }
178 - break;
179 -
180 - case BOOTSTRAPPER_PACKAGE_STATE_ABSENT:
181 - switch (pPackage->requested)
182 - {
183 - case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough;
184 - case BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT: __fallthrough;
185 - case BOOTSTRAPPER_REQUEST_STATE_REPAIR:
186 - rollback = !pPackage->fPermanent ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE;
187 - break;
188 -
189 - default:
190 - rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
191 - break;
192 - }
193 - break;
194 -
195 - default:
196 - hr = E_INVALIDARG;
197 - ExitOnRootFailure(hr, "Invalid package expected state.");
198 - }
124 + rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
125 }
126
127 // return values
@@ -272,7 +198,6 @@ extern "C" HRESULT MsuEngineExecutePackage(
198 LPWSTR sczSystemPath = NULL;
199 LPWSTR sczWusaPath = NULL;
200 LPWSTR sczCommand = NULL;
275 - LPWSTR sczEscapedKB = NULL;
201 SC_HANDLE schWu = NULL;
202 BOOL fWuWasDisabled = FALSE;
203 STARTUPINFOW si = { };
@@ -324,15 +249,6 @@ extern "C" HRESULT MsuEngineExecutePackage(
249 ExitOnFailure(hr, "Failed to format MSU install command.");
250 break;
251
327 - case BOOTSTRAPPER_ACTION_STATE_UNINSTALL:
328 - hr = AppEscapeCommandLineArgumentFormatted(&sczEscapedKB, L"%ls", pPackage->Msu.sczKB);
329 - ExitOnFailure(hr, "Failed to escape MSU KB.");
330 -
331 - // format command
332 - hr = StrAllocFormatted(&sczCommand, L"\"%ls\" /uninstall /kb:%ls /quiet /norestart", sczWusaPath, sczEscapedKB);
333 - ExitOnFailure(hr, "Failed to format MSU uninstall command.");
334 - break;
335 -
252 default:
253 hr = E_UNEXPECTED;
254 ExitOnFailure(hr, "Failed to get action arguments for MSU package.");
@@ -347,7 +263,7 @@ extern "C" HRESULT MsuEngineExecutePackage(
263 ExitOnFailure(hr, "Failed to append log path to MSU command-line.");
264 }
265
350 - LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msuPackage.action), sczMsuPath ? sczMsuPath : pPackage->Msu.sczKB, sczCommand);
266 + LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msuPackage.action), sczMsuPath, sczCommand);
267
268 hr = EnsureWUServiceEnabled(fStopWusaService, &schWu, &fWuWasDisabled);
269 ExitOnFailure(hr, "Failed to ensure WU service was enabled to install MSU package.");
@@ -388,7 +304,6 @@ LExit:
304 ReleaseStr(sczSystemPath);
305 ReleaseStr(sczWusaPath);
306 ReleaseStr(sczCommand);
391 - ReleaseStr(sczEscapedKB);
307
308 ReleaseHandle(pi.hProcess);
309 ReleaseHandle(pi.hThread);
src/burn/engine/package.cpp
+1 -1
@@ -255,7 +255,7 @@ extern "C" HRESULT PackagesParseFromXml(
255 fUninstallable = pPackage->Exe.fUninstallable;
256 break;
257 case BURN_PACKAGE_TYPE_MSU:
258 - fUninstallable = pPackage->Msu.fUninstallable;
258 + fUninstallable = FALSE;
259 break;
260 }
261
src/burn/engine/package.h
-2
@@ -421,8 +421,6 @@ typedef struct _BURN_PACKAGE
421 struct
422 {
423 LPWSTR sczDetectCondition;
424 - LPWSTR sczKB;
425 - BOOL fUninstallable;
424 } Msu;
425 };
426 } BURN_PACKAGE;
src/burn/test/BurnUnitTest/PlanTest.cpp
+4 -4
@@ -2249,6 +2249,7 @@ namespace Bootstrapper
2249 void SingleMsuInstallTest()
2250 {
2251 HRESULT hr = S_OK;
2252 + LONGLONG llPlannedAction = 0;
2253 BURN_ENGINE_STATE engineState = { };
2254 BURN_ENGINE_STATE* pEngineState = &engineState;
2255 BURN_PLAN* pPlan = &engineState.plan;
@@ -2260,7 +2261,10 @@ namespace Bootstrapper
2261 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL);
2262 NativeAssert::Succeeded(hr, "CorePlan failed");
2263
2264 + llPlannedAction = VariableGetNumericHelper(&engineState.variables, BURN_BUNDLE_ACTION);
2265 +
2266 Assert::Equal<DWORD>(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action);
2267 + Assert::Equal<LONGLONG>(BOOTSTRAPPER_ACTION_INSTALL, llPlannedAction);
2268 NativeAssert::StringEqual(L"{06077C60-DC46-4F4A-8D3C-05F869187191}", pPlan->wzBundleId);
2269 NativeAssert::StringEqual(L"{06077C60-DC46-4F4A-8D3C-05F869187191}", pPlan->wzBundleProviderKey);
2270 Assert::Equal<BOOL>(FALSE, pPlan->fEnabledForwardCompatibleBundle);
@@ -2302,7 +2306,6 @@ namespace Bootstrapper
2306 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
2307 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2308 ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"test.msu");
2305 - ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2309 ValidateExecuteMsuPackage(pPlan, fRollback, dwIndex++, L"test.msu", BOOTSTRAPPER_ACTION_STATE_INSTALL);
2310 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2311 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
@@ -2315,8 +2318,6 @@ namespace Bootstrapper
2318 ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE);
2319 ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"test.msu");
2320 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2318 - ValidateExecuteMsuPackage(pPlan, fRollback, dwIndex++, L"test.msu", BOOTSTRAPPER_ACTION_STATE_UNINSTALL);
2319 - ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2321 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2322 ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
2323 ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++);
@@ -2336,7 +2337,6 @@ namespace Bootstrapper
2337 Assert::Equal(uIndex, pPlan->cPlannedProviders);
2338
2339 Assert::Equal(1ul, pEngineState->packages.cPackages);
2339 - ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"test.msu", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BURN_PACKAGE_REGISTRATION_STATE_PRESENT);
2340 }
2341
2342 [Fact]
src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml
+1 -1
@@ -1 +1 @@
1 -<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="BurnBundle" Extension="log" /><RelatedBundle Id="{B94478B1-E1F3-4700-9CE8-6AA090854AEC}" Action="Upgrade" /><Variable Id="WixBundleInProgressName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><UX><Payload Id="payaQenPi7_8hq6T._EXtBW0NvR7gA" FilePath="fakeba.dll" SourcePath="u0" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u1" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" SourcePath="u2" /></UX><Container Id="WixAttachedContainer" FileSize="119" Hash="06D28293FD57CD231E125EF9C82418A488928A98832A6937A77A3283A17A5C37F8D619C51759319A57E8F8A948FA73E8C5814185A0114130F3213AB268073555" FilePath="test.exe" AttachedIndex="1" Attached="yes" Primary="yes" /><Payload Id="test.msu" FilePath="test.msu" FileSize="28" Hash="B040F02D2F90E04E9AFBDC91C00CEB5DF97D48E205D96DC0A44E10AF8870794DAE62CA70224F12BE9112AA730BBE470CA81FB5617AAC690E832F3F84510E92BA" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{06077C60-DC46-4F4A-8D3C-05F869187191}" ExecutableName="test.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{06077C60-DC46-4F4A-8D3C-05F869187191}"><Arp Register="yes" DisplayName="BurnBundle" DisplayVersion="1.0.0.0" Publisher="Example Corporation" /></Registration><Chain><MsuPackage Id="test.msu" Cache="keep" CacheId="B040F02D2F90E04E9AFBDC91C00CEB5DF97D48E205D96DC0A44E10AF8870794DAE62CA70224F12BE9112AA730BBE470CA81FB5617AAC690E832F3F84510E92BA" InstallSize="28" Size="28" PerMachine="yes" Permanent="no" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" DetectCondition="DetectedTheMsu" KB="xyz"><PayloadRef Id="test.msu" /></MsuPackage></Chain><CommandLine Variables="upperCase" /></BurnManifest>
\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?><BurnManifest xmlns="http://wixtoolset.org/schemas/v4/2008/Burn"><Log PathVariable="WixBundleLog" Prefix="BurnBundle" Extension="log" /><RelatedBundle Id="{B94478B1-E1F3-4700-9CE8-6AA090854AEC}" Action="Upgrade" /><Variable Id="WixBundleInProgressName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleName" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSource" Hidden="no" Persisted="yes" /><Variable Id="WixBundleOriginalSourceFolder" Hidden="no" Persisted="yes" /><Variable Id="WixBundleLastUsedSource" Hidden="no" Persisted="yes" /><UX><Payload Id="payaQenPi7_8hq6T._EXtBW0NvR7gA" FilePath="fakeba.dll" SourcePath="u0" /><Payload Id="uxTxMXPVMXwQrPTMIGa5WGt93w0Ns" FilePath="BootstrapperApplicationData.xml" SourcePath="u1" /><Payload Id="uxYRbgitOs0K878jn5L_z7LdJ21KI" FilePath="BundleExtensionData.xml" SourcePath="u2" /></UX><Container Id="WixAttachedContainer" FileSize="119" Hash="06D28293FD57CD231E125EF9C82418A488928A98832A6937A77A3283A17A5C37F8D619C51759319A57E8F8A948FA73E8C5814185A0114130F3213AB268073555" FilePath="test.exe" AttachedIndex="1" Attached="yes" Primary="yes" /><Payload Id="test.msu" FilePath="test.msu" FileSize="28" Hash="B040F02D2F90E04E9AFBDC91C00CEB5DF97D48E205D96DC0A44E10AF8870794DAE62CA70224F12BE9112AA730BBE470CA81FB5617AAC690E832F3F84510E92BA" Packaging="embedded" SourcePath="a0" Container="WixAttachedContainer" /><RollbackBoundary Id="WixDefaultBoundary" Vital="yes" Transaction="no" /><Registration Id="{06077C60-DC46-4F4A-8D3C-05F869187191}" ExecutableName="test.exe" PerMachine="yes" Tag="" Version="1.0.0.0" ProviderKey="{06077C60-DC46-4F4A-8D3C-05F869187191}"><Arp Register="yes" DisplayName="BurnBundle" DisplayVersion="1.0.0.0" Publisher="Example Corporation" /></Registration><Chain><MsuPackage Id="test.msu" Cache="keep" CacheId="B040F02D2F90E04E9AFBDC91C00CEB5DF97D48E205D96DC0A44E10AF8870794DAE62CA70224F12BE9112AA730BBE470CA81FB5617AAC690E832F3F84510E92BA" InstallSize="28" Size="28" PerMachine="yes" Permanent="yes" Vital="yes" RollbackBoundaryForward="WixDefaultBoundary" RollbackBoundaryBackward="WixDefaultBoundary" DetectCondition="DetectedTheMsu"><PayloadRef Id="test.msu" /></MsuPackage></Chain><CommandLine Variables="upperCase" /></BurnManifest>