Alexandre Julliard : kernelbase: Load the locale.nls file at startup.
Alexandre Julliard
julliard at winehq.org
Thu Mar 24 17:46:43 CDT 2022
Module: wine
Branch: master
Commit: fffbe3fcaef9c2b0e3814305b212a95188c1b0c2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=fffbe3fcaef9c2b0e3814305b212a95188c1b0c2
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Mar 24 10:33:41 2022 +0100
kernelbase: Load the locale.nls file at startup.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernelbase/locale.c | 44 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 36 insertions(+), 8 deletions(-)
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index 9ef8fbe8f44..cb5441f755e 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -571,9 +571,15 @@ struct norm_table
static NLSTABLEINFO nls_info;
static UINT unix_cp = CP_UTF8;
static UINT mac_cp = 10000;
+static LCID system_lcid;
+static LCID user_lcid;
static HKEY intl_key;
static HKEY nls_key;
static HKEY tz_key;
+static const NLS_LOCALE_LCID_INDEX *lcids_index;
+static const NLS_LOCALE_LCNAME_INDEX *lcnames_index;
+static const NLS_LOCALE_HEADER *locale_table;
+static const WCHAR *locale_strings;
static CPTABLEINFO codepages[128];
static unsigned int nb_codepages;
@@ -620,6 +626,30 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
static CRITICAL_SECTION locale_section = { &critsect_debug, -1, 0, 0, 0, 0 };
+static void load_locale_nls(void)
+{
+ struct
+ {
+ UINT ctypes;
+ UINT unknown1;
+ UINT unknown2;
+ UINT unknown3;
+ UINT locales;
+ UINT charmaps;
+ UINT geoids;
+ UINT scripts;
+ } *header;
+ LCID lcid;
+ LARGE_INTEGER dummy;
+
+ RtlGetLocaleFileMappingAddress( (void **)&header, &lcid, &dummy );
+ locale_table = (const NLS_LOCALE_HEADER *)((char *)header + header->locales);
+ lcids_index = (const NLS_LOCALE_LCID_INDEX *)((char *)locale_table + locale_table->lcids_offset);
+ lcnames_index = (const NLS_LOCALE_LCNAME_INDEX *)((char *)locale_table + locale_table->lcnames_offset);
+ locale_strings = (const WCHAR *)((char *)locale_table + locale_table->strings_offset);
+}
+
+
static void init_sortkeys( DWORD *ptr )
{
WORD *ctype;
@@ -707,7 +737,6 @@ void init_locale(void)
UINT ansi_cp = 0, oem_cp = 0;
USHORT *ansi_ptr, *oem_ptr;
void *sort_ptr;
- LCID user_lcid;
WCHAR bufferW[LOCALE_NAME_MAX_LENGTH];
DYNAMIC_TIME_ZONE_INFORMATION timezone;
GEOID geoid = GEOID_NOT_AVAILABLE;
@@ -715,6 +744,10 @@ void init_locale(void)
SIZE_T size;
HKEY hkey;
+ load_locale_nls();
+ NtQueryDefaultLocale( FALSE, &system_lcid );
+ NtQueryDefaultLocale( FALSE, &user_lcid );
+
if (GetEnvironmentVariableW( L"WINEUNIXCP", bufferW, ARRAY_SIZE(bufferW) ))
unix_cp = wcstoul( bufferW, NULL, 10 );
@@ -775,7 +808,6 @@ void init_locale(void)
/* Update registry contents if the user locale has changed.
* This simulates the action of the Windows control panel. */
- user_lcid = GetUserDefaultLCID();
count = sizeof(bufferW);
if (!RegQueryValueExW( intl_key, L"Locale", NULL, NULL, (BYTE *)bufferW, &count ))
{
@@ -4671,9 +4703,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetStringTypeExW( LCID locale, DWORD type, const W
*/
LCID WINAPI DECLSPEC_HOTPATCH GetSystemDefaultLCID(void)
{
- LCID lcid;
- NtQueryDefaultLocale( FALSE, &lcid );
- return lcid;
+ return system_lcid;
}
@@ -4820,9 +4850,7 @@ done:
*/
LCID WINAPI DECLSPEC_HOTPATCH GetUserDefaultLCID(void)
{
- LCID lcid;
- NtQueryDefaultLocale( TRUE, &lcid );
- return lcid;
+ return user_lcid;
}
More information about the wine-cvs
mailing list