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>