diff options
Diffstat (limited to '')
| -rw-r--r-- | src/burn/engine/msiengine.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/burn/engine/msiengine.cpp b/src/burn/engine/msiengine.cpp index edbf4d45..2c1b0d4f 100644 --- a/src/burn/engine/msiengine.cpp +++ b/src/burn/engine/msiengine.cpp | |||
| @@ -448,12 +448,15 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
| 448 | VERUTIL_VERSION* pVersion = NULL; | 448 | VERUTIL_VERSION* pVersion = NULL; |
| 449 | UINT uLcid = 0; | 449 | UINT uLcid = 0; |
| 450 | BOOL fPerMachine = FALSE; | 450 | BOOL fPerMachine = FALSE; |
| 451 | BOOL fDetectFeatures = FALSE; | ||
| 451 | 452 | ||
| 452 | // detect self by product code | 453 | // detect self by product code |
| 453 | // TODO: what to do about MSIINSTALLCONTEXT_USERMANAGED? | 454 | // TODO: what to do about MSIINSTALLCONTEXT_USERMANAGED? |
| 454 | hr = WiuGetProductInfoEx(pPackage->Msi.sczProductCode, NULL, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion); | 455 | hr = WiuGetProductInfoEx(pPackage->Msi.sczProductCode, NULL, pPackage->fPerMachine ? MSIINSTALLCONTEXT_MACHINE : MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion); |
| 455 | if (SUCCEEDED(hr)) | 456 | if (SUCCEEDED(hr)) |
| 456 | { | 457 | { |
| 458 | fDetectFeatures = TRUE; | ||
| 459 | |||
| 457 | hr = VerParseVersion(sczInstalledVersion, 0, FALSE, &pVersion); | 460 | hr = VerParseVersion(sczInstalledVersion, 0, FALSE, &pVersion); |
| 458 | ExitOnFailure(hr, "Failed to parse installed version: '%ls' for ProductCode: %ls", sczInstalledVersion, pPackage->Msi.sczProductCode); | 461 | ExitOnFailure(hr, "Failed to parse installed version: '%ls' for ProductCode: %ls", sczInstalledVersion, pPackage->Msi.sczProductCode); |
| 459 | 462 | ||
| @@ -661,7 +664,7 @@ extern "C" HRESULT MsiEngineDetectPackage( | |||
| 661 | BURN_MSIFEATURE* pFeature = &pPackage->Msi.rgFeatures[i]; | 664 | BURN_MSIFEATURE* pFeature = &pPackage->Msi.rgFeatures[i]; |
| 662 | 665 | ||
| 663 | // Try to detect features state if the product is present on the machine. | 666 | // Try to detect features state if the product is present on the machine. |
| 664 | if (BOOTSTRAPPER_PACKAGE_STATE_PRESENT <= pPackage->currentState) | 667 | if (fDetectFeatures) |
| 665 | { | 668 | { |
| 666 | hr = WiuQueryFeatureState(pPackage->Msi.sczProductCode, pFeature->sczId, &installState); | 669 | hr = WiuQueryFeatureState(pPackage->Msi.sczProductCode, pFeature->sczId, &installState); |
| 667 | ExitOnFailure(hr, "Failed to query feature state."); | 670 | ExitOnFailure(hr, "Failed to query feature state."); |
| @@ -864,8 +867,9 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage( | |||
| 864 | 867 | ||
| 865 | if (pPackage->Msi.cFeatures) | 868 | if (pPackage->Msi.cFeatures) |
| 866 | { | 869 | { |
| 867 | // If the package is present and we're repairing it. | 870 | // If the package is present and we're repairing it, or we're doing a minor update. |
| 868 | BOOL fRepairingPackage = (BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState && BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested); | 871 | BOOL fRepairingPackage = (BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState && BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested) || |
| 872 | BOOTSTRAPPER_RELATED_OPERATION_MINOR_UPDATE == pPackage->Msi.operation; | ||
| 869 | 873 | ||
| 870 | // plan features | 874 | // plan features |
| 871 | for (DWORD i = 0; i < pPackage->Msi.cFeatures; ++i) | 875 | for (DWORD i = 0; i < pPackage->Msi.cFeatures; ++i) |
| @@ -1282,10 +1286,10 @@ extern "C" HRESULT MsiEngineExecutePackage( | |||
| 1282 | hr = ConcatPatchProperty(pCache, pPackage, fRollback, &sczObfuscatedProperties); | 1286 | hr = ConcatPatchProperty(pCache, pPackage, fRollback, &sczObfuscatedProperties); |
| 1283 | ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string."); | 1287 | ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string."); |
| 1284 | 1288 | ||
| 1285 | hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, !pPackage->Msi.cFeatures, &sczProperties); | 1289 | hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, 0 != pPackage->Msi.cFeatures, &sczProperties); |
| 1286 | ExitOnFailure(hr, "Failed to add action property to argument string."); | 1290 | ExitOnFailure(hr, "Failed to add action property to argument string."); |
| 1287 | 1291 | ||
| 1288 | hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, !pPackage->Msi.cFeatures, &sczObfuscatedProperties); | 1292 | hr = MsiEngineConcatBurnProperties(pExecuteAction->msiPackage.action, pExecuteAction->msiPackage.actionMsiProperty, pExecuteAction->msiPackage.fileVersioning, TRUE, 0 != pPackage->Msi.cFeatures, &sczObfuscatedProperties); |
| 1289 | ExitOnFailure(hr, "Failed to add action property to obfuscated argument string."); | 1293 | ExitOnFailure(hr, "Failed to add action property to obfuscated argument string."); |
| 1290 | 1294 | ||
| 1291 | LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L""); | 1295 | LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L""); |
