aboutsummaryrefslogtreecommitdiff
path: root/src/engine/elevation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/elevation.cpp')
-rw-r--r--src/engine/elevation.cpp178
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
85static HRESULT OnMsiBeginTransaction(
86 __in BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext
87);
88static HRESULT OnMsiCommitTransaction(
89 __in BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext
90);
91static HRESULT OnMsiRollbackTransaction(
92 __in BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext
93);
94
95static DWORD WINAPI ElevatedChildCacheThreadProc( 80static 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 );
236static HRESULT OnMsiBeginTransaction(
237 __in BYTE* pbData,
238 __in DWORD cbData
239 );
240static HRESULT OnMsiCommitTransaction();
241static HRESULT OnMsiRollbackTransaction();
242
251 243
252 244
253// function definitions 245// function definitions
@@ -726,62 +718,56 @@ LExit:
726 718
727extern "C" HRESULT ElevationMsiBeginTransaction( 719extern "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
744LExit: 738LExit:
739 ReleaseBuffer(pbData);
740
745 return hr; 741 return hr;
746} 742}
747 743
748extern "C" HRESULT ElevationMsiCommitTransaction( 744extern "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
765LExit: 756LExit:
766 return hr; 757 return hr;
767} 758}
768 759
769extern "C" HRESULT ElevationMsiRollbackTransaction( 760extern "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
786LExit: 772LExit:
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
1693static 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
1705LExit:
1706 return hr;
1707}
1708
1709static 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
1719LExit:
1720 pContext->hMsiTrns = NULL;
1721 pContext->hMsiTrnsEvent = NULL;
1722 return hr;
1723}
1724
1725static 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
1734LExit:
1735 pContext->hMsiTrns = NULL;
1736 pContext->hMsiTrnsEvent = NULL;
1737 return hr;
1738}
1739
1740static HRESULT OnApplyInitialize( 1679static 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
2788static 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
2803LExit:
2804 ReleaseStr(sczName);
2805
2806 return hr;
2807}
2808
2809static HRESULT OnMsiCommitTransaction()
2810{
2811 HRESULT hr = S_OK;
2812
2813 hr = MsiEngineCommitTransaction();
2814
2815 return hr;
2816}
2817
2818static HRESULT OnMsiRollbackTransaction()
2819{
2820 HRESULT hr = S_OK;
2821
2822 hr = MsiEngineRollbackTransaction();
2823
2824 return hr;
2825}