diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2020-11-16 21:59:26 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2020-11-17 19:06:00 -0600 |
| commit | 4ca0a5b2a8711cae9e60cb4075799bffef4ce75a (patch) | |
| tree | 8b3a1fb83ec73de23457f202aa2f2c5468af0dc6 /src | |
| parent | 7d45238e97c35ccea1f77be9065b9a3ed9213bfb (diff) | |
| download | wix-4ca0a5b2a8711cae9e60cb4075799bffef4ce75a.tar.gz wix-4ca0a5b2a8711cae9e60cb4075799bffef4ce75a.tar.bz2 wix-4ca0a5b2a8711cae9e60cb4075799bffef4ce75a.zip | |
Add BA messages around system restore points.
Diffstat (limited to 'src')
| -rw-r--r-- | src/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h | 46 | ||||
| -rw-r--r-- | src/engine/core.cpp | 2 | ||||
| -rw-r--r-- | src/engine/elevation.cpp | 208 | ||||
| -rw-r--r-- | src/engine/elevation.h | 1 | ||||
| -rw-r--r-- | src/engine/userexperience.cpp | 80 | ||||
| -rw-r--r-- | src/engine/userexperience.h | 14 |
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 | ||
| 146 | enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION | 150 | enum BOOTSTRAPPER_APPLYCOMPLETE_ACTION |
| @@ -818,6 +822,27 @@ struct BA_ONLAUNCHAPPROVEDEXECOMPLETE_RESULTS | |||
| 818 | DWORD cbSize; | 822 | DWORD cbSize; |
| 819 | }; | 823 | }; |
| 820 | 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 | |||
| 821 | struct BA_ONPLANBEGIN_ARGS | 846 | struct 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 | ||
| 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 | |||
| 1064 | struct BA_ONSYSTEMSHUTDOWN_ARGS | 1110 | struct 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 | ||
| 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 | |||
| 45 | typedef struct _BURN_ELEVATION_GENERIC_MESSAGE_CONTEXT | 56 | typedef 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 | ); |
| 103 | static HRESULT ProcessApplyInitializeMessages( | ||
| 104 | __in BURN_PIPE_MESSAGE* pMsg, | ||
| 105 | __in_opt LPVOID pvContext, | ||
| 106 | __out DWORD* pdwResult | ||
| 107 | ); | ||
| 92 | static HRESULT ProcessGenericExecuteMessages( | 108 | static 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 | ); |
| 121 | static HRESULT OnApplyInitialize( | 137 | static 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 | 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 | ); | ||
| 249 | 279 | ||
| 250 | 280 | ||
| 251 | // function definitions | 281 | // function definitions |
| @@ -321,6 +351,7 @@ LExit: | |||
| 321 | 351 | ||
| 322 | extern "C" HRESULT ElevationApplyInitialize( | 352 | extern "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 | |||
| 354 | LExit: | 398 | LExit: |
| 355 | ReleaseBuffer(pbData); | 399 | ReleaseBuffer(pbData); |
| 356 | 400 | ||
| @@ -1317,6 +1361,68 @@ LExit: | |||
| 1317 | return hr; | 1361 | return hr; |
| 1318 | } | 1362 | } |
| 1319 | 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 | |||
| 1320 | static HRESULT ProcessGenericExecuteMessages( | 1426 | static 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 | ||
| 1390 | LExit: | 1496 | LExit: |
| 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 | ||
| 1699 | static HRESULT OnApplyInitialize( | 1805 | static 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 | ||
| 1789 | LExit: | 1909 | LExit: |
| @@ -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 | ||
| 2704 | LExit: | 2824 | LExit: |
| 2705 | ReleaseBuffer(pbData); | 2825 | ReleaseBuffer(pbData); |
| @@ -2867,3 +2987,75 @@ LExit: | |||
| 2867 | 2987 | ||
| 2868 | return hr; | 2988 | return hr; |
| 2869 | } | 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 | } | ||
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 | ); |
| 15 | HRESULT ElevationApplyInitialize( | 15 | HRESULT 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 | ||
| 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 | |||
| 1485 | EXTERN_C BAAPI UserExperienceOnPlanBegin( | 1525 | EXTERN_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 | ||
| 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 | |||
| 1986 | EXTERN_C BAAPI UserExperienceOnSystemShutdown( | 2066 | EXTERN_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 | ); |
| 346 | BAAPI UserExperienceOnPauseAUBegin( | ||
| 347 | __in BURN_USER_EXPERIENCE* pUserExperience | ||
| 348 | ); | ||
| 349 | BAAPI UserExperienceOnPauseAUComplete( | ||
| 350 | __in BURN_USER_EXPERIENCE* pUserExperience, | ||
| 351 | __in HRESULT hrStatus | ||
| 352 | ); | ||
| 346 | BAAPI UserExperienceOnPlanBegin( | 353 | BAAPI 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( | |||
| 445 | BAAPI UserExperienceOnStartup( | 452 | BAAPI UserExperienceOnStartup( |
| 446 | __in BURN_USER_EXPERIENCE* pUserExperience | 453 | __in BURN_USER_EXPERIENCE* pUserExperience |
| 447 | ); | 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 | ); | ||
| 448 | BAAPI UserExperienceOnSystemShutdown( | 462 | BAAPI UserExperienceOnSystemShutdown( |
| 449 | __in BURN_USER_EXPERIENCE* pUserExperience, | 463 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 450 | __in DWORD dwEndSession, | 464 | __in DWORD dwEndSession, |
