Alexandre Julliard : ntdll: Use RtlLcidToLocaleName() in the preferred UI language stub.

Alexandre Julliard julliard at winehq.org
Tue Mar 22 16:46:29 CDT 2022


Module: wine
Branch: master
Commit: c3023a123ef3fc95226fa9df257a5a71b650a0d0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c3023a123ef3fc95226fa9df257a5a71b650a0d0

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Mar 22 10:41:56 2022 +0100

ntdll: Use RtlLcidToLocaleName() in the preferred UI language stub.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/loader.c     |  7 ++-----
 dlls/ntdll/locale.c     | 33 ++++++++++-----------------------
 dlls/ntdll/ntdll_misc.h |  1 -
 3 files changed, 12 insertions(+), 29 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index f84746b7f1b..b6cc53763af 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -81,8 +81,6 @@ const WCHAR windows_dir[] = L"C:\\windows";
 /* system directory with trailing backslash */
 const WCHAR system_dir[] = L"C:\\windows\\system32\\";
 
-HMODULE kernel32_handle = 0;
-
 /* system search path */
 static const WCHAR system_path[] = L"C:\\windows\\system32;C:\\windows\\system;C:\\windows";
 
@@ -4117,17 +4115,16 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR
             MESSAGE( "wine: could not load kernel32.dll, status %x\n", status );
             NtTerminateProcess( GetCurrentProcess(), status );
         }
-        kernel32_handle = kernel32->ldr.DllBase;
         node_kernel32 = kernel32->ldr.DdagNode;
         RtlInitAnsiString( &func_name, "BaseThreadInitThunk" );
-        if ((status = LdrGetProcedureAddress( kernel32_handle, &func_name,
+        if ((status = LdrGetProcedureAddress( kernel32->ldr.DllBase, &func_name,
                                               0, (void **)&pBaseThreadInitThunk )) != STATUS_SUCCESS)
         {
             MESSAGE( "wine: could not find BaseThreadInitThunk in kernel32.dll, status %x\n", status );
             NtTerminateProcess( GetCurrentProcess(), status );
         }
         RtlInitAnsiString( &func_name, "CtrlRoutine" );
-        LdrGetProcedureAddress( kernel32_handle, &func_name, 0, (void **)&pCtrlRoutine );
+        LdrGetProcedureAddress( kernel32->ldr.DllBase, &func_name, 0, (void **)&pCtrlRoutine );
 
         locale_init();
         actctx_init();
diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c
index 4333ca2cd6f..158f068b03d 100644
--- a/dlls/ntdll/locale.c
+++ b/dlls/ntdll/locale.c
@@ -107,26 +107,6 @@ static const NLS_LOCALE_LCID_INDEX *lcids_index;
 static const NLS_LOCALE_LCNAME_INDEX *lcnames_index;
 static const NLS_LOCALE_HEADER *locale_table;
 
-static NTSTATUS load_string( ULONG id, LANGID lang, WCHAR *buffer, ULONG len )
-{
-    const IMAGE_RESOURCE_DATA_ENTRY *data;
-    LDR_RESOURCE_INFO info;
-    NTSTATUS status;
-    WCHAR *p;
-    int i;
-
-    info.Type = 6; /* RT_STRING */
-    info.Name = (id >> 4) + 1;
-    info.Language = lang;
-    if ((status = LdrFindResource_U( kernel32_handle, &info, 3, &data ))) return status;
-    p = (WCHAR *)((char *)kernel32_handle + data->OffsetToData);
-    for (i = 0; i < (id & 0x0f); i++) p += *p + 1;
-    if (*p >= len) return STATUS_BUFFER_TOO_SMALL;
-    memcpy( buffer, p + 1, *p * sizeof(WCHAR) );
-    buffer[*p] = 0;
-    return STATUS_SUCCESS;
-}
-
 
 static DWORD mbtowc_size( const CPTABLEINFO *info, LPCSTR str, UINT len )
 {
@@ -625,9 +605,16 @@ static NTSTATUS get_dummy_preferred_ui_language( DWORD flags, LANGID lang, ULONG
 
     FIXME("(0x%x %p %p %p) returning a dummy value (current locale)\n", flags, count, buffer, size);
 
-    status = load_string( (flags & MUI_LANGUAGE_ID) ? LOCALE_ILANGUAGE : LOCALE_SNAME,
-                          lang, name, ARRAY_SIZE(name) );
-    if (status) return status;
+    if (flags & MUI_LANGUAGE_ID) swprintf( name, ARRAY_SIZE(name), L"%04lx", lang );
+    else
+    {
+        UNICODE_STRING str;
+
+        str.Buffer = name;
+        str.MaximumLength = sizeof(name);
+        status = RtlLcidToLocaleName( lang, &str, 0, FALSE );
+        if (status) return status;
+    }
 
     len = wcslen( name ) + 2;
     name[len - 1] = 0;
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index 571b49e844c..d55083ae34c 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -80,7 +80,6 @@ extern void RELAY_SetupDLL( HMODULE hmod ) DECLSPEC_HIDDEN;
 extern void SNOOP_SetupDLL( HMODULE hmod ) DECLSPEC_HIDDEN;
 extern const WCHAR windows_dir[] DECLSPEC_HIDDEN;
 extern const WCHAR system_dir[] DECLSPEC_HIDDEN;
-extern HMODULE kernel32_handle DECLSPEC_HIDDEN;
 
 extern void (FASTCALL *pBaseThreadInitThunk)(DWORD,LPTHREAD_START_ROUTINE,void *) DECLSPEC_HIDDEN;
 extern const struct unix_funcs *unix_funcs DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list