diff options
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 | } | ||