diff options
Diffstat (limited to 'src/dutil/wiutil.cpp')
| -rw-r--r-- | src/dutil/wiutil.cpp | 121 |
1 files changed, 68 insertions, 53 deletions
diff --git a/src/dutil/wiutil.cpp b/src/dutil/wiutil.cpp index 7336d685..ffbfe85a 100644 --- a/src/dutil/wiutil.cpp +++ b/src/dutil/wiutil.cpp | |||
| @@ -3,6 +3,21 @@ | |||
| 3 | #include "precomp.h" | 3 | #include "precomp.h" |
| 4 | 4 | ||
| 5 | 5 | ||
| 6 | // Exit macros | ||
| 7 | #define WiuExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_WIUTIL, x, s, __VA_ARGS__) | ||
| 8 | #define WiuExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_WIUTIL, x, s, __VA_ARGS__) | ||
| 9 | #define WiuExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_WIUTIL, x, s, __VA_ARGS__) | ||
| 10 | #define WiuExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_WIUTIL, x, s, __VA_ARGS__) | ||
| 11 | #define WiuExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_WIUTIL, x, s, __VA_ARGS__) | ||
| 12 | #define WiuExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_WIUTIL, x, s, __VA_ARGS__) | ||
| 13 | #define WiuExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_WIUTIL, p, x, e, s, __VA_ARGS__) | ||
| 14 | #define WiuExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_WIUTIL, p, x, s, __VA_ARGS__) | ||
| 15 | #define WiuExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_WIUTIL, p, x, e, s, __VA_ARGS__) | ||
| 16 | #define WiuExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_WIUTIL, p, x, s, __VA_ARGS__) | ||
| 17 | #define WiuExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_WIUTIL, e, x, s, __VA_ARGS__) | ||
| 18 | #define WiuExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_WIUTIL, g, x, s, __VA_ARGS__) | ||
| 19 | |||
| 20 | |||
| 6 | // constants | 21 | // constants |
| 7 | 22 | ||
| 8 | const DWORD WIU_MSI_PROGRESS_INVALID = 0xFFFFFFFF; | 23 | const DWORD WIU_MSI_PROGRESS_INVALID = 0xFFFFFFFF; |
| @@ -112,8 +127,8 @@ static DWORD CalculatePhaseProgress( | |||
| 112 | __in DWORD dwWeightPercentage | 127 | __in DWORD dwWeightPercentage |
| 113 | ); | 128 | ); |
| 114 | void InitializeMessageData( | 129 | void InitializeMessageData( |
| 115 | __in MSIHANDLE hRecord, | 130 | __in_opt MSIHANDLE hRecord, |
| 116 | __out LPWSTR** prgsczData, | 131 | __deref_out_ecount(*pcData) LPWSTR** prgsczData, |
| 117 | __out DWORD* pcData | 132 | __out DWORD* pcData |
| 118 | ); | 133 | ); |
| 119 | void UninitializeMessageData( | 134 | void UninitializeMessageData( |
| @@ -133,7 +148,7 @@ extern "C" HRESULT DAPI WiuInitialize( | |||
| 133 | LPWSTR sczMsiDllPath = NULL; | 148 | LPWSTR sczMsiDllPath = NULL; |
| 134 | 149 | ||
| 135 | hr = LoadSystemLibraryWithPath(L"Msi.dll", &vhMsiDll, &sczMsiDllPath); | 150 | hr = LoadSystemLibraryWithPath(L"Msi.dll", &vhMsiDll, &sczMsiDllPath); |
| 136 | ExitOnFailure(hr, "Failed to load Msi.DLL"); | 151 | WiuExitOnFailure(hr, "Failed to load Msi.DLL"); |
| 137 | 152 | ||
| 138 | // Ignore failures | 153 | // Ignore failures |
| 139 | FileVersion(sczMsiDllPath, &vdwMsiDllMajorMinor, &vdwMsiDllBuildRevision); | 154 | FileVersion(sczMsiDllPath, &vdwMsiDllMajorMinor, &vdwMsiDllBuildRevision); |
| @@ -275,7 +290,7 @@ extern "C" HRESULT DAPI WiuGetComponentPath( | |||
| 275 | DWORD cchCompare; | 290 | DWORD cchCompare; |
| 276 | 291 | ||
| 277 | hr = StrAlloc(psczValue, cch); | 292 | hr = StrAlloc(psczValue, cch); |
| 278 | ExitOnFailure(hr, "Failed to allocate string for component path."); | 293 | WiuExitOnFailure(hr, "Failed to allocate string for component path."); |
| 279 | 294 | ||
| 280 | cchCompare = cch; | 295 | cchCompare = cch; |
| 281 | *pInstallState = vpfnMsiGetComponentPathW(wzProductCode, wzComponentId, *psczValue, &cch); | 296 | *pInstallState = vpfnMsiGetComponentPathW(wzProductCode, wzComponentId, *psczValue, &cch); |
| @@ -283,7 +298,7 @@ extern "C" HRESULT DAPI WiuGetComponentPath( | |||
| 283 | { | 298 | { |
| 284 | ++cch; | 299 | ++cch; |
| 285 | hr = StrAlloc(psczValue, cch); | 300 | hr = StrAlloc(psczValue, cch); |
| 286 | ExitOnFailure(hr, "Failed to reallocate string for component path."); | 301 | WiuExitOnFailure(hr, "Failed to reallocate string for component path."); |
| 287 | 302 | ||
| 288 | cchCompare = cch; | 303 | cchCompare = cch; |
| 289 | *pInstallState = vpfnMsiGetComponentPathW(wzProductCode, wzComponentId, *psczValue, &cch); | 304 | *pInstallState = vpfnMsiGetComponentPathW(wzProductCode, wzComponentId, *psczValue, &cch); |
| @@ -292,7 +307,7 @@ extern "C" HRESULT DAPI WiuGetComponentPath( | |||
| 292 | if (INSTALLSTATE_INVALIDARG == *pInstallState) | 307 | if (INSTALLSTATE_INVALIDARG == *pInstallState) |
| 293 | { | 308 | { |
| 294 | hr = E_INVALIDARG; | 309 | hr = E_INVALIDARG; |
| 295 | ExitOnRootFailure(hr, "Invalid argument when getting component path."); | 310 | WiuExitOnRootFailure(hr, "Invalid argument when getting component path."); |
| 296 | } | 311 | } |
| 297 | else if (INSTALLSTATE_UNKNOWN == *pInstallState) | 312 | else if (INSTALLSTATE_UNKNOWN == *pInstallState) |
| 298 | { | 313 | { |
| @@ -306,7 +321,7 @@ extern "C" HRESULT DAPI WiuGetComponentPath( | |||
| 306 | { | 321 | { |
| 307 | ++cch; | 322 | ++cch; |
| 308 | hr = StrAlloc(psczValue, cch); | 323 | hr = StrAlloc(psczValue, cch); |
| 309 | ExitOnFailure(hr, "Failed to reallocate string for component path."); | 324 | WiuExitOnFailure(hr, "Failed to reallocate string for component path."); |
| 310 | 325 | ||
| 311 | *pInstallState = vpfnMsiGetComponentPathW(wzProductCode, wzComponentId, *psczValue, &cch); | 326 | *pInstallState = vpfnMsiGetComponentPathW(wzProductCode, wzComponentId, *psczValue, &cch); |
| 312 | } | 327 | } |
| @@ -327,7 +342,7 @@ extern "C" HRESULT DAPI WiuLocateComponent( | |||
| 327 | DWORD cchCompare; | 342 | DWORD cchCompare; |
| 328 | 343 | ||
| 329 | hr = StrAlloc(psczValue, cch); | 344 | hr = StrAlloc(psczValue, cch); |
| 330 | ExitOnFailure(hr, "Failed to allocate string for component path."); | 345 | WiuExitOnFailure(hr, "Failed to allocate string for component path."); |
| 331 | 346 | ||
| 332 | cchCompare = cch; | 347 | cchCompare = cch; |
| 333 | *pInstallState = vpfnMsiLocateComponentW(wzComponentId, *psczValue, &cch); | 348 | *pInstallState = vpfnMsiLocateComponentW(wzComponentId, *psczValue, &cch); |
| @@ -335,7 +350,7 @@ extern "C" HRESULT DAPI WiuLocateComponent( | |||
| 335 | { | 350 | { |
| 336 | ++cch; | 351 | ++cch; |
| 337 | hr = StrAlloc(psczValue, cch); | 352 | hr = StrAlloc(psczValue, cch); |
| 338 | ExitOnFailure(hr, "Failed to reallocate string for component path."); | 353 | WiuExitOnFailure(hr, "Failed to reallocate string for component path."); |
| 339 | 354 | ||
| 340 | cchCompare = cch; | 355 | cchCompare = cch; |
| 341 | *pInstallState = vpfnMsiLocateComponentW(wzComponentId, *psczValue, &cch); | 356 | *pInstallState = vpfnMsiLocateComponentW(wzComponentId, *psczValue, &cch); |
| @@ -344,7 +359,7 @@ extern "C" HRESULT DAPI WiuLocateComponent( | |||
| 344 | if (INSTALLSTATE_INVALIDARG == *pInstallState) | 359 | if (INSTALLSTATE_INVALIDARG == *pInstallState) |
| 345 | { | 360 | { |
| 346 | hr = E_INVALIDARG; | 361 | hr = E_INVALIDARG; |
| 347 | ExitOnRootFailure(hr, "Invalid argument when locating component."); | 362 | WiuExitOnRootFailure(hr, "Invalid argument when locating component."); |
| 348 | } | 363 | } |
| 349 | else if (INSTALLSTATE_UNKNOWN == *pInstallState) | 364 | else if (INSTALLSTATE_UNKNOWN == *pInstallState) |
| 350 | { | 365 | { |
| @@ -358,7 +373,7 @@ extern "C" HRESULT DAPI WiuLocateComponent( | |||
| 358 | { | 373 | { |
| 359 | ++cch; | 374 | ++cch; |
| 360 | hr = StrAlloc(psczValue, cch); | 375 | hr = StrAlloc(psczValue, cch); |
| 361 | ExitOnFailure(hr, "Failed to reallocate string for component path."); | 376 | WiuExitOnFailure(hr, "Failed to reallocate string for component path."); |
| 362 | 377 | ||
| 363 | *pInstallState = vpfnMsiLocateComponentW(wzComponentId, *psczValue, &cch); | 378 | *pInstallState = vpfnMsiLocateComponentW(wzComponentId, *psczValue, &cch); |
| 364 | } | 379 | } |
| @@ -380,7 +395,7 @@ extern "C" HRESULT DAPI WiuQueryFeatureState( | |||
| 380 | if (INSTALLSTATE_INVALIDARG == *pInstallState) | 395 | if (INSTALLSTATE_INVALIDARG == *pInstallState) |
| 381 | { | 396 | { |
| 382 | hr = E_INVALIDARG; | 397 | hr = E_INVALIDARG; |
| 383 | ExitOnRootFailure(hr, "Failed to query state of feature: %ls in product: %ls", wzFeature, wzProduct); | 398 | WiuExitOnRootFailure(hr, "Failed to query state of feature: %ls in product: %ls", wzFeature, wzProduct); |
| 384 | } | 399 | } |
| 385 | 400 | ||
| 386 | LExit: | 401 | LExit: |
| @@ -399,18 +414,18 @@ extern "C" HRESULT DAPI WiuGetProductInfo( | |||
| 399 | DWORD cch = WIU_GOOD_ENOUGH_PROPERTY_LENGTH; | 414 | DWORD cch = WIU_GOOD_ENOUGH_PROPERTY_LENGTH; |
| 400 | 415 | ||
| 401 | hr = StrAlloc(psczValue, cch); | 416 | hr = StrAlloc(psczValue, cch); |
| 402 | ExitOnFailure(hr, "Failed to allocate string for product info."); | 417 | WiuExitOnFailure(hr, "Failed to allocate string for product info."); |
| 403 | 418 | ||
| 404 | er = vpfnMsiGetProductInfoW(wzProductCode, wzProperty, *psczValue, &cch); | 419 | er = vpfnMsiGetProductInfoW(wzProductCode, wzProperty, *psczValue, &cch); |
| 405 | if (ERROR_MORE_DATA == er) | 420 | if (ERROR_MORE_DATA == er) |
| 406 | { | 421 | { |
| 407 | ++cch; | 422 | ++cch; |
| 408 | hr = StrAlloc(psczValue, cch); | 423 | hr = StrAlloc(psczValue, cch); |
| 409 | ExitOnFailure(hr, "Failed to reallocate string for product info."); | 424 | WiuExitOnFailure(hr, "Failed to reallocate string for product info."); |
| 410 | 425 | ||
| 411 | er = vpfnMsiGetProductInfoW(wzProductCode, wzProperty, *psczValue, &cch); | 426 | er = vpfnMsiGetProductInfoW(wzProductCode, wzProperty, *psczValue, &cch); |
| 412 | } | 427 | } |
| 413 | ExitOnWin32Error(er, hr, "Failed to get product info."); | 428 | WiuExitOnWin32Error(er, hr, "Failed to get product info."); |
| 414 | 429 | ||
| 415 | LExit: | 430 | LExit: |
| 416 | return hr; | 431 | return hr; |
| @@ -432,24 +447,24 @@ extern "C" HRESULT DAPI WiuGetProductInfoEx( | |||
| 432 | if (!vpfnMsiGetProductInfoExW) | 447 | if (!vpfnMsiGetProductInfoExW) |
| 433 | { | 448 | { |
| 434 | hr = WiuGetProductInfo(wzProductCode, wzProperty, psczValue); | 449 | hr = WiuGetProductInfo(wzProductCode, wzProperty, psczValue); |
| 435 | ExitOnFailure(hr, "Failed to get product info when extended info was not available."); | 450 | WiuExitOnFailure(hr, "Failed to get product info when extended info was not available."); |
| 436 | 451 | ||
| 437 | ExitFunction(); | 452 | ExitFunction(); |
| 438 | } | 453 | } |
| 439 | 454 | ||
| 440 | hr = StrAlloc(psczValue, cch); | 455 | hr = StrAlloc(psczValue, cch); |
| 441 | ExitOnFailure(hr, "Failed to allocate string for extended product info."); | 456 | WiuExitOnFailure(hr, "Failed to allocate string for extended product info."); |
| 442 | 457 | ||
| 443 | er = vpfnMsiGetProductInfoExW(wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); | 458 | er = vpfnMsiGetProductInfoExW(wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); |
| 444 | if (ERROR_MORE_DATA == er) | 459 | if (ERROR_MORE_DATA == er) |
| 445 | { | 460 | { |
| 446 | ++cch; | 461 | ++cch; |
| 447 | hr = StrAlloc(psczValue, cch); | 462 | hr = StrAlloc(psczValue, cch); |
| 448 | ExitOnFailure(hr, "Failed to reallocate string for extended product info."); | 463 | WiuExitOnFailure(hr, "Failed to reallocate string for extended product info."); |
| 449 | 464 | ||
| 450 | er = vpfnMsiGetProductInfoExW(wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); | 465 | er = vpfnMsiGetProductInfoExW(wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); |
| 451 | } | 466 | } |
| 452 | ExitOnWin32Error(er, hr, "Failed to get extended product info."); | 467 | WiuExitOnWin32Error(er, hr, "Failed to get extended product info."); |
| 453 | 468 | ||
| 454 | LExit: | 469 | LExit: |
| 455 | return hr; | 470 | return hr; |
| @@ -467,18 +482,18 @@ extern "C" HRESULT DAPI WiuGetProductProperty( | |||
| 467 | DWORD cch = WIU_GOOD_ENOUGH_PROPERTY_LENGTH; | 482 | DWORD cch = WIU_GOOD_ENOUGH_PROPERTY_LENGTH; |
| 468 | 483 | ||
| 469 | hr = StrAlloc(psczValue, cch); | 484 | hr = StrAlloc(psczValue, cch); |
| 470 | ExitOnFailure(hr, "Failed to allocate string for product property."); | 485 | WiuExitOnFailure(hr, "Failed to allocate string for product property."); |
| 471 | 486 | ||
| 472 | er = ::MsiGetProductPropertyW(hProduct, wzProperty, *psczValue, &cch); | 487 | er = ::MsiGetProductPropertyW(hProduct, wzProperty, *psczValue, &cch); |
| 473 | if (ERROR_MORE_DATA == er) | 488 | if (ERROR_MORE_DATA == er) |
| 474 | { | 489 | { |
| 475 | ++cch; | 490 | ++cch; |
| 476 | hr = StrAlloc(psczValue, cch); | 491 | hr = StrAlloc(psczValue, cch); |
| 477 | ExitOnFailure(hr, "Failed to reallocate string for product property."); | 492 | WiuExitOnFailure(hr, "Failed to reallocate string for product property."); |
| 478 | 493 | ||
| 479 | er = ::MsiGetProductPropertyW(hProduct, wzProperty, *psczValue, &cch); | 494 | er = ::MsiGetProductPropertyW(hProduct, wzProperty, *psczValue, &cch); |
| 480 | } | 495 | } |
| 481 | ExitOnWin32Error(er, hr, "Failed to get product property."); | 496 | WiuExitOnWin32Error(er, hr, "Failed to get product property."); |
| 482 | 497 | ||
| 483 | LExit: | 498 | LExit: |
| 484 | return hr; | 499 | return hr; |
| @@ -504,18 +519,18 @@ extern "C" HRESULT DAPI WiuGetPatchInfoEx( | |||
| 504 | } | 519 | } |
| 505 | 520 | ||
| 506 | hr = StrAlloc(psczValue, cch); | 521 | hr = StrAlloc(psczValue, cch); |
| 507 | ExitOnFailure(hr, "Failed to allocate string for extended patch info."); | 522 | WiuExitOnFailure(hr, "Failed to allocate string for extended patch info."); |
| 508 | 523 | ||
| 509 | er = vpfnMsiGetPatchInfoExW(wzPatchCode, wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); | 524 | er = vpfnMsiGetPatchInfoExW(wzPatchCode, wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); |
| 510 | if (ERROR_MORE_DATA == er) | 525 | if (ERROR_MORE_DATA == er) |
| 511 | { | 526 | { |
| 512 | ++cch; | 527 | ++cch; |
| 513 | hr = StrAlloc(psczValue, cch); | 528 | hr = StrAlloc(psczValue, cch); |
| 514 | ExitOnFailure(hr, "Failed to reallocate string for extended patch info."); | 529 | WiuExitOnFailure(hr, "Failed to reallocate string for extended patch info."); |
| 515 | 530 | ||
| 516 | er = vpfnMsiGetPatchInfoExW(wzPatchCode, wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); | 531 | er = vpfnMsiGetPatchInfoExW(wzPatchCode, wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); |
| 517 | } | 532 | } |
| 518 | ExitOnWin32Error(er, hr, "Failed to get extended patch info."); | 533 | WiuExitOnWin32Error(er, hr, "Failed to get extended patch info."); |
| 519 | 534 | ||
| 520 | LExit: | 535 | LExit: |
| 521 | return hr; | 536 | return hr; |
| @@ -539,7 +554,7 @@ extern "C" HRESULT DAPI WiuDeterminePatchSequence( | |||
| 539 | } | 554 | } |
| 540 | 555 | ||
| 541 | er = vpfnMsiDeterminePatchSequenceW(wzProductCode, wzUserSid, context, cPatchInfo, pPatchInfo); | 556 | er = vpfnMsiDeterminePatchSequenceW(wzProductCode, wzUserSid, context, cPatchInfo, pPatchInfo); |
| 542 | ExitOnWin32Error(er, hr, "Failed to determine patch sequence for product code."); | 557 | WiuExitOnWin32Error(er, hr, "Failed to determine patch sequence for product code."); |
| 543 | 558 | ||
| 544 | LExit: | 559 | LExit: |
| 545 | return hr; | 560 | return hr; |
| @@ -561,7 +576,7 @@ extern "C" HRESULT DAPI WiuDetermineApplicablePatches( | |||
| 561 | } | 576 | } |
| 562 | 577 | ||
| 563 | er = vpfnMsiDetermineApplicablePatchesW(wzProductPackagePath, cPatchInfo, pPatchInfo); | 578 | er = vpfnMsiDetermineApplicablePatchesW(wzProductPackagePath, cPatchInfo, pPatchInfo); |
| 564 | ExitOnWin32Error(er, hr, "Failed to determine applicable patches for product package."); | 579 | WiuExitOnWin32Error(er, hr, "Failed to determine applicable patches for product package."); |
| 565 | 580 | ||
| 566 | LExit: | 581 | LExit: |
| 567 | return hr; | 582 | return hr; |
| @@ -581,7 +596,7 @@ extern "C" HRESULT DAPI WiuEnumProducts( | |||
| 581 | { | 596 | { |
| 582 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); | 597 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); |
| 583 | } | 598 | } |
| 584 | ExitOnWin32Error(er, hr, "Failed to enumerate products."); | 599 | WiuExitOnWin32Error(er, hr, "Failed to enumerate products."); |
| 585 | 600 | ||
| 586 | LExit: | 601 | LExit: |
| 587 | return hr; | 602 | return hr; |
| @@ -612,7 +627,7 @@ extern "C" HRESULT DAPI WiuEnumProductsEx( | |||
| 612 | { | 627 | { |
| 613 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); | 628 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); |
| 614 | } | 629 | } |
| 615 | ExitOnWin32Error(er, hr, "Failed to enumerate products."); | 630 | WiuExitOnWin32Error(er, hr, "Failed to enumerate products."); |
| 616 | 631 | ||
| 617 | LExit: | 632 | LExit: |
| 618 | return hr; | 633 | return hr; |
| @@ -633,7 +648,7 @@ extern "C" HRESULT DAPI WiuEnumRelatedProducts( | |||
| 633 | { | 648 | { |
| 634 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); | 649 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); |
| 635 | } | 650 | } |
| 636 | ExitOnWin32Error(er, hr, "Failed to enumerate related products for updgrade code: %ls", wzUpgradeCode); | 651 | WiuExitOnWin32Error(er, hr, "Failed to enumerate related products for updgrade code: %ls", wzUpgradeCode); |
| 637 | 652 | ||
| 638 | LExit: | 653 | LExit: |
| 639 | return hr; | 654 | return hr; |
| @@ -650,7 +665,7 @@ LExit: | |||
| 650 | ********************************************************************/ | 665 | ********************************************************************/ |
| 651 | extern "C" HRESULT DAPI WiuEnumRelatedProductCodes( | 666 | extern "C" HRESULT DAPI WiuEnumRelatedProductCodes( |
| 652 | __in_z LPCWSTR wzUpgradeCode, | 667 | __in_z LPCWSTR wzUpgradeCode, |
| 653 | __deref_out_ecount_opt(pcRelatedProducts) LPWSTR** prgsczProductCodes, | 668 | __deref_out_ecount_opt(*pcRelatedProducts) LPWSTR** prgsczProductCodes, |
| 654 | __out DWORD* pcRelatedProducts, | 669 | __out DWORD* pcRelatedProducts, |
| 655 | __in BOOL fReturnHighestVersionOnly | 670 | __in BOOL fReturnHighestVersionOnly |
| 656 | ) | 671 | ) |
| @@ -673,16 +688,16 @@ extern "C" HRESULT DAPI WiuEnumRelatedProductCodes( | |||
| 673 | hr = S_OK; | 688 | hr = S_OK; |
| 674 | break; | 689 | break; |
| 675 | } | 690 | } |
| 676 | ExitOnFailure(hr, "Failed to enumerate related products for upgrade code: %ls", wzUpgradeCode); | 691 | WiuExitOnFailure(hr, "Failed to enumerate related products for upgrade code: %ls", wzUpgradeCode); |
| 677 | 692 | ||
| 678 | if (fReturnHighestVersionOnly) | 693 | if (fReturnHighestVersionOnly) |
| 679 | { | 694 | { |
| 680 | // get the version | 695 | // get the version |
| 681 | hr = WiuGetProductInfo(wzCurrentProductCode, L"VersionString", &sczInstalledVersion); | 696 | hr = WiuGetProductInfo(wzCurrentProductCode, L"VersionString", &sczInstalledVersion); |
| 682 | ExitOnFailure(hr, "Failed to get version for product code: %ls", wzCurrentProductCode); | 697 | WiuExitOnFailure(hr, "Failed to get version for product code: %ls", wzCurrentProductCode); |
| 683 | 698 | ||
| 684 | hr = FileVersionFromStringEx(sczInstalledVersion, 0, &qwCurrentVersion); | 699 | hr = FileVersionFromStringEx(sczInstalledVersion, 0, &qwCurrentVersion); |
| 685 | ExitOnFailure(hr, "Failed to convert version: %ls to DWORD64 for product code: %ls", sczInstalledVersion, wzCurrentProductCode); | 700 | WiuExitOnFailure(hr, "Failed to convert version: %ls to DWORD64 for product code: %ls", sczInstalledVersion, wzCurrentProductCode); |
| 686 | 701 | ||
| 687 | // if this is the first product found then it is the highest version (for now) | 702 | // if this is the first product found then it is the highest version (for now) |
| 688 | if (0 == *pcRelatedProducts) | 703 | if (0 == *pcRelatedProducts) |
| @@ -698,7 +713,7 @@ extern "C" HRESULT DAPI WiuEnumRelatedProductCodes( | |||
| 698 | qwHighestVersion = qwCurrentVersion; | 713 | qwHighestVersion = qwCurrentVersion; |
| 699 | 714 | ||
| 700 | hr = StrAllocString(prgsczProductCodes[0], wzCurrentProductCode, 0); | 715 | hr = StrAllocString(prgsczProductCodes[0], wzCurrentProductCode, 0); |
| 701 | ExitOnFailure(hr, "Failed to update array with higher versioned product code."); | 716 | WiuExitOnFailure(hr, "Failed to update array with higher versioned product code."); |
| 702 | } | 717 | } |
| 703 | 718 | ||
| 704 | // continue here as we don't want anything else added to the list | 719 | // continue here as we don't want anything else added to the list |
| @@ -707,7 +722,7 @@ extern "C" HRESULT DAPI WiuEnumRelatedProductCodes( | |||
| 707 | } | 722 | } |
| 708 | 723 | ||
| 709 | hr = StrArrayAllocString(prgsczProductCodes, (LPUINT)(pcRelatedProducts), wzCurrentProductCode, 0); | 724 | hr = StrArrayAllocString(prgsczProductCodes, (LPUINT)(pcRelatedProducts), wzCurrentProductCode, 0); |
| 710 | ExitOnFailure(hr, "Failed to add product code to array."); | 725 | WiuExitOnFailure(hr, "Failed to add product code to array."); |
| 711 | } | 726 | } |
| 712 | 727 | ||
| 713 | LExit: | 728 | LExit: |
| @@ -726,7 +741,7 @@ extern "C" HRESULT DAPI WiuEnableLog( | |||
| 726 | DWORD er = ERROR_SUCCESS; | 741 | DWORD er = ERROR_SUCCESS; |
| 727 | 742 | ||
| 728 | er = vpfnMsiEnableLogW(dwLogMode, wzLogFile, dwLogAttributes); | 743 | er = vpfnMsiEnableLogW(dwLogMode, wzLogFile, dwLogAttributes); |
| 729 | ExitOnWin32Error(er, hr, "Failed to enable MSI internal logging."); | 744 | WiuExitOnWin32Error(er, hr, "Failed to enable MSI internal logging."); |
| 730 | 745 | ||
| 731 | LExit: | 746 | LExit: |
| 732 | return hr; | 747 | return hr; |
| @@ -780,7 +795,7 @@ extern "C" HRESULT DAPI WiuInitializeExternalUI( | |||
| 780 | 795 | ||
| 781 | // Wire the internal and external UI handler. | 796 | // Wire the internal and external UI handler. |
| 782 | hr = WiuInitializeInternalUI(internalUILevel, hwndParent, pExecuteContext); | 797 | hr = WiuInitializeInternalUI(internalUILevel, hwndParent, pExecuteContext); |
| 783 | ExitOnFailure(hr, "Failed to set internal UI level and window."); | 798 | WiuExitOnFailure(hr, "Failed to set internal UI level and window."); |
| 784 | 799 | ||
| 785 | pExecuteContext->fRollback = fRollback; | 800 | pExecuteContext->fRollback = fRollback; |
| 786 | pExecuteContext->pfnMessageHandler = pfnMessageHandler; | 801 | pExecuteContext->pfnMessageHandler = pfnMessageHandler; |
| @@ -791,7 +806,7 @@ extern "C" HRESULT DAPI WiuInitializeExternalUI( | |||
| 791 | if (vpfnMsiSetExternalUIRecord) | 806 | if (vpfnMsiSetExternalUIRecord) |
| 792 | { | 807 | { |
| 793 | er = vpfnMsiSetExternalUIRecord(InstallEngineRecordCallback, dwMessageFilter, pExecuteContext, &pExecuteContext->pfnPreviousExternalUIRecord); | 808 | er = vpfnMsiSetExternalUIRecord(InstallEngineRecordCallback, dwMessageFilter, pExecuteContext, &pExecuteContext->pfnPreviousExternalUIRecord); |
| 794 | ExitOnWin32Error(er, hr, "Failed to wire up external UI record handler."); | 809 | WiuExitOnWin32Error(er, hr, "Failed to wire up external UI record handler."); |
| 795 | pExecuteContext->fSetPreviousExternalUIRecord = TRUE; | 810 | pExecuteContext->fSetPreviousExternalUIRecord = TRUE; |
| 796 | } | 811 | } |
| 797 | else | 812 | else |
| @@ -841,7 +856,7 @@ extern "C" HRESULT DAPI WiuConfigureProductEx( | |||
| 841 | 856 | ||
| 842 | er = vpfnMsiConfigureProductExW(wzProduct, iInstallLevel, eInstallState, wzCommandLine); | 857 | er = vpfnMsiConfigureProductExW(wzProduct, iInstallLevel, eInstallState, wzCommandLine); |
| 843 | er = CheckForRestartErrorCode(er, pRestart); | 858 | er = CheckForRestartErrorCode(er, pRestart); |
| 844 | ExitOnWin32Error(er, hr, "Failed to configure product: %ls", wzProduct); | 859 | WiuExitOnWin32Error(er, hr, "Failed to configure product: %ls", wzProduct); |
| 845 | 860 | ||
| 846 | LExit: | 861 | LExit: |
| 847 | return hr; | 862 | return hr; |
| @@ -859,7 +874,7 @@ extern "C" HRESULT DAPI WiuInstallProduct( | |||
| 859 | 874 | ||
| 860 | er = vpfnMsiInstallProductW(wzPackagePath, wzCommandLine); | 875 | er = vpfnMsiInstallProductW(wzPackagePath, wzCommandLine); |
| 861 | er = CheckForRestartErrorCode(er, pRestart); | 876 | er = CheckForRestartErrorCode(er, pRestart); |
| 862 | ExitOnWin32Error(er, hr, "Failed to install product: %ls", wzPackagePath); | 877 | WiuExitOnWin32Error(er, hr, "Failed to install product: %ls", wzPackagePath); |
| 863 | 878 | ||
| 864 | LExit: | 879 | LExit: |
| 865 | return hr; | 880 | return hr; |
| @@ -878,7 +893,7 @@ extern "C" HRESULT DAPI WiuRemovePatches( | |||
| 878 | 893 | ||
| 879 | er = vpfnMsiRemovePatchesW(wzPatchList, wzProductCode, INSTALLTYPE_SINGLE_INSTANCE, wzPropertyList); | 894 | er = vpfnMsiRemovePatchesW(wzPatchList, wzProductCode, INSTALLTYPE_SINGLE_INSTANCE, wzPropertyList); |
| 880 | er = CheckForRestartErrorCode(er, pRestart); | 895 | er = CheckForRestartErrorCode(er, pRestart); |
| 881 | ExitOnWin32Error(er, hr, "Failed to remove patches."); | 896 | WiuExitOnWin32Error(er, hr, "Failed to remove patches."); |
| 882 | 897 | ||
| 883 | LExit: | 898 | LExit: |
| 884 | return hr; | 899 | return hr; |
| @@ -898,7 +913,7 @@ extern "C" HRESULT DAPI WiuSourceListAddSourceEx( | |||
| 898 | DWORD er = ERROR_SUCCESS; | 913 | DWORD er = ERROR_SUCCESS; |
| 899 | 914 | ||
| 900 | er = vpfnMsiSourceListAddSourceExW(wzProductCodeOrPatchCode, wzUserSid, dwContext, MSISOURCETYPE_NETWORK | dwCode, wzSource, dwIndex); | 915 | er = vpfnMsiSourceListAddSourceExW(wzProductCodeOrPatchCode, wzUserSid, dwContext, MSISOURCETYPE_NETWORK | dwCode, wzSource, dwIndex); |
| 901 | ExitOnWin32Error(er, hr, "Failed to add source."); | 916 | WiuExitOnWin32Error(er, hr, "Failed to add source."); |
| 902 | 917 | ||
| 903 | LExit: | 918 | LExit: |
| 904 | return hr; | 919 | return hr; |
| @@ -924,14 +939,14 @@ extern "C" HRESULT DAPI WiuBeginTransaction( | |||
| 924 | 939 | ||
| 925 | if (!WiuIsMsiTransactionSupported()) | 940 | if (!WiuIsMsiTransactionSupported()) |
| 926 | { | 941 | { |
| 927 | ExitOnFailure(hr = E_NOTIMPL, "Msi transactions are not supported"); | 942 | WiuExitOnFailure(hr = E_NOTIMPL, "Msi transactions are not supported"); |
| 928 | } | 943 | } |
| 929 | 944 | ||
| 930 | hr = WiuEnableLog(dwLogMode, szLogPath, INSTALLLOGATTRIBUTES_APPEND); | 945 | hr = WiuEnableLog(dwLogMode, szLogPath, INSTALLLOGATTRIBUTES_APPEND); |
| 931 | ExitOnFailure(hr, "Failed to enable logging for MSI transaction"); | 946 | WiuExitOnFailure(hr, "Failed to enable logging for MSI transaction"); |
| 932 | 947 | ||
| 933 | er = vpfnMsiBeginTransaction(szName, dwTransactionAttributes, phTransactionHandle, phChangeOfOwnerEvent); | 948 | er = vpfnMsiBeginTransaction(szName, dwTransactionAttributes, phTransactionHandle, phChangeOfOwnerEvent); |
| 934 | ExitOnWin32Error(er, hr, "Failed to begin transaction."); | 949 | WiuExitOnWin32Error(er, hr, "Failed to begin transaction."); |
| 935 | 950 | ||
| 936 | LExit: | 951 | LExit: |
| 937 | return hr; | 952 | return hr; |
| @@ -948,14 +963,14 @@ extern "C" HRESULT DAPI WiuEndTransaction( | |||
| 948 | 963 | ||
| 949 | if (!WiuIsMsiTransactionSupported()) | 964 | if (!WiuIsMsiTransactionSupported()) |
| 950 | { | 965 | { |
| 951 | ExitOnFailure(hr = E_NOTIMPL, "Msi transactions are not supported"); | 966 | WiuExitOnFailure(hr = E_NOTIMPL, "Msi transactions are not supported"); |
| 952 | } | 967 | } |
| 953 | 968 | ||
| 954 | hr = WiuEnableLog(dwLogMode, szLogPath, INSTALLLOGATTRIBUTES_APPEND); | 969 | hr = WiuEnableLog(dwLogMode, szLogPath, INSTALLLOGATTRIBUTES_APPEND); |
| 955 | ExitOnFailure(hr, "Failed to enable logging for MSI transaction"); | 970 | WiuExitOnFailure(hr, "Failed to enable logging for MSI transaction"); |
| 956 | 971 | ||
| 957 | er = vpfnMsiEndTransaction(dwTransactionState); | 972 | er = vpfnMsiEndTransaction(dwTransactionState); |
| 958 | ExitOnWin32Error(er, hr, "Failed to end transaction."); | 973 | WiuExitOnWin32Error(er, hr, "Failed to end transaction."); |
| 959 | 974 | ||
| 960 | LExit: | 975 | LExit: |
| 961 | return hr; | 976 | return hr; |
| @@ -1048,10 +1063,10 @@ static INT CALLBACK InstallEngineRecordCallback( | |||
| 1048 | { | 1063 | { |
| 1049 | hr = HRESULT_FROM_WIN32(er); | 1064 | hr = HRESULT_FROM_WIN32(er); |
| 1050 | } | 1065 | } |
| 1051 | ExitOnFailure(hr, "Failed to allocate string for formated message."); | 1066 | WiuExitOnFailure(hr, "Failed to allocate string for formated message."); |
| 1052 | 1067 | ||
| 1053 | er = ::MsiFormatRecordW(NULL, hRecord, sczMessage, &cchMessage); | 1068 | er = ::MsiFormatRecordW(NULL, hRecord, sczMessage, &cchMessage); |
| 1054 | ExitOnWin32Error(er, hr, "Failed to format message record."); | 1069 | WiuExitOnWin32Error(er, hr, "Failed to format message record."); |
| 1055 | 1070 | ||
| 1056 | // Pass to handler including both the formated message and the original record. | 1071 | // Pass to handler including both the formated message and the original record. |
| 1057 | nResult = HandleInstallMessage(pContext, mt, uiFlags, sczMessage, hRecord); | 1072 | nResult = HandleInstallMessage(pContext, mt, uiFlags, sczMessage, hRecord); |
| @@ -1213,7 +1228,7 @@ static INT HandleInstallProgress( | |||
| 1213 | 1228 | ||
| 1214 | // parse number | 1229 | // parse number |
| 1215 | hr = StrStringToInt32(pwz, cch, &iFields[cFields]); | 1230 | hr = StrStringToInt32(pwz, cch, &iFields[cFields]); |
| 1216 | ExitOnFailure(hr, "Failed to parse MSI message part."); | 1231 | WiuExitOnFailure(hr, "Failed to parse MSI message part."); |
| 1217 | 1232 | ||
| 1218 | // increment field count | 1233 | // increment field count |
| 1219 | ++cFields; | 1234 | ++cFields; |
| @@ -1255,7 +1270,7 @@ static INT HandleInstallProgress( | |||
| 1255 | else | 1270 | else |
| 1256 | { | 1271 | { |
| 1257 | hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); | 1272 | hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); |
| 1258 | ExitOnRootFailure(hr, "Insufficient space to hold progress information."); | 1273 | WiuExitOnRootFailure(hr, "Insufficient space to hold progress information."); |
| 1259 | } | 1274 | } |
| 1260 | 1275 | ||
| 1261 | // we only care about the first stage after script execution has started | 1276 | // we only care about the first stage after script execution has started |
