From c88806b89293f5bb92c42e90230e48be6b79b7f4 Mon Sep 17 00:00:00 2001
From: Sean Hall <r.sean.hall@gmail.com>
Date: Fri, 16 Apr 2021 09:42:01 -0500
Subject: Detect whether the bundle is cached.

---
 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 +
 8 files changed, 16 insertions(+), 11 deletions(-)

(limited to 'src/engine')

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