From 339fc1d2148e6b7fe8cd664e81ee65e51405aa23 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Thu, 21 Jul 2022 16:29:56 -0500 Subject: Remove support for uninstalling MSU package. Fixes 6749 --- src/burn/engine/msuengine.cpp | 97 ++-------------------- src/burn/engine/package.cpp | 2 +- src/burn/engine/package.h | 2 - src/burn/test/BurnUnitTest/PlanTest.cpp | 8 +- .../PlanTest/MsuPackageFixture_manifest.xml | 2 +- 5 files changed, 12 insertions(+), 99 deletions(-) diff --git a/src/burn/engine/msuengine.cpp b/src/burn/engine/msuengine.cpp index 400fdc92..43f5f76c 100644 --- a/src/burn/engine/msuengine.cpp +++ b/src/burn/engine/msuengine.cpp @@ -31,24 +31,12 @@ extern "C" HRESULT MsuEngineParsePackageFromXml( { HRESULT hr = S_OK; - // @KB - hr = XmlGetAttributeEx(pixnMsuPackage, L"KB", &pPackage->Msu.sczKB); - ExitOnFailure(hr, "Failed to get @KB."); - // @DetectCondition hr = XmlGetAttributeEx(pixnMsuPackage, L"DetectCondition", &pPackage->Msu.sczDetectCondition); - ExitOnFailure(hr, "Failed to get @DetectCondition."); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @DetectCondition."); - // We can only uninstall MSU packages if they have a KB and we are on Win7 or newer. - if (pPackage->Msu.sczKB && *pPackage->Msu.sczKB && ::IsWindows7OrGreater()) - { - pPackage->Msu.fUninstallable = TRUE; - } - else - { - pPackage->fPermanent = TRUE; - pPackage->Msu.fUninstallable = FALSE; - } + // Uninstalling MSU packages isn't supported because newer OS's don't allow silent uninstallation. + pPackage->fPermanent = TRUE; LExit: return hr; @@ -58,7 +46,6 @@ extern "C" void MsuEnginePackageUninitialize( __in BURN_PACKAGE* pPackage ) { - ReleaseNullStr(pPackage->Msu.sczKB); ReleaseNullStr(pPackage->Msu.sczDetectCondition); } @@ -108,30 +95,7 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage( switch (pPackage->currentState) { case BOOTSTRAPPER_PACKAGE_STATE_PRESENT: - switch (pPackage->requested) - { - case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; - case BOOTSTRAPPER_REQUEST_STATE_REPAIR: - execute = BOOTSTRAPPER_ACTION_STATE_NONE; - break; - - case BOOTSTRAPPER_REQUEST_STATE_ABSENT: __fallthrough; - case BOOTSTRAPPER_REQUEST_STATE_CACHE: - execute = !pPackage->fPermanent ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; - break; - - case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: - execute = pPackage->Msu.fUninstallable ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; - break; - - case BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT: - execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; - break; - - default: - execute = BOOTSTRAPPER_ACTION_STATE_NONE; - break; - } + execute = BOOTSTRAPPER_ACTION_STATE_NONE; break; case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: @@ -143,10 +107,6 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage( execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; break; - case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: - execute = pPackage->Msu.fUninstallable ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; - break; - default: execute = BOOTSTRAPPER_ACTION_STATE_NONE; break; @@ -161,41 +121,7 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage( // Calculate the rollback action if there is an execute action. if (BOOTSTRAPPER_ACTION_STATE_NONE != execute) { - switch (pPackage->currentState) - { - case BOOTSTRAPPER_PACKAGE_STATE_PRESENT: - switch (pPackage->requested) - { - case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: __fallthrough; - case BOOTSTRAPPER_REQUEST_STATE_ABSENT: - rollback = BOOTSTRAPPER_ACTION_STATE_INSTALL; - break; - - default: - rollback = BOOTSTRAPPER_ACTION_STATE_NONE; - break; - } - break; - - case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: - switch (pPackage->requested) - { - case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; - case BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT: __fallthrough; - case BOOTSTRAPPER_REQUEST_STATE_REPAIR: - rollback = !pPackage->fPermanent ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; - break; - - default: - rollback = BOOTSTRAPPER_ACTION_STATE_NONE; - break; - } - break; - - default: - hr = E_INVALIDARG; - ExitOnRootFailure(hr, "Invalid package expected state."); - } + rollback = BOOTSTRAPPER_ACTION_STATE_NONE; } // return values @@ -272,7 +198,6 @@ extern "C" HRESULT MsuEngineExecutePackage( LPWSTR sczSystemPath = NULL; LPWSTR sczWusaPath = NULL; LPWSTR sczCommand = NULL; - LPWSTR sczEscapedKB = NULL; SC_HANDLE schWu = NULL; BOOL fWuWasDisabled = FALSE; STARTUPINFOW si = { }; @@ -324,15 +249,6 @@ extern "C" HRESULT MsuEngineExecutePackage( ExitOnFailure(hr, "Failed to format MSU install command."); break; - case BOOTSTRAPPER_ACTION_STATE_UNINSTALL: - hr = AppEscapeCommandLineArgumentFormatted(&sczEscapedKB, L"%ls", pPackage->Msu.sczKB); - ExitOnFailure(hr, "Failed to escape MSU KB."); - - // format command - hr = StrAllocFormatted(&sczCommand, L"\"%ls\" /uninstall /kb:%ls /quiet /norestart", sczWusaPath, sczEscapedKB); - ExitOnFailure(hr, "Failed to format MSU uninstall command."); - break; - default: hr = E_UNEXPECTED; ExitOnFailure(hr, "Failed to get action arguments for MSU package."); @@ -347,7 +263,7 @@ extern "C" HRESULT MsuEngineExecutePackage( ExitOnFailure(hr, "Failed to append log path to MSU command-line."); } - LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msuPackage.action), sczMsuPath ? sczMsuPath : pPackage->Msu.sczKB, sczCommand); + LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msuPackage.action), sczMsuPath, sczCommand); hr = EnsureWUServiceEnabled(fStopWusaService, &schWu, &fWuWasDisabled); ExitOnFailure(hr, "Failed to ensure WU service was enabled to install MSU package."); @@ -388,7 +304,6 @@ LExit: ReleaseStr(sczSystemPath); ReleaseStr(sczWusaPath); ReleaseStr(sczCommand); - ReleaseStr(sczEscapedKB); ReleaseHandle(pi.hProcess); ReleaseHandle(pi.hThread); diff --git a/src/burn/engine/package.cpp b/src/burn/engine/package.cpp index 88e7cb9d..c56f74c8 100644 --- a/src/burn/engine/package.cpp +++ b/src/burn/engine/package.cpp @@ -255,7 +255,7 @@ extern "C" HRESULT PackagesParseFromXml( fUninstallable = pPackage->Exe.fUninstallable; break; case BURN_PACKAGE_TYPE_MSU: - fUninstallable = pPackage->Msu.fUninstallable; + fUninstallable = FALSE; break; } diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h index 449c4e08..e8d49e53 100644 --- a/src/burn/engine/package.h +++ b/src/burn/engine/package.h @@ -421,8 +421,6 @@ typedef struct _BURN_PACKAGE struct { LPWSTR sczDetectCondition; - LPWSTR sczKB; - BOOL fUninstallable; } Msu; }; } BURN_PACKAGE; diff --git a/src/burn/test/BurnUnitTest/PlanTest.cpp b/src/burn/test/BurnUnitTest/PlanTest.cpp index 7998f837..a98484c1 100644 --- a/src/burn/test/BurnUnitTest/PlanTest.cpp +++ b/src/burn/test/BurnUnitTest/PlanTest.cpp @@ -2249,6 +2249,7 @@ namespace Bootstrapper void SingleMsuInstallTest() { HRESULT hr = S_OK; + LONGLONG llPlannedAction = 0; BURN_ENGINE_STATE engineState = { }; BURN_ENGINE_STATE* pEngineState = &engineState; BURN_PLAN* pPlan = &engineState.plan; @@ -2260,7 +2261,10 @@ namespace Bootstrapper hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_INSTALL); NativeAssert::Succeeded(hr, "CorePlan failed"); + llPlannedAction = VariableGetNumericHelper(&engineState.variables, BURN_BUNDLE_ACTION); + Assert::Equal(BOOTSTRAPPER_ACTION_INSTALL, pPlan->action); + Assert::Equal(BOOTSTRAPPER_ACTION_INSTALL, llPlannedAction); NativeAssert::StringEqual(L"{06077C60-DC46-4F4A-8D3C-05F869187191}", pPlan->wzBundleId); NativeAssert::StringEqual(L"{06077C60-DC46-4F4A-8D3C-05F869187191}", pPlan->wzBundleProviderKey); Assert::Equal(FALSE, pPlan->fEnabledForwardCompatibleBundle); @@ -2302,7 +2306,6 @@ namespace Bootstrapper ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE); ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); ValidateExecuteWaitCachePackage(pPlan, fRollback, dwIndex++, L"test.msu"); - ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); ValidateExecuteMsuPackage(pPlan, fRollback, dwIndex++, L"test.msu", BOOTSTRAPPER_ACTION_STATE_INSTALL); ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); @@ -2315,8 +2318,6 @@ namespace Bootstrapper ValidateExecuteRollbackBoundaryStart(pPlan, fRollback, dwIndex++, L"WixDefaultBoundary", TRUE, FALSE); ValidateExecuteUncachePackage(pPlan, fRollback, dwIndex++, L"test.msu"); ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); - ValidateExecuteMsuPackage(pPlan, fRollback, dwIndex++, L"test.msu", BOOTSTRAPPER_ACTION_STATE_UNINSTALL); - ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++); ValidateExecuteRollbackBoundaryEnd(pPlan, fRollback, dwIndex++); @@ -2336,7 +2337,6 @@ namespace Bootstrapper Assert::Equal(uIndex, pPlan->cPlannedProviders); Assert::Equal(1ul, pEngineState->packages.cPackages); - ValidateNonPermanentPackageExpectedStates(&pEngineState->packages.rgPackages[0], L"test.msu", BURN_PACKAGE_REGISTRATION_STATE_PRESENT, BURN_PACKAGE_REGISTRATION_STATE_PRESENT); } [Fact] diff --git a/src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml b/src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml index fb6afa88..3bb7acf1 100644 --- a/src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml +++ b/src/burn/test/BurnUnitTest/TestData/PlanTest/MsuPackageFixture_manifest.xml @@ -1 +1 @@ - \ No newline at end of file + -- cgit v1.2.3-55-g6feb