Alexandre Julliard : server: Send TEB and PEB in the process_init_done request.

Alexandre Julliard julliard at winehq.org
Thu May 13 15:31:00 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 13 15:21:06 2021 +0200

server: Send TEB and PEB in the process_init_done request.

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

---

 dlls/ntdll/unix/server.c       | 10 +++++-----
 include/wine/server_protocol.h |  8 ++++----
 server/process.c               |  4 ++++
 server/protocol.def            |  6 +++---
 server/request.h               | 14 +++++++-------
 server/thread.c                |  9 ---------
 server/trace.c                 |  6 +++---
 7 files changed, 26 insertions(+), 31 deletions(-)

diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
index 8400c2930bb..db84fc16344 100644
--- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -1556,11 +1556,6 @@ size_t server_init_process(void)
     {
         req->unix_pid    = getpid();
         req->unix_tid    = get_unix_tid();
-        req->teb         = wine_server_client_ptr( NtCurrentTeb() );
-        req->peb         = wine_server_client_ptr( NtCurrentTeb()->Peb );
-#ifdef __i386__
-        req->ldt_copy    = wine_server_client_ptr( &__wine_ldt_copy );
-#endif
         req->reply_fd    = reply_pipe;
         req->wait_fd     = ntdll_get_thread_data()->wait_fd[1];
         req->debug_level = (TRACE_ON(server) != 0);
@@ -1640,6 +1635,11 @@ void server_init_process_done(void)
     /* Signal the parent process to continue */
     SERVER_START_REQ( init_process_done )
     {
+        req->teb      = wine_server_client_ptr( NtCurrentTeb() );
+        req->peb      = wine_server_client_ptr( NtCurrentTeb()->Peb );
+#ifdef __i386__
+        req->ldt_copy = wine_server_client_ptr( &__wine_ldt_copy );
+#endif
         status = wine_server_call( req );
         suspend = reply->suspend;
         entry = wine_server_get_ptr( reply->entry );
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 9fe826918fa..27557f2c1d7 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -910,6 +910,9 @@ struct init_process_done_request
 {
     struct request_header __header;
     char __pad_12[4];
+    client_ptr_t teb;
+    client_ptr_t peb;
+    client_ptr_t ldt_copy;
 };
 struct init_process_done_reply
 {
@@ -927,9 +930,6 @@ struct init_first_thread_request
     int          unix_pid;
     int          unix_tid;
     int          debug_level;
-    client_ptr_t teb;
-    client_ptr_t peb;
-    client_ptr_t ldt_copy;
     int          reply_fd;
     int          wait_fd;
 };
@@ -6244,7 +6244,7 @@ union generic_reply
 
 /* ### protocol_version begin ### */
 
-#define SERVER_PROTOCOL_VERSION 700
+#define SERVER_PROTOCOL_VERSION 701
 
 /* ### protocol_version end ### */
 
diff --git a/server/process.c b/server/process.c
index 17abd9800d2..491ab3b7bbd 100644
--- a/server/process.c
+++ b/server/process.c
@@ -1254,6 +1254,10 @@ DECL_HANDLER(init_process_done)
     }
     if (!(image_info = get_view_image_info( view, &base ))) return;
 
+    current->teb      = req->teb;
+    process->peb      = req->peb;
+    process->ldt_copy = req->ldt_copy;
+
     process->start_time = current_time;
     current->entry_point = image_info->entry_point;
 
diff --git a/server/protocol.def b/server/protocol.def
index eaffa886f21..6d8208b128b 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -898,6 +898,9 @@ typedef struct
 
 /* Signal the end of the process initialization */
 @REQ(init_process_done)
+    client_ptr_t teb;          /* TEB of new thread (in process address space) */
+    client_ptr_t peb;          /* PEB of new process (in process address space) */
+    client_ptr_t ldt_copy;     /* address of LDT copy (in process address space) */
 @REPLY
     client_ptr_t entry;        /* process entry point */
     int          suspend;      /* is process suspended? */
@@ -909,9 +912,6 @@ typedef struct
     int          unix_pid;     /* Unix pid of new process */
     int          unix_tid;     /* Unix tid of new thread */
     int          debug_level;  /* new debug level */
-    client_ptr_t teb;          /* TEB of new thread (in process address space) */
-    client_ptr_t peb;          /* PEB of new process (in process address space) */
-    client_ptr_t ldt_copy;     /* address of LDT copy (in process address space) */
     int          reply_fd;     /* fd for reply pipe */
     int          wait_fd;      /* fd for blocking calls pipe */
 @REPLY
diff --git a/server/request.h b/server/request.h
index ec5595bedf2..41810b89299 100644
--- a/server/request.h
+++ b/server/request.h
@@ -735,19 +735,19 @@ C_ASSERT( sizeof(struct new_thread_reply) == 16 );
 C_ASSERT( sizeof(struct get_startup_info_request) == 16 );
 C_ASSERT( FIELD_OFFSET(struct get_startup_info_reply, info_size) == 8 );
 C_ASSERT( sizeof(struct get_startup_info_reply) == 16 );
-C_ASSERT( sizeof(struct init_process_done_request) == 16 );
+C_ASSERT( FIELD_OFFSET(struct init_process_done_request, teb) == 16 );
+C_ASSERT( FIELD_OFFSET(struct init_process_done_request, peb) == 24 );
+C_ASSERT( FIELD_OFFSET(struct init_process_done_request, ldt_copy) == 32 );
+C_ASSERT( sizeof(struct init_process_done_request) == 40 );
 C_ASSERT( FIELD_OFFSET(struct init_process_done_reply, entry) == 8 );
 C_ASSERT( FIELD_OFFSET(struct init_process_done_reply, suspend) == 16 );
 C_ASSERT( sizeof(struct init_process_done_reply) == 24 );
 C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, unix_pid) == 12 );
 C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, unix_tid) == 16 );
 C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, debug_level) == 20 );
