diff options
Diffstat (limited to 'src/engine/variant.cpp')
-rw-r--r-- | src/engine/variant.cpp | 34 |
1 files changed, 26 insertions, 8 deletions
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( | |||
32 | __in BURN_VARIANT* pVariant | 32 | __in BURN_VARIANT* pVariant |
33 | ) | 33 | ) |
34 | { | 34 | { |
35 | if (BURN_VARIANT_TYPE_STRING == pVariant->Type) | 35 | if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type || |
36 | BURN_VARIANT_TYPE_STRING == pVariant->Type) | ||
36 | { | 37 | { |
37 | StrSecureZeroFreeString(pVariant->sczValue); | 38 | StrSecureZeroFreeString(pVariant->sczValue); |
38 | } | 39 | } |
@@ -53,6 +54,7 @@ extern "C" HRESULT BVariantGetNumeric( | |||
53 | case BURN_VARIANT_TYPE_NUMERIC: | 54 | case BURN_VARIANT_TYPE_NUMERIC: |
54 | BVariantRetrieveNumeric(pVariant, pllValue); | 55 | BVariantRetrieveNumeric(pVariant, pllValue); |
55 | break; | 56 | break; |
57 | case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; | ||
56 | case BURN_VARIANT_TYPE_STRING: | 58 | case BURN_VARIANT_TYPE_STRING: |
57 | hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); | 59 | hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); |
58 | if (SUCCEEDED(hr)) | 60 | if (SUCCEEDED(hr)) |
@@ -97,6 +99,7 @@ extern "C" HRESULT BVariantGetString( | |||
97 | } | 99 | } |
98 | SecureZeroMemory(&llValue, sizeof(llValue)); | 100 | SecureZeroMemory(&llValue, sizeof(llValue)); |
99 | break; | 101 | break; |
102 | case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; | ||
100 | case BURN_VARIANT_TYPE_STRING: | 103 | case BURN_VARIANT_TYPE_STRING: |
101 | hr = BVariantRetrieveDecryptedString(pVariant, psczValue); | 104 | hr = BVariantRetrieveDecryptedString(pVariant, psczValue); |
102 | break; | 105 | break; |
@@ -136,6 +139,7 @@ extern "C" HRESULT BVariantGetVersion( | |||
136 | case BURN_VARIANT_TYPE_NUMERIC: | 139 | case BURN_VARIANT_TYPE_NUMERIC: |
137 | BVariantRetrieveNumeric(pVariant, (LONGLONG*)pqwValue); | 140 | BVariantRetrieveNumeric(pVariant, (LONGLONG*)pqwValue); |
138 | break; | 141 | break; |
142 | case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; | ||
139 | case BURN_VARIANT_TYPE_STRING: | 143 | case BURN_VARIANT_TYPE_STRING: |
140 | hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); | 144 | hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); |
141 | if (SUCCEEDED(hr)) | 145 | if (SUCCEEDED(hr)) |
@@ -167,7 +171,8 @@ extern "C" HRESULT BVariantSetNumeric( | |||
167 | HRESULT hr = S_OK; | 171 | HRESULT hr = S_OK; |
168 | BOOL fEncrypt = pVariant->fEncryptString; | 172 | BOOL fEncrypt = pVariant->fEncryptString; |
169 | 173 | ||
170 | if (BURN_VARIANT_TYPE_STRING == pVariant->Type) | 174 | if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type || |
175 | BURN_VARIANT_TYPE_STRING == pVariant->Type) | ||
171 | { | 176 | { |
172 | StrSecureZeroFreeString(pVariant->sczValue); | 177 | StrSecureZeroFreeString(pVariant->sczValue); |
173 | } | 178 | } |
@@ -182,7 +187,8 @@ extern "C" HRESULT BVariantSetNumeric( | |||
182 | extern "C" HRESULT BVariantSetString( | 187 | extern "C" HRESULT BVariantSetString( |
183 | __in BURN_VARIANT* pVariant, | 188 | __in BURN_VARIANT* pVariant, |
184 | __in_z_opt LPCWSTR wzValue, | 189 | __in_z_opt LPCWSTR wzValue, |
185 | __in DWORD_PTR cchValue | 190 | __in DWORD_PTR cchValue, |
191 | __in BOOL fFormatted | ||
186 | ) | 192 | ) |
187 | { | 193 | { |
188 | HRESULT hr = S_OK; | 194 | HRESULT hr = S_OK; |
@@ -194,7 +200,8 @@ extern "C" HRESULT BVariantSetString( | |||
194 | } | 200 | } |
195 | else // assign the value. | 201 | else // assign the value. |
196 | { | 202 | { |
197 | if (BURN_VARIANT_TYPE_STRING != pVariant->Type) | 203 | if (BURN_VARIANT_TYPE_FORMATTED != pVariant->Type && |
204 | BURN_VARIANT_TYPE_STRING != pVariant->Type) | ||
198 | { | 205 | { |
199 | memset(pVariant, 0, sizeof(BURN_VARIANT)); | 206 | memset(pVariant, 0, sizeof(BURN_VARIANT)); |
200 | } | 207 | } |
@@ -207,7 +214,7 @@ extern "C" HRESULT BVariantSetString( | |||
207 | hr = StrAllocStringSecure(&pVariant->sczValue, wzValue, cchValue); | 214 | hr = StrAllocStringSecure(&pVariant->sczValue, wzValue, cchValue); |
208 | ExitOnFailure(hr, "Failed to copy string."); | 215 | ExitOnFailure(hr, "Failed to copy string."); |
209 | 216 | ||
210 | pVariant->Type = BURN_VARIANT_TYPE_STRING; | 217 | pVariant->Type = fFormatted ? BURN_VARIANT_TYPE_FORMATTED : BURN_VARIANT_TYPE_STRING; |
211 | } | 218 | } |
212 | 219 | ||
213 | LExit: | 220 | LExit: |
@@ -223,7 +230,8 @@ extern "C" HRESULT BVariantSetVersion( | |||
223 | HRESULT hr = S_OK; | 230 | HRESULT hr = S_OK; |
224 | BOOL fEncryptValue = pVariant->fEncryptString; | 231 | BOOL fEncryptValue = pVariant->fEncryptString; |
225 | 232 | ||
226 | if (BURN_VARIANT_TYPE_STRING == pVariant->Type) | 233 | if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type || |
234 | BURN_VARIANT_TYPE_STRING == pVariant->Type) | ||
227 | { | 235 | { |
228 | StrSecureZeroFreeString(pVariant->sczValue); | 236 | StrSecureZeroFreeString(pVariant->sczValue); |
229 | } | 237 | } |
@@ -259,11 +267,12 @@ extern "C" HRESULT BVariantSetValue( | |||
259 | } | 267 | } |
260 | SecureZeroMemory(&llValue, sizeof(llValue)); | 268 | SecureZeroMemory(&llValue, sizeof(llValue)); |
261 | break; | 269 | break; |
270 | case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; | ||
262 | case BURN_VARIANT_TYPE_STRING: | 271 | case BURN_VARIANT_TYPE_STRING: |
263 | hr = BVariantGetString(pValue, &sczValue); | 272 | hr = BVariantGetString(pValue, &sczValue); |
264 | if (SUCCEEDED(hr)) | 273 | if (SUCCEEDED(hr)) |
265 | { | 274 | { |
266 | hr = BVariantSetString(pVariant, sczValue, 0); | 275 | hr = BVariantSetString(pVariant, sczValue, 0, BURN_VARIANT_TYPE_FORMATTED == pValue->Type); |
267 | } | 276 | } |
268 | StrSecureZeroFreeString(sczValue); | 277 | StrSecureZeroFreeString(sczValue); |
269 | break; | 278 | break; |
@@ -310,11 +319,12 @@ extern "C" HRESULT BVariantCopy( | |||
310 | } | 319 | } |
311 | SecureZeroMemory(&llValue, sizeof(llValue)); | 320 | SecureZeroMemory(&llValue, sizeof(llValue)); |
312 | break; | 321 | break; |
322 | case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; | ||
313 | case BURN_VARIANT_TYPE_STRING: | 323 | case BURN_VARIANT_TYPE_STRING: |
314 | hr = BVariantGetString(pSource, &sczValue); | 324 | hr = BVariantGetString(pSource, &sczValue); |
315 | if (SUCCEEDED(hr)) | 325 | if (SUCCEEDED(hr)) |
316 | { | 326 | { |
317 | hr = BVariantSetString(pTarget, sczValue, 0); | 327 | hr = BVariantSetString(pTarget, sczValue, 0, BURN_VARIANT_TYPE_FORMATTED == pSource->Type); |
318 | } | 328 | } |
319 | StrSecureZeroFreeString(sczValue); | 329 | StrSecureZeroFreeString(sczValue); |
320 | break; | 330 | break; |
@@ -350,6 +360,12 @@ extern "C" HRESULT BVariantChangeType( | |||
350 | { | 360 | { |
351 | ExitFunction(); // variant already is of the requested type | 361 | ExitFunction(); // variant already is of the requested type |
352 | } | 362 | } |
363 | else if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type && BURN_VARIANT_TYPE_STRING == type || | ||
364 | BURN_VARIANT_TYPE_STRING == pVariant->Type && BURN_VARIANT_TYPE_FORMATTED == type) | ||
365 | { | ||
366 | pVariant->Type = type; | ||
367 | ExitFunction(); | ||
368 | } | ||
353 | 369 | ||
354 | switch (type) | 370 | switch (type) |
355 | { | 371 | { |
@@ -359,6 +375,7 @@ extern "C" HRESULT BVariantChangeType( | |||
359 | case BURN_VARIANT_TYPE_NUMERIC: | 375 | case BURN_VARIANT_TYPE_NUMERIC: |
360 | hr = BVariantGetNumeric(pVariant, &variant.llValue); | 376 | hr = BVariantGetNumeric(pVariant, &variant.llValue); |
361 | break; | 377 | break; |
378 | case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; | ||
362 | case BURN_VARIANT_TYPE_STRING: | 379 | case BURN_VARIANT_TYPE_STRING: |
363 | hr = BVariantGetString(pVariant, &variant.sczValue); | 380 | hr = BVariantGetString(pVariant, &variant.sczValue); |
364 | break; | 381 | break; |
@@ -400,6 +417,7 @@ extern "C" HRESULT BVariantSetEncryption( | |||
400 | case BURN_VARIANT_TYPE_VERSION: | 417 | case BURN_VARIANT_TYPE_VERSION: |
401 | hr = S_OK; | 418 | hr = S_OK; |
402 | break; | 419 | break; |
420 | case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; | ||
403 | case BURN_VARIANT_TYPE_STRING: | 421 | case BURN_VARIANT_TYPE_STRING: |
404 | hr = BVariantEncryptString(pVariant, fEncrypt); | 422 | hr = BVariantEncryptString(pVariant, fEncrypt); |
405 | break; | 423 | break; |