From 84c066fa798a4d669f9fa3145a29ed9d46db47d5 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Fri, 23 Oct 2020 22:04:40 +0200 Subject: [PATCH] api: revise logging RegistryQueryString() may produce one or more "File not found" errors when called from RegistryQueryStringWait() - which is expected while waiting. Those errors were annoying and awkward to read in the log. Furthermore, should RegistryQueryString() fail, it already displays detailed Windows error message and the parent's logging was simplified to prevent repetitions in the log. Signed-off-by: Simon Rozman --- api/adapter.c | 12 ++++++------ api/registry.c | 11 ++++++----- api/registry.h | 6 +++++- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/api/adapter.c b/api/adapter.c index d1e8786..878f6ba 100644 --- a/api/adapter.c +++ b/api/adapter.c @@ -391,10 +391,10 @@ GetNetCfgInstanceId(_In_ HDEVINFO DevInfo, _In_ SP_DEVINFO_DATA *DevInfoData, _O if (Key == INVALID_HANDLE_VALUE) return LOG_LAST_ERROR(L"Opening device registry key failed"); WCHAR *ValueStr; - DWORD Result = RegistryQueryString(Key, L"NetCfgInstanceId", &ValueStr); + DWORD Result = RegistryQueryString(Key, L"NetCfgInstanceId", &ValueStr, TRUE); if (Result != ERROR_SUCCESS) { - LOG_ERROR(L"Failed to query NetCfgInstanceId value", Result); + LOG(WINTUN_LOG_ERR, L"Failed to query NetCfgInstanceId value"); goto cleanupKey; } if (FAILED(CLSIDFromString(ValueStr, CfgInstanceID))) @@ -532,10 +532,10 @@ CreateAdapterData( /* Read the NetCfgInstanceId value and convert to GUID. */ WCHAR *ValueStr; - Result = RegistryQueryString(Key, L"NetCfgInstanceId", &ValueStr); + Result = RegistryQueryString(Key, L"NetCfgInstanceId", &ValueStr, TRUE); if (Result != ERROR_SUCCESS) { - LOG_ERROR(L"Failed to query NetCfgInstanceId value", Result); + LOG(WINTUN_LOG_ERR, L"Failed to query NetCfgInstanceId value"); goto cleanupAdapter; } if (FAILED(CLSIDFromString(ValueStr, &(*Adapter)->CfgInstanceID))) @@ -928,10 +928,10 @@ GetTcpipInterfaceRegPath(_In_ const WINTUN_ADAPTER *Adapter, _Out_cap_c_(MAX_REG if (Result != ERROR_SUCCESS) return LOG_ERROR(L"Failed to open registry key", Result); WCHAR *Paths; - Result = RegistryQueryString(TcpipAdapterRegKey, L"IpConfig", &Paths); + Result = RegistryQueryString(TcpipAdapterRegKey, L"IpConfig", &Paths, TRUE); if (Result != ERROR_SUCCESS) { - LOG_ERROR(L"Failed to query IpConfig value", Result); + LOG(WINTUN_LOG_ERR, L"Failed to query IpConfig value"); goto cleanupTcpipAdapterRegKey; } if (!Paths[0]) diff --git a/api/registry.c b/api/registry.c index a36b27e..f1e2372 100644 --- a/api/registry.c +++ b/api/registry.c @@ -180,7 +180,8 @@ RegistryQuery( _In_opt_z_ const WCHAR *Name, _Out_opt_ DWORD *ValueType, _Out_ void **Buf, - _Inout_ DWORD *BufLen) + _Inout_ DWORD *BufLen, + _In_ BOOL Log) { HANDLE Heap = GetProcessHeap(); for (;;) @@ -193,15 +194,15 @@ RegistryQuery( return ERROR_SUCCESS; HeapFree(Heap, 0, *Buf); if (Result != ERROR_MORE_DATA) - return LOG_ERROR(L"Querying value failed", Result); + return Log ? LOG_ERROR(L"Querying value failed", Result) : Result; } } WINTUN_STATUS -RegistryQueryString(_In_ HKEY Key, _In_opt_z_ const WCHAR *Name, _Out_ WCHAR **Value) +RegistryQueryString(_In_ HKEY Key, _In_opt_z_ const WCHAR *Name, _Out_ WCHAR **Value, _In_ BOOL Log) { DWORD ValueType, Size = 256 * sizeof(WCHAR); - DWORD Result = RegistryQuery(Key, Name, &ValueType, Value, &Size); + DWORD Result = RegistryQuery(Key, Name, &ValueType, Value, &Size, Log); if (Result != ERROR_SUCCESS) return Result; switch (ValueType) @@ -236,7 +237,7 @@ RegistryQueryStringWait(_In_ HKEY Key, _In_opt_z_ const WCHAR *Name, _In_ DWORD LOG_ERROR(L"Failed to setup notification", Result); break; } - Result = RegistryQueryString(Key, Name, Value); + Result = RegistryQueryString(Key, Name, Value, FALSE); if (Result != ERROR_FILE_NOT_FOUND && Result != ERROR_PATH_NOT_FOUND) break; LONGLONG TimeLeft = Deadline - GetTickCount64(); diff --git a/api/registry.h b/api/registry.h index 16322d3..783280a 100644 --- a/api/registry.h +++ b/api/registry.h @@ -81,11 +81,15 @@ RegistryGetMultiString(_Inout_ WCHAR **Buf, _In_ DWORD Len, _In_ DWORD ValueType * string from the multi-string is returned. The string must be released with * HeapFree(GetProcessHeap(), 0, Value) after use. * + * @Log Set to TRUE to log all failures; FALSE to skip logging the innermost errors. Skipping innermost + * errors reduces log clutter when we are using RegistryQueryString() from + * RegistryQueryStringWait() and some errors are expected to occur. + * * @return ERROR_SUCCESS on success; ERROR_INVALID_DATATYPE when the registry value is not a string; Win32 error code * otherwise. */ WINTUN_STATUS -RegistryQueryString(_In_ HKEY Key, _In_opt_z_ const WCHAR *Name, _Out_ WCHAR **Value); +RegistryQueryString(_In_ HKEY Key, _In_opt_z_ const WCHAR *Name, _Out_ WCHAR **Value, _In_ BOOL Log); /** * Reads string value from registry key. It waits for the registry value to become available.