From c88806b89293f5bb92c42e90230e48be6b79b7f4 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 16 Apr 2021 09:42:01 -0500 Subject: Detect whether the bundle is cached. --- .../inc/BootstrapperApplication.h | 1 + src/engine/cache.cpp | 1 + src/engine/core.cpp | 8 ++++---- src/engine/detect.cpp | 2 +- src/engine/engine.mc | 2 +- src/engine/registration.cpp | 7 ++++--- src/engine/registration.h | 4 ++-- src/engine/userexperience.cpp | 2 ++ src/engine/userexperience.h | 1 + 9 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h b/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h index fb4b6ea3..2d086f38 100644 --- a/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h +++ b/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h @@ -463,6 +463,7 @@ struct BA_ONDETECTBEGIN_ARGS DWORD cbSize; BOOL fInstalled; DWORD cPackages; + BOOL fCached; }; struct BA_ONDETECTBEGIN_RESULTS diff --git a/src/engine/cache.cpp b/src/engine/cache.cpp index 667ca9e0..46c2650a 100644 --- a/src/engine/cache.cpp +++ b/src/engine/cache.cpp @@ -733,6 +733,7 @@ extern "C" HRESULT CacheCompleteBundle( hr = PathConcat(sczTargetDirectory, wzExecutableName, &sczTargetPath); ExitOnFailure(hr, "Failed to combine completed path with engine file name."); + // We can't just use wzExecutablePath because we needed to call CreateCompletedPath to ensure that the destination was secured. Assert(CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, wzExecutablePath, -1, sczTargetPath, -1)); // If the bundle is running out of the package cache then we don't need to copy it there diff --git a/src/engine/core.cpp b/src/engine/core.cpp index 7341e4b8..42759d3f 100644 --- a/src/engine/core.cpp +++ b/src/engine/core.cpp @@ -239,7 +239,7 @@ extern "C" HRESULT CoreQueryRegistration( SIZE_T iBuffer = 0; // Detect if bundle is already installed. - hr = RegistrationDetectInstalled(&pEngineState->registration, &pEngineState->registration.fInstalled); + hr = RegistrationDetectInstalled(&pEngineState->registration); ExitOnFailure(hr, "Failed to detect bundle install state."); // detect resume type @@ -293,7 +293,7 @@ extern "C" HRESULT CoreDetect( // only happens if Apply() changed the state of bundle (installed or // uninstalled). In that case, Detect() can be used here to reset // the installed state. - hr = RegistrationDetectInstalled(&pEngineState->registration, &pEngineState->registration.fInstalled); + hr = RegistrationDetectInstalled(&pEngineState->registration); ExitOnFailure(hr, "Failed to detect bundle install state."); if (pEngineState->registration.fInstalled) @@ -308,7 +308,7 @@ extern "C" HRESULT CoreDetect( } fDetectBegan = TRUE; - hr = UserExperienceOnDetectBegin(&pEngineState->userExperience, pEngineState->registration.fInstalled, pEngineState->packages.cPackages); + hr = UserExperienceOnDetectBegin(&pEngineState->userExperience, pEngineState->registration.fCached, pEngineState->registration.fInstalled, pEngineState->packages.cPackages); ExitOnRootFailure(hr, "UX aborted detect begin."); pEngineState->userExperience.hwndDetect = hwndParent; @@ -426,7 +426,7 @@ LExit: pEngineState->userExperience.hwndDetect = NULL; - LogId(REPORT_STANDARD, MSG_DETECT_COMPLETE, hr, !fDetectBegan ? "(failed)" : LoggingBoolToString(pEngineState->registration.fInstalled), FAILED(hr) ? "(failed)" : LoggingBoolToString(pEngineState->registration.fEligibleForCleanup)); + LogId(REPORT_STANDARD, MSG_DETECT_COMPLETE, hr, !fDetectBegan ? "(failed)" : LoggingBoolToString(pEngineState->registration.fInstalled), !fDetectBegan ? "(failed)" : LoggingBoolToString(pEngineState->registration.fCached), FAILED(hr) ? "(failed)" : LoggingBoolToString(pEngineState->registration.fEligibleForCleanup)); return hr; } diff --git a/src/engine/detect.cpp b/src/engine/detect.cpp index 355b49f5..844816ba 100644 --- a/src/engine/detect.cpp +++ b/src/engine/detect.cpp @@ -173,7 +173,7 @@ extern "C" HRESULT DetectReportRelatedBundles( HRESULT hr = S_OK; int nCompareResult = 0; BOOTSTRAPPER_REQUEST_STATE uninstallRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; - *pfEligibleForCleanup = pRegistration->fInstalled || CacheBundleRunningFromCache(); + *pfEligibleForCleanup = pRegistration->fInstalled || pRegistration->fCached; for (DWORD iRelatedBundle = 0; iRelatedBundle < pRegistration->relatedBundles.cRelatedBundles; ++iRelatedBundle) { diff --git a/src/engine/engine.mc b/src/engine/engine.mc index 365da1d9..71c27cad 100644 --- a/src/engine/engine.mc +++ b/src/engine/engine.mc @@ -300,7 +300,7 @@ MessageId=199 Severity=Success SymbolicName=MSG_DETECT_COMPLETE Language=English -Detect complete, result: 0x%1!x!, installed: %2!hs!, eligible for cleanup: %3!hs! +Detect complete, result: 0x%1!x!, installed: %2!hs!, cached: %3!hs!, eligible for cleanup: %4!hs! . MessageId=200 diff --git a/src/engine/registration.cpp b/src/engine/registration.cpp index 9e27b177..7435f292 100644 --- a/src/engine/registration.cpp +++ b/src/engine/registration.cpp @@ -463,14 +463,15 @@ LExit: } extern "C" HRESULT RegistrationDetectInstalled( - __in BURN_REGISTRATION* pRegistration, - __out BOOL* pfInstalled + __in BURN_REGISTRATION* pRegistration ) { HRESULT hr = S_OK; HKEY hkRegistration = NULL; DWORD dwInstalled = 0; + pRegistration->fCached = FileExistsEx(pRegistration->sczCacheExecutablePath, NULL); + // open registration key hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_QUERY_VALUE, &hkRegistration); if (SUCCEEDED(hr)) @@ -484,7 +485,7 @@ extern "C" HRESULT RegistrationDetectInstalled( hr = S_OK; } - *pfInstalled = (1 == dwInstalled); + pRegistration->fInstalled = (1 == dwInstalled); ReleaseRegKey(hkRegistration); return hr; diff --git a/src/engine/registration.h b/src/engine/registration.h index ed0641eb..af1b42e4 100644 --- a/src/engine/registration.h +++ b/src/engine/registration.h @@ -92,6 +92,7 @@ typedef struct _BURN_REGISTRATION BOOL fPerMachine; BOOL fRegisterArp; BOOL fDisableResume; + BOOL fCached; BOOL fInstalled; LPWSTR sczId; LPWSTR sczTag; @@ -174,8 +175,7 @@ HRESULT RegistrationSetVariables( __in BURN_VARIABLES* pVariables ); HRESULT RegistrationDetectInstalled( - __in BURN_REGISTRATION* pRegistration, - __out BOOL* pfInstalled + __in BURN_REGISTRATION* pRegistration ); HRESULT RegistrationDetectResumeType( __in BURN_REGISTRATION* pRegistration, diff --git a/src/engine/userexperience.cpp b/src/engine/userexperience.cpp index b81dbfb2..c1641675 100644 --- a/src/engine/userexperience.cpp +++ b/src/engine/userexperience.cpp @@ -708,6 +708,7 @@ LExit: EXTERN_C BAAPI UserExperienceOnDetectBegin( __in BURN_USER_EXPERIENCE* pUserExperience, + __in BOOL fCached, __in BOOL fInstalled, __in DWORD cPackages ) @@ -719,6 +720,7 @@ EXTERN_C BAAPI UserExperienceOnDetectBegin( args.cbSize = sizeof(args); args.cPackages = cPackages; args.fInstalled = fInstalled; + args.fCached = fCached; results.cbSize = sizeof(results); diff --git a/src/engine/userexperience.h b/src/engine/userexperience.h index cef9d769..a1fb67a0 100644 --- a/src/engine/userexperience.h +++ b/src/engine/userexperience.h @@ -186,6 +186,7 @@ BAAPI UserExperienceOnCommitMsiTransactionComplete( ); BAAPI UserExperienceOnDetectBegin( __in BURN_USER_EXPERIENCE* pUserExperience, + __in BOOL fCached, __in BOOL fInstalled, __in DWORD cPackages ); -- cgit v1.2.3-55-g6feb