From 281ad838c5001f988aeea06a6f06ce2cc6c0991d Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sat, 29 Aug 2020 21:28:49 -0500 Subject: Add butil exit macros. --- src/dutil/butil.cpp | 106 ++++++++++++++++++++++---------------------------- src/dutil/inc/butil.h | 35 +++++++++++++++-- 2 files changed, 78 insertions(+), 63 deletions(-) (limited to 'src/dutil') diff --git a/src/dutil/butil.cpp b/src/dutil/butil.cpp index 243befce..e04b52e9 100644 --- a/src/dutil/butil.cpp +++ b/src/dutil/butil.cpp @@ -1,7 +1,19 @@ // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. #include "precomp.h" -#include "butil.h" + +// Exit macros +#define ButilExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_BUTIL, x, s, __VA_ARGS__) +#define ButilExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_BUTIL, x, s, __VA_ARGS__) +#define ButilExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_BUTIL, x, s, __VA_ARGS__) +#define ButilExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_BUTIL, x, s, __VA_ARGS__) +#define ButilExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_BUTIL, x, s, __VA_ARGS__) +#define ButilExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_BUTIL, x, s, __VA_ARGS__) +#define ButilExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_BUTIL, p, x, e, s, __VA_ARGS__) +#define ButilExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_BUTIL, p, x, s, __VA_ARGS__) +#define ButilExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_BUTIL, p, x, e, s, __VA_ARGS__) +#define ButilExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_BUTIL, p, x, s, __VA_ARGS__) +#define ButilExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_BUTIL, e, x, s, __VA_ARGS__) // constants // From engine/registration.h @@ -10,31 +22,20 @@ const LPCWSTR BUNDLE_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE = L"BundleUpgrade const LPCWSTR BUNDLE_REGISTRATION_REGISTRY_BUNDLE_PROVIDER_KEY = L"BundleProviderKey"; // Forward declarations. +/******************************************************************** +OpenBundleKey - Opens the bundle uninstallation key for a given bundle + +NOTE: caller is responsible for closing key +********************************************************************/ static HRESULT OpenBundleKey( - __in LPCWSTR wzBundleId, + __in_z LPCWSTR wzBundleId, __in BUNDLE_INSTALL_CONTEXT context, __inout HKEY *key); -/******************************************************************** -BundleGetBundleInfo - Queries the bundle installation metadata for a given property - -RETURNS: - E_INVALIDARG - An invalid parameter was passed to the function. - HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) - The bundle is not installed - HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) - The property is unrecognized - HRESULT_FROM_WIN32(ERROR_MORE_DATA) - A buffer is too small to hold the requested data. - E_NOTIMPL: - Tried to read a bundle attribute for a type which has not been implemented - - All other returns are unexpected returns from other dutil methods. -********************************************************************/ + extern "C" HRESULT DAPI BundleGetBundleInfo( - __in LPCWSTR wzBundleId, - __in LPCWSTR wzAttribute, + __in_z LPCWSTR wzBundleId, + __in_z LPCWSTR wzAttribute, __out_ecount_opt(*pcchValueBuf) LPWSTR lpValueBuf, __inout_opt LPDWORD pcchValueBuf ) @@ -51,39 +52,39 @@ extern "C" HRESULT DAPI BundleGetBundleInfo( if ((lpValueBuf && !pcchValueBuf) || !wzBundleId || !wzAttribute) { - ExitOnFailure(hr = E_INVALIDARG, "An invalid parameter was passed to the function."); + ButilExitOnFailure(hr = E_INVALIDARG, "An invalid parameter was passed to the function."); } if (FAILED(hr = OpenBundleKey(wzBundleId, context = BUNDLE_INSTALL_CONTEXT_MACHINE, &hkBundle)) && FAILED(hr = OpenBundleKey(wzBundleId, context = BUNDLE_INSTALL_CONTEXT_USER, &hkBundle))) { - ExitOnFailure(E_FILENOTFOUND == hr ? HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) : hr, "Failed to locate bundle uninstall key path."); + ButilExitOnFailure(E_FILENOTFOUND == hr ? HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) : hr, "Failed to locate bundle uninstall key path."); } // If the bundle doesn't have the property defined, return ERROR_UNKNOWN_PROPERTY hr = RegGetType(hkBundle, wzAttribute, &dwType); - ExitOnFailure(E_FILENOTFOUND == hr ? HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) : hr, "Failed to locate bundle property."); + ButilExitOnFailure(E_FILENOTFOUND == hr ? HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) : hr, "Failed to locate bundle property."); switch (dwType) { case REG_SZ: hr = RegReadString(hkBundle, wzAttribute, &sczValue); - ExitOnFailure(hr, "Failed to read string property."); + ButilExitOnFailure(hr, "Failed to read string property."); break; case REG_DWORD: hr = RegReadNumber(hkBundle, wzAttribute, &dwValue); - ExitOnFailure(hr, "Failed to read dword property."); + ButilExitOnFailure(hr, "Failed to read dword property."); hr = StrAllocFormatted(&sczValue, L"%d", dwValue); - ExitOnFailure(hr, "Failed to format dword property as string."); + ButilExitOnFailure(hr, "Failed to format dword property as string."); break; default: - ExitOnFailure(hr = E_NOTIMPL, "Reading bundle info of type 0x%x not implemented.", dwType); + ButilExitOnFailure(hr = E_NOTIMPL, "Reading bundle info of type 0x%x not implemented.", dwType); } hr = ::StringCchLengthW(sczValue, STRSAFE_MAX_CCH, reinterpret_cast(&cchSource)); - ExitOnFailure(hr, "Failed to calculate length of string"); + ButilExitOnFailure(hr, "Failed to calculate length of string"); if (lpValueBuf) { @@ -91,11 +92,11 @@ extern "C" HRESULT DAPI BundleGetBundleInfo( if (*pcchValueBuf <= cchSource) { *pcchValueBuf = ++cchSource; - ExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA), "A buffer is too small to hold the requested data."); + ButilExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA), "A buffer is too small to hold the requested data."); } hr = ::StringCchCatNExW(lpValueBuf, *pcchValueBuf, sczValue, cchSource, NULL, NULL, STRSAFE_FILL_BEHIND_NULL); - ExitOnFailure(hr, "Failed to copy the property value to the output buffer."); + ButilExitOnFailure(hr, "Failed to copy the property value to the output buffer."); *pcchValueBuf = cchSource++; } @@ -107,19 +108,8 @@ LExit: return hr; } -/******************************************************************** -BundleEnumRelatedBundle - Queries the bundle installation metadata for installs with the given upgrade code - -NOTE: lpBundleIdBuff is a buffer to receive the bundle GUID. This buffer must be 39 characters long. - The first 38 characters are for the GUID, and the last character is for the terminating null character. -RETURNS: - E_INVALIDARG - An invalid parameter was passed to the function. - - All other returns are unexpected returns from other dutil methods. -********************************************************************/ HRESULT DAPI BundleEnumRelatedBundle( - __in LPCWSTR wzUpgradeCode, + __in_z LPCWSTR wzUpgradeCode, __in BUNDLE_INSTALL_CONTEXT context, __inout PDWORD pdwStartIndex, __out_ecount(MAX_GUID_CHARS+1) LPWSTR lpBundleIdBuf @@ -141,22 +131,22 @@ HRESULT DAPI BundleEnumRelatedBundle( if (!wzUpgradeCode || !lpBundleIdBuf || !pdwStartIndex) { - ExitOnFailure(hr = E_INVALIDARG, "An invalid parameter was passed to the function."); + ButilExitOnFailure(hr = E_INVALIDARG, "An invalid parameter was passed to the function."); } hr = RegOpen(hkRoot, BUNDLE_REGISTRATION_REGISTRY_UNINSTALL_KEY, KEY_READ, &hkUninstall); - ExitOnFailure(hr, "Failed to open bundle uninstall key path."); + ButilExitOnFailure(hr, "Failed to open bundle uninstall key path."); for (DWORD dwIndex = *pdwStartIndex; !fUpgradeCodeFound; dwIndex++) { hr = RegKeyEnum(hkUninstall, dwIndex, &sczUninstallSubKey); - ExitOnFailure(hr, "Failed to enumerate bundle uninstall key path."); + ButilExitOnFailure(hr, "Failed to enumerate bundle uninstall key path."); hr = StrAllocFormatted(&sczUninstallSubKeyPath, L"%ls\\%ls", BUNDLE_REGISTRATION_REGISTRY_UNINSTALL_KEY, sczUninstallSubKey); - ExitOnFailure(hr, "Failed to allocate bundle uninstall key path."); + ButilExitOnFailure(hr, "Failed to allocate bundle uninstall key path."); hr = RegOpen(hkRoot, sczUninstallSubKeyPath, KEY_READ, &hkBundle); - ExitOnFailure(hr, "Failed to open uninstall key path."); + ButilExitOnFailure(hr, "Failed to open uninstall key path."); // If it's a bundle, it should have a BundleUpgradeCode value of type REG_SZ (old) or REG_MULTI_SZ hr = RegGetType(hkBundle, BUNDLE_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE, &dwType); @@ -173,7 +163,7 @@ HRESULT DAPI BundleEnumRelatedBundle( { case REG_SZ: hr = RegReadString(hkBundle, BUNDLE_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE, &sczValue); - ExitOnFailure(hr, "Failed to read BundleUpgradeCode string property."); + ButilExitOnFailure(hr, "Failed to read BundleUpgradeCode string property."); if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, sczValue, -1, wzUpgradeCode, -1)) { *pdwStartIndex = dwIndex; @@ -186,7 +176,7 @@ HRESULT DAPI BundleEnumRelatedBundle( break; case REG_MULTI_SZ: hr = RegReadStringArray(hkBundle, BUNDLE_REGISTRATION_REGISTRY_BUNDLE_UPGRADE_CODE, &rgsczBundleUpgradeCodes, &cBundleUpgradeCodes); - ExitOnFailure(hr, "Failed to read BundleUpgradeCode multi-string property."); + ButilExitOnFailure(hr, "Failed to read BundleUpgradeCode multi-string property."); for (DWORD i = 0; i < cBundleUpgradeCodes; i++) { @@ -206,7 +196,7 @@ HRESULT DAPI BundleEnumRelatedBundle( break; default: - ExitOnFailure(hr = E_NOTIMPL, "BundleUpgradeCode of type 0x%x not implemented.", dwType); + ButilExitOnFailure(hr = E_NOTIMPL, "BundleUpgradeCode of type 0x%x not implemented.", dwType); } @@ -215,10 +205,10 @@ HRESULT DAPI BundleEnumRelatedBundle( if (lpBundleIdBuf) { hr = ::StringCchLengthW(sczUninstallSubKey, STRSAFE_MAX_CCH, reinterpret_cast(&cchUninstallSubKey)); - ExitOnFailure(hr, "Failed to calculate length of string"); + ButilExitOnFailure(hr, "Failed to calculate length of string"); hr = ::StringCchCopyNExW(lpBundleIdBuf, MAX_GUID_CHARS + 1, sczUninstallSubKey, cchUninstallSubKey, NULL, NULL, STRSAFE_FILL_BEHIND_NULL); - ExitOnFailure(hr, "Failed to copy the property value to the output buffer."); + ButilExitOnFailure(hr, "Failed to copy the property value to the output buffer."); } break; @@ -241,13 +231,9 @@ LExit: return hr; } -/******************************************************************** -OpenBundleKey - Opens the bundle uninstallation key for a given bundle -NOTE: caller is responsible for closing key -********************************************************************/ HRESULT OpenBundleKey( - __in LPCWSTR wzBundleId, + __in_z LPCWSTR wzBundleId, __in BUNDLE_INSTALL_CONTEXT context, __inout HKEY *key) { @@ -259,10 +245,10 @@ HRESULT OpenBundleKey( LPWSTR sczKeypath = NULL; hr = StrAllocFormatted(&sczKeypath, L"%ls\\%ls", BUNDLE_REGISTRATION_REGISTRY_UNINSTALL_KEY, wzBundleId); - ExitOnFailure(hr, "Failed to allocate bundle uninstall key path."); + ButilExitOnFailure(hr, "Failed to allocate bundle uninstall key path."); hr = RegOpen(hkRoot, sczKeypath, KEY_READ, key); - ExitOnFailure(hr, "Failed to open bundle uninstall key path."); + ButilExitOnFailure(hr, "Failed to open bundle uninstall key path."); LExit: ReleaseStr(sczKeypath); diff --git a/src/dutil/inc/butil.h b/src/dutil/inc/butil.h index a42cac11..d1ec73bc 100644 --- a/src/dutil/inc/butil.h +++ b/src/dutil/inc/butil.h @@ -12,15 +12,44 @@ enum BUNDLE_INSTALL_CONTEXT BUNDLE_INSTALL_CONTEXT_USER, }; + +/******************************************************************** +BundleGetBundleInfo - Queries the bundle installation metadata for a given property + +RETURNS: + E_INVALIDARG + An invalid parameter was passed to the function. + HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) + The bundle is not installed + HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) + The property is unrecognized + HRESULT_FROM_WIN32(ERROR_MORE_DATA) + A buffer is too small to hold the requested data. + E_NOTIMPL: + Tried to read a bundle attribute for a type which has not been implemented + + All other returns are unexpected returns from other dutil methods. +********************************************************************/ HRESULT DAPI BundleGetBundleInfo( - __in LPCWSTR szBundleId, // Bundle code - __in LPCWSTR szAttribute, // attribute name + __in_z LPCWSTR szBundleId, // Bundle code + __in_z LPCWSTR szAttribute, // attribute name __out_ecount_opt(*pcchValueBuf) LPWSTR lpValueBuf, // returned value, NULL if not desired __inout_opt LPDWORD pcchValueBuf // in/out buffer character count ); +/******************************************************************** +BundleEnumRelatedBundle - Queries the bundle installation metadata for installs with the given upgrade code + +NOTE: lpBundleIdBuff is a buffer to receive the bundle GUID. This buffer must be 39 characters long. + The first 38 characters are for the GUID, and the last character is for the terminating null character. +RETURNS: + E_INVALIDARG + An invalid parameter was passed to the function. + + All other returns are unexpected returns from other dutil methods. +********************************************************************/ HRESULT DAPI BundleEnumRelatedBundle( - __in LPCWSTR lpUpgradeCode, + __in_z LPCWSTR lpUpgradeCode, __in BUNDLE_INSTALL_CONTEXT context, __inout PDWORD pdwStartIndex, __out_ecount(MAX_GUID_CHARS+1) LPWSTR lpBundleIdBuf -- cgit v1.2.3-55-g6feb