Alexandre Julliard : ntdll: Add support for setting a platform-specific initial context.

Alexandre Julliard julliard at winehq.org
Tue Sep 19 15:47:04 CDT 2017


Module: wine
Branch: master
Commit: 8c103f298b099bbc58b1daef228fbaa5c18f00ca
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8c103f298b099bbc58b1daef228fbaa5c18f00ca

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Sep 19 12:10:01 2017 +0200

ntdll: Add support for setting a platform-specific initial context.

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

---

 dlls/ntdll/loader.c         | 4 +++-
 dlls/ntdll/ntdll_misc.h     | 4 ++--
 dlls/ntdll/server.c         | 7 ++++---
 dlls/ntdll/signal_arm.c     | 4 +++-
 dlls/ntdll/signal_arm64.c   | 4 +++-
 dlls/ntdll/signal_i386.c    | 4 +++-
 dlls/ntdll/signal_powerpc.c | 4 +++-
 dlls/ntdll/signal_x86_64.c  | 4 +++-
 8 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 31d8323..5d8b4e2 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -3115,6 +3115,7 @@ void WINAPI LdrInitializeThunk( void *kernel_start, ULONG_PTR unknown2,
     WINE_MODREF *wm;
     LPCWSTR load_path;
     PEB *peb = NtCurrentTeb()->Peb;
+    CONTEXT context = { 0 };
 
     kernel32_start_process = kernel_start;
     if (main_exe_file) NtClose( main_exe_file );  /* at this point the main module is created */
@@ -3145,7 +3146,7 @@ void WINAPI LdrInitializeThunk( void *kernel_start, ULONG_PTR unknown2,
     InsertHeadList( &peb->LdrData->InMemoryOrderModuleList, &wm->ldr.InMemoryOrderModuleList );
 
     if ((status = virtual_alloc_thread_stack( NtCurrentTeb(), 0, 0 )) != STATUS_SUCCESS) goto error;
-    if ((status = server_init_process_done()) != STATUS_SUCCESS) goto error;
+    if ((status = server_init_process_done( &context )) != STATUS_SUCCESS) goto error;
 
     actctx_init();
     load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer;
@@ -3157,6 +3158,7 @@ void WINAPI LdrInitializeThunk( void *kernel_start, ULONG_PTR unknown2,
 
     virtual_release_address_space();
     virtual_clear_thread_stack();
+    if (context.ContextFlags) NtSetContextThread( GetCurrentThread(), &context );
     wine_switch_to_stack( start_process, wm->ldr.EntryPoint, NtCurrentTeb()->Tib.StackBase );
 
 error:
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index baa10ce..8dae676 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -67,7 +67,7 @@ extern LPCSTR debugstr_ObjectAttributes(const OBJECT_ATTRIBUTES *oa) DECLSPEC_HI
 extern NTSTATUS signal_alloc_thread( TEB **teb ) DECLSPEC_HIDDEN;
 extern void signal_free_thread( TEB *teb ) DECLSPEC_HIDDEN;
 extern void signal_init_thread( TEB *teb ) DECLSPEC_HIDDEN;
-extern void signal_init_process(void) DECLSPEC_HIDDEN;
+extern void signal_init_process( CONTEXT *context, LPTHREAD_START_ROUTINE entry ) DECLSPEC_HIDDEN;
 extern void version_init( const WCHAR *appname ) DECLSPEC_HIDDEN;
 extern void debug_init(void) DECLSPEC_HIDDEN;
 extern HANDLE thread_init(void) DECLSPEC_HIDDEN;
@@ -82,7 +82,7 @@ extern timeout_t server_start_time DECLSPEC_HIDDEN;
 extern unsigned int server_cpus DECLSPEC_HIDDEN;
 extern BOOL is_wow64 DECLSPEC_HIDDEN;
 extern void server_init_process(void) DECLSPEC_HIDDEN;
-extern NTSTATUS server_init_process_done(void) DECLSPEC_HIDDEN;
+extern NTSTATUS server_init_process_done( CONTEXT *context ) DECLSPEC_HIDDEN;
 extern size_t server_init_thread( void *entry_point ) DECLSPEC_HIDDEN;
 extern void DECLSPEC_NORETURN abort_thread( int status ) DECLSPEC_HIDDEN;
 extern void DECLSPEC_NORETURN terminate_thread( int status ) DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
index c02a12a..b20f1a5 100644
--- a/dlls/ntdll/server.c
+++ b/dlls/ntdll/server.c
@@ -1421,10 +1421,11 @@ void server_init_process(void)
 /***********************************************************************
  *           server_init_process_done
  */
-NTSTATUS server_init_process_done(void)
+NTSTATUS server_init_process_done( CONTEXT *context )
 {
     PEB *peb = NtCurrentTeb()->Peb;
     IMAGE_NT_HEADERS *nt = RtlImageNtHeader( peb->ImageBaseAddress );
+    void *entry = (char *)peb->ImageBaseAddress + nt->OptionalHeader.AddressOfEntryPoint;
     NTSTATUS status;
 
     /* Install signal handlers; this cannot be done earlier, since we cannot
@@ -1433,7 +1434,7 @@ NTSTATUS server_init_process_done(void)
      * We do need the handlers in place by the time the request is over, so
      * we set them up here. If we segfault between here and the server call
      * something is very wrong... */
-    signal_init_process();
+    signal_init_process( context, entry );
 
     /* Signal the parent process to continue */
     SERVER_START_REQ( init_process_done )
@@ -1442,7 +1443,7 @@ NTSTATUS server_init_process_done(void)
 #ifdef __i386__
         req->ldt_copy = wine_server_client_ptr( &wine_ldt_copy );
 #endif
-        req->entry    = wine_server_client_ptr( (char *)peb->ImageBaseAddress + nt->OptionalHeader.AddressOfEntryPoint );
+        req->entry    = wine_server_client_ptr( entry );
         req->gui      = (nt->OptionalHeader.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CUI);
         status = wine_server_call( req );
     }
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index 106699d..e5e3140 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -981,7 +981,7 @@ void signal_init_thread( TEB *teb )
 /**********************************************************************
  *		signal_init_process
  */
-void signal_init_process(void)
+void signal_init_process( CONTEXT *context, LPTHREAD_START_ROUTINE entry )
 {
     struct sigaction sig_act;
 
@@ -1010,6 +1010,8 @@ void signal_init_process(void)
     sig_act.sa_sigaction = trap_handler;
     if (sigaction( SIGTRAP, &sig_act, NULL ) == -1) goto error;
 #endif
+
+    /* FIXME: set the initial context */
     return;
 
  error:
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 4b305e3..5b3e887 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -852,7 +852,7 @@ void signal_init_thread( TEB *teb )
 /**********************************************************************
  *		signal_init_process
  */
-void signal_init_process(void)
+void signal_init_process( CONTEXT *context, LPTHREAD_START_ROUTINE entry )
 {
     struct sigaction sig_act;
 
@@ -881,6 +881,8 @@ void signal_init_process(void)
     sig_act.sa_sigaction = trap_handler;
     if (sigaction( SIGTRAP, &sig_act, NULL ) == -1) goto error;
 #endif
+
+    /* FIXME: set the initial context */
     return;
 
  error:
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index ab8d114..a373e3d 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -2557,7 +2557,7 @@ void signal_init_thread( TEB *teb )
 /**********************************************************************
  *		signal_init_process
  */
-void signal_init_process(void)
+void signal_init_process( CONTEXT *context, LPTHREAD_START_ROUTINE entry )
 {
     struct sigaction sig_act;
 
@@ -2599,6 +2599,8 @@ void signal_init_process(void)
 #endif
 
     wine_ldt_init_locking( ldt_lock, ldt_unlock );
+
+    /* FIXME: set the initial context */
     return;
 
  error:
diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c
index f5560f1..e5a009c 100644
--- a/dlls/ntdll/signal_powerpc.c
+++ b/dlls/ntdll/signal_powerpc.c
@@ -1054,7 +1054,7 @@ void signal_init_thread( TEB *teb )
 /**********************************************************************
  *		signal_init_process
  */
-void signal_init_process(void)
+void signal_init_process( CONTEXT *context, LPTHREAD_START_ROUTINE entry )
 {
     struct sigaction sig_act;
 
@@ -1083,6 +1083,8 @@ void signal_init_process(void)
     sig_act.sa_sigaction = trap_handler;
     if (sigaction( SIGTRAP, &sig_act, NULL ) == -1) goto error;
 #endif
+
+    /* FIXME: set the initial context */
     return;
 
  error:
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index ed43682..6e95257 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -3102,7 +3102,7 @@ void signal_init_thread( TEB *teb )
 /**********************************************************************
  *		signal_init_process
  */
-void signal_init_process(void)
+void signal_init_process( CONTEXT *context, LPTHREAD_START_ROUTINE entry )
 {
     struct sigaction sig_act;
 
@@ -3131,6 +3131,8 @@ void signal_init_process(void)
     sig_act.sa_sigaction = trap_handler;
     if (sigaction( SIGTRAP, &sig_act, NULL ) == -1) goto error;
 #endif
+
+    /* FIXME: set the initial context */
     return;
 
  error:




More information about the wine-cvs mailing list