From 70b8903c503f400a6e11a0dd657ef99e634493cd Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Sat, 6 Feb 2021 09:38:50 +0100 Subject: api: implement %r format type for logging registry path Note: Once reviewed, merge with 728d6762cd95394f2541d4a3f3e7fdd17ecd8f2a Signed-off-by: Simon Rozman --- api/adapter.c | 40 +++-------- api/logger.c | 221 +++++++++++++++++++++++++++++++++++++++++++++++---------- api/logger.h | 24 ++----- api/registry.c | 74 +++++-------------- 4 files changed, 214 insertions(+), 145 deletions(-) diff --git a/api/adapter.c b/api/adapter.c index 2f397ac..7695463 100644 --- a/api/adapter.c +++ b/api/adapter.c @@ -444,17 +444,11 @@ static _Return_type_success_(return != FALSE) BOOL GetNetCfgInstanceIdFromHKEY(_ { WCHAR *ValueStr = RegistryQueryString(Key, L"NetCfgInstanceId", TRUE); if (!ValueStr) - { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - return RET_ERROR(TRUE, LOG(WINTUN_LOG_ERR, L"Failed to get %.*s\\NetCfgInstanceId", MAX_REG_PATH, RegPath)); - } + return RET_ERROR(TRUE, LOG(WINTUN_LOG_ERR, L"Failed to get %r\\NetCfgInstanceId", Key)); DWORD LastError = ERROR_SUCCESS; if (FAILED(CLSIDFromString(ValueStr, CfgInstanceID))) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG(WINTUN_LOG_ERR, L"%.*s\\NetCfgInstanceId is not a GUID: %s", MAX_REG_PATH, RegPath, ValueStr); + LOG(WINTUN_LOG_ERR, L"%r\\NetCfgInstanceId is not a GUID: %s", Key, ValueStr); LastError = ERROR_INVALID_DATA; } Free(ValueStr); @@ -593,17 +587,13 @@ static _Return_type_success_(return != NULL) WINTUN_ADAPTER if (!RegistryQueryDWORD(Key, L"NetLuidIndex", &Adapter->LuidIndex, TRUE)) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %.*s\\NetLuidIndex", MAX_REG_PATH, RegPath); + LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %r\\NetLuidIndex", Key); goto cleanupAdapter; } if (!RegistryQueryDWORD(Key, L"*IfType", &Adapter->IfType, TRUE)) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %.*s\\*IfType", MAX_REG_PATH, RegPath); + LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %r\\*IfType", Key); goto cleanupAdapter; } @@ -781,11 +771,7 @@ static _Return_type_success_(return != FALSE) BOOL LastError = ConvertInterfaceLuidToGuid(&Luid, Guid); if (LastError != NO_ERROR) { - SetLastError(LOG_ERROR( - LastError, - L"Failed to convert interface %s LUID (%I64u) to GUID", - Name, - Luid.Value)); + SetLastError(LOG_ERROR(LastError, L"Failed to convert interface %s LUID (%I64u) to GUID", Name, Luid.Value)); return FALSE; } return TRUE; @@ -1514,9 +1500,7 @@ static _Return_type_success_(return != NULL) WINTUN_ADAPTER *CreateAdapter( StringFromGUID2(RequestedGUID, RequestedGUIDStr, _countof(RequestedGUIDStr)) * sizeof(WCHAR)); if (LastError != ERROR_SUCCESS) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(NetDevRegKey, RegPath); - LOG_ERROR(LastError, L"Failed to set %.*s\\NetSetupAnticipatedInstanceId", MAX_REG_PATH, RegPath); + LOG_ERROR(LastError, L"Failed to set %r\\NetSetupAnticipatedInstanceId", NetDevRegKey); goto cleanupNetDevRegKey; } } @@ -1560,25 +1544,19 @@ static _Return_type_success_(return != NULL) WINTUN_ADAPTER *CreateAdapter( WCHAR *DummyStr = RegistryQueryStringWait(NetDevRegKey, L"NetCfgInstanceId", WAIT_FOR_REGISTRY_TIMEOUT); if (!DummyStr) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(NetDevRegKey, RegPath); - LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %.*s\\NetCfgInstanceId", MAX_REG_PATH, RegPath); + LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %r\\NetCfgInstanceId", NetDevRegKey); goto cleanupNetDevRegKey; } Free(DummyStr); DWORD DummyDWORD; if (!RegistryQueryDWORDWait(NetDevRegKey, L"NetLuidIndex", WAIT_FOR_REGISTRY_TIMEOUT, &DummyDWORD)) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(NetDevRegKey, RegPath); - LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %.*s\\NetLuidIndex", MAX_REG_PATH, RegPath); + LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %r\\NetLuidIndex", NetDevRegKey); goto cleanupNetDevRegKey; } if (!RegistryQueryDWORDWait(NetDevRegKey, L"*IfType", WAIT_FOR_REGISTRY_TIMEOUT, &DummyDWORD)) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(NetDevRegKey, RegPath); - LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %.*s\\*IfType", MAX_REG_PATH, RegPath); + LastError = LOG(WINTUN_LOG_ERR, L"Failed to get %r\\*IfType", NetDevRegKey); goto cleanupNetDevRegKey; } diff --git a/api/logger.c b/api/logger.c index 7907437..0a8461b 100644 --- a/api/logger.c +++ b/api/logger.c @@ -9,6 +9,9 @@ #include #include +#define _PRECISION_MAX ((size_t)-1) +#define _PRECISION_RUNTIME ((size_t)-2) + static BOOL CALLBACK NopLogger(_In_ WINTUN_LOGGER_LEVEL Level, _In_z_ const WCHAR *LogLine) { @@ -51,16 +54,187 @@ LoggerLog(_In_ WINTUN_LOGGER_LEVEL Level, _In_z_ const WCHAR *Function, _In_z_ c return LastError; } +VOID +LoggerGetRegistryKeyPath(_In_ HKEY Key, _Out_cap_c_(MAX_REG_PATH) WCHAR *Path) +{ + DWORD LastError = GetLastError(); + if (Key == NULL) + { + wcscpy_s(Path, MAX_REG_PATH, L""); + goto out; + } + if (_snwprintf_s(Path, MAX_REG_PATH, _TRUNCATE, L"0x%p", Key) == -1) + StrTruncate(Path, MAX_REG_PATH); + union + { + KEY_NAME_INFORMATION KeyNameInfo; + WCHAR Data[offsetof(KEY_NAME_INFORMATION, Name) + MAX_REG_PATH]; + } Buffer; + DWORD Size; + if (!NT_SUCCESS(NtQueryKey(Key, 3, &Buffer, sizeof(Buffer), &Size)) || + Size < offsetof(KEY_NAME_INFORMATION, Name) || Buffer.KeyNameInfo.NameLength >= MAX_REG_PATH * sizeof(WCHAR)) + goto out; + Buffer.KeyNameInfo.NameLength /= sizeof(WCHAR); + wmemcpy_s(Path, MAX_REG_PATH, Buffer.KeyNameInfo.Name, Buffer.KeyNameInfo.NameLength); + Path[Buffer.KeyNameInfo.NameLength] = L'\0'; +out: + SetLastError(LastError); +} + +_Success_(return >= 0) +_Check_return_opt_ static ptrdiff_t +PushTerminator( + _Out_writes_(BufferCount) _Always_(_Post_z_) wchar_t *Buffer, + _In_ size_t BufferCount, + _In_ size_t MaxCount, + _In_ size_t Count) +{ + if (Count < BufferCount) + { + Buffer[Count] = L'\0'; + return Count; + } + if (MaxCount == _TRUNCATE) + { + Buffer[BufferCount - 1] = L'\0'; + return -1; + } + _invalid_parameter_noinfo(); + _set_errno(ERANGE); + Buffer[0] = L'\0'; + return -1; +} + +static ptrdiff_t +PushChar( + _Out_writes_(BufferCount) wchar_t *Buffer, + _In_ size_t BufferCount, + _In_ size_t MaxCount, + _In_ size_t Count, + _In_ wchar_t Char) +{ + if (Count < BufferCount) + { + if (Count < MaxCount) + { + Buffer[Count] = Char; + return 1; + } + Buffer[MaxCount] = L'\0'; + return -1; + } + if (MaxCount == _TRUNCATE) + { + Buffer[BufferCount - 1] = L'\0'; + return -1; + } + _invalid_parameter_noinfo(); + _set_errno(ERANGE); + Buffer[0] = L'\0'; + return -1; +} + +_Success_(return >= 0) +_Check_return_opt_ static ptrdiff_t +LoggerSPrintF( + _Out_writes_opt_(BufferCount) _Always_(_Post_z_) wchar_t *Buffer, + _In_ size_t BufferCount, + _In_ size_t MaxCount, + _In_z_ wchar_t const *Format, + va_list Args) +{ + if (!Buffer || !BufferCount || !Format) + { + _set_errno(EINVAL); + return -1; + } + for (size_t Count = 0;;) + { + ptrdiff_t Result; + if (*Format == L'\0') + return PushTerminator(Buffer, BufferCount, MaxCount, Count); + if (*Format != L'%') + { + Result = PushChar(Buffer, BufferCount, MaxCount, Count, *(Format++)); + if (Result < 0) + return Result; + Count += Result; + continue; + } + const wchar_t *Flag = Format + 1, *FlagEnd = Flag + (wcschr(L"-+0 #", *Flag) ? 1 : 0); + const wchar_t *Width = FlagEnd, *WidthEnd = Width; +#pragma warning(suppress : 6031) + wcstoul(Width, (wchar_t **)&WidthEnd, 10); + const wchar_t *Precision = WidthEnd, *PrecisionEnd = Precision; + size_t PrecisionVal = _PRECISION_MAX; + if (Precision[0] == L'.') + { + if (Precision[1] == L'*') + { + PrecisionVal = _PRECISION_RUNTIME; + PrecisionEnd = Precision + 2; + } + else + PrecisionVal = wcstoul(Precision + 1, (wchar_t **)&PrecisionEnd, 10); + } + size_t FieldPrecision; + const wchar_t *Size = PrecisionEnd, *SizeEnd = Size; + if (Size[0] == L'I' && (Size[1] == L'3' && Size[2] == L'2' || Size[1] == L'6' && Size[2] == L'4')) + SizeEnd = Size + 3; + else if (Size[0] == L'h' && Size[1] == L'h' || Size[0] == L'l' && Size[1] == L'l') + SizeEnd = Size + 2; + else if ( + Size[0] == L'h' || Size[0] == L'I' || Size[0] == L'j' || Size[0] == L'l' || Size[0] == L'L' || + Size[0] == L't' || Size[0] == L'w' || Size[0] == L'z') + SizeEnd = Size + 1; + const wchar_t *Type = SizeEnd, *TypeEnd = Type + 1; + if (*Type == L'r') + { + FieldPrecision = PrecisionVal == _PRECISION_RUNTIME ? va_arg(Args, unsigned long) : MAX_REG_PATH; + WCHAR RegPath[MAX_REG_PATH]; + LoggerGetRegistryKeyPath(va_arg(Args, HKEY), RegPath); + for (size_t i = 0; i < FieldPrecision && RegPath[i];) + { + Result = PushChar(Buffer, BufferCount, MaxCount, Count, RegPath[i++]); + if (Result < 0) + return Result; + Count += Result; + } + Format = TypeEnd; + continue; + } + wchar_t FormatSub[100]; + const size_t FormatSubCount = TypeEnd - Format; + if (FormatSubCount >= _countof(FormatSub)) + { + _invalid_parameter(Format, _L(__FUNCTION__), _L(__FILE__), __LINE__, 0); + _set_errno(EINVAL); + Buffer[0] = L'\0'; + return -1; + } + wmemcpy(FormatSub, Format, FormatSubCount); + FormatSub[FormatSubCount] = 0; + Result = _vsnwprintf_s( + Buffer + Count, BufferCount - Count, MaxCount != _TRUNCATE ? MaxCount - Count : _TRUNCATE, FormatSub, Args); + if (Result < 0) + return Result; + Count += Result; + Format = TypeEnd; +#pragma warning(push) +#pragma warning(disable : 6269) + if (PrecisionVal == _PRECISION_RUNTIME) + va_arg(Args, unsigned long); + va_arg(Args, int); +#pragma warning(pop) + } +} + _Post_equals_last_error_ DWORD -LoggerLogV( - _In_ WINTUN_LOGGER_LEVEL Level, - _In_z_ const WCHAR *Function, - _In_z_ _Printf_format_string_ const WCHAR *Format, - _In_ va_list Args) +LoggerLogV(_In_ WINTUN_LOGGER_LEVEL Level, _In_z_ const WCHAR *Function, _In_z_ const WCHAR *Format, _In_ va_list Args) { DWORD LastError = GetLastError(); WCHAR LogLine[0x400]; - if (_vsnwprintf_s(LogLine, _countof(LogLine), _TRUNCATE, Format, Args) == -1) + if (LoggerSPrintF(LogLine, _countof(LogLine), _TRUNCATE, Format, Args) == -1) StrTruncate(LogLine, _countof(LogLine)); if (Function) LoggerLog(Level, Function, LogLine); @@ -99,41 +273,10 @@ LoggerError(_In_ DWORD Error, _In_z_ const WCHAR *Function, _In_z_ const WCHAR * } _Post_equals_last_error_ DWORD -LoggerErrorV( - _In_ DWORD Error, - _In_z_ const WCHAR *Function, - _In_z_ _Printf_format_string_ const WCHAR *Format, - _In_ va_list Args) +LoggerErrorV(_In_ DWORD Error, _In_z_ const WCHAR *Function, _In_z_ const WCHAR *Format, _In_ va_list Args) { WCHAR Prefix[0x400]; - if (_vsnwprintf_s(Prefix, _countof(Prefix), _TRUNCATE, Format, Args) == -1) + if (LoggerSPrintF(Prefix, _countof(Prefix), _TRUNCATE, Format, Args) == -1) StrTruncate(Prefix, _countof(Prefix)); return LoggerError(Error, Function, Prefix); } - -VOID -LoggerGetRegistryKeyPath(_In_ HKEY Key, _Out_cap_c_(MAX_REG_PATH) WCHAR *Path) -{ - DWORD LastError = GetLastError(); - if (Key == NULL) - { - wcscpy_s(Path, MAX_REG_PATH, L""); - goto out; - } - if (_snwprintf_s(Path, MAX_REG_PATH, _TRUNCATE, L"0x%p", Key) == -1) - StrTruncate(Path, MAX_REG_PATH); - union - { - KEY_NAME_INFORMATION KeyNameInfo; - WCHAR Data[offsetof(KEY_NAME_INFORMATION, Name) + MAX_REG_PATH]; - } Buffer; - DWORD Size; - if (!NT_SUCCESS(NtQueryKey(Key, 3, &Buffer, sizeof(Buffer), &Size)) || - Size < offsetof(KEY_NAME_INFORMATION, Name) || Buffer.KeyNameInfo.NameLength >= MAX_REG_PATH * sizeof(WCHAR)) - goto out; - Buffer.KeyNameInfo.NameLength /= sizeof(WCHAR); - wmemcpy_s(Path, MAX_REG_PATH, Buffer.KeyNameInfo.Name, Buffer.KeyNameInfo.NameLength); - Path[Buffer.KeyNameInfo.NameLength] = L'\0'; -out: - SetLastError(LastError); -} diff --git a/api/logger.h b/api/logger.h index 3ffda6e..6568448 100644 --- a/api/logger.h +++ b/api/logger.h @@ -24,18 +24,10 @@ _Post_equals_last_error_ DWORD LoggerLog(_In_ WINTUN_LOGGER_LEVEL Level, _In_z_ const WCHAR *Function, _In_z_ const WCHAR *LogLine); _Post_equals_last_error_ DWORD -LoggerLogV( - _In_ WINTUN_LOGGER_LEVEL Level, - _In_z_ const WCHAR *Function, - _In_z_ _Printf_format_string_ const WCHAR *Format, - _In_ va_list Args); +LoggerLogV(_In_ WINTUN_LOGGER_LEVEL Level, _In_z_ const WCHAR *Function, _In_z_ const WCHAR *Format, _In_ va_list Args); static inline _Post_equals_last_error_ DWORD -LoggerLogFmt( - _In_ WINTUN_LOGGER_LEVEL Level, - _In_z_ const WCHAR *Function, - _In_z_ _Printf_format_string_ const WCHAR *Format, - ...) +LoggerLogFmt(_In_ WINTUN_LOGGER_LEVEL Level, _In_z_ const WCHAR *Function, _In_z_ const WCHAR *Format, ...) { va_list Args; va_start(Args, Format); @@ -48,14 +40,10 @@ _Post_equals_last_error_ DWORD LoggerError(_In_ DWORD Error, _In_z_ const WCHAR *Function, _In_z_ const WCHAR *Prefix); _Post_equals_last_error_ DWORD -LoggerErrorV( - _In_ DWORD Error, - _In_z_ const WCHAR *Function, - _In_z_ _Printf_format_string_ const WCHAR *Format, - _In_ va_list Args); +LoggerErrorV(_In_ DWORD Error, _In_z_ const WCHAR *Function, _In_z_ const WCHAR *Format, _In_ va_list Args); static inline _Post_equals_last_error_ DWORD -LoggerErrorFmt(_In_ DWORD Error, _In_z_ const WCHAR *Function, _In_z_ _Printf_format_string_ const WCHAR *Format, ...) +LoggerErrorFmt(_In_ DWORD Error, _In_z_ const WCHAR *Function, _In_z_ const WCHAR *Format, ...) { va_list Args; va_start(Args, Format); @@ -65,7 +53,7 @@ LoggerErrorFmt(_In_ DWORD Error, _In_z_ const WCHAR *Function, _In_z_ _Printf_fo } static inline _Post_equals_last_error_ DWORD -LoggerLastErrorV(_In_z_ const WCHAR *Function, _In_z_ _Printf_format_string_ const WCHAR *Format, _In_ va_list Args) +LoggerLastErrorV(_In_z_ const WCHAR *Function, _In_z_ const WCHAR *Format, _In_ va_list Args) { DWORD LastError = GetLastError(); LoggerErrorV(LastError, Function, Format, Args); @@ -74,7 +62,7 @@ LoggerLastErrorV(_In_z_ const WCHAR *Function, _In_z_ _Printf_format_string_ con } static inline _Post_equals_last_error_ DWORD -LoggerLastErrorFmt(_In_z_ const WCHAR *Function, _In_z_ _Printf_format_string_ const WCHAR *Format, ...) +LoggerLastErrorFmt(_In_z_ const WCHAR *Function, _In_z_ const WCHAR *Format, ...) { va_list Args; va_start(Args, Format); diff --git a/api/registry.c b/api/registry.c index 4b28642..c5e5ca9 100644 --- a/api/registry.c +++ b/api/registry.c @@ -28,9 +28,7 @@ static _Return_type_success_(return != NULL) HKEY LastError = RegNotifyChangeKeyValue(Key, FALSE, REG_NOTIFY_CHANGE_NAME, Event, TRUE); if (LastError != ERROR_SUCCESS) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG_ERROR(LastError, L"Failed to setup registry key %.*s notification", MAX_REG_PATH, RegPath); + LOG_ERROR(LastError, L"Failed to setup registry key %r notification", Key); break; } @@ -58,9 +56,7 @@ static _Return_type_success_(return != NULL) HKEY } if (LastError != ERROR_FILE_NOT_FOUND && LastError != ERROR_PATH_NOT_FOUND) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG_ERROR(LastError, L"Failed to open registry key %.*s\\%s", MAX_REG_PATH, RegPath, Path); + LOG_ERROR(LastError, L"Failed to open registry key %r\\%s", Key, Path); break; } @@ -70,14 +66,7 @@ static _Return_type_success_(return != NULL) HKEY DWORD Result = WaitForSingleObject(Event, (DWORD)TimeLeft); if (Result != WAIT_OBJECT_0) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG(WINTUN_LOG_ERR, - L"Timeout waiting for registry key %.*s\\%s (status: 0x%x)", - MAX_REG_PATH, - RegPath, - Path, - Result); + LOG(WINTUN_LOG_ERR, L"Timeout waiting for registry key %r\\%s (status: 0x%x)", Key, Path, Result); break; } } @@ -216,11 +205,7 @@ static _Return_type_success_(return != NULL) void *RegistryQuery( if (LastError != ERROR_MORE_DATA) { if (Log) - { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG_ERROR(LastError, L"Querying registry value %.*s\\%s failed", MAX_REG_PATH, RegPath, Name); - } + LOG_ERROR(LastError, L"Querying registry value %r\\%s failed", Key, Name); SetLastError(LastError); return NULL; } @@ -243,18 +228,10 @@ _Return_type_success_( return Value; LastError = GetLastError(); break; - default: { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG(WINTUN_LOG_ERR, - L"Registry value %.*s\\%s is not a string (type: %u)", - MAX_REG_PATH, - RegPath, - Name, - ValueType); + default: + LOG(WINTUN_LOG_ERR, L"Registry value %r\\%s is not a string (type: %u)", Key, Name, ValueType); LastError = ERROR_INVALID_DATATYPE; } - } Free(Value); SetLastError(LastError); return NULL; @@ -276,9 +253,7 @@ _Return_type_success_( LastError = RegNotifyChangeKeyValue(Key, FALSE, REG_NOTIFY_CHANGE_LAST_SET, Event, TRUE); if (LastError != ERROR_SUCCESS) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG_ERROR(LastError, L"Failed to setup registry key %.*s notification", MAX_REG_PATH, RegPath); + LOG_ERROR(LastError, L"Failed to setup registry key %r notification", Key); break; } WCHAR *Value = RegistryQueryString(Key, Name, FALSE); @@ -296,14 +271,7 @@ _Return_type_success_( DWORD Result = WaitForSingleObject(Event, (DWORD)TimeLeft); if (Result != WAIT_OBJECT_0) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG(WINTUN_LOG_ERR, - L"Timeout waiting for registry value %.*s\\%s (status: 0x%x)", - MAX_REG_PATH, - RegPath, - Name, - Result); + LOG(WINTUN_LOG_ERR, L"Timeout waiting for registry value %r\\%s (status: 0x%x)", Key, Name, Result); break; } } @@ -320,27 +288,19 @@ _Return_type_success_(return != FALSE) BOOL if (LastError != ERROR_SUCCESS) { if (Log) - { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG_ERROR(LastError, L"Querying registry value %.*s\\%s failed", MAX_REG_PATH, RegPath, Name); - } + LOG_ERROR(LastError, L"Querying registry value %r\\%s failed", Key, Name); SetLastError(LastError); return FALSE; } if (ValueType != REG_DWORD) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG(WINTUN_LOG_ERR, L"Value %.*s\\%s is not a DWORD (type: %u)", MAX_REG_PATH, RegPath, Name, ValueType); + LOG(WINTUN_LOG_ERR, L"Value %r\\%s is not a DWORD (type: %u)", Key, Name, ValueType); SetLastError(ERROR_INVALID_DATATYPE); return FALSE; } if (Size != sizeof(DWORD)) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG(WINTUN_LOG_ERR, L"Value %.*s\\%s size is not 4 bytes (size: %u)", MAX_REG_PATH, RegPath, Name, Size); + LOG(WINTUN_LOG_ERR, L"Value %r\\%s size is not 4 bytes (size: %u)", Key, Name, Size); SetLastError(ERROR_INVALID_DATA); return FALSE; } @@ -363,9 +323,7 @@ _Return_type_success_(return != FALSE) BOOL LastError = RegNotifyChangeKeyValue(Key, FALSE, REG_NOTIFY_CHANGE_LAST_SET, Event, TRUE); if (LastError != ERROR_SUCCESS) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG_ERROR(LastError, L"Failed to setup registry key %.*s notification", MAX_REG_PATH, RegPath); + LOG_ERROR(LastError, L"Failed to setup registry key %r notification", Key); break; } if (RegistryQueryDWORD(Key, Name, Value, FALSE)) @@ -382,9 +340,11 @@ _Return_type_success_(return != FALSE) BOOL DWORD Result = WaitForSingleObject(Event, (DWORD)TimeLeft); if (Result != WAIT_OBJECT_0) { - WCHAR RegPath[MAX_REG_PATH]; - LoggerGetRegistryKeyPath(Key, RegPath); - LOG(WINTUN_LOG_ERR, L"Timeout waiting registry value %.*s\\%s (status: 0x%x)", MAX_REG_PATH, RegPath, Name, Result); + LOG(WINTUN_LOG_ERR, + L"Timeout waiting registry value %r\\%s (status: 0x%x)", + Key, + Name, + Result); break; } } -- cgit v1.2.3-59-g8ed1b