@joebigelow / wix / commits / 4ca0a5b2

Add BA messages around system restore points.

Sean Hall committed Nov 16, 2020 at 21:59 UTC 4ca0a5b2a8711cae9e60cb4075799bffef4ce75a
6 files changed +342 -9
src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h
+46
@@ -141,6 +141,10 @@ enum BOOTSTRAPPER_APPLICATION_MESSAGE
141 BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE,
142 BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN,
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,
148 };
149
150 enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION
@@ -818,6 +822,27 @@ struct BA_ONLAUNCHAPPROVEDEXECOMPLETE_RESULTS
822 DWORD cbSize;
823 };
824
825 +struct BA_ONPAUSEAUTOMATICUPDATESBEGIN_ARGS
826 +{
827 + DWORD cbSize;
828 +};
829 +
830 +struct BA_ONPAUSEAUTOMATICUPDATESBEGIN_RESULTS
831 +{
832 + DWORD cbSize;
833 +};
834 +
835 +struct BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_ARGS
836 +{
837 + DWORD cbSize;
838 + HRESULT hrStatus;
839 +};
840 +
841 +struct BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_RESULTS
842 +{
843 + DWORD cbSize;
844 +};
845 +
846 struct BA_ONPLANBEGIN_ARGS
847 {
848 DWORD cbSize;
@@ -1061,6 +1086,27 @@ struct BA_ONSTARTUP_RESULTS
1086 DWORD cbSize;
1087 };
1088
1089 +struct BA_ONSYSTEMRESTOREPOINTBEGIN_ARGS
1090 +{
1091 + DWORD cbSize;
1092 +};
1093 +
1094 +struct BA_ONSYSTEMRESTOREPOINTBEGIN_RESULTS
1095 +{
1096 + DWORD cbSize;
1097 +};
1098 +
1099 +struct BA_ONSYSTEMRESTOREPOINTCOMPLETE_ARGS
1100 +{
1101 + DWORD cbSize;
1102 + HRESULT hrStatus;
1103 +};
1104 +
1105 +struct BA_ONSYSTEMRESTOREPOINTCOMPLETE_RESULTS
1106 +{
1107 + DWORD cbSize;
1108 +};
1109 +
1110 struct BA_ONSYSTEMSHUTDOWN_ARGS
1111 {
1112 DWORD cbSize;
src/engine/core.cpp
+1 -1
@@ -626,7 +626,7 @@ extern "C" HRESULT CoreApply(
626 hr = CoreElevate(pEngineState, pEngineState->userExperience.hwndApply);
627 ExitOnFailure(hr, "Failed to elevate.");
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.");
631
632 fElevated = TRUE;
src/engine/elevation.cpp
+200 -8
@@ -32,6 +32,10 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE
32 BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION,
33 BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION,
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,
39 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PROGRESS,
40 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR,
41 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE,
@@ -42,6 +46,13 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE
46
47 // struct
48
49 +typedef 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 +
56 typedef struct _BURN_ELEVATION_GENERIC_MESSAGE_CONTEXT
57 {
58 PFN_GENERICMESSAGEHANDLER pfnGenericMessageHandler;
@@ -89,6 +100,11 @@ static HRESULT OnLoadCompatiblePackage(
100 __in BYTE* pbData,
101 __in DWORD cbData
102 );
103 +static HRESULT ProcessApplyInitializeMessages(
104 + __in BURN_PIPE_MESSAGE* pMsg,
105 + __in_opt LPVOID pvContext,
106 + __out DWORD* pdwResult
107 + );
108 static HRESULT ProcessGenericExecuteMessages(
109 __in BURN_PIPE_MESSAGE* pMsg,
110 __in_opt LPVOID pvContext,
@@ -119,6 +135,7 @@ static HRESULT ProcessResult(
135 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
136 );
137 static HRESULT OnApplyInitialize(
138 + __in HANDLE hPipe,
139 __in BURN_VARIABLES* pVariables,
140 __in BURN_REGISTRATION* pRegistration,
141 __in HANDLE* phLock,
@@ -245,7 +262,20 @@ static HRESULT OnMsiRollbackTransaction(
262 __in BYTE* pbData,
263 __in DWORD cbData
264 );
248 -
265 +static HRESULT ElevatedOnPauseAUBegin(
266 + __in HANDLE hPipe
267 + );
268 +static HRESULT ElevatedOnPauseAUComplete(
269 + __in HANDLE hPipe,
270 + __in HRESULT hrStatus
271 + );
272 +static HRESULT ElevatedOnSystemRestorePointBegin(
273 + __in HANDLE hPipe
274 + );
275 +static HRESULT ElevatedOnSystemRestorePointComplete(
276 + __in HANDLE hPipe,
277 + __in HRESULT hrStatus
278 + );
279
280
281 // function definitions
@@ -321,6 +351,7 @@ LExit:
351
352 extern "C" HRESULT ElevationApplyInitialize(
353 __in HANDLE hPipe,
354 + __in BURN_USER_EXPERIENCE* pBA,
355 __in BURN_VARIABLES* pVariables,
356 __in BOOTSTRAPPER_ACTION action,
357 __in BURN_AU_PAUSE_ACTION auAction,
@@ -331,6 +362,9 @@ extern "C" HRESULT ElevationApplyInitialize(
362 BYTE* pbData = NULL;
363 SIZE_T cbData = 0;
364 DWORD dwResult = 0;
365 + BURN_ELEVATION_APPLY_INITIALIZE_MESSAGE_CONTEXT context = { };
366 +
367 + context.pBA = pBA;
368
369 // serialize message data
370 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)action);
@@ -346,11 +380,21 @@ extern "C" HRESULT ElevationApplyInitialize(
380 ExitOnFailure(hr, "Failed to write variables.");
381
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);
384 ExitOnFailure(hr, "Failed to send message to per-machine process.");
385
386 hr = (HRESULT)dwResult;
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 +
398 LExit:
399 ReleaseBuffer(pbData);
400
@@ -1317,6 +1361,68 @@ LExit:
1361 return hr;
1362 }
1363
1364 +static 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 +
1422 +LExit:
1423 + return hr;
1424 +}
1425 +
1426 static HRESULT ProcessGenericExecuteMessages(
1427 __in BURN_PIPE_MESSAGE* pMsg,
1428 __in_opt LPVOID pvContext,
@@ -1385,7 +1491,7 @@ static HRESULT ProcessGenericExecuteMessages(
1491 }
1492
1493 // send message
1388 - *pdwResult = (DWORD)pContext->pfnGenericMessageHandler(&message, pContext->pvContext);;
1494 + *pdwResult = (DWORD)pContext->pfnGenericMessageHandler(&message, pContext->pvContext);
1495
1496 LExit:
1497 ReleaseStr(sczMessage);
@@ -1562,7 +1668,7 @@ static HRESULT ProcessElevatedChildMessage(
1668 break;
1669
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);
1672 break;
1673
1674 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_UNINITIALIZE:
@@ -1697,6 +1803,7 @@ static HRESULT ProcessResult(
1803 }
1804
1805 static HRESULT OnApplyInitialize(
1806 + __in HANDLE hPipe,
1807 __in BURN_VARIABLES* pVariables,
1808 __in BURN_REGISTRATION* pRegistration,
1809 __in HANDLE* phLock,
@@ -1711,6 +1818,7 @@ static HRESULT OnApplyInitialize(
1818 DWORD dwAUAction = 0;
1819 DWORD dwTakeSystemRestorePoint = 0;
1820 LPWSTR sczBundleName = NULL;
1821 + HRESULT hrStatus = S_OK;
1822
1823 // Deserialize message data.
1824 hr = BuffReadNumber(pbData, cbData, &iData, &dwAction);
@@ -1738,9 +1846,12 @@ static HRESULT OnApplyInitialize(
1846 // Attempt to pause AU with best effort.
1847 if (BURN_AU_PAUSE_ACTION_IFELEVATED == dwAUAction || BURN_AU_PAUSE_ACTION_IFELEVATED_NORESUME == dwAUAction)
1848 {
1849 + hr = ElevatedOnPauseAUBegin(hPipe);
1850 + ExitOnFailure(hr, "ElevatedOnPauseAUBegin failed.");
1851 +
1852 LogId(REPORT_STANDARD, MSG_PAUSE_AU_STARTING);
1853
1743 - hr = WuaPauseAutomaticUpdates();
1854 + hrStatus = hr = WuaPauseAutomaticUpdates();
1855 if (FAILED(hr))
1856 {
1857 LogId(REPORT_STANDARD, MSG_FAILED_PAUSE_AU, hr);
@@ -1754,6 +1865,9 @@ static HRESULT OnApplyInitialize(
1865 *pfDisabledWindowsUpdate = TRUE;
1866 }
1867 }
1868 +
1869 + hr = ElevatedOnPauseAUComplete(hPipe, hrStatus);
1870 + ExitOnFailure(hr, "ElevatedOnPauseAUComplete failed.");
1871 }
1872
1873 if (dwTakeSystemRestorePoint)
@@ -1765,11 +1879,14 @@ static HRESULT OnApplyInitialize(
1879 ExitFunction();
1880 }
1881
1882 + hr = ElevatedOnSystemRestorePointBegin(hPipe);
1883 + ExitOnFailure(hr, "ElevatedOnSystemRestorePointBegin failed.");
1884 +
1885 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_STARTING);
1886
1887 BOOTSTRAPPER_ACTION action = static_cast<BOOTSTRAPPER_ACTION>(dwAction);
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);
1890 if (SUCCEEDED(hr))
1891 {
1892 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_SUCCEEDED);
@@ -1779,11 +1896,14 @@ static HRESULT OnApplyInitialize(
1896 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_DISABLED);
1897 hr = S_OK;
1898 }
1782 - else if (FAILED(hr))
1899 + else
1900 {
1901 LogId(REPORT_STANDARD, MSG_SYSTEM_RESTORE_POINT_FAILED, hr);
1902 hr = S_OK;
1903 }
1904 +
1905 + hr = ElevatedOnSystemRestorePointComplete(hPipe, hrStatus);
1906 + ExitOnFailure(hr, "ElevatedOnSystemRestorePointComplete failed.");
1907 }
1908
1909 LExit:
@@ -2699,7 +2819,7 @@ static int MsiExecuteMessageHandler(
2819
2820 // send message
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.");
2823
2824 LExit:
2825 ReleaseBuffer(pbData);
@@ -2867,3 +2987,75 @@ LExit:
2987
2988 return hr;
2989 }
2990 +
2991 +static 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 +
3001 +LExit:
3002 + return hr;
3003 +}
3004 +
3005 +static 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 +
3021 +LExit:
3022 + ReleaseBuffer(pbSendData);
3023 +
3024 + return hr;
3025 +}
3026 +
3027 +static 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 +
3037 +LExit:
3038 + return hr;
3039 +}
3040 +
3041 +static 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 +
3057 +LExit:
3058 + ReleaseBuffer(pbSendData);
3059 +
3060 + return hr;
3061 +}
src/engine/elevation.h
+1
@@ -14,6 +14,7 @@ HRESULT ElevationElevate(
14 );
15 HRESULT ElevationApplyInitialize(
16 __in HANDLE hPipe,
17 + __in BURN_USER_EXPERIENCE* pBA,
18 __in BURN_VARIABLES* pVariables,
19 __in BOOTSTRAPPER_ACTION action,
20 __in BURN_AU_PAUSE_ACTION auAction,
src/engine/userexperience.cpp
+80
@@ -1482,6 +1482,46 @@ LExit:
1482 return hr;
1483 }
1484
1485 +EXTERN_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 +
1500 +LExit:
1501 + return hr;
1502 +}
1503 +
1504 +EXTERN_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 +
1521 +LExit:
1522 + return hr;
1523 +}
1524 +
1525 EXTERN_C BAAPI UserExperienceOnPlanBegin(
1526 __in BURN_USER_EXPERIENCE* pUserExperience,
1527 __in DWORD cPackages
@@ -1983,6 +2023,46 @@ LExit:
2023 return hr;
2024 }
2025
2026 +EXTERN_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 +
2041 +LExit:
2042 + return hr;
2043 +}
2044 +
2045 +EXTERN_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 +
2062 +LExit:
2063 + return hr;
2064 +}
2065 +
2066 EXTERN_C BAAPI UserExperienceOnSystemShutdown(
2067 __in BURN_USER_EXPERIENCE* pUserExperience,
2068 __in DWORD dwEndSession,
src/engine/userexperience.h
+14
@@ -343,6 +343,13 @@ BAAPI UserExperienceOnLaunchApprovedExeComplete(
343 __in HRESULT hrStatus,
344 __in DWORD dwProcessId
345 );
346 +BAAPI UserExperienceOnPauseAUBegin(
347 + __in BURN_USER_EXPERIENCE* pUserExperience
348 + );
349 +BAAPI UserExperienceOnPauseAUComplete(
350 + __in BURN_USER_EXPERIENCE* pUserExperience,
351 + __in HRESULT hrStatus
352 + );
353 BAAPI UserExperienceOnPlanBegin(
354 __in BURN_USER_EXPERIENCE* pUserExperience,
355 __in DWORD cPackages
@@ -445,6 +452,13 @@ BAAPI UserExperienceOnShutdown(
452 BAAPI UserExperienceOnStartup(
453 __in BURN_USER_EXPERIENCE* pUserExperience
454 );
455 +BAAPI UserExperienceOnSystemRestorePointBegin(
456 + __in BURN_USER_EXPERIENCE* pUserExperience
457 + );
458 +BAAPI UserExperienceOnSystemRestorePointComplete(
459 + __in BURN_USER_EXPERIENCE* pUserExperience,
460 + __in HRESULT hrStatus
461 + );
462 BAAPI UserExperienceOnSystemShutdown(
463 __in BURN_USER_EXPERIENCE* pUserExperience,
464 __in DWORD dwEndSession,