From abe316b80fae80eba54b0b79e76b6362105fa098 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 14 Jan 2022 20:48:01 -0600 Subject: Refactor some dependency detection. * Run DependencyDetect earlier * Do package dependency checking during each package/related bundle --- src/burn/engine/core.cpp | 27 ++++------ src/burn/engine/dependency.cpp | 73 ++++++++++++++------------- src/burn/engine/dependency.h | 13 ++++- src/burn/engine/exeengine.cpp | 4 ++ src/burn/engine/exeengine.h | 1 + src/burn/engine/msiengine.cpp | 4 ++ src/burn/engine/msiengine.h | 1 + src/burn/engine/mspengine.cpp | 4 ++ src/burn/engine/mspengine.h | 1 + src/burn/engine/msuengine.cpp | 4 ++ src/burn/engine/msuengine.h | 1 + src/burn/engine/relatedbundle.cpp | 3 ++ src/libs/dutil/WixToolset.DUtil/deputil.cpp | 19 +++++-- src/libs/dutil/WixToolset.DUtil/inc/deputil.h | 2 +- 14 files changed, 97 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp index 8a181e7c..d70810f2 100644 --- a/src/burn/engine/core.cpp +++ b/src/burn/engine/core.cpp @@ -342,21 +342,15 @@ extern "C" HRESULT CoreDetect( hr = SearchesExecute(&pEngineState->searches, &pEngineState->variables); ExitOnFailure(hr, "Failed to execute searches."); + hr = DependencyDetectBundle(&pEngineState->dependencies, &pEngineState->registration); + ExitOnFailure(hr, "Failed to detect the dependencies."); + // Load all of the related bundles. hr = RegistrationDetectRelatedBundles(&pEngineState->registration); ExitOnFailure(hr, "Failed to detect related bundles."); - hr = DependencyDetectProviderKeyBundleId(&pEngineState->registration); - if (SUCCEEDED(hr)) - { - hr = DetectForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->registration); - ExitOnFailure(hr, "Failed to detect forward compatible bundle."); - } - else if (E_NOTFOUND == hr) - { - hr = S_OK; - } - ExitOnFailure(hr, "Failed to detect provider key bundle id."); + hr = DetectForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->registration); + ExitOnFailure(hr, "Failed to detect forward compatible bundle."); // Report the related bundles. hr = DetectReportRelatedBundles(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->registration.fEligibleForCleanup); @@ -398,9 +392,6 @@ extern "C" HRESULT CoreDetect( } } - hr = DependencyDetect(&pEngineState->dependencies, &pEngineState->packages, &pEngineState->registration); - ExitOnFailure(hr, "Failed to detect the dependencies."); - // Log the detected states. for (DWORD iPackage = 0; iPackage < pEngineState->packages.cPackages; ++iPackage) { @@ -2073,19 +2064,19 @@ static HRESULT DetectPackage( switch (pPackage->type) { case BURN_PACKAGE_TYPE_EXE: - hr = ExeEngineDetectPackage(pPackage, &pEngineState->variables); + hr = ExeEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->variables); break; case BURN_PACKAGE_TYPE_MSI: - hr = MsiEngineDetectPackage(pPackage, &pEngineState->userExperience); + hr = MsiEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->userExperience); break; case BURN_PACKAGE_TYPE_MSP: - hr = MspEngineDetectPackage(pPackage, &pEngineState->userExperience); + hr = MspEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->userExperience); break; case BURN_PACKAGE_TYPE_MSU: - hr = MsuEngineDetectPackage(pPackage, &pEngineState->variables); + hr = MsuEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->variables); break; default: diff --git a/src/burn/engine/dependency.cpp b/src/burn/engine/dependency.cpp index bd86fe11..5d7e1a94 100644 --- a/src/burn/engine/dependency.cpp +++ b/src/burn/engine/dependency.cpp @@ -12,7 +12,6 @@ const LPCWSTR vcszIgnoreDependenciesDelim = L";"; static HRESULT DetectPackageDependents( __in BURN_PACKAGE* pPackage, - __in STRINGDICT_HANDLE sdIgnoredDependents, __in const BURN_REGISTRATION* pRegistration ); @@ -232,7 +231,8 @@ extern "C" HRESULT DependencyDetectProviderKeyBundleId( hr = DepGetProviderInformation(pRegistration->hkRoot, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleId, NULL, NULL); if (E_NOTFOUND == hr) { - ExitFunction(); + ReleaseNullStr(pRegistration->sczDetectedProviderKeyBundleId); + ExitFunction1(hr = S_OK); } ExitOnFailure(hr, "Failed to get provider key bundle id."); @@ -247,50 +247,26 @@ LExit: return hr; } -extern "C" HRESULT DependencyDetect( +extern "C" HRESULT DependencyDetectBundle( __in BURN_DEPENDENCIES* pDependencies, - __in BURN_PACKAGES* pPackages, __in BURN_REGISTRATION* pRegistration ) { HRESULT hr = S_OK; - STRINGDICT_HANDLE sdIgnoredDependents = NULL; - BURN_PACKAGE* pPackage = NULL; - // Always leave this empty so that all dependents get detected. Plan will ignore dependents based on its own logic. - hr = DictCreateStringList(&sdIgnoredDependents, INITIAL_STRINGDICT_SIZE, DICT_FLAG_CASEINSENSITIVE); - ExitOnFailure(hr, "Failed to create the string dictionary."); + hr = DependencyDetectProviderKeyBundleId(pRegistration); + ExitOnFailure(hr, "Failed to detect provider key bundle id."); - hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, sdIgnoredDependents, &pRegistration->rgDependents, &pRegistration->cDependents); + hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, NULL, &pRegistration->rgDependents, &pRegistration->cDependents); if (E_FILENOTFOUND != hr) { - ExitOnFailure(hr, "Failed dependents check on bundle"); + ExitOnFailure(hr, "Failed dependents check on bundle."); } else { hr = S_OK; } - for (DWORD iPackage = 0; iPackage < pPackages->cPackages; ++iPackage) - { - pPackage = pPackages->rgPackages + iPackage; - hr = DetectPackageDependents(pPackage, sdIgnoredDependents, pRegistration); - ExitOnFailure(hr, "Failed to detect dependents for package '%ls'", pPackage->sczId); - } - - for (DWORD iRelatedBundle = 0; iRelatedBundle < pRegistration->relatedBundles.cRelatedBundles; ++iRelatedBundle) - { - BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + iRelatedBundle; - if (!pRelatedBundle->fPlannable) - { - continue; - } - - pPackage = &pRelatedBundle->package; - hr = DetectPackageDependents(pPackage, sdIgnoredDependents, pRegistration); - ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId); - } - if (pDependencies->fSelfDependent || pDependencies->fActiveParent) { for (DWORD i = 0; i < pRegistration->cDependents; ++i) @@ -310,8 +286,38 @@ extern "C" HRESULT DependencyDetect( } LExit: - ReleaseDict(sdIgnoredDependents); + return hr; +} + +extern "C" HRESULT DependencyDetectChainPackage( + __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration + ) +{ + HRESULT hr = S_OK; + + hr = DetectPackageDependents(pPackage, pRegistration); + ExitOnFailure(hr, "Failed to detect dependents for package '%ls'", pPackage->sczId); +LExit: + return hr; +} + +extern "C" HRESULT DependencyDetectRelatedBundle( + __in BURN_RELATED_BUNDLE* pRelatedBundle, + __in BURN_REGISTRATION* pRegistration + ) +{ + HRESULT hr = S_OK; + BURN_PACKAGE* pPackage = &pRelatedBundle->package; + + if (pRelatedBundle->fPlannable) + { + hr = DetectPackageDependents(pPackage, pRegistration); + ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId); + } + +LExit: return hr; } @@ -738,7 +744,6 @@ extern "C" void DependencyUnregisterBundle( static HRESULT DetectPackageDependents( __in BURN_PACKAGE* pPackage, - __in STRINGDICT_HANDLE sdIgnoredDependents, __in const BURN_REGISTRATION* pRegistration ) { @@ -759,7 +764,7 @@ static HRESULT DetectPackageDependents( { BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; - hr = DepCheckDependents(hkHive, pProvider->sczKey, 0, sdIgnoredDependents, &pProvider->rgDependents, &pProvider->cDependents); + hr = DepCheckDependents(hkHive, pProvider->sczKey, 0, NULL, &pProvider->rgDependents, &pProvider->cDependents); if (E_FILENOTFOUND != hr) { ExitOnFailure(hr, "Failed dependents check on package provider: %ls", pProvider->sczKey); diff --git a/src/burn/engine/dependency.h b/src/burn/engine/dependency.h index 3dacaf99..8d7344eb 100644 --- a/src/burn/engine/dependency.h +++ b/src/burn/engine/dependency.h @@ -68,9 +68,18 @@ HRESULT DependencyDetectProviderKeyBundleId( DependencyDetect - Detects dependency information. *********************************************************************/ -HRESULT DependencyDetect( +HRESULT DependencyDetectBundle( __in BURN_DEPENDENCIES* pDependencies, - __in BURN_PACKAGES* pPackages, + __in BURN_REGISTRATION* pRegistration + ); + +HRESULT DependencyDetectChainPackage( + __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration + ); + +HRESULT DependencyDetectRelatedBundle( + __in BURN_RELATED_BUNDLE* pRelatedBundle, __in BURN_REGISTRATION* pRegistration ); diff --git a/src/burn/engine/exeengine.cpp b/src/burn/engine/exeengine.cpp index 45349ed0..27844c69 100644 --- a/src/burn/engine/exeengine.cpp +++ b/src/burn/engine/exeengine.cpp @@ -115,6 +115,7 @@ extern "C" void ExeEngineCommandLineArgumentUninitialize( extern "C" HRESULT ExeEngineDetectPackage( __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration, __in BURN_VARIABLES* pVariables ) { @@ -136,6 +137,9 @@ extern "C" HRESULT ExeEngineDetectPackage( pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; } + hr = DependencyDetectChainPackage(pPackage, pRegistration); + ExitOnFailure(hr, "Failed to detect dependencies for EXE package."); + LExit: return hr; } diff --git a/src/burn/engine/exeengine.h b/src/burn/engine/exeengine.h index bd5d7ea9..743621b7 100644 --- a/src/burn/engine/exeengine.h +++ b/src/burn/engine/exeengine.h @@ -21,6 +21,7 @@ void ExeEngineCommandLineArgumentUninitialize( ); HRESULT ExeEngineDetectPackage( __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration, __in BURN_VARIABLES* pVariables ); HRESULT ExeEnginePlanCalculatePackage( diff --git a/src/burn/engine/msiengine.cpp b/src/burn/engine/msiengine.cpp index adc266f1..87ae77e9 100644 --- a/src/burn/engine/msiengine.cpp +++ b/src/burn/engine/msiengine.cpp @@ -432,6 +432,7 @@ LExit: extern "C" HRESULT MsiEngineDetectPackage( __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration, __in BURN_USER_EXPERIENCE* pUserExperience ) { @@ -704,6 +705,9 @@ extern "C" HRESULT MsiEngineDetectPackage( pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; } + hr = DependencyDetectChainPackage(pPackage, pRegistration); + ExitOnFailure(hr, "Failed to detect dependencies for MSI package."); + LExit: ReleaseStr(sczInstalledLanguage); ReleaseStr(sczInstalledVersion); diff --git a/src/burn/engine/msiengine.h b/src/burn/engine/msiengine.h index 113bf438..fbb251e0 100644 --- a/src/burn/engine/msiengine.h +++ b/src/burn/engine/msiengine.h @@ -32,6 +32,7 @@ HRESULT MsiEngineDetectInitialize( ); HRESULT MsiEngineDetectPackage( __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration, __in BURN_USER_EXPERIENCE* pUserExperience ); HRESULT MsiEnginePlanInitializePackage( diff --git a/src/burn/engine/mspengine.cpp b/src/burn/engine/mspengine.cpp index a88d0cb2..85eb1536 100644 --- a/src/burn/engine/mspengine.cpp +++ b/src/burn/engine/mspengine.cpp @@ -250,6 +250,7 @@ LExit: extern "C" HRESULT MspEngineDetectPackage( __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration, __in BURN_USER_EXPERIENCE* pUserExperience ) { @@ -328,6 +329,9 @@ extern "C" HRESULT MspEngineDetectPackage( } } + hr = DependencyDetectChainPackage(pPackage, pRegistration); + ExitOnFailure(hr, "Failed to detect dependencies for MSP package."); + LExit: ReleaseStr(sczState); diff --git a/src/burn/engine/mspengine.h b/src/burn/engine/mspengine.h index d17d731d..065902f4 100644 --- a/src/burn/engine/mspengine.h +++ b/src/burn/engine/mspengine.h @@ -41,6 +41,7 @@ HRESULT MspEngineAddMissingSlipstreamTarget( ); HRESULT MspEngineDetectPackage( __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration, __in BURN_USER_EXPERIENCE* pUserExperience ); HRESULT MspEnginePlanInitializePackage( diff --git a/src/burn/engine/msuengine.cpp b/src/burn/engine/msuengine.cpp index 693bb64b..4f5f2cd4 100644 --- a/src/burn/engine/msuengine.cpp +++ b/src/burn/engine/msuengine.cpp @@ -53,6 +53,7 @@ extern "C" void MsuEnginePackageUninitialize( extern "C" HRESULT MsuEngineDetectPackage( __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration, __in BURN_VARIABLES* pVariables ) { @@ -74,6 +75,9 @@ extern "C" HRESULT MsuEngineDetectPackage( pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; } + hr = DependencyDetectChainPackage(pPackage, pRegistration); + ExitOnFailure(hr, "Failed to detect dependencies for MSU package."); + LExit: return hr; } diff --git a/src/burn/engine/msuengine.h b/src/burn/engine/msuengine.h index 0d2563e2..964f6744 100644 --- a/src/burn/engine/msuengine.h +++ b/src/burn/engine/msuengine.h @@ -18,6 +18,7 @@ void MsuEnginePackageUninitialize( ); HRESULT MsuEngineDetectPackage( __in BURN_PACKAGE* pPackage, + __in BURN_REGISTRATION* pRegistration, __in BURN_VARIABLES* pVariables ); HRESULT MsuEnginePlanCalculatePackage( diff --git a/src/burn/engine/relatedbundle.cpp b/src/burn/engine/relatedbundle.cpp index 619fa8dd..3e0bc799 100644 --- a/src/burn/engine/relatedbundle.cpp +++ b/src/burn/engine/relatedbundle.cpp @@ -244,6 +244,9 @@ static HRESULT LoadIfRelatedBundle( hr = LoadRelatedBundleFromKey(sczRelatedBundleId, hkBundleId, fPerMachine, relationType, pRelatedBundle); ExitOnFailure(hr, "Failed to initialize package from related bundle id: %ls", sczRelatedBundleId); + hr = DependencyDetectRelatedBundle(pRelatedBundle, pRegistration); + ExitOnFailure(hr, "Failed to detect dependencies for related bundle."); + ++pRelatedBundles->cRelatedBundles; } diff --git a/src/libs/dutil/WixToolset.DUtil/deputil.cpp b/src/libs/dutil/WixToolset.DUtil/deputil.cpp index 754365e9..1a480263 100644 --- a/src/libs/dutil/WixToolset.DUtil/deputil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/deputil.cpp @@ -246,7 +246,7 @@ DAPI_(HRESULT) DepCheckDependents( __in HKEY hkHive, __in_z LPCWSTR wzProviderKey, __reserved int /*iAttributes*/, - __in C_STRINGDICT_HANDLE sdIgnoredDependents, + __in_opt C_STRINGDICT_HANDLE sdIgnoredDependents, __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents, __inout LPUINT pcDependents ) @@ -257,6 +257,7 @@ DAPI_(HRESULT) DepCheckDependents( HKEY hkDependentsKey = NULL; LPWSTR sczDependentKey = NULL; LPWSTR sczDependentName = NULL; + BOOL fIgnore = FALSE; // Format the provider dependency registry key. hr = AllocDependencyKeyName(wzProviderKey, &sczKey); @@ -280,6 +281,8 @@ DAPI_(HRESULT) DepCheckDependents( // Now enumerate the dependent keys. If they are not defined in the ignored list, add them to the array. for (DWORD dwIndex = 0; ; ++dwIndex) { + fIgnore = FALSE; + hr = RegKeyEnum(hkDependentsKey, dwIndex, &sczDependentKey); if (E_NOMOREITEMS != hr) { @@ -292,12 +295,18 @@ DAPI_(HRESULT) DepCheckDependents( } // If the key isn't ignored, add it to the dependent array. - hr = DictKeyExists(sdIgnoredDependents, sczDependentKey); - if (E_NOTFOUND != hr) + if (sdIgnoredDependents) { - DepExitOnFailure(hr, "Failed to check the dictionary of ignored dependents."); + hr = DictKeyExists(sdIgnoredDependents, sczDependentKey); + if (E_NOTFOUND != hr) + { + DepExitOnFailure(hr, "Failed to check the dictionary of ignored dependents."); + + fIgnore = TRUE; + } } - else + + if (!fIgnore) { // Get the name of the dependent from the key. hr = GetDependencyNameFromKey(hkHive, sczDependentKey, &sczDependentName); diff --git a/src/libs/dutil/WixToolset.DUtil/inc/deputil.h b/src/libs/dutil/WixToolset.DUtil/inc/deputil.h index bfe235f3..96f353f6 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/deputil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/deputil.h @@ -56,7 +56,7 @@ DAPI_(HRESULT) DepCheckDependents( __in HKEY hkHive, __in_z LPCWSTR wzProviderKey, __reserved int iAttributes, - __in C_STRINGDICT_HANDLE sdIgnoredDependents, + __in_opt C_STRINGDICT_HANDLE sdIgnoredDependents, __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents, __inout LPUINT pcDependents ); -- cgit v1.2.3-55-g6feb