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 ); }