From 75f4dce4ea53b82f99932573f27ccfc799d0c5c1 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Mon, 4 Apr 2022 17:38:26 -0500 Subject: Add option for BundlePackage to be hidden in ARP like MsiPackage. Requires support for this feature in the nested bundle. Simplest implementation of 4454 --- src/burn/engine/bundlepackageengine.cpp | 10 ++++++++++ src/burn/engine/core.cpp | 29 +++++++++++++++++++++++++++++ src/burn/engine/core.h | 2 ++ src/burn/engine/logging.cpp | 8 ++++++++ src/burn/engine/package.h | 1 + src/burn/engine/plan.cpp | 5 +++++ src/burn/engine/plan.h | 1 + src/burn/engine/registration.cpp | 2 +- 8 files changed, 57 insertions(+), 1 deletion(-) (limited to 'src/burn/engine') diff --git a/src/burn/engine/bundlepackageengine.cpp b/src/burn/engine/bundlepackageengine.cpp index cb34878f..00cf9454 100644 --- a/src/burn/engine/bundlepackageengine.cpp +++ b/src/burn/engine/bundlepackageengine.cpp @@ -72,6 +72,10 @@ extern "C" HRESULT BundlePackageEngineParsePackageFromXml( hr = XmlGetAttributeEx(pixnBundlePackage, L"RepairArguments", &pPackage->Bundle.sczRepairArguments); ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RepairArguments."); + // @HideARP + hr = XmlGetYesNoAttribute(pixnBundlePackage, L"HideARP", &pPackage->Bundle.fHideARP); + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @HideARP."); + // @SupportsBurnProtocol hr = XmlGetYesNoAttribute(pixnBundlePackage, L"SupportsBurnProtocol", &pPackage->Bundle.fSupportsBurnProtocol); ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @SupportsBurnProtocol."); @@ -870,6 +874,12 @@ static HRESULT ExecuteBundle( ExitOnFailure(hr, "Failed to append the parent to the command line."); } + if (pPackage->Bundle.fHideARP) + { + hr = StrAllocConcatFormatted(&sczBaseCommand, L" -%ls", BURN_COMMANDLINE_SWITCH_SYSTEM_COMPONENT); + ExitOnFailure(hr, "Failed to append %ls", BURN_COMMANDLINE_SWITCH_SYSTEM_COMPONENT); + } + // Add the list of dependencies to ignore, if any, to the burn command line. if (BOOTSTRAPPER_RELATION_CHAIN_PACKAGE == relationType) { diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp index 0bbf7039..be8c011f 100644 --- a/src/burn/engine/core.cpp +++ b/src/burn/engine/core.cpp @@ -1044,6 +1044,12 @@ static HRESULT CoreRecreateCommandLine( ExitOnFailure(hr, "Failed to append relation type to command-line."); } + if (pInternalCommand->fArpSystemComponent) + { + hr = StrAllocConcatFormatted(psczCommandLine, L" /%ls", BURN_COMMANDLINE_SWITCH_SYSTEM_COMPONENT); + ExitOnFailure(hr, "Failed to append system component to command-line."); + } + if (fPassthrough) { hr = StrAllocConcatFormatted(psczCommandLine, L" /%ls", BURN_COMMANDLINE_SWITCH_PASSTHROUGH); @@ -1633,6 +1639,29 @@ extern "C" HRESULT CoreParseCommandLine( } } } + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_SYSTEM_COMPONENT), BURN_COMMANDLINE_SWITCH_SYSTEM_COMPONENT, lstrlenW(BURN_COMMANDLINE_SWITCH_SYSTEM_COMPONENT))) + { + // Get a pointer to the next character after the switch. + LPCWSTR wzParam = &argv[i][1 + lstrlenW(BURN_COMMANDLINE_SWITCH_SYSTEM_COMPONENT)]; + + // Switch without an argument is allowed. An empty string means FALSE, everything else means TRUE. + if (L'\0' != wzParam[0]) + { + if (L'=' != wzParam[0]) + { + fInvalidCommandLine = TRUE; + TraceLog(E_INVALIDARG, "Invalid switch: %ls", argv[i]); + } + else + { + pInternalCommand->fArpSystemComponent = L'\0' != wzParam[1]; + } + } + else + { + pInternalCommand->fArpSystemComponent = TRUE; + } + } else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, BURN_COMMANDLINE_SWITCH_EMBEDDED, -1)) { if (i + 3 >= argc) diff --git a/src/burn/engine/core.h b/src/burn/engine/core.h index 556124d6..c04de20a 100644 --- a/src/burn/engine/core.h +++ b/src/burn/engine/core.h @@ -35,6 +35,7 @@ const LPCWSTR BURN_COMMANDLINE_SWITCH_ANCESTORS = L"burn.ancestors"; const LPCWSTR BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED = L"burn.filehandle.attached"; const LPCWSTR BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF = L"burn.filehandle.self"; const LPCWSTR BURN_COMMANDLINE_SWITCH_SPLASH_SCREEN = L"burn.splash.screen"; +const LPCWSTR BURN_COMMANDLINE_SWITCH_SYSTEM_COMPONENT = L"burn.system.component"; const LPCWSTR BURN_COMMANDLINE_SWITCH_PREFIX = L"burn."; const LPCWSTR BURN_BUNDLE_LAYOUT_DIRECTORY = L"WixBundleLayoutDirectory"; @@ -95,6 +96,7 @@ typedef struct _BURN_ENGINE_COMMAND BURN_MODE mode; BURN_AU_PAUSE_ACTION automaticUpdates; + BOOL fArpSystemComponent; BOOL fDisableSystemRestore; BOOL fInitiallyElevated; diff --git a/src/burn/engine/logging.cpp b/src/burn/engine/logging.cpp index a766b896..0b510f3d 100644 --- a/src/burn/engine/logging.cpp +++ b/src/burn/engine/logging.cpp @@ -752,8 +752,16 @@ extern "C" LPCSTR LoggingRegistrationOptionsToString( return "CacheBundle"; case BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY: return "WriteProviderKey"; + case BURN_REGISTRATION_ACTION_OPERATIONS_ARP_SYSTEM_COMPONENT: + return "ArpSystemComponent"; case BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE + BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY: return "CacheBundle, WriteProviderKey"; + case BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE + BURN_REGISTRATION_ACTION_OPERATIONS_ARP_SYSTEM_COMPONENT: + return "CacheBundle, ArpSystemComponent"; + case BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY + BURN_REGISTRATION_ACTION_OPERATIONS_ARP_SYSTEM_COMPONENT: + return "WriteProviderKey, ArpSystemComponent"; + case BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE + BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY + BURN_REGISTRATION_ACTION_OPERATIONS_ARP_SYSTEM_COMPONENT: + return "CacheBundle, WriteProviderKey, ArpSystemComponent"; default: return "Invalid"; } diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h index 4021031f..eb8e7543 100644 --- a/src/burn/engine/package.h +++ b/src/burn/engine/package.h @@ -321,6 +321,7 @@ typedef struct _BURN_PACKAGE LPWSTR* rgsczPatchCodes; DWORD cPatchCodes; + BOOL fHideARP; BOOL fWin64; BOOL fSupportsBurnProtocol; diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp index 183ac62a..2c267415 100644 --- a/src/burn/engine/plan.cpp +++ b/src/burn/engine/plan.cpp @@ -581,6 +581,11 @@ extern "C" HRESULT PlanRegistration( pPlan->dwRegistrationOperations |= BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE; } + if (pPlan->pInternalCommand->fArpSystemComponent) + { + pPlan->dwRegistrationOperations |= BURN_REGISTRATION_ACTION_OPERATIONS_ARP_SYSTEM_COMPONENT; + } + if (BOOTSTRAPPER_ACTION_UNINSTALL == pPlan->action || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == pPlan->action) { // If our provider key was not owned by a different bundle, diff --git a/src/burn/engine/plan.h b/src/burn/engine/plan.h index a8b16705..87214cc8 100644 --- a/src/burn/engine/plan.h +++ b/src/burn/engine/plan.h @@ -16,6 +16,7 @@ enum BURN_REGISTRATION_ACTION_OPERATIONS BURN_REGISTRATION_ACTION_OPERATIONS_NONE = 0x0, BURN_REGISTRATION_ACTION_OPERATIONS_CACHE_BUNDLE = 0x1, BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY = 0x2, + BURN_REGISTRATION_ACTION_OPERATIONS_ARP_SYSTEM_COMPONENT = 0x4, }; enum BURN_DEPENDENT_REGISTRATION_ACTION_TYPE diff --git a/src/burn/engine/registration.cpp b/src/burn/engine/registration.cpp index 961e86bc..0ffbc89e 100644 --- a/src/burn/engine/registration.cpp +++ b/src/burn/engine/registration.cpp @@ -767,7 +767,7 @@ extern "C" HRESULT RegistrationSessionBegin( } // Conditionally hide the ARP entry. - if (pRegistration->fForceSystemComponent) + if (pRegistration->fForceSystemComponent || (dwRegistrationOptions & BURN_REGISTRATION_ACTION_OPERATIONS_ARP_SYSTEM_COMPONENT)) { hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_SYSTEM_COMPONENT, 1); ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_SYSTEM_COMPONENT); -- cgit v1.2.3-55-g6feb