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