diff options
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); |