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