diff options
Diffstat (limited to 'src/engine/msiengine.cpp')
-rw-r--r-- | src/engine/msiengine.cpp | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp index ae105155..f0aa784e 100644 --- a/src/engine/msiengine.cpp +++ b/src/engine/msiengine.cpp | |||
@@ -42,7 +42,7 @@ static HRESULT ConcatFeatureActionProperties( | |||
42 | ); | 42 | ); |
43 | static HRESULT ConcatPatchProperty( | 43 | static HRESULT ConcatPatchProperty( |
44 | __in BURN_PACKAGE* pPackage, | 44 | __in BURN_PACKAGE* pPackage, |
45 | __in_opt BOOTSTRAPPER_ACTION_STATE* rgSlipstreamPatchActions, | 45 | __in BOOL fRollback, |
46 | __inout_z LPWSTR* psczArguments | 46 | __inout_z LPWSTR* psczArguments |
47 | ); | 47 | ); |
48 | static void RegisterSourceDirectory( | 48 | static void RegisterSourceDirectory( |
@@ -1180,10 +1180,10 @@ extern "C" HRESULT MsiEngineExecutePackage( | |||
1180 | ExitOnFailure(hr, "Failed to add feature action properties to obfuscated argument string."); | 1180 | ExitOnFailure(hr, "Failed to add feature action properties to obfuscated argument string."); |
1181 | 1181 | ||
1182 | // add slipstream patch properties | 1182 | // add slipstream patch properties |
1183 | hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, pExecuteAction->msiPackage.rgSlipstreamPatches, &sczProperties); | 1183 | hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, fRollback, &sczProperties); |
1184 | ExitOnFailure(hr, "Failed to add patch properties to argument string."); | 1184 | ExitOnFailure(hr, "Failed to add patch properties to argument string."); |
1185 | 1185 | ||
1186 | hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, pExecuteAction->msiPackage.rgSlipstreamPatches, &sczObfuscatedProperties); | 1186 | hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, fRollback, &sczObfuscatedProperties); |
1187 | ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string."); | 1187 | ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string."); |
1188 | 1188 | ||
1189 | hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczProperties); | 1189 | hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczProperties); |
@@ -1432,6 +1432,7 @@ extern "C" HRESULT MsiEngineCalculateInstallUiLevel( | |||
1432 | 1432 | ||
1433 | extern "C" void MsiEngineUpdateInstallRegistrationState( | 1433 | extern "C" void MsiEngineUpdateInstallRegistrationState( |
1434 | __in BURN_EXECUTE_ACTION* pAction, | 1434 | __in BURN_EXECUTE_ACTION* pAction, |
1435 | __in BOOL fRollback, | ||
1435 | __in HRESULT hrExecute, | 1436 | __in HRESULT hrExecute, |
1436 | __in BOOL fInsideMsiTransaction | 1437 | __in BOOL fInsideMsiTransaction |
1437 | ) | 1438 | ) |
@@ -1462,6 +1463,49 @@ extern "C" void MsiEngineUpdateInstallRegistrationState( | |||
1462 | pPackage->installRegistrationState = newState; | 1463 | pPackage->installRegistrationState = newState; |
1463 | } | 1464 | } |
1464 | 1465 | ||
1466 | if (BURN_PACKAGE_REGISTRATION_STATE_ABSENT == newState) | ||
1467 | { | ||
1468 | for (DWORD i = 0; i < pPackage->Msi.cChainedPatches; ++i) | ||
1469 | { | ||
1470 | BURN_CHAINED_PATCH* pChainedPatch = pPackage->Msi.rgChainedPatches + i; | ||
1471 | BURN_MSPTARGETPRODUCT* pTargetProduct = pChainedPatch->pMspPackage->Msp.rgTargetProducts + pChainedPatch->dwMspTargetProductIndex; | ||
1472 | |||
1473 | if (fInsideMsiTransaction) | ||
1474 | { | ||
1475 | pTargetProduct->transactionRegistrationState = newState; | ||
1476 | } | ||
1477 | else | ||
1478 | { | ||
1479 | pTargetProduct->registrationState = newState; | ||
1480 | } | ||
1481 | } | ||
1482 | } | ||
1483 | else | ||
1484 | { | ||
1485 | for (DWORD i = 0; i < pPackage->Msi.cSlipstreamMspPackages; ++i) | ||
1486 | { | ||
1487 | BURN_SLIPSTREAM_MSP* pSlipstreamMsp = pPackage->Msi.rgSlipstreamMsps + i; | ||
1488 | BOOTSTRAPPER_ACTION_STATE patchExecuteAction = fRollback ? pSlipstreamMsp->rollback : pSlipstreamMsp->execute; | ||
1489 | |||
1490 | if (BOOTSTRAPPER_ACTION_STATE_INSTALL > patchExecuteAction) | ||
1491 | { | ||
1492 | continue; | ||
1493 | } | ||
1494 | |||
1495 | BURN_CHAINED_PATCH* pChainedPatch = pPackage->Msi.rgChainedPatches + pSlipstreamMsp->dwMsiChainedPatchIndex; | ||
1496 | BURN_MSPTARGETPRODUCT* pTargetProduct = pChainedPatch->pMspPackage->Msp.rgTargetProducts + pChainedPatch->dwMspTargetProductIndex; | ||
1497 | |||
1498 | if (fInsideMsiTransaction) | ||
1499 | { | ||
1500 | pTargetProduct->transactionRegistrationState = newState; | ||
1501 | } | ||
1502 | else | ||
1503 | { | ||
1504 | pTargetProduct->registrationState = newState; | ||
1505 | } | ||
1506 | } | ||
1507 | } | ||
1508 | |||
1465 | LExit: | 1509 | LExit: |
1466 | return; | 1510 | return; |
1467 | } | 1511 | } |
@@ -1911,7 +1955,7 @@ LExit: | |||
1911 | 1955 | ||
1912 | static HRESULT ConcatPatchProperty( | 1956 | static HRESULT ConcatPatchProperty( |
1913 | __in BURN_PACKAGE* pPackage, | 1957 | __in BURN_PACKAGE* pPackage, |
1914 | __in_opt BOOTSTRAPPER_ACTION_STATE* rgSlipstreamPatchActions, | 1958 | __in BOOL fRollback, |
1915 | __inout_z LPWSTR* psczArguments | 1959 | __inout_z LPWSTR* psczArguments |
1916 | ) | 1960 | ) |
1917 | { | 1961 | { |
@@ -1921,14 +1965,14 @@ static HRESULT ConcatPatchProperty( | |||
1921 | LPWSTR sczPatches = NULL; | 1965 | LPWSTR sczPatches = NULL; |
1922 | 1966 | ||
1923 | // If there are slipstream patch actions, build up their patch action. | 1967 | // If there are slipstream patch actions, build up their patch action. |
1924 | if (rgSlipstreamPatchActions) | 1968 | if (pPackage->Msi.cSlipstreamMspPackages) |
1925 | { | 1969 | { |
1926 | for (DWORD i = 0; i < pPackage->Msi.cSlipstreamMspPackages; ++i) | 1970 | for (DWORD i = 0; i < pPackage->Msi.cSlipstreamMspPackages; ++i) |
1927 | { | 1971 | { |
1928 | BURN_PACKAGE* pMspPackage = pPackage->Msi.rgSlipstreamMsps[i].pMspPackage; | 1972 | BURN_SLIPSTREAM_MSP* pSlipstreamMsp = pPackage->Msi.rgSlipstreamMsps + i; |
1929 | AssertSz(BURN_PACKAGE_TYPE_MSP == pMspPackage->type, "Only MSP packages can be slipstream patches."); | 1973 | BURN_PACKAGE* pMspPackage = pSlipstreamMsp->pMspPackage; |
1974 | BOOTSTRAPPER_ACTION_STATE patchExecuteAction = fRollback ? pSlipstreamMsp->rollback : pSlipstreamMsp->execute; | ||
1930 | 1975 | ||
1931 | BOOTSTRAPPER_ACTION_STATE patchExecuteAction = rgSlipstreamPatchActions[i]; | ||
1932 | if (BOOTSTRAPPER_ACTION_STATE_UNINSTALL < patchExecuteAction) | 1976 | if (BOOTSTRAPPER_ACTION_STATE_UNINSTALL < patchExecuteAction) |
1933 | { | 1977 | { |
1934 | hr = CacheGetCompletedPath(pMspPackage->fPerMachine, pMspPackage->sczCacheId, &sczCachedDirectory); | 1978 | hr = CacheGetCompletedPath(pMspPackage->fPerMachine, pMspPackage->sczCacheId, &sczCachedDirectory); |