aboutsummaryrefslogtreecommitdiff
path: root/src/engine/apply.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/engine/apply.cpp247
1 files changed, 201 insertions, 46 deletions
diff --git a/src/engine/apply.cpp b/src/engine/apply.cpp
index 76831461..8d2f5757 100644
--- a/src/engine/apply.cpp
+++ b/src/engine/apply.cpp
@@ -46,6 +46,10 @@ static HRESULT WINAPI AuthenticationRequired(
46 __out BOOL* pfRetry 46 __out BOOL* pfRetry
47 ); 47 );
48 48
49static void CalculateKeepRegistration(
50 __in BURN_ENGINE_STATE* pEngineState,
51 __inout BOOL* pfKeepRegistration
52 );
49static HRESULT ExecuteDependentRegistrationActions( 53static HRESULT ExecuteDependentRegistrationActions(
50 __in HANDLE hPipe, 54 __in HANDLE hPipe,
51 __in const BURN_REGISTRATION* pRegistration, 55 __in const BURN_REGISTRATION* pRegistration,
@@ -141,7 +145,6 @@ static HRESULT DoExecuteAction(
141 __in BURN_EXECUTE_CONTEXT* pContext, 145 __in BURN_EXECUTE_CONTEXT* pContext,
142 __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary, 146 __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary,
143 __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint, 147 __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint,
144 __out BOOL* pfKeepRegistration,
145 __out BOOL* pfSuspend, 148 __out BOOL* pfSuspend,
146 __out BOOTSTRAPPER_APPLY_RESTART* pRestart 149 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
147 ); 150 );
@@ -149,7 +152,6 @@ static HRESULT DoRollbackActions(
149 __in BURN_ENGINE_STATE* pEngineState, 152 __in BURN_ENGINE_STATE* pEngineState,
150 __in BURN_EXECUTE_CONTEXT* pContext, 153 __in BURN_EXECUTE_CONTEXT* pContext,
151 __in DWORD dwCheckpoint, 154 __in DWORD dwCheckpoint,
152 __out BOOL* pfKeepRegistration,
153 __out BOOTSTRAPPER_APPLY_RESTART* pRestart 155 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
154 ); 156 );
155static HRESULT ExecuteExePackage( 157static HRESULT ExecuteExePackage(
@@ -165,6 +167,7 @@ static HRESULT ExecuteMsiPackage(
165 __in BURN_ENGINE_STATE* pEngineState, 167 __in BURN_ENGINE_STATE* pEngineState,
166 __in BURN_EXECUTE_ACTION* pExecuteAction, 168 __in BURN_EXECUTE_ACTION* pExecuteAction,
167 __in BURN_EXECUTE_CONTEXT* pContext, 169 __in BURN_EXECUTE_CONTEXT* pContext,
170 __in BOOL fInsideMsiTransaction,
168 __in BOOL fRollback, 171 __in BOOL fRollback,
169 __out BOOL* pfRetry, 172 __out BOOL* pfRetry,
170 __out BOOL* pfSuspend, 173 __out BOOL* pfSuspend,
@@ -174,6 +177,7 @@ static HRESULT ExecuteMspPackage(
174 __in BURN_ENGINE_STATE* pEngineState, 177 __in BURN_ENGINE_STATE* pEngineState,
175 __in BURN_EXECUTE_ACTION* pExecuteAction, 178 __in BURN_EXECUTE_ACTION* pExecuteAction,
176 __in BURN_EXECUTE_CONTEXT* pContext, 179 __in BURN_EXECUTE_CONTEXT* pContext,
180 __in BOOL fInsideMsiTransaction,
177 __in BOOL fRollback, 181 __in BOOL fRollback,
178 __out BOOL* pfRetry, 182 __out BOOL* pfRetry,
179 __out BOOL* pfSuspend, 183 __out BOOL* pfSuspend,
@@ -214,6 +218,10 @@ static HRESULT ExecuteMsiRollbackTransaction(
214 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, 218 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
215 __in BURN_EXECUTE_CONTEXT* pContext 219 __in BURN_EXECUTE_CONTEXT* pContext
216 ); 220 );
221static void ResetTransactionRegistrationState(
222 __in BURN_ENGINE_STATE* pEngineState,
223 __in BOOL fCommit
224 );
217static HRESULT CleanPackage( 225static HRESULT CleanPackage(
218 __in HANDLE hElevatedPipe, 226 __in HANDLE hElevatedPipe,
219 __in BURN_PACKAGE* pPackage 227 __in BURN_PACKAGE* pPackage
@@ -282,6 +290,7 @@ extern "C" void ApplyReset(
282 { 290 {
283 BURN_PACKAGE* pPackage = pPackages->rgPackages + i; 291 BURN_PACKAGE* pPackage = pPackages->rgPackages + i;
284 pPackage->hrCacheResult = S_OK; 292 pPackage->hrCacheResult = S_OK;
293 pPackage->transactionRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN;
285 } 294 }
286} 295}
287 296
@@ -380,13 +389,15 @@ LExit:
380extern "C" HRESULT ApplyUnregister( 389extern "C" HRESULT ApplyUnregister(
381 __in BURN_ENGINE_STATE* pEngineState, 390 __in BURN_ENGINE_STATE* pEngineState,
382 __in BOOL fFailedOrRollback, 391 __in BOOL fFailedOrRollback,
383 __in BOOL fKeepRegistration,
384 __in BOOL fSuspend, 392 __in BOOL fSuspend,
385 __in BOOTSTRAPPER_APPLY_RESTART restart 393 __in BOOTSTRAPPER_APPLY_RESTART restart
386 ) 394 )
387{ 395{
388 HRESULT hr = S_OK; 396 HRESULT hr = S_OK;
389 BURN_RESUME_MODE resumeMode = BURN_RESUME_MODE_NONE; 397 BURN_RESUME_MODE resumeMode = BURN_RESUME_MODE_NONE;
398 BOOL fKeepRegistration = pEngineState->plan.fDisallowRemoval;
399
400 CalculateKeepRegistration(pEngineState, &fKeepRegistration);
390 401
391 hr = UserExperienceOnUnregisterBegin(&pEngineState->userExperience); 402 hr = UserExperienceOnUnregisterBegin(&pEngineState->userExperience);
392 ExitOnRootFailure(hr, "BA aborted unregister begin."); 403 ExitOnRootFailure(hr, "BA aborted unregister begin.");
@@ -443,7 +454,7 @@ extern "C" HRESULT ApplyCache(
443 __in BURN_PLAN* pPlan, 454 __in BURN_PLAN* pPlan,
444 __in HANDLE hPipe, 455 __in HANDLE hPipe,
445 __inout DWORD* pcOverallProgressTicks, 456 __inout DWORD* pcOverallProgressTicks,
446 __out BOOL* pfRollback 457 __inout BOOL* pfRollback
447 ) 458 )
448{ 459{
449 HRESULT hr = S_OK; 460 HRESULT hr = S_OK;
@@ -732,7 +743,6 @@ extern "C" HRESULT ApplyExecute(
732 __in BURN_ENGINE_STATE* pEngineState, 743 __in BURN_ENGINE_STATE* pEngineState,
733 __in_opt HANDLE hCacheThread, 744 __in_opt HANDLE hCacheThread,
734 __inout DWORD* pcOverallProgressTicks, 745 __inout DWORD* pcOverallProgressTicks,
735 __inout BOOL* pfKeepRegistration,
736 __out BOOL* pfRollback, 746 __out BOOL* pfRollback,
737 __out BOOL* pfSuspend, 747 __out BOOL* pfSuspend,
738 __out BOOTSTRAPPER_APPLY_RESTART* pRestart 748 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
@@ -779,7 +789,7 @@ extern "C" HRESULT ApplyExecute(
779 } 789 }
780 790
781 // Execute the action. 791 // Execute the action.
782 hr = DoExecuteAction(pEngineState, pExecuteAction, hCacheThread, &context, &pRollbackBoundary, &pCheckpoint, pfKeepRegistration, pfSuspend, pRestart); 792 hr = DoExecuteAction(pEngineState, pExecuteAction, hCacheThread, &context, &pRollbackBoundary, &pCheckpoint, pfSuspend, pRestart);
783 793
784 if (*pfSuspend || BOOTSTRAPPER_APPLY_RESTART_INITIATED == *pRestart) 794 if (*pfSuspend || BOOTSTRAPPER_APPLY_RESTART_INITIATED == *pRestart)
785 { 795 {
@@ -821,7 +831,7 @@ extern "C" HRESULT ApplyExecute(
821 // The action failed, roll back to previous rollback boundary. 831 // The action failed, roll back to previous rollback boundary.
822 if (pCheckpoint) 832 if (pCheckpoint)
823 { 833 {
824 hrRollback = DoRollbackActions(pEngineState, &context, pCheckpoint->dwId, pfKeepRegistration, pRestart); 834 hrRollback = DoRollbackActions(pEngineState, &context, pCheckpoint->dwId, pRestart);
825 IgnoreRollbackError(hrRollback, "Failed rollback actions"); 835 IgnoreRollbackError(hrRollback, "Failed rollback actions");
826 } 836 }
827 837
@@ -855,14 +865,46 @@ extern "C" void ApplyClean(
855 for (DWORD i = 0; i < pPlan->cCleanActions; ++i) 865 for (DWORD i = 0; i < pPlan->cCleanActions; ++i)
856 { 866 {
857 BURN_CLEAN_ACTION* pCleanAction = pPlan->rgCleanActions + i; 867 BURN_CLEAN_ACTION* pCleanAction = pPlan->rgCleanActions + i;
868 BURN_PACKAGE* pPackage = pCleanAction->pPackage;
858 869
859 hr = CleanPackage(hPipe, pCleanAction->pPackage); 870 hr = CleanPackage(hPipe, pPackage);
860 } 871 }
861} 872}
862 873
863 874
864// internal helper functions 875// internal helper functions
865 876
877static void CalculateKeepRegistration(
878 __in BURN_ENGINE_STATE* pEngineState,
879 __inout BOOL* pfKeepRegistration
880 )
881{
882 LogId(REPORT_STANDARD, MSG_POST_APPLY_CALCULATE_REGISTRATION);
883
884 for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i)
885 {
886 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i;
887
888 LogId(REPORT_STANDARD, MSG_POST_APPLY_PACKAGE, pPackage->sczId, LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->installRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->cacheRegistrationState));
889
890 if (!pPackage->fCanAffectRegistration)
891 {
892 continue;
893 }
894
895 if (BURN_PACKAGE_TYPE_MSP == pPackage->type)
896 {
897 MspEngineFinalizeInstallRegistrationState(pPackage);
898 }
899
900 if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->installRegistrationState ||
901 BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->cacheRegistrationState)
902 {
903 *pfKeepRegistration = TRUE;
904 }
905 }
906}
907
866static HRESULT ExecuteDependentRegistrationActions( 908static HRESULT ExecuteDependentRegistrationActions(
867 __in HANDLE hPipe, 909 __in HANDLE hPipe,
868 __in const BURN_REGISTRATION* pRegistration, 910 __in const BURN_REGISTRATION* pRegistration,
@@ -1255,6 +1297,15 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1255 LARGE_INTEGER liContainerOrPayloadSize = { }; 1297 LARGE_INTEGER liContainerOrPayloadSize = { };
1256 LARGE_INTEGER liZero = { }; 1298 LARGE_INTEGER liZero = { };
1257 BURN_CACHE_ACQUIRE_PROGRESS_CONTEXT progress = { }; 1299 BURN_CACHE_ACQUIRE_PROGRESS_CONTEXT progress = { };
1300 BOOL fCanAffectRegistration = FALSE;
1301
1302 if (!wzLayoutDirectory)
1303 {
1304 Assert(!pContainer);
1305 Assert(pPackage);
1306
1307 fCanAffectRegistration = pPackage->fCanAffectRegistration;
1308 }
1258 1309
1259 liContainerOrPayloadSize.QuadPart = pContainer ? pContainer->qwFileSize : pPayload->qwFileSize; 1310 liContainerOrPayloadSize.QuadPart = pContainer ? pContainer->qwFileSize : pPayload->qwFileSize;
1260 1311
@@ -1297,9 +1348,6 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1297 } 1348 }
1298 else // complete the payload. 1349 else // complete the payload.
1299 { 1350 {
1300 Assert(!pContainer);
1301 Assert(pPackage);
1302
1303 hr = CacheCompletePayload(pPackage->fPerMachine, pPayload, pPackage->sczCacheId, wzUnverifiedPath, fMove); 1351 hr = CacheCompletePayload(pPackage->fPerMachine, pPayload, pPackage->sczCacheId, wzUnverifiedPath, fMove);
1304 } 1352 }
1305 1353
@@ -1307,6 +1355,11 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1307 // will get. 1355 // will get.
1308 if (SUCCEEDED(hr)) 1356 if (SUCCEEDED(hr))
1309 { 1357 {
1358 if (fCanAffectRegistration)
1359 {
1360 pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT;
1361 }
1362
1310 CacheProgressRoutine(liContainerOrPayloadSize, liContainerOrPayloadSize, liZero, liZero, 0, 0, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, &progress); 1363 CacheProgressRoutine(liContainerOrPayloadSize, liContainerOrPayloadSize, liZero, liZero, 0, 0, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, &progress);
1311 if (progress.fCancel) 1364 if (progress.fCancel)
1312 { 1365 {
@@ -1639,7 +1692,6 @@ static HRESULT DoExecuteAction(
1639 __in BURN_EXECUTE_CONTEXT* pContext, 1692 __in BURN_EXECUTE_CONTEXT* pContext,
1640 __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary, 1693 __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary,
1641 __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint, 1694 __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint,
1642 __out BOOL* pfKeepRegistration,
1643 __out BOOL* pfSuspend, 1695 __out BOOL* pfSuspend,
1644 __out BOOTSTRAPPER_APPLY_RESTART* pRestart 1696 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
1645 ) 1697 )
@@ -1651,11 +1703,14 @@ static HRESULT DoExecuteAction(
1651 BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE; 1703 BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE;
1652 BOOL fRetry = FALSE; 1704 BOOL fRetry = FALSE;
1653 BOOL fStopWusaService = FALSE; 1705 BOOL fStopWusaService = FALSE;
1706 BOOL fInsideMsiTransaction = FALSE;
1654 1707
1655 pContext->fRollback = FALSE; 1708 pContext->fRollback = FALSE;
1656 1709
1657 do 1710 do
1658 { 1711 {
1712 fInsideMsiTransaction = *ppRollbackBoundary && (*ppRollbackBoundary)->fActiveTransaction;
1713
1659 switch (pExecuteAction->type) 1714 switch (pExecuteAction->type)
1660 { 1715 {
1661 case BURN_EXECUTE_ACTION_TYPE_CHECKPOINT: 1716 case BURN_EXECUTE_ACTION_TYPE_CHECKPOINT:
@@ -1695,12 +1750,12 @@ static HRESULT DoExecuteAction(
1695 break; 1750 break;
1696 1751
1697 case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE: 1752 case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE:
1698 hr = ExecuteMsiPackage(pEngineState, pExecuteAction, pContext, FALSE, &fRetry, pfSuspend, &restart); 1753 hr = ExecuteMsiPackage(pEngineState, pExecuteAction, pContext, fInsideMsiTransaction, FALSE, &fRetry, pfSuspend, &restart);
1699 ExitOnFailure(hr, "Failed to execute MSI package."); 1754 ExitOnFailure(hr, "Failed to execute MSI package.");
1700 break; 1755 break;
1701 1756
1702 case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET: 1757 case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET:
1703 hr = ExecuteMspPackage(pEngineState, pExecuteAction, pContext, FALSE, &fRetry, pfSuspend, &restart); 1758 hr = ExecuteMspPackage(pEngineState, pExecuteAction, pContext, fInsideMsiTransaction, FALSE, &fRetry, pfSuspend, &restart);
1704 ExitOnFailure(hr, "Failed to execute MSP package."); 1759 ExitOnFailure(hr, "Failed to execute MSP package.");
1705 break; 1760 break;
1706 1761
@@ -1720,8 +1775,6 @@ static HRESULT DoExecuteAction(
1720 ExitOnFailure(hr, "Failed to execute dependency action."); 1775 ExitOnFailure(hr, "Failed to execute dependency action.");
1721 break; 1776 break;
1722 1777
1723 case BURN_EXECUTE_ACTION_TYPE_REGISTRATION:
1724 *pfKeepRegistration = pExecuteAction->registration.fKeep;
1725 break; 1778 break;
1726 1779
1727 case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY: 1780 case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY:
@@ -1757,7 +1810,6 @@ static HRESULT DoRollbackActions(
1757 __in BURN_ENGINE_STATE* pEngineState, 1810 __in BURN_ENGINE_STATE* pEngineState,
1758 __in BURN_EXECUTE_CONTEXT* pContext, 1811 __in BURN_EXECUTE_CONTEXT* pContext,
1759 __in DWORD dwCheckpoint, 1812 __in DWORD dwCheckpoint,
1760 __out BOOL* pfKeepRegistration,
1761 __out BOOTSTRAPPER_APPLY_RESTART* pRestart 1813 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
1762 ) 1814 )
1763{ 1815{
@@ -1811,12 +1863,12 @@ static HRESULT DoRollbackActions(
1811 break; 1863 break;
1812 1864
1813 case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE: 1865 case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE:
1814 hr = ExecuteMsiPackage(pEngineState, pRollbackAction, pContext, TRUE, &fRetryIgnored, &fSuspendIgnored, &restart); 1866 hr = ExecuteMsiPackage(pEngineState, pRollbackAction, pContext, FALSE, TRUE, &fRetryIgnored, &fSuspendIgnored, &restart);
1815 IgnoreRollbackError(hr, "Failed to rollback MSI package."); 1867 IgnoreRollbackError(hr, "Failed to rollback MSI package.");
1816 break; 1868 break;
1817 1869
1818 case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET: 1870 case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET:
1819 hr = ExecuteMspPackage(pEngineState, pRollbackAction, pContext, TRUE, &fRetryIgnored, &fSuspendIgnored, &restart); 1871 hr = ExecuteMspPackage(pEngineState, pRollbackAction, pContext, FALSE, TRUE, &fRetryIgnored, &fSuspendIgnored, &restart);
1820 IgnoreRollbackError(hr, "Failed to rollback MSP package."); 1872 IgnoreRollbackError(hr, "Failed to rollback MSP package.");
1821 break; 1873 break;
1822 1874
@@ -1835,10 +1887,6 @@ static HRESULT DoRollbackActions(
1835 IgnoreRollbackError(hr, "Failed to rollback dependency action."); 1887 IgnoreRollbackError(hr, "Failed to rollback dependency action.");
1836 break; 1888 break;
1837 1889
1838 case BURN_EXECUTE_ACTION_TYPE_REGISTRATION:
1839 *pfKeepRegistration = pRollbackAction->registration.fKeep;
1840 break;
1841
1842 case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY: 1890 case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY:
1843 ExitFunction1(hr = S_OK); 1891 ExitFunction1(hr = S_OK);
1844 1892
@@ -1878,19 +1926,21 @@ static HRESULT ExecuteExePackage(
1878 GENERIC_EXECUTE_MESSAGE message = { }; 1926 GENERIC_EXECUTE_MESSAGE message = { };
1879 int nResult = 0; 1927 int nResult = 0;
1880 BOOL fBeginCalled = FALSE; 1928 BOOL fBeginCalled = FALSE;
1929 BOOL fExecuted = FALSE;
1930 BURN_PACKAGE* pPackage = pExecuteAction->exePackage.pPackage;
1881 1931
1882 if (FAILED(pExecuteAction->exePackage.pPackage->hrCacheResult)) 1932 if (FAILED(pPackage->hrCacheResult))
1883 { 1933 {
1884 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pExecuteAction->exePackage.pPackage->sczId, pExecuteAction->exePackage.pPackage->hrCacheResult); 1934 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pPackage->sczId, pPackage->hrCacheResult);
1885 ExitFunction1(hr = S_OK); 1935 ExitFunction1(hr = S_OK);
1886 } 1936 }
1887 1937
1888 Assert(pContext->fRollback == fRollback); 1938 Assert(pContext->fRollback == fRollback);
1889 pContext->pExecutingPackage = pExecuteAction->exePackage.pPackage; 1939 pContext->pExecutingPackage = pPackage;
1890 fBeginCalled = TRUE; 1940 fBeginCalled = TRUE;
1891 1941
1892 // Send package execute begin to BA. 1942 // Send package execute begin to BA.
1893 hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->exePackage.pPackage->sczId, !fRollback, pExecuteAction->exePackage.action, INSTALLUILEVEL_NOCHANGE, FALSE); 1943 hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pPackage->sczId, !fRollback, pExecuteAction->exePackage.action, INSTALLUILEVEL_NOCHANGE, FALSE);
1894 ExitOnRootFailure(hr, "BA aborted execute EXE package begin."); 1944 ExitOnRootFailure(hr, "BA aborted execute EXE package begin.");
1895 1945
1896 message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS; 1946 message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS;
@@ -1900,8 +1950,10 @@ static HRESULT ExecuteExePackage(
1900 hr = UserExperienceInterpretExecuteResult(&pEngineState->userExperience, fRollback, message.dwAllowedResults, nResult); 1950 hr = UserExperienceInterpretExecuteResult(&pEngineState->userExperience, fRollback, message.dwAllowedResults, nResult);
1901 ExitOnRootFailure(hr, "BA aborted EXE progress."); 1951 ExitOnRootFailure(hr, "BA aborted EXE progress.");
1902 1952
1953 fExecuted = TRUE;
1954
1903 // Execute package. 1955 // Execute package.
1904 if (pExecuteAction->exePackage.pPackage->fPerMachine) 1956 if (pPackage->fPerMachine)
1905 { 1957 {
1906 hrExecute = ElevationExecuteExePackage(pEngineState->companionConnection.hPipe, pExecuteAction, &pEngineState->variables, fRollback, GenericExecuteMessageHandler, pContext, pRestart); 1958 hrExecute = ElevationExecuteExePackage(pEngineState->companionConnection.hPipe, pExecuteAction, &pEngineState->variables, fRollback, GenericExecuteMessageHandler, pContext, pRestart);
1907 ExitOnFailure(hrExecute, "Failed to configure per-machine EXE package."); 1959 ExitOnFailure(hrExecute, "Failed to configure per-machine EXE package.");
@@ -1926,9 +1978,14 @@ static HRESULT ExecuteExePackage(
1926 ExitOnRootFailure(hr, "BA aborted EXE package execute progress."); 1978 ExitOnRootFailure(hr, "BA aborted EXE package execute progress.");
1927 1979
1928LExit: 1980LExit:
1981 if (fExecuted)
1982 {
1983 ExeEngineUpdateInstallRegistrationState(pExecuteAction, hrExecute);
1984 }
1985
1929 if (fBeginCalled) 1986 if (fBeginCalled)
1930 { 1987 {
1931 hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pExecuteAction->exePackage.pPackage, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend); 1988 hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
1932 } 1989 }
1933 1990
1934 return hr; 1991 return hr;
@@ -1938,6 +1995,7 @@ static HRESULT ExecuteMsiPackage(
1938 __in BURN_ENGINE_STATE* pEngineState, 1995 __in BURN_ENGINE_STATE* pEngineState,
1939 __in BURN_EXECUTE_ACTION* pExecuteAction, 1996 __in BURN_EXECUTE_ACTION* pExecuteAction,
1940 __in BURN_EXECUTE_CONTEXT* pContext, 1997 __in BURN_EXECUTE_CONTEXT* pContext,
1998 __in BOOL fInsideMsiTransaction,
1941 __in BOOL fRollback, 1999 __in BOOL fRollback,
1942 __out BOOL* pfRetry, 2000 __out BOOL* pfRetry,
1943 __out BOOL* pfSuspend, 2001 __out BOOL* pfSuspend,
@@ -1947,23 +2005,27 @@ static HRESULT ExecuteMsiPackage(
1947 HRESULT hr = S_OK; 2005 HRESULT hr = S_OK;
1948 HRESULT hrExecute = S_OK; 2006 HRESULT hrExecute = S_OK;
1949 BOOL fBeginCalled = FALSE; 2007 BOOL fBeginCalled = FALSE;
2008 BOOL fExecuted = FALSE;
2009 BURN_PACKAGE* pPackage = pExecuteAction->msiPackage.pPackage;
1950 2010
1951 if (FAILED(pExecuteAction->msiPackage.pPackage->hrCacheResult)) 2011 if (FAILED(pPackage->hrCacheResult))
1952 { 2012 {
1953 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pExecuteAction->msiPackage.pPackage->sczId, pExecuteAction->msiPackage.pPackage->hrCacheResult); 2013 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pPackage->sczId, pPackage->hrCacheResult);
1954 ExitFunction1(hr = S_OK); 2014 ExitFunction1(hr = S_OK);
1955 } 2015 }
1956 2016
1957 Assert(pContext->fRollback == fRollback); 2017 Assert(pContext->fRollback == fRollback);
1958 pContext->pExecutingPackage = pExecuteAction->msiPackage.pPackage; 2018 pContext->pExecutingPackage = pPackage;
1959 fBeginCalled = TRUE; 2019 fBeginCalled = TRUE;
1960 2020
1961 // Send package execute begin to BA. 2021 // Send package execute begin to BA.
1962 hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msiPackage.pPackage->sczId, !fRollback, pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.uiLevel, pExecuteAction->msiPackage.fDisableExternalUiHandler); 2022 hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pPackage->sczId, !fRollback, pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.uiLevel, pExecuteAction->msiPackage.fDisableExternalUiHandler);
1963 ExitOnRootFailure(hr, "BA aborted execute MSI package begin."); 2023 ExitOnRootFailure(hr, "BA aborted execute MSI package begin.");
1964 2024
2025 fExecuted = TRUE;
2026
1965 // execute package 2027 // execute package
1966 if (pExecuteAction->msiPackage.pPackage->fPerMachine) 2028 if (pPackage->fPerMachine)
1967 { 2029 {
1968 hrExecute = ElevationExecuteMsiPackage(pEngineState->companionConnection.hPipe, pEngineState->userExperience.hwndApply, pExecuteAction, &pEngineState->variables, fRollback, MsiExecuteMessageHandler, pContext, pRestart); 2030 hrExecute = ElevationExecuteMsiPackage(pEngineState->companionConnection.hPipe, pEngineState->userExperience.hwndApply, pExecuteAction, &pEngineState->variables, fRollback, MsiExecuteMessageHandler, pContext, pRestart);
1969 ExitOnFailure(hrExecute, "Failed to configure per-machine MSI package."); 2031 ExitOnFailure(hrExecute, "Failed to configure per-machine MSI package.");
@@ -1981,9 +2043,14 @@ static HRESULT ExecuteMsiPackage(
1981 ExitOnRootFailure(hr, "BA aborted MSI package execute progress."); 2043 ExitOnRootFailure(hr, "BA aborted MSI package execute progress.");
1982 2044
1983LExit: 2045LExit:
2046 if (fExecuted)
2047 {
2048 MsiEngineUpdateInstallRegistrationState(pExecuteAction, hrExecute, fInsideMsiTransaction);
2049 }
2050
1984 if (fBeginCalled) 2051 if (fBeginCalled)
1985 { 2052 {
1986 hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pExecuteAction->msiPackage.pPackage, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend); 2053 hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
1987 } 2054 }
1988 2055
1989 return hr; 2056 return hr;
@@ -1993,6 +2060,7 @@ static HRESULT ExecuteMspPackage(
1993 __in BURN_ENGINE_STATE* pEngineState, 2060 __in BURN_ENGINE_STATE* pEngineState,
1994 __in BURN_EXECUTE_ACTION* pExecuteAction, 2061 __in BURN_EXECUTE_ACTION* pExecuteAction,
1995 __in BURN_EXECUTE_CONTEXT* pContext, 2062 __in BURN_EXECUTE_CONTEXT* pContext,
2063 __in BOOL fInsideMsiTransaction,
1996 __in BOOL fRollback, 2064 __in BOOL fRollback,
1997 __out BOOL* pfRetry, 2065 __out BOOL* pfRetry,
1998 __out BOOL* pfSuspend, 2066 __out BOOL* pfSuspend,
@@ -2002,19 +2070,21 @@ static HRESULT ExecuteMspPackage(
2002 HRESULT hr = S_OK; 2070 HRESULT hr = S_OK;
2003 HRESULT hrExecute = S_OK; 2071 HRESULT hrExecute = S_OK;
2004 BOOL fBeginCalled = FALSE; 2072 BOOL fBeginCalled = FALSE;
2073 BOOL fExecuted = FALSE;
2074 BURN_PACKAGE* pPackage = pExecuteAction->mspTarget.pPackage;
2005 2075
2006 if (FAILED(pExecuteAction->mspTarget.pPackage->hrCacheResult)) 2076 if (FAILED(pPackage->hrCacheResult))
2007 { 2077 {
2008 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pExecuteAction->mspTarget.pPackage->sczId, pExecuteAction->mspTarget.pPackage->hrCacheResult); 2078 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pPackage->sczId, pPackage->hrCacheResult);
2009 ExitFunction1(hr = S_OK); 2079 ExitFunction1(hr = S_OK);
2010 } 2080 }
2011 2081
2012 Assert(pContext->fRollback == fRollback); 2082 Assert(pContext->fRollback == fRollback);
2013 pContext->pExecutingPackage = pExecuteAction->mspTarget.pPackage; 2083 pContext->pExecutingPackage = pPackage;
2014 fBeginCalled = TRUE; 2084 fBeginCalled = TRUE;
2015 2085
2016 // Send package execute begin to BA. 2086 // Send package execute begin to BA.
2017 hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->mspTarget.pPackage->sczId, !fRollback, pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.uiLevel, pExecuteAction->mspTarget.fDisableExternalUiHandler); 2087 hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pPackage->sczId, !fRollback, pExecuteAction->mspTarget.action, pExecuteAction->mspTarget.uiLevel, pExecuteAction->mspTarget.fDisableExternalUiHandler);
2018 ExitOnRootFailure(hr, "BA aborted execute MSP package begin."); 2088 ExitOnRootFailure(hr, "BA aborted execute MSP package begin.");
2019 2089
2020 // Now send all the patches that target this product code. 2090 // Now send all the patches that target this product code.
@@ -2026,6 +2096,8 @@ static HRESULT ExecuteMspPackage(
2026 ExitOnRootFailure(hr, "BA aborted execute MSP target."); 2096 ExitOnRootFailure(hr, "BA aborted execute MSP target.");
2027 } 2097 }
2028 2098
2099 fExecuted = TRUE;
2100
2029 // execute package 2101 // execute package
2030 if (pExecuteAction->mspTarget.fPerMachineTarget) 2102 if (pExecuteAction->mspTarget.fPerMachineTarget)
2031 { 2103 {
@@ -2045,9 +2117,14 @@ static HRESULT ExecuteMspPackage(
2045 ExitOnRootFailure(hr, "BA aborted MSP package execute progress."); 2117 ExitOnRootFailure(hr, "BA aborted MSP package execute progress.");
2046 2118
2047LExit: 2119LExit:
2120 if (fExecuted)
2121 {
2122 MspEngineUpdateInstallRegistrationState(pExecuteAction, hrExecute, fInsideMsiTransaction);
2123 }
2124
2048 if (fBeginCalled) 2125 if (fBeginCalled)
2049 { 2126 {
2050 hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pExecuteAction->mspTarget.pPackage, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend); 2127 hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2051 } 2128 }
2052 2129
2053 return hr; 2130 return hr;
@@ -2069,19 +2146,21 @@ static HRESULT ExecuteMsuPackage(
2069 GENERIC_EXECUTE_MESSAGE message = { }; 2146 GENERIC_EXECUTE_MESSAGE message = { };
2070 int nResult = 0; 2147 int nResult = 0;
2071 BOOL fBeginCalled = FALSE; 2148 BOOL fBeginCalled = FALSE;
2149 BOOL fExecuted = FALSE;
2150 BURN_PACKAGE* pPackage = pExecuteAction->msuPackage.pPackage;
2072 2151
2073 if (FAILED(pExecuteAction->msuPackage.pPackage->hrCacheResult)) 2152 if (FAILED(pPackage->hrCacheResult))
2074 { 2153 {
2075 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pExecuteAction->msuPackage.pPackage->sczId, pExecuteAction->msuPackage.pPackage->hrCacheResult); 2154 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pPackage->sczId, pPackage->hrCacheResult);
2076 ExitFunction1(hr = S_OK); 2155 ExitFunction1(hr = S_OK);
2077 } 2156 }
2078 2157
2079 Assert(pContext->fRollback == fRollback); 2158 Assert(pContext->fRollback == fRollback);
2080 pContext->pExecutingPackage = pExecuteAction->msuPackage.pPackage; 2159 pContext->pExecutingPackage = pPackage;
2081 fBeginCalled = TRUE; 2160 fBeginCalled = TRUE;
2082 2161
2083 // Send package execute begin to BA. 2162 // Send package execute begin to BA.
2084 hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pExecuteAction->msuPackage.pPackage->sczId, !fRollback, pExecuteAction->msuPackage.action, INSTALLUILEVEL_NOCHANGE, FALSE); 2163 hr = UserExperienceOnExecutePackageBegin(&pEngineState->userExperience, pPackage->sczId, !fRollback, pExecuteAction->msuPackage.action, INSTALLUILEVEL_NOCHANGE, FALSE);
2085 ExitOnRootFailure(hr, "BA aborted execute MSU package begin."); 2164 ExitOnRootFailure(hr, "BA aborted execute MSU package begin.");
2086 2165
2087 message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS; 2166 message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS;
@@ -2091,8 +2170,10 @@ static HRESULT ExecuteMsuPackage(
2091 hr = UserExperienceInterpretExecuteResult(&pEngineState->userExperience, fRollback, message.dwAllowedResults, nResult); 2170 hr = UserExperienceInterpretExecuteResult(&pEngineState->userExperience, fRollback, message.dwAllowedResults, nResult);
2092 ExitOnRootFailure(hr, "BA aborted MSU progress."); 2171 ExitOnRootFailure(hr, "BA aborted MSU progress.");
2093 2172
2173 fExecuted = TRUE;
2174
2094 // execute package 2175 // execute package
2095 if (pExecuteAction->msuPackage.pPackage->fPerMachine) 2176 if (pPackage->fPerMachine)
2096 { 2177 {
2097 hrExecute = ElevationExecuteMsuPackage(pEngineState->companionConnection.hPipe, pExecuteAction, fRollback, fStopWusaService, GenericExecuteMessageHandler, pContext, pRestart); 2178 hrExecute = ElevationExecuteMsuPackage(pEngineState->companionConnection.hPipe, pExecuteAction, fRollback, fStopWusaService, GenericExecuteMessageHandler, pContext, pRestart);
2098 ExitOnFailure(hrExecute, "Failed to configure per-machine MSU package."); 2179 ExitOnFailure(hrExecute, "Failed to configure per-machine MSU package.");
@@ -2117,9 +2198,14 @@ static HRESULT ExecuteMsuPackage(
2117 ExitOnRootFailure(hr, "BA aborted MSU package execute progress."); 2198 ExitOnRootFailure(hr, "BA aborted MSU package execute progress.");
2118 2199
2119LExit: 2200LExit:
2201 if (fExecuted)
2202 {
2203 MsuEngineUpdateInstallRegistrationState(pExecuteAction, hrExecute);
2204 }
2205
2120 if (fBeginCalled) 2206 if (fBeginCalled)
2121 { 2207 {
2122 hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pExecuteAction->msuPackage.pPackage, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend); 2208 hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2123 } 2209 }
2124 2210
2125 return hr; 2211 return hr;
@@ -2167,6 +2253,32 @@ static HRESULT ExecuteDependencyAction(
2167 ExitOnFailure(hr, "Failed to register the dependency on per-user package."); 2253 ExitOnFailure(hr, "Failed to register the dependency on per-user package.");
2168 } 2254 }
2169 2255
2256 if (pAction->packageDependency.pPackage->fCanAffectRegistration)
2257 {
2258 if (BURN_DEPENDENCY_ACTION_REGISTER == pAction->packageDependency.action)
2259 {
2260 if (BURN_PACKAGE_REGISTRATION_STATE_IGNORED == pAction->packageDependency.pPackage->cacheRegistrationState)
2261 {
2262 pAction->packageDependency.pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT;
2263 }
2264 if (BURN_PACKAGE_REGISTRATION_STATE_IGNORED == pAction->packageDependency.pPackage->installRegistrationState)
2265 {
2266 pAction->packageDependency.pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_PRESENT;
2267 }
2268 }
2269 else if (BURN_DEPENDENCY_ACTION_UNREGISTER == pAction->packageDependency.action)
2270 {
2271 if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pAction->packageDependency.pPackage->cacheRegistrationState)
2272 {
2273 pAction->packageDependency.pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_IGNORED;
2274 }
2275 if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pAction->packageDependency.pPackage->installRegistrationState)
2276 {
2277 pAction->packageDependency.pPackage->installRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_IGNORED;
2278 }
2279 }
2280 }
2281
2170LExit: 2282LExit:
2171 return hr; 2283 return hr;
2172} 2284}
@@ -2202,6 +2314,8 @@ static HRESULT ExecuteMsiBeginTransaction(
2202 if (SUCCEEDED(hr)) 2314 if (SUCCEEDED(hr))
2203 { 2315 {
2204 pRollbackBoundary->fActiveTransaction = TRUE; 2316 pRollbackBoundary->fActiveTransaction = TRUE;
2317
2318 ResetTransactionRegistrationState(pEngineState, FALSE);
2205 } 2319 }
2206 2320
2207LExit: 2321LExit:
@@ -2244,6 +2358,8 @@ static HRESULT ExecuteMsiCommitTransaction(
2244 if (SUCCEEDED(hr)) 2358 if (SUCCEEDED(hr))
2245 { 2359 {
2246 pRollbackBoundary->fActiveTransaction = FALSE; 2360 pRollbackBoundary->fActiveTransaction = FALSE;
2361
2362 ResetTransactionRegistrationState(pEngineState, TRUE);
2247 } 2363 }
2248 2364
2249LExit: 2365LExit:
@@ -2285,6 +2401,8 @@ static HRESULT ExecuteMsiRollbackTransaction(
2285LExit: 2401LExit:
2286 pRollbackBoundary->fActiveTransaction = FALSE; 2402 pRollbackBoundary->fActiveTransaction = FALSE;
2287 2403
2404 ResetTransactionRegistrationState(pEngineState, FALSE);
2405
2288 if (fBeginCalled) 2406 if (fBeginCalled)
2289 { 2407 {
2290 UserExperienceOnRollbackMsiTransactionComplete(&pEngineState->userExperience, pRollbackBoundary->sczId, hr); 2408 UserExperienceOnRollbackMsiTransactionComplete(&pEngineState->userExperience, pRollbackBoundary->sczId, hr);
@@ -2293,6 +2411,38 @@ LExit:
2293 return hr; 2411 return hr;
2294} 2412}
2295 2413
2414static void ResetTransactionRegistrationState(
2415 __in BURN_ENGINE_STATE* pEngineState,
2416 __in BOOL fCommit
2417 )
2418{
2419 for (DWORD i = 0; i < pEngineState->packages.cPackages; ++i)
2420 {
2421 BURN_PACKAGE* pPackage = pEngineState->packages.rgPackages + i;
2422
2423 if (BURN_PACKAGE_TYPE_MSP == pPackage->type)
2424 {
2425 for (DWORD j = 0; j < pPackage->Msp.cTargetProductCodes; ++j)
2426 {
2427 BURN_MSPTARGETPRODUCT* pTargetProduct = pPackage->Msp.rgTargetProducts + j;
2428
2429 if (fCommit && BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN != pTargetProduct->transactionRegistrationState)
2430 {
2431 pTargetProduct->registrationState = pTargetProduct->transactionRegistrationState;
2432 }
2433
2434 pTargetProduct->transactionRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN;
2435 }
2436 }
2437 else if (fCommit && BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN != pPackage->transactionRegistrationState)
2438 {
2439 pPackage->installRegistrationState = pPackage->transactionRegistrationState;
2440 }
2441
2442 pPackage->transactionRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN;
2443 }
2444}
2445
2296static HRESULT CleanPackage( 2446static HRESULT CleanPackage(
2297 __in HANDLE hElevatedPipe, 2447 __in HANDLE hElevatedPipe,
2298 __in BURN_PACKAGE* pPackage 2448 __in BURN_PACKAGE* pPackage
@@ -2309,6 +2459,11 @@ static HRESULT CleanPackage(
2309 hr = CacheRemovePackage(FALSE, pPackage->sczId, pPackage->sczCacheId); 2459 hr = CacheRemovePackage(FALSE, pPackage->sczId, pPackage->sczCacheId);
2310 } 2460 }
2311 2461
2462 if (pPackage->fCanAffectRegistration)
2463 {
2464 pPackage->cacheRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
2465 }
2466
2312 return hr; 2467 return hr;
2313} 2468}
2314 2469