Module: wine Branch: master Commit: 4b1676af06a0b8db13db1fe692531a48e9be053b URL: https://source.winehq.org/git/wine.git/?a=commit;h=4b1676af06a0b8db13db1fe69...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Mar 17 11:27:21 2020 +0100
kernelbase: Load the sortkey file and use it for the case mapping table.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernelbase/locale.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index 169da01608..ae4527b866 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -577,6 +577,12 @@ static unsigned int nb_codepages;
static struct norm_table *norm_info;
+static struct +{ + DWORD *keys; /* sortkey table, indexed by char */ + USHORT *casemap; /* casemap table, in l_intl.nls format */ +} sort; + static CRITICAL_SECTION locale_section; static CRITICAL_SECTION_DEBUG critsect_debug = { @@ -586,13 +592,25 @@ static CRITICAL_SECTION_DEBUG critsect_debug = }; static CRITICAL_SECTION locale_section = { &critsect_debug, -1, 0, 0, 0, 0 };
+ +/*********************************************************************** + * init_sortkeys + */ +static void init_sortkeys( DWORD *ptr ) +{ + sort.keys = (DWORD *)((char *)ptr + ptr[0]); + sort.casemap = (USHORT *)((char *)ptr + ptr[1]); +} + + /*********************************************************************** * init_locale */ void init_locale(void) { UINT ansi_cp = 0, oem_cp = 0; - USHORT *ansi_ptr, *oem_ptr, *casemap_ptr; + USHORT *ansi_ptr, *oem_ptr; + void *sort_ptr; LCID lcid = GetUserDefaultLCID(); WCHAR bufferW[80]; DYNAMIC_TIME_ZONE_INFORMATION timezone; @@ -610,8 +628,9 @@ void init_locale(void) GetLocaleInfoW( LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTCODEPAGE | LOCALE_RETURN_NUMBER, (WCHAR *)&oem_cp, sizeof(oem_cp)/sizeof(WCHAR) );
- NtGetNlsSectionPtr( 10, 0, 0, (void **)&casemap_ptr, &size ); + NtGetNlsSectionPtr( 9, 0, NULL, &sort_ptr, &size ); NtGetNlsSectionPtr( 12, NormalizationC, NULL, (void **)&norm_info, &size ); + init_sortkeys( sort_ptr );
if (!ansi_cp || NtGetNlsSectionPtr( 11, ansi_cp, NULL, (void **)&ansi_ptr, &size )) NtGetNlsSectionPtr( 11, 1252, NULL, (void **)&ansi_ptr, &size ); @@ -619,8 +638,8 @@ void init_locale(void) NtGetNlsSectionPtr( 11, 437, NULL, (void **)&oem_ptr, &size ); NtCurrentTeb()->Peb->AnsiCodePageData = ansi_ptr; NtCurrentTeb()->Peb->OemCodePageData = oem_ptr; - NtCurrentTeb()->Peb->UnicodeCaseTableData = casemap_ptr; - RtlInitNlsTables( ansi_ptr, oem_ptr, casemap_ptr, &nls_info ); + NtCurrentTeb()->Peb->UnicodeCaseTableData = sort.casemap; + RtlInitNlsTables( ansi_ptr, oem_ptr, sort.casemap, &nls_info ); RtlResetRtlTranslations( &nls_info );
RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"System\CurrentControlSet\Control\Nls",