From d21eed76c48960707561c45c492c10a6a23c052e Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 31 Jul 2020 17:06:35 -0600 Subject: WIXFEAT:4763 Change "string" variable type to literal and add "formatted". --- src/engine/EngineForApplication.cpp | 2 +- src/engine/EngineForExtension.cpp | 30 +---------- src/engine/apply.cpp | 4 +- src/engine/cache.cpp | 6 +-- src/engine/condition.cpp | 11 +++- src/engine/core.cpp | 8 +-- src/engine/engine.cpp | 2 +- src/engine/exeengine.cpp | 6 +-- src/engine/logging.cpp | 4 +- src/engine/msiengine.cpp | 6 +-- src/engine/mspengine.cpp | 6 +-- src/engine/msuengine.cpp | 4 +- src/engine/registration.cpp | 10 ++-- src/engine/search.cpp | 36 ++++++++----- src/engine/variable.cpp | 102 +++++++++++++----------------------- src/engine/variable.h | 17 ++---- src/engine/variant.cpp | 34 +++++++++--- src/engine/variant.h | 6 ++- 18 files changed, 130 insertions(+), 164 deletions(-) (limited to 'src/engine') diff --git a/src/engine/EngineForApplication.cpp b/src/engine/EngineForApplication.cpp index e559b438..81eec2fc 100644 --- a/src/engine/EngineForApplication.cpp +++ b/src/engine/EngineForApplication.cpp @@ -592,7 +592,7 @@ static HRESULT BAEngineSetVariableString( if (wzVariable && *wzVariable) { - hr = VariableSetString(&pContext->pEngineState->variables, wzVariable, wzValue, FALSE); + hr = VariableSetString(&pContext->pEngineState->variables, wzVariable, wzValue, FALSE, pArgs->fFormatted); ExitOnFailure(hr, "Failed to set string variable."); } else diff --git a/src/engine/EngineForExtension.cpp b/src/engine/EngineForExtension.cpp index 9667dd18..fdfa59b1 100644 --- a/src/engine/EngineForExtension.cpp +++ b/src/engine/EngineForExtension.cpp @@ -245,31 +245,6 @@ LExit: return hr; } -static HRESULT BEEngineSetVariableLiteralString( - __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, - __in const BUNDLE_EXTENSION_ENGINE_SETVARIABLELITERALSTRING_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_SETVARIABLELITERALSTRING_RESULTS* /*pResults*/ - ) -{ - HRESULT hr = S_OK; - LPCWSTR wzVariable = pArgs->wzVariable; - LPCWSTR wzValue = pArgs->wzValue; - - if (wzVariable && *wzVariable) - { - hr = VariableSetLiteralString(&pContext->pEngineState->variables, wzVariable, wzValue, FALSE); - ExitOnFailure(hr, "Failed to set literal string variable."); - } - else - { - hr = E_INVALIDARG; - ExitOnFailure(hr, "Bundle Extension did not provide variable name."); - } - -LExit: - return hr; -} - static HRESULT BEEngineSetVariableNumeric( __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, __in const BUNDLE_EXTENSION_ENGINE_SETVARIABLENUMERIC_ARGS* pArgs, @@ -307,7 +282,7 @@ static HRESULT BEEngineSetVariableString( if (wzVariable && *wzVariable) { - hr = VariableSetString(&pContext->pEngineState->variables, wzVariable, wzValue, FALSE); + hr = VariableSetString(&pContext->pEngineState->variables, wzVariable, wzValue, FALSE, pArgs->fFormatted); ExitOnFailure(hr, "Failed to set string variable."); } else @@ -383,9 +358,6 @@ HRESULT WINAPI EngineForExtensionProc( case BUNDLE_EXTENSION_ENGINE_MESSAGE_LOG: hr = BEEngineLog(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); break; - case BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLELITERALSTRING: - hr = BEEngineSetVariableLiteralString(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); - break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLENUMERIC: hr = BEEngineSetVariableNumeric(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); break; diff --git a/src/engine/apply.cpp b/src/engine/apply.cpp index eae7c681..9a0f64e1 100644 --- a/src/engine/apply.cpp +++ b/src/engine/apply.cpp @@ -272,7 +272,7 @@ extern "C" HRESULT ApplySetVariables( { HRESULT hr = S_OK; - hr = VariableSetString(pVariables, BURN_BUNDLE_FORCED_RESTART_PACKAGE, NULL, TRUE); + hr = VariableSetString(pVariables, BURN_BUNDLE_FORCED_RESTART_PACKAGE, NULL, TRUE, FALSE); ExitOnFailure(hr, "Failed to set the bundle forced restart package built-in variable."); LExit: @@ -2493,7 +2493,7 @@ static HRESULT ExecutePackageComplete( if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == *pRestart) { // Best effort to set the forced restart package variable. - VariableSetString(pVariables, BURN_BUNDLE_FORCED_RESTART_PACKAGE, pPackage->sczId, TRUE); + VariableSetString(pVariables, BURN_BUNDLE_FORCED_RESTART_PACKAGE, pPackage->sczId, TRUE, FALSE); } // If we're retrying, leave a message in the log file and say everything is okay. diff --git a/src/engine/cache.cpp b/src/engine/cache.cpp index 9338426d..315281bc 100644 --- a/src/engine/cache.cpp +++ b/src/engine/cache.cpp @@ -157,7 +157,7 @@ extern "C" HRESULT CacheInitialize( hr = VariableGetString(pVariables, BURN_BUNDLE_ORIGINAL_SOURCE, &sczOriginalSource); if (E_NOTFOUND == hr) { - hr = VariableSetLiteralString(pVariables, BURN_BUNDLE_ORIGINAL_SOURCE, wzSourceProcessPath, FALSE); + hr = VariableSetString(pVariables, BURN_BUNDLE_ORIGINAL_SOURCE, wzSourceProcessPath, FALSE, FALSE); ExitOnFailure(hr, "Failed to set original source variable."); hr = StrAllocString(&sczOriginalSource, wzSourceProcessPath, 0); @@ -170,7 +170,7 @@ extern "C" HRESULT CacheInitialize( hr = PathGetDirectory(sczOriginalSource, &sczOriginalSourceFolder); ExitOnFailure(hr, "Failed to get directory from original source path."); - hr = VariableSetLiteralString(pVariables, BURN_BUNDLE_ORIGINAL_SOURCE_FOLDER, sczOriginalSourceFolder, FALSE); + hr = VariableSetString(pVariables, BURN_BUNDLE_ORIGINAL_SOURCE_FOLDER, sczOriginalSourceFolder, FALSE, FALSE); ExitOnFailure(hr, "Failed to set original source directory variable."); } } @@ -549,7 +549,7 @@ extern "C" HRESULT CacheSetLastUsedSource( if (CSTR_EQUAL != nCompare) { - hr = VariableSetLiteralString(pVariables, BURN_BUNDLE_LAST_USED_SOURCE, sczSourceFolder, FALSE); + hr = VariableSetString(pVariables, BURN_BUNDLE_LAST_USED_SOURCE, sczSourceFolder, FALSE, FALSE); ExitOnFailure(hr, "Failed to set last source."); } } diff --git a/src/engine/condition.cpp b/src/engine/condition.cpp index 28391d2d..cd346680 100644 --- a/src/engine/condition.cpp +++ b/src/engine/condition.cpp @@ -439,6 +439,13 @@ static HRESULT ParseValue( { ExitOnRootFailure(hr, "Failed to find variable."); } + + if (BURN_VARIANT_TYPE_FORMATTED == pValue->Type) + { + // TODO: actually format the value? + hr = BVariantChangeType(pValue, BURN_VARIANT_TYPE_STRING); + ExitOnRootFailure(hr, "Failed to change variable '%ls' type for condition '%ls'", pContext->NextSymbol.Value.sczValue, pContext->wzCondition); + } break; case BURN_SYMBOL_TYPE_NUMBER: __fallthrough; @@ -642,7 +649,7 @@ static HRESULT NextSymbol( ++n; // terminating '"' pContext->NextSymbol.Type = BURN_SYMBOL_TYPE_LITERAL; - hr = BVariantSetString(&pContext->NextSymbol.Value, &pContext->wzRead[1], n - 2); + hr = BVariantSetString(&pContext->NextSymbol.Value, &pContext->wzRead[1], n - 2, FALSE); ExitOnFailure(hr, "Failed to set symbol value."); break; default: @@ -746,7 +753,7 @@ static HRESULT NextSymbol( { // identifier pContext->NextSymbol.Type = BURN_SYMBOL_TYPE_IDENTIFIER; - hr = BVariantSetString(&pContext->NextSymbol.Value, pContext->wzRead, n); + hr = BVariantSetString(&pContext->NextSymbol.Value, pContext->wzRead, n, FALSE); ExitOnFailure(hr, "Failed to set symbol value."); } } diff --git a/src/engine/core.cpp b/src/engine/core.cpp index 26e74588..c34024fd 100644 --- a/src/engine/core.cpp +++ b/src/engine/core.cpp @@ -113,13 +113,13 @@ extern "C" HRESULT CoreInitialize( if (sczSourceProcessPath) { - hr = VariableSetLiteralString(&pEngineState->variables, BURN_BUNDLE_SOURCE_PROCESS_PATH, sczSourceProcessPath, TRUE); + hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_SOURCE_PROCESS_PATH, sczSourceProcessPath, TRUE, FALSE); ExitOnFailure(hr, "Failed to set source process path variable."); hr = PathGetDirectory(sczSourceProcessPath, &sczSourceProcessFolder); ExitOnFailure(hr, "Failed to get source process folder from path."); - hr = VariableSetLiteralString(&pEngineState->variables, BURN_BUNDLE_SOURCE_PROCESS_FOLDER, sczSourceProcessFolder, TRUE); + hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_SOURCE_PROCESS_FOLDER, sczSourceProcessFolder, TRUE, FALSE); ExitOnFailure(hr, "Failed to set source process folder variable."); } @@ -127,7 +127,7 @@ extern "C" HRESULT CoreInitialize( // Needs to be done after ManifestLoadXmlFromBuffer. if (sczOriginalSource) { - hr = VariableSetLiteralString(&pEngineState->variables, BURN_BUNDLE_ORIGINAL_SOURCE, sczOriginalSource, FALSE); + hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_ORIGINAL_SOURCE, sczOriginalSource, FALSE, FALSE); ExitOnFailure(hr, "Failed to set original source variable."); } @@ -258,7 +258,7 @@ extern "C" HRESULT CoreDetect( } else { - hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_INSTALLED, NULL, TRUE); + hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_INSTALLED, NULL, TRUE, FALSE); ExitOnFailure(hr, "Failed to unset the bundle installed built-in variable."); } diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 36c58b49..71c37138 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -538,7 +538,7 @@ static HRESULT RunNormal( // If a layout directory was specified on the command-line, set it as a well-known variable. if (pEngineState->command.wzLayoutDirectory && *pEngineState->command.wzLayoutDirectory) { - hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_LAYOUT_DIRECTORY, pEngineState->command.wzLayoutDirectory, FALSE); + hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_LAYOUT_DIRECTORY, pEngineState->command.wzLayoutDirectory, FALSE, FALSE); ExitOnFailure(hr, "Failed to set layout directory variable to value provided from command-line."); } diff --git a/src/engine/exeengine.cpp b/src/engine/exeengine.cpp index 71540d5d..8d6cd7fd 100644 --- a/src/engine/exeengine.cpp +++ b/src/engine/exeengine.cpp @@ -399,7 +399,7 @@ extern "C" HRESULT ExeEngineExecutePackage( ExitOnFailure(hr, "Failed to get cached path for package: %ls", pExecuteAction->exePackage.pPackage->sczId); // Best effort to set the execute package cache folder and action variables. - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, sczCachedDirectory, TRUE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, sczCachedDirectory, TRUE, FALSE); VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->exePackage.action, TRUE); hr = PathConcat(sczCachedDirectory, pExecuteAction->exePackage.pPackage->rgPayloads[0].pPayload->sczFilePath, &sczExecutablePath); @@ -591,8 +591,8 @@ LExit: ReleaseFileHandle(hExecutableFile); // Best effort to clear the execute package cache folder and action variables. - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, NULL, TRUE); - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, NULL, TRUE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, NULL, TRUE, FALSE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, NULL, TRUE, FALSE); return hr; } diff --git a/src/engine/logging.cpp b/src/engine/logging.cpp index 818532ad..55b65336 100644 --- a/src/engine/logging.cpp +++ b/src/engine/logging.cpp @@ -149,7 +149,7 @@ extern "C" HRESULT LoggingOpen( if (pLog->sczPathVariable && *pLog->sczPathVariable) { - VariableSetString(pVariables, pLog->sczPathVariable, pLog->sczPath, FALSE); // Ignore failure. + VariableSetString(pVariables, pLog->sczPathVariable, pLog->sczPath, FALSE, FALSE); // Ignore failure. } } @@ -220,7 +220,7 @@ extern "C" HRESULT LoggingSetPackageVariable( hr = StrAllocFormatted(&sczLogPath, L"%ls%hs%ls_%03u_%ls%ls.%ls", pLog->sczPrefix, wzSuffix && *wzSuffix ? "_" : "", wzSuffix && *wzSuffix ? wzSuffix : L"", vdwPackageSequence, pPackage->sczId, fRollback ? L"_rollback" : L"", pLog->sczExtension); ExitOnFailure(hr, "Failed to allocate path for package log."); - hr = VariableSetString(pVariables, fRollback ? pPackage->sczRollbackLogPathVariable : pPackage->sczLogPathVariable, sczLogPath, FALSE); + hr = VariableSetString(pVariables, fRollback ? pPackage->sczRollbackLogPathVariable : pPackage->sczLogPathVariable, sczLogPath, FALSE, FALSE); ExitOnFailure(hr, "Failed to set log path into variable."); if (psczLogPath) diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp index 8b8121c1..e7cffd62 100644 --- a/src/engine/msiengine.cpp +++ b/src/engine/msiengine.cpp @@ -1156,7 +1156,7 @@ extern "C" HRESULT MsiEngineExecutePackage( ExitOnFailure(hr, "Failed to get cached path for package: %ls", pExecuteAction->msiPackage.pPackage->sczId); // Best effort to set the execute package cache folder variable. - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, sczCachedDirectory, TRUE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, sczCachedDirectory, TRUE, FALSE); hr = PathConcat(sczCachedDirectory, pExecuteAction->msiPackage.pPackage->rgPayloads[0].pPayload->sczFilePath, &sczMsiPath); ExitOnFailure(hr, "Failed to build MSI path."); @@ -1313,8 +1313,8 @@ LExit: } // Best effort to clear the execute package cache folder and action variables. - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, NULL, TRUE); - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, NULL, TRUE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, NULL, TRUE, FALSE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, NULL, TRUE, FALSE); return hr; } diff --git a/src/engine/mspengine.cpp b/src/engine/mspengine.cpp index 57321d75..0854862b 100644 --- a/src/engine/mspengine.cpp +++ b/src/engine/mspengine.cpp @@ -488,7 +488,7 @@ extern "C" HRESULT MspEngineExecutePackage( // TODO: Figure out if this makes sense -- the variable is set to the last patch's path only // Best effort to set the execute package cache folder variable. - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, sczCachedDirectory, TRUE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, sczCachedDirectory, TRUE, FALSE); hr = PathConcat(sczCachedDirectory, pMspPackage->rgPayloads[0].pPayload->sczFilePath, &sczMspPath); ExitOnFailure(hr, "Failed to build MSP path."); @@ -609,8 +609,8 @@ LExit: } // Best effort to clear the execute package cache folder and action variables. - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, NULL, TRUE); - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, NULL, TRUE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, NULL, TRUE, FALSE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, NULL, TRUE, FALSE); return hr; } diff --git a/src/engine/msuengine.cpp b/src/engine/msuengine.cpp index 3818e932..0c81873e 100644 --- a/src/engine/msuengine.cpp +++ b/src/engine/msuengine.cpp @@ -310,7 +310,7 @@ extern "C" HRESULT MsuEngineExecutePackage( ExitOnFailure(hr, "Failed to get cached path for package: %ls", pExecuteAction->msuPackage.pPackage->sczId); // Best effort to set the execute package cache folder variable. - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, sczCachedDirectory, TRUE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, sczCachedDirectory, TRUE, FALSE); hr = PathConcat(sczCachedDirectory, pExecuteAction->msuPackage.pPackage->rgPayloads[0].pPayload->sczFilePath, &sczMsuPath); ExitOnFailure(hr, "Failed to build MSU path."); @@ -419,7 +419,7 @@ LExit: } // Best effort to clear the execute package cache folder variable. - VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, NULL, TRUE); + VariableSetString(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_CACHE_FOLDER, NULL, TRUE, FALSE); return hr; } diff --git a/src/engine/registration.cpp b/src/engine/registration.cpp index bbde92b3..eace62ce 100644 --- a/src/engine/registration.cpp +++ b/src/engine/registration.cpp @@ -426,14 +426,14 @@ extern "C" HRESULT RegistrationSetVariables( if (pRegistration->sczActiveParent && *pRegistration->sczActiveParent) { - hr = VariableSetString(pVariables, BURN_BUNDLE_ACTIVE_PARENT, pRegistration->sczActiveParent, TRUE); + hr = VariableSetString(pVariables, BURN_BUNDLE_ACTIVE_PARENT, pRegistration->sczActiveParent, TRUE, FALSE); ExitOnFailure(hr, "Failed to overwrite the bundle active parent built-in variable."); } - hr = VariableSetString(pVariables, BURN_BUNDLE_PROVIDER_KEY, pRegistration->sczProviderKey, TRUE); + hr = VariableSetString(pVariables, BURN_BUNDLE_PROVIDER_KEY, pRegistration->sczProviderKey, TRUE, FALSE); ExitOnFailure(hr, "Failed to overwrite the bundle provider key built-in variable."); - hr = VariableSetString(pVariables, BURN_BUNDLE_TAG, pRegistration->sczTag, TRUE); + hr = VariableSetString(pVariables, BURN_BUNDLE_TAG, pRegistration->sczTag, TRUE, FALSE); ExitOnFailure(hr, "Failed to overwrite the bundle tag built-in variable."); hr = VariableSetVersion(pVariables, BURN_BUNDLE_VERSION, pRegistration->qwVersion, TRUE); @@ -1129,7 +1129,7 @@ static HRESULT GetBundleManufacturer( hr = VariableGetString(pVariables, BURN_BUNDLE_MANUFACTURER, psczBundleManufacturer); if (E_NOTFOUND == hr) { - hr = VariableSetLiteralString(pVariables, BURN_BUNDLE_MANUFACTURER, pRegistration->sczPublisher, FALSE); + hr = VariableSetString(pVariables, BURN_BUNDLE_MANUFACTURER, pRegistration->sczPublisher, FALSE, FALSE); ExitOnFailure(hr, "Failed to set bundle manufacturer."); hr = StrAllocString(psczBundleManufacturer, pRegistration->sczPublisher, 0); @@ -1151,7 +1151,7 @@ static HRESULT GetBundleName( hr = VariableGetString(pVariables, BURN_BUNDLE_NAME, psczBundleName); if (E_NOTFOUND == hr) { - hr = VariableSetLiteralString(pVariables, BURN_BUNDLE_NAME, pRegistration->sczDisplayName, FALSE); + hr = VariableSetString(pVariables, BURN_BUNDLE_NAME, pRegistration->sczDisplayName, FALSE, FALSE); ExitOnFailure(hr, "Failed to set bundle name."); hr = StrAllocString(psczBundleName, pRegistration->sczDisplayName, 0); diff --git a/src/engine/search.cpp b/src/engine/search.cpp index 16f8e459..2978edd3 100644 --- a/src/engine/search.cpp +++ b/src/engine/search.cpp @@ -239,7 +239,11 @@ extern "C" HRESULT SearchesParseFromXml( hr = XmlGetAttributeEx(pixnNode, L"VariableType", &scz); ExitOnFailure(hr, "Failed to get @VariableType."); - if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"numeric", -1)) + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"formatted", -1)) + { + pSearch->RegistrySearch.VariableType = BURN_VARIANT_TYPE_FORMATTED; + } + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"numeric", -1)) { pSearch->RegistrySearch.VariableType = BURN_VARIANT_TYPE_NUMERIC; } @@ -403,14 +407,18 @@ extern "C" HRESULT SearchesParseFromXml( { ExitOnFailure(hr, "Failed to get @Value."); - hr = BVariantSetString(&pSearch->SetVariable.value, scz, 0); + hr = BVariantSetString(&pSearch->SetVariable.value, scz, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); // @Type hr = XmlGetAttributeEx(pixnNode, L"Type", &scz); ExitOnFailure(hr, "Failed to get @Type."); - if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"numeric", -1)) + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"formatted", -1)) + { + valueType = BURN_VARIANT_TYPE_FORMATTED; + } + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"numeric", -1)) { valueType = BURN_VARIANT_TYPE_NUMERIC; } @@ -673,7 +681,7 @@ static HRESULT DirectorySearchPath( } else if (dwAttributes & FILE_ATTRIBUTE_DIRECTORY) { - hr = VariableSetLiteralString(pVariables, pSearch->sczVariable, sczPath, FALSE); + hr = VariableSetString(pVariables, pSearch->sczVariable, sczPath, FALSE, FALSE); ExitOnFailure(hr, "Failed to set directory search path variable."); } else // must have found a file. @@ -793,7 +801,7 @@ static HRESULT FileSearchPath( } else // found our file. { - hr = VariableSetLiteralString(pVariables, pSearch->sczVariable, sczPath, FALSE); + hr = VariableSetString(pVariables, pSearch->sczVariable, sczPath, FALSE, FALSE); ExitOnFailure(hr, "Failed to set variable to file search path."); } @@ -933,7 +941,7 @@ static HRESULT RegistrySearchValue( { // What if there is a hidden variable in sczKey? LogStringLine(REPORT_STANDARD, "Registry key not found. Key = '%ls'", sczKey); - hr = VariableSetLiteralVariant(pVariables, pSearch->sczVariable, &value); + hr = VariableSetVariant(pVariables, pSearch->sczVariable, &value); ExitOnFailure(hr, "Failed to clear variable."); ExitFunction1(hr = S_OK); } @@ -945,7 +953,7 @@ static HRESULT RegistrySearchValue( { // What if there is a hidden variable in sczKey or sczValue? LogStringLine(REPORT_STANDARD, "Registry value not found. Key = '%ls', Value = '%ls'", sczKey, sczValue); - hr = VariableSetLiteralVariant(pVariables, pSearch->sczVariable, &value); + hr = VariableSetVariant(pVariables, pSearch->sczVariable, &value); ExitOnFailure(hr, "Failed to clear variable."); ExitFunction1(hr = S_OK); } @@ -995,7 +1003,7 @@ static HRESULT RegistrySearchValue( } __fallthrough; case REG_SZ: - hr = BVariantSetString(&value, (LPCWSTR)pData, 0); + hr = BVariantSetString(&value, (LPCWSTR)pData, 0, FALSE); break; default: ExitOnFailure(hr = E_NOTIMPL, "Unsupported registry key value type. Type = '%u'", dwType); @@ -1006,8 +1014,8 @@ static HRESULT RegistrySearchValue( hr = BVariantChangeType(&value, pSearch->RegistrySearch.VariableType); ExitOnFailure(hr, "Failed to change value type."); - // Set variable as a literal. - hr = VariableSetLiteralVariant(pVariables, pSearch->sczVariable, &value); + // Set variable. + hr = VariableSetVariant(pVariables, pSearch->sczVariable, &value); ExitOnFailure(hr, "Failed to set variable."); LExit: @@ -1077,7 +1085,7 @@ static HRESULT MsiComponentSearch( case BURN_MSI_COMPONENT_SEARCH_TYPE_KEYPATH: if (INSTALLSTATE_ABSENT == is || INSTALLSTATE_LOCAL == is || INSTALLSTATE_SOURCE == is) { - hr = VariableSetLiteralString(pVariables, pSearch->sczVariable, sczPath, FALSE); + hr = VariableSetString(pVariables, pSearch->sczVariable, sczPath, FALSE, FALSE); } break; case BURN_MSI_COMPONENT_SEARCH_TYPE_STATE: @@ -1093,7 +1101,7 @@ static HRESULT MsiComponentSearch( wz[1] = L'\0'; } - hr = VariableSetLiteralString(pVariables, pSearch->sczVariable, sczPath, FALSE); + hr = VariableSetString(pVariables, pSearch->sczVariable, sczPath, FALSE, FALSE); } break; } @@ -1234,8 +1242,8 @@ static HRESULT MsiProductSearch( hr = BVariantChangeType(&value, type); ExitOnFailure(hr, "Failed to change value type."); - // Set variable as a literal. - hr = VariableSetLiteralVariant(pVariables, pSearch->sczVariable, &value); + // Set variable. + hr = VariableSetVariant(pVariables, pSearch->sczVariable, &value); ExitOnFailure(hr, "Failed to set variable."); LExit: diff --git a/src/engine/variable.cpp b/src/engine/variable.cpp index 6322942e..fb4b74e2 100644 --- a/src/engine/variable.cpp +++ b/src/engine/variable.cpp @@ -83,7 +83,6 @@ static HRESULT SetVariableValue( __in BURN_VARIABLES* pVariables, __in_z LPCWSTR wzVariable, __in BURN_VARIANT* pVariant, - __in BOOL fLiteral, __in SET_VARIABLE setBuiltin, __in BOOL fLog ); @@ -335,14 +334,22 @@ extern "C" HRESULT VariablesParseFromXml( { ExitOnFailure(hr, "Failed to get @Value."); - hr = BVariantSetString(&value, scz, 0); + hr = BVariantSetString(&value, scz, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); // @Type hr = XmlGetAttributeEx(pixnNode, L"Type", &scz); ExitOnFailure(hr, "Failed to get @Type."); - if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"numeric", -1)) + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"formatted", -1)) + { + if (!fHidden) + { + LogStringLine(REPORT_STANDARD, "Initializing formatted variable '%ls' to value '%ls'", sczId, value.sczValue); + } + valueType = BURN_VARIANT_TYPE_FORMATTED; + } + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"numeric", -1)) { if (!fHidden) { @@ -637,10 +644,7 @@ extern "C" HRESULT VariableGetFormatted( } ExitOnFailure(hr, "Failed to get variable: %ls", wzVariable); - // Strings need to get expanded unless they're built-in or literal because they're guaranteed not to have embedded variables. - if (BURN_VARIANT_TYPE_STRING == pVariable->Value.Type && - BURN_VARIABLE_INTERNAL_TYPE_NORMAL == pVariable->internalType && - !pVariable->fLiteral) + if (BURN_VARIANT_TYPE_FORMATTED == pVariable->Value.Type) { hr = BVariantGetString(&pVariable->Value, &scz); ExitOnFailure(hr, "Failed to get unformatted string."); @@ -674,39 +678,24 @@ extern "C" HRESULT VariableSetNumeric( variant.llValue = llValue; variant.Type = BURN_VARIANT_TYPE_NUMERIC; - return SetVariableValue(pVariables, wzVariable, &variant, FALSE, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); -} - -extern "C" HRESULT VariableSetLiteralString( - __in BURN_VARIABLES* pVariables, - __in_z LPCWSTR wzVariable, - __in_z_opt LPCWSTR wzValue, - __in BOOL fOverwriteBuiltIn - ) -{ - BURN_VARIANT variant = { }; - - // We're not going to encrypt this value, so can access the value directly. - variant.sczValue = (LPWSTR)wzValue; - variant.Type = BURN_VARIANT_TYPE_STRING; - - return SetVariableValue(pVariables, wzVariable, &variant, TRUE, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); + return SetVariableValue(pVariables, wzVariable, &variant, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); } extern "C" HRESULT VariableSetString( __in BURN_VARIABLES* pVariables, __in_z LPCWSTR wzVariable, __in_z_opt LPCWSTR wzValue, - __in BOOL fOverwriteBuiltIn + __in BOOL fOverwriteBuiltIn, + __in BOOL fFormatted ) { BURN_VARIANT variant = { }; // We're not going to encrypt this value, so can access the value directly. variant.sczValue = (LPWSTR)wzValue; - variant.Type = BURN_VARIANT_TYPE_STRING; + variant.Type = fFormatted ? BURN_VARIANT_TYPE_FORMATTED : BURN_VARIANT_TYPE_STRING; - return SetVariableValue(pVariables, wzVariable, &variant, FALSE, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); + return SetVariableValue(pVariables, wzVariable, &variant, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); } extern "C" HRESULT VariableSetVersion( @@ -722,16 +711,7 @@ extern "C" HRESULT VariableSetVersion( variant.qwValue = qwValue; variant.Type = BURN_VARIANT_TYPE_VERSION; - return SetVariableValue(pVariables, wzVariable, &variant, FALSE, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); -} - -extern "C" HRESULT VariableSetLiteralVariant( - __in BURN_VARIABLES* pVariables, - __in_z LPCWSTR wzVariable, - __in BURN_VARIANT* pVariant - ) -{ - return SetVariableValue(pVariables, wzVariable, pVariant, TRUE, SET_VARIABLE_NOT_BUILTIN, TRUE); + return SetVariableValue(pVariables, wzVariable, &variant, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); } extern "C" HRESULT VariableSetVariant( @@ -740,7 +720,7 @@ extern "C" HRESULT VariableSetVariant( __in BURN_VARIANT * pVariant ) { - return SetVariableValue(pVariables, wzVariable, pVariant, FALSE, SET_VARIABLE_NOT_BUILTIN, TRUE); + return SetVariableValue(pVariables, wzVariable, pVariant, SET_VARIABLE_NOT_BUILTIN, TRUE); } // The contents of psczOut may be sensitive, should keep encrypted and SecureZeroFree @@ -888,6 +868,7 @@ extern "C" HRESULT VariableSerialize( SecureZeroMemory(&qw, sizeof(qw)); break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: hr = BVariantGetString(&pVariable->Value, &scz); ExitOnFailure(hr, "Failed to get string."); @@ -901,10 +882,6 @@ extern "C" HRESULT VariableSerialize( hr = E_INVALIDARG; ExitOnFailure(hr, "Unsupported variable type."); } - - // Write literal flag. - hr = BuffWriteNumber(ppbBuffer, piBuffer, (DWORD)pVariable->fLiteral); - ExitOnFailure(hr, "Failed to write literal flag."); } LExit: @@ -928,7 +905,6 @@ extern "C" HRESULT VariableDeserialize( DWORD cVariables = 0; LPWSTR sczName = NULL; BOOL fIncluded = FALSE; - BOOL fLiteral = FALSE; BURN_VARIANT value = { }; LPWSTR scz = NULL; DWORD64 qw = 0; @@ -982,11 +958,12 @@ extern "C" HRESULT VariableDeserialize( SecureZeroMemory(&qw, sizeof(qw)); break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: hr = BuffReadString(pbBuffer, cbBuffer, piBuffer, &scz); ExitOnFailure(hr, "Failed to read variable value as string."); - hr = BVariantSetString(&value, scz, NULL); + hr = BVariantSetString(&value, scz, NULL, BURN_VARIANT_TYPE_FORMATTED == value.Type); ExitOnFailure(hr, "Failed to set variable value."); ReleaseNullStrSecure(scz); @@ -996,12 +973,8 @@ extern "C" HRESULT VariableDeserialize( ExitOnFailure(hr, "Unsupported variable type."); } - // Read variable literal flag. - hr = BuffReadNumber(pbBuffer, cbBuffer, piBuffer, (DWORD*)&fLiteral); - ExitOnFailure(hr, "Failed to read variable literal flag."); - // Set variable. - hr = SetVariableValue(pVariables, sczName, &value, fLiteral, fWasPersisted ? SET_VARIABLE_OVERRIDE_PERSISTED_BUILTINS : SET_VARIABLE_ANY, FALSE); + hr = SetVariableValue(pVariables, sczName, &value, fWasPersisted ? SET_VARIABLE_OVERRIDE_PERSISTED_BUILTINS : SET_VARIABLE_ANY, FALSE); ExitOnFailure(hr, "Failed to set variable."); // Clean up. @@ -1525,7 +1498,6 @@ static HRESULT SetVariableValue( __in BURN_VARIABLES* pVariables, __in_z LPCWSTR wzVariable, __in BURN_VARIANT* pVariant, - __in BOOL fLiteral, __in SET_VARIABLE setBuiltin, __in BOOL fLog ) @@ -1587,6 +1559,7 @@ static HRESULT SetVariableValue( LogStringLine(REPORT_STANDARD, "Setting numeric variable '%ls' to value %lld", wzVariable, pVariant->llValue); break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: if (!pVariant->sczValue) { @@ -1594,7 +1567,7 @@ static HRESULT SetVariableValue( } else { - LogStringLine(REPORT_STANDARD, "Setting string variable '%ls' to value '%ls'", wzVariable, pVariant->sczValue); + LogStringLine(REPORT_STANDARD, "Setting %ls variable '%ls' to value '%ls'", BURN_VARIANT_TYPE_FORMATTED == pVariant->Type ? L"formatted" : L"string", wzVariable, pVariant->sczValue); } break; @@ -1613,9 +1586,6 @@ static HRESULT SetVariableValue( hr = BVariantSetValue(&pVariables->rgVariables[iVariable].Value, pVariant); ExitOnFailure(hr, "Failed to set value of variable: %ls", wzVariable); - // Update variable literal flag. - pVariables->rgVariables[iVariable].fLiteral = fLiteral; - LExit: ::LeaveCriticalSection(&pVariables->csAccess); @@ -1827,7 +1797,7 @@ static HRESULT InitializeVariableComputerName( } // set value - hr = BVariantSetString(pValue, wzComputerName, 0); + hr = BVariantSetString(pValue, wzComputerName, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -1875,7 +1845,7 @@ static HRESULT InitializeVariableCsidlFolder( ExitOnRootFailure(hr, "Failed to get shell folder."); // set value - hr = BVariantSetString(pValue, sczPath, 0); + hr = BVariantSetString(pValue, sczPath, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -1901,7 +1871,7 @@ static HRESULT InitializeVariableTempFolder( } // set value - hr = BVariantSetString(pValue, wzPath, 0); + hr = BVariantSetString(pValue, wzPath, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -1972,7 +1942,7 @@ static HRESULT InitializeVariableSystemFolder( } // set value - hr = BVariantSetString(pValue, wzSystemFolder, 0); + hr = BVariantSetString(pValue, wzSystemFolder, 0, FALSE); ExitOnFailure(hr, "Failed to set system folder variant value."); LExit: @@ -2003,7 +1973,7 @@ static HRESULT InitializeVariableWindowsVolumeFolder( } // set value - hr = BVariantSetString(pValue, wzVolumePath, 0); + hr = BVariantSetString(pValue, wzVolumePath, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -2130,7 +2100,7 @@ static HRESULT InitializeVariableString( LPCWSTR wzValue = (LPCWSTR)dwpData; // set value - hr = BVariantSetString(pValue, wzValue, 0); + hr = BVariantSetString(pValue, wzValue, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -2176,7 +2146,7 @@ static HRESULT InitializeVariableRegistryFolder( ExitOnFailure(hr, "Failed to get 64-bit folder."); // set value - hr = BVariantSetString(pValue, sczPath, 0); + hr = BVariantSetString(pValue, sczPath, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -2212,7 +2182,7 @@ static HRESULT InitializeVariable6432Folder( } // set value - hr = BVariantSetString(pValue, sczPath, 0); + hr = BVariantSetString(pValue, sczPath, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -2249,7 +2219,7 @@ static HRESULT InitializeVariableDate( } // set value - hr = BVariantSetString(pValue, sczDate, cchDate); + hr = BVariantSetString(pValue, sczDate, cchDate, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -2266,7 +2236,7 @@ static HRESULT InitializeVariableInstallerName( HRESULT hr = S_OK; // set value - hr = BVariantSetString(pValue, L"WiX Burn", 0); + hr = BVariantSetString(pValue, L"WiX Burn", 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -2285,7 +2255,7 @@ static HRESULT InitializeVariableInstallerVersion( ExitOnFailure(hr, "Failed to copy the engine version."); // set value - hr = BVariantSetString(pValue, sczVersion, 0); + hr = BVariantSetString(pValue, sczVersion, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: @@ -2325,7 +2295,7 @@ static HRESULT InitializeVariableLogonUser( } // set value - hr = BVariantSetString(pValue, wzUserName, 0); + hr = BVariantSetString(pValue, wzUserName, 0, FALSE); ExitOnFailure(hr, "Failed to set variant value."); LExit: diff --git a/src/engine/variable.h b/src/engine/variable.h index 63f12cdf..648c5daf 100644 --- a/src/engine/variable.h +++ b/src/engine/variable.h @@ -39,8 +39,7 @@ typedef struct _BURN_VARIABLE { LPWSTR sczName; BURN_VARIANT Value; - BOOL fHidden; - BOOL fLiteral; // if fLiteral, then when formatting this variable its value should be used as is (don't continue recursively formatting). + BOOL fHidden; BOOL fPersisted; // used for late initialization of built-in variables @@ -104,17 +103,12 @@ HRESULT VariableSetNumeric( __in LONGLONG llValue, __in BOOL fOverwriteBuiltIn ); -HRESULT VariableSetLiteralString( - __in BURN_VARIABLES* pVariables, - __in_z LPCWSTR wzVariable, - __in_z_opt LPCWSTR wzValue, - __in BOOL fOverwriteBuiltIn - ); HRESULT VariableSetString( __in BURN_VARIABLES* pVariables, __in_z LPCWSTR wzVariable, __in_z_opt LPCWSTR wzValue, - __in BOOL fOverwriteBuiltIn + __in BOOL fOverwriteBuiltIn, + __in BOOL fFormatted ); HRESULT VariableSetVersion( __in BURN_VARIABLES* pVariables, @@ -122,11 +116,6 @@ HRESULT VariableSetVersion( __in DWORD64 qwValue, __in BOOL fOverwriteBuiltIn ); -HRESULT VariableSetLiteralVariant( - __in BURN_VARIABLES* pVariables, - __in_z LPCWSTR wzVariable, - __in BURN_VARIANT* pVariant - ); HRESULT VariableSetVariant( __in BURN_VARIABLES* pVariables, __in_z LPCWSTR wzVariable, diff --git a/src/engine/variant.cpp b/src/engine/variant.cpp index 5e9bd29a..43bc19c4 100644 --- a/src/engine/variant.cpp +++ b/src/engine/variant.cpp @@ -32,7 +32,8 @@ extern "C" void BVariantUninitialize( __in BURN_VARIANT* pVariant ) { - if (BURN_VARIANT_TYPE_STRING == pVariant->Type) + if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type || + BURN_VARIANT_TYPE_STRING == pVariant->Type) { StrSecureZeroFreeString(pVariant->sczValue); } @@ -53,6 +54,7 @@ extern "C" HRESULT BVariantGetNumeric( case BURN_VARIANT_TYPE_NUMERIC: BVariantRetrieveNumeric(pVariant, pllValue); break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); if (SUCCEEDED(hr)) @@ -97,6 +99,7 @@ extern "C" HRESULT BVariantGetString( } SecureZeroMemory(&llValue, sizeof(llValue)); break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: hr = BVariantRetrieveDecryptedString(pVariant, psczValue); break; @@ -136,6 +139,7 @@ extern "C" HRESULT BVariantGetVersion( case BURN_VARIANT_TYPE_NUMERIC: BVariantRetrieveNumeric(pVariant, (LONGLONG*)pqwValue); break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); if (SUCCEEDED(hr)) @@ -167,7 +171,8 @@ extern "C" HRESULT BVariantSetNumeric( HRESULT hr = S_OK; BOOL fEncrypt = pVariant->fEncryptString; - if (BURN_VARIANT_TYPE_STRING == pVariant->Type) + if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type || + BURN_VARIANT_TYPE_STRING == pVariant->Type) { StrSecureZeroFreeString(pVariant->sczValue); } @@ -182,7 +187,8 @@ extern "C" HRESULT BVariantSetNumeric( extern "C" HRESULT BVariantSetString( __in BURN_VARIANT* pVariant, __in_z_opt LPCWSTR wzValue, - __in DWORD_PTR cchValue + __in DWORD_PTR cchValue, + __in BOOL fFormatted ) { HRESULT hr = S_OK; @@ -194,7 +200,8 @@ extern "C" HRESULT BVariantSetString( } else // assign the value. { - if (BURN_VARIANT_TYPE_STRING != pVariant->Type) + if (BURN_VARIANT_TYPE_FORMATTED != pVariant->Type && + BURN_VARIANT_TYPE_STRING != pVariant->Type) { memset(pVariant, 0, sizeof(BURN_VARIANT)); } @@ -207,7 +214,7 @@ extern "C" HRESULT BVariantSetString( hr = StrAllocStringSecure(&pVariant->sczValue, wzValue, cchValue); ExitOnFailure(hr, "Failed to copy string."); - pVariant->Type = BURN_VARIANT_TYPE_STRING; + pVariant->Type = fFormatted ? BURN_VARIANT_TYPE_FORMATTED : BURN_VARIANT_TYPE_STRING; } LExit: @@ -223,7 +230,8 @@ extern "C" HRESULT BVariantSetVersion( HRESULT hr = S_OK; BOOL fEncryptValue = pVariant->fEncryptString; - if (BURN_VARIANT_TYPE_STRING == pVariant->Type) + if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type || + BURN_VARIANT_TYPE_STRING == pVariant->Type) { StrSecureZeroFreeString(pVariant->sczValue); } @@ -259,11 +267,12 @@ extern "C" HRESULT BVariantSetValue( } SecureZeroMemory(&llValue, sizeof(llValue)); break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: hr = BVariantGetString(pValue, &sczValue); if (SUCCEEDED(hr)) { - hr = BVariantSetString(pVariant, sczValue, 0); + hr = BVariantSetString(pVariant, sczValue, 0, BURN_VARIANT_TYPE_FORMATTED == pValue->Type); } StrSecureZeroFreeString(sczValue); break; @@ -310,11 +319,12 @@ extern "C" HRESULT BVariantCopy( } SecureZeroMemory(&llValue, sizeof(llValue)); break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: hr = BVariantGetString(pSource, &sczValue); if (SUCCEEDED(hr)) { - hr = BVariantSetString(pTarget, sczValue, 0); + hr = BVariantSetString(pTarget, sczValue, 0, BURN_VARIANT_TYPE_FORMATTED == pSource->Type); } StrSecureZeroFreeString(sczValue); break; @@ -350,6 +360,12 @@ extern "C" HRESULT BVariantChangeType( { ExitFunction(); // variant already is of the requested type } + else if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type && BURN_VARIANT_TYPE_STRING == type || + BURN_VARIANT_TYPE_STRING == pVariant->Type && BURN_VARIANT_TYPE_FORMATTED == type) + { + pVariant->Type = type; + ExitFunction(); + } switch (type) { @@ -359,6 +375,7 @@ extern "C" HRESULT BVariantChangeType( case BURN_VARIANT_TYPE_NUMERIC: hr = BVariantGetNumeric(pVariant, &variant.llValue); break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: hr = BVariantGetString(pVariant, &variant.sczValue); break; @@ -400,6 +417,7 @@ extern "C" HRESULT BVariantSetEncryption( case BURN_VARIANT_TYPE_VERSION: hr = S_OK; break; + case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; case BURN_VARIANT_TYPE_STRING: hr = BVariantEncryptString(pVariant, fEncrypt); break; diff --git a/src/engine/variant.h b/src/engine/variant.h index 73fbe076..35463479 100644 --- a/src/engine/variant.h +++ b/src/engine/variant.h @@ -12,8 +12,9 @@ extern "C" { enum BURN_VARIANT_TYPE { BURN_VARIANT_TYPE_NONE, + BURN_VARIANT_TYPE_FORMATTED, BURN_VARIANT_TYPE_NUMERIC, - BURN_VARIANT_TYPE_STRING, + BURN_VARIANT_TYPE_STRING, // when formatting this value should be used as is (don't continue recursively formatting). BURN_VARIANT_TYPE_VERSION, }; @@ -57,7 +58,8 @@ HRESULT BVariantSetNumeric( HRESULT BVariantSetString( __in BURN_VARIANT* pVariant, __in_z_opt LPCWSTR wzValue, - __in DWORD_PTR cchValue + __in DWORD_PTR cchValue, + __in BOOL fFormatted ); HRESULT BVariantSetVersion( __in BURN_VARIANT* pVariant, -- cgit v1.2.3-55-g6feb