diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2020-11-15 20:23:44 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2020-11-17 19:06:00 -0600 |
| commit | 846f5a033d346c1bac51c56d4936cd3118ebea7a (patch) | |
| tree | 6370380f4aa18355feebc1a058f0793ad14cd899 /src/engine/elevation.cpp | |
| parent | 0d873d28c2dd18444afa08b748e91f495ed1cf5c (diff) | |
| download | wix-846f5a033d346c1bac51c56d4936cd3118ebea7a.tar.gz wix-846f5a033d346c1bac51c56d4936cd3118ebea7a.tar.bz2 wix-846f5a033d346c1bac51c56d4936cd3118ebea7a.zip | |
Clean up the elevation code for MSI transactions.
Diffstat (limited to 'src/engine/elevation.cpp')
| -rw-r--r-- | src/engine/elevation.cpp | 178 |
1 files changed, 78 insertions, 100 deletions
diff --git a/src/engine/elevation.cpp b/src/engine/elevation.cpp index 9ce04630..81a48316 100644 --- a/src/engine/elevation.cpp +++ b/src/engine/elevation.cpp | |||
| @@ -28,17 +28,15 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE | |||
| 28 | BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_EMBEDDED_CHILD, | 28 | BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_EMBEDDED_CHILD, |
| 29 | BURN_ELEVATION_MESSAGE_TYPE_CLEAN_PACKAGE, | 29 | BURN_ELEVATION_MESSAGE_TYPE_CLEAN_PACKAGE, |
| 30 | BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_APPROVED_EXE, | 30 | BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_APPROVED_EXE, |
| 31 | BURN_ELEVATION_MESSAGE_TYPE_BEGIN_MSI_TRANSACTION, | ||
| 32 | BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION, | ||
| 33 | BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION, | ||
| 31 | 34 | ||
| 32 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PROGRESS, | 35 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PROGRESS, |
| 33 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR, | 36 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR, |
| 34 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE, | 37 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE, |
| 35 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_FILES_IN_USE, | 38 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_FILES_IN_USE, |
| 36 | BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_APPROVED_EXE_PROCESSID, | 39 | BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_APPROVED_EXE_PROCESSID, |
| 37 | |||
| 38 | BURN_ELEVATION_TRANSACTION_BEGIN, | ||
| 39 | BURN_ELEVATION_TRANSACTION_COMMIT, | ||
| 40 | BURN_ELEVATION_TRANSACTION_ROLLBACK | ||
| 41 | |||
| 42 | } BURN_ELEVATION_MESSAGE_TYPE; | 40 | } BURN_ELEVATION_MESSAGE_TYPE; |
| 43 | 41 | ||
| 44 | 42 | ||
| @@ -74,24 +72,11 @@ typedef struct _BURN_ELEVATION_CHILD_MESSAGE_CONTEXT | |||
| 74 | BURN_VARIABLES* pVariables; | 72 | BURN_VARIABLES* pVariables; |
| 75 | BURN_REGISTRATION* pRegistration; | 73 | BURN_REGISTRATION* pRegistration; |
| 76 | BURN_USER_EXPERIENCE* pUserExperience; | 74 | BURN_USER_EXPERIENCE* pUserExperience; |
| 77 | |||
| 78 | MSIHANDLE hMsiTrns; | ||
| 79 | HANDLE hMsiTrnsEvent; | ||
| 80 | } BURN_ELEVATION_CHILD_MESSAGE_CONTEXT; | 75 | } BURN_ELEVATION_CHILD_MESSAGE_CONTEXT; |
| 81 | 76 | ||
| 82 | 77 | ||
| 83 | // internal function declarations | 78 | // internal function declarations |
| 84 | 79 | ||
| 85 | static HRESULT OnMsiBeginTransaction( | ||
| 86 | __in BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext | ||
| 87 | ); | ||
| 88 | static HRESULT OnMsiCommitTransaction( | ||
| 89 | __in BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext | ||
| 90 | ); | ||
| 91 | static HRESULT OnMsiRollbackTransaction( | ||
| 92 | __in BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext | ||
| 93 | ); | ||
| 94 | |||
| 95 | static DWORD WINAPI ElevatedChildCacheThreadProc( | 80 | static DWORD WINAPI ElevatedChildCacheThreadProc( |
| 96 | __in LPVOID lpThreadParameter | 81 | __in LPVOID lpThreadParameter |
| 97 | ); | 82 | ); |
| @@ -248,6 +233,13 @@ static HRESULT OnLaunchApprovedExe( | |||
| 248 | __in BYTE* pbData, | 233 | __in BYTE* pbData, |
| 249 | __in DWORD cbData | 234 | __in DWORD cbData |
| 250 | ); | 235 | ); |
| 236 | static HRESULT OnMsiBeginTransaction( | ||
| 237 | __in BYTE* pbData, | ||
| 238 | __in DWORD cbData | ||
| 239 | ); | ||
| 240 | static HRESULT OnMsiCommitTransaction(); | ||
| 241 | static HRESULT OnMsiRollbackTransaction(); | ||
| 242 | |||
| 251 | 243 | ||
| 252 | 244 | ||
| 253 | // function definitions | 245 | // function definitions |
| @@ -726,62 +718,56 @@ LExit: | |||
| 726 | 718 | ||
| 727 | extern "C" HRESULT ElevationMsiBeginTransaction( | 719 | extern "C" HRESULT ElevationMsiBeginTransaction( |
| 728 | __in HANDLE hPipe, | 720 | __in HANDLE hPipe, |
| 729 | __in_opt HWND hwndParent, | 721 | __in LPCWSTR wzName |
| 730 | __in LPVOID pvContext | 722 | ) |
| 731 | ) | ||
| 732 | { | 723 | { |
| 733 | UNREFERENCED_PARAMETER(hwndParent); | ||
| 734 | HRESULT hr = S_OK; | 724 | HRESULT hr = S_OK; |
| 735 | BURN_ELEVATION_MSI_MESSAGE_CONTEXT context = {}; | 725 | BYTE* pbData = NULL; |
| 726 | SIZE_T cbData = 0; | ||
| 736 | DWORD dwResult = ERROR_SUCCESS; | 727 | DWORD dwResult = ERROR_SUCCESS; |
| 737 | 728 | ||
| 738 | context.pvContext = pvContext; | 729 | // serialize message data |
| 730 | hr = BuffWriteString(&pbData, &cbData, wzName); | ||
| 731 | ExitOnFailure(hr, "Failed to write transaction name to message buffer."); | ||
| 739 | 732 | ||
| 740 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_TRANSACTION_BEGIN, NULL, 0, NULL, &context, &dwResult); | 733 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_BEGIN_MSI_TRANSACTION, NULL, 0, NULL, NULL, &dwResult); |
| 741 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_PACKAGE message to per-machine process."); | 734 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_BEGIN_MSI_TRANSACTION message to per-machine process."); |
| 742 | ExitOnWin32Error(dwResult, hr, "Failed beginning an elevated MSI transaction"); | 735 | |
| 736 | hr = static_cast<HRESULT>(dwResult); | ||
| 743 | 737 | ||
| 744 | LExit: | 738 | LExit: |
| 739 | ReleaseBuffer(pbData); | ||
| 740 | |||
| 745 | return hr; | 741 | return hr; |
| 746 | } | 742 | } |
| 747 | 743 | ||
| 748 | extern "C" HRESULT ElevationMsiCommitTransaction( | 744 | extern "C" HRESULT ElevationMsiCommitTransaction( |
| 749 | __in HANDLE hPipe, | 745 | __in HANDLE hPipe |
| 750 | __in_opt HWND hwndParent, | 746 | ) |
| 751 | __in LPVOID pvContext | ||
| 752 | ) | ||
| 753 | { | 747 | { |
| 754 | UNREFERENCED_PARAMETER(hwndParent); | ||
| 755 | HRESULT hr = S_OK; | 748 | HRESULT hr = S_OK; |
| 756 | BURN_ELEVATION_MSI_MESSAGE_CONTEXT context = {}; | ||
| 757 | DWORD dwResult = ERROR_SUCCESS; | 749 | DWORD dwResult = ERROR_SUCCESS; |
| 758 | 750 | ||
| 759 | context.pvContext = pvContext; | 751 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION, NULL, 0, NULL, NULL, &dwResult); |
| 752 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION message to per-machine process."); | ||
| 760 | 753 | ||
| 761 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_TRANSACTION_COMMIT, NULL, 0, NULL, &context, &dwResult); | 754 | hr = static_cast<HRESULT>(dwResult); |
| 762 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_PACKAGE message to per-machine process."); | ||
| 763 | ExitOnWin32Error(dwResult, hr, "Failed committing an elevated MSI transaction"); | ||
| 764 | 755 | ||
| 765 | LExit: | 756 | LExit: |
| 766 | return hr; | 757 | return hr; |
| 767 | } | 758 | } |
| 768 | 759 | ||
| 769 | extern "C" HRESULT ElevationMsiRollbackTransaction( | 760 | extern "C" HRESULT ElevationMsiRollbackTransaction( |
| 770 | __in HANDLE hPipe, | 761 | __in HANDLE hPipe |
| 771 | __in_opt HWND hwndParent, | 762 | ) |
| 772 | __in LPVOID pvContext | ||
| 773 | ) | ||
| 774 | { | 763 | { |
| 775 | UNREFERENCED_PARAMETER(hwndParent); | ||
| 776 | HRESULT hr = S_OK; | 764 | HRESULT hr = S_OK; |
| 777 | BURN_ELEVATION_MSI_MESSAGE_CONTEXT context = {}; | ||
| 778 | DWORD dwResult = ERROR_SUCCESS; | 765 | DWORD dwResult = ERROR_SUCCESS; |
| 779 | 766 | ||
| 780 | context.pvContext = pvContext; | 767 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION, NULL, 0, NULL, NULL, &dwResult); |
| 768 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION message to per-machine process."); | ||
| 781 | 769 | ||
| 782 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_TRANSACTION_ROLLBACK, NULL, 0, NULL, &context, &dwResult); | 770 | hr = static_cast<HRESULT>(dwResult); |
| 783 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_PACKAGE message to per-machine process."); | ||
| 784 | ExitOnWin32Error(dwResult, hr, "Failed rolling back an elevated MSI transaction"); | ||
| 785 | 771 | ||
| 786 | LExit: | 772 | LExit: |
| 787 | return hr; | 773 | return hr; |
| @@ -1543,16 +1529,16 @@ static HRESULT ProcessElevatedChildMessage( | |||
| 1543 | 1529 | ||
| 1544 | switch (pMsg->dwMessage) | 1530 | switch (pMsg->dwMessage) |
| 1545 | { | 1531 | { |
| 1546 | case BURN_ELEVATION_TRANSACTION_BEGIN: | 1532 | case BURN_ELEVATION_MESSAGE_TYPE_BEGIN_MSI_TRANSACTION: |
| 1547 | hrResult = OnMsiBeginTransaction(pContext); | 1533 | hrResult = OnMsiBeginTransaction((BYTE*)pMsg->pvData, pMsg->cbData); |
| 1548 | break; | 1534 | break; |
| 1549 | 1535 | ||
| 1550 | case BURN_ELEVATION_TRANSACTION_COMMIT: | 1536 | case BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION: |
| 1551 | hrResult = OnMsiCommitTransaction(pContext); | 1537 | hrResult = OnMsiCommitTransaction(); |
| 1552 | break; | 1538 | break; |
| 1553 | 1539 | ||
| 1554 | case BURN_ELEVATION_TRANSACTION_ROLLBACK: | 1540 | case BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION: |
| 1555 | hrResult = OnMsiRollbackTransaction(pContext); | 1541 | hrResult = OnMsiRollbackTransaction(); |
| 1556 | break; | 1542 | break; |
| 1557 | 1543 | ||
| 1558 | case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE: | 1544 | case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE: |
| @@ -1690,53 +1676,6 @@ static HRESULT ProcessResult( | |||
| 1690 | return hr; | 1676 | return hr; |
| 1691 | } | 1677 | } |
| 1692 | 1678 | ||
| 1693 | static HRESULT OnMsiBeginTransaction( | ||
| 1694 | __in BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext | ||
| 1695 | ) | ||
| 1696 | { | ||
| 1697 | UINT uResult = ERROR_SUCCESS; | ||
| 1698 | HRESULT hr = S_OK; | ||
| 1699 | |||
| 1700 | pContext->hMsiTrns = NULL; | ||
| 1701 | pContext->hMsiTrnsEvent = NULL; | ||
| 1702 | uResult = MsiBeginTransaction(L"WiX", 0, &pContext->hMsiTrns, &pContext->hMsiTrnsEvent); | ||
| 1703 | ExitOnWin32Error(uResult, hr, "Failed beginning an MSI transaction"); | ||
| 1704 | |||
| 1705 | LExit: | ||
| 1706 | return hr; | ||
| 1707 | } | ||
| 1708 | |||
| 1709 | static HRESULT OnMsiCommitTransaction( | ||
| 1710 | __in BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext | ||
| 1711 | ) | ||
| 1712 | { | ||
| 1713 | UINT uResult = ERROR_SUCCESS; | ||
| 1714 | HRESULT hr = S_OK; | ||
| 1715 | |||
| 1716 | uResult = MsiEndTransaction(MSITRANSACTIONSTATE_COMMIT); | ||
| 1717 | ExitOnWin32Error(uResult, hr, "Failed committing an MSI transaction"); | ||
| 1718 | |||
| 1719 | LExit: | ||
| 1720 | pContext->hMsiTrns = NULL; | ||
| 1721 | pContext->hMsiTrnsEvent = NULL; | ||
| 1722 | return hr; | ||
| 1723 | } | ||
| 1724 | |||
| 1725 | static HRESULT OnMsiRollbackTransaction( | ||
| 1726 | __in BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext | ||
| 1727 | ) { | ||
| 1728 | UINT uResult = ERROR_SUCCESS; | ||
| 1729 | HRESULT hr = S_OK; | ||
| 1730 | |||
| 1731 | uResult = MsiEndTransaction(MSITRANSACTIONSTATE_ROLLBACK); | ||
| 1732 | ExitOnWin32Error(uResult, hr, "Failed rolling back an MSI transaction"); | ||
| 1733 | |||
| 1734 | LExit: | ||
| 1735 | pContext->hMsiTrns = NULL; | ||
| 1736 | pContext->hMsiTrnsEvent = NULL; | ||
| 1737 | return hr; | ||
| 1738 | } | ||
| 1739 | |||
| 1740 | static HRESULT OnApplyInitialize( | 1679 | static HRESULT OnApplyInitialize( |
| 1741 | __in BURN_VARIABLES* pVariables, | 1680 | __in BURN_VARIABLES* pVariables, |
| 1742 | __in BURN_REGISTRATION* pRegistration, | 1681 | __in BURN_REGISTRATION* pRegistration, |
| @@ -2845,3 +2784,42 @@ LExit: | |||
| 2845 | ApprovedExesUninitializeLaunch(pLaunchApprovedExe); | 2784 | ApprovedExesUninitializeLaunch(pLaunchApprovedExe); |
| 2846 | return hr; | 2785 | return hr; |
| 2847 | } | 2786 | } |
| 2787 | |||
| 2788 | static HRESULT OnMsiBeginTransaction( | ||
| 2789 | __in BYTE* pbData, | ||
| 2790 | __in DWORD cbData | ||
| 2791 | ) | ||
| 2792 | { | ||
| 2793 | HRESULT hr = S_OK; | ||
| 2794 | SIZE_T iData = 0; | ||
| 2795 | LPWSTR sczName = NULL; | ||
| 2796 | |||
| 2797 | // Deserialize message data. | ||
| 2798 | hr = BuffReadString(pbData, cbData, &iData, &sczName); | ||
| 2799 | ExitOnFailure(hr, "Failed to read transaction name."); | ||
| 2800 | |||
| 2801 | hr = MsiEngineBeginTransaction(sczName); | ||
| 2802 | |||
| 2803 | LExit: | ||
| 2804 | ReleaseStr(sczName); | ||
| 2805 | |||
| 2806 | return hr; | ||
| 2807 | } | ||
| 2808 | |||
| 2809 | static HRESULT OnMsiCommitTransaction() | ||
| 2810 | { | ||
| 2811 | HRESULT hr = S_OK; | ||
| 2812 | |||
| 2813 | hr = MsiEngineCommitTransaction(); | ||
| 2814 | |||
| 2815 | return hr; | ||
| 2816 | } | ||
| 2817 | |||
| 2818 | static HRESULT OnMsiRollbackTransaction() | ||
| 2819 | { | ||
| 2820 | HRESULT hr = S_OK; | ||
| 2821 | |||
| 2822 | hr = MsiEngineRollbackTransaction(); | ||
| 2823 | |||
| 2824 | return hr; | ||
| 2825 | } | ||
