aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-11-16 21:59:26 -0600
committerSean Hall <r.sean.hall@gmail.com>2020-11-17 19:06:00 -0600
commit4ca0a5b2a8711cae9e60cb4075799bffef4ce75a (patch)
tree8b3a1fb83ec73de23457f202aa2f2c5468af0dc6
parent7d45238e97c35ccea1f77be9065b9a3ed9213bfb (diff)
downloadwix-4ca0a5b2a8711cae9e60cb4075799bffef4ce75a.tar.gz
wix-4ca0a5b2a8711cae9e60cb4075799bffef4ce75a.tar.bz2
wix-4ca0a5b2a8711cae9e60cb4075799bffef4ce75a.zip
Add BA messages around system restore points.
-rw-r--r--src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h46
-rw-r--r--src/engine/core.cpp2
-rw-r--r--src/engine/elevation.cpp208
-rw-r--r--src/engine/elevation.h1
-rw-r--r--src/engine/userexperience.cpp80
-rw-r--r--src/engine/userexperience.h14
6 files changed, 342 insertions, 9 deletions
diff --git a/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h b/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h
index cfbb0571..80b23686 100644
--- a/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h
+++ b/src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h
@@ -141,6 +141,10 @@ enum BOOTSTRAPPER_APPLICATION_MESSAGE
141 BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE, 141 BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE,
142 BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN, 142 BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN,
143 BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE, 143 BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE,
144 BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN,
145 BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE,
146 BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN,
147 BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE,
144}; 148};
145 149
146enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION 150enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION
@@ -818,6 +822,27 @@ struct BA_ONLAUNCHAPPROVEDEXECOMPLETE_RESULTS
818 DWORD cbSize; 822 DWORD cbSize;
819}; 823};
820 824
825struct BA_ONPAUSEAUTOMATICUPDATESBEGIN_ARGS
826{
827 DWORD cbSize;
828};
829
830struct BA_ONPAUSEAUTOMATICUPDATESBEGIN_RESULTS
831{
832 DWORD cbSize;
833};
834
835struct BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_ARGS
836{
837 DWORD cbSize;
838 HRESULT hrStatus;
839};
840
841struct BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_RESULTS
842{
843 DWORD cbSize;
844};
845
821struct BA_ONPLANBEGIN_ARGS 846struct BA_ONPLANBEGIN_ARGS
822{ 847{
823 DWORD cbSize; 848 DWORD cbSize;
@@ -1061,6 +1086,27 @@ struct BA_ONSTARTUP_RESULTS
1061 DWORD cbSize; 1086 DWORD cbSize;
1062}; 1087};
1063 1088
1089struct BA_ONSYSTEMRESTOREPOINTBEGIN_ARGS
1090{
1091 DWORD cbSize;
1092};
1093
1094struct BA_ONSYSTEMRESTOREPOINTBEGIN_RESULTS
1095{
1096 DWORD cbSize;
1097};
1098
1099struct BA_ONSYSTEMRESTOREPOINTCOMPLETE_ARGS
1100{
1101 DWORD cbSize;
1102 HRESULT hrStatus;
1103};
1104
1105struct BA_ONSYSTEMRESTOREPOINTCOMPLETE_RESULTS
1106{
1107 DWORD cbSize;
1108};
1109
1064struct BA_ONSYSTEMSHUTDOWN_ARGS 1110struct BA_ONSYSTEMSHUTDOWN_ARGS
1065{ 1111{
1066 DWORD cbSize; 1112 DWORD cbSize;
diff --git a/src/engine/core.cpp b/src/engine/core.cpp
index aeae6bea..028dc1cc 100644
--- a/src/engine/core.cpp
+++ b/src/engine/core.cpp
@@ -626,7 +626,7 @@ extern "C" HRESULT CoreApply(
626 hr = CoreElevate(pEngineState, pEngineState->userExperience.hwndApply); 626 hr = CoreElevate(pEngineState, pEngineState->userExperience.hwndApply);
627 ExitOnFailure(hr, "Failed to elevate."); 627 ExitOnFailure(hr, "Failed to elevate.");
628 628
629 hr = ElevationApplyInitialize(pEngineState->companionConnection.hPipe, &pEngineState->variables, pEngineState->plan.action, pEngineState->automaticUpdates, !pEngineState->fDisableSystemRestore); 629 hr = ElevationApplyInitialize(pEngineState->companionConnection.hPipe, &pEngineState->userExperience, &pEngineState->variables, pEngineState->plan.action, pEngineState->automaticUpdates, !pEngineState->fDisableSystemRestore);
630 ExitOnFailure(hr, "Another per-machine setup is already executing."); 630 ExitOnFailure(hr, "Another per-machine setup is already executing.");
631 631
632 fElevated = TRUE; 632 fElevated = TRUE;
diff --git a/src/engine/elevation.cpp b/src/engine/elevation.cpp
index 1d0e1f1d..af5610dc 100644
--- a/src/engine/elevation.cpp
+++ b/src/engine/elevation.cpp
@@ -32,6 +32,10 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE
32 BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION, 32 BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION,
33 BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION, 33 BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION,
34 34
35 BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_BEGIN,
36 BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_COMPLETE,
37 BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_BEGIN,
38 BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_COMPLETE,
35 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PROGRESS, 39 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PROGRESS,
36 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR, 40 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR,
37 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE, 41 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE,
@@ -42,6 +46,13 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE
42 46
43// struct 47// struct
44 48
49typedef struct _BURN_ELEVATION_APPLY_INITIALIZE_MESSAGE_CONTEXT
50{
51 BURN_USER_EXPERIENCE* pBA;
52 BOOL fPauseCompleteNeeded;
53 BOOL fSrpCompleteNeeded;
54} BURN_ELEVATION_APPLY_INITIALIZE_MESSAGE_CONTEXT;
55
45typedef struct _BURN_ELEVATION_GENERIC_MESSAGE_CONTEXT 56typedef struct _BURN_ELEVATION_GENERIC_MESSAGE_CONTEXT
46{ 57{
47 PFN_GENERICMESSAGEHANDLER pfnGenericMessageHandler; 58 PFN_GENERICMESSAGEHANDLER pfnGenericMessageHandler;
@@ -89,6 +100,11 @@ static HRESULT OnLoadCompatiblePackage(
89 __in BYTE* pbData, 100 __in BYTE* pbData,
90 __in DWORD cbData 101 __in DWORD cbData
91 ); 102 );
103static HRESULT ProcessApplyInitializeMessages(
104 __in BURN_PIPE_MESSAGE* pMsg,
105 __in_opt LPVOID pvContext,
106 __out DWORD* pdwResult
107 );
92static HRESULT ProcessGenericExecuteMessages( 108static HRESULT ProcessGenericExecuteMessages(
93 __in BURN_PIPE_MESSAGE* pMsg, 109 __in BURN_PIPE_MESSAGE* pMsg,
94 __in_opt LPVOID pvContext, 110 __in_opt LPVOID pvContext,
@@ -119,6 +135,7 @@ static HRESULT ProcessResult(
119 __out BOOTSTRAPPER_APPLY_RESTART* pRestart 135 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
120 ); 136 );
121static HRESULT OnApplyInitialize( 137static HRESULT OnApplyInitialize(
138 __in HANDLE hPipe,
122 __in BURN_VARIABLES* pVariables, 139 __in BURN_VARIABLES* pVariables,
123 __in BURN_REGISTRATION* pRegistration, 140 __in BURN_REGISTRATION* pRegistration,
124 __in HANDLE* phLock, 141 __in HANDLE* phLock,
@@ -245,7 +262,20 @@ static HRESULT OnMsiRollbackTransaction(
245 __in BYTE* pbData, 262 __in BYTE* pbData,
246 __in DWORD cbData 263 __in DWORD cbData
247 ); 264 );
248 265static HRESULT ElevatedOnPauseAUBegin(
266 __in HANDLE hPipe
267 );
268static HRESULT ElevatedOnPauseAUComplete(
269 __in HANDLE hPipe,
270 __in HRESULT hrStatus
271 );
272static HRESULT ElevatedOnSystemRestorePointBegin(
273 __in HANDLE hPipe
274 );
275static HRESULT ElevatedOnSystemRestorePointComplete(
276 __in HANDLE hPipe,
277 __in HRESULT hrStatus
278 );
249 279
250 280
251// function definitions 281// function definitions
@@ -321,6 +351,7 @@ LExit:
321 351
322extern "C" HRESULT ElevationApplyInitialize( 352extern "C" HRESULT ElevationApplyInitialize(
323 __in HANDLE hPipe, 353 __in HANDLE hPipe,
354 __in BURN_USER_EXPERIENCE* pBA,
324 __in BURN_VARIABLES* pVariables, 355 __in BURN_VARIABLES* pVariables,
325 __in BOOTSTRAPPER_ACTION action, 356 __in BOOTSTRAPPER_ACTION action,
326 __in BURN_AU_PAUSE_ACTION auAction, 357 __in BURN_AU_PAUSE_ACTION auAction,
@@ -331,6 +362,9 @@ extern "C" HRESULT ElevationApplyInitialize(
331 BYTE* pbData = NULL; 362 BYTE* pbData = NULL;
332 SIZE_T cbData = 0; 363 SIZE_T cbData = 0;
333 DWORD dwResult = 0; 364 DWORD dwResult = 0;
365 BURN_ELEVATION_APPLY_INITIALIZE_MESSAGE_CONTEXT context = { };
366
367 context.pBA = pBA;
334 368
335 // serialize message data 369 // serialize message data
336 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)action); 370 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)action);
@@ -346,11 +380,21 @@ extern "C" HRESULT ElevationApplyInitialize(
346 ExitOnFailure(hr, "Failed to write variables."); 380 ExitOnFailure(hr, "Failed to write variables.");
347 381
348 // send message 382 // send message
349 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE, pbData, cbData, NULL, NULL, &dwResult); 383 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE, pbData, cbData, ProcessApplyInitializeMessages, &context, &dwResult);
350 ExitOnFailure(hr, "Failed to send message to per-machine process."); 384 ExitOnFailure(hr, "Failed to send message to per-machine process.");
351 385
352 hr = (HRESULT)dwResult; 386 hr = (HRESULT)dwResult;
353 387
388 // Best effort to keep the sequence of BA events sane.
389 if (context.fPauseCompleteNeeded)
390 {
391 UserExperienceOnPauseAUComplete(pBA, hr);
392 }
393 if (context.fSrpCompleteNeeded)
394 {
395 UserExperienceOnSystemRestorePointComplete(pBA, hr);
396 }
397
354LExit: 398LExit:
355 ReleaseBuffer(pbData); 399 ReleaseBuffer(pbData);
356 400
@@ -1317,6 +1361,68 @@ LExit:
1317 return hr; 1361 return hr;
1318} 1362}
1319 1363
1364static HRESULT ProcessApplyInitializeMessages(
1365 __in BURN_PIPE_MESSAGE* pMsg,
1366 __in_opt LPVOID pvContext,
1367 __out DWORD* pdwResult
1368 )
1369{
1370 HRESULT hr = S_OK;
1371 BURN_ELEVATION_APPLY_INITIALIZE_MESSAGE_CONTEXT* pContext = static_cast<BURN_ELEVATION_APPLY_INITIALIZE_MESSAGE_CONTEXT*>(pvContext);
1372 BYTE* pbData = (BYTE*)pMsg->pvData;
1373 SIZE_T iData = 0;
1374 HRESULT hrStatus = S_OK;
1375 HRESULT hrBA = S_OK;
1376
1377 // Process the message.
1378 switch (pMsg->dwMessage)
1379 {
1380 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_BEGIN:
1381 pContext->fPauseCompleteNeeded = TRUE;
1382 hrBA = UserExperienceOnPauseAUBegin(pContext->pBA);
1383 break;
1384
1385 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_COMPLETE:
1386 // read hrStatus
1387 hr = BuffReadNumber(pbData, pMsg->cbData, &iData, reinterpret_cast<DWORD*>(&hrStatus));
1388 ExitOnFailure(hr, "Failed to read pause AU hrStatus.");
1389
1390 pContext->fPauseCompleteNeeded = FALSE;
1391 hrBA = UserExperienceOnPauseAUComplete(pContext->pBA, hrStatus);
1392 break;
1393
1394 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_BEGIN:
1395 if (pContext->fPauseCompleteNeeded)
1396 {
1397 pContext->fPauseCompleteNeeded = FALSE;
1398 hrBA = UserExperienceOnPauseAUComplete(pContext->pBA, E_INVALIDSTATE);
1399 }
1400
1401 pContext->fSrpCompleteNeeded = TRUE;
1402 hrBA = UserExperienceOnSystemRestorePointBegin(pContext->pBA);
1403 break;
1404
1405 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_COMPLETE:
1406 // read hrStatus
1407 hr = BuffReadNumber(pbData, pMsg->cbData, &iData, reinterpret_cast<DWORD*>(&hrStatus));
1408 ExitOnFailure(hr, "Failed to read system restore point hrStatus.");
1409
1410 pContext->fSrpCompleteNeeded = FALSE;
1411 hrBA = UserExperienceOnSystemRestorePointComplete(pContext->pBA, hrStatus);
1412 break;
1413
1414 default:
1415 hr = E_INVALIDARG;
1416 ExitOnRootFailure(hr, "Invalid apply initialize message.");
1417 break;
1418 }
1419
1420 *pdwResult = static_cast<DWORD>(hrBA);
1421
1422LExit:
1423 return hr;
1424}
1425
1320static HRESULT ProcessGenericExecuteMessages( 1426static HRESULT ProcessGenericExecuteMessages(
1321 __in BURN_PIPE_MESSAGE* pMsg, 1427 __in BURN_PIPE_MESSAGE* pMsg,
1322 __in_opt LPVOID pvContext, 1428 __in_opt LPVOID pvContext,
@@ -1385,7 +1491,7 @@ static HRESULT ProcessGenericExecuteMessages(
1385 } 1491 }
1386 1492
1387 // send message 1493 // send message
1388 *pdwResult = (DWORD)pContext->pfnGenericMessageHandler(&message, pContext->pvContext);; 1494 *pdwResult = (DWORD)pContext->pfnGenericMessageHandler(&message, pContext->pvContext);
1389 1495
1390LExit: 1496LExit:
1391 ReleaseStr(sczMessage); 1497 ReleaseStr(sczMessage);
@@ -1562,7 +1668,7 @@ static HRESULT ProcessElevatedChildMessage(
1562 break; 1668 break;
1563 1669
1564 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE: 1670 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE:
1565 hrResult = OnApplyInitialize(pContext->pVariables, pContext->pRegistration, pContext->phLock, pContext->pfDisabledAutomaticUpdates, (BYTE*)pMsg->pvData, pMsg->cbData); 1671 hrResult = OnApplyInitialize(pContext->hPipe, pContext->pVariables, pContext->pRegistration, pContext->phLock, pContext->pfDisabledAutomaticUpdates, (BYTE*)pMsg->pvData, pMsg->cbData);
1566 break; 1672 break;
1567 1673
1568 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_UNINITIALIZE: 1674 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_UNINITIALIZE:
@@ -1697,6 +1803,7 @@ static HRESULT ProcessResult(
1697} 1803}
1698 1804
1699static HRESULT OnApplyInitialize( 1805static HRESULT OnApplyInitialize(
1806 __in HANDLE hPipe,
1700 __in BURN_VARIABLES* pVariables, 1807 __in BURN_VARIABLES* pVariables,
1701 __in BURN_REGISTRATION* pRegistration, 1808 __in BURN_REGISTRATION* pRegistration,
1702 __in HANDLE* phLock, 1809 __in HANDLE* phLock,
@@ -1711,6 +1818,7 @@ static HRESULT OnApplyInitialize(
1711 DWORD dwAUAction = 0; 1818 DWORD dwAUAction = 0;
1712 DWORD dwTakeSystemRestorePoint = 0; 1819 DWORD dwTakeSystemRestorePoint = 0;
1713 LPWSTR sczBundleName = NULL; 1820 LPWSTR sczBundleName = NULL;
1821 HRESULT hrStatus = S_OK;
1714 1822
1715 // Deserialize message data. 1823 // Deserialize message data.
1716 hr = BuffReadNumber(pbData, cbData, &iData, &dwAction); 1824 hr = BuffReadNumber(pbData, cbData, &iData, &dwAction);
@@ -1738,9 +1846,12 @@ static HRESULT OnApplyInitialize(
1738 // Attempt to pause AU with best effort. 1846 // Attempt to pause AU with best effort.
1739 if (BURN_AU_PAUSE_ACTION_IFELEVATED == dwAUAction || BURN_AU_PAUSE_ACTION_IFELEVATED_NORESUME == dwAUAction) 1847 if (BURN_AU_PAUSE_ACTION_IFELEVATED == dwAUAction || BURN_AU_PAUSE_ACTION_IFELEVATED_NORESUME == dwAUAction)
1740 { 1848 {
1849 hr = ElevatedOnPauseAUBegin(hPipe);
1850 ExitOnFailure(hr, "ElevatedOnPauseAUBegin failed.");
1851
1741 LogId(REPORT_STANDARD, MSG_PAUSE_AU_STARTING); 1852 LogId(REPORT_STANDARD, MSG_PAUSE_AU_STARTING);
1742 1853
1743 hr = WuaPauseAutomaticUpdates(); 1854 hrStatus = hr = WuaPauseAutomaticUpdates();
1744 if (FAILED(hr)) 1855 if (FAILED(hr))
1745 { 1856 {
1746 LogId(REPORT_STANDARD, MSG_FAILED_PAUSE_AU, hr); 1857 LogId(REPORT_STANDARD, MSG_FAILED_PAUSE_AU, hr);
@@ -1754,6 +1865,9 @@ static HRESULT OnApplyInitialize(
1754 *pfDisabledWindowsUpdate = TRUE; 1865 *pfDisabledWindowsUpdate = TRUE;
1755 } 1866 }
1756 } 1867 }
1868
1869 hr = ElevatedOnPauseAUComplete(hPipe, hrStatus);
1870 ExitOnFailure(hr, "ElevatedOnPauseAUComplete failed.");
1757 } 1871 }
1758 1872
1759 if (dwTakeSystemRestorePoint) 1873 if (dwTakeSystemRestorePoint)
@@ -1765,11 +1879,14 @@ static HRESULT OnApplyInitialize(
1765 ExitFunction(); 1879 ExitFunction();
1766 } 1880 }
1767 1881
1882 hr = ElevatedOnSystemRestorePointBegin(hPipe);
1883 ExitOnFailure(hr, "ElevatedOnSystemRestorePointBegin failed.");
1884
1768 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_STARTING); 1885 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_STARTING);
1769 1886
1770 BOOTSTRAPPER_ACTION action = static_cast<BOOTSTRAPPER_ACTION>(dwAction); 1887 BOOTSTRAPPER_ACTION action = static_cast<BOOTSTRAPPER_ACTION>(dwAction);
1771 SRP_ACTION restoreAction = (BOOTSTRAPPER_ACTION_INSTALL == action) ? SRP_ACTION_INSTALL : (BOOTSTRAPPER_ACTION_UNINSTALL == action) ? SRP_ACTION_UNINSTALL : SRP_ACTION_MODIFY; 1888 SRP_ACTION restoreAction = (BOOTSTRAPPER_ACTION_INSTALL == action) ? SRP_ACTION_INSTALL : (BOOTSTRAPPER_ACTION_UNINSTALL == action) ? SRP_ACTION_UNINSTALL : SRP_ACTION_MODIFY;
1772 hr = SrpCreateRestorePoint(sczBundleName, restoreAction); 1889 hrStatus = hr = SrpCreateRestorePoint(sczBundleName, restoreAction);
1773 if (SUCCEEDED(hr)) 1890 if (SUCCEEDED(hr))
1774 { 1891 {
1775 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_SUCCEEDED); 1892 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_SUCCEEDED);
@@ -1779,11 +1896,14 @@ static HRESULT OnApplyInitialize(
1779 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_DISABLED); 1896 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_DISABLED);
1780 hr = S_OK; 1897 hr = S_OK;
1781 } 1898 }
1782 else if (FAILED(hr)) 1899 else
1783 { 1900 {
1784 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_FAILED, hr); 1901 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_FAILED, hr);
1785 hr = S_OK; 1902 hr = S_OK;
1786 } 1903 }
1904
1905 hr = ElevatedOnSystemRestorePointComplete(hPipe, hrStatus);
1906 ExitOnFailure(hr, "ElevatedOnSystemRestorePointComplete failed.");
1787 } 1907 }
1788 1908
1789LExit: 1909LExit:
@@ -2699,7 +2819,7 @@ static int MsiExecuteMessageHandler(
2699 2819
2700 // send message 2820 // send message
2701 hr = PipeSendMessage(hPipe, dwMessage, pbData, cbData, NULL, NULL, (DWORD*)&nResult); 2821 hr = PipeSendMessage(hPipe, dwMessage, pbData, cbData, NULL, NULL, (DWORD*)&nResult);
2702 ExitOnFailure(hr, "Failed to send message to per-machine process."); 2822 ExitOnFailure(hr, "Failed to send msi message to per-user process.");
2703 2823
2704LExit: 2824LExit:
2705 ReleaseBuffer(pbData); 2825 ReleaseBuffer(pbData);
@@ -2867,3 +2987,75 @@ LExit:
2867 2987
2868 return hr; 2988 return hr;
2869} 2989}
2990
2991static HRESULT ElevatedOnPauseAUBegin(
2992 __in HANDLE hPipe
2993 )
2994{
2995 HRESULT hr = S_OK;
2996 DWORD dwResult = 0;
2997
2998 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_BEGIN, NULL, 0, NULL, NULL, &dwResult);
2999 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_BEGIN message to per-user process.");
3000
3001LExit:
3002 return hr;
3003}
3004
3005static HRESULT ElevatedOnPauseAUComplete(
3006 __in HANDLE hPipe,
3007 __in HRESULT hrStatus
3008 )
3009{
3010 HRESULT hr = S_OK;
3011 BYTE* pbSendData = NULL;
3012 SIZE_T cbSendData = 0;
3013 DWORD dwResult = 0;
3014
3015 hr = BuffWriteNumber(&pbSendData, &cbSendData, hrStatus);
3016 ExitOnFailure(hr, "Failed to write the pause au status to message buffer.");
3017
3018 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_COMPLETE, pbSendData, cbSendData, NULL, NULL, &dwResult);
3019 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_COMPLETE message to per-user process.");
3020
3021LExit:
3022 ReleaseBuffer(pbSendData);
3023
3024 return hr;
3025}
3026
3027static HRESULT ElevatedOnSystemRestorePointBegin(
3028 __in HANDLE hPipe
3029 )
3030{
3031 HRESULT hr = S_OK;
3032 DWORD dwResult = 0;
3033
3034 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_BEGIN, NULL, 0, NULL, NULL, &dwResult);
3035 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_BEGIN message to per-user process.");
3036
3037LExit:
3038 return hr;
3039}
3040
3041static HRESULT ElevatedOnSystemRestorePointComplete(
3042 __in HANDLE hPipe,
3043 __in HRESULT hrStatus
3044 )
3045{
3046 HRESULT hr = S_OK;
3047 BYTE* pbSendData = NULL;
3048 SIZE_T cbSendData = 0;
3049 DWORD dwResult = 0;
3050
3051 hr = BuffWriteNumber(&pbSendData, &cbSendData, hrStatus);
3052 ExitOnFailure(hr, "Failed to write the system restore point status to message buffer.");
3053
3054 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_COMPLETE, pbSendData, cbSendData, NULL, NULL, &dwResult);
3055 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_COMPLETE message to per-user process.");
3056
3057LExit:
3058 ReleaseBuffer(pbSendData);
3059
3060 return hr;
3061}
diff --git a/src/engine/elevation.h b/src/engine/elevation.h
index 96111ae2..05fecdf6 100644
--- a/src/engine/elevation.h
+++ b/src/engine/elevation.h
@@ -14,6 +14,7 @@ HRESULT ElevationElevate(
14 ); 14 );
15HRESULT ElevationApplyInitialize( 15HRESULT ElevationApplyInitialize(
16 __in HANDLE hPipe, 16 __in HANDLE hPipe,
17 __in BURN_USER_EXPERIENCE* pBA,
17 __in BURN_VARIABLES* pVariables, 18 __in BURN_VARIABLES* pVariables,
18 __in BOOTSTRAPPER_ACTION action, 19 __in BOOTSTRAPPER_ACTION action,
19 __in BURN_AU_PAUSE_ACTION auAction, 20 __in BURN_AU_PAUSE_ACTION auAction,
diff --git a/src/engine/userexperience.cpp b/src/engine/userexperience.cpp
index 08451f93..b5bdc623 100644
--- a/src/engine/userexperience.cpp
+++ b/src/engine/userexperience.cpp
@@ -1482,6 +1482,46 @@ LExit:
1482 return hr; 1482 return hr;
1483} 1483}
1484 1484
1485EXTERN_C BAAPI UserExperienceOnPauseAUBegin(
1486 __in BURN_USER_EXPERIENCE* pUserExperience
1487 )
1488{
1489 HRESULT hr = S_OK;
1490 BA_ONPAUSEAUTOMATICUPDATESBEGIN_ARGS args = { };
1491 BA_ONPAUSEAUTOMATICUPDATESBEGIN_RESULTS results = { };
1492
1493 args.cbSize = sizeof(args);
1494
1495 results.cbSize = sizeof(results);
1496
1497 hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN, &args, &results, pUserExperience->pvBAProcContext);
1498 ExitOnFailure(hr, "BA OnPauseAUBegin failed.");
1499
1500LExit:
1501 return hr;
1502}
1503
1504EXTERN_C BAAPI UserExperienceOnPauseAUComplete(
1505 __in BURN_USER_EXPERIENCE* pUserExperience,
1506 __in HRESULT hrStatus
1507 )
1508{
1509 HRESULT hr = S_OK;
1510 BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_ARGS args = { };
1511 BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_RESULTS results = { };
1512
1513 args.cbSize = sizeof(args);
1514 args.hrStatus = hrStatus;
1515
1516 results.cbSize = sizeof(results);
1517
1518 hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE, &args, &results, pUserExperience->pvBAProcContext);
1519 ExitOnFailure(hr, "BA OnPauseAUComplete failed.");
1520
1521LExit:
1522 return hr;
1523}
1524
1485EXTERN_C BAAPI UserExperienceOnPlanBegin( 1525EXTERN_C BAAPI UserExperienceOnPlanBegin(
1486 __in BURN_USER_EXPERIENCE* pUserExperience, 1526 __in BURN_USER_EXPERIENCE* pUserExperience,
1487 __in DWORD cPackages 1527 __in DWORD cPackages
@@ -1983,6 +2023,46 @@ LExit:
1983 return hr; 2023 return hr;
1984} 2024}
1985 2025
2026EXTERN_C BAAPI UserExperienceOnSystemRestorePointBegin(
2027 __in BURN_USER_EXPERIENCE* pUserExperience
2028 )
2029{
2030 HRESULT hr = S_OK;
2031 BA_ONSYSTEMRESTOREPOINTBEGIN_ARGS args = { };
2032 BA_ONSYSTEMRESTOREPOINTBEGIN_RESULTS results = { };
2033
2034 args.cbSize = sizeof(args);
2035
2036 results.cbSize = sizeof(results);
2037
2038 hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN, &args, &results, pUserExperience->pvBAProcContext);
2039 ExitOnFailure(hr, "BA OnSystemRestorePointBegin failed.");
2040
2041LExit:
2042 return hr;
2043}
2044
2045EXTERN_C BAAPI UserExperienceOnSystemRestorePointComplete(
2046 __in BURN_USER_EXPERIENCE* pUserExperience,
2047 __in HRESULT hrStatus
2048 )
2049{
2050 HRESULT hr = S_OK;
2051 BA_ONSYSTEMRESTOREPOINTCOMPLETE_ARGS args = { };
2052 BA_ONSYSTEMRESTOREPOINTCOMPLETE_RESULTS results = { };
2053
2054 args.cbSize = sizeof(args);
2055 args.hrStatus = hrStatus;
2056
2057 results.cbSize = sizeof(results);
2058
2059 hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE, &args, &results, pUserExperience->pvBAProcContext);
2060 ExitOnFailure(hr, "BA OnSystemRestorePointComplete failed.");
2061
2062LExit:
2063 return hr;
2064}
2065
1986EXTERN_C BAAPI UserExperienceOnSystemShutdown( 2066EXTERN_C BAAPI UserExperienceOnSystemShutdown(
1987 __in BURN_USER_EXPERIENCE* pUserExperience, 2067 __in BURN_USER_EXPERIENCE* pUserExperience,
1988 __in DWORD dwEndSession, 2068 __in DWORD dwEndSession,
diff --git a/src/engine/userexperience.h b/src/engine/userexperience.h
index 387ed62b..a02d968c 100644
--- a/src/engine/userexperience.h
+++ b/src/engine/userexperience.h
@@ -343,6 +343,13 @@ BAAPI UserExperienceOnLaunchApprovedExeComplete(
343 __in HRESULT hrStatus, 343 __in HRESULT hrStatus,
344 __in DWORD dwProcessId 344 __in DWORD dwProcessId
345 ); 345 );
346BAAPI UserExperienceOnPauseAUBegin(
347 __in BURN_USER_EXPERIENCE* pUserExperience
348 );
349BAAPI UserExperienceOnPauseAUComplete(
350 __in BURN_USER_EXPERIENCE* pUserExperience,
351 __in HRESULT hrStatus
352 );
346BAAPI UserExperienceOnPlanBegin( 353BAAPI UserExperienceOnPlanBegin(
347 __in BURN_USER_EXPERIENCE* pUserExperience, 354 __in BURN_USER_EXPERIENCE* pUserExperience,
348 __in DWORD cPackages 355 __in DWORD cPackages
@@ -445,6 +452,13 @@ BAAPI UserExperienceOnShutdown(
445BAAPI UserExperienceOnStartup( 452BAAPI UserExperienceOnStartup(
446 __in BURN_USER_EXPERIENCE* pUserExperience 453 __in BURN_USER_EXPERIENCE* pUserExperience
447 ); 454 );
455BAAPI UserExperienceOnSystemRestorePointBegin(
456 __in BURN_USER_EXPERIENCE* pUserExperience
457 );
458BAAPI UserExperienceOnSystemRestorePointComplete(
459 __in BURN_USER_EXPERIENCE* pUserExperience,
460 __in HRESULT hrStatus
461 );
448BAAPI UserExperienceOnSystemShutdown( 462BAAPI UserExperienceOnSystemShutdown(
449 __in BURN_USER_EXPERIENCE* pUserExperience, 463 __in BURN_USER_EXPERIENCE* pUserExperience,
450 __in DWORD dwEndSession, 464 __in DWORD dwEndSession,