diff options
Diffstat (limited to 'src/burn/engine/msiengine.cpp')
| -rw-r--r-- | src/burn/engine/msiengine.cpp | 57 |
1 files changed, 25 insertions, 32 deletions
diff --git a/src/burn/engine/msiengine.cpp b/src/burn/engine/msiengine.cpp index c8f68184..c27dd8c2 100644 --- a/src/burn/engine/msiengine.cpp +++ b/src/burn/engine/msiengine.cpp | |||
| @@ -443,7 +443,6 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
| 443 | LPWSTR sczInstalledVersion = NULL; | 443 | LPWSTR sczInstalledVersion = NULL; |
| 444 | LPWSTR sczInstalledLanguage = NULL; | 444 | LPWSTR sczInstalledLanguage = NULL; |
| 445 | INSTALLSTATE installState = INSTALLSTATE_UNKNOWN; | 445 | INSTALLSTATE installState = INSTALLSTATE_UNKNOWN; |
| 446 | BOOTSTRAPPER_RELATED_OPERATION operation = BOOTSTRAPPER_RELATED_OPERATION_NONE; | ||
| 447 | BOOTSTRAPPER_RELATED_OPERATION relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_NONE; | 446 | BOOTSTRAPPER_RELATED_OPERATION relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_NONE; |
| 448 | WCHAR wzProductCode[MAX_GUID_CHARS + 1] = { }; | 447 | WCHAR wzProductCode[MAX_GUID_CHARS + 1] = { }; |
| 449 | VERUTIL_VERSION* pVersion = NULL; | 448 | VERUTIL_VERSION* pVersion = NULL; |
| @@ -455,39 +454,39 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
| 455 | hr = WiuGetProductInfoEx(pPackage->Msi.sczProductCode, NULL, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion); | 454 | hr = WiuGetProductInfoEx(pPackage->Msi.sczProductCode, NULL, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion); |
| 456 | if (SUCCEEDED(hr)) | 455 | if (SUCCEEDED(hr)) |
| 457 | { | 456 | { |
| 458 | hr = VerParseVersion(sczInstalledVersion, 0, FALSE, &pPackage->Msi.pInstalledVersion); | 457 | hr = VerParseVersion(sczInstalledVersion, 0, FALSE, &pVersion); |
| 459 | ExitOnFailure(hr, "Failed to parse installed version: '%ls' for ProductCode: %ls", sczInstalledVersion, pPackage->Msi.sczProductCode); | 458 | ExitOnFailure(hr, "Failed to parse installed version: '%ls' for ProductCode: %ls", sczInstalledVersion, pPackage->Msi.sczProductCode); |
| 460 | 459 | ||
| 461 | if (pPackage->Msi.pInstalledVersion->fInvalid) | 460 | if (pVersion->fInvalid) |
| 462 | { | 461 | { |
| 463 | LogId(REPORT_WARNING, MSG_DETECTED_MSI_PACKAGE_INVALID_VERSION, pPackage->Msi.sczProductCode, sczInstalledVersion); | 462 | LogId(REPORT_WARNING, MSG_DETECTED_MSI_PACKAGE_INVALID_VERSION, pPackage->Msi.sczProductCode, sczInstalledVersion); |
| 464 | } | 463 | } |
| 465 | 464 | ||
| 466 | // compare versions | 465 | // compare versions |
| 467 | hr = VerCompareParsedVersions(pPackage->Msi.pVersion, pPackage->Msi.pInstalledVersion, &nCompareResult); | 466 | hr = VerCompareParsedVersions(pPackage->Msi.pVersion, pVersion, &nCompareResult); |
| 468 | ExitOnFailure(hr, "Failed to compare version '%ls' to installed version: '%ls'", pPackage->Msi.pVersion->sczVersion, pPackage->Msi.pInstalledVersion->sczVersion); | 467 | ExitOnFailure(hr, "Failed to compare version '%ls' to installed version: '%ls'", pPackage->Msi.pVersion->sczVersion, pVersion->sczVersion); |
| 469 | 468 | ||
| 470 | if (nCompareResult < 0) | 469 | if (nCompareResult < 0) |
| 471 | { | 470 | { |
| 472 | operation = BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE; | 471 | pPackage->Msi.operation = BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE; |
| 473 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED; | 472 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED; |
| 474 | } | 473 | } |
| 474 | else if (nCompareResult > 0) | ||
| 475 | { | ||
| 476 | pPackage->Msi.operation = BOOTSTRAPPER_RELATED_OPERATION_MINOR_UPDATE; | ||
| 477 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT; | ||
| 478 | } | ||
| 475 | else | 479 | else |
| 476 | { | 480 | { |
| 477 | if (nCompareResult > 0) | ||
| 478 | { | ||
| 479 | operation = BOOTSTRAPPER_RELATED_OPERATION_MINOR_UPDATE; | ||
| 480 | } | ||
| 481 | |||
| 482 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT; | 481 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_PRESENT; |
| 483 | } | 482 | } |
| 484 | 483 | ||
| 485 | // Report related MSI package to BA. | 484 | // Report related MSI package to BA. |
| 486 | if (BOOTSTRAPPER_RELATED_OPERATION_NONE != operation) | 485 | if (BOOTSTRAPPER_RELATED_OPERATION_NONE != pPackage->Msi.operation) |
| 487 | { | 486 | { |
| 488 | LogId(REPORT_STANDARD, MSG_DETECTED_RELATED_PACKAGE, pPackage->Msi.sczProductCode, LoggingPerMachineToString(pPackage->fPerMachine), pPackage->Msi.pInstalledVersion->sczVersion, pPackage->Msi.dwLanguage, LoggingRelatedOperationToString(operation)); | 487 | LogId(REPORT_STANDARD, MSG_DETECTED_RELATED_PACKAGE, pPackage->Msi.sczProductCode, LoggingPerMachineToString(pPackage->fPerMachine), pVersion->sczVersion, pPackage->Msi.dwLanguage, LoggingRelatedOperationToString(pPackage->Msi.operation)); |
| 489 | 488 | ||
| 490 | hr = UserExperienceOnDetectRelatedMsiPackage(pUserExperience, pPackage->sczId, pPackage->Msi.sczUpgradeCode, pPackage->Msi.sczProductCode, pPackage->fPerMachine, pPackage->Msi.pInstalledVersion, operation); | 489 | hr = UserExperienceOnDetectRelatedMsiPackage(pUserExperience, pPackage->sczId, pPackage->Msi.sczUpgradeCode, pPackage->Msi.sczProductCode, pPackage->fPerMachine, pVersion, pPackage->Msi.operation); |
| 491 | ExitOnRootFailure(hr, "BA aborted detect related MSI package."); | 490 | ExitOnRootFailure(hr, "BA aborted detect related MSI package."); |
| 492 | } | 491 | } |
| 493 | } | 492 | } |
| @@ -623,7 +622,7 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
| 623 | { | 622 | { |
| 624 | // If we've already detected a major upgrade that trumps any guesses that the detect is a downgrade | 623 | // If we've already detected a major upgrade that trumps any guesses that the detect is a downgrade |
| 625 | // or even something else. | 624 | // or even something else. |
| 626 | if (BOOTSTRAPPER_RELATED_OPERATION_MAJOR_UPGRADE == operation) | 625 | if (BOOTSTRAPPER_RELATED_OPERATION_MAJOR_UPGRADE == pPackage->Msi.operation) |
| 627 | { | 626 | { |
| 628 | relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_NONE; | 627 | relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_NONE; |
| 629 | } | 628 | } |
| @@ -632,7 +631,7 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
| 632 | pPackage->Msi.sczUpgradeCode && CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, pPackage->Msi.sczUpgradeCode, -1, pRelatedMsi->sczUpgradeCode, -1)) | 631 | pPackage->Msi.sczUpgradeCode && CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, pPackage->Msi.sczUpgradeCode, -1, pRelatedMsi->sczUpgradeCode, -1)) |
| 633 | { | 632 | { |
| 634 | relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE; | 633 | relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE; |
| 635 | operation = BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE; | 634 | pPackage->Msi.operation = BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE; |
| 636 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE; | 635 | pPackage->currentState = BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE; |
| 637 | } | 636 | } |
| 638 | else // we're already on the machine so the detect-only *must* be for detection purposes only. | 637 | else // we're already on the machine so the detect-only *must* be for detection purposes only. |
| @@ -643,7 +642,7 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
| 643 | else | 642 | else |
| 644 | { | 643 | { |
| 645 | relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_MAJOR_UPGRADE; | 644 | relatedMsiOperation = BOOTSTRAPPER_RELATED_OPERATION_MAJOR_UPGRADE; |
| 646 | operation = BOOTSTRAPPER_RELATED_OPERATION_MAJOR_UPGRADE; | 645 | pPackage->Msi.operation = BOOTSTRAPPER_RELATED_OPERATION_MAJOR_UPGRADE; |
| 647 | } | 646 | } |
| 648 | 647 | ||
| 649 | LogId(REPORT_STANDARD, MSG_DETECTED_RELATED_PACKAGE, wzProductCode, LoggingPerMachineToString(fPerMachine), pVersion->sczVersion, uLcid, LoggingRelatedOperationToString(relatedMsiOperation)); | 648 | LogId(REPORT_STANDARD, MSG_DETECTED_RELATED_PACKAGE, wzProductCode, LoggingPerMachineToString(fPerMachine), pVersion->sczVersion, uLcid, LoggingRelatedOperationToString(relatedMsiOperation)); |
| @@ -858,9 +857,6 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage( | |||
| 858 | Trace(REPORT_STANDARD, "Planning MSI package 0x%p", pPackage); | 857 | Trace(REPORT_STANDARD, "Planning MSI package 0x%p", pPackage); |
| 859 | 858 | ||
| 860 | HRESULT hr = S_OK; | 859 | HRESULT hr = S_OK; |
| 861 | VERUTIL_VERSION* pVersion = pPackage->Msi.pVersion; | ||
| 862 | VERUTIL_VERSION* pInstalledVersion = pPackage->Msi.pInstalledVersion; | ||
| 863 | int nCompareResult = 0; | ||
| 864 | BOOTSTRAPPER_ACTION_STATE execute = BOOTSTRAPPER_ACTION_STATE_NONE; | 860 | BOOTSTRAPPER_ACTION_STATE execute = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 865 | BOOTSTRAPPER_ACTION_STATE rollback = BOOTSTRAPPER_ACTION_STATE_NONE; | 861 | BOOTSTRAPPER_ACTION_STATE rollback = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 866 | BOOL fFeatureActionDelta = FALSE; | 862 | BOOL fFeatureActionDelta = FALSE; |
| @@ -892,17 +888,7 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage( | |||
| 892 | case BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED: | 888 | case BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED: |
| 893 | if (BOOTSTRAPPER_REQUEST_STATE_PRESENT == pPackage->requested || BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested) | 889 | if (BOOTSTRAPPER_REQUEST_STATE_PRESENT == pPackage->requested || BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested) |
| 894 | { | 890 | { |
| 895 | hr = VerCompareParsedVersions(pVersion, pInstalledVersion, &nCompareResult); | 891 | if (BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested) |
| 896 | ExitOnFailure(hr, "Failed to compare '%ls' to '%ls' for planning.", pVersion->sczVersion, pInstalledVersion->sczVersion); | ||
| 897 | |||
| 898 | // Take a look at the version and determine if this is a potential | ||
| 899 | // minor upgrade (same ProductCode newer ProductVersion), otherwise, | ||
| 900 | // there is a newer version so no work necessary. | ||
| 901 | if (nCompareResult > 0) | ||
| 902 | { | ||
| 903 | execute = BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE; | ||
| 904 | } | ||
| 905 | else if (BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested) | ||
| 906 | { | 892 | { |
| 907 | execute = BOOTSTRAPPER_ACTION_STATE_REPAIR; | 893 | execute = BOOTSTRAPPER_ACTION_STATE_REPAIR; |
| 908 | } | 894 | } |
| @@ -937,7 +923,14 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage( | |||
| 937 | case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; | 923 | case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; |
| 938 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT: __fallthrough; | 924 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT: __fallthrough; |
| 939 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: | 925 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: |
| 940 | execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; | 926 | if (BOOTSTRAPPER_RELATED_OPERATION_MINOR_UPDATE == pPackage->Msi.operation) |
| 927 | { | ||
| 928 | execute = BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE; | ||
| 929 | } | ||
| 930 | else | ||
| 931 | { | ||
| 932 | execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; | ||
| 933 | } | ||
| 941 | break; | 934 | break; |
| 942 | 935 | ||
| 943 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: | 936 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: |
