Module: wine Branch: master Commit: 967ef0bf41fc6742398313ebdebd681c1b33dbc3 URL: https://source.winehq.org/git/wine.git/?a=commit;h=967ef0bf41fc6742398313ebd...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Apr 13 15:58:59 2022 +0200
ntdll: Support overriding the codepage from the manifest.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52223 Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/loader.c | 2 +- dlls/ntdll/locale.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index b6cc53763af..d750f7a7579 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -4126,8 +4126,8 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR RtlInitAnsiString( &func_name, "CtrlRoutine" ); LdrGetProcedureAddress( kernel32->ldr.DllBase, &func_name, 0, (void **)&pCtrlRoutine );
- locale_init(); actctx_init(); + locale_init(); if (wm->ldr.Flags & LDR_COR_ILONLY) status = fixup_imports_ilonly( wm, NULL, entry ); else diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c index 3c96a742e4e..b95b3522fce 100644 --- a/dlls/ntdll/locale.c +++ b/dlls/ntdll/locale.c @@ -209,6 +209,27 @@ void locale_init(void) oem_cp = get_locale_data( entry->idx )->idefaultcodepage; }
+ if (!RtlQueryActivationContextApplicationSettings( 0, NULL, L"http://schemas.microsoft.com/SMI/2019/WindowsSettings", + L"activeCodePage", locale, ARRAY_SIZE(locale), NULL )) + { + const NLS_LOCALE_LCNAME_INDEX *entry = find_lcname_entry( locale ); + + if (!wcsicmp( locale, L"utf-8" )) + { + ansi_cp = oem_cp = CP_UTF8; + } + else if (!wcsicmp( locale, L"legacy" )) + { + if (ansi_cp == CP_UTF8) ansi_cp = 1252; + if (oem_cp == CP_UTF8) oem_cp = 437; + } + else if ((entry = find_lcname_entry( locale ))) + { + 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)