diff options
Diffstat (limited to 'src/engine/msiengine.cpp')
| -rw-r--r-- | src/engine/msiengine.cpp | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp index 801bf9a8..ae105155 100644 --- a/src/engine/msiengine.cpp +++ b/src/engine/msiengine.cpp | |||
| @@ -213,8 +213,8 @@ extern "C" HRESULT MsiEngineParsePackageFromXml( | |||
| 213 | 213 | ||
| 214 | if (cNodes) | 214 | if (cNodes) |
| 215 | { | 215 | { |
| 216 | pPackage->Msi.rgpSlipstreamMspPackages = reinterpret_cast<BURN_PACKAGE**>(MemAlloc(sizeof(BURN_PACKAGE*) * cNodes, TRUE)); | 216 | pPackage->Msi.rgSlipstreamMsps = reinterpret_cast<BURN_SLIPSTREAM_MSP*>(MemAlloc(sizeof(BURN_SLIPSTREAM_MSP) * cNodes, TRUE)); |
| 217 | ExitOnNull(pPackage->Msi.rgpSlipstreamMspPackages, hr, E_OUTOFMEMORY, "Failed to allocate memory for slipstream MSP packages."); | 217 | ExitOnNull(pPackage->Msi.rgSlipstreamMsps, hr, E_OUTOFMEMORY, "Failed to allocate memory for slipstream MSP packages."); |
| 218 | 218 | ||
| 219 | pPackage->Msi.rgsczSlipstreamMspPackageIds = reinterpret_cast<LPWSTR*>(MemAlloc(sizeof(LPWSTR*) * cNodes, TRUE)); | 219 | pPackage->Msi.rgsczSlipstreamMspPackageIds = reinterpret_cast<LPWSTR*>(MemAlloc(sizeof(LPWSTR*) * cNodes, TRUE)); |
| 220 | ExitOnNull(pPackage->Msi.rgsczSlipstreamMspPackageIds, hr, E_OUTOFMEMORY, "Failed to allocate memory for slipstream MSP ids."); | 220 | ExitOnNull(pPackage->Msi.rgsczSlipstreamMspPackageIds, hr, E_OUTOFMEMORY, "Failed to allocate memory for slipstream MSP ids."); |
| @@ -383,15 +383,52 @@ extern "C" void MsiEnginePackageUninitialize( | |||
| 383 | MemFree(pPackage->Msi.rgsczSlipstreamMspPackageIds); | 383 | MemFree(pPackage->Msi.rgsczSlipstreamMspPackageIds); |
| 384 | } | 384 | } |
| 385 | 385 | ||
| 386 | if (pPackage->Msi.rgpSlipstreamMspPackages) | 386 | if (pPackage->Msi.rgSlipstreamMsps) |
| 387 | { | 387 | { |
| 388 | MemFree(pPackage->Msi.rgpSlipstreamMspPackages); | 388 | MemFree(pPackage->Msi.rgSlipstreamMsps); |
| 389 | } | ||
| 390 | |||
| 391 | if (pPackage->Msi.rgChainedPatches) | ||
| 392 | { | ||
| 393 | MemFree(pPackage->Msi.rgChainedPatches); | ||
| 389 | } | 394 | } |
| 390 | 395 | ||
| 391 | // clear struct | 396 | // clear struct |
| 392 | memset(&pPackage->Msi, 0, sizeof(pPackage->Msi)); | 397 | memset(&pPackage->Msi, 0, sizeof(pPackage->Msi)); |
| 393 | } | 398 | } |
| 394 | 399 | ||
| 400 | extern "C" HRESULT MsiEngineDetectInitialize( | ||
| 401 | __in BURN_PACKAGES* pPackages | ||
| 402 | ) | ||
| 403 | { | ||
| 404 | AssertSz(pPackages->cPatchInfo, "MsiEngineDetectInitialize() should only be called if there are MSP packages."); | ||
| 405 | |||
| 406 | HRESULT hr = S_OK; | ||
| 407 | |||
| 408 | // Add target products for slipstream MSIs that weren't detected. | ||
| 409 | for (DWORD iPackage = 0; iPackage < pPackages->cPackages; ++iPackage) | ||
| 410 | { | ||
| 411 | BURN_PACKAGE* pMsiPackage = pPackages->rgPackages + iPackage; | ||
| 412 | if (BURN_PACKAGE_TYPE_MSI == pMsiPackage->type) | ||
| 413 | { | ||
| 414 | for (DWORD j = 0; j < pMsiPackage->Msi.cSlipstreamMspPackages; ++j) | ||
| 415 | { | ||
| 416 | BURN_SLIPSTREAM_MSP* pSlipstreamMsp = pMsiPackage->Msi.rgSlipstreamMsps + j; | ||
| 417 | Assert(pSlipstreamMsp->pMspPackage && BURN_PACKAGE_TYPE_MSP == pSlipstreamMsp->pMspPackage->type); | ||
| 418 | |||
| 419 | if (pSlipstreamMsp->pMspPackage && BURN_PACKAGE_INVALID_PATCH_INDEX == pSlipstreamMsp->dwMsiChainedPatchIndex) | ||
| 420 | { | ||
| 421 | hr = MspEngineAddMissingSlipstreamTarget(pMsiPackage, pSlipstreamMsp); | ||
| 422 | ExitOnFailure(hr, "Failed to add slipstreamed target product code to package: %ls", pSlipstreamMsp->pMspPackage->sczId); | ||
| 423 | } | ||
| 424 | } | ||
| 425 | } | ||
| 426 | } | ||
| 427 | |||
| 428 | LExit: | ||
| 429 | return hr; | ||
| 430 | } | ||
| 431 | |||
| 395 | extern "C" HRESULT MsiEngineDetectPackage( | 432 | extern "C" HRESULT MsiEngineDetectPackage( |
| 396 | __in BURN_PACKAGE* pPackage, | 433 | __in BURN_PACKAGE* pPackage, |
| 397 | __in BURN_USER_EXPERIENCE* pUserExperience | 434 | __in BURN_USER_EXPERIENCE* pUserExperience |
| @@ -971,15 +1008,6 @@ extern "C" HRESULT MsiEnginePlanAddPackage( | |||
| 971 | pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; | 1008 | pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; |
| 972 | } | 1009 | } |
| 973 | 1010 | ||
| 974 | // Update any slipstream patches' state. | ||
| 975 | for (DWORD i = 0; i < pPackage->Msi.cSlipstreamMspPackages; ++i) | ||
| 976 | { | ||
| 977 | BURN_PACKAGE* pMspPackage = pPackage->Msi.rgpSlipstreamMspPackages[i]; | ||
| 978 | AssertSz(BURN_PACKAGE_TYPE_MSP == pMspPackage->type, "Only MSP packages can be slipstream patches."); | ||
| 979 | |||
| 980 | MspEngineSlipstreamUpdateState(pMspPackage, pPackage->execute, pPackage->rollback); | ||
| 981 | } | ||
| 982 | |||
| 983 | LExit: | 1011 | LExit: |
| 984 | ReleaseMem(rgFeatureActions); | 1012 | ReleaseMem(rgFeatureActions); |
| 985 | ReleaseMem(rgRollbackFeatureActions); | 1013 | ReleaseMem(rgRollbackFeatureActions); |
| @@ -1897,7 +1925,7 @@ static HRESULT ConcatPatchProperty( | |||
| 1897 | { | 1925 | { |
| 1898 | for (DWORD i = 0; i < pPackage->Msi.cSlipstreamMspPackages; ++i) | 1926 | for (DWORD i = 0; i < pPackage->Msi.cSlipstreamMspPackages; ++i) |
| 1899 | { | 1927 | { |
| 1900 | BURN_PACKAGE* pMspPackage = pPackage->Msi.rgpSlipstreamMspPackages[i]; | 1928 | BURN_PACKAGE* pMspPackage = pPackage->Msi.rgSlipstreamMsps[i].pMspPackage; |
| 1901 | AssertSz(BURN_PACKAGE_TYPE_MSP == pMspPackage->type, "Only MSP packages can be slipstream patches."); | 1929 | AssertSz(BURN_PACKAGE_TYPE_MSP == pMspPackage->type, "Only MSP packages can be slipstream patches."); |
| 1902 | 1930 | ||
| 1903 | BOOTSTRAPPER_ACTION_STATE patchExecuteAction = rgSlipstreamPatchActions[i]; | 1931 | BOOTSTRAPPER_ACTION_STATE patchExecuteAction = rgSlipstreamPatchActions[i]; |
