diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-08-08 18:02:15 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-08-09 09:57:02 -0500 |
| commit | 240b663ad5fc94ed6d19c966b5c9105a176ecf40 (patch) | |
| tree | d194e242ccb5bb69f0dbbc388ede87cef65c700f /src/libs | |
| parent | 8e1cbe8d7b468553d76c20452561e89726de5c47 (diff) | |
| download | wix-240b663ad5fc94ed6d19c966b5c9105a176ecf40.tar.gz wix-240b663ad5fc94ed6d19c966b5c9105a176ecf40.tar.bz2 wix-240b663ad5fc94ed6d19c966b5c9105a176ecf40.zip | |
Skip logging errors in some places when they are due to missing files or registry keys or values.
Related to 6696
Diffstat (limited to 'src/libs')
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/butil.cpp | 127 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/deputil.cpp | 145 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/dirutil.cpp | 42 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/file2utl.cpp | 31 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/fileutil.cpp | 12 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/dutil.h | 4 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/logutil.h | 2 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/monutil.cpp | 14 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/osutil.cpp | 16 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/path3utl.cpp | 14 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/polcutil.cpp | 48 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/regutil.cpp | 49 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/wiutil.cpp | 15 |
13 files changed, 286 insertions, 233 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/butil.cpp b/src/libs/dutil/WixToolset.DUtil/butil.cpp index 175903ad..47f206ea 100644 --- a/src/libs/dutil/WixToolset.DUtil/butil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/butil.cpp | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #define ButilExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_BUTIL, p, x, e, s, __VA_ARGS__) | 15 | #define ButilExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_BUTIL, p, x, e, s, __VA_ARGS__) |
| 16 | #define ButilExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_BUTIL, p, x, s, __VA_ARGS__) | 16 | #define ButilExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_BUTIL, p, x, s, __VA_ARGS__) |
| 17 | #define ButilExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_BUTIL, e, x, s, __VA_ARGS__) | 17 | #define ButilExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_BUTIL, e, x, s, __VA_ARGS__) |
| 18 | #define ButilExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_BUTIL, x, b, s, __VA_ARGS__) | ||
| 18 | 19 | ||
| 19 | // constants | 20 | // constants |
| 20 | // From engine/registration.h | 21 | // From engine/registration.h |
| @@ -82,19 +83,6 @@ static HRESULT LocateAndQueryBundleValue( | |||
| 82 | __inout DWORD* pdwType, | 83 | __inout DWORD* pdwType, |
| 83 | __out INTERNAL_BUNDLE_STATUS* pStatus | 84 | __out INTERNAL_BUNDLE_STATUS* pStatus |
| 84 | ); | 85 | ); |
| 85 | |||
| 86 | /******************************************************************** | ||
| 87 | OpenBundleKey - Opens the bundle uninstallation key for a given bundle | ||
| 88 | |||
| 89 | NOTE: caller is responsible for closing key | ||
| 90 | ********************************************************************/ | ||
| 91 | static HRESULT OpenBundleKey( | ||
| 92 | __in_z LPCWSTR wzBundleId, | ||
| 93 | __in BUNDLE_INSTALL_CONTEXT context, | ||
| 94 | __in_opt LPCWSTR wzSubKey, | ||
| 95 | __in REG_KEY_BITNESS kbKeyBitness, | ||
| 96 | __inout HKEY* phKey | ||
| 97 | ); | ||
| 98 | static HRESULT CopyStringToBuffer( | 86 | static HRESULT CopyStringToBuffer( |
| 99 | __in_z LPWSTR wzValue, | 87 | __in_z LPWSTR wzValue, |
| 100 | __in_z_opt LPWSTR wzBuffer, | 88 | __in_z_opt LPWSTR wzBuffer, |
| @@ -389,12 +377,12 @@ DAPI_(HRESULT) BundleQueryRelatedBundles( | |||
| 389 | queryContext.regBitness = REG_KEY_32BIT; | 377 | queryContext.regBitness = REG_KEY_32BIT; |
| 390 | 378 | ||
| 391 | hr = QueryRelatedBundlesForScopeAndBitness(&queryContext); | 379 | hr = QueryRelatedBundlesForScopeAndBitness(&queryContext); |
| 392 | ExitOnFailure(hr, "Failed to query 32-bit related bundles."); | 380 | ButilExitOnFailure(hr, "Failed to query 32-bit related bundles."); |
| 393 | 381 | ||
| 394 | queryContext.regBitness = REG_KEY_64BIT; | 382 | queryContext.regBitness = REG_KEY_64BIT; |
| 395 | 383 | ||
| 396 | hr = QueryRelatedBundlesForScopeAndBitness(&queryContext); | 384 | hr = QueryRelatedBundlesForScopeAndBitness(&queryContext); |
| 397 | ExitOnFailure(hr, "Failed to query 64-bit related bundles."); | 385 | ButilExitOnFailure(hr, "Failed to query 64-bit related bundles."); |
| 398 | 386 | ||
| 399 | LExit: | 387 | LExit: |
| 400 | return hr; | 388 | return hr; |
| @@ -407,15 +395,17 @@ static HRESULT QueryRelatedBundlesForScopeAndBitness( | |||
| 407 | HRESULT hr = S_OK; | 395 | HRESULT hr = S_OK; |
| 408 | HKEY hkRoot = BUNDLE_INSTALL_CONTEXT_USER == pQueryContext->installContext ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; | 396 | HKEY hkRoot = BUNDLE_INSTALL_CONTEXT_USER == pQueryContext->installContext ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; |
| 409 | HKEY hkUninstallKey = NULL; | 397 | HKEY hkUninstallKey = NULL; |
| 398 | BOOL fExists = FALSE; | ||
| 410 | LPWSTR sczRelatedBundleId = NULL; | 399 | LPWSTR sczRelatedBundleId = NULL; |
| 411 | BUNDLE_QUERY_CALLBACK_RESULT result = BUNDLE_QUERY_CALLBACK_RESULT_CONTINUE; | 400 | BUNDLE_QUERY_CALLBACK_RESULT result = BUNDLE_QUERY_CALLBACK_RESULT_CONTINUE; |
| 412 | 401 | ||
| 413 | hr = RegOpenEx(hkRoot, BUNDLE_REGISTRATION_REGISTRY_UNINSTALL_KEY, KEY_READ, pQueryContext->regBitness, &hkUninstallKey); | 402 | hr = RegOpenEx(hkRoot, BUNDLE_REGISTRATION_REGISTRY_UNINSTALL_KEY, KEY_READ, pQueryContext->regBitness, &hkUninstallKey); |
| 414 | if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr) | 403 | ButilExitOnPathFailure(hr, fExists, "Failed to open uninstall registry key."); |
| 404 | |||
| 405 | if (!fExists) | ||
| 415 | { | 406 | { |
| 416 | ExitFunction1(hr = S_OK); | 407 | ExitFunction1(hr = S_OK); |
| 417 | } | 408 | } |
| 418 | ExitOnFailure(hr, "Failed to open uninstall registry key."); | ||
| 419 | 409 | ||
| 420 | for (DWORD dwIndex = 0; /* exit via break below */; ++dwIndex) | 410 | for (DWORD dwIndex = 0; /* exit via break below */; ++dwIndex) |
| 421 | { | 411 | { |
| @@ -425,7 +415,7 @@ static HRESULT QueryRelatedBundlesForScopeAndBitness( | |||
| 425 | hr = S_OK; | 415 | hr = S_OK; |
| 426 | break; | 416 | break; |
| 427 | } | 417 | } |
| 428 | ExitOnFailure(hr, "Failed to enumerate uninstall key for related bundles."); | 418 | ButilExitOnFailure(hr, "Failed to enumerate uninstall key for related bundles."); |
| 429 | 419 | ||
| 430 | // Ignore failures here since we'll often find products that aren't actually | 420 | // Ignore failures here since we'll often find products that aren't actually |
| 431 | // related bundles (or even bundles at all). | 421 | // related bundles (or even bundles at all). |
| @@ -456,7 +446,7 @@ static HRESULT QueryPotentialRelatedBundle( | |||
| 456 | BUNDLE_QUERY_RELATED_BUNDLE_RESULT bundle = { }; | 446 | BUNDLE_QUERY_RELATED_BUNDLE_RESULT bundle = { }; |
| 457 | 447 | ||
| 458 | hr = RegOpenEx(hkUninstallKey, wzRelatedBundleId, KEY_READ, pQueryContext->regBitness, &hkBundleId); | 448 | hr = RegOpenEx(hkUninstallKey, wzRelatedBundleId, KEY_READ, pQueryContext->regBitness, &hkBundleId); |
| 459 | ExitOnFailure(hr, "Failed to open uninstall key for potential related bundle: %ls", wzRelatedBundleId); | 449 | ButilExitOnFailure(hr, "Failed to open uninstall key for potential related bundle: %ls", wzRelatedBundleId); |
| 460 | 450 | ||
| 461 | hr = DetermineRelationType(pQueryContext, hkBundleId, &relationType); | 451 | hr = DetermineRelationType(pQueryContext, hkBundleId, &relationType); |
| 462 | if (FAILED(hr)) | 452 | if (FAILED(hr)) |
| @@ -506,7 +496,7 @@ static HRESULT DetermineRelationType( | |||
| 506 | TraceError(hr, "Failed to read upgrade codes as REG_MULTI_SZ. Trying again as REG_SZ in case of older bundles."); | 496 | TraceError(hr, "Failed to read upgrade codes as REG_MULTI_SZ. Trying again as REG_SZ in case of older bundles."); |
| 507 | 497 | ||
| 508 | rgsczUpgradeCodes = reinterpret_cast<LPWSTR*>(MemAlloc(sizeof(LPWSTR), TRUE)); | 498 | rgsczUpgradeCodes = reinterpret_cast<LPWSTR*>(MemAlloc(sizeof(LPWSTR), TRUE)); |
| 509 | ExitOnNull(rgsczUpgradeCodes, hr, E_OUTOFMEMORY, "Failed to allocate list for a single upgrade code from older bundle."); | 499 | ButilExitOnNull(rgsczUpgradeCodes, hr, E_OUTOFMEMORY, "Failed to allocate list for a single upgrade code from older bundle."); |
| 510 | 500 | ||
| 511 | hr = RegReadString(hkBundleId, BUNDLE_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE, &rgsczUpgradeCodes[0]); | 501 | hr = RegReadString(hkBundleId, BUNDLE_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE, &rgsczUpgradeCodes[0]); |
| 512 | if (SUCCEEDED(hr)) | 502 | if (SUCCEEDED(hr)) |
| @@ -519,7 +509,7 @@ static HRESULT DetermineRelationType( | |||
| 519 | if (SUCCEEDED(hr)) | 509 | if (SUCCEEDED(hr)) |
| 520 | { | 510 | { |
| 521 | hr = DictCreateStringListFromArray(&sdUpgradeCodes, rgsczUpgradeCodes, cUpgradeCodes, DICT_FLAG_CASEINSENSITIVE); | 511 | hr = DictCreateStringListFromArray(&sdUpgradeCodes, rgsczUpgradeCodes, cUpgradeCodes, DICT_FLAG_CASEINSENSITIVE); |
| 522 | ExitOnFailure(hr, "Failed to create string dictionary for %hs.", "upgrade codes"); | 512 | ButilExitOnFailure(hr, "Failed to create string dictionary for %hs.", "upgrade codes"); |
| 523 | 513 | ||
| 524 | // Upgrade relationship: when their upgrade codes match our upgrade codes. | 514 | // Upgrade relationship: when their upgrade codes match our upgrade codes. |
| 525 | hr = DictCompareStringListToArray(sdUpgradeCodes, const_cast<LPCWSTR*>(pQueryContext->rgwzUpgradeCodes), pQueryContext->cUpgradeCodes); | 515 | hr = DictCompareStringListToArray(sdUpgradeCodes, const_cast<LPCWSTR*>(pQueryContext->rgwzUpgradeCodes), pQueryContext->cUpgradeCodes); |
| @@ -529,7 +519,7 @@ static HRESULT DetermineRelationType( | |||
| 529 | } | 519 | } |
| 530 | else | 520 | else |
| 531 | { | 521 | { |
| 532 | ExitOnFailure(hr, "Failed to do array search for upgrade code match."); | 522 | ButilExitOnFailure(hr, "Failed to do array search for upgrade code match."); |
| 533 | 523 | ||
| 534 | *pRelationType = BUNDLE_RELATION_UPGRADE; | 524 | *pRelationType = BUNDLE_RELATION_UPGRADE; |
| 535 | ExitFunction(); | 525 | ExitFunction(); |
| @@ -543,7 +533,7 @@ static HRESULT DetermineRelationType( | |||
| 543 | } | 533 | } |
| 544 | else | 534 | else |
| 545 | { | 535 | { |
| 546 | ExitOnFailure(hr, "Failed to do array search for detect code match."); | 536 | ButilExitOnFailure(hr, "Failed to do array search for detect code match."); |
| 547 | 537 | ||
| 548 | *pRelationType = BUNDLE_RELATION_DETECT; | 538 | *pRelationType = BUNDLE_RELATION_DETECT; |
| 549 | ExitFunction(); | 539 | ExitFunction(); |
| @@ -557,7 +547,7 @@ static HRESULT DetermineRelationType( | |||
| 557 | } | 547 | } |
| 558 | else | 548 | else |
| 559 | { | 549 | { |
| 560 | ExitOnFailure(hr, "Failed to do array search for addon code match."); | 550 | ButilExitOnFailure(hr, "Failed to do array search for addon code match."); |
| 561 | 551 | ||
| 562 | *pRelationType = BUNDLE_RELATION_DEPENDENT_ADDON; | 552 | *pRelationType = BUNDLE_RELATION_DEPENDENT_ADDON; |
| 563 | ExitFunction(); | 553 | ExitFunction(); |
| @@ -571,7 +561,7 @@ static HRESULT DetermineRelationType( | |||
| 571 | } | 561 | } |
| 572 | else | 562 | else |
| 573 | { | 563 | { |
| 574 | ExitOnFailure(hr, "Failed to do array search for patch code match."); | 564 | ButilExitOnFailure(hr, "Failed to do array search for patch code match."); |
| 575 | 565 | ||
| 576 | *pRelationType = BUNDLE_RELATION_DEPENDENT_PATCH; | 566 | *pRelationType = BUNDLE_RELATION_DEPENDENT_PATCH; |
| 577 | ExitFunction(); | 567 | ExitFunction(); |
| @@ -586,7 +576,7 @@ static HRESULT DetermineRelationType( | |||
| 586 | if (SUCCEEDED(hr)) | 576 | if (SUCCEEDED(hr)) |
| 587 | { | 577 | { |
| 588 | hr = DictCreateStringListFromArray(&sdAddonCodes, rgsczAddonCodes, cAddonCodes, DICT_FLAG_CASEINSENSITIVE); | 578 | hr = DictCreateStringListFromArray(&sdAddonCodes, rgsczAddonCodes, cAddonCodes, DICT_FLAG_CASEINSENSITIVE); |
| 589 | ExitOnFailure(hr, "Failed to create string dictionary for %hs.", "addon codes"); | 579 | ButilExitOnFailure(hr, "Failed to create string dictionary for %hs.", "addon codes"); |
| 590 | 580 | ||
| 591 | // Addon relationship: when their addon codes match our detect codes. | 581 | // Addon relationship: when their addon codes match our detect codes. |
| 592 | hr = DictCompareStringListToArray(sdAddonCodes, const_cast<LPCWSTR*>(pQueryContext->rgwzDetectCodes), pQueryContext->cDetectCodes); | 582 | hr = DictCompareStringListToArray(sdAddonCodes, const_cast<LPCWSTR*>(pQueryContext->rgwzDetectCodes), pQueryContext->cDetectCodes); |
| @@ -596,7 +586,7 @@ static HRESULT DetermineRelationType( | |||
| 596 | } | 586 | } |
| 597 | else | 587 | else |
| 598 | { | 588 | { |
| 599 | ExitOnFailure(hr, "Failed to do array search for addon code match."); | 589 | ButilExitOnFailure(hr, "Failed to do array search for addon code match."); |
| 600 | 590 | ||
| 601 | *pRelationType = BUNDLE_RELATION_ADDON; | 591 | *pRelationType = BUNDLE_RELATION_ADDON; |
| 602 | ExitFunction(); | 592 | ExitFunction(); |
| @@ -610,7 +600,7 @@ static HRESULT DetermineRelationType( | |||
| 610 | } | 600 | } |
| 611 | else | 601 | else |
| 612 | { | 602 | { |
| 613 | ExitOnFailure(hr, "Failed to do array search for addon code match."); | 603 | ButilExitOnFailure(hr, "Failed to do array search for addon code match."); |
| 614 | 604 | ||
| 615 | *pRelationType = BUNDLE_RELATION_ADDON; | 605 | *pRelationType = BUNDLE_RELATION_ADDON; |
| 616 | ExitFunction(); | 606 | ExitFunction(); |
| @@ -625,7 +615,7 @@ static HRESULT DetermineRelationType( | |||
| 625 | if (SUCCEEDED(hr)) | 615 | if (SUCCEEDED(hr)) |
| 626 | { | 616 | { |
| 627 | hr = DictCreateStringListFromArray(&sdPatchCodes, rgsczPatchCodes, cPatchCodes, DICT_FLAG_CASEINSENSITIVE); | 617 | hr = DictCreateStringListFromArray(&sdPatchCodes, rgsczPatchCodes, cPatchCodes, DICT_FLAG_CASEINSENSITIVE); |
| 628 | ExitOnFailure(hr, "Failed to create string dictionary for %hs.", "patch codes"); | 618 | ButilExitOnFailure(hr, "Failed to create string dictionary for %hs.", "patch codes"); |
| 629 | 619 | ||
| 630 | // Patch relationship: when their patch codes match our detect codes. | 620 | // Patch relationship: when their patch codes match our detect codes. |
| 631 | hr = DictCompareStringListToArray(sdPatchCodes, const_cast<LPCWSTR*>(pQueryContext->rgwzDetectCodes), pQueryContext->cDetectCodes); | 621 | hr = DictCompareStringListToArray(sdPatchCodes, const_cast<LPCWSTR*>(pQueryContext->rgwzDetectCodes), pQueryContext->cDetectCodes); |
| @@ -635,7 +625,7 @@ static HRESULT DetermineRelationType( | |||
| 635 | } | 625 | } |
| 636 | else | 626 | else |
| 637 | { | 627 | { |
| 638 | ExitOnFailure(hr, "Failed to do array search for patch code match."); | 628 | ButilExitOnFailure(hr, "Failed to do array search for patch code match."); |
| 639 | 629 | ||
| 640 | *pRelationType = BUNDLE_RELATION_PATCH; | 630 | *pRelationType = BUNDLE_RELATION_PATCH; |
| 641 | ExitFunction(); | 631 | ExitFunction(); |
| @@ -649,7 +639,7 @@ static HRESULT DetermineRelationType( | |||
| 649 | } | 639 | } |
| 650 | else | 640 | else |
| 651 | { | 641 | { |
| 652 | ExitOnFailure(hr, "Failed to do array search for patch code match."); | 642 | ButilExitOnFailure(hr, "Failed to do array search for patch code match."); |
| 653 | 643 | ||
| 654 | *pRelationType = BUNDLE_RELATION_PATCH; | 644 | *pRelationType = BUNDLE_RELATION_PATCH; |
| 655 | ExitFunction(); | 645 | ExitFunction(); |
| @@ -664,7 +654,7 @@ static HRESULT DetermineRelationType( | |||
| 664 | if (SUCCEEDED(hr)) | 654 | if (SUCCEEDED(hr)) |
| 665 | { | 655 | { |
| 666 | hr = DictCreateStringListFromArray(&sdDetectCodes, rgsczDetectCodes, cDetectCodes, DICT_FLAG_CASEINSENSITIVE); | 656 | hr = DictCreateStringListFromArray(&sdDetectCodes, rgsczDetectCodes, cDetectCodes, DICT_FLAG_CASEINSENSITIVE); |
| 667 | ExitOnFailure(hr, "Failed to create string dictionary for %hs.", "detect codes"); | 657 | ButilExitOnFailure(hr, "Failed to create string dictionary for %hs.", "detect codes"); |
| 668 | 658 | ||
| 669 | // Detect relationship: when their detect codes match our detect codes. | 659 | // Detect relationship: when their detect codes match our detect codes. |
| 670 | hr = DictCompareStringListToArray(sdDetectCodes, const_cast<LPCWSTR*>(pQueryContext->rgwzDetectCodes), pQueryContext->cDetectCodes); | 660 | hr = DictCompareStringListToArray(sdDetectCodes, const_cast<LPCWSTR*>(pQueryContext->rgwzDetectCodes), pQueryContext->cDetectCodes); |
| @@ -674,7 +664,7 @@ static HRESULT DetermineRelationType( | |||
| 674 | } | 664 | } |
| 675 | else | 665 | else |
| 676 | { | 666 | { |
| 677 | ExitOnFailure(hr, "Failed to do array search for detect code match."); | 667 | ButilExitOnFailure(hr, "Failed to do array search for detect code match."); |
| 678 | 668 | ||
| 679 | *pRelationType = BUNDLE_RELATION_DETECT; | 669 | *pRelationType = BUNDLE_RELATION_DETECT; |
| 680 | ExitFunction(); | 670 | ExitFunction(); |
| @@ -688,7 +678,7 @@ static HRESULT DetermineRelationType( | |||
| 688 | } | 678 | } |
| 689 | else | 679 | else |
| 690 | { | 680 | { |
| 691 | ExitOnFailure(hr, "Failed to do array search for addon code match."); | 681 | ButilExitOnFailure(hr, "Failed to do array search for addon code match."); |
| 692 | 682 | ||
| 693 | *pRelationType = BUNDLE_RELATION_DEPENDENT_ADDON; | 683 | *pRelationType = BUNDLE_RELATION_DEPENDENT_ADDON; |
| 694 | ExitFunction(); | 684 | ExitFunction(); |
| @@ -702,7 +692,7 @@ static HRESULT DetermineRelationType( | |||
| 702 | } | 692 | } |
| 703 | else | 693 | else |
| 704 | { | 694 | { |
| 705 | ExitOnFailure(hr, "Failed to do array search for patch code match."); | 695 | ButilExitOnFailure(hr, "Failed to do array search for patch code match."); |
| 706 | 696 | ||
| 707 | *pRelationType = BUNDLE_RELATION_DEPENDENT_PATCH; | 697 | *pRelationType = BUNDLE_RELATION_DEPENDENT_PATCH; |
| 708 | ExitFunction(); | 698 | ExitFunction(); |
| @@ -740,54 +730,11 @@ static HRESULT LocateAndQueryBundleValue( | |||
| 740 | ) | 730 | ) |
| 741 | { | 731 | { |
| 742 | HRESULT hr = S_OK; | 732 | HRESULT hr = S_OK; |
| 733 | LPWSTR sczKeypath = NULL; | ||
| 734 | BOOL fExists = TRUE; | ||
| 743 | 735 | ||
| 744 | *pStatus = INTERNAL_BUNDLE_STATUS_SUCCESS; | 736 | *pStatus = INTERNAL_BUNDLE_STATUS_SUCCESS; |
| 745 | 737 | ||
| 746 | if (FAILED(hr = OpenBundleKey(wzBundleId, BUNDLE_INSTALL_CONTEXT_MACHINE, wzSubKey, REG_KEY_32BIT, phKey)) && | ||
| 747 | FAILED(hr = OpenBundleKey(wzBundleId, BUNDLE_INSTALL_CONTEXT_MACHINE, wzSubKey, REG_KEY_64BIT, phKey)) && | ||
| 748 | FAILED(hr = OpenBundleKey(wzBundleId, BUNDLE_INSTALL_CONTEXT_USER, wzSubKey, REG_KEY_DEFAULT, phKey))) | ||
| 749 | { | ||
| 750 | if (E_FILENOTFOUND == hr) | ||
| 751 | { | ||
| 752 | *pStatus = INTERNAL_BUNDLE_STATUS_UNKNOWN_BUNDLE; | ||
| 753 | ExitFunction1(hr = S_OK); | ||
| 754 | } | ||
| 755 | |||
| 756 | ButilExitOnFailure(hr, "Failed to open bundle key."); | ||
| 757 | } | ||
| 758 | |||
| 759 | // If the bundle doesn't have the value defined, return ERROR_UNKNOWN_PROPERTY | ||
| 760 | hr = RegGetType(*phKey, wzValueName, pdwType); | ||
| 761 | if (FAILED(hr)) | ||
| 762 | { | ||
| 763 | if (E_FILENOTFOUND == hr) | ||
| 764 | { | ||
| 765 | *pStatus = INTERNAL_BUNDLE_STATUS_UNKNOWN_PROPERTY; | ||
| 766 | ExitFunction1(hr = S_OK); | ||
| 767 | } | ||
| 768 | |||
| 769 | ButilExitOnFailure(hr, "Failed to read bundle value."); | ||
| 770 | } | ||
| 771 | |||
| 772 | LExit: | ||
| 773 | return hr; | ||
| 774 | } | ||
| 775 | |||
| 776 | static HRESULT OpenBundleKey( | ||
| 777 | __in_z LPCWSTR wzBundleId, | ||
| 778 | __in BUNDLE_INSTALL_CONTEXT context, | ||
| 779 | __in_opt LPCWSTR wzSubKey, | ||
| 780 | __in REG_KEY_BITNESS kbKeyBitness, | ||
| 781 | __inout HKEY* phKey | ||
| 782 | ) | ||
| 783 | { | ||
| 784 | Assert(phKey && wzBundleId); | ||
| 785 | AssertSz(NULL == *phKey, "*key should be null"); | ||
| 786 | |||
| 787 | HRESULT hr = S_OK; | ||
| 788 | HKEY hkRoot = BUNDLE_INSTALL_CONTEXT_USER == context ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; | ||
| 789 | LPWSTR sczKeypath = NULL; | ||
| 790 | |||
| 791 | if (wzSubKey) | 738 | if (wzSubKey) |
| 792 | { | 739 | { |
| 793 | hr = StrAllocFormatted(&sczKeypath, L"%ls\\%ls\\%ls", BUNDLE_REGISTRATION_REGISTRY_UNINSTALL_KEY, wzBundleId, wzSubKey); | 740 | hr = StrAllocFormatted(&sczKeypath, L"%ls\\%ls\\%ls", BUNDLE_REGISTRATION_REGISTRY_UNINSTALL_KEY, wzBundleId, wzSubKey); |
| @@ -798,8 +745,24 @@ static HRESULT OpenBundleKey( | |||
| 798 | } | 745 | } |
| 799 | ButilExitOnFailure(hr, "Failed to allocate bundle uninstall key path."); | 746 | ButilExitOnFailure(hr, "Failed to allocate bundle uninstall key path."); |
| 800 | 747 | ||
| 801 | hr = RegOpenEx(hkRoot, sczKeypath, KEY_READ, kbKeyBitness, phKey); | 748 | if (FAILED(hr = RegOpenEx(HKEY_LOCAL_MACHINE, sczKeypath, KEY_READ, REG_KEY_32BIT, phKey)) && |
| 802 | ButilExitOnFailure(hr, "Failed to open bundle uninstall key path."); | 749 | FAILED(hr = RegOpenEx(HKEY_LOCAL_MACHINE, sczKeypath, KEY_READ, REG_KEY_64BIT, phKey)) && |
| 750 | FAILED(hr = RegOpenEx(HKEY_CURRENT_USER, sczKeypath, KEY_READ, REG_KEY_DEFAULT, phKey))) | ||
| 751 | { | ||
| 752 | ButilExitOnPathFailure(hr, fExists, "Failed to open bundle key."); | ||
| 753 | |||
| 754 | *pStatus = INTERNAL_BUNDLE_STATUS_UNKNOWN_BUNDLE; | ||
| 755 | ExitFunction1(hr = S_OK); | ||
| 756 | } | ||
| 757 | |||
| 758 | hr = RegGetType(*phKey, wzValueName, pdwType); | ||
| 759 | ButilExitOnPathFailure(hr, fExists, "Failed to read bundle value."); | ||
| 760 | |||
| 761 | if (!fExists) | ||
| 762 | { | ||
| 763 | *pStatus = INTERNAL_BUNDLE_STATUS_UNKNOWN_PROPERTY; | ||
| 764 | ExitFunction1(hr = S_OK); | ||
| 765 | } | ||
| 803 | 766 | ||
| 804 | LExit: | 767 | LExit: |
| 805 | ReleaseStr(sczKeypath); | 768 | ReleaseStr(sczKeypath); |
diff --git a/src/libs/dutil/WixToolset.DUtil/deputil.cpp b/src/libs/dutil/WixToolset.DUtil/deputil.cpp index 4de85199..f92c7d18 100644 --- a/src/libs/dutil/WixToolset.DUtil/deputil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/deputil.cpp | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #define DepExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_DEPUTIL, p, x, s, __VA_ARGS__) | 16 | #define DepExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_DEPUTIL, p, x, s, __VA_ARGS__) |
| 17 | #define DepExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_DEPUTIL, e, x, s, __VA_ARGS__) | 17 | #define DepExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_DEPUTIL, e, x, s, __VA_ARGS__) |
| 18 | #define DepExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_DEPUTIL, g, x, s, __VA_ARGS__) | 18 | #define DepExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_DEPUTIL, g, x, s, __VA_ARGS__) |
| 19 | #define DepExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_DEPUTIL, x, b, s, __VA_ARGS__) | ||
| 19 | 20 | ||
| 20 | #define ARRAY_GROWTH_SIZE 5 | 21 | #define ARRAY_GROWTH_SIZE 5 |
| 21 | 22 | ||
| @@ -54,6 +55,7 @@ DAPI_(HRESULT) DepGetProviderInformation( | |||
| 54 | HRESULT hr = S_OK; | 55 | HRESULT hr = S_OK; |
| 55 | LPWSTR sczKey = NULL; | 56 | LPWSTR sczKey = NULL; |
| 56 | HKEY hkKey = NULL; | 57 | HKEY hkKey = NULL; |
| 58 | BOOL fExists = FALSE; | ||
| 57 | 59 | ||
| 58 | // Format the provider dependency registry key. | 60 | // Format the provider dependency registry key. |
| 59 | hr = AllocDependencyKeyName(wzProviderKey, &sczKey); | 61 | hr = AllocDependencyKeyName(wzProviderKey, &sczKey); |
| @@ -61,43 +63,32 @@ DAPI_(HRESULT) DepGetProviderInformation( | |||
| 61 | 63 | ||
| 62 | // Try to open the dependency key. | 64 | // Try to open the dependency key. |
| 63 | hr = RegOpen(hkHive, sczKey, KEY_READ, &hkKey); | 65 | hr = RegOpen(hkHive, sczKey, KEY_READ, &hkKey); |
| 64 | if (E_FILENOTFOUND == hr) | 66 | DepExitOnPathFailure(hr, fExists, "Failed to open the registry key for the dependency \"%ls\".", wzProviderKey); |
| 67 | |||
| 68 | if (!fExists) | ||
| 65 | { | 69 | { |
| 66 | ExitFunction1(hr = E_NOTFOUND); | 70 | ExitFunction1(hr = E_NOTFOUND); |
| 67 | } | 71 | } |
| 68 | DepExitOnFailure(hr, "Failed to open the registry key for the dependency \"%ls\".", wzProviderKey); | ||
| 69 | 72 | ||
| 70 | // Get the Id if requested and available. | 73 | // Get the Id if requested and available. |
| 71 | if (psczId) | 74 | if (psczId) |
| 72 | { | 75 | { |
| 73 | hr = RegReadString(hkKey, NULL, psczId); | 76 | hr = RegReadString(hkKey, NULL, psczId); |
| 74 | if (E_FILENOTFOUND == hr) | 77 | DepExitOnPathFailure(hr, fExists, "Failed to get the id for the dependency \"%ls\".", wzProviderKey); |
| 75 | { | ||
| 76 | hr = S_OK; | ||
| 77 | } | ||
| 78 | DepExitOnFailure(hr, "Failed to get the id for the dependency \"%ls\".", wzProviderKey); | ||
| 79 | } | 78 | } |
| 80 | 79 | ||
| 81 | // Get the DisplayName if requested and available. | 80 | // Get the DisplayName if requested and available. |
| 82 | if (psczName) | 81 | if (psczName) |
| 83 | { | 82 | { |
| 84 | hr = RegReadString(hkKey, vcszDisplayNameValue, psczName); | 83 | hr = RegReadString(hkKey, vcszDisplayNameValue, psczName); |
| 85 | if (E_FILENOTFOUND == hr) | 84 | DepExitOnPathFailure(hr, fExists, "Failed to get the name for the dependency \"%ls\".", wzProviderKey); |
| 86 | { | ||
| 87 | hr = S_OK; | ||
| 88 | } | ||
| 89 | DepExitOnFailure(hr, "Failed to get the name for the dependency \"%ls\".", wzProviderKey); | ||
| 90 | } | 85 | } |
| 91 | 86 | ||
| 92 | // Get the Version if requested and available. | 87 | // Get the Version if requested and available. |
| 93 | if (psczVersion) | 88 | if (psczVersion) |
| 94 | { | 89 | { |
| 95 | hr = RegReadString(hkKey, vcszVersionValue, psczVersion); | 90 | hr = RegReadString(hkKey, vcszVersionValue, psczVersion); |
| 96 | if (E_FILENOTFOUND == hr) | 91 | DepExitOnPathFailure(hr, fExists, "Failed to get the version for the dependency \"%ls\".", wzProviderKey); |
| 97 | { | ||
| 98 | hr = S_OK; | ||
| 99 | } | ||
| 100 | DepExitOnFailure(hr, "Failed to get the version for the dependency \"%ls\".", wzProviderKey); | ||
| 101 | } | 92 | } |
| 102 | 93 | ||
| 103 | LExit: | 94 | LExit: |
| @@ -121,6 +112,7 @@ DAPI_(HRESULT) DepCheckDependency( | |||
| 121 | HRESULT hr = S_OK; | 112 | HRESULT hr = S_OK; |
| 122 | LPWSTR sczKey = NULL; | 113 | LPWSTR sczKey = NULL; |
| 123 | HKEY hkKey = NULL; | 114 | HKEY hkKey = NULL; |
| 115 | BOOL fExists = FALSE; | ||
| 124 | VERUTIL_VERSION* pVersion = NULL; | 116 | VERUTIL_VERSION* pVersion = NULL; |
| 125 | VERUTIL_VERSION* pMinVersion = NULL; | 117 | VERUTIL_VERSION* pMinVersion = NULL; |
| 126 | VERUTIL_VERSION* pMaxVersion = NULL; | 118 | VERUTIL_VERSION* pMaxVersion = NULL; |
| @@ -134,20 +126,17 @@ DAPI_(HRESULT) DepCheckDependency( | |||
| 134 | 126 | ||
| 135 | // Try to open the key. If that fails, add the missing dependency key to the dependency array if it doesn't already exist. | 127 | // Try to open the key. If that fails, add the missing dependency key to the dependency array if it doesn't already exist. |
| 136 | hr = RegOpen(hkHive, sczKey, KEY_READ, &hkKey); | 128 | hr = RegOpen(hkHive, sczKey, KEY_READ, &hkKey); |
| 137 | if (E_FILENOTFOUND != hr) | 129 | DepExitOnPathFailure(hr, fExists, "Failed to open the registry key for dependency \"%ls\".", wzProviderKey); |
| 138 | { | ||
| 139 | DepExitOnFailure(hr, "Failed to open the registry key for dependency \"%ls\".", wzProviderKey); | ||
| 140 | 130 | ||
| 131 | if (fExists) | ||
| 132 | { | ||
| 141 | // If there are no registry values, consider the key orphaned and treat it as missing. | 133 | // If there are no registry values, consider the key orphaned and treat it as missing. |
| 142 | hr = RegReadWixVersion(hkKey, vcszVersionValue, &pVersion); | 134 | hr = RegReadWixVersion(hkKey, vcszVersionValue, &pVersion); |
| 143 | if (E_FILENOTFOUND != hr) | 135 | DepExitOnPathFailure(hr, fExists, "Failed to read the %ls registry value for dependency \"%ls\".", vcszVersionValue, wzProviderKey); |
| 144 | { | ||
| 145 | DepExitOnFailure(hr, "Failed to read the %ls registry value for dependency \"%ls\".", vcszVersionValue, wzProviderKey); | ||
| 146 | } | ||
| 147 | } | 136 | } |
| 148 | 137 | ||
| 149 | // If the key was not found or the Version value was not found, add the missing dependency key to the dependency array. | 138 | // If the key was not found or the Version value was not found, add the missing dependency key to the dependency array. |
| 150 | if (E_FILENOTFOUND == hr) | 139 | if (!fExists) |
| 151 | { | 140 | { |
| 152 | hr = DictKeyExists(sdDependencies, wzProviderKey); | 141 | hr = DictKeyExists(sdDependencies, wzProviderKey); |
| 153 | if (E_NOTFOUND != hr) | 142 | if (E_NOTFOUND != hr) |
| @@ -190,7 +179,7 @@ DAPI_(HRESULT) DepCheckDependency( | |||
| 190 | else | 179 | else |
| 191 | { | 180 | { |
| 192 | hr = RegReadString(hkKey, vcszDisplayNameValue, &sczName); | 181 | hr = RegReadString(hkKey, vcszDisplayNameValue, &sczName); |
| 193 | DepExitOnFailure(hr, "Failed to get the display name of the older dependency \"%ls\".", wzProviderKey); | 182 | DepExitOnPathFailure(hr, fExists, "Failed to get the display name of the older dependency \"%ls\".", wzProviderKey); |
| 194 | 183 | ||
| 195 | hr = DepDependencyArrayAlloc(prgDependencies, pcDependencies, wzProviderKey, sczName); | 184 | hr = DepDependencyArrayAlloc(prgDependencies, pcDependencies, wzProviderKey, sczName); |
| 196 | DepExitOnFailure(hr, "Failed to add the older dependency \"%ls\" to the dependencies array.", wzProviderKey); | 185 | DepExitOnFailure(hr, "Failed to add the older dependency \"%ls\" to the dependencies array.", wzProviderKey); |
| @@ -228,7 +217,7 @@ DAPI_(HRESULT) DepCheckDependency( | |||
| 228 | else | 217 | else |
| 229 | { | 218 | { |
| 230 | hr = RegReadString(hkKey, vcszDisplayNameValue, &sczName); | 219 | hr = RegReadString(hkKey, vcszDisplayNameValue, &sczName); |
| 231 | DepExitOnFailure(hr, "Failed to get the display name of the newer dependency \"%ls\".", wzProviderKey); | 220 | DepExitOnPathFailure(hr, fExists, "Failed to get the display name of the newer dependency \"%ls\".", wzProviderKey); |
| 232 | 221 | ||
| 233 | hr = DepDependencyArrayAlloc(prgDependencies, pcDependencies, wzProviderKey, sczName); | 222 | hr = DepDependencyArrayAlloc(prgDependencies, pcDependencies, wzProviderKey, sczName); |
| 234 | DepExitOnFailure(hr, "Failed to add the newer dependency \"%ls\" to the dependencies array.", wzProviderKey); | 223 | DepExitOnFailure(hr, "Failed to add the newer dependency \"%ls\" to the dependencies array.", wzProviderKey); |
| @@ -267,6 +256,7 @@ DAPI_(HRESULT) DepCheckDependents( | |||
| 267 | LPWSTR sczKey = NULL; | 256 | LPWSTR sczKey = NULL; |
| 268 | HKEY hkProviderKey = NULL; | 257 | HKEY hkProviderKey = NULL; |
| 269 | HKEY hkDependentsKey = NULL; | 258 | HKEY hkDependentsKey = NULL; |
| 259 | BOOL fExists = FALSE; | ||
| 270 | LPWSTR sczDependentKey = NULL; | 260 | LPWSTR sczDependentKey = NULL; |
| 271 | LPWSTR sczDependentName = NULL; | 261 | LPWSTR sczDependentName = NULL; |
| 272 | BOOL fIgnore = FALSE; | 262 | BOOL fIgnore = FALSE; |
| @@ -277,15 +267,18 @@ DAPI_(HRESULT) DepCheckDependents( | |||
| 277 | 267 | ||
| 278 | // Try to open the key. If that fails, the dependency information is corrupt. | 268 | // Try to open the key. If that fails, the dependency information is corrupt. |
| 279 | hr = RegOpen(hkHive, sczKey, KEY_READ, &hkProviderKey); | 269 | hr = RegOpen(hkHive, sczKey, KEY_READ, &hkProviderKey); |
| 280 | DepExitOnFailure(hr, "Failed to open the registry key \"%ls\". The dependency store is corrupt.", sczKey); | 270 | DepExitOnPathFailure(hr, fExists, "Failed to open the registry key \"%ls\". The dependency store is corrupt.", sczKey); |
| 281 | 271 | ||
| 282 | // Try to open the dependencies key. If that does not exist, there are no dependents. | 272 | if (!fExists) |
| 283 | hr = RegOpen(hkProviderKey, vsczRegistryDependents, KEY_READ, &hkDependentsKey); | ||
| 284 | if (E_FILENOTFOUND != hr) | ||
| 285 | { | 273 | { |
| 286 | DepExitOnFailure(hr, "Failed to open the registry key for dependents of \"%ls\".", wzProviderKey); | 274 | ExitFunction1(hr = S_OK); |
| 287 | } | 275 | } |
| 288 | else | 276 | |
| 277 | // Try to open the dependencies key. If that does not exist, there are no dependents. | ||
| 278 | hr = RegOpen(hkProviderKey, vsczRegistryDependents, KEY_READ, &hkDependentsKey); | ||
| 279 | DepExitOnPathFailure(hr, fExists, "Failed to open the registry key for dependents of \"%ls\".", wzProviderKey); | ||
| 280 | |||
| 281 | if (!fExists) | ||
| 289 | { | 282 | { |
| 290 | ExitFunction1(hr = S_OK); | 283 | ExitFunction1(hr = S_OK); |
| 291 | } | 284 | } |
| @@ -399,15 +392,18 @@ DAPI_(HRESULT) DepDependentExists( | |||
| 399 | HRESULT hr = S_OK; | 392 | HRESULT hr = S_OK; |
| 400 | LPWSTR sczDependentKey = NULL; | 393 | LPWSTR sczDependentKey = NULL; |
| 401 | HKEY hkDependentKey = NULL; | 394 | HKEY hkDependentKey = NULL; |
| 395 | BOOL fExists = FALSE; | ||
| 402 | 396 | ||
| 403 | // Format the provider dependents registry key. | 397 | // Format the provider dependents registry key. |
| 404 | hr = StrAllocFormatted(&sczDependentKey, L"%ls%ls\\%ls\\%ls", vsczRegistryRoot, wzDependencyProviderKey, vsczRegistryDependents, wzProviderKey); | 398 | hr = StrAllocFormatted(&sczDependentKey, L"%ls%ls\\%ls\\%ls", vsczRegistryRoot, wzDependencyProviderKey, vsczRegistryDependents, wzProviderKey); |
| 405 | DepExitOnFailure(hr, "Failed to format registry key to dependent."); | 399 | DepExitOnFailure(hr, "Failed to format registry key to dependent."); |
| 406 | 400 | ||
| 407 | hr = RegOpen(hkHive, sczDependentKey, KEY_READ, &hkDependentKey); | 401 | hr = RegOpen(hkHive, sczDependentKey, KEY_READ, &hkDependentKey); |
| 408 | if (E_FILENOTFOUND != hr) | 402 | DepExitOnPathFailure(hr, fExists, "Failed to open the dependent registry key at: \"%ls\".", sczDependentKey); |
| 403 | |||
| 404 | if (!fExists) | ||
| 409 | { | 405 | { |
| 410 | DepExitOnFailure(hr, "Failed to open the dependent registry key at: \"%ls\".", sczDependentKey); | 406 | hr = E_FILENOTFOUND; |
| 411 | } | 407 | } |
| 412 | 408 | ||
| 413 | LExit: | 409 | LExit: |
| @@ -480,6 +476,7 @@ DAPI_(HRESULT) DepUnregisterDependency( | |||
| 480 | HRESULT hr = S_OK; | 476 | HRESULT hr = S_OK; |
| 481 | LPWSTR sczKey = NULL; | 477 | LPWSTR sczKey = NULL; |
| 482 | HKEY hkKey = NULL; | 478 | HKEY hkKey = NULL; |
| 479 | BOOL fExists = FALSE; | ||
| 483 | 480 | ||
| 484 | // Format the provider dependency registry key. | 481 | // Format the provider dependency registry key. |
| 485 | hr = AllocDependencyKeyName(wzProviderKey, &sczKey); | 482 | hr = AllocDependencyKeyName(wzProviderKey, &sczKey); |
| @@ -487,9 +484,11 @@ DAPI_(HRESULT) DepUnregisterDependency( | |||
| 487 | 484 | ||
| 488 | // Delete the entire key including all sub-keys. | 485 | // Delete the entire key including all sub-keys. |
| 489 | hr = RegDelete(hkHive, sczKey, REG_KEY_DEFAULT, TRUE); | 486 | hr = RegDelete(hkHive, sczKey, REG_KEY_DEFAULT, TRUE); |
| 490 | if (E_FILENOTFOUND != hr) | 487 | DepExitOnPathFailure(hr, fExists, "Failed to delete the key \"%ls\".", sczKey); |
| 488 | |||
| 489 | if (!fExists) | ||
| 491 | { | 490 | { |
| 492 | DepExitOnFailure(hr, "Failed to delete the key \"%ls\".", sczKey); | 491 | hr = E_FILENOTFOUND; |
| 493 | } | 492 | } |
| 494 | 493 | ||
| 495 | LExit: | 494 | LExit: |
| @@ -506,6 +505,7 @@ DAPI_(HRESULT) DepUnregisterDependent( | |||
| 506 | ) | 505 | ) |
| 507 | { | 506 | { |
| 508 | HRESULT hr = S_OK; | 507 | HRESULT hr = S_OK; |
| 508 | BOOL fExists = FALSE; | ||
| 509 | HKEY hkRegistryRoot = NULL; | 509 | HKEY hkRegistryRoot = NULL; |
| 510 | HKEY hkDependencyProviderKey = NULL; | 510 | HKEY hkDependencyProviderKey = NULL; |
| 511 | HKEY hkRegistryDependents = NULL; | 511 | HKEY hkRegistryDependents = NULL; |
| @@ -514,40 +514,39 @@ DAPI_(HRESULT) DepUnregisterDependent( | |||
| 514 | 514 | ||
| 515 | // Open the root key. We may delete the wzDependencyProviderKey during clean up. | 515 | // Open the root key. We may delete the wzDependencyProviderKey during clean up. |
| 516 | hr = RegOpen(hkHive, vsczRegistryRoot, KEY_READ, &hkRegistryRoot); | 516 | hr = RegOpen(hkHive, vsczRegistryRoot, KEY_READ, &hkRegistryRoot); |
| 517 | if (E_FILENOTFOUND != hr) | 517 | DepExitOnPathFailure(hr, fExists, "Failed to open root registry key \"%ls\".", vsczRegistryRoot); |
| 518 | { | 518 | |
| 519 | DepExitOnFailure(hr, "Failed to open root registry key \"%ls\".", vsczRegistryRoot); | 519 | if (!fExists) |
| 520 | } | ||
| 521 | else | ||
| 522 | { | 520 | { |
| 523 | ExitFunction(); | 521 | ExitFunction1(hr = E_FILENOTFOUND); |
| 524 | } | 522 | } |
| 525 | 523 | ||
| 526 | // Try to open the dependency key. If that does not exist, simply return. | 524 | // Try to open the dependency key. If that does not exist, simply return. |
| 527 | hr = RegOpen(hkRegistryRoot, wzDependencyProviderKey, KEY_READ, &hkDependencyProviderKey); | 525 | hr = RegOpen(hkRegistryRoot, wzDependencyProviderKey, KEY_READ, &hkDependencyProviderKey); |
| 528 | if (E_FILENOTFOUND != hr) | 526 | DepExitOnPathFailure(hr, fExists, "Failed to open the registry key for the dependency \"%ls\".", wzDependencyProviderKey); |
| 529 | { | 527 | |
| 530 | DepExitOnFailure(hr, "Failed to open the registry key for the dependency \"%ls\".", wzDependencyProviderKey); | 528 | if (!fExists) |
| 531 | } | ||
| 532 | else | ||
| 533 | { | 529 | { |
| 534 | ExitFunction(); | 530 | ExitFunction1(hr = E_FILENOTFOUND); |
| 535 | } | 531 | } |
| 536 | 532 | ||
| 537 | // Try to open the dependents subkey to enumerate. | 533 | // Try to open the dependents subkey to enumerate. |
| 538 | hr = RegOpen(hkDependencyProviderKey, vsczRegistryDependents, KEY_READ, &hkRegistryDependents); | 534 | hr = RegOpen(hkDependencyProviderKey, vsczRegistryDependents, KEY_READ, &hkRegistryDependents); |
| 539 | if (E_FILENOTFOUND != hr) | 535 | DepExitOnPathFailure(hr, fExists, "Failed to open the dependents subkey under the dependency \"%ls\".", wzDependencyProviderKey); |
| 540 | { | 536 | |
| 541 | DepExitOnFailure(hr, "Failed to open the dependents subkey under the dependency \"%ls\".", wzDependencyProviderKey); | 537 | if (!fExists) |
| 542 | } | ||
| 543 | else | ||
| 544 | { | 538 | { |
| 545 | ExitFunction(); | 539 | ExitFunction1(hr = E_FILENOTFOUND); |
| 546 | } | 540 | } |
| 547 | 541 | ||
| 548 | // Delete the wzProviderKey dependent sub-key. | 542 | // Delete the wzProviderKey dependent sub-key. |
| 549 | hr = RegDelete(hkRegistryDependents, wzProviderKey, REG_KEY_DEFAULT, TRUE); | 543 | hr = RegDelete(hkRegistryDependents, wzProviderKey, REG_KEY_DEFAULT, TRUE); |
| 550 | DepExitOnFailure(hr, "Failed to delete the dependent \"%ls\" under the dependency \"%ls\".", wzProviderKey, wzDependencyProviderKey); | 544 | DepExitOnPathFailure(hr, fExists, "Failed to delete the dependent \"%ls\" under the dependency \"%ls\".", wzProviderKey, wzDependencyProviderKey); |
| 545 | |||
| 546 | if (!fExists) | ||
| 547 | { | ||
| 548 | ExitFunction1(hr = E_FILENOTFOUND); | ||
| 549 | } | ||
| 551 | 550 | ||
| 552 | // If there are no remaining dependents, delete the Dependents subkey. | 551 | // If there are no remaining dependents, delete the Dependents subkey. |
| 553 | hr = RegQueryKey(hkRegistryDependents, &cSubKeys, NULL); | 552 | hr = RegQueryKey(hkRegistryDependents, &cSubKeys, NULL); |
| @@ -563,7 +562,12 @@ DAPI_(HRESULT) DepUnregisterDependent( | |||
| 563 | 562 | ||
| 564 | // Fail if there are any subkeys since we just checked. | 563 | // Fail if there are any subkeys since we just checked. |
| 565 | hr = RegDelete(hkDependencyProviderKey, vsczRegistryDependents, REG_KEY_DEFAULT, FALSE); | 564 | hr = RegDelete(hkDependencyProviderKey, vsczRegistryDependents, REG_KEY_DEFAULT, FALSE); |
| 566 | DepExitOnFailure(hr, "Failed to delete the dependents subkey under the dependency \"%ls\".", wzDependencyProviderKey); | 565 | DepExitOnPathFailure(hr, fExists, "Failed to delete the dependents subkey under the dependency \"%ls\".", wzDependencyProviderKey); |
| 566 | |||
| 567 | if (!fExists) | ||
| 568 | { | ||
| 569 | ExitFunction1(hr = E_FILENOTFOUND); | ||
| 570 | } | ||
| 567 | 571 | ||
| 568 | // If there are no values, delete the provider dependency key. | 572 | // If there are no values, delete the provider dependency key. |
| 569 | hr = RegQueryKey(hkDependencyProviderKey, NULL, &cValues); | 573 | hr = RegQueryKey(hkDependencyProviderKey, NULL, &cValues); |
| @@ -576,7 +580,12 @@ DAPI_(HRESULT) DepUnregisterDependent( | |||
| 576 | 580 | ||
| 577 | // Fail if there are any subkeys since we just checked. | 581 | // Fail if there are any subkeys since we just checked. |
| 578 | hr = RegDelete(hkRegistryRoot, wzDependencyProviderKey, REG_KEY_DEFAULT, FALSE); | 582 | hr = RegDelete(hkRegistryRoot, wzDependencyProviderKey, REG_KEY_DEFAULT, FALSE); |
| 579 | DepExitOnFailure(hr, "Failed to delete the dependency \"%ls\".", wzDependencyProviderKey); | 583 | DepExitOnPathFailure(hr, fExists, "Failed to delete the dependency \"%ls\".", wzDependencyProviderKey); |
| 584 | |||
| 585 | if (!fExists) | ||
| 586 | { | ||
| 587 | ExitFunction1(hr = E_FILENOTFOUND); | ||
| 588 | } | ||
| 580 | } | 589 | } |
| 581 | 590 | ||
| 582 | LExit: | 591 | LExit: |
| @@ -685,6 +694,7 @@ static HRESULT GetDependencyNameFromKey( | |||
| 685 | HRESULT hr = S_OK; | 694 | HRESULT hr = S_OK; |
| 686 | LPWSTR sczKey = NULL; | 695 | LPWSTR sczKey = NULL; |
| 687 | HKEY hkKey = NULL; | 696 | HKEY hkKey = NULL; |
| 697 | BOOL fExists = FALSE; | ||
| 688 | 698 | ||
| 689 | // Format the provider dependency registry key. | 699 | // Format the provider dependency registry key. |
| 690 | hr = AllocDependencyKeyName(wzProviderKey, &sczKey); | 700 | hr = AllocDependencyKeyName(wzProviderKey, &sczKey); |
| @@ -692,25 +702,16 @@ static HRESULT GetDependencyNameFromKey( | |||
| 692 | 702 | ||
| 693 | // Try to open the dependency key. | 703 | // Try to open the dependency key. |
| 694 | hr = RegOpen(hkHive, sczKey, KEY_READ, &hkKey); | 704 | hr = RegOpen(hkHive, sczKey, KEY_READ, &hkKey); |
| 695 | if (E_FILENOTFOUND != hr) | 705 | DepExitOnPathFailure(hr, fExists, "Failed to open the registry key for the dependency \"%ls\".", wzProviderKey); |
| 696 | { | 706 | |
| 697 | DepExitOnFailure(hr, "Failed to open the registry key for the dependency \"%ls\".", wzProviderKey); | 707 | if (!fExists) |
| 698 | } | ||
| 699 | else | ||
| 700 | { | 708 | { |
| 701 | ExitFunction1(hr = S_OK); | 709 | ExitFunction(); |
| 702 | } | 710 | } |
| 703 | 711 | ||
| 704 | // Get the DisplayName if available. | 712 | // Get the DisplayName if available. |
| 705 | hr = RegReadString(hkKey, vcszDisplayNameValue, psczName); | 713 | hr = RegReadString(hkKey, vcszDisplayNameValue, psczName); |
| 706 | if (E_FILENOTFOUND != hr) | 714 | DepExitOnPathFailure(hr, fExists, "Failed to get the dependency name for the dependency \"%ls\".", wzProviderKey); |
| 707 | { | ||
| 708 | DepExitOnFailure(hr, "Failed to get the dependency name for the dependency \"%ls\".", wzProviderKey); | ||
| 709 | } | ||
| 710 | else | ||
| 711 | { | ||
| 712 | ExitFunction1(hr = S_OK); | ||
| 713 | } | ||
| 714 | 715 | ||
| 715 | LExit: | 716 | LExit: |
| 716 | ReleaseRegKey(hkKey); | 717 | ReleaseRegKey(hkKey); |
diff --git a/src/libs/dutil/WixToolset.DUtil/dirutil.cpp b/src/libs/dutil/WixToolset.DUtil/dirutil.cpp index 2c02225d..8c7ef461 100644 --- a/src/libs/dutil/WixToolset.DUtil/dirutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/dirutil.cpp | |||
| @@ -17,6 +17,8 @@ | |||
| 17 | #define DirExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_DIRUTIL, p, x, s, __VA_ARGS__) | 17 | #define DirExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_DIRUTIL, p, x, s, __VA_ARGS__) |
| 18 | #define DirExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_DIRUTIL, e, x, s, __VA_ARGS__) | 18 | #define DirExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_DIRUTIL, e, x, s, __VA_ARGS__) |
| 19 | #define DirExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_DIRUTIL, g, x, s, __VA_ARGS__) | 19 | #define DirExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_DIRUTIL, g, x, s, __VA_ARGS__) |
| 20 | #define DirExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_DIRUTIL, x, b, s, __VA_ARGS__) | ||
| 21 | #define DirExitWithPathLastError(x, s, ...) ExitWithPathLastErrorSource(DUTIL_SOURCE_DIRUTIL, x, s, __VA_ARGS__) | ||
| 20 | 22 | ||
| 21 | 23 | ||
| 22 | /******************************************************************* | 24 | /******************************************************************* |
| @@ -184,13 +186,9 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
| 184 | 186 | ||
| 185 | if (-1 == (dwAttrib = ::GetFileAttributesW(wzPath))) | 187 | if (-1 == (dwAttrib = ::GetFileAttributesW(wzPath))) |
| 186 | { | 188 | { |
| 187 | er = ::GetLastError(); | 189 | DirExitWithPathLastError(hr, "Failed to get attributes for path: %ls", wzPath); |
| 188 | if (ERROR_FILE_NOT_FOUND == er) // change "file not found" to "path not found" since we were looking for a directory. | 190 | |
| 189 | { | 191 | ExitFunction1(hr = E_PATHNOTFOUND); |
| 190 | er = ERROR_PATH_NOT_FOUND; | ||
| 191 | } | ||
| 192 | hr = HRESULT_FROM_WIN32(er); | ||
| 193 | DirExitOnRootFailure(hr, "Failed to get attributes for path: %ls", wzPath); | ||
| 194 | } | 192 | } |
| 195 | 193 | ||
| 196 | if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) | 194 | if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) |
| @@ -199,7 +197,9 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
| 199 | { | 197 | { |
| 200 | if (!::SetFileAttributesW(wzPath, FILE_ATTRIBUTE_NORMAL)) | 198 | if (!::SetFileAttributesW(wzPath, FILE_ATTRIBUTE_NORMAL)) |
| 201 | { | 199 | { |
| 202 | DirExitWithLastError(hr, "Failed to remove read-only attribute from path: %ls", wzPath); | 200 | DirExitWithPathLastError(hr, "Failed to remove read-only attribute from path: %ls", wzPath); |
| 201 | |||
| 202 | ExitFunction1(hr = E_PATHNOTFOUND); | ||
| 203 | } | 203 | } |
| 204 | } | 204 | } |
| 205 | 205 | ||
| @@ -245,9 +245,12 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
| 245 | hr = DirEnsureDeleteEx(sczDelete, dwFlags); // recursive call | 245 | hr = DirEnsureDeleteEx(sczDelete, dwFlags); // recursive call |
| 246 | if (FAILED(hr)) | 246 | if (FAILED(hr)) |
| 247 | { | 247 | { |
| 248 | // if we failed to delete a subdirectory, keep trying to finish any remaining files | 248 | // if we failed to delete a subdirectory, keep trying to finish any remaining files |
| 249 | ExitTraceSource(DUTIL_SOURCE_DIRUTIL, hr, "Failed to delete subdirectory; continuing: %ls", sczDelete); | 249 | if (E_PATHNOTFOUND != hr) |
| 250 | hr = S_OK; | 250 | { |
| 251 | ExitTraceSource(DUTIL_SOURCE_DIRUTIL, hr, "Failed to delete subdirectory; continuing: %ls", sczDelete); | ||
| 252 | } | ||
| 253 | hr = S_OK; | ||
| 251 | } | 254 | } |
| 252 | } | 255 | } |
| 253 | else if (fDeleteFiles) // this is a file, just delete it | 256 | else if (fDeleteFiles) // this is a file, just delete it |
| @@ -256,7 +259,8 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
| 256 | { | 259 | { |
| 257 | if (!::SetFileAttributesW(sczDelete, FILE_ATTRIBUTE_NORMAL)) | 260 | if (!::SetFileAttributesW(sczDelete, FILE_ATTRIBUTE_NORMAL)) |
| 258 | { | 261 | { |
| 259 | DirExitWithLastError(hr, "Failed to remove attributes from file: %ls", sczDelete); | 262 | DirExitWithPathLastError(hr, "Failed to remove attributes from file: %ls", sczDelete); |
| 263 | continue; | ||
| 260 | } | 264 | } |
| 261 | } | 265 | } |
| 262 | 266 | ||
| @@ -280,7 +284,7 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
| 280 | } | 284 | } |
| 281 | else | 285 | else |
| 282 | { | 286 | { |
| 283 | DirExitWithLastError(hr, "Failed to delete file: %ls", sczDelete); | 287 | DirExitWithPathLastError(hr, "Failed to delete file: %ls", sczDelete); |
| 284 | } | 288 | } |
| 285 | } | 289 | } |
| 286 | } | 290 | } |
| @@ -308,13 +312,21 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
| 308 | } | 312 | } |
| 309 | } | 313 | } |
| 310 | 314 | ||
| 315 | if (E_PATHNOTFOUND == hr || E_FILENOTFOUND == hr) | ||
| 316 | { | ||
| 317 | ExitFunction1(hr = E_PATHNOTFOUND); | ||
| 318 | } | ||
| 319 | else if (HRESULT_FROM_WIN32(ERROR_DIR_NOT_EMPTY) == hr && !fDeleteFiles && !fRecurse) | ||
| 320 | { | ||
| 321 | ExitFunction(); | ||
| 322 | } | ||
| 323 | |||
| 311 | DirExitOnRootFailure(hr, "Failed to remove directory: %ls", wzPath); | 324 | DirExitOnRootFailure(hr, "Failed to remove directory: %ls", wzPath); |
| 312 | } | 325 | } |
| 313 | } | 326 | } |
| 314 | else | 327 | else |
| 315 | { | 328 | { |
| 316 | hr = E_UNEXPECTED; | 329 | DirExitWithRootFailure(hr, E_UNEXPECTED, "Directory delete cannot delete file: %ls", wzPath); |
| 317 | DirExitOnFailure(hr, "Directory delete cannot delete file: %ls", wzPath); | ||
| 318 | } | 330 | } |
| 319 | 331 | ||
| 320 | Assert(S_OK == hr); | 332 | Assert(S_OK == hr); |
diff --git a/src/libs/dutil/WixToolset.DUtil/file2utl.cpp b/src/libs/dutil/WixToolset.DUtil/file2utl.cpp index 88f8377c..3ab47f59 100644 --- a/src/libs/dutil/WixToolset.DUtil/file2utl.cpp +++ b/src/libs/dutil/WixToolset.DUtil/file2utl.cpp | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #define FileExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_FILEUTIL, p, x, s, __VA_ARGS__) | 16 | #define FileExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_FILEUTIL, p, x, s, __VA_ARGS__) |
| 17 | #define FileExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_FILEUTIL, e, x, s, __VA_ARGS__) | 17 | #define FileExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_FILEUTIL, e, x, s, __VA_ARGS__) |
| 18 | #define FileExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_FILEUTIL, g, x, s, __VA_ARGS__) | 18 | #define FileExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_FILEUTIL, g, x, s, __VA_ARGS__) |
| 19 | #define FileExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_FILEUTIL, x, b, s, __VA_ARGS__) | ||
| 19 | 20 | ||
| 20 | // constants | 21 | // constants |
| 21 | 22 | ||
| @@ -35,6 +36,7 @@ extern "C" BOOL DAPI FileExistsAfterRestart( | |||
| 35 | { | 36 | { |
| 36 | HRESULT hr = S_OK; | 37 | HRESULT hr = S_OK; |
| 37 | BOOL fExists = FALSE; | 38 | BOOL fExists = FALSE; |
| 39 | BOOL fRegExists = FALSE; | ||
| 38 | HKEY hkPendingFileRename = NULL; | 40 | HKEY hkPendingFileRename = NULL; |
| 39 | LPWSTR* rgsczRenames = NULL; | 41 | LPWSTR* rgsczRenames = NULL; |
| 40 | DWORD cRenames = 0; | 42 | DWORD cRenames = 0; |
| @@ -44,18 +46,20 @@ extern "C" BOOL DAPI FileExistsAfterRestart( | |||
| 44 | if (fExists) | 46 | if (fExists) |
| 45 | { | 47 | { |
| 46 | hr = RegOpen(HKEY_LOCAL_MACHINE, REGISTRY_PENDING_FILE_RENAME_KEY, KEY_QUERY_VALUE, &hkPendingFileRename); | 48 | hr = RegOpen(HKEY_LOCAL_MACHINE, REGISTRY_PENDING_FILE_RENAME_KEY, KEY_QUERY_VALUE, &hkPendingFileRename); |
| 47 | if (E_FILENOTFOUND == hr) | 49 | FileExitOnPathFailure(hr, fRegExists, "Failed to open pending file rename registry key."); |
| 50 | |||
| 51 | if (!fRegExists) | ||
| 48 | { | 52 | { |
| 49 | ExitFunction1(hr = S_OK); | 53 | ExitFunction(); |
| 50 | } | 54 | } |
| 51 | FileExitOnFailure(hr, "Failed to open pending file rename registry key."); | ||
| 52 | 55 | ||
| 53 | hr = RegReadStringArray(hkPendingFileRename, REGISTRY_PENDING_FILE_RENAME_VALUE, &rgsczRenames, &cRenames); | 56 | hr = RegReadStringArray(hkPendingFileRename, REGISTRY_PENDING_FILE_RENAME_VALUE, &rgsczRenames, &cRenames); |
| 54 | if (E_FILENOTFOUND == hr) | 57 | FileExitOnPathFailure(hr, fRegExists, "Failed to read pending file renames."); |
| 58 | |||
| 59 | if (!fRegExists) | ||
| 55 | { | 60 | { |
| 56 | ExitFunction1(hr = S_OK); | 61 | ExitFunction(); |
| 57 | } | 62 | } |
| 58 | FileExitOnFailure(hr, "Failed to read pending file renames."); | ||
| 59 | 63 | ||
| 60 | // The pending file renames array is pairs of source and target paths. We only care | 64 | // The pending file renames array is pairs of source and target paths. We only care |
| 61 | // about checking the source paths so skip the target paths (i += 2). | 65 | // about checking the source paths so skip the target paths (i += 2). |
| @@ -95,6 +99,7 @@ extern "C" HRESULT DAPI FileRemoveFromPendingRename( | |||
| 95 | { | 99 | { |
| 96 | HRESULT hr = S_OK; | 100 | HRESULT hr = S_OK; |
| 97 | HKEY hkPendingFileRename = NULL; | 101 | HKEY hkPendingFileRename = NULL; |
| 102 | BOOL fExists = FALSE; | ||
| 98 | LPWSTR* rgsczRenames = NULL; | 103 | LPWSTR* rgsczRenames = NULL; |
| 99 | DWORD cRenames = 0; | 104 | DWORD cRenames = 0; |
| 100 | BOOL fPathEqual = FALSE; | 105 | BOOL fPathEqual = FALSE; |
| @@ -102,18 +107,20 @@ extern "C" HRESULT DAPI FileRemoveFromPendingRename( | |||
| 102 | DWORD cNewRenames = 0; | 107 | DWORD cNewRenames = 0; |
| 103 | 108 | ||
| 104 | hr = RegOpen(HKEY_LOCAL_MACHINE, REGISTRY_PENDING_FILE_RENAME_KEY, KEY_QUERY_VALUE | KEY_SET_VALUE, &hkPendingFileRename); | 109 | hr = RegOpen(HKEY_LOCAL_MACHINE, REGISTRY_PENDING_FILE_RENAME_KEY, KEY_QUERY_VALUE | KEY_SET_VALUE, &hkPendingFileRename); |
| 105 | if (E_FILENOTFOUND == hr) | 110 | FileExitOnPathFailure(hr, fExists, "Failed to open pending file rename registry key."); |
| 111 | |||
| 112 | if (!fExists) | ||
| 106 | { | 113 | { |
| 107 | ExitFunction1(hr = S_OK); | 114 | ExitFunction(); |
| 108 | } | 115 | } |
| 109 | FileExitOnFailure(hr, "Failed to open pending file rename registry key."); | ||
| 110 | 116 | ||
| 111 | hr = RegReadStringArray(hkPendingFileRename, REGISTRY_PENDING_FILE_RENAME_VALUE, &rgsczRenames, &cRenames); | 117 | hr = RegReadStringArray(hkPendingFileRename, REGISTRY_PENDING_FILE_RENAME_VALUE, &rgsczRenames, &cRenames); |
| 112 | if (E_FILENOTFOUND == hr) | 118 | FileExitOnPathFailure(hr, fExists, "Failed to read pending file renames."); |
| 119 | |||
| 120 | if (!fExists) | ||
| 113 | { | 121 | { |
| 114 | ExitFunction1(hr = S_OK); | 122 | ExitFunction(); |
| 115 | } | 123 | } |
| 116 | FileExitOnFailure(hr, "Failed to read pending file renames."); | ||
| 117 | 124 | ||
| 118 | // The pending file renames array is pairs of source and target paths. We only care | 125 | // The pending file renames array is pairs of source and target paths. We only care |
| 119 | // about checking the source paths so skip the target paths (i += 2). | 126 | // about checking the source paths so skip the target paths (i += 2). |
diff --git a/src/libs/dutil/WixToolset.DUtil/fileutil.cpp b/src/libs/dutil/WixToolset.DUtil/fileutil.cpp index ac407916..a9369ea1 100644 --- a/src/libs/dutil/WixToolset.DUtil/fileutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/fileutil.cpp | |||
| @@ -443,6 +443,7 @@ extern "C" HRESULT DAPI FileSize( | |||
| 443 | ) | 443 | ) |
| 444 | { | 444 | { |
| 445 | HRESULT hr = S_OK; | 445 | HRESULT hr = S_OK; |
| 446 | DWORD er = ERROR_SUCCESS; | ||
| 446 | HANDLE hFile = INVALID_HANDLE_VALUE; | 447 | HANDLE hFile = INVALID_HANDLE_VALUE; |
| 447 | 448 | ||
| 448 | FileExitOnNull(pwzFileName, hr, E_INVALIDARG, "Attempted to check filename, but no filename was provided"); | 449 | FileExitOnNull(pwzFileName, hr, E_INVALIDARG, "Attempted to check filename, but no filename was provided"); |
| @@ -450,6 +451,11 @@ extern "C" HRESULT DAPI FileSize( | |||
| 450 | hFile = ::CreateFileW(pwzFileName, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); | 451 | hFile = ::CreateFileW(pwzFileName, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); |
| 451 | if (INVALID_HANDLE_VALUE == hFile) | 452 | if (INVALID_HANDLE_VALUE == hFile) |
| 452 | { | 453 | { |
| 454 | er = ::GetLastError(); | ||
| 455 | if (ERROR_PATH_NOT_FOUND == er || ERROR_FILE_NOT_FOUND == er) | ||
| 456 | { | ||
| 457 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); | ||
| 458 | } | ||
| 453 | FileExitWithLastError(hr, "Failed to open file %ls while checking file size", pwzFileName); | 459 | FileExitWithLastError(hr, "Failed to open file %ls while checking file size", pwzFileName); |
| 454 | } | 460 | } |
| 455 | 461 | ||
| @@ -617,11 +623,11 @@ extern "C" HRESULT DAPI FileReadPartialEx( | |||
| 617 | if (INVALID_HANDLE_VALUE == hFile) | 623 | if (INVALID_HANDLE_VALUE == hFile) |
| 618 | { | 624 | { |
| 619 | er = ::GetLastError(); | 625 | er = ::GetLastError(); |
| 620 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) | 626 | if (ERROR_PATH_NOT_FOUND == er || ERROR_FILE_NOT_FOUND == er) |
| 621 | { | 627 | { |
| 622 | ExitFunction1(hr = E_FILENOTFOUND); | 628 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); |
| 623 | } | 629 | } |
| 624 | FileExitOnWin32Error(er, hr, "Failed to open file: %ls", wzSrcPath); | 630 | FileExitWithLastError(hr, "Failed to open file: %ls", wzSrcPath); |
| 625 | } | 631 | } |
| 626 | 632 | ||
| 627 | if (!::GetFileSizeEx(hFile, &liFileSize)) | 633 | if (!::GetFileSizeEx(hFile, &liFileSize)) |
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/dutil.h b/src/libs/dutil/WixToolset.DUtil/inc/dutil.h index 2db64812..4a172f46 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/dutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/dutil.h | |||
| @@ -131,6 +131,8 @@ void DAPI Dutil_RootFailure(__in_z LPCSTR szFile, __in int iLine, __in HRESULT h | |||
| 131 | #define ExitOnOptionalXmlQueryFailureSource(d, x, b, s, ...) { { if (S_FALSE == x || E_NOTFOUND == x) { b = FALSE; x = S_OK; } else { b = SUCCEEDED(x); } }; ExitOnRootFailureSource(d, x, s, __VA_ARGS__); } | 131 | #define ExitOnOptionalXmlQueryFailureSource(d, x, b, s, ...) { { if (S_FALSE == x || E_NOTFOUND == x) { b = FALSE; x = S_OK; } else { b = SUCCEEDED(x); } }; ExitOnRootFailureSource(d, x, s, __VA_ARGS__); } |
| 132 | #define ExitOnRequiredXmlQueryFailureSource(d, x, s, ...) { if (S_FALSE == x) { x = E_NOTFOUND; } ExitOnRootFailureSource(d, x, s, __VA_ARGS__); } | 132 | #define ExitOnRequiredXmlQueryFailureSource(d, x, s, ...) { if (S_FALSE == x) { x = E_NOTFOUND; } ExitOnRootFailureSource(d, x, s, __VA_ARGS__); } |
| 133 | #define ExitOnWaitObjectFailureSource(d, x, b, s, ...) { { if (HRESULT_FROM_WIN32(WAIT_TIMEOUT) == x) { b = TRUE; x = S_OK; } else { b = FALSE; } }; ExitOnFailureSource(d, x, s, __VA_ARGS__); } | 133 | #define ExitOnWaitObjectFailureSource(d, x, b, s, ...) { { if (HRESULT_FROM_WIN32(WAIT_TIMEOUT) == x) { b = TRUE; x = S_OK; } else { b = FALSE; } }; ExitOnFailureSource(d, x, s, __VA_ARGS__); } |
| 134 | #define ExitOnPathFailureSource(d, x, b, s, ...) { { if (E_PATHNOTFOUND == x || E_FILENOTFOUND == x) { b = FALSE; x = S_OK; } else { b = SUCCEEDED(x); } }; ExitOnFailureSource(d, x, s, __VA_ARGS__); } | ||
| 135 | #define ExitWithPathLastErrorSource(d, x, s, ...) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } else if (E_PATHNOTFOUND == x || E_FILENOTFOUND == x) { x = S_OK; } ExitOnRootFailureSource(d, x, s, __VA_ARGS__); } | ||
| 134 | 136 | ||
| 135 | #define ExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | 137 | #define ExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) |
| 136 | #define ExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | 138 | #define ExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) |
| @@ -147,6 +149,8 @@ void DAPI Dutil_RootFailure(__in_z LPCSTR szFile, __in int iLine, __in HRESULT h | |||
| 147 | #define ExitOnOptionalXmlQueryFailure(x, b, s, ...) ExitOnOptionalXmlQueryFailureSource(DUTIL_SOURCE_DEFAULT, x, b, s, __VA_ARGS__) | 149 | #define ExitOnOptionalXmlQueryFailure(x, b, s, ...) ExitOnOptionalXmlQueryFailureSource(DUTIL_SOURCE_DEFAULT, x, b, s, __VA_ARGS__) |
| 148 | #define ExitOnRequiredXmlQueryFailure(x, s, ...) ExitOnRequiredXmlQueryFailureSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | 150 | #define ExitOnRequiredXmlQueryFailure(x, s, ...) ExitOnRequiredXmlQueryFailureSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) |
| 149 | #define ExitOnWaitObjectFailure(x, b, s, ...) ExitOnWaitObjectFailureSource(DUTIL_SOURCE_DEFAULT, x, b, s, __VA_ARGS__) | 151 | #define ExitOnWaitObjectFailure(x, b, s, ...) ExitOnWaitObjectFailureSource(DUTIL_SOURCE_DEFAULT, x, b, s, __VA_ARGS__) |
| 152 | #define ExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_DEFAULT, x, b, s, __VA_ARGS__) | ||
| 153 | #define ExitWithPathLastError(x, s, ...) ExitWithPathLastErrorSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | ||
| 150 | 154 | ||
| 151 | // release macros | 155 | // release macros |
| 152 | #define ReleaseObject(x) if (x) { x->Release(); } | 156 | #define ReleaseObject(x) if (x) { x->Release(); } |
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/logutil.h b/src/libs/dutil/WixToolset.DUtil/inc/logutil.h index 1636e297..8f38e0ce 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/logutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/logutil.h | |||
| @@ -8,9 +8,11 @@ extern "C" { | |||
| 8 | 8 | ||
| 9 | #define LogExitOnFailureSource(d, x, i, f, ...) if (FAILED(x)) { LogErrorId(x, i, __VA_ARGS__); ExitTraceSource(d, x, f, __VA_ARGS__); goto LExit; } | 9 | #define LogExitOnFailureSource(d, x, i, f, ...) if (FAILED(x)) { LogErrorId(x, i, __VA_ARGS__); ExitTraceSource(d, x, f, __VA_ARGS__); goto LExit; } |
| 10 | #define LogExitOnRootFailureSource(d, x, i, f, ...) if (FAILED(x)) { LogErrorId(x, i, __VA_ARGS__); Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, f, __VA_ARGS__); goto LExit; } | 10 | #define LogExitOnRootFailureSource(d, x, i, f, ...) if (FAILED(x)) { LogErrorId(x, i, __VA_ARGS__); Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, f, __VA_ARGS__); goto LExit; } |
| 11 | #define LogExitWithRootFailureSource(d, x, e, i, f, ...) { x = FAILED(e) ? e : E_FAIL; LogErrorId(x, i, __VA_ARGS__); Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, f, __VA_ARGS__); goto LExit; } | ||
| 11 | 12 | ||
| 12 | #define LogExitOnFailure(x, i, f, ...) LogExitOnFailureSource(DUTIL_SOURCE_DEFAULT, x, i, f, __VA_ARGS__) | 13 | #define LogExitOnFailure(x, i, f, ...) LogExitOnFailureSource(DUTIL_SOURCE_DEFAULT, x, i, f, __VA_ARGS__) |
| 13 | #define LogExitOnRootFailure(x, i, f, ...) LogExitOnRootFailureSource(DUTIL_SOURCE_DEFAULT, x, i, f, __VA_ARGS__) | 14 | #define LogExitOnRootFailure(x, i, f, ...) LogExitOnRootFailureSource(DUTIL_SOURCE_DEFAULT, x, i, f, __VA_ARGS__) |
| 15 | #define LogExitWithRootFailure(x, e, i, f, ...) LogExitWithRootFailureSource(DUTIL_SOURCE_DEFAULT, x, e, i, f, __VA_ARGS__) | ||
| 14 | 16 | ||
| 15 | typedef HRESULT (DAPI *PFN_LOGSTRINGWORKRAW)( | 17 | typedef HRESULT (DAPI *PFN_LOGSTRINGWORKRAW)( |
| 16 | __in_z LPCSTR szString, | 18 | __in_z LPCSTR szString, |
diff --git a/src/libs/dutil/WixToolset.DUtil/monutil.cpp b/src/libs/dutil/WixToolset.DUtil/monutil.cpp index 10954164..d7bcfa52 100644 --- a/src/libs/dutil/WixToolset.DUtil/monutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/monutil.cpp | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #define MonExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_MONUTIL, e, x, s, __VA_ARGS__) | 17 | #define MonExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_MONUTIL, e, x, s, __VA_ARGS__) |
| 18 | #define MonExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_MONUTIL, g, x, s, __VA_ARGS__) | 18 | #define MonExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_MONUTIL, g, x, s, __VA_ARGS__) |
| 19 | #define MonExitOnWaitObjectFailure(x, b, s, ...) ExitOnWaitObjectFailureSource(DUTIL_SOURCE_MONUTIL, x, b, s, __VA_ARGS__) | 19 | #define MonExitOnWaitObjectFailure(x, b, s, ...) ExitOnWaitObjectFailureSource(DUTIL_SOURCE_MONUTIL, x, b, s, __VA_ARGS__) |
| 20 | #define MonExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_MONUTIL, x, b, s, __VA_ARGS__) | ||
| 20 | 21 | ||
| 21 | const int MON_THREAD_GROWTH = 5; | 22 | const int MON_THREAD_GROWTH = 5; |
| 22 | const int MON_ARRAY_GROWTH = 40; | 23 | const int MON_ARRAY_GROWTH = 40; |
| @@ -982,6 +983,7 @@ static HRESULT InitiateWait( | |||
| 982 | DWORD dwIndex = 0; | 983 | DWORD dwIndex = 0; |
| 983 | HKEY hk = NULL; | 984 | HKEY hk = NULL; |
| 984 | HANDLE hTemp = INVALID_HANDLE_VALUE; | 985 | HANDLE hTemp = INVALID_HANDLE_VALUE; |
| 986 | BOOL fExists = FALSE; | ||
| 985 | 987 | ||
| 986 | if (pRequest->hNotify) | 988 | if (pRequest->hNotify) |
| 987 | { | 989 | { |
| @@ -1025,11 +1027,12 @@ static HRESULT InitiateWait( | |||
| 1025 | case MON_REGKEY: | 1027 | case MON_REGKEY: |
| 1026 | ReleaseRegKey(pRequest->regkey.hkSubKey); | 1028 | ReleaseRegKey(pRequest->regkey.hkSubKey); |
| 1027 | hr = RegOpen(pRequest->regkey.hkRoot, pRequest->rgsczPathHierarchy[dwIndex], KEY_NOTIFY | GetRegKeyBitness(pRequest), &pRequest->regkey.hkSubKey); | 1029 | hr = RegOpen(pRequest->regkey.hkRoot, pRequest->rgsczPathHierarchy[dwIndex], KEY_NOTIFY | GetRegKeyBitness(pRequest), &pRequest->regkey.hkSubKey); |
| 1028 | if (E_FILENOTFOUND == hr || E_PATHNOTFOUND == hr) | 1030 | MonExitOnPathFailure(hr, fExists, "Failed to open regkey %ls", pRequest->rgsczPathHierarchy[dwIndex]); |
| 1031 | |||
| 1032 | if (!fExists) | ||
| 1029 | { | 1033 | { |
| 1030 | continue; | 1034 | continue; |
| 1031 | } | 1035 | } |
| 1032 | MonExitOnFailure(hr, "Failed to open regkey %ls", pRequest->rgsczPathHierarchy[dwIndex]); | ||
| 1033 | 1036 | ||
| 1034 | er = ::RegNotifyChangeKeyValue(pRequest->regkey.hkSubKey, GetRecursiveFlag(pRequest, dwIndex), REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_SECURITY, *pHandle, TRUE); | 1037 | er = ::RegNotifyChangeKeyValue(pRequest->regkey.hkSubKey, GetRecursiveFlag(pRequest, dwIndex), REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_SECURITY, *pHandle, TRUE); |
| 1035 | ReleaseRegKey(hk); | 1038 | ReleaseRegKey(hk); |
| @@ -1038,12 +1041,9 @@ static HRESULT InitiateWait( | |||
| 1038 | { | 1041 | { |
| 1039 | continue; | 1042 | continue; |
| 1040 | } | 1043 | } |
| 1041 | else | 1044 | MonExitOnFailure(hr, "Failed to wait on subkey %ls", pRequest->rgsczPathHierarchy[dwIndex]); |
| 1042 | { | ||
| 1043 | MonExitOnWin32Error(er, hr, "Failed to wait on subkey %ls", pRequest->rgsczPathHierarchy[dwIndex]); | ||
| 1044 | 1045 | ||
| 1045 | fHandleFound = TRUE; | 1046 | fHandleFound = TRUE; |
| 1046 | } | ||
| 1047 | 1047 | ||
| 1048 | break; | 1048 | break; |
| 1049 | default: | 1049 | default: |
diff --git a/src/libs/dutil/WixToolset.DUtil/osutil.cpp b/src/libs/dutil/WixToolset.DUtil/osutil.cpp index 880ec3ea..4798dc58 100644 --- a/src/libs/dutil/WixToolset.DUtil/osutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/osutil.cpp | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #define OsExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_OSUTIL, p, x, s, __VA_ARGS__) | 16 | #define OsExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_OSUTIL, p, x, s, __VA_ARGS__) |
| 17 | #define OsExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_OSUTIL, e, x, s, __VA_ARGS__) | 17 | #define OsExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_OSUTIL, e, x, s, __VA_ARGS__) |
| 18 | #define OsExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_OSUTIL, g, x, s, __VA_ARGS__) | 18 | #define OsExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_OSUTIL, g, x, s, __VA_ARGS__) |
| 19 | #define OsExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_OSUTIL, x, b, s, __VA_ARGS__) | ||
| 19 | 20 | ||
| 20 | typedef NTSTATUS(NTAPI* PFN_RTL_GET_VERSION)(_Out_ PRTL_OSVERSIONINFOEXW lpVersionInformation); | 21 | typedef NTSTATUS(NTAPI* PFN_RTL_GET_VERSION)(_Out_ PRTL_OSVERSIONINFOEXW lpVersionInformation); |
| 21 | 22 | ||
| @@ -186,23 +187,26 @@ extern "C" HRESULT DAPI OsIsUacEnabled( | |||
| 186 | { | 187 | { |
| 187 | HRESULT hr = S_OK; | 188 | HRESULT hr = S_OK; |
| 188 | HKEY hk = NULL; | 189 | HKEY hk = NULL; |
| 190 | BOOL fExists = FALSE; | ||
| 189 | DWORD dwUacEnabled = 0; | 191 | DWORD dwUacEnabled = 0; |
| 190 | 192 | ||
| 191 | *pfUacEnabled = FALSE; // assume UAC not enabled. | 193 | *pfUacEnabled = FALSE; // assume UAC not enabled. |
| 192 | 194 | ||
| 193 | hr = RegOpen(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", KEY_READ, &hk); | 195 | hr = RegOpen(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", KEY_READ, &hk); |
| 194 | if (E_FILENOTFOUND == hr) | 196 | OsExitOnPathFailure(hr, fExists, "Failed to open system policy key to detect UAC."); |
| 197 | |||
| 198 | if (!fExists) | ||
| 195 | { | 199 | { |
| 196 | ExitFunction1(hr = S_OK); | 200 | ExitFunction(); |
| 197 | } | 201 | } |
| 198 | OsExitOnFailure(hr, "Failed to open system policy key to detect UAC."); | ||
| 199 | 202 | ||
| 200 | hr = RegReadNumber(hk, L"EnableLUA", &dwUacEnabled); | 203 | hr = RegReadNumber(hk, L"EnableLUA", &dwUacEnabled); |
| 201 | if (E_FILENOTFOUND == hr) | 204 | OsExitOnPathFailure(hr, fExists, "Failed to read registry value to detect UAC."); |
| 205 | |||
| 206 | if (!fExists) | ||
| 202 | { | 207 | { |
| 203 | ExitFunction1(hr = S_OK); | 208 | ExitFunction(); |
| 204 | } | 209 | } |
| 205 | OsExitOnFailure(hr, "Failed to read registry value to detect UAC."); | ||
| 206 | 210 | ||
| 207 | *pfUacEnabled = (0 != dwUacEnabled); | 211 | *pfUacEnabled = (0 != dwUacEnabled); |
| 208 | 212 | ||
diff --git a/src/libs/dutil/WixToolset.DUtil/path3utl.cpp b/src/libs/dutil/WixToolset.DUtil/path3utl.cpp index cb6ce6d5..844cbfbb 100644 --- a/src/libs/dutil/WixToolset.DUtil/path3utl.cpp +++ b/src/libs/dutil/WixToolset.DUtil/path3utl.cpp | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #define PathExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_PATHUTIL, p, x, s, __VA_ARGS__) | 17 | #define PathExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_PATHUTIL, p, x, s, __VA_ARGS__) |
| 18 | #define PathExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_PATHUTIL, e, x, s, __VA_ARGS__) | 18 | #define PathExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_PATHUTIL, e, x, s, __VA_ARGS__) |
| 19 | #define PathExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_PATHUTIL, g, x, s, __VA_ARGS__) | 19 | #define PathExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_PATHUTIL, g, x, s, __VA_ARGS__) |
| 20 | #define PathExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_PATHUTIL, x, b, s, __VA_ARGS__) | ||
| 20 | 21 | ||
| 21 | static HRESULT GetTempPathFromSystemEnvironmentVariable( | 22 | static HRESULT GetTempPathFromSystemEnvironmentVariable( |
| 22 | __in HKEY hKey, | 23 | __in HKEY hKey, |
| @@ -32,6 +33,7 @@ DAPI_(HRESULT) PathGetSystemTempPaths( | |||
| 32 | HRESULT hr = S_OK; | 33 | HRESULT hr = S_OK; |
| 33 | HMODULE hModule = NULL; | 34 | HMODULE hModule = NULL; |
| 34 | BOOL fSystem = FALSE; | 35 | BOOL fSystem = FALSE; |
| 36 | BOOL fExists = FALSE; | ||
| 35 | HKEY hKey = NULL; | 37 | HKEY hKey = NULL; |
| 36 | LPWSTR sczTemp = NULL; | 38 | LPWSTR sczTemp = NULL; |
| 37 | 39 | ||
| @@ -61,10 +63,10 @@ DAPI_(HRESULT) PathGetSystemTempPaths( | |||
| 61 | 63 | ||
| 62 | // There is no documented API to get system environment variables, so read them from the registry. | 64 | // There is no documented API to get system environment variables, so read them from the registry. |
| 63 | hr = RegOpen(HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Session Manager\\Environment", KEY_READ, &hKey); | 65 | hr = RegOpen(HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Session Manager\\Environment", KEY_READ, &hKey); |
| 64 | if (E_FILENOTFOUND != hr) | 66 | PathExitOnPathFailure(hr, fExists, "Failed to open system environment registry key."); |
| 65 | { | ||
| 66 | PathExitOnFailure(hr, "Failed to open system environment registry key."); | ||
| 67 | 67 | ||
| 68 | if (fExists) | ||
| 69 | { | ||
| 68 | hr = GetTempPathFromSystemEnvironmentVariable(hKey, L"TMP", &sczTemp); | 70 | hr = GetTempPathFromSystemEnvironmentVariable(hKey, L"TMP", &sczTemp); |
| 69 | PathExitOnFailure(hr, "Failed to get temp path from system TMP."); | 71 | PathExitOnFailure(hr, "Failed to get temp path from system TMP."); |
| 70 | 72 | ||
| @@ -118,14 +120,16 @@ static HRESULT GetTempPathFromSystemEnvironmentVariable( | |||
| 118 | HRESULT hr = S_OK; | 120 | HRESULT hr = S_OK; |
| 119 | LPWSTR sczValue = NULL; | 121 | LPWSTR sczValue = NULL; |
| 120 | BOOL fNeedsExpansion = FALSE; | 122 | BOOL fNeedsExpansion = FALSE; |
| 123 | BOOL fExists = FALSE; | ||
| 121 | 124 | ||
| 122 | // Read the value unexpanded so that it can be expanded with system environment variables. | 125 | // Read the value unexpanded so that it can be expanded with system environment variables. |
| 123 | hr = RegReadUnexpandedString(hKey, wzName, &fNeedsExpansion, &sczValue); | 126 | hr = RegReadUnexpandedString(hKey, wzName, &fNeedsExpansion, &sczValue); |
| 124 | if (E_FILENOTFOUND == hr) | 127 | PathExitOnPathFailure(hr, fExists, "Failed to get system '%ls' value.", wzName); |
| 128 | |||
| 129 | if (!fExists) | ||
| 125 | { | 130 | { |
| 126 | ExitFunction1(hr = S_FALSE); | 131 | ExitFunction1(hr = S_FALSE); |
| 127 | } | 132 | } |
| 128 | PathExitOnFailure(hr, "Failed to get system '%ls' value.", wzName); | ||
| 129 | 133 | ||
| 130 | if (fNeedsExpansion) | 134 | if (fNeedsExpansion) |
| 131 | { | 135 | { |
diff --git a/src/libs/dutil/WixToolset.DUtil/polcutil.cpp b/src/libs/dutil/WixToolset.DUtil/polcutil.cpp index c2247bc1..a56c380b 100644 --- a/src/libs/dutil/WixToolset.DUtil/polcutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/polcutil.cpp | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #define PolcExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_POLCUTIL, p, x, s, __VA_ARGS__) | 16 | #define PolcExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_POLCUTIL, p, x, s, __VA_ARGS__) |
| 17 | #define PolcExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_POLCUTIL, e, x, s, __VA_ARGS__) | 17 | #define PolcExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_POLCUTIL, e, x, s, __VA_ARGS__) |
| 18 | #define PolcExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_POLCUTIL, g, x, s, __VA_ARGS__) | 18 | #define PolcExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_POLCUTIL, g, x, s, __VA_ARGS__) |
| 19 | #define PolcExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_POLCUTIL, x, b, s, __VA_ARGS__) | ||
| 19 | 20 | ||
| 20 | const LPCWSTR REGISTRY_POLICIES_KEY = L"SOFTWARE\\Policies\\"; | 21 | const LPCWSTR REGISTRY_POLICIES_KEY = L"SOFTWARE\\Policies\\"; |
| 21 | 22 | ||
| @@ -34,25 +35,28 @@ extern "C" HRESULT DAPI PolcReadNumber( | |||
| 34 | { | 35 | { |
| 35 | HRESULT hr = S_OK; | 36 | HRESULT hr = S_OK; |
| 36 | HKEY hk = NULL; | 37 | HKEY hk = NULL; |
| 38 | BOOL fExists = FALSE; | ||
| 37 | 39 | ||
| 38 | hr = OpenPolicyKey(wzPolicyPath, &hk); | 40 | hr = OpenPolicyKey(wzPolicyPath, &hk); |
| 39 | if (E_FILENOTFOUND == hr || E_PATHNOTFOUND == hr) | 41 | PolcExitOnFailure(hr, "Failed to open policy key: %ls", wzPolicyPath); |
| 42 | |||
| 43 | if (!hk) | ||
| 40 | { | 44 | { |
| 41 | ExitFunction1(hr = S_FALSE); | 45 | ExitFunction1(hr = S_FALSE); |
| 42 | } | 46 | } |
| 43 | PolcExitOnFailure(hr, "Failed to open policy key: %ls", wzPolicyPath); | ||
| 44 | 47 | ||
| 45 | hr = RegReadNumber(hk, wzPolicyName, pdw); | 48 | hr = RegReadNumber(hk, wzPolicyName, pdw); |
| 46 | if (E_FILENOTFOUND == hr || E_PATHNOTFOUND == hr) | 49 | PolcExitOnPathFailure(hr, fExists, "Failed to open policy key: %ls, name: %ls", wzPolicyPath, wzPolicyName); |
| 50 | |||
| 51 | if (!fExists) | ||
| 47 | { | 52 | { |
| 48 | ExitFunction1(hr = S_FALSE); | 53 | ExitFunction1(hr = S_FALSE); |
| 49 | } | 54 | } |
| 50 | PolcExitOnFailure(hr, "Failed to open policy key: %ls, name: %ls", wzPolicyPath, wzPolicyName); | ||
| 51 | 55 | ||
| 52 | LExit: | 56 | LExit: |
| 53 | ReleaseRegKey(hk); | 57 | ReleaseRegKey(hk); |
| 54 | 58 | ||
| 55 | if (S_FALSE == hr || FAILED(hr)) | 59 | if (!fExists) |
| 56 | { | 60 | { |
| 57 | *pdw = dwDefault; | 61 | *pdw = dwDefault; |
| 58 | } | 62 | } |
| @@ -69,25 +73,28 @@ extern "C" HRESULT DAPI PolcReadString( | |||
| 69 | { | 73 | { |
| 70 | HRESULT hr = S_OK; | 74 | HRESULT hr = S_OK; |
| 71 | HKEY hk = NULL; | 75 | HKEY hk = NULL; |
| 76 | BOOL fExists = FALSE; | ||
| 72 | 77 | ||
| 73 | hr = OpenPolicyKey(wzPolicyPath, &hk); | 78 | hr = OpenPolicyKey(wzPolicyPath, &hk); |
| 74 | if (E_FILENOTFOUND == hr || E_PATHNOTFOUND == hr) | 79 | PolcExitOnFailure(hr, "Failed to open policy key: %ls", wzPolicyPath); |
| 80 | |||
| 81 | if (!hk) | ||
| 75 | { | 82 | { |
| 76 | ExitFunction1(hr = S_FALSE); | 83 | ExitFunction1(hr = S_FALSE); |
| 77 | } | 84 | } |
| 78 | PolcExitOnFailure(hr, "Failed to open policy key: %ls", wzPolicyPath); | ||
| 79 | 85 | ||
| 80 | hr = RegReadString(hk, wzPolicyName, pscz); | 86 | hr = RegReadString(hk, wzPolicyName, pscz); |
| 81 | if (E_FILENOTFOUND == hr || E_PATHNOTFOUND == hr) | 87 | PolcExitOnPathFailure(hr, fExists, "Failed to open policy key: %ls, name: %ls", wzPolicyPath, wzPolicyName); |
| 88 | |||
| 89 | if (!fExists) | ||
| 82 | { | 90 | { |
| 83 | ExitFunction1(hr = S_FALSE); | 91 | ExitFunction1(hr = S_FALSE); |
| 84 | } | 92 | } |
| 85 | PolcExitOnFailure(hr, "Failed to open policy key: %ls, name: %ls", wzPolicyPath, wzPolicyName); | ||
| 86 | 93 | ||
| 87 | LExit: | 94 | LExit: |
| 88 | ReleaseRegKey(hk); | 95 | ReleaseRegKey(hk); |
| 89 | 96 | ||
| 90 | if (S_FALSE == hr || FAILED(hr)) | 97 | if (!fExists) |
| 91 | { | 98 | { |
| 92 | if (NULL == wzDefault) | 99 | if (NULL == wzDefault) |
| 93 | { | 100 | { |
| @@ -112,25 +119,28 @@ extern "C" HRESULT DAPI PolcReadUnexpandedString( | |||
| 112 | { | 119 | { |
| 113 | HRESULT hr = S_OK; | 120 | HRESULT hr = S_OK; |
| 114 | HKEY hk = NULL; | 121 | HKEY hk = NULL; |
| 122 | BOOL fExists = FALSE; | ||
| 115 | 123 | ||
| 116 | hr = OpenPolicyKey(wzPolicyPath, &hk); | 124 | hr = OpenPolicyKey(wzPolicyPath, &hk); |
| 117 | if (E_FILENOTFOUND == hr || E_PATHNOTFOUND == hr) | 125 | PolcExitOnFailure(hr, "Failed to open policy key: %ls", wzPolicyPath); |
| 126 | |||
| 127 | if (!hk) | ||
| 118 | { | 128 | { |
| 119 | ExitFunction1(hr = S_FALSE); | 129 | ExitFunction1(hr = S_FALSE); |
| 120 | } | 130 | } |
| 121 | PolcExitOnFailure(hr, "Failed to open policy key: %ls", wzPolicyPath); | ||
| 122 | 131 | ||
| 123 | hr = RegReadUnexpandedString(hk, wzPolicyName, pfNeedsExpansion, pscz); | 132 | hr = RegReadUnexpandedString(hk, wzPolicyName, pfNeedsExpansion, pscz); |
| 124 | if (E_FILENOTFOUND == hr || E_PATHNOTFOUND == hr) | 133 | PolcExitOnPathFailure(hr, fExists, "Failed to open policy key: %ls, name: %ls", wzPolicyPath, wzPolicyName); |
| 134 | |||
| 135 | if (!fExists) | ||
| 125 | { | 136 | { |
| 126 | ExitFunction1(hr = S_FALSE); | 137 | ExitFunction1(hr = S_FALSE); |
| 127 | } | 138 | } |
| 128 | PolcExitOnFailure(hr, "Failed to open policy key: %ls, name: %ls", wzPolicyPath, wzPolicyName); | ||
| 129 | 139 | ||
| 130 | LExit: | 140 | LExit: |
| 131 | ReleaseRegKey(hk); | 141 | ReleaseRegKey(hk); |
| 132 | 142 | ||
| 133 | if (S_FALSE == hr || FAILED(hr)) | 143 | if (!fExists) |
| 134 | { | 144 | { |
| 135 | if (NULL == wzDefault) | 145 | if (NULL == wzDefault) |
| 136 | { | 146 | { |
| @@ -155,12 +165,18 @@ static HRESULT OpenPolicyKey( | |||
| 155 | { | 165 | { |
| 156 | HRESULT hr = S_OK; | 166 | HRESULT hr = S_OK; |
| 157 | LPWSTR sczPath = NULL; | 167 | LPWSTR sczPath = NULL; |
| 168 | BOOL fExists = FALSE; | ||
| 158 | 169 | ||
| 159 | hr = PathConcat(REGISTRY_POLICIES_KEY, wzPolicyPath, &sczPath); | 170 | hr = PathConcat(REGISTRY_POLICIES_KEY, wzPolicyPath, &sczPath); |
| 160 | PolcExitOnFailure(hr, "Failed to combine logging path with root path."); | 171 | PolcExitOnFailure(hr, "Failed to combine logging path with root path."); |
| 161 | 172 | ||
| 162 | hr = RegOpen(HKEY_LOCAL_MACHINE, sczPath, KEY_READ, phk); | 173 | hr = RegOpen(HKEY_LOCAL_MACHINE, sczPath, KEY_READ, phk); |
| 163 | PolcExitOnFailure(hr, "Failed to open policy registry key."); | 174 | PolcExitOnPathFailure(hr, fExists, "Failed to open policy registry key."); |
| 175 | |||
| 176 | if (!fExists) | ||
| 177 | { | ||
| 178 | ReleaseRegKey(*phk); | ||
| 179 | } | ||
| 164 | 180 | ||
| 165 | LExit: | 181 | LExit: |
| 166 | ReleaseStr(sczPath); | 182 | ReleaseStr(sczPath); |
diff --git a/src/libs/dutil/WixToolset.DUtil/regutil.cpp b/src/libs/dutil/WixToolset.DUtil/regutil.cpp index 9a1b9ced..744e7a3f 100644 --- a/src/libs/dutil/WixToolset.DUtil/regutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/regutil.cpp | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #define RegExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_REGUTIL, p, x, s, __VA_ARGS__) | 17 | #define RegExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_REGUTIL, p, x, s, __VA_ARGS__) |
| 18 | #define RegExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_REGUTIL, e, x, s, __VA_ARGS__) | 18 | #define RegExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_REGUTIL, e, x, s, __VA_ARGS__) |
| 19 | #define RegExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_REGUTIL, g, x, s, __VA_ARGS__) | 19 | #define RegExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_REGUTIL, g, x, s, __VA_ARGS__) |
| 20 | #define RegExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_REGUTIL, x, b, s, __VA_ARGS__) | ||
| 20 | 21 | ||
| 21 | static PFN_REGCREATEKEYEXW vpfnRegCreateKeyExW = ::RegCreateKeyExW; | 22 | static PFN_REGCREATEKEYEXW vpfnRegCreateKeyExW = ::RegCreateKeyExW; |
| 22 | static PFN_REGOPENKEYEXW vpfnRegOpenKeyExW = ::RegOpenKeyExW; | 23 | static PFN_REGOPENKEYEXW vpfnRegOpenKeyExW = ::RegOpenKeyExW; |
| @@ -179,7 +180,7 @@ DAPI_(HRESULT) RegOpen( | |||
| 179 | __in_z LPCWSTR wzSubKey, | 180 | __in_z LPCWSTR wzSubKey, |
| 180 | __in DWORD dwAccess, | 181 | __in DWORD dwAccess, |
| 181 | __out HKEY* phk | 182 | __out HKEY* phk |
| 182 | ) | 183 | ) |
| 183 | { | 184 | { |
| 184 | return RegOpenEx(hkRoot, wzSubKey, dwAccess, REG_KEY_DEFAULT, phk); | 185 | return RegOpenEx(hkRoot, wzSubKey, dwAccess, REG_KEY_DEFAULT, phk); |
| 185 | } | 186 | } |
| @@ -191,18 +192,18 @@ DAPI_(HRESULT) RegOpenEx( | |||
| 191 | __in DWORD dwAccess, | 192 | __in DWORD dwAccess, |
| 192 | __in REG_KEY_BITNESS kbKeyBitness, | 193 | __in REG_KEY_BITNESS kbKeyBitness, |
| 193 | __out HKEY* phk | 194 | __out HKEY* phk |
| 194 | ) | 195 | ) |
| 195 | { | 196 | { |
| 196 | HRESULT hr = S_OK; | 197 | HRESULT hr = S_OK; |
| 197 | DWORD er = ERROR_SUCCESS; | 198 | DWORD er = ERROR_SUCCESS; |
| 198 | 199 | ||
| 199 | REGSAM samDesired = RegTranslateKeyBitness(kbKeyBitness); | 200 | REGSAM samDesired = RegTranslateKeyBitness(kbKeyBitness); |
| 200 | er = vpfnRegOpenKeyExW(hkRoot, wzSubKey, 0, dwAccess | samDesired, phk); | 201 | er = vpfnRegOpenKeyExW(hkRoot, wzSubKey, 0, dwAccess | samDesired, phk); |
| 201 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) | 202 | if (ERROR_PATH_NOT_FOUND == er || ERROR_FILE_NOT_FOUND == er) |
| 202 | { | 203 | { |
| 203 | ExitFunction1(hr = E_FILENOTFOUND); | 204 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); |
| 204 | } | 205 | } |
| 205 | RegExitOnWin32Error(er, hr, "Failed to open registry key."); | 206 | RegExitOnWin32Error(er, hr, "Failed to open registry key, root: %x, subkey: %ls.", hkRoot, wzSubKey); |
| 206 | 207 | ||
| 207 | LExit: | 208 | LExit: |
| 208 | return hr; | 209 | return hr; |
| @@ -221,6 +222,7 @@ DAPI_(HRESULT) RegDelete( | |||
| 221 | LPWSTR pszEnumeratedSubKey = NULL; | 222 | LPWSTR pszEnumeratedSubKey = NULL; |
| 222 | LPWSTR pszRecursiveSubKey = NULL; | 223 | LPWSTR pszRecursiveSubKey = NULL; |
| 223 | HKEY hkKey = NULL; | 224 | HKEY hkKey = NULL; |
| 225 | BOOL fExists = FALSE; | ||
| 224 | 226 | ||
| 225 | if (!vfRegInitialized && REG_KEY_DEFAULT != kbKeyBitness) | 227 | if (!vfRegInitialized && REG_KEY_DEFAULT != kbKeyBitness) |
| 226 | { | 228 | { |
| @@ -231,9 +233,9 @@ DAPI_(HRESULT) RegDelete( | |||
| 231 | if (fDeleteTree) | 233 | if (fDeleteTree) |
| 232 | { | 234 | { |
| 233 | hr = RegOpenEx(hkRoot, wzSubKey, KEY_READ, kbKeyBitness, &hkKey); | 235 | hr = RegOpenEx(hkRoot, wzSubKey, KEY_READ, kbKeyBitness, &hkKey); |
| 234 | if (E_FILENOTFOUND == hr) | 236 | if (E_PATHNOTFOUND == hr || E_FILENOTFOUND == hr) |
| 235 | { | 237 | { |
| 236 | ExitFunction1(hr = S_OK); | 238 | ExitFunction(); |
| 237 | } | 239 | } |
| 238 | RegExitOnFailure(hr, "Failed to open this key for enumerating subkeys: %ls", wzSubKey); | 240 | RegExitOnFailure(hr, "Failed to open this key for enumerating subkeys: %ls", wzSubKey); |
| 239 | 241 | ||
| @@ -246,28 +248,31 @@ DAPI_(HRESULT) RegDelete( | |||
| 246 | RegExitOnFailure(hr, "Failed to concatenate paths while recursively deleting subkeys. Path1: %ls, Path2: %ls", wzSubKey, pszEnumeratedSubKey); | 248 | RegExitOnFailure(hr, "Failed to concatenate paths while recursively deleting subkeys. Path1: %ls, Path2: %ls", wzSubKey, pszEnumeratedSubKey); |
| 247 | 249 | ||
| 248 | hr = RegDelete(hkRoot, pszRecursiveSubKey, kbKeyBitness, fDeleteTree); | 250 | hr = RegDelete(hkRoot, pszRecursiveSubKey, kbKeyBitness, fDeleteTree); |
| 249 | RegExitOnFailure(hr, "Failed to recursively delete subkey: %ls", pszRecursiveSubKey); | 251 | RegExitOnPathFailure(hr, fExists, "Failed to recursively delete subkey: %ls", pszRecursiveSubKey); |
| 250 | } | 252 | } |
| 251 | 253 | ||
| 252 | hr = S_OK; | 254 | hr = S_OK; |
| 255 | |||
| 256 | // Release the handle to make sure it's deleted immediately. | ||
| 257 | ReleaseRegKey(hkKey); | ||
| 253 | } | 258 | } |
| 254 | 259 | ||
| 255 | if (NULL != vpfnRegDeleteKeyExW) | 260 | if (NULL != vpfnRegDeleteKeyExW) |
| 256 | { | 261 | { |
| 257 | REGSAM samDesired = RegTranslateKeyBitness(kbKeyBitness); | 262 | REGSAM samDesired = RegTranslateKeyBitness(kbKeyBitness); |
| 258 | er = vpfnRegDeleteKeyExW(hkRoot, wzSubKey, samDesired, 0); | 263 | er = vpfnRegDeleteKeyExW(hkRoot, wzSubKey, samDesired, 0); |
| 259 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) | 264 | if (ERROR_PATH_NOT_FOUND == er || ERROR_FILE_NOT_FOUND == er) |
| 260 | { | 265 | { |
| 261 | ExitFunction1(hr = E_FILENOTFOUND); | 266 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); |
| 262 | } | 267 | } |
| 263 | RegExitOnWin32Error(er, hr, "Failed to delete registry key (ex)."); | 268 | RegExitOnWin32Error(er, hr, "Failed to delete registry key (ex)."); |
| 264 | } | 269 | } |
| 265 | else | 270 | else |
| 266 | { | 271 | { |
| 267 | er = vpfnRegDeleteKeyW(hkRoot, wzSubKey); | 272 | er = vpfnRegDeleteKeyW(hkRoot, wzSubKey); |
| 268 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) | 273 | if (ERROR_PATH_NOT_FOUND == er || ERROR_FILE_NOT_FOUND == er) |
| 269 | { | 274 | { |
| 270 | ExitFunction1(hr = E_FILENOTFOUND); | 275 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); |
| 271 | } | 276 | } |
| 272 | RegExitOnWin32Error(er, hr, "Failed to delete registry key."); | 277 | RegExitOnWin32Error(er, hr, "Failed to delete registry key."); |
| 273 | } | 278 | } |
| @@ -772,7 +777,7 @@ DAPI_(HRESULT) RegReadNumber( | |||
| 772 | DWORD cb = sizeof(DWORD); | 777 | DWORD cb = sizeof(DWORD); |
| 773 | 778 | ||
| 774 | er = vpfnRegQueryValueExW(hk, wzName, NULL, &dwType, reinterpret_cast<LPBYTE>(pdwValue), &cb); | 779 | er = vpfnRegQueryValueExW(hk, wzName, NULL, &dwType, reinterpret_cast<LPBYTE>(pdwValue), &cb); |
| 775 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) | 780 | if (ERROR_FILE_NOT_FOUND == er) |
| 776 | { | 781 | { |
| 777 | ExitFunction1(hr = E_FILENOTFOUND); | 782 | ExitFunction1(hr = E_FILENOTFOUND); |
| 778 | } | 783 | } |
| @@ -801,7 +806,7 @@ DAPI_(HRESULT) RegReadQword( | |||
| 801 | DWORD cb = sizeof(DWORD64); | 806 | DWORD cb = sizeof(DWORD64); |
| 802 | 807 | ||
| 803 | er = vpfnRegQueryValueExW(hk, wzName, NULL, &dwType, reinterpret_cast<LPBYTE>(pqwValue), &cb); | 808 | er = vpfnRegQueryValueExW(hk, wzName, NULL, &dwType, reinterpret_cast<LPBYTE>(pqwValue), &cb); |
| 804 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) | 809 | if (ERROR_FILE_NOT_FOUND == er) |
| 805 | { | 810 | { |
| 806 | ExitFunction1(hr = E_FILENOTFOUND); | 811 | ExitFunction1(hr = E_FILENOTFOUND); |
| 807 | } | 812 | } |
| @@ -1015,9 +1020,17 @@ DAPI_(HRESULT) RegKeyReadNumber( | |||
| 1015 | HKEY hkKey = NULL; | 1020 | HKEY hkKey = NULL; |
| 1016 | 1021 | ||
| 1017 | hr = RegOpenEx(hk, wzSubKey, KEY_READ, kbKeyBitness, &hkKey); | 1022 | hr = RegOpenEx(hk, wzSubKey, KEY_READ, kbKeyBitness, &hkKey); |
| 1023 | if (E_PATHNOTFOUND == hr || E_FILENOTFOUND == hr) | ||
| 1024 | { | ||
| 1025 | ExitFunction(); | ||
| 1026 | } | ||
| 1018 | RegExitOnFailure(hr, "Failed to open key: %ls", wzSubKey); | 1027 | RegExitOnFailure(hr, "Failed to open key: %ls", wzSubKey); |
| 1019 | 1028 | ||
| 1020 | hr = RegReadNumber(hkKey, wzName, pdwValue); | 1029 | hr = RegReadNumber(hkKey, wzName, pdwValue); |
| 1030 | if (E_FILENOTFOUND == hr) | ||
| 1031 | { | ||
| 1032 | ExitFunction(); | ||
| 1033 | } | ||
| 1021 | RegExitOnFailure(hr, "Failed to read value: %ls/@%ls", wzSubKey, wzName); | 1034 | RegExitOnFailure(hr, "Failed to read value: %ls/@%ls", wzSubKey, wzName); |
| 1022 | 1035 | ||
| 1023 | LExit: | 1036 | LExit: |
| @@ -1038,9 +1051,17 @@ DAPI_(BOOL) RegValueExists( | |||
| 1038 | DWORD dwType = 0; | 1051 | DWORD dwType = 0; |
| 1039 | 1052 | ||
| 1040 | hr = RegOpenEx(hk, wzSubKey, KEY_READ, kbKeyBitness, &hkKey); | 1053 | hr = RegOpenEx(hk, wzSubKey, KEY_READ, kbKeyBitness, &hkKey); |
| 1054 | if (E_PATHNOTFOUND == hr || E_FILENOTFOUND == hr) | ||
| 1055 | { | ||
| 1056 | ExitFunction(); | ||
| 1057 | } | ||
| 1041 | RegExitOnFailure(hr, "Failed to open key: %ls", wzSubKey); | 1058 | RegExitOnFailure(hr, "Failed to open key: %ls", wzSubKey); |
| 1042 | 1059 | ||
| 1043 | hr = RegGetType(hkKey, wzName, &dwType); | 1060 | hr = RegGetType(hkKey, wzName, &dwType); |
| 1061 | if (E_FILENOTFOUND == hr) | ||
| 1062 | { | ||
| 1063 | ExitFunction(); | ||
| 1064 | } | ||
| 1044 | RegExitOnFailure(hr, "Failed to read value type: %ls/@%ls", wzSubKey, wzName); | 1065 | RegExitOnFailure(hr, "Failed to read value type: %ls/@%ls", wzSubKey, wzName); |
| 1045 | 1066 | ||
| 1046 | LExit: | 1067 | LExit: |
diff --git a/src/libs/dutil/WixToolset.DUtil/wiutil.cpp b/src/libs/dutil/WixToolset.DUtil/wiutil.cpp index da7cffe7..5f81cf3a 100644 --- a/src/libs/dutil/WixToolset.DUtil/wiutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/wiutil.cpp | |||
| @@ -427,6 +427,11 @@ extern "C" HRESULT DAPI WiuGetProductInfo( | |||
| 427 | 427 | ||
| 428 | er = vpfnMsiGetProductInfoW(wzProductCode, wzProperty, *psczValue, &cch); | 428 | er = vpfnMsiGetProductInfoW(wzProductCode, wzProperty, *psczValue, &cch); |
| 429 | } | 429 | } |
| 430 | |||
| 431 | if (ERROR_UNKNOWN_PRODUCT == er || ERROR_UNKNOWN_PROPERTY == er) | ||
| 432 | { | ||
| 433 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); | ||
| 434 | } | ||
| 430 | WiuExitOnWin32Error(er, hr, "Failed to get product info."); | 435 | WiuExitOnWin32Error(er, hr, "Failed to get product info."); |
| 431 | 436 | ||
| 432 | LExit: | 437 | LExit: |
| @@ -449,7 +454,10 @@ extern "C" HRESULT DAPI WiuGetProductInfoEx( | |||
| 449 | if (!vpfnMsiGetProductInfoExW) | 454 | if (!vpfnMsiGetProductInfoExW) |
| 450 | { | 455 | { |
| 451 | hr = WiuGetProductInfo(wzProductCode, wzProperty, psczValue); | 456 | hr = WiuGetProductInfo(wzProductCode, wzProperty, psczValue); |
| 452 | WiuExitOnFailure(hr, "Failed to get product info when extended info was not available."); | 457 | if (HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) != hr && HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) != hr) |
| 458 | { | ||
| 459 | WiuExitOnFailure(hr, "Failed to get product info when extended info was not available."); | ||
| 460 | } | ||
| 453 | 461 | ||
| 454 | ExitFunction(); | 462 | ExitFunction(); |
| 455 | } | 463 | } |
| @@ -466,6 +474,11 @@ extern "C" HRESULT DAPI WiuGetProductInfoEx( | |||
| 466 | 474 | ||
| 467 | er = vpfnMsiGetProductInfoExW(wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); | 475 | er = vpfnMsiGetProductInfoExW(wzProductCode, wzUserSid, dwContext, wzProperty, *psczValue, &cch); |
| 468 | } | 476 | } |
| 477 | |||
| 478 | if (ERROR_UNKNOWN_PRODUCT == er || ERROR_UNKNOWN_PROPERTY == er) | ||
| 479 | { | ||
| 480 | ExitFunction1(hr = HRESULT_FROM_WIN32(er)); | ||
| 481 | } | ||
| 469 | WiuExitOnWin32Error(er, hr, "Failed to get extended product info."); | 482 | WiuExitOnWin32Error(er, hr, "Failed to get extended product info."); |
| 470 | 483 | ||
| 471 | LExit: | 484 | LExit: |
