diff --git a/include/server.h b/include/server.h index 858131c5c4a..1e437041549 100644 --- a/include/server.h +++ b/include/server.h @@ -27,7 +27,7 @@ struct request_header { IN int req; /* request code */ - IN unsigned short fixed_size; /* size of the fixed part of the request */ + IN unsigned short var_offset; /* offset of the variable part of the request */ IN unsigned short var_size; /* size of the variable part of the request */ OUT unsigned int error; /* error result */ }; @@ -864,7 +864,6 @@ struct get_mapping_info_request OUT void* base; /* default base addr (for VPROT_IMAGE mapping) */ OUT handle_t shared_file; /* shared mapping file handle */ OUT int shared_size; /* shared mapping size */ - OUT int anonymous; /* anonymous mapping? */ }; @@ -1594,7 +1593,7 @@ union generic_request struct async_result_request async_result; }; -#define SERVER_PROTOCOL_VERSION 37 +#define SERVER_PROTOCOL_VERSION 38 /* ### make_requests end ### */ /* Everything above this line is generated automatically by tools/make_requests */ @@ -1622,6 +1621,7 @@ struct server_buffer_info extern unsigned int wine_server_call( enum request req ); extern unsigned int server_call_fd( enum request req, int fd_out ); extern void server_protocol_error( const char *err, ... ) WINE_NORETURN; +extern void server_protocol_perror( const char *err ) WINE_NORETURN; extern void *wine_server_alloc_req( size_t fixed_size, size_t var_size ); extern int wine_server_recv_fd( int handle, int cache ); extern const char *get_config_dir(void); diff --git a/memory/virtual.c b/memory/virtual.c index 536585b17ef..03392640e8c 100644 --- a/memory/virtual.c +++ b/memory/virtual.c @@ -1494,7 +1494,7 @@ LPVOID WINAPI MapViewOfFileEx( UINT ptr = (UINT)-1, size = 0; int flags = MAP_PRIVATE; int unix_handle = -1; - int prot, anonymous, res; + int prot, res; void *base; DWORD size_low, size_high, header_size, shared_size; HANDLE shared_file; @@ -1520,15 +1520,11 @@ LPVOID WINAPI MapViewOfFileEx( header_size = req->header_size; shared_file = req->shared_file; shared_size = req->shared_size; - anonymous = req->anonymous; } SERVER_END_REQ; if (res) goto error; - if (!anonymous) - { - if ((unix_handle = FILE_GetUnixHandle( handle, 0 )) == -1) goto error; - } + if ((unix_handle = FILE_GetUnixHandle( handle, 0 )) == -1) goto error; if (prot & VPROT_IMAGE) return map_image( handle, unix_handle, base, size_low, header_size, diff --git a/scheduler/client.c b/scheduler/client.c index ce9171faed8..1c022986d6e 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -102,9 +102,9 @@ void server_protocol_error( const char *err, ... ) /*********************************************************************** - * server_perror + * server_protocol_perror */ -static void server_perror( const char *err ) +void server_protocol_perror( const char *err ) { fprintf( stderr, "Client protocol error:%p: ", NtCurrentTeb()->tid ); perror( err ); @@ -141,7 +141,7 @@ void *wine_server_alloc_req( size_t fixed_size, size_t var_size ) server_protocol_error( "buffer overflow %d bytes\n", (char *)req + size - (char *)NtCurrentTeb()->buffer_info ); NtCurrentTeb()->buffer_info->cur_pos = pos + size; - req->header.fixed_size = fixed_size; + req->header.var_offset = pos + sizeof(*req); req->header.var_size = var_size; return req; } @@ -152,15 +152,15 @@ void *wine_server_alloc_req( size_t fixed_size, size_t var_size ) * * Send a request to the server. */ -static void send_request( enum request req, struct request_header *header ) +static void send_request( enum request req, union generic_request *request ) { - header->req = req; - NtCurrentTeb()->buffer_info->cur_req = (char *)header - (char *)NtCurrentTeb()->buffer; + request->header.req = req; + NtCurrentTeb()->buffer_info->cur_req = (char *)request - (char *)NtCurrentTeb()->buffer; /* write a single byte; the value is ignored anyway */ - if (write( NtCurrentTeb()->request_fd, header, 1 ) == -1) + if (write( NtCurrentTeb()->request_fd, request, 1 ) == -1) { if (errno == EPIPE) SYSDEPS_ExitThread(0); - server_perror( "sendmsg" ); + server_protocol_perror( "sendmsg" ); } } @@ -169,7 +169,7 @@ static void send_request( enum request req, struct request_header *header ) * * Send a request to the server, passing a file descriptor. */ -static void send_request_fd( enum request req, struct request_header *header, int fd ) +static void send_request_fd( enum request req, union generic_request *request, int fd ) { #ifndef HAVE_MSGHDR_ACCRIGHTS struct cmsg_fd cmsg; @@ -178,7 +178,7 @@ static void send_request_fd( enum request req, struct request_header *header, in struct iovec vec; /* write a single byte; the value is ignored anyway */ - vec.iov_base = (void *)header; + vec.iov_base = (void *)request; vec.iov_len = 1; msghdr.msg_name = NULL; @@ -199,12 +199,12 @@ static void send_request_fd( enum request req, struct request_header *header, in msghdr.msg_flags = 0; #endif /* HAVE_MSGHDR_ACCRIGHTS */ - header->req = req; + request->header.req = req; if (sendmsg( NtCurrentTeb()->socket, &msghdr, 0 ) == -1) { if (errno == EPIPE) SYSDEPS_ExitThread(0); - server_perror( "sendmsg" ); + server_protocol_perror( "sendmsg" ); } } @@ -224,7 +224,7 @@ static void wait_reply(void) if (!ret) break; if (errno == EINTR) continue; if (errno == EPIPE) break; - server_perror("read"); + server_protocol_perror("read"); } /* the server closed the connection; time to die... */ SYSDEPS_ExitThread(0); @@ -238,10 +238,10 @@ static void wait_reply(void) */ unsigned int wine_server_call( enum request req ) { - void *req_ptr = NtCurrentTeb()->buffer; + union generic_request *req_ptr = NtCurrentTeb()->buffer; send_request( req, req_ptr ); wait_reply(); - return ((struct request_header *)req_ptr)->error; + return req_ptr->header.error; } @@ -253,13 +253,12 @@ unsigned int wine_server_call( enum request req ) unsigned int server_call_fd( enum request req, int fd_out ) { unsigned int res; - void *req_ptr = NtCurrentTeb()->buffer; + union generic_request *req_ptr = NtCurrentTeb()->buffer; send_request_fd( req, req_ptr, fd_out ); wait_reply(); - if ((res = ((struct request_header *)req_ptr)->error)) - SetLastError( RtlNtStatusToDosError(res) ); + if ((res = req_ptr->header.error)) SetLastError( RtlNtStatusToDosError(res) ); return res; /* error code */ } @@ -356,7 +355,7 @@ int wine_server_recv_fd( int handle, int cache ) if (!ret) break; if (errno == EINTR) continue; if (errno == EPIPE) break; - server_perror("recvmsg"); + server_protocol_perror("recvmsg"); } /* the server closed the connection; time to die... */ SYSDEPS_ExitThread(0); @@ -613,10 +612,10 @@ int CLIENT_InitThread(void) fd = wine_server_recv_fd( 0, 0 ); if (fd == -1) server_protocol_error( "no fd received for thread buffer\n" ); - if ((size = lseek( fd, 0, SEEK_END )) == -1) server_perror( "lseek" ); + if ((size = lseek( fd, 0, SEEK_END )) == -1) server_protocol_perror( "lseek" ); teb->buffer = mmap( 0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 ); close( fd ); - if (teb->buffer == (void*)-1) server_perror( "mmap" ); + if (teb->buffer == (void*)-1) server_protocol_perror( "mmap" ); teb->buffer_info = (struct server_buffer_info *)((char *)teb->buffer + size) - 1; wait_reply(); diff --git a/server/mapping.c b/server/mapping.c index 8cd24b55298..2bfdd771643 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -338,7 +338,6 @@ DECL_HANDLER(get_mapping_info) req->base = mapping->base; req->shared_file = 0; req->shared_size = mapping->shared_size; - req->anonymous = !mapping->file; if (mapping->shared_file) req->shared_file = alloc_handle( current->process, mapping->shared_file, GENERIC_READ|GENERIC_WRITE, 0 ); diff --git a/server/request.h b/server/request.h index 6eeadea19d8..9b8547db08d 100644 --- a/server/request.h +++ b/server/request.h @@ -52,7 +52,7 @@ static inline void *get_req_ptr( struct thread *thread ) /* get the request vararg data */ inline static void *get_req_data( const void *req ) { - return ((union generic_request *)req + 1); + return (char *)current->buffer + ((struct request_header *)req)->var_offset; } /* get the request vararg size */ diff --git a/server/trace.c b/server/trace.c index c47b4bad8fc..f8bafa64887 100644 --- a/server/trace.c +++ b/server/trace.c @@ -985,8 +985,7 @@ static void dump_get_mapping_info_reply( const struct get_mapping_info_request * fprintf( stderr, " header_size=%d,", req->header_size ); fprintf( stderr, " base=%p,", req->base ); fprintf( stderr, " shared_file=%d,", req->shared_file ); - fprintf( stderr, " shared_size=%d,", req->shared_size ); - fprintf( stderr, " anonymous=%d", req->anonymous ); + fprintf( stderr, " shared_size=%d", req->shared_size ); } static void dump_create_device_request( const struct create_device_request *req )