diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-01-31 15:44:00 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-02-01 23:36:23 -0600 |
| commit | 56c980318e7167be591f7807c2fc34cea7d5cb42 (patch) | |
| tree | e074b3548d8dfe51f420b6d0278a6fe17191b6ec /src/burn/engine/registration.cpp | |
| parent | bfe5ab76b5ecc1a21078534e6fba90d12cfd3c00 (diff) | |
| download | wix-56c980318e7167be591f7807c2fc34cea7d5cb42.tar.gz wix-56c980318e7167be591f7807c2fc34cea7d5cb42.tar.bz2 wix-56c980318e7167be591f7807c2fc34cea7d5cb42.zip | |
The bundle provider's presence needs to follow ARP registration.
Diffstat (limited to 'src/burn/engine/registration.cpp')
| -rw-r--r-- | src/burn/engine/registration.cpp | 320 |
1 files changed, 154 insertions, 166 deletions
diff --git a/src/burn/engine/registration.cpp b/src/burn/engine/registration.cpp index c76dde53..59947867 100644 --- a/src/burn/engine/registration.cpp +++ b/src/burn/engine/registration.cpp | |||
| @@ -605,7 +605,6 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
| 605 | __in BURN_CACHE* pCache, | 605 | __in BURN_CACHE* pCache, |
| 606 | __in BURN_VARIABLES* pVariables, | 606 | __in BURN_VARIABLES* pVariables, |
| 607 | __in DWORD dwRegistrationOptions, | 607 | __in DWORD dwRegistrationOptions, |
| 608 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, | ||
| 609 | __in DWORD64 qwEstimatedSize, | 608 | __in DWORD64 qwEstimatedSize, |
| 610 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | 609 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType |
| 611 | ) | 610 | ) |
| @@ -635,206 +634,199 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
| 635 | ExitOnFailure(hr, "Failed to create registration key."); | 634 | ExitOnFailure(hr, "Failed to create registration key."); |
| 636 | 635 | ||
| 637 | // Write any ARP values and software tags. | 636 | // Write any ARP values and software tags. |
| 638 | if (dwRegistrationOptions & BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_REGISTRATION) | 637 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_CACHE_PATH, pRegistration->sczCacheExecutablePath); |
| 639 | { | 638 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_CACHE_PATH); |
| 640 | // Upgrade information | ||
| 641 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_CACHE_PATH, pRegistration->sczCacheExecutablePath); | ||
| 642 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_CACHE_PATH); | ||
| 643 | 639 | ||
| 644 | hr = RegWriteStringArray(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE, pRegistration->rgsczUpgradeCodes, pRegistration->cUpgradeCodes); | 640 | hr = RegWriteStringArray(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE, pRegistration->rgsczUpgradeCodes, pRegistration->cUpgradeCodes); |
| 645 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE); | 641 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE); |
| 646 | 642 | ||
| 647 | hr = RegWriteStringArray(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_ADDON_CODE, pRegistration->rgsczAddonCodes, pRegistration->cAddonCodes); | 643 | hr = RegWriteStringArray(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_ADDON_CODE, pRegistration->rgsczAddonCodes, pRegistration->cAddonCodes); |
| 648 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_ADDON_CODE); | 644 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_ADDON_CODE); |
| 649 | 645 | ||
| 650 | hr = RegWriteStringArray(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_DETECT_CODE, pRegistration->rgsczDetectCodes, pRegistration->cDetectCodes); | 646 | hr = RegWriteStringArray(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_DETECT_CODE, pRegistration->rgsczDetectCodes, pRegistration->cDetectCodes); |
| 651 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_DETECT_CODE); | 647 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_DETECT_CODE); |
| 652 | 648 | ||
| 653 | hr = RegWriteStringArray(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_PATCH_CODE, pRegistration->rgsczPatchCodes, pRegistration->cPatchCodes); | 649 | hr = RegWriteStringArray(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_PATCH_CODE, pRegistration->rgsczPatchCodes, pRegistration->cPatchCodes); |
| 654 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_PATCH_CODE); | 650 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_PATCH_CODE); |
| 655 | 651 | ||
| 656 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_VERSION, pRegistration->pVersion->sczVersion); | 652 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_VERSION, pRegistration->pVersion->sczVersion); |
| 657 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_VERSION); | 653 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_VERSION); |
| 658 | 654 | ||
| 659 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_VERSION_MAJOR, pRegistration->pVersion->dwMajor); | 655 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_VERSION_MAJOR, pRegistration->pVersion->dwMajor); |
| 660 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_VERSION_MAJOR); | 656 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_VERSION_MAJOR); |
| 661 | 657 | ||
| 662 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_VERSION_MINOR, pRegistration->pVersion->dwMinor); | 658 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_VERSION_MINOR, pRegistration->pVersion->dwMinor); |
| 663 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_VERSION_MINOR); | 659 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_VERSION_MINOR); |
| 664 | 660 | ||
| 665 | if (pRegistration->sczProviderKey) | 661 | if (pRegistration->sczProviderKey) |
| 666 | { | 662 | { |
| 667 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_PROVIDER_KEY, pRegistration->sczProviderKey); | 663 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_PROVIDER_KEY, pRegistration->sczProviderKey); |
| 668 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_PROVIDER_KEY); | 664 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_PROVIDER_KEY); |
| 669 | } | 665 | } |
| 670 | 666 | ||
| 671 | if (pRegistration->sczTag) | 667 | if (pRegistration->sczTag) |
| 672 | { | 668 | { |
| 673 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_TAG, pRegistration->sczTag); | 669 | hr = RegWriteString(hkRegistration, BURN_REGISTRATION_REGISTRY_BUNDLE_TAG, pRegistration->sczTag); |
| 674 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_TAG); | 670 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_BUNDLE_TAG); |
| 675 | } | 671 | } |
| 676 | 672 | ||
| 677 | hr = RegWriteStringFormatted(hkRegistration, BURN_REGISTRATION_REGISTRY_ENGINE_VERSION, L"%hs", szVerMajorMinorBuild); | 673 | hr = RegWriteStringFormatted(hkRegistration, BURN_REGISTRATION_REGISTRY_ENGINE_VERSION, L"%hs", szVerMajorMinorBuild); |
| 678 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_ENGINE_VERSION); | 674 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_ENGINE_VERSION); |
| 679 | 675 | ||
| 680 | hr = RegWriteNumber(hkRegistration, BURN_REGISTRATION_REGISTRY_ENGINE_PROTOCOL_VERSION, BURN_PROTOCOL_VERSION); | 676 | hr = RegWriteNumber(hkRegistration, BURN_REGISTRATION_REGISTRY_ENGINE_PROTOCOL_VERSION, BURN_PROTOCOL_VERSION); |
| 681 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_ENGINE_PROTOCOL_VERSION); | 677 | ExitOnFailure(hr, "Failed to write %ls value.", BURN_REGISTRATION_REGISTRY_ENGINE_PROTOCOL_VERSION); |
| 682 | 678 | ||
| 683 | // DisplayIcon: [path to exe] and ",0" to refer to the first icon in the executable. | 679 | // DisplayIcon: [path to exe] and ",0" to refer to the first icon in the executable. |
| 684 | hr = RegWriteStringFormatted(hkRegistration, REGISTRY_BUNDLE_DISPLAY_ICON, L"%s,0", pRegistration->sczCacheExecutablePath); | 680 | hr = RegWriteStringFormatted(hkRegistration, REGISTRY_BUNDLE_DISPLAY_ICON, L"%s,0", pRegistration->sczCacheExecutablePath); |
| 685 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_DISPLAY_ICON); | 681 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_DISPLAY_ICON); |
| 686 | 682 | ||
| 687 | // update display name | 683 | // update display name |
| 688 | hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS == registrationType); | 684 | hr = UpdateBundleNameRegistration(pRegistration, pVariables, hkRegistration, BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS == registrationType); |
| 689 | ExitOnFailure(hr, "Failed to update name and publisher."); | 685 | ExitOnFailure(hr, "Failed to update name and publisher."); |
| 690 | 686 | ||
| 691 | // DisplayVersion: provided by UI | 687 | // DisplayVersion: provided by UI |
| 692 | if (pRegistration->sczDisplayVersion) | 688 | if (pRegistration->sczDisplayVersion) |
| 693 | { | 689 | { |
| 694 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_DISPLAY_VERSION, pRegistration->sczDisplayVersion); | 690 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_DISPLAY_VERSION, pRegistration->sczDisplayVersion); |
| 695 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_DISPLAY_VERSION); | 691 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_DISPLAY_VERSION); |
| 696 | } | 692 | } |
| 697 | 693 | ||
| 698 | // Publisher: provided by UI | 694 | // Publisher: provided by UI |
| 699 | hr = GetBundleManufacturer(pRegistration, pVariables, &sczPublisher); | 695 | hr = GetBundleManufacturer(pRegistration, pVariables, &sczPublisher); |
| 700 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_PUBLISHER, SUCCEEDED(hr) ? sczPublisher : pRegistration->sczPublisher); | 696 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_PUBLISHER, SUCCEEDED(hr) ? sczPublisher : pRegistration->sczPublisher); |
| 701 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_PUBLISHER); | 697 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_PUBLISHER); |
| 702 | 698 | ||
| 703 | // HelpLink: provided by UI | 699 | // HelpLink: provided by UI |
| 704 | if (pRegistration->sczHelpLink) | 700 | if (pRegistration->sczHelpLink) |
| 705 | { | 701 | { |
| 706 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_HELP_LINK, pRegistration->sczHelpLink); | 702 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_HELP_LINK, pRegistration->sczHelpLink); |
| 707 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_HELP_LINK); | 703 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_HELP_LINK); |
| 708 | } | 704 | } |
| 709 | 705 | ||
| 710 | // HelpTelephone: provided by UI | 706 | // HelpTelephone: provided by UI |
| 711 | if (pRegistration->sczHelpTelephone) | 707 | if (pRegistration->sczHelpTelephone) |
| 712 | { | 708 | { |
| 713 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_HELP_TELEPHONE, pRegistration->sczHelpTelephone); | 709 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_HELP_TELEPHONE, pRegistration->sczHelpTelephone); |
| 714 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_HELP_TELEPHONE); | 710 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_HELP_TELEPHONE); |
| 715 | } | 711 | } |
| 716 | 712 | ||
| 717 | // URLInfoAbout, provided by UI | 713 | // URLInfoAbout, provided by UI |
| 718 | if (pRegistration->sczAboutUrl) | 714 | if (pRegistration->sczAboutUrl) |
| 719 | { | 715 | { |
| 720 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_URL_INFO_ABOUT, pRegistration->sczAboutUrl); | 716 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_URL_INFO_ABOUT, pRegistration->sczAboutUrl); |
| 721 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_URL_INFO_ABOUT); | 717 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_URL_INFO_ABOUT); |
| 722 | } | 718 | } |
| 723 | 719 | ||
| 724 | // URLUpdateInfo, provided by UI | 720 | // URLUpdateInfo, provided by UI |
| 725 | if (pRegistration->sczUpdateUrl) | 721 | if (pRegistration->sczUpdateUrl) |
| 726 | { | 722 | { |
| 727 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_URL_UPDATE_INFO, pRegistration->sczUpdateUrl); | 723 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_URL_UPDATE_INFO, pRegistration->sczUpdateUrl); |
| 728 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_URL_UPDATE_INFO); | 724 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_URL_UPDATE_INFO); |
| 729 | } | 725 | } |
| 730 | 726 | ||
| 731 | // ParentDisplayName | 727 | // ParentDisplayName |
| 732 | if (pRegistration->sczParentDisplayName) | 728 | if (pRegistration->sczParentDisplayName) |
| 733 | { | 729 | { |
| 734 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_PARENT_DISPLAY_NAME, pRegistration->sczParentDisplayName); | 730 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_PARENT_DISPLAY_NAME, pRegistration->sczParentDisplayName); |
| 735 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_PARENT_DISPLAY_NAME); | 731 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_PARENT_DISPLAY_NAME); |
| 736 | 732 | ||
| 737 | // Need to write the ParentKeyName but can be set to anything. | 733 | // Need to write the ParentKeyName but can be set to anything. |
| 738 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_PARENT_KEY_NAME, pRegistration->sczParentDisplayName); | 734 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_PARENT_KEY_NAME, pRegistration->sczParentDisplayName); |
| 739 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_PARENT_KEY_NAME); | 735 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_PARENT_KEY_NAME); |
| 740 | } | 736 | } |
| 741 | 737 | ||
| 742 | // Comments, provided by UI | 738 | // Comments, provided by UI |
| 743 | if (pRegistration->sczComments) | 739 | if (pRegistration->sczComments) |
| 744 | { | 740 | { |
| 745 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_COMMENTS, pRegistration->sczComments); | 741 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_COMMENTS, pRegistration->sczComments); |
| 746 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_COMMENTS); | 742 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_COMMENTS); |
| 747 | } | 743 | } |
| 748 | 744 | ||
| 749 | // Contact, provided by UI | 745 | // Contact, provided by UI |
| 750 | if (pRegistration->sczContact) | 746 | if (pRegistration->sczContact) |
| 751 | { | 747 | { |
| 752 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_CONTACT, pRegistration->sczContact); | 748 | hr = RegWriteString(hkRegistration, REGISTRY_BUNDLE_CONTACT, pRegistration->sczContact); |
| 753 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_CONTACT); | 749 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_CONTACT); |
| 754 | } | 750 | } |
| 755 | 751 | ||
| 756 | // InstallLocation: provided by UI | 752 | // InstallLocation: provided by UI |
| 757 | // TODO: need to figure out what "InstallLocation" means in a chainer. <smile/> | 753 | // TODO: need to figure out what "InstallLocation" means in a chainer. <smile/> |
| 758 | 754 | ||
| 759 | // NoModify | 755 | // NoModify |
| 760 | if (BURN_REGISTRATION_MODIFY_DISABLE == pRegistration->modify) | 756 | if (BURN_REGISTRATION_MODIFY_DISABLE == pRegistration->modify) |
| 761 | { | 757 | { |
| 762 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_NO_MODIFY, 1); | 758 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_NO_MODIFY, 1); |
| 763 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_NO_MODIFY); | 759 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_NO_MODIFY); |
| 764 | } | 760 | } |
| 765 | else if (BURN_REGISTRATION_MODIFY_DISABLE_BUTTON != pRegistration->modify) // if support modify (aka: did not disable anything) | 761 | else if (BURN_REGISTRATION_MODIFY_DISABLE_BUTTON != pRegistration->modify) // if support modify (aka: did not disable anything) |
| 766 | { | 762 | { |
| 767 | // ModifyPath: [path to exe] /modify | 763 | // ModifyPath: [path to exe] /modify |
| 768 | hr = RegWriteStringFormatted(hkRegistration, REGISTRY_BUNDLE_MODIFY_PATH, L"\"%ls\" /%ls /modify", pRegistration->sczCacheExecutablePath, BURN_COMMANDLINE_SWITCH_CLEAN_ROOM); | 764 | hr = RegWriteStringFormatted(hkRegistration, REGISTRY_BUNDLE_MODIFY_PATH, L"\"%ls\" /%ls /modify", pRegistration->sczCacheExecutablePath, BURN_COMMANDLINE_SWITCH_CLEAN_ROOM); |
| 769 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_MODIFY_PATH); | 765 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_MODIFY_PATH); |
| 770 | 766 | ||
| 771 | // NoElevateOnModify: 1 | 767 | // NoElevateOnModify: 1 |
| 772 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_NO_ELEVATE_ON_MODIFY, 1); | 768 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_NO_ELEVATE_ON_MODIFY, 1); |
| 773 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_NO_ELEVATE_ON_MODIFY); | 769 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_NO_ELEVATE_ON_MODIFY); |
| 774 | } | 770 | } |
| 775 | 771 | ||
| 776 | // NoRemove: should this be allowed? | 772 | // NoRemove: should this be allowed? |
| 777 | if (pRegistration->fNoRemoveDefined) | 773 | if (pRegistration->fNoRemoveDefined) |
| 778 | { | 774 | { |
| 779 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_NO_REMOVE, (DWORD)pRegistration->fNoRemove); | 775 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_NO_REMOVE, (DWORD)pRegistration->fNoRemove); |
| 780 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_NO_REMOVE); | 776 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_NO_REMOVE); |
| 781 | } | 777 | } |
| 782 | 778 | ||
| 783 | // Conditionally hide the ARP entry. | 779 | // Conditionally hide the ARP entry. |
| 784 | if (!pRegistration->fRegisterArp) | 780 | if (!pRegistration->fRegisterArp) |
| 785 | { | 781 | { |
| 786 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_SYSTEM_COMPONENT, 1); | 782 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_SYSTEM_COMPONENT, 1); |
| 787 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_SYSTEM_COMPONENT); | 783 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_SYSTEM_COMPONENT); |
| 788 | } | 784 | } |
| 789 | 785 | ||
| 790 | // QuietUninstallString: [path to exe] /uninstall /quiet | 786 | // QuietUninstallString: [path to exe] /uninstall /quiet |
| 791 | hr = RegWriteStringFormatted(hkRegistration, REGISTRY_BUNDLE_QUIET_UNINSTALL_STRING, L"\"%ls\" /%ls /uninstall /quiet", pRegistration->sczCacheExecutablePath, BURN_COMMANDLINE_SWITCH_CLEAN_ROOM); | 787 | hr = RegWriteStringFormatted(hkRegistration, REGISTRY_BUNDLE_QUIET_UNINSTALL_STRING, L"\"%ls\" /%ls /uninstall /quiet", pRegistration->sczCacheExecutablePath, BURN_COMMANDLINE_SWITCH_CLEAN_ROOM); |
| 792 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_QUIET_UNINSTALL_STRING); | 788 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_QUIET_UNINSTALL_STRING); |
| 793 | 789 | ||
| 794 | // UninstallString, [path to exe] | 790 | // UninstallString, [path to exe] |
| 795 | // If the modify button is to be disabled, we'll add "/modify" to the uninstall string because the button is "Uninstall/Change". Otherwise, | 791 | // If the modify button is to be disabled, we'll add "/modify" to the uninstall string because the button is "Uninstall/Change". Otherwise, |
| 796 | // it's just the "Uninstall" button so we add "/uninstall" to make the program just go away. | 792 | // it's just the "Uninstall" button so we add "/uninstall" to make the program just go away. |
| 797 | LPCWSTR wzUninstallParameters = (BURN_REGISTRATION_MODIFY_DISABLE_BUTTON == pRegistration->modify) ? L"/modify" : L" /uninstall"; | 793 | LPCWSTR wzUninstallParameters = (BURN_REGISTRATION_MODIFY_DISABLE_BUTTON == pRegistration->modify) ? L"/modify" : L" /uninstall"; |
| 798 | hr = RegWriteStringFormatted(hkRegistration, REGISTRY_BUNDLE_UNINSTALL_STRING, L"\"%ls\" /%ls %ls", pRegistration->sczCacheExecutablePath, BURN_COMMANDLINE_SWITCH_CLEAN_ROOM, wzUninstallParameters); | 794 | hr = RegWriteStringFormatted(hkRegistration, REGISTRY_BUNDLE_UNINSTALL_STRING, L"\"%ls\" /%ls %ls", pRegistration->sczCacheExecutablePath, BURN_COMMANDLINE_SWITCH_CLEAN_ROOM, wzUninstallParameters); |
| 799 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_UNINSTALL_STRING); | 795 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_UNINSTALL_STRING); |
| 800 | 796 | ||
| 801 | if (pRegistration->softwareTags.cSoftwareTags) | 797 | if (pRegistration->softwareTags.cSoftwareTags) |
| 802 | { | 798 | { |
| 803 | hr = WriteSoftwareTags(pVariables, &pRegistration->softwareTags); | 799 | hr = WriteSoftwareTags(pVariables, &pRegistration->softwareTags); |
| 804 | ExitOnFailure(hr, "Failed to write software tags."); | 800 | ExitOnFailure(hr, "Failed to write software tags."); |
| 805 | } | 801 | } |
| 806 | 802 | ||
| 807 | // Update registration. | 803 | // Update registration. |
| 808 | if (pRegistration->update.fRegisterUpdate) | 804 | if (pRegistration->update.fRegisterUpdate) |
| 809 | { | 805 | { |
| 810 | hr = WriteUpdateRegistration(pRegistration, pVariables); | 806 | hr = WriteUpdateRegistration(pRegistration, pVariables); |
| 811 | ExitOnFailure(hr, "Failed to write update registration."); | 807 | ExitOnFailure(hr, "Failed to write update registration."); |
| 812 | } | ||
| 813 | } | 808 | } |
| 814 | 809 | ||
| 815 | // Update estimated size. | 810 | // Update estimated size. |
| 816 | if (dwRegistrationOptions & BURN_REGISTRATION_ACTION_OPERATIONS_UPDATE_SIZE) | 811 | qwEstimatedSize /= 1024; // Convert bytes to KB |
| 812 | if (0 < qwEstimatedSize) | ||
| 817 | { | 813 | { |
| 818 | qwEstimatedSize /= 1024; // Convert bytes to KB | 814 | if (DWORD_MAX < qwEstimatedSize) |
| 819 | if (0 < qwEstimatedSize) | ||
| 820 | { | 815 | { |
| 821 | if (DWORD_MAX < qwEstimatedSize) | 816 | // ARP doesn't support QWORDs here |
| 822 | { | 817 | dwSize = DWORD_MAX; |
| 823 | // ARP doesn't support QWORDs here | ||
| 824 | dwSize = DWORD_MAX; | ||
| 825 | } | ||
| 826 | else | ||
| 827 | { | ||
| 828 | dwSize = static_cast<DWORD>(qwEstimatedSize); | ||
| 829 | } | ||
| 830 | |||
| 831 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_ESTIMATED_SIZE, dwSize); | ||
| 832 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_ESTIMATED_SIZE); | ||
| 833 | } | 818 | } |
| 819 | else | ||
| 820 | { | ||
| 821 | dwSize = static_cast<DWORD>(qwEstimatedSize); | ||
| 822 | } | ||
| 823 | |||
| 824 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_ESTIMATED_SIZE, dwSize); | ||
| 825 | ExitOnFailure(hr, "Failed to write %ls value.", REGISTRY_BUNDLE_ESTIMATED_SIZE); | ||
| 834 | } | 826 | } |
| 835 | 827 | ||
| 836 | // Register the bundle dependency key. | 828 | // Register the bundle dependency key. |
| 837 | if (BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER == dependencyRegistrationAction) | 829 | if (dwRegistrationOptions & BURN_REGISTRATION_ACTION_OPERATIONS_WRITE_PROVIDER_KEY) |
| 838 | { | 830 | { |
| 839 | hr = DependencyRegisterBundle(pRegistration); | 831 | hr = DependencyRegisterBundle(pRegistration); |
| 840 | ExitOnFailure(hr, "Failed to register the bundle dependency key."); | 832 | ExitOnFailure(hr, "Failed to register the bundle dependency key."); |
| @@ -897,7 +889,6 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
| 897 | __in BURN_PACKAGES* pPackages, | 889 | __in BURN_PACKAGES* pPackages, |
| 898 | __in BURN_RESUME_MODE resumeMode, | 890 | __in BURN_RESUME_MODE resumeMode, |
| 899 | __in BOOTSTRAPPER_APPLY_RESTART restart, | 891 | __in BOOTSTRAPPER_APPLY_RESTART restart, |
| 900 | __in BURN_DEPENDENCY_REGISTRATION_ACTION dependencyRegistrationAction, | ||
| 901 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType | 892 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType |
| 902 | ) | 893 | ) |
| 903 | { | 894 | { |
| @@ -909,11 +900,8 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
| 909 | { | 900 | { |
| 910 | AssertSz(BOOTSTRAPPER_REGISTRATION_TYPE_NONE == registrationType, "Registration type must be NONE if resume mode is NONE"); | 901 | AssertSz(BOOTSTRAPPER_REGISTRATION_TYPE_NONE == registrationType, "Registration type must be NONE if resume mode is NONE"); |
| 911 | 902 | ||
| 912 | // If we just registered the bundle dependency but something went wrong and caused us to not | 903 | // If we own the bundle dependency then remove it. |
| 913 | // keep the bundle registration (like rollback) or we are supposed to unregister the bundle | 904 | if (!pRegistration->fDetectedForeignProviderKeyBundleId) |
| 914 | // dependency when unregistering the bundle, do so. | ||
| 915 | if (BURN_DEPENDENCY_REGISTRATION_ACTION_REGISTER == dependencyRegistrationAction || | ||
| 916 | BURN_DEPENDENCY_REGISTRATION_ACTION_UNREGISTER == dependencyRegistrationAction) | ||
| 917 | { | 905 | { |
| 918 | // Remove the bundle dependency key. | 906 | // Remove the bundle dependency key. |
| 919 | DependencyUnregisterBundle(pRegistration, pPackages); | 907 | DependencyUnregisterBundle(pRegistration, pPackages); |
