aboutsummaryrefslogtreecommitdiff
path: root/src/engine/variant.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-10-17 19:12:21 -0500
committerSean Hall <r.sean.hall@gmail.com>2020-10-24 20:07:21 -0500
commit273c69f34311f4f4e5f6b5896e71d0788f12d96a (patch)
tree4cf8f42f3ecfa9341a41686b74aa5e48068ede87 /src/engine/variant.cpp
parent3f8e35223216ebbe7f6683a5031a5a97bbc66d5a (diff)
downloadwix-273c69f34311f4f4e5f6b5896e71d0788f12d96a.tar.gz
wix-273c69f34311f4f4e5f6b5896e71d0788f12d96a.tar.bz2
wix-273c69f34311f4f4e5f6b5896e71d0788f12d96a.zip
WIXFEAT:6210 Change data type of versions to strings.
Diffstat (limited to 'src/engine/variant.cpp')
-rw-r--r--src/engine/variant.cpp71
1 files changed, 37 insertions, 34 deletions
diff --git a/src/engine/variant.cpp b/src/engine/variant.cpp
index 43bc19c4..28578691 100644
--- a/src/engine/variant.cpp
+++ b/src/engine/variant.cpp
@@ -23,7 +23,7 @@ static HRESULT BVariantRetrieveDecryptedString(
23 23
24static void BVariantRetrieveVersion( 24static void BVariantRetrieveVersion(
25 __in BURN_VARIANT* pVariant, 25 __in BURN_VARIANT* pVariant,
26 __out DWORD64* pqwValue 26 __out VERUTIL_VERSION** ppValue
27 ); 27 );
28 28
29// function definitions 29// function definitions
@@ -48,6 +48,7 @@ extern "C" HRESULT BVariantGetNumeric(
48{ 48{
49 HRESULT hr = S_OK; 49 HRESULT hr = S_OK;
50 LPWSTR sczValue = NULL; 50 LPWSTR sczValue = NULL;
51 VERUTIL_VERSION* pVersionValue = NULL;
51 52
52 switch (pVariant->Type) 53 switch (pVariant->Type)
53 { 54 {
@@ -68,7 +69,13 @@ extern "C" HRESULT BVariantGetNumeric(
68 StrSecureZeroFreeString(sczValue); 69 StrSecureZeroFreeString(sczValue);
69 break; 70 break;
70 case BURN_VARIANT_TYPE_VERSION: 71 case BURN_VARIANT_TYPE_VERSION:
71 BVariantRetrieveVersion(pVariant, (DWORD64*)pllValue); 72 BVariantRetrieveVersion(pVariant, &pVersionValue);
73
74 hr = StrStringToInt64(pVersionValue->sczVersion, 0, pllValue);
75 if (FAILED(hr))
76 {
77 hr = DISP_E_TYPEMISMATCH;
78 }
72 break; 79 break;
73 default: 80 default:
74 hr = E_INVALIDARG; 81 hr = E_INVALIDARG;
@@ -86,7 +93,7 @@ extern "C" HRESULT BVariantGetString(
86{ 93{
87 HRESULT hr = S_OK; 94 HRESULT hr = S_OK;
88 LONGLONG llValue = 0; 95 LONGLONG llValue = 0;
89 DWORD64 qwValue = 0; 96 VERUTIL_VERSION* pVersionValue = NULL;
90 97
91 switch (pVariant->Type) 98 switch (pVariant->Type)
92 { 99 {
@@ -104,17 +111,9 @@ extern "C" HRESULT BVariantGetString(
104 hr = BVariantRetrieveDecryptedString(pVariant, psczValue); 111 hr = BVariantRetrieveDecryptedString(pVariant, psczValue);
105 break; 112 break;
106 case BURN_VARIANT_TYPE_VERSION: 113 case BURN_VARIANT_TYPE_VERSION:
107 BVariantRetrieveVersion(pVariant, &qwValue); 114 BVariantRetrieveVersion(pVariant, &pVersionValue);
108 if (SUCCEEDED(hr)) 115
109 { 116 hr = StrAllocStringSecure(psczValue, pVersionValue->sczVersion, 0);
110 hr = StrAllocFormattedSecure(psczValue, L"%hu.%hu.%hu.%hu",
111 (WORD)(qwValue >> 48),
112 (WORD)(qwValue >> 32),
113 (WORD)(qwValue >> 16),
114 (WORD)qwValue);
115 ExitOnFailure(hr, "Failed to convert version to string.");
116 }
117 SecureZeroMemory(&qwValue, sizeof(qwValue));
118 break; 117 break;
119 default: 118 default:
120 hr = E_INVALIDARG; 119 hr = E_INVALIDARG;
@@ -125,26 +124,30 @@ LExit:
125 return hr; 124 return hr;
126} 125}
127 126
128// The contents of pqwValue may be sensitive, should keep encrypted and SecureZeroMemory. 127// The contents of ppValue may be sensitive, should keep encrypted and SecureZeroMemory.
129extern "C" HRESULT BVariantGetVersion( 128extern "C" HRESULT BVariantGetVersion(
130 __in BURN_VARIANT* pVariant, 129 __in BURN_VARIANT* pVariant,
131 __out DWORD64* pqwValue 130 __out VERUTIL_VERSION** ppValue
132 ) 131 )
133{ 132{
134 HRESULT hr = S_OK; 133 HRESULT hr = S_OK;
134 LONGLONG llValue = 0;
135 LPWSTR sczValue = NULL; 135 LPWSTR sczValue = NULL;
136 VERUTIL_VERSION* pValue = NULL;
136 137
137 switch (pVariant->Type) 138 switch (pVariant->Type)
138 { 139 {
139 case BURN_VARIANT_TYPE_NUMERIC: 140 case BURN_VARIANT_TYPE_NUMERIC:
140 BVariantRetrieveNumeric(pVariant, (LONGLONG*)pqwValue); 141 BVariantRetrieveNumeric(pVariant, &llValue);
142
143 hr = VerVersionFromQword(llValue, ppValue);
141 break; 144 break;
142 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; 145 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
143 case BURN_VARIANT_TYPE_STRING: 146 case BURN_VARIANT_TYPE_STRING:
144 hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); 147 hr = BVariantRetrieveDecryptedString(pVariant, &sczValue);
145 if (SUCCEEDED(hr)) 148 if (SUCCEEDED(hr))
146 { 149 {
147 hr = FileVersionFromStringEx(sczValue, 0, pqwValue); 150 hr = VerParseVersion(sczValue, 0, FALSE, ppValue);
148 if (FAILED(hr)) 151 if (FAILED(hr))
149 { 152 {
150 hr = DISP_E_TYPEMISMATCH; 153 hr = DISP_E_TYPEMISMATCH;
@@ -153,7 +156,9 @@ extern "C" HRESULT BVariantGetVersion(
153 StrSecureZeroFreeString(sczValue); 156 StrSecureZeroFreeString(sczValue);
154 break; 157 break;
155 case BURN_VARIANT_TYPE_VERSION: 158 case BURN_VARIANT_TYPE_VERSION:
156 BVariantRetrieveVersion(pVariant, pqwValue); 159 BVariantRetrieveVersion(pVariant, &pValue);
160
161 hr = VerCopyVersion(pValue, ppValue);
157 break; 162 break;
158 default: 163 default:
159 hr = E_INVALIDARG; 164 hr = E_INVALIDARG;
@@ -224,7 +229,7 @@ LExit:
224 229
225extern "C" HRESULT BVariantSetVersion( 230extern "C" HRESULT BVariantSetVersion(
226 __in BURN_VARIANT* pVariant, 231 __in BURN_VARIANT* pVariant,
227 __in DWORD64 qwValue 232 __in VERUTIL_VERSION* pValue
228 ) 233 )
229{ 234{
230 HRESULT hr = S_OK; 235 HRESULT hr = S_OK;
@@ -236,7 +241,7 @@ extern "C" HRESULT BVariantSetVersion(
236 StrSecureZeroFreeString(pVariant->sczValue); 241 StrSecureZeroFreeString(pVariant->sczValue);
237 } 242 }
238 memset(pVariant, 0, sizeof(BURN_VARIANT)); 243 memset(pVariant, 0, sizeof(BURN_VARIANT));
239 pVariant->qwValue = qwValue; 244 hr = VerCopyVersion(pValue, &pVariant->pValue);
240 pVariant->Type = BURN_VARIANT_TYPE_VERSION; 245 pVariant->Type = BURN_VARIANT_TYPE_VERSION;
241 BVariantSetEncryption(pVariant, fEncryptValue); 246 BVariantSetEncryption(pVariant, fEncryptValue);
242 247
@@ -251,7 +256,7 @@ extern "C" HRESULT BVariantSetValue(
251 HRESULT hr = S_OK; 256 HRESULT hr = S_OK;
252 LONGLONG llValue = 0; 257 LONGLONG llValue = 0;
253 LPWSTR sczValue = NULL; 258 LPWSTR sczValue = NULL;
254 DWORD64 qwValue = 0; 259 VERUTIL_VERSION* pVersionValue = NULL;
255 BOOL fEncrypt = pVariant->fEncryptString; 260 BOOL fEncrypt = pVariant->fEncryptString;
256 261
257 switch (pValue->Type) 262 switch (pValue->Type)
@@ -277,12 +282,11 @@ extern "C" HRESULT BVariantSetValue(
277 StrSecureZeroFreeString(sczValue); 282 StrSecureZeroFreeString(sczValue);
278 break; 283 break;
279 case BURN_VARIANT_TYPE_VERSION: 284 case BURN_VARIANT_TYPE_VERSION:
280 hr = BVariantGetVersion(pValue, &qwValue); 285 hr = BVariantGetVersion(pValue, &pVersionValue);
281 if (SUCCEEDED(hr)) 286 if (SUCCEEDED(hr))
282 { 287 {
283 hr = BVariantSetVersion(pVariant, qwValue); 288 hr = BVariantSetVersion(pVariant, pVersionValue);
284 } 289 }
285 SecureZeroMemory(&qwValue, sizeof(qwValue));
286 break; 290 break;
287 default: 291 default:
288 hr = E_INVALIDARG; 292 hr = E_INVALIDARG;
@@ -303,7 +307,7 @@ extern "C" HRESULT BVariantCopy(
303 HRESULT hr = S_OK; 307 HRESULT hr = S_OK;
304 LONGLONG llValue = 0; 308 LONGLONG llValue = 0;
305 LPWSTR sczValue = NULL; 309 LPWSTR sczValue = NULL;
306 DWORD64 qwValue = 0; 310 VERUTIL_VERSION* pVersionValue = 0;
307 311
308 BVariantUninitialize(pTarget); 312 BVariantUninitialize(pTarget);
309 313
@@ -329,12 +333,11 @@ extern "C" HRESULT BVariantCopy(
329 StrSecureZeroFreeString(sczValue); 333 StrSecureZeroFreeString(sczValue);
330 break; 334 break;
331 case BURN_VARIANT_TYPE_VERSION: 335 case BURN_VARIANT_TYPE_VERSION:
332 hr = BVariantGetVersion(pSource, &qwValue); 336 hr = BVariantGetVersion(pSource, &pVersionValue);
333 if (SUCCEEDED(hr)) 337 if (SUCCEEDED(hr))
334 { 338 {
335 hr = BVariantSetVersion(pTarget, qwValue); 339 hr = BVariantSetVersion(pTarget, pVersionValue);
336 } 340 }
337 SecureZeroMemory(&qwValue, sizeof(qwValue));
338 break; 341 break;
339 default: 342 default:
340 hr = E_INVALIDARG; 343 hr = E_INVALIDARG;
@@ -380,13 +383,13 @@ extern "C" HRESULT BVariantChangeType(
380 hr = BVariantGetString(pVariant, &variant.sczValue); 383 hr = BVariantGetString(pVariant, &variant.sczValue);
381 break; 384 break;
382 case BURN_VARIANT_TYPE_VERSION: 385 case BURN_VARIANT_TYPE_VERSION:
383 hr = BVariantGetVersion(pVariant, &variant.qwValue); 386 hr = BVariantGetVersion(pVariant, &variant.pValue);
384 break; 387 break;
385 default: 388 default:
386 ExitFunction1(hr = E_INVALIDARG); 389 ExitFunction1(hr = E_INVALIDARG);
387 } 390 }
388 ExitOnFailure(hr, "Failed to copy variant value.");
389 variant.Type = type; 391 variant.Type = type;
392 ExitOnFailure(hr, "Failed to copy variant value.");
390 393
391 BVariantUninitialize(pVariant); 394 BVariantUninitialize(pVariant);
392 memcpy_s(pVariant, sizeof(BURN_VARIANT), &variant, sizeof(BURN_VARIANT)); 395 memcpy_s(pVariant, sizeof(BURN_VARIANT), &variant, sizeof(BURN_VARIANT));
@@ -524,10 +527,10 @@ LExit:
524 527
525static void BVariantRetrieveVersion( 528static void BVariantRetrieveVersion(
526 __in BURN_VARIANT* pVariant, 529 __in BURN_VARIANT* pVariant,
527 __out DWORD64* pqwValue 530 __out VERUTIL_VERSION** ppValue
528 ) 531 )
529{ 532{
530 Assert(NULL != pqwValue); 533 Assert(ppValue);
531 534
532 *pqwValue = pVariant->qwValue; 535 *ppValue = pVariant->pValue;
533} 536}