diff options
Diffstat (limited to 'src/burn/engine/relatedbundle.cpp')
| -rw-r--r-- | src/burn/engine/relatedbundle.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/burn/engine/relatedbundle.cpp b/src/burn/engine/relatedbundle.cpp index d3c856a6..4a694ef6 100644 --- a/src/burn/engine/relatedbundle.cpp +++ b/src/burn/engine/relatedbundle.cpp | |||
| @@ -21,7 +21,7 @@ static HRESULT LoadRelatedBundleFromKey( | |||
| 21 | __in HKEY hkBundleId, | 21 | __in HKEY hkBundleId, |
| 22 | __in BOOL fPerMachine, | 22 | __in BOOL fPerMachine, |
| 23 | __in BOOTSTRAPPER_RELATION_TYPE relationType, | 23 | __in BOOTSTRAPPER_RELATION_TYPE relationType, |
| 24 | __inout BURN_RELATED_BUNDLE *pRelatedBundle | 24 | __in BURN_RELATED_BUNDLE *pRelatedBundle |
| 25 | ); | 25 | ); |
| 26 | 26 | ||
| 27 | 27 | ||
| @@ -398,21 +398,34 @@ static HRESULT LoadRelatedBundleFromKey( | |||
| 398 | __in HKEY hkBundleId, | 398 | __in HKEY hkBundleId, |
| 399 | __in BOOL fPerMachine, | 399 | __in BOOL fPerMachine, |
| 400 | __in BOOTSTRAPPER_RELATION_TYPE relationType, | 400 | __in BOOTSTRAPPER_RELATION_TYPE relationType, |
| 401 | __inout BURN_RELATED_BUNDLE* pRelatedBundle | 401 | __in BURN_RELATED_BUNDLE* pRelatedBundle |
| 402 | ) | 402 | ) |
| 403 | { | 403 | { |
| 404 | HRESULT hr = S_OK; | 404 | HRESULT hr = S_OK; |
| 405 | DWORD64 qwEngineVersion = 0; | 405 | DWORD64 qwEngineVersion = 0; |
| 406 | DWORD dwEngineProtocolVersion = 0; | ||
| 407 | BOOL fSupportsBurnProtocol = FALSE; | ||
| 406 | LPWSTR sczBundleVersion = NULL; | 408 | LPWSTR sczBundleVersion = NULL; |
| 407 | LPWSTR sczCachePath = NULL; | 409 | LPWSTR sczCachePath = NULL; |
| 408 | BOOL fCached = FALSE; | 410 | BOOL fCached = FALSE; |
| 409 | DWORD64 qwFileSize = 0; | 411 | DWORD64 qwFileSize = 0; |
| 410 | BURN_DEPENDENCY_PROVIDER dependencyProvider = { }; | 412 | BURN_DEPENDENCY_PROVIDER dependencyProvider = { }; |
| 411 | 413 | ||
| 412 | hr = RegReadVersion(hkBundleId, BURN_REGISTRATION_REGISTRY_ENGINE_VERSION, &qwEngineVersion); | 414 | // Only support progress from engines that are compatible. |
| 413 | if (FAILED(hr)) | 415 | hr = RegReadNumber(hkBundleId, BURN_REGISTRATION_REGISTRY_ENGINE_PROTOCOL_VERSION, &dwEngineProtocolVersion); |
| 416 | if (SUCCEEDED(hr)) | ||
| 417 | { | ||
| 418 | fSupportsBurnProtocol = BURN_PROTOCOL_VERSION == dwEngineProtocolVersion; | ||
| 419 | } | ||
| 420 | else | ||
| 414 | { | 421 | { |
| 415 | qwEngineVersion = 0; | 422 | // Rely on version checking (aka: version greater than or equal to last protocol breaking change *and* versions that are older or the same as this engine) |
| 423 | hr = RegReadVersion(hkBundleId, BURN_REGISTRATION_REGISTRY_ENGINE_VERSION, &qwEngineVersion); | ||
| 424 | if (SUCCEEDED(hr)) | ||
| 425 | { | ||
| 426 | fSupportsBurnProtocol = (FILEMAKEVERSION(3, 6, 2221, 0) <= qwEngineVersion && qwEngineVersion <= FILEMAKEVERSION(rmj, rmm, rup, rpr)); | ||
| 427 | } | ||
| 428 | |||
| 416 | hr = S_OK; | 429 | hr = S_OK; |
| 417 | } | 430 | } |
| 418 | 431 | ||
| @@ -467,7 +480,7 @@ static HRESULT LoadRelatedBundleFromKey( | |||
| 467 | 480 | ||
| 468 | pRelatedBundle->relationType = relationType; | 481 | pRelatedBundle->relationType = relationType; |
| 469 | 482 | ||
| 470 | hr = PseudoBundleInitialize(qwEngineVersion, &pRelatedBundle->package, fPerMachine, wzRelatedBundleId, pRelatedBundle->relationType, | 483 | hr = PseudoBundleInitialize(&pRelatedBundle->package, fSupportsBurnProtocol, fPerMachine, wzRelatedBundleId, pRelatedBundle->relationType, |
| 471 | BOOTSTRAPPER_PACKAGE_STATE_PRESENT, fCached, sczCachePath, sczCachePath, NULL, qwFileSize, FALSE, | 484 | BOOTSTRAPPER_PACKAGE_STATE_PRESENT, fCached, sczCachePath, sczCachePath, NULL, qwFileSize, FALSE, |
| 472 | L"-quiet", L"-repair -quiet", L"-uninstall -quiet", | 485 | L"-quiet", L"-repair -quiet", L"-uninstall -quiet", |
| 473 | (dependencyProvider.sczKey && *dependencyProvider.sczKey) ? &dependencyProvider : NULL, | 486 | (dependencyProvider.sczKey && *dependencyProvider.sczKey) ? &dependencyProvider : NULL, |
