diff --git a/dll/win32/kernel32/kernel32_vista/CMakeLists.txt b/dll/win32/kernel32/kernel32_vista/CMakeLists.txt index 815928b896f..6221ecf4944 100644 --- a/dll/win32/kernel32/kernel32_vista/CMakeLists.txt +++ b/dll/win32/kernel32/kernel32_vista/CMakeLists.txt @@ -12,6 +12,7 @@ list(APPEND SOURCE GetTickCount64.c GetUserDefaultLocaleName.c InitOnce.c + LCIDToLocaleName.c LocaleNameToLCID.c sync.c vista.c) diff --git a/dll/win32/kernel32/kernel32_vista/LCIDToLocaleName.c b/dll/win32/kernel32/kernel32_vista/LCIDToLocaleName.c new file mode 100644 index 00000000000..43b8078ad7b --- /dev/null +++ b/dll/win32/kernel32/kernel32_vista/LCIDToLocaleName.c @@ -0,0 +1,59 @@ +/* + * PROJECT: ReactOS Win32 Base API + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of LCIDToLocaleName + * COPYRIGHT: Copyright 2025 Timo Kreuzer + */ + +#include "k32_vista.h" +#include + +int +WINAPI +LCIDToLocaleName( + _In_ LCID Locale, + _Out_writes_opt_(cchName) LPWSTR lpName, + _In_ int cchName, + _In_ DWORD dwFlags) +{ + WCHAR Buffer[LOCALE_NAME_MAX_LENGTH]; + UNICODE_STRING LocaleNameString; + DWORD RtlFlags = 0; + NTSTATUS Status; + + if (cchName < 0) + { + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + if (dwFlags & LOCALE_ALLOW_NEUTRAL_NAMES) + { + RtlFlags |= RTL_LOCALE_ALLOW_NEUTRAL_NAMES; + } + + if (lpName != NULL) + { + cchName = min(cchName, LOCALE_NAME_MAX_LENGTH); + LocaleNameString.Buffer = lpName; + LocaleNameString.Length = 0; + LocaleNameString.MaximumLength = (USHORT)(cchName * sizeof(WCHAR)); + } + else + { + LocaleNameString.Buffer = Buffer; + LocaleNameString.Length = 0; + LocaleNameString.MaximumLength = sizeof(Buffer); + } + + /* Call the RTL function */ + Status = RtlLcidToLocaleName(Locale, &LocaleNameString, RtlFlags, FALSE); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return 0; + } + + /* Return the length including the terminating null */ + return (LocaleNameString.Length / sizeof(WCHAR)) + 1; +} diff --git a/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec b/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec index ea6fd7db61e..4e363fc1d50 100644 --- a/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec +++ b/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec @@ -44,6 +44,7 @@ @ stdcall GetUILanguageInfo(long wstr wstr ptr ptr) @ stdcall GetUserDefaultLocaleName(wstr long) @ stdcall GetUserPreferredUILanguages(long ptr wstr ptr) +@ stdcall LCIDToLocaleName(long wstr long long) @ stdcall LocaleNameToLCID(wstr long) @ stdcall OpenFileById(ptr ptr long long ptr long) @ stdcall QueryFullProcessImageNameA(ptr long str ptr) diff --git a/dll/win32/kernel32/winnls/string/locale.c b/dll/win32/kernel32/winnls/string/locale.c index 607620f82c4..8033e97138d 100644 --- a/dll/win32/kernel32/winnls/string/locale.c +++ b/dll/win32/kernel32/winnls/string/locale.c @@ -1439,6 +1439,7 @@ LCID WINAPI LocaleNameToLCID( LPCWSTR name, DWORD flags ) #endif +#if 0 // See kernel32_vista /*********************************************************************** * LCIDToLocaleName (KERNEL32.@) */ @@ -1449,6 +1450,7 @@ INT WINAPI LCIDToLocaleName( LCID lcid, LPWSTR name, INT count, DWORD flags ) return GetLocaleInfoW( lcid, LOCALE_SNAME | LOCALE_NOUSEROVERRIDE, name, count ); } #endif +#endif /******************************************************************************