diff options
| author | Nir Bar <nir.bar@panel-sw.co.il> | 2022-12-06 13:22:41 +0200 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-12-12 21:50:39 -0600 |
| commit | 50e24e9cf2084b6cb67b5d8fc509163061408bb6 (patch) | |
| tree | 05c9df57480eb6308c3462c13847b43288f9dbb4 /src/burn/engine/elevation.cpp | |
| parent | c54f3083489827a1e57c6fd7f3d76f62ddc6e85e (diff) | |
| download | wix-50e24e9cf2084b6cb67b5d8fc509163061408bb6.tar.gz wix-50e24e9cf2084b6cb67b5d8fc509163061408bb6.tar.bz2 wix-50e24e9cf2084b6cb67b5d8fc509163061408bb6.zip | |
Use MSI transaction end result to detect whether reboot is needed
Diffstat (limited to 'src/burn/engine/elevation.cpp')
| -rw-r--r-- | src/burn/engine/elevation.cpp | 80 |
1 files changed, 52 insertions, 28 deletions
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp index 154c407d..63a76c2c 100644 --- a/src/burn/engine/elevation.cpp +++ b/src/burn/engine/elevation.cpp | |||
| @@ -371,12 +371,14 @@ static HRESULT OnMsiBeginTransaction( | |||
| 371 | static HRESULT OnMsiCommitTransaction( | 371 | static HRESULT OnMsiCommitTransaction( |
| 372 | __in BURN_PACKAGES* pPackages, | 372 | __in BURN_PACKAGES* pPackages, |
| 373 | __in BYTE* pbData, | 373 | __in BYTE* pbData, |
| 374 | __in SIZE_T cbData | 374 | __in SIZE_T cbData, |
| 375 | __out BOOTSTRAPPER_APPLY_RESTART *pRestart | ||
| 375 | ); | 376 | ); |
| 376 | static HRESULT OnMsiRollbackTransaction( | 377 | static HRESULT OnMsiRollbackTransaction( |
| 377 | __in BURN_PACKAGES* pPackages, | 378 | __in BURN_PACKAGES* pPackages, |
| 378 | __in BYTE* pbData, | 379 | __in BYTE* pbData, |
| 379 | __in SIZE_T cbData | 380 | __in SIZE_T cbData, |
| 381 | __out BOOTSTRAPPER_APPLY_RESTART *pRestart | ||
| 380 | ); | 382 | ); |
| 381 | static HRESULT ElevatedOnPauseAUBegin( | 383 | static HRESULT ElevatedOnPauseAUBegin( |
| 382 | __in HANDLE hPipe | 384 | __in HANDLE hPipe |
| @@ -496,7 +498,7 @@ extern "C" HRESULT ElevationApplyInitialize( | |||
| 496 | 498 | ||
| 497 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)!pPlan->pInternalCommand->fDisableSystemRestore); | 499 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)!pPlan->pInternalCommand->fDisableSystemRestore); |
| 498 | ExitOnFailure(hr, "Failed to write system restore point action to message buffer."); | 500 | ExitOnFailure(hr, "Failed to write system restore point action to message buffer."); |
| 499 | 501 | ||
| 500 | hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData); | 502 | hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData); |
| 501 | ExitOnFailure(hr, "Failed to write variables."); | 503 | ExitOnFailure(hr, "Failed to write variables."); |
| 502 | 504 | ||
| @@ -544,7 +546,7 @@ LExit: | |||
| 544 | } | 546 | } |
| 545 | 547 | ||
| 546 | /******************************************************************* | 548 | /******************************************************************* |
| 547 | ElevationSessionBegin - | 549 | ElevationSessionBegin - |
| 548 | 550 | ||
| 549 | *******************************************************************/ | 551 | *******************************************************************/ |
| 550 | extern "C" HRESULT ElevationSessionBegin( | 552 | extern "C" HRESULT ElevationSessionBegin( |
| @@ -602,7 +604,7 @@ LExit: | |||
| 602 | } | 604 | } |
| 603 | 605 | ||
| 604 | /******************************************************************* | 606 | /******************************************************************* |
| 605 | ElevationSessionEnd - | 607 | ElevationSessionEnd - |
| 606 | 608 | ||
| 607 | *******************************************************************/ | 609 | *******************************************************************/ |
| 608 | extern "C" HRESULT ElevationSessionEnd( | 610 | extern "C" HRESULT ElevationSessionEnd( |
| @@ -648,7 +650,7 @@ LExit: | |||
| 648 | } | 650 | } |
| 649 | 651 | ||
| 650 | /******************************************************************* | 652 | /******************************************************************* |
| 651 | ElevationSaveState - | 653 | ElevationSaveState - |
| 652 | 654 | ||
| 653 | *******************************************************************/ | 655 | *******************************************************************/ |
| 654 | HRESULT ElevationSaveState( | 656 | HRESULT ElevationSaveState( |
| @@ -697,7 +699,7 @@ LExit: | |||
| 697 | } | 699 | } |
| 698 | 700 | ||
| 699 | /******************************************************************* | 701 | /******************************************************************* |
| 700 | ElevationCacheCompletePayload - | 702 | ElevationCacheCompletePayload - |
| 701 | 703 | ||
| 702 | *******************************************************************/ | 704 | *******************************************************************/ |
| 703 | extern "C" HRESULT ElevationCacheCompletePayload( | 705 | extern "C" HRESULT ElevationCacheCompletePayload( |
| @@ -785,7 +787,7 @@ LExit: | |||
| 785 | } | 787 | } |
| 786 | 788 | ||
| 787 | /******************************************************************* | 789 | /******************************************************************* |
| 788 | ElevationCacheCleanup - | 790 | ElevationCacheCleanup - |
| 789 | 791 | ||
| 790 | *******************************************************************/ | 792 | *******************************************************************/ |
| 791 | extern "C" HRESULT ElevationCacheCleanup( | 793 | extern "C" HRESULT ElevationCacheCleanup( |
| @@ -838,7 +840,7 @@ LExit: | |||
| 838 | } | 840 | } |
| 839 | 841 | ||
| 840 | /******************************************************************* | 842 | /******************************************************************* |
| 841 | ElevationExecuteRelatedBundle - | 843 | ElevationExecuteRelatedBundle - |
| 842 | 844 | ||
| 843 | *******************************************************************/ | 845 | *******************************************************************/ |
| 844 | extern "C" HRESULT ElevationExecuteRelatedBundle( | 846 | extern "C" HRESULT ElevationExecuteRelatedBundle( |
| @@ -899,7 +901,7 @@ LExit: | |||
| 899 | } | 901 | } |
| 900 | 902 | ||
| 901 | /******************************************************************* | 903 | /******************************************************************* |
| 902 | ElevationExecuteBundlePackage - | 904 | ElevationExecuteBundlePackage - |
| 903 | 905 | ||
| 904 | *******************************************************************/ | 906 | *******************************************************************/ |
| 905 | extern "C" HRESULT ElevationExecuteBundlePackage( | 907 | extern "C" HRESULT ElevationExecuteBundlePackage( |
| @@ -963,7 +965,7 @@ LExit: | |||
| 963 | } | 965 | } |
| 964 | 966 | ||
| 965 | /******************************************************************* | 967 | /******************************************************************* |
| 966 | ElevationExecuteExePackage - | 968 | ElevationExecuteExePackage - |
| 967 | 969 | ||
| 968 | *******************************************************************/ | 970 | *******************************************************************/ |
| 969 | extern "C" HRESULT ElevationExecuteExePackage( | 971 | extern "C" HRESULT ElevationExecuteExePackage( |
| @@ -1047,12 +1049,16 @@ LExit: | |||
| 1047 | 1049 | ||
| 1048 | extern "C" HRESULT ElevationMsiCommitTransaction( | 1050 | extern "C" HRESULT ElevationMsiCommitTransaction( |
| 1049 | __in HANDLE hPipe, | 1051 | __in HANDLE hPipe, |
| 1050 | __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary | 1052 | __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, |
| 1053 | __in PFN_MSIEXECUTEMESSAGEHANDLER pfnMessageHandler, | ||
| 1054 | __in LPVOID pvContext, | ||
| 1055 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart | ||
| 1051 | ) | 1056 | ) |
| 1052 | { | 1057 | { |
| 1053 | HRESULT hr = S_OK; | 1058 | HRESULT hr = S_OK; |
| 1054 | BYTE* pbData = NULL; | 1059 | BYTE* pbData = NULL; |
| 1055 | SIZE_T cbData = 0; | 1060 | SIZE_T cbData = 0; |
| 1061 | BURN_ELEVATION_MSI_MESSAGE_CONTEXT context = { }; | ||
| 1056 | DWORD dwResult = ERROR_SUCCESS; | 1062 | DWORD dwResult = ERROR_SUCCESS; |
| 1057 | 1063 | ||
| 1058 | // serialize message data | 1064 | // serialize message data |
| @@ -1062,10 +1068,15 @@ extern "C" HRESULT ElevationMsiCommitTransaction( | |||
| 1062 | hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath); | 1068 | hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath); |
| 1063 | ExitOnFailure(hr, "Failed to write transaction log path to message buffer."); | 1069 | ExitOnFailure(hr, "Failed to write transaction log path to message buffer."); |
| 1064 | 1070 | ||
| 1065 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION, pbData, cbData, NULL, NULL, &dwResult); | 1071 | // send message |
| 1072 | context.pfnMessageHandler = pfnMessageHandler; | ||
| 1073 | context.pvContext = pvContext; | ||
| 1074 | |||
| 1075 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION, pbData, cbData, ProcessMsiPackageMessages, &context, &dwResult); | ||
| 1066 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION message to per-machine process."); | 1076 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION message to per-machine process."); |
| 1067 | 1077 | ||
| 1068 | hr = static_cast<HRESULT>(dwResult); | 1078 | hr = static_cast<HRESULT>(dwResult); |
| 1079 | *pRestart = context.restart; | ||
| 1069 | 1080 | ||
| 1070 | LExit: | 1081 | LExit: |
| 1071 | ReleaseBuffer(pbData); | 1082 | ReleaseBuffer(pbData); |
| @@ -1075,12 +1086,16 @@ LExit: | |||
| 1075 | 1086 | ||
| 1076 | extern "C" HRESULT ElevationMsiRollbackTransaction( | 1087 | extern "C" HRESULT ElevationMsiRollbackTransaction( |
| 1077 | __in HANDLE hPipe, | 1088 | __in HANDLE hPipe, |
| 1078 | __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary | 1089 | __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, |
| 1090 | __in PFN_MSIEXECUTEMESSAGEHANDLER pfnMessageHandler, | ||
| 1091 | __in LPVOID pvContext, | ||
| 1092 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart | ||
| 1079 | ) | 1093 | ) |
| 1080 | { | 1094 | { |
| 1081 | HRESULT hr = S_OK; | 1095 | HRESULT hr = S_OK; |
| 1082 | BYTE* pbData = NULL; | 1096 | BYTE* pbData = NULL; |
| 1083 | SIZE_T cbData = 0; | 1097 | SIZE_T cbData = 0; |
| 1098 | BURN_ELEVATION_MSI_MESSAGE_CONTEXT context = { }; | ||
| 1084 | DWORD dwResult = ERROR_SUCCESS; | 1099 | DWORD dwResult = ERROR_SUCCESS; |
| 1085 | 1100 | ||
| 1086 | // serialize message data | 1101 | // serialize message data |
| @@ -1090,10 +1105,15 @@ extern "C" HRESULT ElevationMsiRollbackTransaction( | |||
| 1090 | hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath); | 1105 | hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath); |
| 1091 | ExitOnFailure(hr, "Failed to write transaction log path to message buffer."); | 1106 | ExitOnFailure(hr, "Failed to write transaction log path to message buffer."); |
| 1092 | 1107 | ||
| 1093 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION, pbData, cbData, NULL, NULL, &dwResult); | 1108 | // send message |
| 1109 | context.pfnMessageHandler = pfnMessageHandler; | ||
| 1110 | context.pvContext = pvContext; | ||
| 1111 | |||
| 1112 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION, pbData, cbData, ProcessMsiPackageMessages, &context, &dwResult); | ||
| 1094 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION message to per-machine process."); | 1113 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION message to per-machine process."); |
| 1095 | 1114 | ||
| 1096 | hr = static_cast<HRESULT>(dwResult); | 1115 | hr = static_cast<HRESULT>(dwResult); |
| 1116 | *pRestart = context.restart; | ||
| 1097 | 1117 | ||
| 1098 | LExit: | 1118 | LExit: |
| 1099 | ReleaseBuffer(pbData); | 1119 | ReleaseBuffer(pbData); |
| @@ -1104,7 +1124,7 @@ LExit: | |||
| 1104 | 1124 | ||
| 1105 | 1125 | ||
| 1106 | /******************************************************************* | 1126 | /******************************************************************* |
| 1107 | ElevationExecuteMsiPackage - | 1127 | ElevationExecuteMsiPackage - |
| 1108 | 1128 | ||
| 1109 | *******************************************************************/ | 1129 | *******************************************************************/ |
| 1110 | extern "C" HRESULT ElevationExecuteMsiPackage( | 1130 | extern "C" HRESULT ElevationExecuteMsiPackage( |
| @@ -1189,7 +1209,7 @@ LExit: | |||
| 1189 | } | 1209 | } |
| 1190 | 1210 | ||
| 1191 | /******************************************************************* | 1211 | /******************************************************************* |
| 1192 | ElevationExecuteMspPackage - | 1212 | ElevationExecuteMspPackage - |
| 1193 | 1213 | ||
| 1194 | *******************************************************************/ | 1214 | *******************************************************************/ |
| 1195 | extern "C" HRESULT ElevationExecuteMspPackage( | 1215 | extern "C" HRESULT ElevationExecuteMspPackage( |
| @@ -1269,7 +1289,7 @@ LExit: | |||
| 1269 | } | 1289 | } |
| 1270 | 1290 | ||
| 1271 | /******************************************************************* | 1291 | /******************************************************************* |
| 1272 | ElevationExecuteMsuPackage - | 1292 | ElevationExecuteMsuPackage - |
| 1273 | 1293 | ||
| 1274 | *******************************************************************/ | 1294 | *******************************************************************/ |
| 1275 | extern "C" HRESULT ElevationExecuteMsuPackage( | 1295 | extern "C" HRESULT ElevationExecuteMsuPackage( |
| @@ -1480,7 +1500,7 @@ LExit: | |||
| 1480 | } | 1500 | } |
| 1481 | 1501 | ||
| 1482 | /******************************************************************* | 1502 | /******************************************************************* |
| 1483 | ElevationCleanPackage - | 1503 | ElevationCleanPackage - |
| 1484 | 1504 | ||
| 1485 | *******************************************************************/ | 1505 | *******************************************************************/ |
| 1486 | extern "C" HRESULT ElevationCleanPackage( | 1506 | extern "C" HRESULT ElevationCleanPackage( |
| @@ -1545,7 +1565,7 @@ LExit: | |||
| 1545 | } | 1565 | } |
| 1546 | 1566 | ||
| 1547 | /******************************************************************* | 1567 | /******************************************************************* |
| 1548 | ElevationChildPumpMessages - | 1568 | ElevationChildPumpMessages - |
| 1549 | 1569 | ||
| 1550 | *******************************************************************/ | 1570 | *******************************************************************/ |
| 1551 | extern "C" HRESULT ElevationChildPumpMessages( | 1571 | extern "C" HRESULT ElevationChildPumpMessages( |
| @@ -1875,7 +1895,7 @@ static HRESULT ProcessGenericExecuteMessages( | |||
| 1875 | 1895 | ||
| 1876 | hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &message.dwUIHint); | 1896 | hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &message.dwUIHint); |
| 1877 | ExitOnFailure(hr, "Failed to allowed results."); | 1897 | ExitOnFailure(hr, "Failed to allowed results."); |
| 1878 | 1898 | ||
| 1879 | // Process the message. | 1899 | // Process the message. |
| 1880 | switch (pMsg->dwMessage) | 1900 | switch (pMsg->dwMessage) |
| 1881 | { | 1901 | { |
| @@ -2052,7 +2072,7 @@ static HRESULT ProcessMsiPackageMessages( | |||
| 2052 | ExitOnRootFailure(hr, "Invalid package message."); | 2072 | ExitOnRootFailure(hr, "Invalid package message."); |
| 2053 | break; | 2073 | break; |
| 2054 | } | 2074 | } |
| 2055 | 2075 | ||
| 2056 | // send message | 2076 | // send message |
| 2057 | *pdwResult = (DWORD)pContext->pfnMessageHandler(&message, pContext->pvContext); | 2077 | *pdwResult = (DWORD)pContext->pfnMessageHandler(&message, pContext->pvContext); |
| 2058 | 2078 | ||
| @@ -2154,11 +2174,13 @@ static HRESULT ProcessElevatedChildMessage( | |||
| 2154 | break; | 2174 | break; |
| 2155 | 2175 | ||
| 2156 | case BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION: | 2176 | case BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION: |
| 2157 | hrResult = OnMsiCommitTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData); | 2177 | hrResult = OnMsiCommitTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData, &restart); |
| 2178 | fSendRestart = TRUE; | ||
| 2158 | break; | 2179 | break; |
| 2159 | 2180 | ||
| 2160 | case BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION: | 2181 | case BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION: |
| 2161 | hrResult = OnMsiRollbackTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData); | 2182 | hrResult = OnMsiRollbackTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData, &restart); |
| 2183 | fSendRestart = TRUE; | ||
| 2162 | break; | 2184 | break; |
| 2163 | 2185 | ||
| 2164 | case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE: | 2186 | case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE: |
| @@ -3922,7 +3944,8 @@ LExit: | |||
| 3922 | static HRESULT OnMsiCommitTransaction( | 3944 | static HRESULT OnMsiCommitTransaction( |
| 3923 | __in BURN_PACKAGES* pPackages, | 3945 | __in BURN_PACKAGES* pPackages, |
| 3924 | __in BYTE* pbData, | 3946 | __in BYTE* pbData, |
| 3925 | __in SIZE_T cbData | 3947 | __in SIZE_T cbData, |
| 3948 | __out BOOTSTRAPPER_APPLY_RESTART *pRestart | ||
| 3926 | ) | 3949 | ) |
| 3927 | { | 3950 | { |
| 3928 | HRESULT hr = S_OK; | 3951 | HRESULT hr = S_OK; |
| @@ -3946,7 +3969,7 @@ static HRESULT OnMsiCommitTransaction( | |||
| 3946 | pRollbackBoundary->sczLogPath = sczLogPath; | 3969 | pRollbackBoundary->sczLogPath = sczLogPath; |
| 3947 | } | 3970 | } |
| 3948 | 3971 | ||
| 3949 | hr = MsiEngineCommitTransaction(pRollbackBoundary); | 3972 | hr = MsiEngineCommitTransaction(pRollbackBoundary, pRestart); |
| 3950 | 3973 | ||
| 3951 | LExit: | 3974 | LExit: |
| 3952 | ReleaseStr(sczId); | 3975 | ReleaseStr(sczId); |
| @@ -3963,7 +3986,8 @@ LExit: | |||
| 3963 | static HRESULT OnMsiRollbackTransaction( | 3986 | static HRESULT OnMsiRollbackTransaction( |
| 3964 | __in BURN_PACKAGES* pPackages, | 3987 | __in BURN_PACKAGES* pPackages, |
| 3965 | __in BYTE* pbData, | 3988 | __in BYTE* pbData, |
| 3966 | __in SIZE_T cbData | 3989 | __in SIZE_T cbData, |
| 3990 | __out BOOTSTRAPPER_APPLY_RESTART *pRestart | ||
| 3967 | ) | 3991 | ) |
| 3968 | { | 3992 | { |
| 3969 | HRESULT hr = S_OK; | 3993 | HRESULT hr = S_OK; |
| @@ -3987,7 +4011,7 @@ static HRESULT OnMsiRollbackTransaction( | |||
| 3987 | pRollbackBoundary->sczLogPath = sczLogPath; | 4011 | pRollbackBoundary->sczLogPath = sczLogPath; |
| 3988 | } | 4012 | } |
| 3989 | 4013 | ||
| 3990 | hr = MsiEngineRollbackTransaction(pRollbackBoundary); | 4014 | hr = MsiEngineRollbackTransaction(pRollbackBoundary, pRestart); |
| 3991 | 4015 | ||
| 3992 | LExit: | 4016 | LExit: |
| 3993 | ReleaseStr(sczId); | 4017 | ReleaseStr(sczId); |
