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,