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