Detect a package as cached if any of its payloads exist.
Detect is supposed to be fast, so it can't fully verify every payload for every package. The engine was wasting its time by trying to verify file sizes without the hash. Even worse, it was making decisions during planning based on that insufficient verification. Contributes to #3640
Sean Hall committed
Apr 16, 2021 at 09:40 UTC
941c47e5a3f57ce9626b447a95740b1444e69343
23 files changed
+111
-171
src/engine/apply.cpp
+2
@@ -1910,6 +1910,8 @@ static HRESULT DoRollbackActions(
1910
ExitFunction1(hr = S_OK);
1911
1912
case BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE:
1913
+ // TODO: This used to be skipped if the package was already cached.
1914
+ // Need to figure out new logic for when (if?) to skip it.
1915
hr = CleanPackage(pEngineState->companionConnection.hPipe, pRollbackAction->uncachePackage.pPackage);
1916
IgnoreRollbackError(hr, "Failed to uncache package for rollback.");
1917
break;
src/engine/cache.cpp
+18
-7
@@ -91,6 +91,7 @@ static HRESULT RemoveBundleOrPackage(
91
static HRESULT VerifyHash(
92
__in BYTE* pbHash,
93
__in DWORD cbHash,
94
+ __in DWORD64 qwFileSize,
95
__in_z LPCWSTR wzUnverifiedPayloadPath,
96
__in HANDLE hFile
97
);
@@ -1288,7 +1289,7 @@ static HRESULT VerifyThenTransferContainer(
1289
// Container should have a hash we can use to verify with.
1290
if (pContainer->pbHash)
1291
{
1291
- hr = VerifyHash(pContainer->pbHash, pContainer->cbHash, wzUnverifiedContainerPath, hFile);
1292
+ hr = VerifyHash(pContainer->pbHash, pContainer->cbHash, pContainer->qwFileSize, wzUnverifiedContainerPath, hFile);
1293
ExitOnFailure(hr, "Failed to verify container hash: %ls", wzCachedPath);
1294
}
1295
@@ -1330,7 +1331,7 @@ static HRESULT VerifyThenTransferPayload(
1331
1332
if (pPayload->pbHash) // the payload should have a hash we can use to verify it.
1333
{
1333
- hr = VerifyHash(pPayload->pbHash, pPayload->cbHash, wzUnverifiedPayloadPath, hFile);
1334
+ hr = VerifyHash(pPayload->pbHash, pPayload->cbHash, pPayload->qwFileSize, wzUnverifiedPayloadPath, hFile);
1335
ExitOnFailure(hr, "Failed to verify payload hash: %ls", wzCachedPath);
1336
}
1337
@@ -1398,7 +1399,7 @@ static HRESULT VerifyFileAgainstPayload(
1399
1400
if (pPayload->pbHash) // the payload should have a hash we can use to verify it.
1401
{
1401
- hr = VerifyHash(pPayload->pbHash, pPayload->cbHash, wzVerifyPath, hFile);
1402
+ hr = VerifyHash(pPayload->pbHash, pPayload->cbHash, pPayload->qwFileSize, wzVerifyPath, hFile);
1403
ExitOnFailure(hr, "Failed to verify hash of payload: %ls", pPayload->sczKey);
1404
}
1405
@@ -1712,7 +1713,7 @@ static HRESULT RemoveBundleOrPackage(
1713
}
1714
}
1715
1715
- if (FAILED(hr))
1716
+ if (E_PATHNOTFOUND != hr && FAILED(hr))
1717
{
1718
LogId(REPORT_STANDARD, fBundle ? MSG_UNABLE_UNCACHE_BUNDLE : MSG_UNABLE_UNCACHE_PACKAGE, wzBundleOrPackageId, sczDirectory, hr);
1719
hr = S_OK;
@@ -1743,6 +1744,7 @@ LExit:
1744
static HRESULT VerifyHash(
1745
__in BYTE* pbHash,
1746
__in DWORD cbHash,
1747
+ __in DWORD64 qwFileSize,
1748
__in_z LPCWSTR wzUnverifiedPayloadPath,
1749
__in HANDLE hFile
1750
)
@@ -1751,22 +1753,31 @@ static HRESULT VerifyHash(
1753
1754
HRESULT hr = S_OK;
1755
BYTE rgbActualHash[SHA512_HASH_LEN] = { };
1754
- DWORD64 qwHashedBytes;
1756
+ DWORD64 qwHashedBytes = 0;
1757
+ LONGLONG llSize = 0;
1758
LPWSTR pszExpected = NULL;
1759
LPWSTR pszActual = NULL;
1760
1761
+ hr = FileSizeByHandle(hFile, &llSize);
1762
+ ExitOnFailure(hr, "Failed to get file size for path: %ls", wzUnverifiedPayloadPath);
1763
+
1764
+ if (static_cast<DWORD64>(llSize) != qwFileSize)
1765
+ {
1766
+ ExitOnFailure(hr = ERROR_FILE_CORRUPT, "File size mismatch for path: %ls, expected: %llu, actual: %lld", wzUnverifiedPayloadPath, qwFileSize, llSize);
1767
+ }
1768
+
1769
// TODO: create a cryp hash file that sends progress.
1770
hr = CrypHashFileHandle(hFile, PROV_RSA_AES, CALG_SHA_512, rgbActualHash, sizeof(rgbActualHash), &qwHashedBytes);
1771
ExitOnFailure(hr, "Failed to calculate hash for path: %ls", wzUnverifiedPayloadPath);
1772
1773
// Compare hashes.
1763
- if (cbHash != sizeof(rgbActualHash) || 0 != memcmp(pbHash, rgbActualHash, SHA512_HASH_LEN))
1774
+ if (cbHash != sizeof(rgbActualHash) || 0 != memcmp(pbHash, rgbActualHash, sizeof(rgbActualHash)))
1775
{
1776
hr = CRYPT_E_HASH_VALUE;
1777
1778
// Best effort to log the expected and actual hash value strings.
1779
if (SUCCEEDED(StrAllocHexEncode(pbHash, cbHash, &pszExpected)) &&
1769
- SUCCEEDED(StrAllocHexEncode(rgbActualHash, (SIZE_T)qwHashedBytes, &pszActual)))
1780
+ SUCCEEDED(StrAllocHexEncode(rgbActualHash, sizeof(rgbActualHash), &pszActual)))
1781
{
1782
ExitOnFailure(hr, "Hash mismatch for path: %ls, expected: %ls, actual: %ls", wzUnverifiedPayloadPath, pszExpected, pszActual);
1783
}
src/engine/core.cpp
+15
-29
@@ -388,7 +388,7 @@ extern "C" HRESULT CoreDetect(
388
pEngineState->registration.fEligibleForCleanup = FALSE;
389
}
390
391
- LogId(REPORT_STANDARD, MSG_DETECTED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingCacheStateToString(pPackage->cache), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->installRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->cacheRegistrationState));
391
+ LogId(REPORT_STANDARD, MSG_DETECTED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingBoolToString(pPackage->fCached), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->installRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->cacheRegistrationState));
392
393
if (BURN_PACKAGE_TYPE_MSI == pPackage->type)
394
{
@@ -439,7 +439,6 @@ extern "C" HRESULT CorePlan(
439
HRESULT hr = S_OK;
440
BOOL fPlanBegan = FALSE;
441
LPWSTR sczLayoutDirectory = NULL;
442
- HANDLE hSyncpointEvent = NULL;
442
BURN_PACKAGE* pUpgradeBundlePackage = NULL;
443
BURN_PACKAGE* pForwardCompatibleBundlePackage = NULL;
444
BOOL fContinuePlanning = TRUE; // assume we won't skip planning due to dependencies.
@@ -489,7 +488,7 @@ extern "C" HRESULT CorePlan(
488
ExitOnFailure(hr, "Failed to plan the layout of the bundle.");
489
490
// Plan the packages' layout.
492
- hr = PlanPackages(&pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, sczLayoutDirectory, &hSyncpointEvent);
491
+ hr = PlanPackages(&pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, sczLayoutDirectory);
492
ExitOnFailure(hr, "Failed to plan packages.");
493
}
494
else if (BOOTSTRAPPER_ACTION_UPDATE_REPLACE == action || BOOTSTRAPPER_ACTION_UPDATE_REPLACE_EMBEDDED == action)
@@ -498,7 +497,7 @@ extern "C" HRESULT CorePlan(
497
498
pUpgradeBundlePackage = &pEngineState->update.package;
499
501
- hr = PlanUpdateBundle(&pEngineState->userExperience, pUpgradeBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent);
500
+ hr = PlanUpdateBundle(&pEngineState->userExperience, pUpgradeBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType);
501
ExitOnFailure(hr, "Failed to plan update.");
502
}
503
else
@@ -512,7 +511,7 @@ extern "C" HRESULT CorePlan(
511
512
pForwardCompatibleBundlePackage = &pEngineState->plan.forwardCompatibleBundle;
513
515
- hr = PlanPassThroughBundle(&pEngineState->userExperience, pForwardCompatibleBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent);
514
+ hr = PlanPassThroughBundle(&pEngineState->userExperience, pForwardCompatibleBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType);
515
ExitOnFailure(hr, "Failed to plan passthrough.");
516
}
517
else // doing an action that modifies the machine state.
@@ -533,11 +532,11 @@ extern "C" HRESULT CorePlan(
532
hr = PlanRelatedBundlesBegin(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->plan);
533
ExitOnFailure(hr, "Failed to plan related bundles.");
534
536
- hr = PlanPackages(&pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, NULL, &hSyncpointEvent);
535
+ hr = PlanPackages(&pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, NULL);
536
ExitOnFailure(hr, "Failed to plan packages.");
537
538
// Schedule the update of related bundles last.
540
- hr = PlanRelatedBundlesComplete(&pEngineState->registration, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, &hSyncpointEvent, dwExecuteActionEarlyIndex);
539
+ hr = PlanRelatedBundlesComplete(&pEngineState->registration, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, dwExecuteActionEarlyIndex);
540
ExitOnFailure(hr, "Failed to schedule related bundles.");
541
}
542
}
@@ -1669,9 +1668,8 @@ static HRESULT DetectPackagePayloadsCached(
1668
{
1669
HRESULT hr = S_OK;
1670
LPWSTR sczCachePath = NULL;
1672
- BURN_CACHE_STATE cache = BURN_CACHE_STATE_NONE; // assume the package will not be cached.
1671
+ BOOL fCached = FALSE; // assume the package is not cached.
1672
LPWSTR sczPayloadCachePath = NULL;
1674
- LONGLONG llSize = 0;
1673
1674
if (pPackage->sczCacheId && *pPackage->sczCacheId)
1675
{
@@ -1681,9 +1679,7 @@ static HRESULT DetectPackagePayloadsCached(
1679
// If the cached directory exists, we have something.
1680
if (DirExists(sczCachePath, NULL))
1681
{
1684
- cache = BURN_CACHE_STATE_COMPLETE; // assume all payloads are cached.
1685
-
1686
- // Check all payloads to see if any are missing or not the right size.
1682
+ // Check all payloads to see if they exist.
1683
for (DWORD i = 0; i < pPackage->cPayloads; ++i)
1684
{
1685
BURN_PACKAGE_PAYLOAD* pPackagePayload = pPackage->rgPayloads + i;
@@ -1691,35 +1687,25 @@ static HRESULT DetectPackagePayloadsCached(
1687
hr = PathConcat(sczCachePath, pPackagePayload->pPayload->sczFilePath, &sczPayloadCachePath);
1688
ExitOnFailure(hr, "Failed to concat payload cache path.");
1689
1694
- hr = FileSize(sczPayloadCachePath, &llSize);
1695
- if (SUCCEEDED(hr) && static_cast<DWORD64>(llSize) != pPackagePayload->pPayload->qwFileSize)
1696
- {
1697
- hr = HRESULT_FROM_WIN32(ERROR_FILE_CORRUPT); // size did not match expectations, so cache must have the wrong file.
1698
- }
1699
-
1700
- if (SUCCEEDED(hr))
1690
+ if (FileExistsEx(sczPayloadCachePath, NULL))
1691
{
1702
- // TODO: should we do a full on hash verification on the file to ensure
1703
- // the exact right file is cached?
1704
-
1692
+ // TODO: We shouldn't track whether the payload was cached since all we did was check whether the file exists.
1693
pPackagePayload->fCached = TRUE;
1694
+ fCached = TRUE;
1695
}
1696
else
1697
{
1709
- LogId(REPORT_STANDARD, MSG_DETECT_PACKAGE_NOT_FULLY_CACHED, pPackage->sczId, pPackagePayload->pPayload->sczKey, hr);
1710
-
1711
- cache = BURN_CACHE_STATE_PARTIAL; // found a payload that was not cached so we are partial.
1712
- hr = S_OK;
1698
+ LogId(REPORT_STANDARD, MSG_DETECT_PACKAGE_NOT_FULLY_CACHED, pPackage->sczId, pPackagePayload->pPayload->sczKey);
1699
}
1700
}
1701
}
1702
}
1703
1718
- pPackage->cache = cache;
1704
+ pPackage->fCached = fCached;
1705
1706
if (pPackage->fCanAffectRegistration)
1707
{
1722
- pPackage->cacheRegistrationState = BURN_CACHE_STATE_NONE < pPackage->cache ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
1708
+ pPackage->cacheRegistrationState = pPackage->fCached ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
1709
}
1710
1711
LExit:
@@ -1808,7 +1794,7 @@ static void LogPackages(
1794
const DWORD iPackage = (BOOTSTRAPPER_ACTION_UNINSTALL == action) ? pPackages->cPackages - 1 - i : i;
1795
const BURN_PACKAGE* pPackage = &pPackages->rgPackages[iPackage];
1796
1811
- LogId(REPORT_STANDARD, MSG_PLANNED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingRequestStateToString(pPackage->defaultRequested), LoggingRequestStateToString(pPackage->requested), LoggingActionStateToString(pPackage->execute), LoggingActionStateToString(pPackage->rollback), LoggingBoolToString(pPackage->fAcquire), LoggingBoolToString(pPackage->fUncache), LoggingDependencyActionToString(pPackage->dependencyExecute), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedInstallRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedCacheRegistrationState));
1797
+ LogId(REPORT_STANDARD, MSG_PLANNED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingRequestStateToString(pPackage->defaultRequested), LoggingRequestStateToString(pPackage->requested), LoggingActionStateToString(pPackage->execute), LoggingActionStateToString(pPackage->rollback), LoggingBoolToString(pPackage->fPlannedCache), LoggingBoolToString(pPackage->fPlannedUncache), LoggingDependencyActionToString(pPackage->dependencyExecute), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedInstallRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedCacheRegistrationState));
1798
1799
if (BURN_PACKAGE_TYPE_MSI == pPackage->type)
1800
{
src/engine/detect.cpp
+5
-5
@@ -67,7 +67,7 @@ extern "C" void DetectReset(
67
pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN;
68
pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN;
69
70
- pPackage->cache = BURN_CACHE_STATE_NONE;
70
+ pPackage->fCached = FALSE;
71
for (DWORD iPayload = 0; iPayload < pPackage->cPayloads; ++iPayload)
72
{
73
BURN_PACKAGE_PAYLOAD* pPayload = pPackage->rgPayloads + iPayload;
@@ -149,10 +149,10 @@ extern "C" HRESULT DetectForwardCompatibleBundles(
149
pRegistration->fForwardCompatibleBundleExists = TRUE;
150
}
151
152
- hr = UserExperienceOnDetectForwardCompatibleBundle(pUX, pRelatedBundle->package.sczId, pRelatedBundle->relationType, pRelatedBundle->sczTag, pRelatedBundle->package.fPerMachine, pRelatedBundle->pVersion, BURN_CACHE_STATE_COMPLETE != pRelatedBundle->package.cache);
152
+ hr = UserExperienceOnDetectForwardCompatibleBundle(pUX, pRelatedBundle->package.sczId, pRelatedBundle->relationType, pRelatedBundle->sczTag, pRelatedBundle->package.fPerMachine, pRelatedBundle->pVersion, !pRelatedBundle->package.fCached);
153
ExitOnRootFailure(hr, "BA aborted detect forward compatible bundle.");
154
155
- LogId(REPORT_STANDARD, MSG_DETECTED_FORWARD_COMPATIBLE_BUNDLE, pRelatedBundle->package.sczId, LoggingRelationTypeToString(pRelatedBundle->relationType), LoggingPerMachineToString(pRelatedBundle->package.fPerMachine), pRelatedBundle->pVersion->sczVersion, LoggingCacheStateToString(pRelatedBundle->package.cache));
155
+ LogId(REPORT_STANDARD, MSG_DETECTED_FORWARD_COMPATIBLE_BUNDLE, pRelatedBundle->package.sczId, LoggingRelationTypeToString(pRelatedBundle->relationType), LoggingPerMachineToString(pRelatedBundle->package.fPerMachine), pRelatedBundle->pVersion->sczVersion, LoggingBoolToString(pRelatedBundle->package.fCached));
156
}
157
}
158
}
@@ -225,9 +225,9 @@ extern "C" HRESULT DetectReportRelatedBundles(
225
break;
226
}
227
228
- LogId(REPORT_STANDARD, MSG_DETECTED_RELATED_BUNDLE, pRelatedBundle->package.sczId, LoggingRelationTypeToString(pRelatedBundle->relationType), LoggingPerMachineToString(pRelatedBundle->package.fPerMachine), pRelatedBundle->pVersion->sczVersion, LoggingRelatedOperationToString(operation), LoggingCacheStateToString(pRelatedBundle->package.cache));
228
+ LogId(REPORT_STANDARD, MSG_DETECTED_RELATED_BUNDLE, pRelatedBundle->package.sczId, LoggingRelationTypeToString(pRelatedBundle->relationType), LoggingPerMachineToString(pRelatedBundle->package.fPerMachine), pRelatedBundle->pVersion->sczVersion, LoggingRelatedOperationToString(operation), LoggingBoolToString(pRelatedBundle->package.fCached));
229
230
- hr = UserExperienceOnDetectRelatedBundle(pUX, pRelatedBundle->package.sczId, pRelatedBundle->relationType, pRelatedBundle->sczTag, pRelatedBundle->package.fPerMachine, pRelatedBundle->pVersion, operation, BURN_CACHE_STATE_COMPLETE != pRelatedBundle->package.cache);
230
+ hr = UserExperienceOnDetectRelatedBundle(pUX, pRelatedBundle->package.sczId, pRelatedBundle->relationType, pRelatedBundle->sczTag, pRelatedBundle->package.fPerMachine, pRelatedBundle->pVersion, operation, !pRelatedBundle->package.fCached);
231
ExitOnRootFailure(hr, "BA aborted detect related bundle.");
232
233
// For now, if any related bundles will be executed during uninstall by default then never automatically clean up the bundle.
src/engine/engine.mc
+4
-4
@@ -242,16 +242,16 @@ Detected forward compatible bundle: %1!ls!, type: %2!hs!, scope: %3!hs!, version
242
243
MessageId=108
244
Severity=Warning
245
-SymbolicName=MSG_DETECT_RELATED_BUNDLE_NOT_FULLY_CACHED
245
+SymbolicName=MSG_DETECT_RELATED_BUNDLE_NOT_CACHED
246
Language=English
247
-Detected partially cached related bundle: %1!ls!, cache path: %2!ls!, reason: 0x%3!x!
247
+Detected related bundle missing from cache: %1!ls!, cache path: %2!ls!
248
.
249
250
MessageId=120
251
Severity=Warning
252
SymbolicName=MSG_DETECT_PACKAGE_NOT_FULLY_CACHED
253
Language=English
254
-Detected partially cached package: %1!ls!, invalid payload: %2!ls!, reason: 0x%3!x!
254
+Detected partially cached package: %1!ls!, missing payload: %2!ls!
255
.
256
257
MessageId=121
@@ -363,7 +363,7 @@ MessageId=208
363
Severity=Warning
364
SymbolicName=MSG_PLAN_DISABLING_ROLLBACK_NO_CACHE
365
Language=English
366
-Plan disabled rollback for package: %1!ls!, due to incomplete cache: %2!hs!, original rollback action: %3!hs!
366
+Plan disabled rollback due to incomplete cache for package: %1!ls!, original rollback action: %2!hs!
367
.
368
369
MessageId=209
src/engine/exeengine.cpp
+2
-3
@@ -269,8 +269,7 @@ extern "C" HRESULT ExeEnginePlanAddPackage(
269
__in BURN_PLAN* pPlan,
270
__in BURN_LOGGING* pLog,
271
__in BURN_VARIABLES* pVariables,
272
- __in_opt HANDLE hCacheEvent,
273
- __in BOOL fPlanPackageCacheRollback
272
+ __in_opt HANDLE hCacheEvent
273
)
274
{
275
HRESULT hr = S_OK;
@@ -279,7 +278,7 @@ extern "C" HRESULT ExeEnginePlanAddPackage(
278
// add wait for cache
279
if (hCacheEvent)
280
{
282
- hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent, fPlanPackageCacheRollback);
281
+ hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent);
282
ExitOnFailure(hr, "Failed to plan package cache syncpoint");
283
}
284
src/engine/exeengine.h
+1
-2
@@ -29,8 +29,7 @@ HRESULT ExeEnginePlanAddPackage(
29
__in BURN_PLAN* pPlan,
30
__in BURN_LOGGING* pLog,
31
__in BURN_VARIABLES* pVariables,
32
- __in_opt HANDLE hCacheEvent,
33
- __in BOOL fPlanPackageCacheRollback
32
+ __in_opt HANDLE hCacheEvent
33
);
34
HRESULT ExeEngineExecutePackage(
35
__in BURN_EXECUTE_ACTION* pExecuteAction,
src/engine/externalengine.cpp
+1
-1
@@ -327,7 +327,7 @@ HRESULT ExternalEngineSetUpdate(
327
sczId = pEngineState->registration.sczId;
328
}
329
330
- hr = PseudoBundleInitialize(FILEMAKEVERSION(rmj, rmm, rup, rpr), &pEngineState->update.package, FALSE, sczId, BOOTSTRAPPER_RELATION_UPDATE, BOOTSTRAPPER_PACKAGE_STATE_ABSENT, BURN_CACHE_STATE_NONE, pEngineState->registration.sczExecutableName, sczLocalSource ? sczLocalSource : wzLocalSource, wzDownloadSource, qwSize, TRUE, sczCommandline, NULL, NULL, NULL, rgbHash, cbHash);
330
+ hr = PseudoBundleInitialize(FILEMAKEVERSION(rmj, rmm, rup, rpr), &pEngineState->update.package, FALSE, sczId, BOOTSTRAPPER_RELATION_UPDATE, BOOTSTRAPPER_PACKAGE_STATE_ABSENT, FALSE, pEngineState->registration.sczExecutableName, sczLocalSource ? sczLocalSource : wzLocalSource, wzDownloadSource, qwSize, TRUE, sczCommandline, NULL, NULL, NULL, rgbHash, cbHash);
331
ExitOnFailure(hr, "Failed to set update bundle.");
332
333
pEngineState->update.fUpdateAvailable = TRUE;
src/engine/logging.cpp
-17
@@ -426,23 +426,6 @@ extern "C" LPCSTR LoggingPackageRegistrationStateToString(
426
}
427
}
428
429
-extern "C" LPCSTR LoggingCacheStateToString(
430
- __in BURN_CACHE_STATE cacheState
431
- )
432
-{
433
- switch (cacheState)
434
- {
435
- case BURN_CACHE_STATE_NONE:
436
- return "None";
437
- case BURN_CACHE_STATE_PARTIAL:
438
- return "Partial";
439
- case BURN_CACHE_STATE_COMPLETE:
440
- return "Complete";
441
- default:
442
- return "Invalid";
443
- }
444
-}
445
-
429
extern "C" LPCSTR LoggingMsiFeatureStateToString(
430
__in BOOTSTRAPPER_FEATURE_STATE featureState
431
)
src/engine/logging.h
-4
@@ -94,10 +94,6 @@ LPCSTR LoggingPackageRegistrationStateToString(
94
__in BURN_PACKAGE_REGISTRATION_STATE registrationState
95
);
96
97
-LPCSTR LoggingCacheStateToString(
98
- __in BURN_CACHE_STATE cacheState
99
- );
100
-
97
LPCSTR LoggingMsiFeatureStateToString(
98
__in BOOTSTRAPPER_FEATURE_STATE featureState
99
);
src/engine/msiengine.cpp
+2
-3
@@ -932,8 +932,7 @@ extern "C" HRESULT MsiEnginePlanAddPackage(
932
__in BURN_PLAN* pPlan,
933
__in BURN_LOGGING* pLog,
934
__in BURN_VARIABLES* pVariables,
935
- __in_opt HANDLE hCacheEvent,
936
- __in BOOL fPlanPackageCacheRollback
935
+ __in_opt HANDLE hCacheEvent
936
)
937
{
938
HRESULT hr = S_OK;
@@ -963,7 +962,7 @@ extern "C" HRESULT MsiEnginePlanAddPackage(
962
// add wait for cache
963
if (hCacheEvent)
964
{
966
- hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent, fPlanPackageCacheRollback);
965
+ hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent);
966
ExitOnFailure(hr, "Failed to plan package cache syncpoint");
967
}
968
src/engine/msiengine.h
+1
-2
@@ -50,8 +50,7 @@ HRESULT MsiEnginePlanAddPackage(
50
__in BURN_PLAN* pPlan,
51
__in BURN_LOGGING* pLog,
52
__in BURN_VARIABLES* pVariables,
53
- __in_opt HANDLE hCacheEvent,
54
- __in BOOL fPlanPackageCacheRollback
53
+ __in_opt HANDLE hCacheEvent
54
);
55
HRESULT MsiEngineBeginTransaction(
56
__in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary
src/engine/mspengine.cpp
+2
-3
@@ -506,8 +506,7 @@ extern "C" HRESULT MspEnginePlanAddPackage(
506
__in BURN_PLAN* pPlan,
507
__in BURN_LOGGING* pLog,
508
__in BURN_VARIABLES* pVariables,
509
- __in_opt HANDLE hCacheEvent,
510
- __in BOOL fPlanPackageCacheRollback
509
+ __in_opt HANDLE hCacheEvent
510
)
511
{
512
HRESULT hr = S_OK;
@@ -517,7 +516,7 @@ extern "C" HRESULT MspEnginePlanAddPackage(
516
// add wait for cache
517
if (hCacheEvent)
518
{
520
- hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent, fPlanPackageCacheRollback);
519
+ hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent);
520
ExitOnFailure(hr, "Failed to plan package cache syncpoint");
521
}
522
src/engine/mspengine.h
+1
-2
@@ -58,8 +58,7 @@ HRESULT MspEnginePlanAddPackage(
58
__in BURN_PLAN* pPlan,
59
__in BURN_LOGGING* pLog,
60
__in BURN_VARIABLES* pVariables,
61
- __in_opt HANDLE hCacheEvent,
62
- __in BOOL fPlanPackageCacheRollback
61
+ __in_opt HANDLE hCacheEvent
62
);
63
HRESULT MspEngineExecutePackage(
64
__in_opt HWND hwndParent,
src/engine/msuengine.cpp
+2
-3
@@ -193,8 +193,7 @@ extern "C" HRESULT MsuEnginePlanAddPackage(
193
__in BURN_PLAN* pPlan,
194
__in BURN_LOGGING* pLog,
195
__in BURN_VARIABLES* pVariables,
196
- __in HANDLE hCacheEvent,
197
- __in BOOL fPlanPackageCacheRollback
196
+ __in HANDLE hCacheEvent
197
)
198
{
199
HRESULT hr = S_OK;
@@ -203,7 +202,7 @@ extern "C" HRESULT MsuEnginePlanAddPackage(
202
// add wait for cache
203
if (hCacheEvent)
204
{
206
- hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent, fPlanPackageCacheRollback);
205
+ hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent);
206
ExitOnFailure(hr, "Failed to plan package cache syncpoint");
207
}
208
src/engine/msuengine.h
+1
-2
@@ -28,8 +28,7 @@ HRESULT MsuEnginePlanAddPackage(
28
__in BURN_PLAN* pPlan,
29
__in BURN_LOGGING* pLog,
30
__in BURN_VARIABLES* pVariables,
31
- __in HANDLE hCacheEvent,
32
- __in BOOL fPlanPackageCacheRollback
31
+ __in HANDLE hCacheEvent
32
);
33
HRESULT MsuEngineExecutePackage(
34
__in BURN_EXECUTE_ACTION* pExecuteAction,
src/engine/package.h
+3
-10
@@ -41,13 +41,6 @@ enum BURN_PACKAGE_TYPE
41
BURN_PACKAGE_TYPE_MSU,
42
};
43
44
-enum BURN_CACHE_STATE
45
-{
46
- BURN_CACHE_STATE_NONE,
47
- BURN_CACHE_STATE_PARTIAL,
48
- BURN_CACHE_STATE_COMPLETE,
49
-};
50
-
44
enum BURN_CACHE_TYPE
45
{
46
BURN_CACHE_TYPE_NO,
@@ -246,12 +239,12 @@ typedef struct _BURN_PACKAGE
239
BURN_ROLLBACK_BOUNDARY* pRollbackBoundaryBackward; // used during uninstall.
240
241
BOOTSTRAPPER_PACKAGE_STATE currentState; // only valid after Detect.
249
- BURN_CACHE_STATE cache; // only valid after Detect.
242
+ BOOL fCached; // only valid after Detect.
243
BOOL fPackageProviderExists; // only valid after Detect.
244
BOOTSTRAPPER_REQUEST_STATE defaultRequested;// only valid during Plan.
245
BOOTSTRAPPER_REQUEST_STATE requested; // only valid during Plan.
253
- BOOL fAcquire; // only valid during Plan.
254
- BOOL fUncache; // only valid during Plan.
246
+ BOOL fPlannedCache; // only valid during Plan.
247
+ BOOL fPlannedUncache; // only valid during Plan.
248
BOOTSTRAPPER_ACTION_STATE execute; // only valid during Plan.
249
BOOTSTRAPPER_ACTION_STATE rollback; // only valid during Plan.
250
BURN_DEPENDENCY_ACTION providerExecute; // only valid during Plan.
src/engine/plan.cpp
+31
-45
@@ -31,8 +31,7 @@ static HRESULT PlanPackagesHelper(
31
__in BURN_VARIABLES* pVariables,
32
__in BOOTSTRAPPER_DISPLAY display,
33
__in BOOTSTRAPPER_RELATION_TYPE relationType,
34
- __in_z_opt LPCWSTR wzLayoutDirectory,
35
- __inout HANDLE* phSyncpointEvent
34
+ __in_z_opt LPCWSTR wzLayoutDirectory
35
);
36
static HRESULT InitializePackage(
37
__in BURN_PLAN* pPlan,
@@ -564,13 +563,12 @@ extern "C" HRESULT PlanPackages(
563
__in BURN_VARIABLES* pVariables,
564
__in BOOTSTRAPPER_DISPLAY display,
565
__in BOOTSTRAPPER_RELATION_TYPE relationType,
567
- __in_z_opt LPCWSTR wzLayoutDirectory,
568
- __inout HANDLE* phSyncpointEvent
566
+ __in_z_opt LPCWSTR wzLayoutDirectory
567
)
568
{
569
HRESULT hr = S_OK;
570
573
- hr = PlanPackagesHelper(pPackages->rgPackages, pPackages->cPackages, TRUE, pUX, pPlan, pLog, pVariables, display, relationType, wzLayoutDirectory, phSyncpointEvent);
571
+ hr = PlanPackagesHelper(pPackages->rgPackages, pPackages->cPackages, TRUE, pUX, pPlan, pLog, pVariables, display, relationType, wzLayoutDirectory);
572
573
return hr;
574
}
@@ -776,8 +774,7 @@ extern "C" HRESULT PlanPassThroughBundle(
774
__in BURN_LOGGING* pLog,
775
__in BURN_VARIABLES* pVariables,
776
__in BOOTSTRAPPER_DISPLAY display,
779
- __in BOOTSTRAPPER_RELATION_TYPE relationType,
780
- __inout HANDLE* phSyncpointEvent
777
+ __in BOOTSTRAPPER_RELATION_TYPE relationType
778
)
779
{
780
HRESULT hr = S_OK;
@@ -785,7 +782,7 @@ extern "C" HRESULT PlanPassThroughBundle(
782
// Plan passthrough package.
783
// Passthrough packages are never cleaned up by the calling bundle (they delete themselves when appropriate)
784
// so we don't need to plan clean up.
788
- hr = PlanPackagesHelper(pPackage, 1, FALSE, pUX, pPlan, pLog, pVariables, display, relationType, NULL, phSyncpointEvent);
785
+ hr = PlanPackagesHelper(pPackage, 1, FALSE, pUX, pPlan, pLog, pVariables, display, relationType, NULL);
786
ExitOnFailure(hr, "Failed to process passthrough package.");
787
788
LExit:
@@ -799,14 +796,13 @@ extern "C" HRESULT PlanUpdateBundle(
796
__in BURN_LOGGING* pLog,
797
__in BURN_VARIABLES* pVariables,
798
__in BOOTSTRAPPER_DISPLAY display,
802
- __in BOOTSTRAPPER_RELATION_TYPE relationType,
803
- __inout HANDLE* phSyncpointEvent
799
+ __in BOOTSTRAPPER_RELATION_TYPE relationType
800
)
801
{
802
HRESULT hr = S_OK;
803
804
// Plan update package.
809
- hr = PlanPackagesHelper(pPackage, 1, TRUE, pUX, pPlan, pLog, pVariables, display, relationType, NULL, phSyncpointEvent);
805
+ hr = PlanPackagesHelper(pPackage, 1, TRUE, pUX, pPlan, pLog, pVariables, display, relationType, NULL);
806
ExitOnFailure(hr, "Failed to process update package.");
807
808
LExit:
@@ -823,13 +819,13 @@ static HRESULT PlanPackagesHelper(
819
__in BURN_VARIABLES* pVariables,
820
__in BOOTSTRAPPER_DISPLAY display,
821
__in BOOTSTRAPPER_RELATION_TYPE relationType,
826
- __in_z_opt LPCWSTR wzLayoutDirectory,
827
- __inout HANDLE* phSyncpointEvent
822
+ __in_z_opt LPCWSTR wzLayoutDirectory
823
)
824
{
825
HRESULT hr = S_OK;
826
BOOL fBundlePerMachine = pPlan->fPerMachine; // bundle is per-machine if plan starts per-machine.
827
BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL;
828
+ HANDLE hSyncpointEvent = NULL;
829
830
// Initialize the packages.
831
for (DWORD i = 0; i < cPackages; ++i)
@@ -860,7 +856,7 @@ static HRESULT PlanPackagesHelper(
856
DWORD iPackage = (BOOTSTRAPPER_ACTION_UNINSTALL == pPlan->action) ? cPackages - 1 - i : i;
857
BURN_PACKAGE* pPackage = rgPackages + iPackage;
858
863
- hr = ProcessPackage(fBundlePerMachine, pUX, pPlan, pPackage, pLog, pVariables, display, wzLayoutDirectory, phSyncpointEvent, &pRollbackBoundary);
859
+ hr = ProcessPackage(fBundlePerMachine, pUX, pPlan, pPackage, pLog, pVariables, display, wzLayoutDirectory, &hSyncpointEvent, &pRollbackBoundary);
860
ExitOnFailure(hr, "Failed to process package.");
861
}
862
@@ -1126,10 +1122,11 @@ extern "C" HRESULT PlanExecutePackage(
1122
hr = AddCachePackage(pPlan, pPackage, phSyncpointEvent);
1123
ExitOnFailure(hr, "Failed to plan cache package.");
1124
}
1129
- else if (BURN_CACHE_STATE_COMPLETE != pPackage->cache && NeedsCache(pPackage, FALSE))
1125
+ else if (!pPackage->fCached && NeedsCache(pPackage, FALSE))
1126
{
1127
+ // TODO: this decision should be made during apply instead of plan based on whether the package is actually cached.
1128
// If the package is not in the cache, disable any rollback that would require the package from the cache.
1132
- LogId(REPORT_STANDARD, MSG_PLAN_DISABLING_ROLLBACK_NO_CACHE, pPackage->sczId, LoggingCacheStateToString(pPackage->cache), LoggingActionStateToString(pPackage->rollback));
1129
+ LogId(REPORT_STANDARD, MSG_PLAN_DISABLING_ROLLBACK_NO_CACHE, pPackage->sczId, LoggingActionStateToString(pPackage->rollback));
1130
pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
1131
}
1132
@@ -1162,19 +1159,19 @@ extern "C" HRESULT PlanExecutePackage(
1159
switch (pPackage->type)
1160
{
1161
case BURN_PACKAGE_TYPE_EXE:
1165
- hr = ExeEnginePlanAddPackage(NULL, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire);
1162
+ hr = ExeEnginePlanAddPackage(NULL, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent);
1163
break;
1164
1165
case BURN_PACKAGE_TYPE_MSI:
1169
- hr = MsiEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire);
1166
+ hr = MsiEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent);
1167
break;
1168
1169
case BURN_PACKAGE_TYPE_MSP:
1173
- hr = MspEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire);
1170
+ hr = MspEnginePlanAddPackage(display, pUserExperience, pPackage, pPlan, pLog, pVariables, *phSyncpointEvent);
1171
break;
1172
1173
case BURN_PACKAGE_TYPE_MSU:
1177
- hr = MsuEnginePlanAddPackage(pPackage, pPlan, pLog, pVariables, *phSyncpointEvent, pPackage->fAcquire);
1174
+ hr = MsuEnginePlanAddPackage(pPackage, pPlan, pLog, pVariables, *phSyncpointEvent);
1175
break;
1176
1177
default:
@@ -1368,7 +1365,6 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1365
__in BURN_PLAN* pPlan,
1366
__in BURN_LOGGING* pLog,
1367
__in BURN_VARIABLES* pVariables,
1371
- __inout HANDLE* phSyncpointEvent,
1368
__in DWORD dwExecuteActionEarlyIndex
1369
)
1370
{
@@ -1488,7 +1484,7 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1484
}
1485
}
1486
1491
- hr = ExeEnginePlanAddPackage(pdwInsertIndex, &pRelatedBundle->package, pPlan, pLog, pVariables, *phSyncpointEvent, FALSE);
1487
+ hr = ExeEnginePlanAddPackage(pdwInsertIndex, &pRelatedBundle->package, pPlan, pLog, pVariables, NULL);
1488
ExitOnFailure(hr, "Failed to add to plan related bundle: %ls", pRelatedBundle->package.sczId);
1489
1490
// Calculate package states based on reference count for addon and patch related bundles.
@@ -1560,11 +1556,8 @@ extern "C" HRESULT PlanCleanPackage(
1556
BOOL fPlanCleanPackage = FALSE;
1557
BURN_CLEAN_ACTION* pCleanAction = NULL;
1558
1563
- // The following is a complex set of logic that determines when a package should be cleaned
1564
- // from the cache. Start by noting that we only clean if the package is being acquired or
1565
- // already cached and the package is not supposed to always be cached.
1566
- if ((pPackage->fAcquire || BURN_CACHE_STATE_PARTIAL == pPackage->cache || BURN_CACHE_STATE_COMPLETE == pPackage->cache) &&
1567
- (BURN_CACHE_TYPE_ALWAYS > pPackage->cacheType || BOOTSTRAPPER_ACTION_CACHE > pPlan->action))
1559
+ // The following is a complex set of logic that determines when a package should be cleaned from the cache.
1560
+ if (BURN_CACHE_TYPE_ALWAYS > pPackage->cacheType || BOOTSTRAPPER_ACTION_CACHE > pPlan->action)
1561
{
1562
// The following are all different reasons why the package should be cleaned from the cache.
1563
// The else-ifs are used to make the conditions easier to see (rather than have them combined
@@ -1607,7 +1600,7 @@ extern "C" HRESULT PlanCleanPackage(
1600
1601
pCleanAction->pPackage = pPackage;
1602
1610
- pPackage->fUncache = TRUE;
1603
+ pPackage->fPlannedUncache = TRUE;
1604
1605
if (pPackage->fCanAffectRegistration)
1606
{
@@ -1622,8 +1615,7 @@ LExit:
1615
extern "C" HRESULT PlanExecuteCacheSyncAndRollback(
1616
__in BURN_PLAN* pPlan,
1617
__in BURN_PACKAGE* pPackage,
1625
- __in HANDLE hCacheEvent,
1626
- __in BOOL fPlanPackageCacheRollback
1618
+ __in HANDLE hCacheEvent
1619
)
1620
{
1621
HRESULT hr = S_OK;
@@ -1635,17 +1627,14 @@ extern "C" HRESULT PlanExecuteCacheSyncAndRollback(
1627
pAction->type = BURN_EXECUTE_ACTION_TYPE_WAIT_SYNCPOINT;
1628
pAction->syncpoint.hEvent = hCacheEvent;
1629
1638
- if (fPlanPackageCacheRollback)
1639
- {
1640
- hr = PlanAppendRollbackAction(pPlan, &pAction);
1641
- ExitOnFailure(hr, "Failed to append rollback action.");
1630
+ hr = PlanAppendRollbackAction(pPlan, &pAction);
1631
+ ExitOnFailure(hr, "Failed to append rollback action.");
1632
1643
- pAction->type = BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE;
1644
- pAction->uncachePackage.pPackage = pPackage;
1633
+ pAction->type = BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE;
1634
+ pAction->uncachePackage.pPackage = pPackage;
1635
1646
- hr = PlanExecuteCheckpoint(pPlan);
1647
- ExitOnFailure(hr, "Failed to append execute checkpoint for cache rollback.");
1648
- }
1636
+ hr = PlanExecuteCheckpoint(pPlan);
1637
+ ExitOnFailure(hr, "Failed to append execute checkpoint for cache rollback.");
1638
1639
LExit:
1640
return hr;
@@ -1895,8 +1884,8 @@ static void ResetPlannedPackageState(
1884
// Reset package state that is a result of planning.
1885
pPackage->defaultRequested = BOOTSTRAPPER_REQUEST_STATE_NONE;
1886
pPackage->requested = BOOTSTRAPPER_REQUEST_STATE_NONE;
1898
- pPackage->fAcquire = FALSE;
1899
- pPackage->fUncache = FALSE;
1887
+ pPackage->fPlannedCache = FALSE;
1888
+ pPackage->fPlannedUncache = FALSE;
1889
pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE;
1890
pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
1891
pPackage->providerExecute = BURN_DEPENDENCY_ACTION_NONE;
@@ -2191,10 +2180,7 @@ static HRESULT AddCachePackageHelper(
2180
2181
++pPlan->cOverallProgressTicksTotal;
2182
2194
- // If the package was not already fully cached then note that we planned the cache here. Otherwise, we only
2195
- // did cache operations to verify the cache is valid so we did not plan the acquisition of the package.
2196
- pPackage->fAcquire = (BURN_CACHE_STATE_COMPLETE != pPackage->cache);
2197
-
2183
+ pPackage->fPlannedCache = TRUE;
2184
if (pPackage->fCanAffectRegistration)
2185
{
2186
pPackage->expectedCacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT;
src/engine/plan.h
+4
-9
@@ -411,8 +411,7 @@ HRESULT PlanPackages(
411
__in BURN_VARIABLES* pVariables,
412
__in BOOTSTRAPPER_DISPLAY display,
413
__in BOOTSTRAPPER_RELATION_TYPE relationType,
414
- __in_z_opt LPCWSTR wzLayoutDirectory,
415
- __inout HANDLE* phSyncpointEvent
414
+ __in_z_opt LPCWSTR wzLayoutDirectory
415
);
416
HRESULT PlanRegistration(
417
__in BURN_PLAN* pPlan,
@@ -428,8 +427,7 @@ HRESULT PlanPassThroughBundle(
427
__in BURN_LOGGING* pLog,
428
__in BURN_VARIABLES* pVariables,
429
__in BOOTSTRAPPER_DISPLAY display,
431
- __in BOOTSTRAPPER_RELATION_TYPE relationType,
432
- __inout HANDLE* phSyncpointEvent
430
+ __in BOOTSTRAPPER_RELATION_TYPE relationType
431
);
432
HRESULT PlanUpdateBundle(
433
__in BURN_USER_EXPERIENCE* pUX,
@@ -438,8 +436,7 @@ HRESULT PlanUpdateBundle(
436
__in BURN_LOGGING* pLog,
437
__in BURN_VARIABLES* pVariables,
438
__in BOOTSTRAPPER_DISPLAY display,
441
- __in BOOTSTRAPPER_RELATION_TYPE relationType,
442
- __inout HANDLE* phSyncpointEvent
439
+ __in BOOTSTRAPPER_RELATION_TYPE relationType
440
);
441
HRESULT PlanLayoutPackage(
442
__in BURN_PLAN* pPlan,
@@ -475,7 +472,6 @@ HRESULT PlanRelatedBundlesComplete(
472
__in BURN_PLAN* pPlan,
473
__in BURN_LOGGING* pLog,
474
__in BURN_VARIABLES* pVariables,
478
- __inout HANDLE* phSyncpointEvent,
475
__in DWORD dwExecuteActionEarlyIndex
476
);
477
HRESULT PlanFinalizeActions(
@@ -488,8 +484,7 @@ HRESULT PlanCleanPackage(
484
HRESULT PlanExecuteCacheSyncAndRollback(
485
__in BURN_PLAN* pPlan,
486
__in BURN_PACKAGE* pPackage,
491
- __in HANDLE hCacheEvent,
492
- __in BOOL fPlanPackageCacheRollback
487
+ __in HANDLE hCacheEvent
488
);
489
HRESULT PlanExecuteCheckpoint(
490
__in BURN_PLAN* pPlan
src/engine/pseudobundle.cpp
+4
-4
@@ -10,7 +10,7 @@ extern "C" HRESULT PseudoBundleInitialize(
10
__in_z LPCWSTR wzId,
11
__in BOOTSTRAPPER_RELATION_TYPE relationType,
12
__in BOOTSTRAPPER_PACKAGE_STATE state,
13
- __in BURN_CACHE_STATE cacheState,
13
+ __in BOOL fCached,
14
__in_z LPCWSTR wzFilePath,
15
__in_z LPCWSTR wzLocalSource,
16
__in_z_opt LPCWSTR wzDownloadSource,
@@ -67,14 +67,14 @@ extern "C" HRESULT PseudoBundleInitialize(
67
memcpy_s(pPackage->rgPayloads->pPayload->pbHash, pPackage->rgPayloads->pPayload->cbHash, pbHash, cbHash);
68
}
69
70
- pPackage->rgPayloads->fCached = BURN_CACHE_STATE_NONE < cacheState;
70
+ pPackage->rgPayloads->fCached = fCached;
71
72
pPackage->Exe.fPseudoBundle = TRUE;
73
74
pPackage->type = BURN_PACKAGE_TYPE_EXE;
75
pPackage->fPerMachine = fPerMachine;
76
pPackage->currentState = state;
77
- pPackage->cache = cacheState;
77
+ pPackage->fCached = fCached;
78
pPackage->qwInstallSize = qwSize;
79
pPackage->qwSize = qwSize;
80
pPackage->fVital = fVital;
@@ -216,7 +216,7 @@ extern "C" HRESULT PseudoBundleInitializePassthrough(
216
pPassthroughPackage->fPerMachine = FALSE; // passthrough bundles are always launched per-user.
217
pPassthroughPackage->type = pPackage->type;
218
pPassthroughPackage->currentState = pPackage->currentState;
219
- pPassthroughPackage->cache = pPackage->cache;
219
+ pPassthroughPackage->fCached = pPackage->fCached;
220
pPassthroughPackage->qwInstallSize = pPackage->qwInstallSize;
221
pPassthroughPackage->qwSize = pPackage->qwSize;
222
pPassthroughPackage->fVital = pPackage->fVital;
src/engine/pseudobundle.h
+1
-1
@@ -13,7 +13,7 @@ HRESULT PseudoBundleInitialize(
13
__in_z LPCWSTR wzId,
14
__in BOOTSTRAPPER_RELATION_TYPE relationType,
15
__in BOOTSTRAPPER_PACKAGE_STATE state,
16
- __in BURN_CACHE_STATE cacheState,
16
+ __in BOOL fCached,
17
__in_z LPCWSTR wzFilePath,
18
__in_z LPCWSTR wzLocalSource,
19
__in_z_opt LPCWSTR wzDownloadSource,
src/engine/relatedbundle.cpp
+8
-11
@@ -391,14 +391,14 @@ static HRESULT LoadRelatedBundleFromKey(
391
__in HKEY hkBundleId,
392
__in BOOL fPerMachine,
393
__in BOOTSTRAPPER_RELATION_TYPE relationType,
394
- __inout BURN_RELATED_BUNDLE *pRelatedBundle
394
+ __inout BURN_RELATED_BUNDLE* pRelatedBundle
395
)
396
{
397
HRESULT hr = S_OK;
398
DWORD64 qwEngineVersion = 0;
399
LPWSTR sczBundleVersion = NULL;
400
LPWSTR sczCachePath = NULL;
401
- BURN_CACHE_STATE cacheState = BURN_CACHE_STATE_NONE;
401
+ BOOL fCached = FALSE;
402
DWORD64 qwFileSize = 0;
403
BURN_DEPENDENCY_PROVIDER dependencyProvider = { };
404
@@ -423,19 +423,16 @@ static HRESULT LoadRelatedBundleFromKey(
423
hr = RegReadString(hkBundleId, BURN_REGISTRATION_REGISTRY_BUNDLE_CACHE_PATH, &sczCachePath);
424
ExitOnFailure(hr, "Failed to read cache path from registry for bundle: %ls", wzRelatedBundleId);
425
426
- hr = FileSize(sczCachePath, reinterpret_cast<LONGLONG *>(&qwFileSize));
427
- if (SUCCEEDED(hr))
426
+ if (FileExistsEx(sczCachePath, NULL))
427
{
429
- cacheState = BURN_CACHE_STATE_COMPLETE;
428
+ fCached = TRUE;
429
}
431
- else if (E_FILENOTFOUND != hr)
430
+ else
431
{
433
- cacheState = BURN_CACHE_STATE_PARTIAL;
434
- LogId(REPORT_STANDARD, MSG_DETECT_RELATED_BUNDLE_NOT_FULLY_CACHED, wzRelatedBundleId, sczCachePath, hr);
432
+ LogId(REPORT_STANDARD, MSG_DETECT_RELATED_BUNDLE_NOT_CACHED, wzRelatedBundleId, sczCachePath);
433
}
436
- hr = S_OK;
434
438
- pRelatedBundle->fPlannable = BURN_CACHE_STATE_COMPLETE == cacheState;
435
+ pRelatedBundle->fPlannable = fCached;
436
437
hr = RegReadString(hkBundleId, BURN_REGISTRATION_REGISTRY_BUNDLE_PROVIDER_KEY, &dependencyProvider.sczKey);
438
if (E_FILENOTFOUND != hr)
@@ -464,7 +461,7 @@ static HRESULT LoadRelatedBundleFromKey(
461
pRelatedBundle->relationType = relationType;
462
463
hr = PseudoBundleInitialize(qwEngineVersion, &pRelatedBundle->package, fPerMachine, wzRelatedBundleId, pRelatedBundle->relationType,
467
- BOOTSTRAPPER_PACKAGE_STATE_PRESENT, cacheState, sczCachePath, sczCachePath, NULL, qwFileSize, FALSE,
464
+ BOOTSTRAPPER_PACKAGE_STATE_PRESENT, fCached, sczCachePath, sczCachePath, NULL, qwFileSize, FALSE,
465
L"-quiet", L"-repair -quiet", L"-uninstall -quiet",
466
(dependencyProvider.sczKey && *dependencyProvider.sczKey) ? &dependencyProvider : NULL,
467
NULL, 0);
src/test/BurnUnitTest/PlanTest.cpp
+3
-4
@@ -127,7 +127,6 @@ namespace Bootstrapper
127
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
128
ValidateExecuteCommitMsiTransaction(pPlan, fRollback, dwIndex++, L"rbaOCA08D8ky7uBOK71_6FWz1K3TuQ");
129
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
130
- ValidateExecuteWaitSyncpoint(pPlan, fRollback, dwIndex++, pPlan->rgCacheActions[23].syncpoint.hEvent);
130
ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, NULL);
131
Assert::Equal(dwIndex, pPlan->cExecuteActions);
132
@@ -509,7 +508,6 @@ namespace Bootstrapper
508
ValidateExecutePackageDependency(pPlan, fRollback, dwIndex++, L"PackageA", L"{A6F0CBF7-1578-450C-B9D7-9CF2EEC40002}", BURN_DEPENDENCY_ACTION_REGISTER);
509
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
510
ValidateExecuteCheckpoint(pPlan, fRollback, dwIndex++, dwExecuteCheckpointId++);
512
- ValidateExecuteWaitSyncpoint(pPlan, fRollback, dwIndex++, pPlan->rgCacheActions[6].syncpoint.hEvent);
511
ValidateExecuteExePackage(pPlan, fRollback, dwIndex++, L"{FD9920AD-DBCA-4C6C-8CD5-B47431CE8D21}", BOOTSTRAPPER_ACTION_STATE_UNINSTALL, NULL);
512
Assert::Equal(dwIndex, pPlan->cExecuteActions);
513
@@ -593,6 +591,7 @@ namespace Bootstrapper
591
Assert::Equal(0ul, pPlan->cOverallProgressTicksTotal);
592
593
dwIndex = 0;
594
+ ValidateCleanAction(pPlan, dwIndex++, L"PackageA");
595
Assert::Equal(dwIndex, pPlan->cCleanActions);
596
597
UINT uIndex = 0;
@@ -1042,7 +1041,7 @@ namespace Bootstrapper
1041
void DetectPackageAsPresentAndCached(BURN_PACKAGE* pPackage)
1042
{
1043
pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT;
1045
- pPackage->cache = BURN_CACHE_STATE_COMPLETE;
1044
+ pPackage->fCached = TRUE;
1045
if (pPackage->fCanAffectRegistration)
1046
{
1047
pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT;
@@ -1158,7 +1157,7 @@ namespace Bootstrapper
1157
pRelatedBundle->fPlannable = TRUE;
1158
pRelatedBundle->relationType = BOOTSTRAPPER_RELATION_UPGRADE;
1159
1161
- hr = PseudoBundleInitialize(0, &pRelatedBundle->package, TRUE, wzId, pRelatedBundle->relationType, BOOTSTRAPPER_PACKAGE_STATE_PRESENT, BURN_CACHE_STATE_COMPLETE, NULL, NULL, NULL, 0, FALSE, L"-quiet", L"-repair -quiet", L"-uninstall -quiet", &dependencyProvider, NULL, 0);
1160
+ hr = PseudoBundleInitialize(0, &pRelatedBundle->package, TRUE, wzId, pRelatedBundle->relationType, BOOTSTRAPPER_PACKAGE_STATE_PRESENT, TRUE, NULL, NULL, NULL, 0, FALSE, L"-quiet", L"-repair -quiet", L"-uninstall -quiet", &dependencyProvider, NULL, 0);
1161
NativeAssert::Succeeded(hr, "Failed to initialize related bundle to represent bundle: %ls", wzId);
1162
1163
++pRelatedBundles->cRelatedBundles;