aboutsummaryrefslogtreecommitdiff
path: root/src/libs/dutil/WixToolset.DUtil/regutil.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-08-08 18:02:15 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-08-09 09:57:02 -0500
commit240b663ad5fc94ed6d19c966b5c9105a176ecf40 (patch)
treed194e242ccb5bb69f0dbbc388ede87cef65c700f /src/libs/dutil/WixToolset.DUtil/regutil.cpp
parent8e1cbe8d7b468553d76c20452561e89726de5c47 (diff)
downloadwix-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/dutil/WixToolset.DUtil/regutil.cpp')
-rw-r--r--src/libs/dutil/WixToolset.DUtil/regutil.cpp49
1 files changed, 35 insertions, 14 deletions
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
21static PFN_REGCREATEKEYEXW vpfnRegCreateKeyExW = ::RegCreateKeyExW; 22static PFN_REGCREATEKEYEXW vpfnRegCreateKeyExW = ::RegCreateKeyExW;
22static PFN_REGOPENKEYEXW vpfnRegOpenKeyExW = ::RegOpenKeyExW; 23static 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
207LExit: 208LExit:
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
1023LExit: 1036LExit:
@@ -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
1046LExit: 1067LExit: