aboutsummaryrefslogtreecommitdiff
path: root/src/engine/variable.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/engine/variable.cpp75
1 files changed, 45 insertions, 30 deletions
diff --git a/src/engine/variable.cpp b/src/engine/variable.cpp
index fb4b74e2..3069ccf7 100644
--- a/src/engine/variable.cpp
+++ b/src/engine/variable.cpp
@@ -268,7 +268,7 @@ extern "C" HRESULT VariableInitialize(
268 {BURN_BUNDLE_SOURCE_PROCESS_FOLDER, InitializeVariableString, NULL, FALSE, TRUE}, 268 {BURN_BUNDLE_SOURCE_PROCESS_FOLDER, InitializeVariableString, NULL, FALSE, TRUE},
269 {BURN_BUNDLE_TAG, InitializeVariableString, (DWORD_PTR)L"", FALSE, TRUE}, 269 {BURN_BUNDLE_TAG, InitializeVariableString, (DWORD_PTR)L"", FALSE, TRUE},
270 {BURN_BUNDLE_UILEVEL, InitializeVariableNumeric, 0, FALSE, TRUE}, 270 {BURN_BUNDLE_UILEVEL, InitializeVariableNumeric, 0, FALSE, TRUE},
271 {BURN_BUNDLE_VERSION, InitializeVariableVersion, 0, FALSE, TRUE}, 271 {BURN_BUNDLE_VERSION, InitializeVariableVersion, (DWORD_PTR)L"0", FALSE, TRUE},
272 }; 272 };
273 273
274 for (DWORD i = 0; i < countof(vrgBuiltInVariables); ++i) 274 for (DWORD i = 0; i < countof(vrgBuiltInVariables); ++i)
@@ -561,11 +561,11 @@ LExit:
561 return hr; 561 return hr;
562} 562}
563 563
564// The contents of pqwValue may be sensitive, if variable is hidden should keep value encrypted and SecureZeroMemory. 564// The contents of ppValue may be sensitive, if variable is hidden should keep value encrypted and SecureZeroMemory.
565extern "C" HRESULT VariableGetVersion( 565extern "C" HRESULT VariableGetVersion(
566 __in BURN_VARIABLES* pVariables, 566 __in BURN_VARIABLES* pVariables,
567 __in_z LPCWSTR wzVariable, 567 __in_z LPCWSTR wzVariable,
568 __in DWORD64* pqwValue 568 __in VERUTIL_VERSION** ppValue
569 ) 569 )
570{ 570{
571 HRESULT hr = S_OK; 571 HRESULT hr = S_OK;
@@ -584,7 +584,7 @@ extern "C" HRESULT VariableGetVersion(
584 } 584 }
585 ExitOnFailure(hr, "Failed to get value of variable: %ls", wzVariable); 585 ExitOnFailure(hr, "Failed to get value of variable: %ls", wzVariable);
586 586
587 hr = BVariantGetVersion(&pVariable->Value, pqwValue); 587 hr = BVariantGetVersion(&pVariable->Value, ppValue);
588 ExitOnFailure(hr, "Failed to get value as version for variable: %ls", wzVariable); 588 ExitOnFailure(hr, "Failed to get value as version for variable: %ls", wzVariable);
589 589
590LExit: 590LExit:
@@ -701,14 +701,14 @@ extern "C" HRESULT VariableSetString(
701extern "C" HRESULT VariableSetVersion( 701extern "C" HRESULT VariableSetVersion(
702 __in BURN_VARIABLES* pVariables, 702 __in BURN_VARIABLES* pVariables,
703 __in_z LPCWSTR wzVariable, 703 __in_z LPCWSTR wzVariable,
704 __in DWORD64 qwValue, 704 __in VERUTIL_VERSION* pValue,
705 __in BOOL fOverwriteBuiltIn 705 __in BOOL fOverwriteBuiltIn
706 ) 706 )
707{ 707{
708 BURN_VARIANT variant = { }; 708 BURN_VARIANT variant = { };
709 709
710 // We're not going to encrypt this value, so can access the value directly. 710 // We're not going to encrypt this value, so can access the value directly.
711 variant.qwValue = qwValue; 711 variant.pValue = pValue;
712 variant.Type = BURN_VARIANT_TYPE_VERSION; 712 variant.Type = BURN_VARIANT_TYPE_VERSION;
713 713
714 return SetVariableValue(pVariables, wzVariable, &variant, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); 714 return SetVariableValue(pVariables, wzVariable, &variant, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE);
@@ -810,7 +810,6 @@ extern "C" HRESULT VariableSerialize(
810 BOOL fIncluded = FALSE; 810 BOOL fIncluded = FALSE;
811 LONGLONG ll = 0; 811 LONGLONG ll = 0;
812 LPWSTR scz = NULL; 812 LPWSTR scz = NULL;
813 DWORD64 qw = 0;
814 813
815 ::EnterCriticalSection(&pVariables->csAccess); 814 ::EnterCriticalSection(&pVariables->csAccess);
816 815
@@ -859,15 +858,7 @@ extern "C" HRESULT VariableSerialize(
859 858
860 SecureZeroMemory(&ll, sizeof(ll)); 859 SecureZeroMemory(&ll, sizeof(ll));
861 break; 860 break;
862 case BURN_VARIANT_TYPE_VERSION: 861 case BURN_VARIANT_TYPE_VERSION: __fallthrough;
863 hr = BVariantGetVersion(&pVariable->Value, &qw);
864 ExitOnFailure(hr, "Failed to get version.");
865
866 hr = BuffWriteNumber64(ppbBuffer, piBuffer, qw);
867 ExitOnFailure(hr, "Failed to write variable value as number.");
868
869 SecureZeroMemory(&qw, sizeof(qw));
870 break;
871 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; 862 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
872 case BURN_VARIANT_TYPE_STRING: 863 case BURN_VARIANT_TYPE_STRING:
873 hr = BVariantGetString(&pVariable->Value, &scz); 864 hr = BVariantGetString(&pVariable->Value, &scz);
@@ -887,7 +878,6 @@ extern "C" HRESULT VariableSerialize(
887LExit: 878LExit:
888 ::LeaveCriticalSection(&pVariables->csAccess); 879 ::LeaveCriticalSection(&pVariables->csAccess);
889 SecureZeroMemory(&ll, sizeof(ll)); 880 SecureZeroMemory(&ll, sizeof(ll));
890 SecureZeroMemory(&qw, sizeof(qw));
891 StrSecureZeroFreeString(scz); 881 StrSecureZeroFreeString(scz);
892 882
893 return hr; 883 return hr;
@@ -908,6 +898,7 @@ extern "C" HRESULT VariableDeserialize(
908 BURN_VARIANT value = { }; 898 BURN_VARIANT value = { };
909 LPWSTR scz = NULL; 899 LPWSTR scz = NULL;
910 DWORD64 qw = 0; 900 DWORD64 qw = 0;
901 VERUTIL_VERSION* pVersion = NULL;
911 902
912 ::EnterCriticalSection(&pVariables->csAccess); 903 ::EnterCriticalSection(&pVariables->csAccess);
913 904
@@ -950,10 +941,13 @@ extern "C" HRESULT VariableDeserialize(
950 SecureZeroMemory(&qw, sizeof(qw)); 941 SecureZeroMemory(&qw, sizeof(qw));
951 break; 942 break;
952 case BURN_VARIANT_TYPE_VERSION: 943 case BURN_VARIANT_TYPE_VERSION:
953 hr = BuffReadNumber64(pbBuffer, cbBuffer, piBuffer, &qw); 944 hr = BuffReadString(pbBuffer, cbBuffer, piBuffer, &scz);
954 ExitOnFailure(hr, "Failed to read variable value as number."); 945 ExitOnFailure(hr, "Failed to read variable value as string.");
946
947 hr = VerParseVersion(scz, 0, FALSE, &pVersion);
948 ExitOnFailure(hr, "Failed to parse variable value as version.");
955 949
956 hr = BVariantSetVersion(&value, qw); 950 hr = BVariantSetVersion(&value, pVersion);
957 ExitOnFailure(hr, "Failed to set variable value."); 951 ExitOnFailure(hr, "Failed to set variable value.");
958 952
959 SecureZeroMemory(&qw, sizeof(qw)); 953 SecureZeroMemory(&qw, sizeof(qw));
@@ -984,6 +978,7 @@ extern "C" HRESULT VariableDeserialize(
984LExit: 978LExit:
985 ::LeaveCriticalSection(&pVariables->csAccess); 979 ::LeaveCriticalSection(&pVariables->csAccess);
986 980
981 ReleaseVerutilVersion(pVersion);
987 ReleaseStr(sczName); 982 ReleaseStr(sczName);
988 BVariantUninitialize(&value); 983 BVariantUninitialize(&value);
989 SecureZeroMemory(&qw, sizeof(qw)); 984 SecureZeroMemory(&qw, sizeof(qw));
@@ -1572,7 +1567,7 @@ static HRESULT SetVariableValue(
1572 break; 1567 break;
1573 1568
1574 case BURN_VARIANT_TYPE_VERSION: 1569 case BURN_VARIANT_TYPE_VERSION:
1575 LogStringLine(REPORT_STANDARD, "Setting version variable '%ls' to value '%hu.%hu.%hu.%hu'", wzVariable, (WORD)(pVariant->qwValue >> 48), (WORD)(pVariant->qwValue >> 32), (WORD)(pVariant->qwValue >> 16), (WORD)(pVariant->qwValue)); 1570 LogStringLine(REPORT_STANDARD, "Setting version variable '%ls' to value '%ls'", wzVariable, pVariant->pValue->sczVersion);
1576 break; 1571 break;
1577 1572
1578 default: 1573 default:
@@ -1609,6 +1604,7 @@ static HRESULT InitializeVariableVersionNT(
1609 RTL_GET_VERSION rtlGetVersion = NULL; 1604 RTL_GET_VERSION rtlGetVersion = NULL;
1610 RTL_OSVERSIONINFOEXW ovix = { }; 1605 RTL_OSVERSIONINFOEXW ovix = { };
1611 BURN_VARIANT value = { }; 1606 BURN_VARIANT value = { };
1607 VERUTIL_VERSION* pVersion = NULL;
1612 1608
1613 if (!::GetModuleHandleExW(0, L"ntdll", &ntdll)) 1609 if (!::GetModuleHandleExW(0, L"ntdll", &ntdll))
1614 { 1610 {
@@ -1630,12 +1626,15 @@ static HRESULT InitializeVariableVersionNT(
1630 case OS_INFO_VARIABLE_ServicePackLevel: 1626 case OS_INFO_VARIABLE_ServicePackLevel:
1631 if (0 != ovix.wServicePackMajor) 1627 if (0 != ovix.wServicePackMajor)
1632 { 1628 {
1633 value.qwValue = static_cast<DWORD64>(ovix.wServicePackMajor); 1629 value.llValue = static_cast<LONGLONG>(ovix.wServicePackMajor);
1634 value.Type = BURN_VARIANT_TYPE_NUMERIC; 1630 value.Type = BURN_VARIANT_TYPE_NUMERIC;
1635 } 1631 }
1636 break; 1632 break;
1637 case OS_INFO_VARIABLE_VersionNT: 1633 case OS_INFO_VARIABLE_VersionNT:
1638 value.qwValue = MAKEQWORDVERSION(ovix.dwMajorVersion, ovix.dwMinorVersion, 0, 0); 1634 hr = VerVersionFromQword(MAKEQWORDVERSION(ovix.dwMajorVersion, ovix.dwMinorVersion, 0, 0), &pVersion);
1635 ExitOnFailure(hr, "Failed to create VersionNT from QWORD.");
1636
1637 value.pValue = pVersion;
1639 value.Type = BURN_VARIANT_TYPE_VERSION; 1638 value.Type = BURN_VARIANT_TYPE_VERSION;
1640 break; 1639 break;
1641 case OS_INFO_VARIABLE_VersionNT64: 1640 case OS_INFO_VARIABLE_VersionNT64:
@@ -1647,13 +1646,16 @@ static HRESULT InitializeVariableVersionNT(
1647 if (fIsWow64) 1646 if (fIsWow64)
1648#endif 1647#endif
1649 { 1648 {
1650 value.qwValue = MAKEQWORDVERSION(ovix.dwMajorVersion, ovix.dwMinorVersion, 0, 0); 1649 hr = VerVersionFromQword(MAKEQWORDVERSION(ovix.dwMajorVersion, ovix.dwMinorVersion, 0, 0), &pVersion);
1650 ExitOnFailure(hr, "Failed to create VersionNT64 from QWORD.");
1651
1652 value.pValue = pVersion;
1651 value.Type = BURN_VARIANT_TYPE_VERSION; 1653 value.Type = BURN_VARIANT_TYPE_VERSION;
1652 } 1654 }
1653 } 1655 }
1654 break; 1656 break;
1655 case OS_INFO_VARIABLE_WindowsBuildNumber: 1657 case OS_INFO_VARIABLE_WindowsBuildNumber:
1656 value.qwValue = static_cast<DWORD64>(ovix.dwBuildNumber); 1658 value.llValue = static_cast<LONGLONG>(ovix.dwBuildNumber);
1657 value.Type = BURN_VARIANT_TYPE_NUMERIC; 1659 value.Type = BURN_VARIANT_TYPE_NUMERIC;
1658 default: 1660 default:
1659 AssertSz(FALSE, "Unknown OS info type."); 1661 AssertSz(FALSE, "Unknown OS info type.");
@@ -1669,6 +1671,8 @@ LExit:
1669 FreeLibrary(ntdll); 1671 FreeLibrary(ntdll);
1670 } 1672 }
1671 1673
1674 ReleaseVerutilVersion(pVersion);
1675
1672 return hr; 1676 return hr;
1673} 1677}
1674 1678
@@ -1805,15 +1809,14 @@ LExit:
1805} 1809}
1806 1810
1807static HRESULT InitializeVariableVersionMsi( 1811static HRESULT InitializeVariableVersionMsi(
1808 __in DWORD_PTR dwpData, 1812 __in DWORD_PTR /*dwpData*/,
1809 __inout BURN_VARIANT* pValue 1813 __inout BURN_VARIANT* pValue
1810 ) 1814 )
1811{ 1815{
1812 UNREFERENCED_PARAMETER(dwpData);
1813
1814 HRESULT hr = S_OK; 1816 HRESULT hr = S_OK;
1815 DLLGETVERSIONPROC pfnMsiDllGetVersion = NULL; 1817 DLLGETVERSIONPROC pfnMsiDllGetVersion = NULL;
1816 DLLVERSIONINFO msiVersionInfo = { }; 1818 DLLVERSIONINFO msiVersionInfo = { };
1819 VERUTIL_VERSION* pVersion = NULL;
1817 1820
1818 // get DllGetVersion proc address 1821 // get DllGetVersion proc address
1819 pfnMsiDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(::GetModuleHandleW(L"msi"), "DllGetVersion"); 1822 pfnMsiDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(::GetModuleHandleW(L"msi"), "DllGetVersion");
@@ -1824,10 +1827,15 @@ static HRESULT InitializeVariableVersionMsi(
1824 hr = pfnMsiDllGetVersion(&msiVersionInfo); 1827 hr = pfnMsiDllGetVersion(&msiVersionInfo);
1825 ExitOnFailure(hr, "Failed to get msi.dll version info."); 1828 ExitOnFailure(hr, "Failed to get msi.dll version info.");
1826 1829
1827 hr = BVariantSetVersion(pValue, MAKEQWORDVERSION(msiVersionInfo.dwMajorVersion, msiVersionInfo.dwMinorVersion, 0, 0)); 1830 hr = VerVersionFromQword(MAKEQWORDVERSION(msiVersionInfo.dwMajorVersion, msiVersionInfo.dwMinorVersion, 0, 0), &pVersion);
1831 ExitOnFailure(hr, "Failed to create msi.dll version from QWORD.");
1832
1833 hr = BVariantSetVersion(pValue, pVersion);
1828 ExitOnFailure(hr, "Failed to set variant value."); 1834 ExitOnFailure(hr, "Failed to set variant value.");
1829 1835
1830LExit: 1836LExit:
1837 ReleaseVerutilVersion(pVersion);
1838
1831 return hr; 1839 return hr;
1832} 1840}
1833 1841
@@ -2270,12 +2278,19 @@ static HRESULT InitializeVariableVersion(
2270 ) 2278 )
2271{ 2279{
2272 HRESULT hr = S_OK; 2280 HRESULT hr = S_OK;
2281 LPCWSTR wzValue = (LPCWSTR)dwpData;
2282 VERUTIL_VERSION* pVersion = NULL;
2283
2284 hr = VerParseVersion(wzValue, 0, FALSE, &pVersion);
2285 ExitOnFailure(hr, "Failed to initialize version.");
2273 2286
2274 // set value 2287 // set value
2275 hr = BVariantSetVersion(pValue, static_cast<DWORD64>(dwpData)); 2288 hr = BVariantSetVersion(pValue, pVersion);
2276 ExitOnFailure(hr, "Failed to set variant value."); 2289 ExitOnFailure(hr, "Failed to set variant value.");
2277 2290
2278LExit: 2291LExit:
2292 ReleaseVerutilVersion(pVersion);
2293
2279 return hr; 2294 return hr;
2280} 2295}
2281 2296