Commit fffbe3fc authored by Alexandre Julliard's avatar Alexandre Julliard

kernelbase: Load the locale.nls file at startup.

parent 55b45d00
...@@ -571,9 +571,15 @@ struct norm_table ...@@ -571,9 +571,15 @@ struct norm_table
static NLSTABLEINFO nls_info; static NLSTABLEINFO nls_info;
static UINT unix_cp = CP_UTF8; static UINT unix_cp = CP_UTF8;
static UINT mac_cp = 10000; static UINT mac_cp = 10000;
static LCID system_lcid;
static LCID user_lcid;
static HKEY intl_key; static HKEY intl_key;
static HKEY nls_key; static HKEY nls_key;
static HKEY tz_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 CPTABLEINFO codepages[128];
static unsigned int nb_codepages; static unsigned int nb_codepages;
...@@ -620,6 +626,30 @@ static CRITICAL_SECTION_DEBUG critsect_debug = ...@@ -620,6 +626,30 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
static CRITICAL_SECTION locale_section = { &critsect_debug, -1, 0, 0, 0, 0 }; 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 ) static void init_sortkeys( DWORD *ptr )
{ {
WORD *ctype; WORD *ctype;
...@@ -707,7 +737,6 @@ void init_locale(void) ...@@ -707,7 +737,6 @@ void init_locale(void)
UINT ansi_cp = 0, oem_cp = 0; UINT ansi_cp = 0, oem_cp = 0;
USHORT *ansi_ptr, *oem_ptr; USHORT *ansi_ptr, *oem_ptr;
void *sort_ptr; void *sort_ptr;
LCID user_lcid;
WCHAR bufferW[LOCALE_NAME_MAX_LENGTH]; WCHAR bufferW[LOCALE_NAME_MAX_LENGTH];
DYNAMIC_TIME_ZONE_INFORMATION timezone; DYNAMIC_TIME_ZONE_INFORMATION timezone;
GEOID geoid = GEOID_NOT_AVAILABLE; GEOID geoid = GEOID_NOT_AVAILABLE;
...@@ -715,6 +744,10 @@ void init_locale(void) ...@@ -715,6 +744,10 @@ void init_locale(void)
SIZE_T size; SIZE_T size;
HKEY hkey; HKEY hkey;
load_locale_nls();
NtQueryDefaultLocale( FALSE, &system_lcid );
NtQueryDefaultLocale( FALSE, &user_lcid );
if (GetEnvironmentVariableW( L"WINEUNIXCP", bufferW, ARRAY_SIZE(bufferW) )) if (GetEnvironmentVariableW( L"WINEUNIXCP", bufferW, ARRAY_SIZE(bufferW) ))
unix_cp = wcstoul( bufferW, NULL, 10 ); unix_cp = wcstoul( bufferW, NULL, 10 );
...@@ -775,7 +808,6 @@ void init_locale(void) ...@@ -775,7 +808,6 @@ void init_locale(void)
/* Update registry contents if the user locale has changed. /* Update registry contents if the user locale has changed.
* This simulates the action of the Windows control panel. */ * This simulates the action of the Windows control panel. */
user_lcid = GetUserDefaultLCID();
count = sizeof(bufferW); count = sizeof(bufferW);
if (!RegQueryValueExW( intl_key, L"Locale", NULL, NULL, (BYTE *)bufferW, &count )) 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 ...@@ -4671,9 +4703,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetStringTypeExW( LCID locale, DWORD type, const W
*/ */
LCID WINAPI DECLSPEC_HOTPATCH GetSystemDefaultLCID(void) LCID WINAPI DECLSPEC_HOTPATCH GetSystemDefaultLCID(void)
{ {
LCID lcid; return system_lcid;
NtQueryDefaultLocale( FALSE, &lcid );
return lcid;
} }
...@@ -4820,9 +4850,7 @@ done: ...@@ -4820,9 +4850,7 @@ done:
*/ */
LCID WINAPI DECLSPEC_HOTPATCH GetUserDefaultLCID(void) LCID WINAPI DECLSPEC_HOTPATCH GetUserDefaultLCID(void)
{ {
LCID lcid; return user_lcid;
NtQueryDefaultLocale( TRUE, &lcid );
return lcid;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment