winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
April 2020
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
1016 discussions
Start a n
N
ew thread
Zebediah Figura : wineusb.sys: Implement AddDevice().
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: 1a5e531838656ba0a0f2547590f941eee557c5da URL:
https://source.winehq.org/git/wine.git/?a=commit;h=1a5e531838656ba0a0f25475…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Apr 15 09:43:19 2020 -0500 wineusb.sys: Implement AddDevice(). Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wineusb.sys/wineusb.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c index b26f1036d8..6af8a9aaa5 100644 --- a/dlls/wineusb.sys/wineusb.c +++ b/dlls/wineusb.sys/wineusb.c @@ -38,6 +38,27 @@ WINE_DEFAULT_DEBUG_CHANNEL(wineusb); +static DEVICE_OBJECT *bus_fdo, *bus_pdo; + +static NTSTATUS WINAPI driver_add_device(DRIVER_OBJECT *driver, DEVICE_OBJECT *pdo) +{ + NTSTATUS ret; + + TRACE("driver %p, pdo %p.\n", driver, pdo); + + if ((ret = IoCreateDevice(driver, 0, NULL, FILE_DEVICE_BUS_EXTENDER, 0, FALSE, &bus_fdo))) + { + ERR("Failed to create FDO, status %#x.\n", ret); + return ret; + } + + IoAttachDeviceToDeviceStack(bus_fdo, pdo); + bus_pdo = pdo; + bus_fdo->Flags &= ~DO_DEVICE_INITIALIZING; + + return STATUS_SUCCESS; +} + static void WINAPI driver_unload(DRIVER_OBJECT *driver) { libusb_exit(NULL); @@ -55,6 +76,7 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, UNICODE_STRING *path) return STATUS_UNSUCCESSFUL; } + driver->DriverExtension->AddDevice = driver_add_device; driver->DriverUnload = driver_unload; return STATUS_SUCCESS;
1
0
0
0
Zebediah Figura : wineusb.sys: New stub driver.
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: 3c392094449b7c15bfc98a24fbda6d0970a6085d URL:
https://source.winehq.org/git/wine.git/?a=commit;h=3c392094449b7c15bfc98a24…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Apr 15 09:43:18 2020 -0500 wineusb.sys: New stub driver. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- configure | 101 ++++++++++++++++++++++++++++++++++++++ configure.ac | 14 ++++++ dlls/wineusb.sys/Makefile.in | 8 +++ dlls/wineusb.sys/wineusb.c | 61 +++++++++++++++++++++++ dlls/wineusb.sys/wineusb.sys.spec | 1 + loader/wine.inf.in | 2 + 6 files changed, 187 insertions(+) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=3c392094449b7c15bfc9…
1
0
0
0
Jacek Caban : server: Get rid of separate thread suspend_context.
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: 234fa118d4b8dd39c7992bace28e3d5ddb81453f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=234fa118d4b8dd39c7992bac…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Apr 15 14:56:08 2020 +0200 server: Get rid of separate thread suspend_context. It's always the same as context now. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- server/thread.c | 33 ++++++++++++++------------------- server/thread.h | 3 +-- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/server/thread.c b/server/thread.c index 863a7c18ba..9c22d83a9d 100644 --- a/server/thread.c +++ b/server/thread.c @@ -180,7 +180,6 @@ static inline void init_thread_structure( struct thread *thread ) thread->unix_pid = -1; /* not known yet */ thread->unix_tid = -1; /* not known yet */ thread->context = NULL; - thread->suspend_context = NULL; thread->teb = 0; thread->entry_point = 0; thread->debug_ctx = NULL; @@ -325,7 +324,7 @@ static void cleanup_thread( struct thread *thread ) if (thread->request_fd) release_object( thread->request_fd ); if (thread->reply_fd) release_object( thread->reply_fd ); if (thread->wait_fd) release_object( thread->wait_fd ); - free( thread->suspend_context ); + free( thread->context ); cleanup_clipboard_thread(thread); destroy_thread_windows( thread ); free_msg_queue( thread ); @@ -345,7 +344,6 @@ static void cleanup_thread( struct thread *thread ) thread->reply_fd = NULL; thread->wait_fd = NULL; thread->context = NULL; - thread->suspend_context = NULL; thread->desktop = 0; thread->desc = NULL; thread->desc_len = 0; @@ -775,14 +773,13 @@ static int send_thread_wakeup( struct thread *thread, client_ptr_t cookie, int s int ret; /* check if we're waking current suspend wait */ - if (thread->suspend_context && thread->suspend_cookie == cookie + if (thread->context && thread->suspend_cookie == cookie && signaled != STATUS_KERNEL_APC && signaled != STATUS_USER_APC) { - if (!thread->suspend_context->flags) + if (!thread->context->flags) { - if (current->context == current->suspend_context) thread->context = NULL; - free( thread->suspend_context ); - thread->suspend_context = NULL; + free( thread->context ); + thread->context = NULL; } else signaled = STATUS_KERNEL_APC; /* signal a fake APC so that client calls select to get a new context */ } @@ -1560,10 +1557,9 @@ DECL_HANDLER(select) return; } - if (!(current->suspend_context = mem_alloc( sizeof(*context) ))) return; - memcpy( current->suspend_context, context, sizeof(*context) ); - current->suspend_context->flags = 0; /* to keep track of what is modified */ - current->context = current->suspend_context; + if (!(current->context = mem_alloc( sizeof(*context) ))) return; + memcpy( current->context, context, sizeof(*context) ); + current->context->flags = 0; /* to keep track of what is modified */ current->suspend_cookie = req->cookie; } @@ -1635,15 +1631,14 @@ DECL_HANDLER(select) } release_object( apc ); } - else if(get_error() != STATUS_PENDING && get_reply_max_size() == sizeof(context_t) - && current->suspend_context && current->suspend_cookie == req->cookie) + else if (get_error() != STATUS_PENDING && get_reply_max_size() == sizeof(context_t) && + current->context && current->suspend_cookie == req->cookie) { - if (current->suspend_context->flags) - set_reply_data_ptr( current->suspend_context, sizeof(context_t) ); + if (current->context->flags) + set_reply_data_ptr( current->context, sizeof(context_t) ); else - free( current->suspend_context ); - if (current->context == current->suspend_context) current->context = NULL; - current->suspend_context = NULL; + free( current->context ); + current->context = NULL; } } diff --git a/server/thread.h b/server/thread.h index 4b9304fe13..b86d8d3dbe 100644 --- a/server/thread.h +++ b/server/thread.h @@ -75,8 +75,7 @@ struct thread int exit_code; /* thread exit code */ int unix_pid; /* Unix pid of client */ int unix_tid; /* Unix tid of client */ - context_t *context; /* current context if in an exception handler */ - context_t *suspend_context; /* current context if suspended */ + context_t *context; /* current context */ client_ptr_t suspend_cookie;/* wait cookie of suspending select */ client_ptr_t teb; /* TEB address (in client address space) */ client_ptr_t entry_point; /* entry point (in client address space) */
1
0
0
0
Jacek Caban : ntdll: Use server_select to pass context to server in send_debug_event.
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: 7f9eb22af8c3c8f9a0d8e07b0e6d8ee89feacd9e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=7f9eb22af8c3c8f9a0d8e07b…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Apr 15 14:55:56 2020 +0200 ntdll: Use server_select to pass context to server in send_debug_event. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/exception.c | 10 +++------- include/wine/server_protocol.h | 4 +--- server/debugger.c | 26 +------------------------- server/protocol.def | 3 --- server/request.h | 1 - server/thread.c | 6 ------ server/thread.h | 1 - server/trace.c | 8 +------- 8 files changed, 6 insertions(+), 53 deletions(-) diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index a9ac24e44d..87341654ba 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -131,7 +131,7 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con DWORD i; obj_handle_t handle = 0; client_ptr_t params[EXCEPTION_MAXIMUM_PARAMETERS]; - context_t server_context; + CONTEXT exception_context = *context; select_op_t select_op; sigset_t old_set; @@ -142,8 +142,6 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con for (i = 0; i < min( rec->NumberParameters, EXCEPTION_MAXIMUM_PARAMETERS ); i++) params[i] = rec->ExceptionInformation[i]; - context_to_server( &server_context, context ); - SERVER_START_REQ( queue_exception_event ) { req->first = first_chance; @@ -153,7 +151,6 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con req->address = wine_server_client_ptr( rec->ExceptionAddress ); req->len = i * sizeof(params[0]); wine_server_add_data( req, params, req->len ); - wine_server_add_data( req, &server_context, sizeof(server_context) ); if (!(ret = wine_server_call( req ))) handle = reply->handle; } SERVER_END_REQ; @@ -162,16 +159,15 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con { select_op.wait.op = SELECT_WAIT; select_op.wait.handles[0] = handle; - server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE, TIMEOUT_INFINITE, NULL, NULL ); + server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE, TIMEOUT_INFINITE, &exception_context, NULL ); SERVER_START_REQ( get_exception_status ) { req->handle = handle; - wine_server_set_reply( req, &server_context, sizeof(server_context) ); ret = wine_server_call( req ); } SERVER_END_REQ; - if (ret >= 0) context_from_server( context, &server_context ); + if (ret >= 0) *context = exception_context; } pthread_sigmask( SIG_SETMASK, &old_set, NULL ); diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index ba43aa07ed..9cdb9c765f 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -2522,7 +2522,6 @@ struct queue_exception_event_request client_ptr_t address; data_size_t len; /* VARARG(params,uints64,len); */ - /* VARARG(context,context); */ char __pad_44[4]; }; struct queue_exception_event_reply @@ -2542,7 +2541,6 @@ struct get_exception_status_request struct get_exception_status_reply { struct reply_header __header; - /* VARARG(context,context); */ }; @@ -6686,7 +6684,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 600 +#define SERVER_PROTOCOL_VERSION 601 /* ### protocol_version end ### */ diff --git a/server/debugger.c b/server/debugger.c index 5ff63b92b9..401ce36a47 100644 --- a/server/debugger.c +++ b/server/debugger.c @@ -50,7 +50,6 @@ struct debug_event enum debug_event_state state; /* event state */ int status; /* continuation status */ debug_event_t data; /* event data */ - context_t context; /* register context */ }; /* debug context */ @@ -347,11 +346,6 @@ static void debug_event_destroy( struct object *obj ) break; } } - if (event->sender->context == &event->context) - { - event->sender->context = NULL; - stop_thread_if_suspended( event->sender ); - } release_object( event->sender ); release_object( event->debugger ); } @@ -746,13 +740,6 @@ DECL_HANDLER(queue_exception_event) if ((event = alloc_debug_event( thread, EXCEPTION_DEBUG_EVENT, &data ))) { - const context_t *context = (const context_t *)((const char *)get_req_data() + req->len); - data_size_t size = get_req_data_size() - req->len; - - memset( &event->context, 0, sizeof(event->context) ); - memcpy( &event->context, context, min( sizeof(event->context), size ) ); - thread->context = &event->context; - if ((reply->handle = alloc_handle( thread->process, event, SYNCHRONIZE, 0 ))) { link_event( event ); @@ -772,18 +759,7 @@ DECL_HANDLER(get_exception_status) 0, &debug_event_ops ))) { close_handle( current->process, req->handle ); - if (event->state == EVENT_CONTINUED) - { - if (current->context == &event->context) - { - data_size_t size = min( sizeof(context_t), get_reply_max_size() ); - set_reply_data( &event->context, size ); - current->context = NULL; - stop_thread_if_suspended( current ); - } - set_error( event->status ); - } - else set_error( STATUS_PENDING ); + set_error( event->state == EVENT_CONTINUED ? event->status : STATUS_PENDING ); release_object( event ); } } diff --git a/server/protocol.def b/server/protocol.def index 7b92ffd374..1413021a39 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1934,7 +1934,6 @@ enum char_info_mode client_ptr_t address; /* exception address */ data_size_t len; /* size of parameters */ VARARG(params,uints64,len);/* exception parameters */ - VARARG(context,context); /* thread context */ @REPLY obj_handle_t handle; /* handle to the queued event */ @END @@ -1943,8 +1942,6 @@ enum char_info_mode /* Retrieve the status of an exception event */ @REQ(get_exception_status) obj_handle_t handle; /* handle to the queued event */ -@REPLY - VARARG(context,context); /* modified thread context */ @END diff --git a/server/request.h b/server/request.h index dff5edc893..0d4c083460 100644 --- a/server/request.h +++ b/server/request.h @@ -1377,7 +1377,6 @@ C_ASSERT( FIELD_OFFSET(struct queue_exception_event_reply, handle) == 8 ); C_ASSERT( sizeof(struct queue_exception_event_reply) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_exception_status_request, handle) == 12 ); C_ASSERT( sizeof(struct get_exception_status_request) == 16 ); -C_ASSERT( sizeof(struct get_exception_status_reply) == 8 ); C_ASSERT( FIELD_OFFSET(struct continue_debug_event_request, pid) == 12 ); C_ASSERT( FIELD_OFFSET(struct continue_debug_event_request, tid) == 16 ); C_ASSERT( FIELD_OFFSET(struct continue_debug_event_request, status) == 20 ); diff --git a/server/thread.c b/server/thread.c index 762ddb3580..863a7c18ba 100644 --- a/server/thread.c +++ b/server/thread.c @@ -588,12 +588,6 @@ void stop_thread( struct thread *thread ) if (is_process_init_done(thread->process)) send_thread_signal( thread, SIGUSR1 ); } -/* stop a thread if it's supposed to be suspended */ -void stop_thread_if_suspended( struct thread *thread ) -{ - if (thread->suspend + thread->process->suspend > 0) stop_thread( thread ); -} - /* suspend a thread */ int suspend_thread( struct thread *thread ) { diff --git a/server/thread.h b/server/thread.h index 9aabcaca99..4b9304fe13 100644 --- a/server/thread.h +++ b/server/thread.h @@ -115,7 +115,6 @@ extern enum select_op get_wait_queue_select_op( struct wait_queue_entry *entry ) extern client_ptr_t get_wait_queue_key( struct wait_queue_entry *entry ); extern void make_wait_abandoned( struct wait_queue_entry *entry ); extern void stop_thread( struct thread *thread ); -extern void stop_thread_if_suspended( struct thread *thread ); extern int wake_thread( struct thread *thread ); extern int wake_thread_queue_entry( struct wait_queue_entry *entry ); extern int add_queue( struct object *obj, struct wait_queue_entry *entry ); diff --git a/server/trace.c b/server/trace.c index e762cd56a0..dd63b166f3 100644 --- a/server/trace.c +++ b/server/trace.c @@ -2435,7 +2435,6 @@ static void dump_queue_exception_event_request( const struct queue_exception_eve dump_uint64( ", address=", &req->address ); fprintf( stderr, ", len=%u", req->len ); dump_varargs_uints64( ", params=", min(cur_size,req->len) ); - dump_varargs_context( ", context=", cur_size ); } static void dump_queue_exception_event_reply( const struct queue_exception_event_reply *req ) @@ -2448,11 +2447,6 @@ static void dump_get_exception_status_request( const struct get_exception_status fprintf( stderr, " handle=%04x", req->handle ); } -static void dump_get_exception_status_reply( const struct get_exception_status_reply *req ) -{ - dump_varargs_context( " context=", cur_size ); -} - static void dump_continue_debug_event_request( const struct continue_debug_event_request *req ) { fprintf( stderr, " pid=%04x", req->pid ); @@ -4999,7 +4993,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_next_thread_reply, (dump_func)dump_wait_debug_event_reply, (dump_func)dump_queue_exception_event_reply, - (dump_func)dump_get_exception_status_reply, + NULL, NULL, NULL, NULL,
1
0
0
0
Jacek Caban : ntdll: Block signals in send_debug_event.
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: 137fd7d3a0df17aa6c0dc3e40809eae341e12ba8 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=137fd7d3a0df17aa6c0dc3e4…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Apr 15 14:55:39 2020 +0200 ntdll: Block signals in send_debug_event. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/exception.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index 589ceab390..a9ac24e44d 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -133,9 +133,12 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con client_ptr_t params[EXCEPTION_MAXIMUM_PARAMETERS]; context_t server_context; select_op_t select_op; + sigset_t old_set; if (!NtCurrentTeb()->Peb->BeingDebugged) return 0; /* no debugger present */ + pthread_sigmask( SIG_BLOCK, &server_block_set, &old_set ); + for (i = 0; i < min( rec->NumberParameters, EXCEPTION_MAXIMUM_PARAMETERS ); i++) params[i] = rec->ExceptionInformation[i]; @@ -151,23 +154,27 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con req->len = i * sizeof(params[0]); wine_server_add_data( req, params, req->len ); wine_server_add_data( req, &server_context, sizeof(server_context) ); - if (!wine_server_call( req )) handle = reply->handle; + if (!(ret = wine_server_call( req ))) handle = reply->handle; } SERVER_END_REQ; - if (!handle) return 0; - - select_op.wait.op = SELECT_WAIT; - select_op.wait.handles[0] = handle; - server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE, TIMEOUT_INFINITE, NULL, NULL ); - SERVER_START_REQ( get_exception_status ) + if (handle) { - req->handle = handle; - wine_server_set_reply( req, &server_context, sizeof(server_context) ); - ret = wine_server_call( req ); + select_op.wait.op = SELECT_WAIT; + select_op.wait.handles[0] = handle; + server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE, TIMEOUT_INFINITE, NULL, NULL ); + + SERVER_START_REQ( get_exception_status ) + { + req->handle = handle; + wine_server_set_reply( req, &server_context, sizeof(server_context) ); + ret = wine_server_call( req ); + } + SERVER_END_REQ; + if (ret >= 0) context_from_server( context, &server_context ); } - SERVER_END_REQ; - if (ret >= 0) context_from_server( context, &server_context ); + + pthread_sigmask( SIG_SETMASK, &old_set, NULL ); return ret; }
1
0
0
0
Jacek Caban : server: Get rid of no longer needed get_suspend_context and set_suspend_context requests.
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: dbe7694c533ce8bc454248255a2abad66f221e01 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=dbe7694c533ce8bc45424825…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Apr 15 14:55:30 2020 +0200 server: Get rid of no longer needed get_suspend_context and set_suspend_context requests. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- include/wine/server_protocol.h | 34 +---------------------------- server/protocol.def | 13 ----------- server/request.h | 7 ------ server/thread.c | 49 ------------------------------------------ server/trace.c | 20 ----------------- 5 files changed, 1 insertion(+), 122 deletions(-) diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 77f62afb72..ba43aa07ed 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -5657,32 +5657,6 @@ struct update_rawinput_devices_reply -struct get_suspend_context_request -{ - struct request_header __header; - char __pad_12[4]; -}; -struct get_suspend_context_reply -{ - struct reply_header __header; - /* VARARG(context,context); */ -}; - - - -struct set_suspend_context_request -{ - struct request_header __header; - /* VARARG(context,context); */ - char __pad_12[4]; -}; -struct set_suspend_context_reply -{ - struct reply_header __header; -}; - - - struct create_job_request { struct request_header __header; @@ -6097,8 +6071,6 @@ enum request REQ_free_user_handle, REQ_set_cursor, REQ_update_rawinput_devices, - REQ_get_suspend_context, - REQ_set_suspend_context, REQ_create_job, REQ_open_job, REQ_assign_job, @@ -6401,8 +6373,6 @@ union generic_request struct free_user_handle_request free_user_handle_request; struct set_cursor_request set_cursor_request; struct update_rawinput_devices_request update_rawinput_devices_request; - struct get_suspend_context_request get_suspend_context_request; - struct set_suspend_context_request set_suspend_context_request; struct create_job_request create_job_request; struct open_job_request open_job_request; struct assign_job_request assign_job_request; @@ -6703,8 +6673,6 @@ union generic_reply struct free_user_handle_reply free_user_handle_reply; struct set_cursor_reply set_cursor_reply; struct update_rawinput_devices_reply update_rawinput_devices_reply; - struct get_suspend_context_reply get_suspend_context_reply; - struct set_suspend_context_reply set_suspend_context_reply; struct create_job_reply create_job_reply; struct open_job_reply open_job_reply; struct assign_job_reply assign_job_reply; @@ -6718,7 +6686,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 599 +#define SERVER_PROTOCOL_VERSION 600 /* ### protocol_version end ### */ diff --git a/server/protocol.def b/server/protocol.def index 318c3b0b83..7b92ffd374 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3889,19 +3889,6 @@ struct handle_info @END -/* Retrieve the suspended context of a thread */ -@REQ(get_suspend_context) -@REPLY - VARARG(context,context); /* thread context */ -@END - - -/* Store the suspend context of a thread */ -@REQ(set_suspend_context) - VARARG(context,context); /* thread context */ -@END - - /* Create a new job object */ @REQ(create_job) unsigned int access; /* wanted access rights */ diff --git a/server/request.h b/server/request.h index c1f4fc6b39..dff5edc893 100644 --- a/server/request.h +++ b/server/request.h @@ -405,8 +405,6 @@ DECL_HANDLER(alloc_user_handle); DECL_HANDLER(free_user_handle); DECL_HANDLER(set_cursor); DECL_HANDLER(update_rawinput_devices); -DECL_HANDLER(get_suspend_context); -DECL_HANDLER(set_suspend_context); DECL_HANDLER(create_job); DECL_HANDLER(open_job); DECL_HANDLER(assign_job); @@ -708,8 +706,6 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = (req_handler)req_free_user_handle, (req_handler)req_set_cursor, (req_handler)req_update_rawinput_devices, - (req_handler)req_get_suspend_context, - (req_handler)req_set_suspend_context, (req_handler)req_create_job, (req_handler)req_open_job, (req_handler)req_assign_job, @@ -2420,9 +2416,6 @@ C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, new_clip) == 32 ); C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, last_change) == 48 ); C_ASSERT( sizeof(struct set_cursor_reply) == 56 ); C_ASSERT( sizeof(struct update_rawinput_devices_request) == 16 ); -C_ASSERT( sizeof(struct get_suspend_context_request) == 16 ); -C_ASSERT( sizeof(struct get_suspend_context_reply) == 8 ); -C_ASSERT( sizeof(struct set_suspend_context_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct create_job_request, access) == 12 ); C_ASSERT( sizeof(struct create_job_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct create_job_reply, handle) == 8 ); diff --git a/server/thread.c b/server/thread.c index b93e91cefd..762ddb3580 100644 --- a/server/thread.c +++ b/server/thread.c @@ -1836,55 +1836,6 @@ DECL_HANDLER(set_thread_context) release_object( thread ); } -/* retrieve the suspended context of a thread */ -DECL_HANDLER(get_suspend_context) -{ - if (get_reply_max_size() < sizeof(context_t)) - { - set_error( STATUS_INVALID_PARAMETER ); - return; - } - - if (current->suspend_context) - { - if (current->suspend_context->flags) - set_reply_data_ptr( current->suspend_context, sizeof(context_t) ); - else - free( current->suspend_context ); - if (current->context == current->suspend_context) - { - current->context = NULL; - stop_thread_if_suspended( current ); - } - current->suspend_context = NULL; - } - else set_error( STATUS_INVALID_PARAMETER ); /* not suspended, shouldn't happen */ -} - -/* store the suspended context of a thread */ -DECL_HANDLER(set_suspend_context) -{ - const context_t *context = get_req_data(); - - if (get_req_data_size() < sizeof(context_t)) - { - set_error( STATUS_INVALID_PARAMETER ); - return; - } - - if (current->context || context->cpu != current->process->cpu) - { - /* nested suspend or exception, shouldn't happen */ - set_error( STATUS_INVALID_PARAMETER ); - } - else if ((current->suspend_context = mem_alloc( sizeof(context_t) ))) - { - memcpy( current->suspend_context, get_req_data(), sizeof(context_t) ); - current->suspend_context->flags = 0; /* to keep track of what is modified */ - current->context = current->suspend_context; - } -} - /* fetch a selector entry for a thread */ DECL_HANDLER(get_selector_entry) { diff --git a/server/trace.c b/server/trace.c index 9dd7ab73a1..e762cd56a0 100644 --- a/server/trace.c +++ b/server/trace.c @@ -4537,20 +4537,6 @@ static void dump_update_rawinput_devices_request( const struct update_rawinput_d dump_varargs_rawinput_devices( " devices=", cur_size ); } -static void dump_get_suspend_context_request( const struct get_suspend_context_request *req ) -{ -} - -static void dump_get_suspend_context_reply( const struct get_suspend_context_reply *req ) -{ - dump_varargs_context( " context=", cur_size ); -} - -static void dump_set_suspend_context_request( const struct set_suspend_context_request *req ) -{ - dump_varargs_context( " context=", cur_size ); -} - static void dump_create_job_request( const struct create_job_request *req ) { fprintf( stderr, " access=%08x", req->access ); @@ -4903,8 +4889,6 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_free_user_handle_request, (dump_func)dump_set_cursor_request, (dump_func)dump_update_rawinput_devices_request, - (dump_func)dump_get_suspend_context_request, - (dump_func)dump_set_suspend_context_request, (dump_func)dump_create_job_request, (dump_func)dump_open_job_request, (dump_func)dump_assign_job_request, @@ -5203,8 +5187,6 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { NULL, (dump_func)dump_set_cursor_reply, NULL, - (dump_func)dump_get_suspend_context_reply, - NULL, (dump_func)dump_create_job_reply, (dump_func)dump_open_job_reply, NULL, @@ -5503,8 +5485,6 @@ static const char * const req_names[REQ_NB_REQUESTS] = { "free_user_handle", "set_cursor", "update_rawinput_devices", - "get_suspend_context", - "set_suspend_context", "create_job", "open_job", "assign_job",
1
0
0
0
Jacek Caban : ntdll: Use select request instead of get_suspend_context to transfer context back to client.
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: 96cc6950f07350c1bd19ccea7877074b8fc0ebca URL:
https://source.winehq.org/git/wine.git/?a=commit;h=96cc6950f07350c1bd19ccea…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Apr 15 14:55:22 2020 +0200 ntdll: Use select request instead of get_suspend_context to transfer context back to client. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/exception.c | 15 --------------- dlls/ntdll/server.c | 7 +++++++ server/thread.c | 24 ++++++++++++++++++++++++ server/thread.h | 1 + 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index fe3af73d34..589ceab390 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -112,25 +112,10 @@ static ULONG remove_vectored_handler( struct list *handler_list, VECTORED_HANDLE void wait_suspend( CONTEXT *context ) { int saved_errno = errno; - context_t server_context; - DWORD flags = context->ContextFlags; /* wait with 0 timeout, will only return once the thread is no longer suspended */ server_select( NULL, 0, SELECT_INTERRUPTIBLE, 0, context, NULL ); - /* retrieve the new context */ - SERVER_START_REQ( get_suspend_context ) - { - wine_server_set_reply( req, &server_context, sizeof(server_context) ); - wine_server_call( req ); - if (wine_server_reply_size( reply )) - { - context_from_server( context, &server_context ); - context->ContextFlags |= flags; /* unchanged registers are still available */ - } - } - SERVER_END_REQ; - errno = saved_errno; } diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c index 9103941e1b..be080a9f73 100644 --- a/dlls/ntdll/server.c +++ b/dlls/ntdll/server.c @@ -639,9 +639,16 @@ unsigned int server_select( const select_op_t *select_op, data_size_t size, UINT wine_server_add_data( req, &server_context, sizeof(server_context) ); suspend_context = FALSE; /* server owns the context now */ } + if (context) wine_server_set_reply( req, &server_context, sizeof(server_context) ); ret = server_call_unlocked( req ); apc_handle = reply->apc_handle; call = reply->call; + if (wine_server_reply_size( reply )) + { + DWORD context_flags = context->ContextFlags; /* unchanged registers are still available */ + context_from_server( context, &server_context ); + context->ContextFlags |= context_flags; + } } SERVER_END_REQ; diff --git a/server/thread.c b/server/thread.c index d75dc238d5..b93e91cefd 100644 --- a/server/thread.c +++ b/server/thread.c @@ -780,6 +780,19 @@ static int send_thread_wakeup( struct thread *thread, client_ptr_t cookie, int s struct wake_up_reply reply; int ret; + /* check if we're waking current suspend wait */ + if (thread->suspend_context && thread->suspend_cookie == cookie + && signaled != STATUS_KERNEL_APC && signaled != STATUS_USER_APC) + { + if (!thread->suspend_context->flags) + { + if (current->context == current->suspend_context) thread->context = NULL; + free( thread->suspend_context ); + thread->suspend_context = NULL; + } + else signaled = STATUS_KERNEL_APC; /* signal a fake APC so that client calls select to get a new context */ + } + memset( &reply, 0, sizeof(reply) ); reply.cookie = cookie; reply.signaled = signaled; @@ -1557,6 +1570,7 @@ DECL_HANDLER(select) memcpy( current->suspend_context, context, sizeof(*context) ); current->suspend_context->flags = 0; /* to keep track of what is modified */ current->context = current->suspend_context; + current->suspend_cookie = req->cookie; } if (!req->cookie) @@ -1627,6 +1641,16 @@ DECL_HANDLER(select) } release_object( apc ); } + else if(get_error() != STATUS_PENDING && get_reply_max_size() == sizeof(context_t) + && current->suspend_context && current->suspend_cookie == req->cookie) + { + if (current->suspend_context->flags) + set_reply_data_ptr( current->suspend_context, sizeof(context_t) ); + else + free( current->suspend_context ); + if (current->context == current->suspend_context) current->context = NULL; + current->suspend_context = NULL; + } } /* queue an APC for a thread or process */ diff --git a/server/thread.h b/server/thread.h index 66e35603d3..9aabcaca99 100644 --- a/server/thread.h +++ b/server/thread.h @@ -77,6 +77,7 @@ struct thread int unix_tid; /* Unix tid of client */ context_t *context; /* current context if in an exception handler */ context_t *suspend_context; /* current context if suspended */ + client_ptr_t suspend_cookie;/* wait cookie of suspending select */ client_ptr_t teb; /* TEB address (in client address space) */ client_ptr_t entry_point; /* entry point (in client address space) */ affinity_t affinity; /* affinity mask */
1
0
0
0
Jacek Caban : ntdll: Use select request to pass suspend context to server.
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: 5e7ccd182e7dbcf2ef531835c6a87ad672641056 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=5e7ccd182e7dbcf2ef531835…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Apr 15 14:55:14 2020 +0200 ntdll: Use select request to pass suspend context to server. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/exception.c | 14 ++------------ dlls/ntdll/ntdll_misc.h | 2 +- dlls/ntdll/server.c | 16 ++++++++++++++-- dlls/ntdll/sync.c | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index 7854ad97c6..fe3af73d34 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -115,18 +115,8 @@ void wait_suspend( CONTEXT *context ) context_t server_context; DWORD flags = context->ContextFlags; - context_to_server( &server_context, context ); - - /* store the context we got at suspend time */ - SERVER_START_REQ( set_suspend_context ) - { - wine_server_add_data( req, &server_context, sizeof(server_context) ); - wine_server_call( req ); - } - SERVER_END_REQ; - /* wait with 0 timeout, will only return once the thread is no longer suspended */ - server_select( NULL, 0, SELECT_INTERRUPTIBLE, 0, NULL ); + server_select( NULL, 0, SELECT_INTERRUPTIBLE, 0, context, NULL ); /* retrieve the new context */ SERVER_START_REQ( get_suspend_context ) @@ -183,7 +173,7 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con select_op.wait.op = SELECT_WAIT; select_op.wait.handles[0] = handle; - server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE, TIMEOUT_INFINITE, NULL ); + server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE, TIMEOUT_INFINITE, NULL, NULL ); SERVER_START_REQ( get_exception_status ) { diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index f18ab1f227..336d7c0463 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -117,7 +117,7 @@ extern unsigned int server_call_unlocked( void *req_ptr ) DECLSPEC_HIDDEN; extern void server_enter_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset ) DECLSPEC_HIDDEN; extern void server_leave_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset ) DECLSPEC_HIDDEN; extern unsigned int server_select( const select_op_t *select_op, data_size_t size, UINT flags, - timeout_t abs_timeout, user_apc_t *user_apc ) DECLSPEC_HIDDEN; + timeout_t abs_timeout, CONTEXT *context, user_apc_t *user_apc ) DECLSPEC_HIDDEN; extern unsigned int server_wait( const select_op_t *select_op, data_size_t size, UINT flags, const LARGE_INTEGER *timeout ) DECLSPEC_HIDDEN; extern unsigned int server_queue_process_apc( HANDLE process, const apc_call_t *call, apc_result_t *result ) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c index 7e178aa745..9103941e1b 100644 --- a/dlls/ntdll/server.c +++ b/dlls/ntdll/server.c @@ -602,16 +602,23 @@ static void invoke_system_apc( const apc_call_t *call, apc_result_t *result ) * server_select */ unsigned int server_select( const select_op_t *select_op, data_size_t size, UINT flags, - timeout_t abs_timeout, user_apc_t *user_apc ) + timeout_t abs_timeout, CONTEXT *context, user_apc_t *user_apc ) { unsigned int ret; int cookie; obj_handle_t apc_handle = 0; + context_t server_context; + BOOL suspend_context = FALSE; apc_call_t call; apc_result_t result; sigset_t old_set; memset( &result, 0, sizeof(result) ); + if (context) + { + suspend_context = TRUE; + context_to_server( &server_context, context ); + } do { @@ -627,6 +634,11 @@ unsigned int server_select( const select_op_t *select_op, data_size_t size, UINT req->size = size; wine_server_add_data( req, &result, sizeof(result) ); wine_server_add_data( req, select_op, size ); + if (suspend_context) + { + wine_server_add_data( req, &server_context, sizeof(server_context) ); + suspend_context = FALSE; /* server owns the context now */ + } ret = server_call_unlocked( req ); apc_handle = reply->apc_handle; call = reply->call; @@ -673,7 +685,7 @@ unsigned int server_wait( const select_op_t *select_op, data_size_t size, UINT f for (;;) { - ret = server_select( select_op, size, flags, abs_timeout, &apc ); + ret = server_select( select_op, size, flags, abs_timeout, NULL, &apc ); if (ret != STATUS_USER_APC) break; invoke_apc( &apc ); diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c index eaee7030de..be00ac75d0 100644 --- a/dlls/ntdll/sync.c +++ b/dlls/ntdll/sync.c @@ -2585,7 +2585,7 @@ NTSTATUS WINAPI RtlWaitOnAddress( const void *addr, const void *cmp, SIZE_T size if (!compare_addr( addr, cmp, size )) ret = STATUS_SUCCESS; else - ret = server_select( &select_op, sizeof(select_op.keyed_event), SELECT_INTERRUPTIBLE, abs_timeout, &apc ); + ret = server_select( &select_op, sizeof(select_op.keyed_event), SELECT_INTERRUPTIBLE, abs_timeout, NULL, &apc ); RtlLeaveCriticalSection( &addr_section ); if (ret != STATUS_USER_APC) break;
1
0
0
0
Jacek Caban : server: Allow passing suspend context in select request.
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: e70b684dedaa1a7c9b5fc884f7083cbf7228600f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=e70b684dedaa1a7c9b5fc884…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Apr 15 14:55:03 2020 +0200 server: Allow passing suspend context in select request. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/server.c | 1 + include/wine/server_protocol.h | 8 +++++--- server/protocol.def | 5 ++++- server/request.h | 3 ++- server/thread.c | 22 ++++++++++++++++++++-- server/trace.c | 5 ++++- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c index 9053ad2042..7e178aa745 100644 --- a/dlls/ntdll/server.c +++ b/dlls/ntdll/server.c @@ -624,6 +624,7 @@ unsigned int server_select( const select_op_t *select_op, data_size_t size, UINT req->cookie = wine_server_client_ptr( &cookie ); req->prev_apc = apc_handle; req->timeout = abs_timeout; + req->size = size; wine_server_add_data( req, &result, sizeof(result) ); wine_server_add_data( req, select_op, size ); ret = server_call_unlocked( req ); diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 298e2dbfa4..77f62afb72 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -1257,16 +1257,18 @@ struct select_request int flags; client_ptr_t cookie; abstime_t timeout; + data_size_t size; obj_handle_t prev_apc; /* VARARG(result,apc_result); */ - /* VARARG(data,select_op); */ - char __pad_36[4]; + /* VARARG(data,select_op,size); */ + /* VARARG(context,context); */ }; struct select_reply { struct reply_header __header; apc_call_t call; obj_handle_t apc_handle; + /* VARARG(context,context); */ char __pad_52[4]; }; #define SELECT_ALERTABLE 1 @@ -6716,7 +6718,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 598 +#define SERVER_PROTOCOL_VERSION 599 /* ### protocol_version end ### */ diff --git a/server/protocol.def b/server/protocol.def index bfe817b654..318c3b0b83 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1106,12 +1106,15 @@ struct rawinput_device int flags; /* wait flags (see below) */ client_ptr_t cookie; /* magic cookie to return to client */ abstime_t timeout; /* timeout */ + data_size_t size; /* size of select_op */ obj_handle_t prev_apc; /* handle to previous APC */ VARARG(result,apc_result); /* result of previous APC */ - VARARG(data,select_op); /* operation-specific data */ + VARARG(data,select_op,size); /* operation-specific data */ + VARARG(context,context); /* suspend context */ @REPLY apc_call_t call; /* APC call arguments */ obj_handle_t apc_handle; /* handle to next APC */ + VARARG(context,context); /* suspend context */ @END #define SELECT_ALERTABLE 1 #define SELECT_INTERRUPTIBLE 2 diff --git a/server/request.h b/server/request.h index d8967211e7..c1f4fc6b39 100644 --- a/server/request.h +++ b/server/request.h @@ -938,7 +938,8 @@ C_ASSERT( sizeof(struct open_thread_reply) == 16 ); C_ASSERT( FIELD_OFFSET(struct select_request, flags) == 12 ); C_ASSERT( FIELD_OFFSET(struct select_request, cookie) == 16 ); C_ASSERT( FIELD_OFFSET(struct select_request, timeout) == 24 ); -C_ASSERT( FIELD_OFFSET(struct select_request, prev_apc) == 32 ); +C_ASSERT( FIELD_OFFSET(struct select_request, size) == 32 ); +C_ASSERT( FIELD_OFFSET(struct select_request, prev_apc) == 36 ); C_ASSERT( sizeof(struct select_request) == 40 ); C_ASSERT( FIELD_OFFSET(struct select_reply, call) == 8 ); C_ASSERT( FIELD_OFFSET(struct select_reply, apc_handle) == 48 ); diff --git a/server/thread.c b/server/thread.c index ba481223b7..d75dc238d5 100644 --- a/server/thread.c +++ b/server/thread.c @@ -1536,18 +1536,36 @@ DECL_HANDLER(select) struct thread_apc *apc; const apc_result_t *result = get_req_data(); - if (get_req_data_size() < sizeof(*result)) + if (get_req_data_size() < sizeof(*result) || + get_req_data_size() - sizeof(*result) < req->size || + req->size & 3) { set_error( STATUS_INVALID_PARAMETER ); return; } + + if (get_req_data_size() - sizeof(*result) - req->size == sizeof(context_t)) + { + const context_t *context = (const context_t *)((const char *)(result + 1) + req->size); + if (current->context || context->cpu != current->process->cpu) + { + set_error( STATUS_INVALID_PARAMETER ); + return; + } + + if (!(current->suspend_context = mem_alloc( sizeof(*context) ))) return; + memcpy( current->suspend_context, context, sizeof(*context) ); + current->suspend_context->flags = 0; /* to keep track of what is modified */ + current->context = current->suspend_context; + } + if (!req->cookie) { set_error( STATUS_INVALID_PARAMETER ); return; } - op_size = min( get_req_data_size() - sizeof(*result), sizeof(select_op) ); + op_size = min( req->size, sizeof(select_op) ); memset( &select_op, 0, sizeof(select_op) ); memcpy( &select_op, result + 1, op_size ); diff --git a/server/trace.c b/server/trace.c index 095a45f0dd..9dd7ab73a1 100644 --- a/server/trace.c +++ b/server/trace.c @@ -1588,15 +1588,18 @@ static void dump_select_request( const struct select_request *req ) fprintf( stderr, " flags=%d", req->flags ); dump_uint64( ", cookie=", &req->cookie ); dump_abstime( ", timeout=", &req->timeout ); + fprintf( stderr, ", size=%u", req->size ); fprintf( stderr, ", prev_apc=%04x", req->prev_apc ); dump_varargs_apc_result( ", result=", cur_size ); - dump_varargs_select_op( ", data=", cur_size ); + dump_varargs_select_op( ", data=", min(cur_size,req->size) ); + dump_varargs_context( ", context=", cur_size ); } static void dump_select_reply( const struct select_reply *req ) { dump_apc_call( " call=", &req->call ); fprintf( stderr, ", apc_handle=%04x", req->apc_handle ); + dump_varargs_context( ", context=", cur_size ); } static void dump_create_event_request( const struct create_event_request *req )
1
0
0
0
Henri Verbeet : wined3d: Do not request coherent memory in wined3d_buffer_vk_create_buffer_object().
by Alexandre Julliard
16 Apr '20
16 Apr '20
Module: wine Branch: master Commit: 85f9f51df88661a513eaa474cd4941a62ef991db URL:
https://source.winehq.org/git/wine.git/?a=commit;h=85f9f51df88661a513eaa474…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Thu Apr 16 21:17:11 2020 +0430 wined3d: Do not request coherent memory in wined3d_buffer_vk_create_buffer_object(). We may get coherent memory anyway, but we don't require it. Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/buffer.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index 47aca9218d..2e2ae23921 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -1589,9 +1589,8 @@ static BOOL wined3d_buffer_vk_create_buffer_object(struct wined3d_buffer_vk *buf usage |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT; if (bind_flags & (WINED3D_BIND_STREAM_OUTPUT | WINED3D_BIND_RENDER_TARGET | WINED3D_BIND_DEPTH_STENCIL)) FIXME("Ignoring some bind flags %#x.\n", bind_flags); - memory_type = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT - | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT - | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + memory_type = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT + | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; if (!(wined3d_context_vk_create_bo(context_vk, resource->size, usage, memory_type, &buffer_vk->bo))) { WARN("Failed to create Vulkan buffer.\n");
1
0
0
0
← Newer
1
...
53
54
55
56
57
58
59
...
102
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Results per page:
10
25
50
100
200