Alexandre Julliard : ntdll: Move kernel32 loading into LdrInitializeThunk().

Alexandre Julliard julliard at winehq.org
Wed Mar 31 15:55:13 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Mar 31 10:20:02 2021 +0200

ntdll: Move kernel32 loading into LdrInitializeThunk().

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

---

 dlls/ntdll/loader.c     | 45 ++++++++++++++++++++-------------------------
 dlls/ntdll/locale.c     | 10 ----------
 dlls/ntdll/ntdll_misc.h |  2 +-
 3 files changed, 21 insertions(+), 36 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 5edccd6a29e..336b11c6344 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -68,6 +68,7 @@ const WCHAR windows_dir[] = L"C:\\windows";
 const WCHAR system_dir[] = L"C:\\windows\\system32\\";
 const WCHAR syswow64_dir[] = L"C:\\windows\\syswow64\\";
 
+HMODULE kernel32_handle = 0;
 BOOL is_wow64 = FALSE;
 
 /* system search path */
@@ -3517,6 +3518,23 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR
 
     if (!imports_fixup_done)
     {
+        ANSI_STRING func_name;
+        WINE_MODREF *kernel32;
+
+        if ((status = load_dll( NULL, L"kernel32.dll", NULL, 0, &kernel32 )) != STATUS_SUCCESS)
+        {
+            MESSAGE( "wine: could not load kernel32.dll, status %x\n", status );
+            NtTerminateProcess( GetCurrentProcess(), status );
+        }
+        kernel32_handle = kernel32->ldr.DllBase;
+        RtlInitAnsiString( &func_name, "BaseThreadInitThunk" );
+        if ((status = LdrGetProcedureAddress( kernel32_handle, &func_name,
+                                              0, (void **)&pBaseThreadInitThunk )) != STATUS_SUCCESS)
+        {
+            MESSAGE( "wine: could not find BaseThreadInitThunk in kernel32.dll, status %x\n", status );
+            NtTerminateProcess( GetCurrentProcess(), status );
+        }
+
         actctx_init();
         if (wm->ldr.Flags & LDR_COR_ILONLY)
             status = fixup_imports_ilonly( wm, NULL, entry );
@@ -4002,9 +4020,6 @@ static void map_wow64cpu(void)
  */
 static NTSTATUS process_init(void)
 {
-    WINE_MODREF *wm;
-    NTSTATUS status;
-    ANSI_STRING func_name;
     INITIAL_TEB stack;
     TEB *teb = NtCurrentTeb();
     PEB *peb = teb->Peb;
@@ -4039,6 +4054,7 @@ static NTSTATUS process_init(void)
     load_global_options();
     version_init();
     build_main_module();
+    build_ntdll_module();
 
 #ifndef _WIN64
     if (NtCurrentTeb64())
@@ -4050,30 +4066,9 @@ static NTSTATUS process_init(void)
         peb64->OSBuildNumber    = peb->OSBuildNumber;
         peb64->OSPlatformId     = peb->OSPlatformId;
         peb64->SessionId        = peb->SessionId;
-    }
-#endif
-
-    build_ntdll_module();
-
-#ifndef _WIN64
-    if (is_wow64)
         map_wow64cpu();
-#endif
-
-    if ((status = load_dll( NULL, L"C:\\windows\\system32\\kernel32.dll", NULL, 0, &wm )) != STATUS_SUCCESS)
-    {
-        MESSAGE( "wine: could not load kernel32.dll, status %x\n", status );
-        NtTerminateProcess( GetCurrentProcess(), status );
-    }
-    RtlInitAnsiString( &func_name, "BaseThreadInitThunk" );
-    if ((status = LdrGetProcedureAddress( wm->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 );
     }
-
-    init_locale( wm->ldr.DllBase );
+#endif
 
     RtlCreateUserStack( 0, 0, 0, 0x10000, 0x10000, &stack );
     teb->Tib.StackBase = stack.StackBase;
diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c
index b3a225a30c3..fe185d403f2 100644
--- a/dlls/ntdll/locale.c
+++ b/dlls/ntdll/locale.c
@@ -101,7 +101,6 @@ struct norm_table
 };
 
 static NLSTABLEINFO nls_info;
-static HMODULE kernel32_handle;
 static struct norm_table *norm_tables[16];
 
 
@@ -531,15 +530,6 @@ static unsigned int compose_string( const struct norm_table *info, WCHAR *str, u
 }
 
 
-/******************************************************************
- *		init_locale
- */
-void init_locale( HMODULE module )
-{
-    kernel32_handle = module;
-}
-
-
 static NTSTATUS get_dummy_preferred_ui_language( DWORD flags, LANGID lang, ULONG *count,
                                                  WCHAR *buffer, ULONG *size )
 {
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index b8f9dc28e63..400ac9398a5 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -61,7 +61,6 @@ extern void version_init(void) DECLSPEC_HIDDEN;
 extern void debug_init(void) DECLSPEC_HIDDEN;
 extern void actctx_init(void) DECLSPEC_HIDDEN;
 extern void heap_set_debug_flags( HANDLE handle ) DECLSPEC_HIDDEN;
-extern void init_locale( HMODULE module ) DECLSPEC_HIDDEN;
 extern void init_user_process_params(void) DECLSPEC_HIDDEN;
 extern void CDECL DECLSPEC_NORETURN signal_start_thread( CONTEXT *ctx ) DECLSPEC_HIDDEN;
 
@@ -79,6 +78,7 @@ extern void SNOOP_SetupDLL( HMODULE hmod ) DECLSPEC_HIDDEN;
 extern const WCHAR windows_dir[] DECLSPEC_HIDDEN;
 extern const WCHAR system_dir[] DECLSPEC_HIDDEN;
 extern const WCHAR syswow64_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