diff options
| author | Rob Mensching <rob@firegiant.com> | 2024-01-11 18:26:20 -0800 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2024-03-06 18:03:38 -0800 |
| commit | 0d3d54992104288e9ee0c834d0b96e8502fd2d42 (patch) | |
| tree | 9efa49c4983cd2ba1becab64bd1f2faccac88acf /src/libs/dutil/WixToolset.DUtil/buffutil.cpp | |
| parent | 2824298d9dd817a47527c920363556b54ead5d5d (diff) | |
| download | wix-0d3d54992104288e9ee0c834d0b96e8502fd2d42.tar.gz wix-0d3d54992104288e9ee0c834d0b96e8502fd2d42.tar.bz2 wix-0d3d54992104288e9ee0c834d0b96e8502fd2d42.zip | |
Move the BootstrapperApplication out of proc
Diffstat (limited to '')
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/buffutil.cpp | 271 |
1 files changed, 226 insertions, 45 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/buffutil.cpp b/src/libs/dutil/WixToolset.DUtil/buffutil.cpp index acde4dc9..270bfc85 100644 --- a/src/libs/dutil/WixToolset.DUtil/buffutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/buffutil.cpp | |||
| @@ -33,6 +33,8 @@ static HRESULT EnsureBufferSize( | |||
| 33 | 33 | ||
| 34 | // functions | 34 | // functions |
| 35 | 35 | ||
| 36 | // Buffer read functions | ||
| 37 | |||
| 36 | extern "C" HRESULT BuffReadNumber( | 38 | extern "C" HRESULT BuffReadNumber( |
| 37 | __in_bcount(cbBuffer) const BYTE* pbBuffer, | 39 | __in_bcount(cbBuffer) const BYTE* pbBuffer, |
| 38 | __in SIZE_T cbBuffer, | 40 | __in SIZE_T cbBuffer, |
| @@ -55,7 +57,7 @@ extern "C" HRESULT BuffReadNumber( | |||
| 55 | if (sizeof(DWORD) > cbAvailable) | 57 | if (sizeof(DWORD) > cbAvailable) |
| 56 | { | 58 | { |
| 57 | hr = E_INVALIDARG; | 59 | hr = E_INVALIDARG; |
| 58 | BuffExitOnRootFailure(hr, "Buffer too small."); | 60 | BuffExitOnRootFailure(hr, "Buffer too small to read number. cbAvailable: %u", cbAvailable); |
| 59 | } | 61 | } |
| 60 | 62 | ||
| 61 | *pdw = *(const DWORD*)(pbBuffer + *piBuffer); | 63 | *pdw = *(const DWORD*)(pbBuffer + *piBuffer); |
| @@ -87,7 +89,7 @@ extern "C" HRESULT BuffReadNumber64( | |||
| 87 | if (sizeof(DWORD64) > cbAvailable) | 89 | if (sizeof(DWORD64) > cbAvailable) |
| 88 | { | 90 | { |
| 89 | hr = E_INVALIDARG; | 91 | hr = E_INVALIDARG; |
| 90 | BuffExitOnRootFailure(hr, "Buffer too small."); | 92 | BuffExitOnRootFailure(hr, "Buffer too small to read 64-bit number. cbAvailable: %u", cbAvailable); |
| 91 | } | 93 | } |
| 92 | 94 | ||
| 93 | *pdw64 = *(const DWORD64*)(pbBuffer + *piBuffer); | 95 | *pdw64 = *(const DWORD64*)(pbBuffer + *piBuffer); |
| @@ -119,7 +121,7 @@ extern "C" HRESULT BuffReadPointer( | |||
| 119 | if (sizeof(DWORD_PTR) > cbAvailable) | 121 | if (sizeof(DWORD_PTR) > cbAvailable) |
| 120 | { | 122 | { |
| 121 | hr = E_INVALIDARG; | 123 | hr = E_INVALIDARG; |
| 122 | BuffExitOnRootFailure(hr, "Buffer too small."); | 124 | BuffExitOnRootFailure(hr, "Buffer too small to read pointer. cbAvailable: %u", cbAvailable); |
| 123 | } | 125 | } |
| 124 | 126 | ||
| 125 | *pdw64 = *(const DWORD_PTR*)(pbBuffer + *piBuffer); | 127 | *pdw64 = *(const DWORD_PTR*)(pbBuffer + *piBuffer); |
| @@ -141,7 +143,7 @@ extern "C" HRESULT BuffReadString( | |||
| 141 | Assert(pscz); | 143 | Assert(pscz); |
| 142 | 144 | ||
| 143 | HRESULT hr = S_OK; | 145 | HRESULT hr = S_OK; |
| 144 | SIZE_T cch = 0; | 146 | DWORD cch = 0; |
| 145 | SIZE_T cb = 0; | 147 | SIZE_T cb = 0; |
| 146 | SIZE_T cbAvailable = 0; | 148 | SIZE_T cbAvailable = 0; |
| 147 | 149 | ||
| @@ -150,19 +152,19 @@ extern "C" HRESULT BuffReadString( | |||
| 150 | BuffExitOnRootFailure(hr, "Failed to calculate available data size for character count."); | 152 | BuffExitOnRootFailure(hr, "Failed to calculate available data size for character count."); |
| 151 | 153 | ||
| 152 | // verify buffer size | 154 | // verify buffer size |
| 153 | if (sizeof(SIZE_T) > cbAvailable) | 155 | if (sizeof(DWORD) > cbAvailable) |
| 154 | { | 156 | { |
| 155 | hr = E_INVALIDARG; | 157 | hr = E_INVALIDARG; |
| 156 | BuffExitOnRootFailure(hr, "Buffer too small."); | 158 | BuffExitOnRootFailure(hr, "Buffer too small to read size of string. cbAvailable: %u", cbAvailable); |
| 157 | } | 159 | } |
| 158 | 160 | ||
| 159 | // read character count | 161 | // read character count |
| 160 | cch = *(const SIZE_T*)(pbBuffer + *piBuffer); | 162 | cch = *(const DWORD*)(pbBuffer + *piBuffer); |
| 161 | 163 | ||
| 162 | hr = ::SIZETMult(cch, sizeof(WCHAR), &cb); | 164 | hr = ::SIZETMult(cch, sizeof(WCHAR), &cb); |
| 163 | BuffExitOnRootFailure(hr, "Overflow while multiplying to calculate buffer size"); | 165 | BuffExitOnRootFailure(hr, "Overflow while multiplying to calculate buffer size"); |
| 164 | 166 | ||
| 165 | hr = ::SIZETAdd(*piBuffer, sizeof(SIZE_T), piBuffer); | 167 | hr = ::SIZETAdd(*piBuffer, sizeof(cch), piBuffer); |
| 166 | BuffExitOnRootFailure(hr, "Overflow while adding to calculate buffer size"); | 168 | BuffExitOnRootFailure(hr, "Overflow while adding to calculate buffer size"); |
| 167 | 169 | ||
| 168 | // get availiable data size | 170 | // get availiable data size |
| @@ -173,7 +175,7 @@ extern "C" HRESULT BuffReadString( | |||
| 173 | if (cb > cbAvailable) | 175 | if (cb > cbAvailable) |
| 174 | { | 176 | { |
| 175 | hr = E_INVALIDARG; | 177 | hr = E_INVALIDARG; |
| 176 | BuffExitOnRootFailure(hr, "Buffer too small to hold character data."); | 178 | BuffExitOnRootFailure(hr, "Buffer too small to read string data. cbAvailable: %u, cb: %u", cbAvailable, cb); |
| 177 | } | 179 | } |
| 178 | 180 | ||
| 179 | // copy character data | 181 | // copy character data |
| @@ -198,7 +200,7 @@ extern "C" HRESULT BuffReadStringAnsi( | |||
| 198 | Assert(pscz); | 200 | Assert(pscz); |
| 199 | 201 | ||
| 200 | HRESULT hr = S_OK; | 202 | HRESULT hr = S_OK; |
| 201 | SIZE_T cch = 0; | 203 | DWORD cch = 0; |
| 202 | SIZE_T cb = 0; | 204 | SIZE_T cb = 0; |
| 203 | SIZE_T cbAvailable = 0; | 205 | SIZE_T cbAvailable = 0; |
| 204 | 206 | ||
| @@ -207,19 +209,19 @@ extern "C" HRESULT BuffReadStringAnsi( | |||
| 207 | BuffExitOnRootFailure(hr, "Failed to calculate available data size for character count."); | 209 | BuffExitOnRootFailure(hr, "Failed to calculate available data size for character count."); |
| 208 | 210 | ||
| 209 | // verify buffer size | 211 | // verify buffer size |
| 210 | if (sizeof(SIZE_T) > cbAvailable) | 212 | if (sizeof(DWORD) > cbAvailable) |
| 211 | { | 213 | { |
| 212 | hr = E_INVALIDARG; | 214 | hr = E_INVALIDARG; |
| 213 | BuffExitOnRootFailure(hr, "Buffer too small."); | 215 | BuffExitOnRootFailure(hr, "Buffer too small to read size of ANSI string. cbAvailable: %u", cbAvailable); |
| 214 | } | 216 | } |
| 215 | 217 | ||
| 216 | // read character count | 218 | // read character count |
| 217 | cch = *(const SIZE_T*)(pbBuffer + *piBuffer); | 219 | cch = *(const DWORD*)(pbBuffer + *piBuffer); |
| 218 | 220 | ||
| 219 | hr = ::SIZETMult(cch, sizeof(CHAR), &cb); | 221 | hr = ::SIZETMult(cch, sizeof(CHAR), &cb); |
| 220 | BuffExitOnRootFailure(hr, "Overflow while multiplying to calculate buffer size"); | 222 | BuffExitOnRootFailure(hr, "Overflow while multiplying to calculate buffer size"); |
| 221 | 223 | ||
| 222 | hr = ::SIZETAdd(*piBuffer, sizeof(SIZE_T), piBuffer); | 224 | hr = ::SIZETAdd(*piBuffer, sizeof(cch), piBuffer); |
| 223 | BuffExitOnRootFailure(hr, "Overflow while adding to calculate buffer size"); | 225 | BuffExitOnRootFailure(hr, "Overflow while adding to calculate buffer size"); |
| 224 | 226 | ||
| 225 | // get availiable data size | 227 | // get availiable data size |
| @@ -230,7 +232,7 @@ extern "C" HRESULT BuffReadStringAnsi( | |||
| 230 | if (cb > cbAvailable) | 232 | if (cb > cbAvailable) |
| 231 | { | 233 | { |
| 232 | hr = E_INVALIDARG; | 234 | hr = E_INVALIDARG; |
| 233 | BuffExitOnRootFailure(hr, "Buffer too small to hold character count."); | 235 | BuffExitOnRootFailure(hr, "Buffer too small to read ANSI string data. cbAvailable: %u, cb: %u", cbAvailable, cb); |
| 234 | } | 236 | } |
| 235 | 237 | ||
| 236 | // copy character data | 238 | // copy character data |
| @@ -266,15 +268,15 @@ extern "C" HRESULT BuffReadStream( | |||
| 266 | BuffExitOnRootFailure(hr, "Failed to calculate available data size for stream size."); | 268 | BuffExitOnRootFailure(hr, "Failed to calculate available data size for stream size."); |
| 267 | 269 | ||
| 268 | // verify buffer size | 270 | // verify buffer size |
| 269 | if (sizeof(SIZE_T) > cbAvailable) | 271 | if (sizeof(DWORD) > cbAvailable) |
| 270 | { | 272 | { |
| 271 | hr = E_INVALIDARG; | 273 | hr = E_INVALIDARG; |
| 272 | BuffExitOnRootFailure(hr, "Buffer too small."); | 274 | BuffExitOnRootFailure(hr, "Buffer too small to read size of stream. cbAvailable: %u, cb: %u", cbAvailable, cb); |
| 273 | } | 275 | } |
| 274 | 276 | ||
| 275 | // read stream size | 277 | // read stream size |
| 276 | cb = *(const SIZE_T*)(pbBuffer + *piBuffer); | 278 | cb = *(const DWORD*)(pbBuffer + *piBuffer); |
| 277 | *piBuffer += sizeof(SIZE_T); | 279 | *piBuffer += sizeof(DWORD); |
| 278 | 280 | ||
| 279 | // get availiable data size | 281 | // get availiable data size |
| 280 | hr = ::SIZETSub(cbBuffer, *piBuffer, &cbAvailable); | 282 | hr = ::SIZETSub(cbBuffer, *piBuffer, &cbAvailable); |
| @@ -284,7 +286,7 @@ extern "C" HRESULT BuffReadStream( | |||
| 284 | if (cb > cbAvailable) | 286 | if (cb > cbAvailable) |
| 285 | { | 287 | { |
| 286 | hr = E_INVALIDARG; | 288 | hr = E_INVALIDARG; |
| 287 | BuffExitOnRootFailure(hr, "Buffer too small to hold byte count."); | 289 | BuffExitOnRootFailure(hr, "Buffer too small to read stream data. cbAvailable: %u, cb: %u", cbAvailable, cb); |
| 288 | } | 290 | } |
| 289 | 291 | ||
| 290 | // allocate buffer | 292 | // allocate buffer |
| @@ -307,6 +309,52 @@ LExit: | |||
| 307 | return hr; | 309 | return hr; |
| 308 | } | 310 | } |
| 309 | 311 | ||
| 312 | |||
| 313 | // Buffer Reader read functions | ||
| 314 | |||
| 315 | extern "C" HRESULT BuffReaderReadNumber( | ||
| 316 | __in BUFF_READER* pReader, | ||
| 317 | __out DWORD* pdw | ||
| 318 | ) | ||
| 319 | { | ||
| 320 | return BuffReadNumber(pReader->pbData, pReader->cbData, &pReader->iBuffer, pdw); | ||
| 321 | } | ||
| 322 | |||
| 323 | extern "C" HRESULT BuffReaderReadNumber64( | ||
| 324 | __in BUFF_READER* pReader, | ||
| 325 | __out DWORD64* pdw64 | ||
| 326 | ) | ||
| 327 | { | ||
| 328 | return BuffReadNumber64(pReader->pbData, pReader->cbData, &pReader->iBuffer, pdw64); | ||
| 329 | } | ||
| 330 | |||
| 331 | extern "C" HRESULT BuffReaderReadPointer( | ||
| 332 | __in BUFF_READER* pReader, | ||
| 333 | __out DWORD_PTR* pdw | ||
| 334 | ) | ||
| 335 | { | ||
| 336 | return BuffReadPointer(pReader->pbData, pReader->cbData, &pReader->iBuffer, pdw); | ||
| 337 | } | ||
| 338 | |||
| 339 | extern "C" HRESULT BuffReaderReadString( | ||
| 340 | __in BUFF_READER* pReader, | ||
| 341 | __deref_out_z LPWSTR* pscz | ||
| 342 | ) | ||
| 343 | { | ||
| 344 | return BuffReadString(pReader->pbData, pReader->cbData, &pReader->iBuffer, pscz); | ||
| 345 | } | ||
| 346 | |||
| 347 | extern "C" HRESULT BuffReaderReadStringAnsi( | ||
| 348 | __in BUFF_READER* pReader, | ||
| 349 | __deref_out_z LPSTR* pscz | ||
| 350 | ) | ||
| 351 | { | ||
| 352 | return BuffReadStringAnsi(pReader->pbData, pReader->cbData, &pReader->iBuffer, pscz); | ||
| 353 | } | ||
| 354 | |||
| 355 | |||
| 356 | // Buffer write functions | ||
| 357 | |||
| 310 | extern "C" HRESULT BuffWriteNumber( | 358 | extern "C" HRESULT BuffWriteNumber( |
| 311 | __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer, | 359 | __deref_inout_bcount(*piBuffer) BYTE** ppbBuffer, |
| 312 | __inout SIZE_T* piBuffer, | 360 | __inout SIZE_T* piBuffer, |
| @@ -323,7 +371,7 @@ extern "C" HRESULT BuffWriteNumber( | |||
| 323 | BuffExitOnFailure(hr, "Failed to ensure buffer size."); | 371 | BuffExitOnFailure(hr, "Failed to ensure buffer size."); |
| 324 | 372 | ||
| 325 | // copy data to buffer | 373 | // copy data to buffer |
| 326 | *(DWORD*)(*ppbBuffer + *piBuffer) = dw; | 374 | *reinterpret_cast<DWORD*>(*ppbBuffer + *piBuffer) = dw; |
| 327 | *piBuffer += sizeof(DWORD); | 375 | *piBuffer += sizeof(DWORD); |
| 328 | 376 | ||
| 329 | LExit: | 377 | LExit: |
| @@ -386,25 +434,35 @@ extern "C" HRESULT BuffWriteString( | |||
| 386 | Assert(piBuffer); | 434 | Assert(piBuffer); |
| 387 | 435 | ||
| 388 | HRESULT hr = S_OK; | 436 | HRESULT hr = S_OK; |
| 389 | SIZE_T cch = 0; | 437 | DWORD cch = 0; // This value *MUST* be treated as a DWORD to be marshalled over the pipe between 32-bit and 64-bit process the same. |
| 390 | SIZE_T cb = 0; | 438 | SIZE_T cb = 0; |
| 391 | errno_t err = 0; | 439 | errno_t err = 0; |
| 392 | 440 | ||
| 393 | if (scz) | 441 | if (scz) |
| 394 | { | 442 | { |
| 395 | hr = ::StringCchLengthW(scz, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cch)); | 443 | size_t size = 0; |
| 396 | BuffExitOnRootFailure(hr, "Failed to get string size.") | 444 | |
| 445 | hr = ::StringCchLengthW(scz, STRSAFE_MAX_CCH, &size); | ||
| 446 | BuffExitOnRootFailure(hr, "Failed to get string size."); | ||
| 447 | |||
| 448 | if (size > DWORD_MAX) | ||
| 449 | { | ||
| 450 | hr = E_INVALIDARG; | ||
| 451 | BuffExitOnRootFailure(hr, "String too long to write to buffer."); | ||
| 452 | } | ||
| 453 | |||
| 454 | cch = static_cast<DWORD>(size); | ||
| 397 | } | 455 | } |
| 398 | 456 | ||
| 399 | cb = cch * sizeof(WCHAR); | 457 | cb = cch * sizeof(WCHAR); |
| 400 | 458 | ||
| 401 | // make sure we have a buffer with sufficient space | 459 | // make sure we have a buffer with sufficient space for the length plus the string without terminator. |
| 402 | hr = EnsureBufferSize(ppbBuffer, *piBuffer + (sizeof(SIZE_T) + cb)); | 460 | hr = EnsureBufferSize(ppbBuffer, *piBuffer + sizeof(DWORD) + cb); |
| 403 | BuffExitOnFailure(hr, "Failed to ensure buffer size."); | 461 | BuffExitOnFailure(hr, "Failed to ensure buffer size."); |
| 404 | 462 | ||
| 405 | // copy character count to buffer | 463 | // copy the character count to buffer as a DWORD |
| 406 | *(SIZE_T*)(*ppbBuffer + *piBuffer) = cch; | 464 | *reinterpret_cast<DWORD*>(*ppbBuffer + *piBuffer) = cch; |
| 407 | *piBuffer += sizeof(SIZE_T); | 465 | *piBuffer += sizeof(DWORD); |
| 408 | 466 | ||
| 409 | // copy data to buffer | 467 | // copy data to buffer |
| 410 | err = memcpy_s(*ppbBuffer + *piBuffer, cb, scz, cb); | 468 | err = memcpy_s(*ppbBuffer + *piBuffer, cb, scz, cb); |
| @@ -429,25 +487,35 @@ extern "C" HRESULT BuffWriteStringAnsi( | |||
| 429 | Assert(piBuffer); | 487 | Assert(piBuffer); |
| 430 | 488 | ||
| 431 | HRESULT hr = S_OK; | 489 | HRESULT hr = S_OK; |
| 432 | SIZE_T cch = 0; | 490 | DWORD cch = 0; // This value *MUST* be treated as a DWORD to be marshalled over the pipe between 32-bit and 64-bit process the same. |
| 433 | SIZE_T cb = 0; | 491 | SIZE_T cb = 0; |
| 434 | errno_t err = 0; | 492 | errno_t err = 0; |
| 435 | 493 | ||
| 436 | if (scz) | 494 | if (scz) |
| 437 | { | 495 | { |
| 438 | hr = ::StringCchLengthA(scz, STRSAFE_MAX_CCH, reinterpret_cast<size_t*>(&cch)); | 496 | size_t size = 0; |
| 439 | BuffExitOnRootFailure(hr, "Failed to get string size.") | 497 | |
| 498 | hr = ::StringCchLengthA(scz, STRSAFE_MAX_CCH, &size); | ||
| 499 | BuffExitOnRootFailure(hr, "Failed to get ANSI string size.") | ||
| 500 | |||
| 501 | if (size > DWORD_MAX) | ||
| 502 | { | ||
| 503 | hr = E_INVALIDARG; | ||
| 504 | BuffExitOnRootFailure(hr, "ANSI string too long to write to buffer."); | ||
| 505 | } | ||
| 506 | |||
| 507 | cch = static_cast<DWORD>(size); | ||
| 440 | } | 508 | } |
| 441 | 509 | ||
| 442 | cb = cch * sizeof(CHAR); | 510 | cb = cch * sizeof(CHAR); |
| 443 | 511 | ||
| 444 | // make sure we have a buffer with sufficient space | 512 | // make sure we have a buffer with sufficient space |
| 445 | hr = EnsureBufferSize(ppbBuffer, *piBuffer + (sizeof(SIZE_T) + cb)); | 513 | hr = EnsureBufferSize(ppbBuffer, *piBuffer + (sizeof(DWORD) + cb)); |
| 446 | BuffExitOnFailure(hr, "Failed to ensure buffer size."); | 514 | BuffExitOnFailure(hr, "Failed to ensure buffer size."); |
| 447 | 515 | ||
| 448 | // copy character count to buffer | 516 | // copy character count to buffer |
| 449 | *(SIZE_T*)(*ppbBuffer + *piBuffer) = cch; | 517 | *reinterpret_cast<DWORD*>(*ppbBuffer + *piBuffer) = cch; |
| 450 | *piBuffer += sizeof(SIZE_T); | 518 | *piBuffer += sizeof(DWORD); |
| 451 | 519 | ||
| 452 | // copy data to buffer | 520 | // copy data to buffer |
| 453 | err = memcpy_s(*ppbBuffer + *piBuffer, cb, scz, cb); | 521 | err = memcpy_s(*ppbBuffer + *piBuffer, cb, scz, cb); |
| @@ -474,30 +542,143 @@ extern "C" HRESULT BuffWriteStream( | |||
| 474 | Assert(pbStream); | 542 | Assert(pbStream); |
| 475 | 543 | ||
| 476 | HRESULT hr = S_OK; | 544 | HRESULT hr = S_OK; |
| 477 | SIZE_T cb = cbStream; | 545 | DWORD cb = 0; |
| 478 | errno_t err = 0; | 546 | errno_t err = 0; |
| 479 | 547 | ||
| 548 | if (cbStream > DWORD_MAX) | ||
| 549 | { | ||
| 550 | hr = E_INVALIDARG; | ||
| 551 | BuffExitOnRootFailure(hr, "Stream too large to write to buffer."); | ||
| 552 | } | ||
| 553 | |||
| 554 | cb = static_cast<DWORD>(cbStream); | ||
| 555 | |||
| 480 | // make sure we have a buffer with sufficient space | 556 | // make sure we have a buffer with sufficient space |
| 481 | hr = EnsureBufferSize(ppbBuffer, *piBuffer + cbStream + sizeof(SIZE_T)); | 557 | hr = EnsureBufferSize(ppbBuffer, *piBuffer + cbStream + sizeof(DWORD)); |
| 482 | BuffExitOnFailure(hr, "Failed to ensure buffer size."); | 558 | BuffExitOnFailure(hr, "Failed to ensure buffer size."); |
| 483 | 559 | ||
| 484 | // copy byte count to buffer | 560 | // copy byte count to buffer |
| 485 | *(SIZE_T*)(*ppbBuffer + *piBuffer) = cb; | 561 | *reinterpret_cast<DWORD*>(*ppbBuffer + *piBuffer) = cb; |
| 486 | *piBuffer += sizeof(SIZE_T); | 562 | *piBuffer += sizeof(DWORD); |
| 487 | 563 | ||
| 488 | // copy data to buffer | 564 | if (cbStream) |
| 489 | err = memcpy_s(*ppbBuffer + *piBuffer, cbStream, pbStream, cbStream); | ||
| 490 | if (err) | ||
| 491 | { | 565 | { |
| 492 | BuffExitOnRootFailure(hr = E_INVALIDARG, "Failed to write stream to buffer, error: %d", err); | 566 | // copy data to buffer |
| 493 | } | 567 | err = memcpy_s(*ppbBuffer + *piBuffer, cbStream, pbStream, cbStream); |
| 568 | if (err) | ||
| 569 | { | ||
| 570 | BuffExitOnRootFailure(hr = E_INVALIDARG, "Failed to write stream to buffer, error: %d", err); | ||
| 571 | } | ||
| 494 | 572 | ||
| 495 | *piBuffer += cbStream; | 573 | *piBuffer += cbStream; |
| 574 | } | ||
| 496 | 575 | ||
| 497 | LExit: | 576 | LExit: |
| 498 | return hr; | 577 | return hr; |
| 499 | } | 578 | } |
| 500 | 579 | ||
| 580 | // Buffer-based write functions | ||
| 581 | |||
| 582 | extern "C" HRESULT BuffWriteNumberToBuffer( | ||
| 583 | __in BUFF_BUFFER* pBuffer, | ||
| 584 | __out DWORD dw | ||
| 585 | ) | ||
| 586 | { | ||
| 587 | return BuffWriteNumber(&pBuffer->pbData, &pBuffer->cbData, dw); | ||
| 588 | } | ||
| 589 | |||
| 590 | extern "C" HRESULT BuffWriteNumber64ToBuffer( | ||
| 591 | __in BUFF_BUFFER* pBuffer, | ||
| 592 | __out DWORD64 dw64 | ||
| 593 | ) | ||
| 594 | { | ||
| 595 | return BuffWriteNumber64(&pBuffer->pbData, &pBuffer->cbData, dw64); | ||
| 596 | } | ||
| 597 | |||
| 598 | extern "C" HRESULT BuffWritePointerToBuffer( | ||
| 599 | __in BUFF_BUFFER* pBuffer, | ||
| 600 | __out DWORD_PTR dw | ||
| 601 | ) | ||
| 602 | { | ||
| 603 | return BuffWritePointer(&pBuffer->pbData, &pBuffer->cbData, dw); | ||
| 604 | } | ||
| 605 | |||
| 606 | extern "C" HRESULT BuffWriteStringToBuffer( | ||
| 607 | __in BUFF_BUFFER* pBuffer, | ||
| 608 | __in_z_opt LPCWSTR scz | ||
| 609 | ) | ||
| 610 | { | ||
| 611 | return BuffWriteString(&pBuffer->pbData, &pBuffer->cbData, scz); | ||
| 612 | } | ||
| 613 | |||
| 614 | extern "C" HRESULT BuffWriteStringAnsiToBuffer( | ||
| 615 | __in BUFF_BUFFER* pBuffer, | ||
| 616 | __in_z_opt LPCSTR scz | ||
| 617 | ) | ||
| 618 | { | ||
| 619 | return BuffWriteStringAnsi(&pBuffer->pbData, &pBuffer->cbData, scz); | ||
| 620 | } | ||
| 621 | |||
| 622 | extern "C" HRESULT BuffWriteStreamToBuffer( | ||
| 623 | __in BUFF_BUFFER* pBuffer, | ||
| 624 | __in_bcount(cbStream) const BYTE* pbStream, | ||
| 625 | __in SIZE_T cbStream | ||
| 626 | ) | ||
| 627 | { | ||
| 628 | return BuffWriteStream(&pBuffer->pbData, &pBuffer->cbData, pbStream, cbStream); | ||
| 629 | } | ||
| 630 | |||
| 631 | // Buffer Writer write functions | ||
| 632 | |||
| 633 | extern "C" HRESULT BuffWriterWriteNumber( | ||
| 634 | __in BUFF_WRITER* pWriter, | ||
| 635 | __out DWORD dw | ||
| 636 | ) | ||
| 637 | { | ||
| 638 | return BuffWriteNumber(pWriter->ppbData, pWriter->pcbData, dw); | ||
| 639 | } | ||
| 640 | |||
| 641 | extern "C" HRESULT BuffWriterWriteNumber64( | ||
| 642 | __in BUFF_WRITER* pWriter, | ||
| 643 | __out DWORD64 dw64 | ||
| 644 | ) | ||
| 645 | { | ||
| 646 | return BuffWriteNumber64(pWriter->ppbData, pWriter->pcbData, dw64); | ||
| 647 | } | ||
| 648 | |||
| 649 | extern "C" HRESULT BuffWriterWritePointer( | ||
| 650 | __in BUFF_WRITER* pWriter, | ||
| 651 | __out DWORD_PTR dw | ||
| 652 | ) | ||
| 653 | { | ||
| 654 | return BuffWritePointer(pWriter->ppbData, pWriter->pcbData, dw); | ||
| 655 | } | ||
| 656 | |||
| 657 | extern "C" HRESULT BuffWriterWriteString( | ||
| 658 | __in BUFF_WRITER* pWriter, | ||
| 659 | __in_z_opt LPCWSTR scz | ||
| 660 | ) | ||
| 661 | { | ||
| 662 | return BuffWriteString(pWriter->ppbData, pWriter->pcbData, scz); | ||
| 663 | } | ||
| 664 | |||
| 665 | extern "C" HRESULT BuffWriterWriteStringAnsi( | ||
| 666 | __in BUFF_WRITER* pWriter, | ||
| 667 | __in_z_opt LPCSTR scz | ||
| 668 | ) | ||
| 669 | { | ||
| 670 | return BuffWriteStringAnsi(pWriter->ppbData, pWriter->pcbData, scz); | ||
| 671 | } | ||
| 672 | |||
| 673 | extern "C" HRESULT BuffWriterWriteStream( | ||
| 674 | __in BUFF_WRITER* pWriter, | ||
| 675 | __in_bcount(cbStream) const BYTE* pbStream, | ||
| 676 | __in SIZE_T cbStream | ||
| 677 | ) | ||
| 678 | { | ||
| 679 | return BuffWriteStream(pWriter->ppbData, pWriter->pcbData, pbStream, cbStream); | ||
| 680 | } | ||
| 681 | |||
| 501 | 682 | ||
| 502 | // helper functions | 683 | // helper functions |
| 503 | 684 | ||