-C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, teb) == 24 );
-C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, peb) == 32 );
-C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, ldt_copy) == 40 );
-C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, reply_fd) == 48 );
-C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, wait_fd) == 52 );
-C_ASSERT( sizeof(struct init_first_thread_request) == 56 );
+C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, reply_fd) == 24 );
+C_ASSERT( FIELD_OFFSET(struct init_first_thread_request, wait_fd) == 28 );
+C_ASSERT( sizeof(struct init_first_thread_request) == 32 );
 C_ASSERT( FIELD_OFFSET(struct init_first_thread_reply, pid) == 8 );
 C_ASSERT( FIELD_OFFSET(struct init_first_thread_reply, tid) == 12 );
 C_ASSERT( FIELD_OFFSET(struct init_first_thread_reply, server_start) == 16 );
diff --git a/server/thread.c b/server/thread.c
index 2f11d7d51c2..eb8b0de84b1 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1407,17 +1407,8 @@ DECL_HANDLER(init_first_thread)
 
     if (!init_thread( current, req->reply_fd, req->wait_fd )) return;
 
-    if (!is_valid_address(req->teb) || !is_valid_address(req->peb))
-    {
-        set_error( STATUS_INVALID_PARAMETER );
-        return;
-    }
-
     current->unix_pid = process->unix_pid = req->unix_pid;
     current->unix_tid = req->unix_tid;
-    current->teb      = req->teb;
-    process->peb      = req->peb;
-    process->ldt_copy = req->ldt_copy;
 
     if (!process->parent_id)
         process->affinity = current->affinity = get_thread_affinity( current );
diff --git a/server/trace.c b/server/trace.c
index e40f0769a35..ad7236dd393 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1440,6 +1440,9 @@ static void dump_get_startup_info_reply( const struct get_startup_info_reply *re
 
 static void dump_init_process_done_request( const struct init_process_done_request *req )
 {
+    dump_uint64( " teb=", &req->teb );
+    dump_uint64( ", peb=", &req->peb );
+    dump_uint64( ", ldt_copy=", &req->ldt_copy );
 }
 
 static void dump_init_process_done_reply( const struct init_process_done_reply *req )
@@ -1453,9 +1456,6 @@ static void dump_init_first_thread_request( const struct init_first_thread_reque
     fprintf( stderr, " unix_pid=%d", req->unix_pid );
     fprintf( stderr, ", unix_tid=%d", req->unix_tid );
     fprintf( stderr, ", debug_level=%d", req->debug_level );
-    dump_uint64( ", teb=", &req->teb );
-    dump_uint64( ", peb=", &req->peb );
-    dump_uint64( ", ldt_copy=", &req->ldt_copy );
     fprintf( stderr, ", reply_fd=%d", req->reply_fd );
     fprintf( stderr, ", wait_fd=%d", req->wait_fd );
 }




More information about the wine-cvs mailing list