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; }