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