aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/burn/engine/core.cpp27
-rw-r--r--src/burn/engine/dependency.cpp73
-rw-r--r--src/burn/engine/dependency.h13
-rw-r--r--src/burn/engine/exeengine.cpp4
-rw-r--r--src/burn/engine/exeengine.h1
-rw-r--r--src/burn/engine/msiengine.cpp4
-rw-r--r--src/burn/engine/msiengine.h1
-rw-r--r--src/burn/engine/mspengine.cpp4
-rw-r--r--src/burn/engine/mspengine.h1
-rw-r--r--src/burn/engine/msuengine.cpp4
-rw-r--r--src/burn/engine/msuengine.h1
-rw-r--r--src/burn/engine/relatedbundle.cpp3
-rw-r--r--src/libs/dutil/WixToolset.DUtil/deputil.cpp19
-rw-r--r--src/libs/dutil/WixToolset.DUtil/inc/deputil.h2
14 files changed, 97 insertions, 60 deletions
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(
342 hr = SearchesExecute(&pEngineState->searches, &pEngineState->variables); 342 hr = SearchesExecute(&pEngineState->searches, &pEngineState->variables);
343 ExitOnFailure(hr, "Failed to execute searches."); 343 ExitOnFailure(hr, "Failed to execute searches.");
344 344
345 hr = DependencyDetectBundle(&pEngineState->dependencies, &pEngineState->registration);
346 ExitOnFailure(hr, "Failed to detect the dependencies.");
347
345 // Load all of the related bundles. 348 // Load all of the related bundles.
346 hr = RegistrationDetectRelatedBundles(&pEngineState->registration); 349 hr = RegistrationDetectRelatedBundles(&pEngineState->registration);
347 ExitOnFailure(hr, "Failed to detect related bundles."); 350 ExitOnFailure(hr, "Failed to detect related bundles.");
348 351
349 hr = DependencyDetectProviderKeyBundleId(&pEngineState->registration); 352 hr = DetectForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->registration);
350 if (SUCCEEDED(hr)) 353 ExitOnFailure(hr, "Failed to detect forward compatible bundle.");
351 {
352 hr = DetectForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->registration);
353 ExitOnFailure(hr, "Failed to detect forward compatible bundle.");
354 }
355 else if (E_NOTFOUND == hr)
356 {
357 hr = S_OK;
358 }
359 ExitOnFailure(hr, "Failed to detect provider key bundle id.");
360 354
361 // Report the related bundles. 355 // Report the related bundles.
362 hr = DetectReportRelatedBundles(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->registration.fEligibleForCleanup); 356 hr = DetectReportRelatedBundles(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->registration.fEligibleForCleanup);
@@ -398,9 +392,6 @@ extern "C" HRESULT CoreDetect(
398 } 392 }
399 } 393 }
400 394
401 hr = DependencyDetect(&pEngineState->dependencies, &pEngineState->packages, &pEngineState->registration);
402 ExitOnFailure(hr, "Failed to detect the dependencies.");
403
404 // Log the detected states. 395 // Log the detected states.
405 for (DWORD iPackage = 0; iPackage < pEngineState->packages.cPackages; ++iPackage) 396 for (DWORD iPackage = 0; iPackage < pEngineState->packages.cPackages; ++iPackage)
406 { 397 {
@@ -2073,19 +2064,19 @@ static HRESULT DetectPackage(
2073 switch (pPackage->type) 2064 switch (pPackage->type)
2074 { 2065 {
2075 case BURN_PACKAGE_TYPE_EXE: 2066 case BURN_PACKAGE_TYPE_EXE:
2076 hr = ExeEngineDetectPackage(pPackage, &pEngineState->variables); 2067 hr = ExeEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->variables);
2077 break; 2068 break;
2078 2069
2079 case BURN_PACKAGE_TYPE_MSI: 2070 case BURN_PACKAGE_TYPE_MSI:
2080 hr = MsiEngineDetectPackage(pPackage, &pEngineState->userExperience); 2071 hr = MsiEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->userExperience);
2081 break; 2072 break;
2082 2073
2083 case BURN_PACKAGE_TYPE_MSP: 2074 case BURN_PACKAGE_TYPE_MSP:
2084 hr = MspEngineDetectPackage(pPackage, &pEngineState->userExperience); 2075 hr = MspEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->userExperience);
2085 break; 2076 break;
2086 2077
2087 case BURN_PACKAGE_TYPE_MSU: 2078 case BURN_PACKAGE_TYPE_MSU:
2088 hr = MsuEngineDetectPackage(pPackage, &pEngineState->variables); 2079 hr = MsuEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->variables);
2089 break; 2080 break;
2090 2081
2091 default: 2082 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";";
12 12
13static HRESULT DetectPackageDependents( 13static HRESULT DetectPackageDependents(
14 __in BURN_PACKAGE* pPackage, 14 __in BURN_PACKAGE* pPackage,
15 __in STRINGDICT_HANDLE sdIgnoredDependents,
16 __in const BURN_REGISTRATION* pRegistration 15 __in const BURN_REGISTRATION* pRegistration
17 ); 16 );
18 17
@@ -232,7 +231,8 @@ extern "C" HRESULT DependencyDetectProviderKeyBundleId(
232 hr = DepGetProviderInformation(pRegistration->hkRoot, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleId, NULL, NULL); 231 hr = DepGetProviderInformation(pRegistration->hkRoot, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleId, NULL, NULL);
233 if (E_NOTFOUND == hr) 232 if (E_NOTFOUND == hr)
234 { 233 {
235 ExitFunction(); 234 ReleaseNullStr(pRegistration->sczDetectedProviderKeyBundleId);
235 ExitFunction1(hr = S_OK);
236 } 236 }
237 ExitOnFailure(hr, "Failed to get provider key bundle id."); 237 ExitOnFailure(hr, "Failed to get provider key bundle id.");
238 238
@@ -247,50 +247,26 @@ LExit:
247 return hr; 247 return hr;
248} 248}
249 249
250extern "C" HRESULT DependencyDetect( 250extern "C" HRESULT DependencyDetectBundle(
251 __in BURN_DEPENDENCIES* pDependencies, 251 __in BURN_DEPENDENCIES* pDependencies,
252 __in BURN_PACKAGES* pPackages,
253 __in BURN_REGISTRATION* pRegistration 252 __in BURN_REGISTRATION* pRegistration
254 ) 253 )
255{ 254{
256 HRESULT hr = S_OK; 255 HRESULT hr = S_OK;
257 STRINGDICT_HANDLE sdIgnoredDependents = NULL;
258 BURN_PACKAGE* pPackage = NULL;
259 256
260 // Always leave this empty so that all dependents get detected. Plan will ignore dependents based on its own logic. 257 hr = DependencyDetectProviderKeyBundleId(pRegistration);
261 hr = DictCreateStringList(&sdIgnoredDependents, INITIAL_STRINGDICT_SIZE, DICT_FLAG_CASEINSENSITIVE); 258 ExitOnFailure(hr, "Failed to detect provider key bundle id.");
262 ExitOnFailure(hr, "Failed to create the string dictionary.");
263 259
264 hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, sdIgnoredDependents, &pRegistration->rgDependents, &pRegistration->cDependents); 260 hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, NULL, &pRegistration->rgDependents, &pRegistration->cDependents);
265 if (E_FILENOTFOUND != hr) 261 if (E_FILENOTFOUND != hr)
266 { 262 {
267 ExitOnFailure(hr, "Failed dependents check on bundle"); 263 ExitOnFailure(hr, "Failed dependents check on bundle.");
268 } 264 }
269 else 265 else
270 { 266 {
271 hr = S_OK; 267 hr = S_OK;
272 } 268 }
273 269
274 for (DWORD iPackage = 0; iPackage < pPackages->cPackages; ++iPackage)
275 {
276 pPackage = pPackages->rgPackages + iPackage;
277 hr = DetectPackageDependents(pPackage, sdIgnoredDependents, pRegistration);
278 ExitOnFailure(hr, "Failed to detect dependents for package '%ls'", pPackage->sczId);
279 }
280
281 for (DWORD iRelatedBundle = 0; iRelatedBundle < pRegistration->relatedBundles.cRelatedBundles; ++iRelatedBundle)
282 {
283 BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + iRelatedBundle;
284 if (!pRelatedBundle->fPlannable)
285 {
286 continue;
287 }
288
289 pPackage = &pRelatedBundle->package;
290 hr = DetectPackageDependents(pPackage, sdIgnoredDependents, pRegistration);
291 ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId);
292 }
293
294 if (pDependencies->fSelfDependent || pDependencies->fActiveParent) 270 if (pDependencies->fSelfDependent || pDependencies->fActiveParent)
295 { 271 {
296 for (DWORD i = 0; i < pRegistration->cDependents; ++i) 272 for (DWORD i = 0; i < pRegistration->cDependents; ++i)
@@ -310,8 +286,38 @@ extern "C" HRESULT DependencyDetect(
310 } 286 }
311 287
312LExit: 288LExit:
313 ReleaseDict(sdIgnoredDependents); 289 return hr;
290}
291
292extern "C" HRESULT DependencyDetectChainPackage(
293 __in BURN_PACKAGE* pPackage,
294 __in BURN_REGISTRATION* pRegistration
295 )
296{
297 HRESULT hr = S_OK;
298
299 hr = DetectPackageDependents(pPackage, pRegistration);
300 ExitOnFailure(hr, "Failed to detect dependents for package '%ls'", pPackage->sczId);
314 301
302LExit:
303 return hr;
304}
305
306extern "C" HRESULT DependencyDetectRelatedBundle(
307 __in BURN_RELATED_BUNDLE* pRelatedBundle,
308 __in BURN_REGISTRATION* pRegistration
309 )
310{
311 HRESULT hr = S_OK;
312 BURN_PACKAGE* pPackage = &pRelatedBundle->package;
313
314 if (pRelatedBundle->fPlannable)
315 {
316 hr = DetectPackageDependents(pPackage, pRegistration);
317 ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId);
318 }
319
320LExit:
315 return hr; 321 return hr;
316} 322}
317 323
@@ -738,7 +744,6 @@ extern "C" void DependencyUnregisterBundle(
738 744
739static HRESULT DetectPackageDependents( 745static HRESULT DetectPackageDependents(
740 __in BURN_PACKAGE* pPackage, 746 __in BURN_PACKAGE* pPackage,
741 __in STRINGDICT_HANDLE sdIgnoredDependents,
742 __in const BURN_REGISTRATION* pRegistration 747 __in const BURN_REGISTRATION* pRegistration
743 ) 748 )
744{ 749{
@@ -759,7 +764,7 @@ static HRESULT DetectPackageDependents(
759 { 764 {
760 BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; 765 BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i];
761 766
762 hr = DepCheckDependents(hkHive, pProvider->sczKey, 0, sdIgnoredDependents, &pProvider->rgDependents, &pProvider->cDependents); 767 hr = DepCheckDependents(hkHive, pProvider->sczKey, 0, NULL, &pProvider->rgDependents, &pProvider->cDependents);
763 if (E_FILENOTFOUND != hr) 768 if (E_FILENOTFOUND != hr)
764 { 769 {
765 ExitOnFailure(hr, "Failed dependents check on package provider: %ls", pProvider->sczKey); 770 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(
68 DependencyDetect - Detects dependency information. 68 DependencyDetect - Detects dependency information.
69 69
70*********************************************************************/ 70*********************************************************************/
71HRESULT DependencyDetect( 71HRESULT DependencyDetectBundle(
72 __in BURN_DEPENDENCIES* pDependencies, 72 __in BURN_DEPENDENCIES* pDependencies,
73 __in BURN_PACKAGES* pPackages, 73 __in BURN_REGISTRATION* pRegistration
74 );
75
76HRESULT DependencyDetectChainPackage(
77 __in BURN_PACKAGE* pPackage,
78 __in BURN_REGISTRATION* pRegistration
79 );
80
81HRESULT DependencyDetectRelatedBundle(
82 __in BURN_RELATED_BUNDLE* pRelatedBundle,
74 __in BURN_REGISTRATION* pRegistration 83 __in BURN_REGISTRATION* pRegistration
75 ); 84 );
76 85
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(
115 115
116extern "C" HRESULT ExeEngineDetectPackage( 116extern "C" HRESULT ExeEngineDetectPackage(
117 __in BURN_PACKAGE* pPackage, 117 __in BURN_PACKAGE* pPackage,
118 __in BURN_REGISTRATION* pRegistration,
118 __in BURN_VARIABLES* pVariables 119 __in BURN_VARIABLES* pVariables
119 ) 120 )
120{ 121{
@@ -136,6 +137,9 @@ extern "C" HRESULT ExeEngineDetectPackage(
136 pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; 137 pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
137 } 138 }
138 139
140 hr = DependencyDetectChainPackage(pPackage, pRegistration);
141 ExitOnFailure(hr, "Failed to detect dependencies for EXE package.");
142
139LExit: 143LExit:
140 return hr; 144 return hr;
141} 145}
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(
21 ); 21 );
22HRESULT ExeEngineDetectPackage( 22HRESULT ExeEngineDetectPackage(
23 __in BURN_PACKAGE* pPackage, 23 __in BURN_PACKAGE* pPackage,
24 __in BURN_REGISTRATION* pRegistration,
24 __in BURN_VARIABLES* pVariables 25 __in BURN_VARIABLES* pVariables
25 ); 26 );
26HRESULT ExeEnginePlanCalculatePackage( 27HRESULT 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:
432 432
433extern "C" HRESULT MsiEngineDetectPackage( 433extern "C" HRESULT MsiEngineDetectPackage(
434 __in BURN_PACKAGE* pPackage, 434 __in BURN_PACKAGE* pPackage,
435 __in BURN_REGISTRATION* pRegistration,
435 __in BURN_USER_EXPERIENCE* pUserExperience 436 __in BURN_USER_EXPERIENCE* pUserExperience
436 ) 437 )
437{ 438{
@@ -704,6 +705,9 @@ extern "C" HRESULT MsiEngineDetectPackage(
704 pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; 705 pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
705 } 706 }
706 707
708 hr = DependencyDetectChainPackage(pPackage, pRegistration);
709 ExitOnFailure(hr, "Failed to detect dependencies for MSI package.");
710
707LExit: 711LExit:
708 ReleaseStr(sczInstalledLanguage); 712 ReleaseStr(sczInstalledLanguage);
709 ReleaseStr(sczInstalledVersion); 713 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(
32 ); 32 );
33HRESULT MsiEngineDetectPackage( 33HRESULT MsiEngineDetectPackage(
34 __in BURN_PACKAGE* pPackage, 34 __in BURN_PACKAGE* pPackage,
35 __in BURN_REGISTRATION* pRegistration,
35 __in BURN_USER_EXPERIENCE* pUserExperience 36 __in BURN_USER_EXPERIENCE* pUserExperience
36 ); 37 );
37HRESULT MsiEnginePlanInitializePackage( 38HRESULT 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:
250 250
251extern "C" HRESULT MspEngineDetectPackage( 251extern "C" HRESULT MspEngineDetectPackage(
252 __in BURN_PACKAGE* pPackage, 252 __in BURN_PACKAGE* pPackage,
253 __in BURN_REGISTRATION* pRegistration,
253 __in BURN_USER_EXPERIENCE* pUserExperience 254 __in BURN_USER_EXPERIENCE* pUserExperience
254 ) 255 )
255{ 256{
@@ -328,6 +329,9 @@ extern "C" HRESULT MspEngineDetectPackage(
328 } 329 }
329 } 330 }
330 331
332 hr = DependencyDetectChainPackage(pPackage, pRegistration);
333 ExitOnFailure(hr, "Failed to detect dependencies for MSP package.");
334
331LExit: 335LExit:
332 ReleaseStr(sczState); 336 ReleaseStr(sczState);
333 337
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(
41 ); 41 );
42HRESULT MspEngineDetectPackage( 42HRESULT MspEngineDetectPackage(
43 __in BURN_PACKAGE* pPackage, 43 __in BURN_PACKAGE* pPackage,
44 __in BURN_REGISTRATION* pRegistration,
44 __in BURN_USER_EXPERIENCE* pUserExperience 45 __in BURN_USER_EXPERIENCE* pUserExperience
45 ); 46 );
46HRESULT MspEnginePlanInitializePackage( 47HRESULT 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(
53 53
54extern "C" HRESULT MsuEngineDetectPackage( 54extern "C" HRESULT MsuEngineDetectPackage(
55 __in BURN_PACKAGE* pPackage, 55 __in BURN_PACKAGE* pPackage,
56 __in BURN_REGISTRATION* pRegistration,
56 __in BURN_VARIABLES* pVariables 57 __in BURN_VARIABLES* pVariables
57 ) 58 )
58{ 59{
@@ -74,6 +75,9 @@ extern "C" HRESULT MsuEngineDetectPackage(
74 pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT; 75 pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
75 } 76 }
76 77
78 hr = DependencyDetectChainPackage(pPackage, pRegistration);
79 ExitOnFailure(hr, "Failed to detect dependencies for MSU package.");
80
77LExit: 81LExit:
78 return hr; 82 return hr;
79} 83}
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(
18 ); 18 );
19HRESULT MsuEngineDetectPackage( 19HRESULT MsuEngineDetectPackage(
20 __in BURN_PACKAGE* pPackage, 20 __in BURN_PACKAGE* pPackage,
21 __in BURN_REGISTRATION* pRegistration,
21 __in BURN_VARIABLES* pVariables 22 __in BURN_VARIABLES* pVariables
22 ); 23 );
23HRESULT MsuEnginePlanCalculatePackage( 24HRESULT 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(
244 hr = LoadRelatedBundleFromKey(sczRelatedBundleId, hkBundleId, fPerMachine, relationType, pRelatedBundle); 244 hr = LoadRelatedBundleFromKey(sczRelatedBundleId, hkBundleId, fPerMachine, relationType, pRelatedBundle);
245 ExitOnFailure(hr, "Failed to initialize package from related bundle id: %ls", sczRelatedBundleId); 245 ExitOnFailure(hr, "Failed to initialize package from related bundle id: %ls", sczRelatedBundleId);
246 246
247 hr = DependencyDetectRelatedBundle(pRelatedBundle, pRegistration);
248 ExitOnFailure(hr, "Failed to detect dependencies for related bundle.");
249
247 ++pRelatedBundles->cRelatedBundles; 250 ++pRelatedBundles->cRelatedBundles;
248 } 251 }
249 252
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(
246 __in HKEY hkHive, 246 __in HKEY hkHive,
247 __in_z LPCWSTR wzProviderKey, 247 __in_z LPCWSTR wzProviderKey,
248 __reserved int /*iAttributes*/, 248 __reserved int /*iAttributes*/,
249 __in C_STRINGDICT_HANDLE sdIgnoredDependents, 249 __in_opt C_STRINGDICT_HANDLE sdIgnoredDependents,
250 __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents, 250 __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents,
251 __inout LPUINT pcDependents 251 __inout LPUINT pcDependents
252 ) 252 )
@@ -257,6 +257,7 @@ DAPI_(HRESULT) DepCheckDependents(
257 HKEY hkDependentsKey = NULL; 257 HKEY hkDependentsKey = NULL;
258 LPWSTR sczDependentKey = NULL; 258 LPWSTR sczDependentKey = NULL;
259 LPWSTR sczDependentName = NULL; 259 LPWSTR sczDependentName = NULL;
260 BOOL fIgnore = FALSE;
260 261
261 // Format the provider dependency registry key. 262 // Format the provider dependency registry key.
262 hr = AllocDependencyKeyName(wzProviderKey, &sczKey); 263 hr = AllocDependencyKeyName(wzProviderKey, &sczKey);
@@ -280,6 +281,8 @@ DAPI_(HRESULT) DepCheckDependents(
280 // Now enumerate the dependent keys. If they are not defined in the ignored list, add them to the array. 281 // Now enumerate the dependent keys. If they are not defined in the ignored list, add them to the array.
281 for (DWORD dwIndex = 0; ; ++dwIndex) 282 for (DWORD dwIndex = 0; ; ++dwIndex)
282 { 283 {
284 fIgnore = FALSE;
285
283 hr = RegKeyEnum(hkDependentsKey, dwIndex, &sczDependentKey); 286 hr = RegKeyEnum(hkDependentsKey, dwIndex, &sczDependentKey);
284 if (E_NOMOREITEMS != hr) 287 if (E_NOMOREITEMS != hr)
285 { 288 {
@@ -292,12 +295,18 @@ DAPI_(HRESULT) DepCheckDependents(
292 } 295 }
293 296
294 // If the key isn't ignored, add it to the dependent array. 297 // If the key isn't ignored, add it to the dependent array.
295 hr = DictKeyExists(sdIgnoredDependents, sczDependentKey); 298 if (sdIgnoredDependents)
296 if (E_NOTFOUND != hr)
297 { 299 {
298 DepExitOnFailure(hr, "Failed to check the dictionary of ignored dependents."); 300 hr = DictKeyExists(sdIgnoredDependents, sczDependentKey);
301 if (E_NOTFOUND != hr)
302 {
303 DepExitOnFailure(hr, "Failed to check the dictionary of ignored dependents.");
304
305 fIgnore = TRUE;
306 }
299 } 307 }
300 else 308
309 if (!fIgnore)
301 { 310 {
302 // Get the name of the dependent from the key. 311 // Get the name of the dependent from the key.
303 hr = GetDependencyNameFromKey(hkHive, sczDependentKey, &sczDependentName); 312 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(
56 __in HKEY hkHive, 56 __in HKEY hkHive,
57 __in_z LPCWSTR wzProviderKey, 57 __in_z LPCWSTR wzProviderKey,
58 __reserved int iAttributes, 58 __reserved int iAttributes,
59 __in C_STRINGDICT_HANDLE sdIgnoredDependents, 59 __in_opt C_STRINGDICT_HANDLE sdIgnoredDependents,
60 __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents, 60 __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents,
61 __inout LPUINT pcDependents 61 __inout LPUINT pcDependents
62 ); 62 );