diff options
Diffstat (limited to '')
-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 | ||