Alexandre Julliard : kernelbase: Move codepage initialization to ntdll.
Alexandre Julliard
julliard at winehq.org
Wed Apr 13 15:14:45 CDT 2022
Module: wine
Branch: master
Commit: e81327358a26b160740b3421a4c7f300b4d2f06f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e81327358a26b160740b3421a4c7f300b4d2f06f
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Apr 13 15:13:16 2022 +0200
kernelbase: Move codepage initialization to ntdll.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernelbase/locale.c | 28 +++++++---------------------
dlls/ntdll/locale.c | 34 +++++++++++++++++++++++++++++++++-
2 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index 25d6d76c0c4..42dcfff50e0 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -285,7 +285,6 @@ 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;
@@ -1752,7 +1751,7 @@ static void update_locale_registry(void)
*/
void init_locale( HMODULE module )
{
- UINT ansi_cp = 0, oem_cp = 0;
+ USHORT utf8[2] = { 0, CP_UTF8 };
USHORT *ansi_ptr, *oem_ptr;
void *sort_ptr;
WCHAR bufferW[LOCALE_NAME_MAX_LENGTH];
@@ -1781,26 +1780,13 @@ void init_locale( HMODULE module )
if (GetEnvironmentVariableW( L"WINEUNIXCP", bufferW, ARRAY_SIZE(bufferW) ))
unix_cp = wcstoul( bufferW, NULL, 10 );
- GetLocaleInfoW( LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
- (WCHAR *)&ansi_cp, sizeof(ansi_cp)/sizeof(WCHAR) );
- GetLocaleInfoW( LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTMACCODEPAGE | LOCALE_RETURN_NUMBER,
- (WCHAR *)&mac_cp, sizeof(mac_cp)/sizeof(WCHAR) );
- GetLocaleInfoW( LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTCODEPAGE | LOCALE_RETURN_NUMBER,
- (WCHAR *)&oem_cp, sizeof(oem_cp)/sizeof(WCHAR) );
-
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 );
- if (!oem_cp || NtGetNlsSectionPtr( 11, oem_cp, 0, (void **)&oem_ptr, &size ))
- NtGetNlsSectionPtr( 11, 437, NULL, (void **)&oem_ptr, &size );
- NtCurrentTeb()->Peb->AnsiCodePageData = ansi_ptr;
- NtCurrentTeb()->Peb->OemCodePageData = oem_ptr;
- NtCurrentTeb()->Peb->UnicodeCaseTableData = sort.casemap;
+ ansi_ptr = NtCurrentTeb()->Peb->AnsiCodePageData ? NtCurrentTeb()->Peb->AnsiCodePageData : utf8;
+ oem_ptr = NtCurrentTeb()->Peb->OemCodePageData ? NtCurrentTeb()->Peb->OemCodePageData : utf8;
RtlInitNlsTables( ansi_ptr, oem_ptr, sort.casemap, &nls_info );
- RtlResetRtlTranslations( &nls_info );
RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Nls",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &nls_key, NULL );
@@ -1840,11 +1826,11 @@ void init_locale( HMODULE module )
if (!RegCreateKeyExW( nls_key, L"Codepage",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL ))
{
- count = swprintf( bufferW, ARRAY_SIZE(bufferW), L"%03d", ansi_cp );
+ count = swprintf( bufferW, ARRAY_SIZE(bufferW), L"%03d", GetACP() );
RegSetValueExW( hkey, L"ACP", 0, REG_SZ, (BYTE *)bufferW, (count + 1) * sizeof(WCHAR) );
- count = swprintf( bufferW, ARRAY_SIZE(bufferW), L"%03d", oem_cp );
+ count = swprintf( bufferW, ARRAY_SIZE(bufferW), L"%03d", GetOEMCP() );
RegSetValueExW( hkey, L"OEMCP", 0, REG_SZ, (BYTE *)bufferW, (count + 1) * sizeof(WCHAR) );
- count = swprintf( bufferW, ARRAY_SIZE(bufferW), L"%03d", mac_cp );
+ count = swprintf( bufferW, ARRAY_SIZE(bufferW), L"%03d", system_locale->idefaultmaccodepage );
RegSetValueExW( hkey, L"MACCP", 0, REG_SZ, (BYTE *)bufferW, (count + 1) * sizeof(WCHAR) );
RegCloseKey( hkey );
}
@@ -1989,7 +1975,7 @@ static const CPTABLEINFO *get_codepage_table( UINT codepage )
case CP_OEMCP:
return &nls_info.OemTableInfo;
case CP_MACCP:
- codepage = mac_cp;
+ codepage = system_locale->idefaultmaccodepage;
break;
case CP_THREAD_ACP:
codepage = get_lcid_codepage( NtCurrentTeb()->CurrentLocale, 0 );
diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c
index 597910e5639..3c96a742e4e 100644
--- a/dlls/ntdll/locale.c
+++ b/dlls/ntdll/locale.c
@@ -153,10 +153,14 @@ static const NLS_LOCALE_DATA *get_locale_data( UINT idx )
void locale_init(void)
{
+ USHORT utf8[2] = { 0, CP_UTF8 };
WCHAR locale[LOCALE_NAME_MAX_LENGTH];
UNICODE_STRING name, value;
LARGE_INTEGER unused;
+ SIZE_T size;
LCID system_lcid, user_lcid = 0;
+ UINT ansi_cp = 1252, oem_cp = 437;
+ void *ansi_ptr = utf8, *oem_ptr = utf8, *case_ptr;
NTSTATUS status;
struct
{
@@ -189,10 +193,38 @@ void locale_init(void)
const NLS_LOCALE_LCNAME_INDEX *entry = find_lcname_entry( locale );
if (entry) user_lcid = get_locale_data( entry->idx )->idefaultlanguage;
}
- if (system_lcid == LOCALE_CUSTOM_UNSPECIFIED) system_lcid = MAKELANGID( LANG_ENGLISH, SUBLANG_DEFAULT );
if (!user_lcid) user_lcid = system_lcid;
NtSetDefaultUILanguage( user_lcid );
NtSetDefaultLocale( TRUE, user_lcid );
+
+ if (system_lcid == LOCALE_CUSTOM_UNSPECIFIED)
+ {
+ system_lcid = MAKELANGID( LANG_ENGLISH, SUBLANG_DEFAULT );
+ ansi_cp = oem_cp = CP_UTF8;
+ }
+ else
+ {
+ const NLS_LOCALE_LCID_INDEX *entry = find_lcid_entry( system_lcid );
+ ansi_cp = get_locale_data( entry->idx )->idefaultansicodepage;
+ oem_cp = get_locale_data( entry->idx )->idefaultcodepage;
+ }
+
+ NtGetNlsSectionPtr( 10, 0, NULL, &case_ptr, &size );
+ NtCurrentTeb()->Peb->UnicodeCaseTableData = case_ptr;
+ if (ansi_cp != CP_UTF8)
+ {
+ NtGetNlsSectionPtr( 11, ansi_cp, NULL, &ansi_ptr, &size );
+ NtCurrentTeb()->Peb->AnsiCodePageData = ansi_ptr;
+ }
+ if (oem_cp != CP_UTF8)
+ {
+ NtGetNlsSectionPtr( 11, oem_cp, NULL, &oem_ptr, &size );
+ NtCurrentTeb()->Peb->OemCodePageData = oem_ptr;
+ }
+ RtlInitNlsTables( ansi_ptr, oem_ptr, case_ptr, &nls_info );
+ NlsAnsiCodePage = nls_info.AnsiTableInfo.CodePage;
+ NlsMbCodePageTag = nls_info.AnsiTableInfo.DBCSCodePage;
+ NlsMbOemCodePageTag = nls_info.OemTableInfo.DBCSCodePage;
}
More information about the wine-cvs
mailing list