aboutsummaryrefslogtreecommitdiff
path: root/src/engine/apply.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-02-02 18:09:58 -0600
committerSean Hall <r.sean.hall@gmail.com>2021-02-04 22:16:10 -0600
commitfd8c2b0899bfbce07386af245c04eb21dc01cbdf (patch)
tree33d928124b0028729916189ddb9f239a9574c75d /src/engine/apply.cpp
parent39725a1a6d1c72a6748bd3c306af32bcae6dbf8f (diff)
downloadwix-fd8c2b0899bfbce07386af245c04eb21dc01cbdf.tar.gz
wix-fd8c2b0899bfbce07386af245c04eb21dc01cbdf.tar.bz2
wix-fd8c2b0899bfbce07386af245c04eb21dc01cbdf.zip
Update the logic for determining when the bundle should be registered.
The basic rule is that if a non-permanent package is present at the end of the chain, then the bundle should be registered. If no non-permanent packages are present at the end of the chain, then the bundle should not be registered. This required tracking what actually happened with each package during Apply. Include cache status in registration calculation. Include dependency ref-counting when determining whether the bundle should be registered.
Diffstat (limited to 'src/engine/apply.cpp')
-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