diff --git a/dll/win32/kernel32/kernel32_vista/CMakeLists.txt b/dll/win32/kernel32/kernel32_vista/CMakeLists.txt index 6221ecf4944..e6229a5b66c 100644 --- a/dll/win32/kernel32/kernel32_vista/CMakeLists.txt +++ b/dll/win32/kernel32/kernel32_vista/CMakeLists.txt @@ -8,6 +8,7 @@ spec2def(kernel32_vista.dll kernel32_vista.spec ADD_IMPORTLIB) list(APPEND SOURCE firmware.c + EnumSystemLocalesEx.c GetFileInformationByHandleEx.c GetTickCount64.c GetUserDefaultLocaleName.c diff --git a/dll/win32/kernel32/kernel32_vista/EnumSystemLocalesEx.c b/dll/win32/kernel32/kernel32_vista/EnumSystemLocalesEx.c new file mode 100644 index 00000000000..7d2db84bcea --- /dev/null +++ b/dll/win32/kernel32/kernel32_vista/EnumSystemLocalesEx.c @@ -0,0 +1,61 @@ +/* + * PROJECT: ReactOS Win32 Base API + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Implementation of GetLocaleInfoEx (taken from wine-locale.c) + * COPYRIGHT: Copyright 1995 Martin von Loewis + * Copyright 1998 David Lee Lambert + * Copyright 2000 Julio César Gázquez + * Copyright 2002 Alexandre Julliard for CodeWeavers + */ + +#include "k32_vista.h" +#include + +struct enum_locale_ex_data +{ + LOCALE_ENUMPROCEX proc; + DWORD flags; + LPARAM lparam; +}; + +static BOOL CALLBACK enum_locale_ex_proc( HMODULE module, LPCWSTR type, + LPCWSTR name, WORD lang, LONG_PTR lparam ) +{ + struct enum_locale_ex_data *data = (struct enum_locale_ex_data *)lparam; + WCHAR buffer[256]; + DWORD neutral; + unsigned int flags; + + GetLocaleInfoW( MAKELCID( lang, SORT_DEFAULT ), LOCALE_SNAME | LOCALE_NOUSEROVERRIDE, + buffer, sizeof(buffer) / sizeof(WCHAR) ); + if (!GetLocaleInfoW( MAKELCID( lang, SORT_DEFAULT ), + LOCALE_INEUTRAL | LOCALE_NOUSEROVERRIDE | LOCALE_RETURN_NUMBER, + (LPWSTR)&neutral, sizeof(neutral) / sizeof(WCHAR) )) + neutral = 0; + flags = LOCALE_WINDOWS; + flags |= neutral ? LOCALE_NEUTRALDATA : LOCALE_SPECIFICDATA; + if (data->flags && !(data->flags & flags)) return TRUE; + return data->proc( buffer, flags, data->lparam ); +} + +/****************************************************************************** + * EnumSystemLocalesEx (KERNEL32.@) + */ +BOOL WINAPI EnumSystemLocalesEx( LOCALE_ENUMPROCEX proc, DWORD flags, LPARAM lparam, LPVOID reserved ) +{ + struct enum_locale_ex_data data; + HMODULE kernel32_handle = GetModuleHandleW(L"kernel32.dll"); + + if (reserved) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + data.proc = proc; + data.flags = flags; + data.lparam = lparam; + EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING, + (LPCWSTR)MAKEINTRESOURCE((LOCALE_SNAME >> 4) + 1), + enum_locale_ex_proc, (LONG_PTR)&data ); + return TRUE; +} diff --git a/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec b/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec index 4e363fc1d50..d86ff4c7096 100644 --- a/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec +++ b/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec @@ -31,6 +31,7 @@ @ stdcall ApplicationRecoveryInProgress(ptr) @ stdcall CreateSymbolicLinkA(str str long) @ stdcall CreateSymbolicLinkW(wstr wstr long) +@ stdcall EnumSystemLocalesEx(ptr long long ptr) @ stdcall GetApplicationRecoveryCallback(ptr ptr ptr ptr ptr) @ stdcall GetApplicationRestart(ptr wstr ptr ptr) @ stdcall GetFileBandwidthReservation(ptr ptr ptr ptr ptr ptr) diff --git a/dll/win32/kernel32/winnls/string/locale.c b/dll/win32/kernel32/winnls/string/locale.c index 8033e97138d..c8862e2a447 100644 --- a/dll/win32/kernel32/winnls/string/locale.c +++ b/dll/win32/kernel32/winnls/string/locale.c @@ -3011,6 +3011,7 @@ struct enum_locale_ex_data LPARAM lparam; }; +#if 0 static BOOL CALLBACK enum_locale_ex_proc( HMODULE module, LPCWSTR type, LPCWSTR name, WORD lang, LONG_PTR lparam ) { @@ -3051,7 +3052,7 @@ BOOL WINAPI EnumSystemLocalesEx( LOCALE_ENUMPROCEX proc, DWORD flags, LPARAM lpa enum_locale_ex_proc, (LONG_PTR)&data ); return TRUE; } - +#endif /*********************************************************************** * VerLanguageNameA (KERNEL32.@)