summaryrefslogtreecommitdiff
path: root/src/burn/engine/elevation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/elevation.cpp')
-rw-r--r--src/burn/engine/elevation.cpp80
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(
371static HRESULT OnMsiCommitTransaction( 371static 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 );
376static HRESULT OnMsiRollbackTransaction( 377static 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 );
381static HRESULT ElevatedOnPauseAUBegin( 383static 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*******************************************************************/
550extern "C" HRESULT ElevationSessionBegin( 552extern "C" HRESULT ElevationSessionBegin(
@@ -602,7 +604,7 @@ LExit:
602} 604}
603 605
604/******************************************************************* 606/*******************************************************************
605 ElevationSessionEnd - 607 ElevationSessionEnd -
606 608
607*******************************************************************/ 609*******************************************************************/
608extern "C" HRESULT ElevationSessionEnd( 610extern "C" HRESULT ElevationSessionEnd(
@@ -648,7 +650,7 @@ LExit:
648} 650}
649 651
650/******************************************************************* 652/*******************************************************************
651 ElevationSaveState - 653 ElevationSaveState -
652 654
653*******************************************************************/ 655*******************************************************************/
654HRESULT ElevationSaveState( 656HRESULT ElevationSaveState(
@@ -697,7 +699,7 @@ LExit:
697} 699}
698 700
699/******************************************************************* 701/*******************************************************************
700 ElevationCacheCompletePayload - 702 ElevationCacheCompletePayload -
701 703
702*******************************************************************/ 704*******************************************************************/
703extern "C" HRESULT ElevationCacheCompletePayload( 705extern "C" HRESULT ElevationCacheCompletePayload(
@@ -785,7 +787,7 @@ LExit:
785} 787}
786 788
787/******************************************************************* 789/*******************************************************************
788 ElevationCacheCleanup - 790 ElevationCacheCleanup -
789 791
790*******************************************************************/ 792*******************************************************************/
791extern "C" HRESULT ElevationCacheCleanup( 793extern "C" HRESULT ElevationCacheCleanup(
@@ -838,7 +840,7 @@ LExit:
838} 840}
839 841
840/******************************************************************* 842/*******************************************************************
841 ElevationExecuteRelatedBundle - 843 ElevationExecuteRelatedBundle -
842 844
843*******************************************************************/ 845*******************************************************************/
844extern "C" HRESULT ElevationExecuteRelatedBundle( 846extern "C" HRESULT ElevationExecuteRelatedBundle(
@@ -899,7 +901,7 @@ LExit:
899} 901}
900 902
901/******************************************************************* 903/*******************************************************************
902 ElevationExecuteBundlePackage - 904 ElevationExecuteBundlePackage -
903 905
904*******************************************************************/ 906*******************************************************************/
905extern "C" HRESULT ElevationExecuteBundlePackage( 907extern "C" HRESULT ElevationExecuteBundlePackage(
@@ -963,7 +965,7 @@ LExit:
963} 965}
964 966
965/******************************************************************* 967/*******************************************************************
966 ElevationExecuteExePackage - 968 ElevationExecuteExePackage -
967 969
968*******************************************************************/ 970*******************************************************************/
969extern "C" HRESULT ElevationExecuteExePackage( 971extern "C" HRESULT ElevationExecuteExePackage(
@@ -1047,12 +1049,16 @@ LExit:
1047 1049
1048extern "C" HRESULT ElevationMsiCommitTransaction( 1050extern "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
1070LExit: 1081LExit:
1071 ReleaseBuffer(pbData); 1082 ReleaseBuffer(pbData);
@@ -1075,12 +1086,16 @@ LExit:
1075 1086
1076extern "C" HRESULT ElevationMsiRollbackTransaction( 1087extern "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
1098LExit: 1118LExit:
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*******************************************************************/
1110extern "C" HRESULT ElevationExecuteMsiPackage( 1130extern "C" HRESULT ElevationExecuteMsiPackage(
@@ -1189,7 +1209,7 @@ LExit:
1189} 1209}
1190 1210
1191/******************************************************************* 1211/*******************************************************************
1192 ElevationExecuteMspPackage - 1212 ElevationExecuteMspPackage -
1193 1213
1194*******************************************************************/ 1214*******************************************************************/
1195extern "C" HRESULT ElevationExecuteMspPackage( 1215extern "C" HRESULT ElevationExecuteMspPackage(
@@ -1269,7 +1289,7 @@ LExit:
1269} 1289}
1270 1290
1271/******************************************************************* 1291/*******************************************************************
1272 ElevationExecuteMsuPackage - 1292 ElevationExecuteMsuPackage -
1273 1293
1274*******************************************************************/ 1294*******************************************************************/
1275extern "C" HRESULT ElevationExecuteMsuPackage( 1295extern "C" HRESULT ElevationExecuteMsuPackage(
@@ -1480,7 +1500,7 @@ LExit:
1480} 1500}
1481 1501
1482/******************************************************************* 1502/*******************************************************************
1483 ElevationCleanPackage - 1503 ElevationCleanPackage -
1484 1504
1485*******************************************************************/ 1505*******************************************************************/
1486extern "C" HRESULT ElevationCleanPackage( 1506extern "C" HRESULT ElevationCleanPackage(
@@ -1545,7 +1565,7 @@ LExit:
1545} 1565}
1546 1566
1547/******************************************************************* 1567/*******************************************************************
1548 ElevationChildPumpMessages - 1568 ElevationChildPumpMessages -
1549 1569
1550*******************************************************************/ 1570*******************************************************************/
1551extern "C" HRESULT ElevationChildPumpMessages( 1571extern "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:
3922static HRESULT OnMsiCommitTransaction( 3944static 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
3951LExit: 3974LExit:
3952 ReleaseStr(sczId); 3975 ReleaseStr(sczId);
@@ -3963,7 +3986,8 @@ LExit:
3963static HRESULT OnMsiRollbackTransaction( 3986static 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
3992LExit: 4016LExit:
3993 ReleaseStr(sczId); 4017 ReleaseStr(sczId);