diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2021-02-02 18:09:58 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-02-04 22:16:10 -0600 |
| commit | fd8c2b0899bfbce07386af245c04eb21dc01cbdf (patch) | |
| tree | 33d928124b0028729916189ddb9f239a9574c75d /src/engine/apply.cpp | |
| parent | 39725a1a6d1c72a6748bd3c306af32bcae6dbf8f (diff) | |
| download | wix-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.cpp | 247 |
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 | ||
| 49 | static void CalculateKeepRegistration( | ||
| 50 | __in BURN_ENGINE_STATE* pEngineState, | ||
| 51 | __inout BOOL* pfKeepRegistration | ||
| 52 | ); | ||
| 49 | static HRESULT ExecuteDependentRegistrationActions( | 53 | static 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 | ); |
| 155 | static HRESULT ExecuteExePackage( | 157 | static 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 | ); |
| 221 | static void ResetTransactionRegistrationState( | ||
| 222 | __in BURN_ENGINE_STATE* pEngineState, | ||
| 223 | __in BOOL fCommit | ||
| 224 | ); | ||
| 217 | static HRESULT CleanPackage( | 225 | static 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: | |||
| 380 | extern "C" HRESULT ApplyUnregister( | 389 | extern "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 | ||
| 877 | static 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 | |||
| 866 | static HRESULT ExecuteDependentRegistrationActions( | 908 | static 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 | ||
| 1928 | LExit: | 1980 | LExit: |
| 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 | ||
| 1983 | LExit: | 2045 | LExit: |
| 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 | ||
| 2047 | LExit: | 2119 | LExit: |
| 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 | ||
| 2119 | LExit: | 2200 | LExit: |
| 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 | |||
| 2170 | LExit: | 2282 | LExit: |
| 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 | ||
| 2207 | LExit: | 2321 | LExit: |
| @@ -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 | ||
| 2249 | LExit: | 2365 | LExit: |
| @@ -2285,6 +2401,8 @@ static HRESULT ExecuteMsiRollbackTransaction( | |||
| 2285 | LExit: | 2401 | LExit: |
| 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 | ||
| 2414 | static 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 | |||
| 2296 | static HRESULT CleanPackage( | 2446 | static 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 | ||
