[PATCH v15 0/5] MR3103: server: Create and use a desktop shared mapping for GetCursorPos.
First part of Proton shared memory series. The full branch can be seen at https://gitlab.winehq.org/rbernon/wine/-/commits/mr/shared-memories. -- v15: user32: Use the desktop shared data for GetCursorPos(). server: Add a sequence number to the shared data. server: Move the cursor position and last change time to the shared data. server: Use the helper to update the cursor last change time. server: Create a desktop shared mapping. https://gitlab.winehq.org/wine/wine/-/merge_requests/3103
From: Rémi Bernon <rbernon(a)codeweavers.com> Based on a patch by Huw Davies <huw(a)codeweavers.com>. --- server/directory.c | 17 +++++++++++++++++ server/file.h | 6 ++++++ server/mapping.c | 29 +++++++++++++++++++++++++++++ server/protocol.def | 6 ++++++ server/user.h | 2 ++ server/winstation.c | 23 +++++++++++++++++++++++ 6 files changed, 83 insertions(+) diff --git a/server/directory.c b/server/directory.c index 23d7eb0a2b7..5c8671d6146 100644 --- a/server/directory.c +++ b/server/directory.c @@ -37,6 +37,7 @@ #include "process.h" #include "file.h" #include "unicode.h" +#include "user.h" #define HASH_SIZE 7 /* default hash size */ @@ -277,6 +278,22 @@ struct object *get_directory_obj( struct process *process, obj_handle_t handle ) return get_handle_obj( process, handle, 0, &directory_ops ); } +struct object *create_desktop_map_directory( struct winstation *winstation ) +{ + static const WCHAR dir_desktop_mapsW[] = {'_','_','w','i','n','e','_','d','e','s','k','t','o','p','_','m','a','p','p','i','n','g','s'}; + static const struct unicode_str dir_desktop_maps_str = {dir_desktop_mapsW, sizeof(dir_desktop_mapsW)}; + struct object *root; + struct directory *mapping_root, *ret; + const struct unicode_str winsta_name = {winstation->obj.name->name, winstation->obj.name->len}; + + root = winstation->obj.name->parent; + mapping_root = create_directory( root, &dir_desktop_maps_str, OBJ_OPENIF, HASH_SIZE, NULL ); + ret = create_directory( &mapping_root->obj, &winsta_name, OBJ_OPENIF, HASH_SIZE, NULL ); + release_object( &mapping_root->obj ); + + return &ret->obj; +} + /* Global initialization */ static void create_session( unsigned int id ) diff --git a/server/file.h b/server/file.h index 7f2d1637863..6d97faf3e5a 100644 --- a/server/file.h +++ b/server/file.h @@ -158,6 +158,10 @@ extern struct timeout_user *add_timeout_user( timeout_t when, timeout_callback f extern void remove_timeout_user( struct timeout_user *user ); extern const char *get_timeout_str( timeout_t timeout ); +/* directory functions */ + +extern struct object *create_desktop_map_directory( struct winstation *winstation ); + /* file functions */ extern struct file *get_file_obj( struct process *process, obj_handle_t handle, @@ -186,6 +190,8 @@ extern void free_mapped_views( struct process *process ); extern int get_page_size(void); extern struct mapping *create_fd_mapping( struct object *root, const struct unicode_str *name, struct fd *fd, unsigned int attr, const struct security_descriptor *sd ); +extern struct object *create_shared_mapping( struct object *root, const struct unicode_str *name, mem_size_t size, + unsigned int attr, const struct security_descriptor *sd, void **ptr ); extern struct object *create_user_data_mapping( struct object *root, const struct unicode_str *name, unsigned int attr, const struct security_descriptor *sd ); diff --git a/server/mapping.c b/server/mapping.c index 6b0de1b8b94..f94d9b5b8c0 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -29,6 +29,7 @@ #include <sys/stat.h> #include <sys/mman.h> #include <unistd.h> +#include <errno.h> #include "ntstatus.h" #define WIN32_NO_STATUS @@ -161,6 +162,7 @@ struct mapping pe_image_info_t image; /* image info (for PE image mapping) */ struct ranges *committed; /* list of committed ranges in this mapping */ struct shared_map *shared; /* temp file for shared PE mapping */ + void *shared_ptr; /* mmaped pointer for shared mappings */ }; static void mapping_dump( struct object *obj, int verbose ); @@ -980,6 +982,7 @@ static struct mapping *create_mapping( struct object *root, const struct unicode mapping->fd = NULL; mapping->shared = NULL; mapping->committed = NULL; + mapping->shared_ptr = MAP_FAILED; if (!(mapping->flags = get_mapping_flags( handle, flags ))) goto error; @@ -1180,6 +1183,7 @@ static void mapping_destroy( struct object *obj ) if (mapping->fd) release_object( mapping->fd ); if (mapping->committed) release_object( mapping->committed ); if (mapping->shared) release_object( mapping->shared ); + if (mapping->shared_ptr != MAP_FAILED) munmap( mapping->shared_ptr, mapping->size ); } static enum server_fd_type mapping_get_fd_type( struct fd *fd ) @@ -1256,6 +1260,31 @@ int get_page_size(void) return page_mask + 1; } +struct object *create_shared_mapping( struct object *root, const struct unicode_str *name, mem_size_t size, + unsigned int attr, const struct security_descriptor *sd, void **ptr ) +{ + static unsigned int access = FILE_READ_DATA | FILE_WRITE_DATA; + struct mapping *mapping; + + if (!(mapping = create_mapping( root, name, attr, size, SEC_COMMIT, 0, access, sd ))) return NULL; + + if (mapping->shared_ptr == MAP_FAILED) + { + int fd = get_unix_fd( mapping->fd ); + + mapping->shared_ptr = mmap( NULL, mapping->size, PROT_WRITE, MAP_SHARED, fd, 0 ); + if (mapping->shared_ptr == MAP_FAILED) + { + fprintf( stderr, "wine: Failed to map shared memory: %u %m\n", errno ); + release_object( &mapping->obj ); + return NULL; + } + } + + *ptr = mapping->shared_ptr; + return &mapping->obj; +} + struct object *create_user_data_mapping( struct object *root, const struct unicode_str *name, unsigned int attr, const struct security_descriptor *sd ) { diff --git a/server/protocol.def b/server/protocol.def index 8b51618ebe0..531dace749e 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -879,6 +879,12 @@ typedef struct lparam_t info; } cursor_pos_t; +struct desktop_shared_memory +{ + int placeholder; +}; +typedef volatile struct desktop_shared_memory desktop_shm_t; + /****************************************************************/ /* Request declarations */ diff --git a/server/user.h b/server/user.h index 8fa55e09b0f..e96dd2a00c2 100644 --- a/server/user.h +++ b/server/user.h @@ -76,6 +76,8 @@ struct desktop unsigned int users; /* processes and threads using this desktop */ struct global_cursor cursor; /* global cursor information */ unsigned char keystate[256]; /* asynchronous key state */ + struct object *shared_mapping; /* desktop shared memory mapping */ + desktop_shm_t *shared; /* desktop shared memory */ }; /* user handles functions */ diff --git a/server/winstation.c b/server/winstation.c index 5903497d61e..783e167113a 100644 --- a/server/winstation.c +++ b/server/winstation.c @@ -217,6 +217,22 @@ struct desktop *get_desktop_obj( struct process *process, obj_handle_t handle, u return (struct desktop *)get_handle_obj( process, handle, access, &desktop_ops ); } +static volatile void *init_desktop_mapping( struct desktop *desktop, const struct unicode_str *name ) +{ + struct object *dir; + + desktop->shared = NULL; + desktop->shared_mapping = NULL; + + if (!(dir = create_desktop_map_directory( desktop->winstation ))) return NULL; + if ((desktop->shared_mapping = create_shared_mapping( dir, name, sizeof(struct desktop_shared_memory), + OBJ_OPENIF, NULL, (void **)&desktop->shared ))) + memset( (void *)desktop->shared, 0, sizeof(*desktop->shared) ); + release_object( dir ); + + return desktop->shared; +} + /* create a desktop object */ static struct desktop *create_desktop( const struct unicode_str *name, unsigned int attr, unsigned int flags, struct winstation *winstation ) @@ -240,6 +256,11 @@ static struct desktop *create_desktop( const struct unicode_str *name, unsigned memset( desktop->keystate, 0, sizeof(desktop->keystate) ); list_add_tail( &winstation->desktops, &desktop->entry ); list_init( &desktop->hotkeys ); + if (!init_desktop_mapping( desktop, name )) + { + release_object( desktop ); + return NULL; + } } else { @@ -297,6 +318,8 @@ static void desktop_destroy( struct object *obj ) if (desktop->global_hooks) release_object( desktop->global_hooks ); if (desktop->close_timeout) remove_timeout_user( desktop->close_timeout ); list_remove( &desktop->entry ); + if (desktop->shared_mapping) release_object( desktop->shared_mapping ); + desktop->shared_mapping = NULL; release_object( desktop->winstation ); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3103
From: Rémi Bernon <rbernon(a)codeweavers.com> Based on a patch by Huw Davies <huw(a)codeweavers.com>. --- server/queue.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/queue.c b/server/queue.c index 6f38227aa84..7a7752d9051 100644 --- a/server/queue.c +++ b/server/queue.c @@ -2017,7 +2017,9 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons WM_MOUSEHWHEEL /* 0x1000 = MOUSEEVENTF_HWHEEL */ }; - desktop->cursor.last_change = get_tick_count(); + /* update last desktop cursor change time */ + update_desktop_cursor_pos( desktop, desktop->cursor.win, desktop->cursor.x, desktop->cursor.y ); + flags = input->mouse.flags; time = input->mouse.time; if (!time) time = desktop->cursor.last_change; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3103
From: Rémi Bernon <rbernon(a)codeweavers.com> Based on a patch by Huw Davies <huw(a)codeweavers.com>. --- server/protocol.def | 9 +++++- server/queue.c | 68 ++++++++++++++++++++++++--------------------- server/user.h | 3 -- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/server/protocol.def b/server/protocol.def index 531dace749e..7c39a1ba0b0 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -879,9 +879,16 @@ typedef struct lparam_t info; } cursor_pos_t; +struct shared_cursor +{ + int x; /* cursor position */ + int y; + unsigned int last_change; /* time of last position change */ +}; + struct desktop_shared_memory { - int placeholder; + struct shared_cursor cursor; /* global cursor information */ }; typedef volatile struct desktop_shared_memory desktop_shm_t; diff --git a/server/queue.c b/server/queue.c index 7a7752d9051..e67362b1fbd 100644 --- a/server/queue.c +++ b/server/queue.c @@ -424,8 +424,8 @@ static void queue_cursor_message( struct desktop *desktop, user_handle_t win, un msg->msg = message; msg->wparam = wparam; msg->lparam = lparam; - msg->x = desktop->cursor.x; - msg->y = desktop->cursor.y; + msg->x = desktop->shared->cursor.x; + msg->y = desktop->shared->cursor.y; if (!(msg->win = win) && (input = desktop->foreground_input)) msg->win = input->active; queue_hardware_message( desktop, msg, 1 ); } @@ -467,10 +467,10 @@ static int update_desktop_cursor_pos( struct desktop *desktop, user_handle_t win x = max( min( x, desktop->cursor.clip.right - 1 ), desktop->cursor.clip.left ); y = max( min( y, desktop->cursor.clip.bottom - 1 ), desktop->cursor.clip.top ); - updated = (desktop->cursor.x != x || desktop->cursor.y != y); - desktop->cursor.x = x; - desktop->cursor.y = y; - desktop->cursor.last_change = get_tick_count(); + updated = (desktop->shared->cursor.x != x || desktop->shared->cursor.y != y); + desktop->shared->cursor.x = x; + desktop->shared->cursor.y = y; + desktop->shared->cursor.last_change = get_tick_count(); if (!win || !is_window_visible( win ) || is_window_transparent( win )) win = shallow_window_from_point( desktop, x, y ); @@ -516,8 +516,8 @@ static void get_message_defaults( struct msg_queue *queue, int *x, int *y, unsig { struct desktop *desktop = queue->input->desktop; - *x = desktop->cursor.x; - *y = desktop->cursor.y; + *x = desktop->shared->cursor.x; + *y = desktop->shared->cursor.y; *time = get_tick_count(); } @@ -541,9 +541,9 @@ void set_clip_rectangle( struct desktop *desktop, const rectangle_t *rect, unsig else desktop->cursor.clip = top_rect; /* warp the mouse to be inside the clip rect */ - x = max( min( desktop->cursor.x, desktop->cursor.clip.right - 1 ), desktop->cursor.clip.left ); - y = max( min( desktop->cursor.y, desktop->cursor.clip.bottom - 1 ), desktop->cursor.clip.top ); - if (x != desktop->cursor.x || y != desktop->cursor.y) set_cursor_pos( desktop, x, y ); + x = max( min( desktop->shared->cursor.x, desktop->cursor.clip.right - 1 ), desktop->cursor.clip.left ); + y = max( min( desktop->shared->cursor.y, desktop->cursor.clip.bottom - 1 ), desktop->cursor.clip.top ); + if (x != desktop->shared->cursor.x || y != desktop->shared->cursor.y) set_cursor_pos( desktop, x, y ); /* request clip cursor rectangle reset to the desktop thread */ if (reset) post_desktop_message( desktop, WM_WINE_CLIPCURSOR, flags, FALSE ); @@ -1696,8 +1696,8 @@ static void queue_hardware_message( struct desktop *desktop, struct message *msg if (desktop->keystate[VK_XBUTTON2] & 0x80) msg->wparam |= MK_XBUTTON2; break; } - msg->x = desktop->cursor.x; - msg->y = desktop->cursor.y; + msg->x = desktop->shared->cursor.x; + msg->y = desktop->shared->cursor.y; if (msg->win && (thread = get_window_thread( msg->win ))) { @@ -2018,11 +2018,11 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons }; /* update last desktop cursor change time */ - update_desktop_cursor_pos( desktop, desktop->cursor.win, desktop->cursor.x, desktop->cursor.y ); + update_desktop_cursor_pos( desktop, desktop->cursor.win, desktop->shared->cursor.x, desktop->shared->cursor.y ); flags = input->mouse.flags; time = input->mouse.time; - if (!time) time = desktop->cursor.last_change; + if (!time) time = desktop->shared->cursor.last_change; if (flags & MOUSEEVENTF_MOVE) { @@ -2031,23 +2031,27 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons x = input->mouse.x; y = input->mouse.y; if (flags & ~(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE) && - x == desktop->cursor.x && y == desktop->cursor.y) + x == desktop->shared->cursor.x && y == desktop->shared->cursor.y) flags &= ~MOUSEEVENTF_MOVE; } else { - x = desktop->cursor.x + input->mouse.x; - y = desktop->cursor.y + input->mouse.y; + x = desktop->shared->cursor.x + input->mouse.x; + y = desktop->shared->cursor.y + input->mouse.y; } } else { - x = desktop->cursor.x; - y = desktop->cursor.y; + x = desktop->shared->cursor.x; + y = desktop->shared->cursor.y; } if ((foreground = get_foreground_thread( desktop, win ))) { + int raw_x, raw_y; + raw_x = x - desktop->shared->cursor.x; + raw_y = y - desktop->shared->cursor.y; + memset( &raw_msg, 0, sizeof(raw_msg) ); raw_msg.foreground = foreground; raw_msg.desktop = desktop; @@ -2055,7 +2059,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons raw_msg.time = time; raw_msg.message = WM_INPUT; raw_msg.flags = flags; - rawmouse_init( &raw_msg.rawinput, &raw_msg.data.mouse, x - desktop->cursor.x, y - desktop->cursor.y, + rawmouse_init( &raw_msg.rawinput, &raw_msg.data.mouse, raw_x, raw_y, raw_msg.flags, input->mouse.data, input->mouse.info ); enum_processes( queue_rawinput_message, &raw_msg ); @@ -2265,8 +2269,8 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ msg->msg = input->hw.msg; msg->wparam = 0; msg->lparam = input->hw.lparam; - msg->x = desktop->cursor.x; - msg->y = desktop->cursor.y; + msg->x = desktop->shared->cursor.x; + msg->y = desktop->shared->cursor.y; queue_hardware_message( desktop, msg, 1 ); } @@ -2787,8 +2791,8 @@ DECL_HANDLER(send_hardware_message) } } - reply->prev_x = desktop->cursor.x; - reply->prev_y = desktop->cursor.y; + reply->prev_x = desktop->shared->cursor.x; + reply->prev_y = desktop->shared->cursor.y; switch (req->input.type) { @@ -2806,8 +2810,8 @@ DECL_HANDLER(send_hardware_message) } if (thread) release_object( thread ); - reply->new_x = desktop->cursor.x; - reply->new_y = desktop->cursor.y; + reply->new_x = desktop->shared->cursor.x; + reply->new_y = desktop->shared->cursor.y; release_object( desktop ); } @@ -3499,8 +3503,8 @@ DECL_HANDLER(set_cursor) reply->prev_handle = input->cursor; reply->prev_count = input->cursor_count; - reply->prev_x = desktop->cursor.x; - reply->prev_y = desktop->cursor.y; + reply->prev_x = desktop->shared->cursor.x; + reply->prev_y = desktop->shared->cursor.y; if (req->flags & SET_CURSOR_HANDLE) { @@ -3523,10 +3527,10 @@ DECL_HANDLER(set_cursor) if (req->flags & (SET_CURSOR_HANDLE | SET_CURSOR_COUNT)) update_desktop_cursor_handle( desktop, input ); - reply->new_x = desktop->cursor.x; - reply->new_y = desktop->cursor.y; + reply->new_x = desktop->shared->cursor.x; + reply->new_y = desktop->shared->cursor.y; reply->new_clip = desktop->cursor.clip; - reply->last_change = desktop->cursor.last_change; + reply->last_change = desktop->shared->cursor.last_change; } /* Get the history of the 64 last cursor positions */ diff --git a/server/user.h b/server/user.h index e96dd2a00c2..18a99b53680 100644 --- a/server/user.h +++ b/server/user.h @@ -54,10 +54,7 @@ struct winstation struct global_cursor { - int x; /* cursor position */ - int y; rectangle_t clip; /* cursor clip rectangle */ - unsigned int last_change; /* time of last position change */ user_handle_t win; /* window that contains the cursor */ }; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3103
From: Rémi Bernon <rbernon(a)codeweavers.com> The client should check that the lower SEQUENCE_MASK_BITS are zero before reading the data and confirm that the number is unchanged when it's finished. Based on a patch by Huw Davies <huw(a)codeweavers.com>. --- server/protocol.def | 5 +++++ server/queue.c | 46 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/server/protocol.def b/server/protocol.def index 7c39a1ba0b0..244bdf7b4a7 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -888,10 +888,15 @@ struct shared_cursor struct desktop_shared_memory { + unsigned int seq; /* sequence number - server updating if (seq_no & SEQUENCE_MASK) != 0 */ struct shared_cursor cursor; /* global cursor information */ }; typedef volatile struct desktop_shared_memory desktop_shm_t; +/* Bits that must be clear for client to read */ +#define SEQUENCE_MASK_BITS 4 +#define SEQUENCE_MASK ((1UL << SEQUENCE_MASK_BITS) - 1) + /****************************************************************/ /* Request declarations */ diff --git a/server/queue.c b/server/queue.c index e67362b1fbd..ae9acadb396 100644 --- a/server/queue.c +++ b/server/queue.c @@ -233,6 +233,46 @@ static unsigned int last_input_time; static cursor_pos_t cursor_history[64]; static unsigned int cursor_history_latest; +#if defined(__i386__) || defined(__x86_64__) + +#define SHARED_WRITE_BEGIN( x ) \ + do { \ + volatile unsigned int __seq = *(x); \ + assert( (__seq & SEQUENCE_MASK) != SEQUENCE_MASK ); \ + *(x) = ++__seq; \ + } while(0) + +#define SHARED_WRITE_END( x ) \ + do { \ + volatile unsigned int __seq = *(x); \ + assert( (__seq & SEQUENCE_MASK) != 0 ); \ + if ((__seq & SEQUENCE_MASK) > 1) __seq--; \ + else __seq += SEQUENCE_MASK; \ + *(x) = __seq; \ + } while(0) + +#else + +#define SHARED_WRITE_BEGIN( x ) \ + do { \ + assert( (*(x) & SEQUENCE_MASK) != SEQUENCE_MASK ); \ + if ((__atomic_add_fetch( x, 1, __ATOMIC_RELAXED ) & SEQUENCE_MASK) == 1) \ + __atomic_thread_fence( __ATOMIC_RELEASE ); \ + } while(0) + +#define SHARED_WRITE_END( x ) \ + do { \ + assert( (*(x) & SEQUENCE_MASK) != 0 ); \ + if ((*(x) & SEQUENCE_MASK) > 1) \ + __atomic_sub_fetch( x, 1, __ATOMIC_RELAXED ); \ + else { \ + __atomic_thread_fence( __ATOMIC_RELEASE ); \ + __atomic_add_fetch( x, SEQUENCE_MASK, __ATOMIC_RELAXED ); \ + } \ + } while(0) + +#endif + static void queue_hardware_message( struct desktop *desktop, struct message *msg, int always_queue ); static void free_message( struct message *msg ); @@ -464,13 +504,17 @@ static int update_desktop_cursor_window( struct desktop *desktop, user_handle_t static int update_desktop_cursor_pos( struct desktop *desktop, user_handle_t win, int x, int y ) { int updated; + unsigned int time = get_tick_count(); x = max( min( x, desktop->cursor.clip.right - 1 ), desktop->cursor.clip.left ); y = max( min( y, desktop->cursor.clip.bottom - 1 ), desktop->cursor.clip.top ); updated = (desktop->shared->cursor.x != x || desktop->shared->cursor.y != y); + + SHARED_WRITE_BEGIN( &desktop->shared->seq ); desktop->shared->cursor.x = x; desktop->shared->cursor.y = y; - desktop->shared->cursor.last_change = get_tick_count(); + desktop->shared->cursor.last_change = time; + SHARED_WRITE_END( &desktop->shared->seq ); if (!win || !is_window_visible( win ) || is_window_transparent( win )) win = shallow_window_from_point( desktop, x, y ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3103
From: Rémi Bernon <rbernon(a)codeweavers.com> Based on a patch by Huw Davies <huw(a)codeweavers.com>. --- dlls/win32u/input.c | 20 +++++------ dlls/win32u/ntuser_private.h | 24 +++++++++++++ dlls/win32u/sysparams.c | 6 ++++ dlls/win32u/winstation.c | 65 ++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 11 deletions(-) diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index ef8d564c264..9d2d95f3f28 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -749,25 +749,23 @@ BOOL WINAPI NtUserSetCursorPos( INT x, INT y ) */ BOOL get_cursor_pos( POINT *pt ) { - BOOL ret; + desktop_shm_t *shared = get_desktop_shared_memory(); DWORD last_change; + BOOL ret = TRUE; UINT dpi; - if (!pt) return FALSE; + if (!pt || !shared) return FALSE; - SERVER_START_REQ( set_cursor ) + SHARED_READ_BEGIN( &shared->seq ) { - if ((ret = !wine_server_call( req ))) - { - pt->x = reply->new_x; - pt->y = reply->new_y; - last_change = reply->last_change; - } + pt->x = shared->cursor.x; + pt->y = shared->cursor.y; + last_change = shared->cursor.last_change; } - SERVER_END_REQ; + SHARED_READ_END( &shared->seq ); /* query new position from graphics driver if we haven't updated recently */ - if (ret && NtGetTickCount() - last_change > 100) ret = user_driver->pGetCursorPos( pt ); + if (NtGetTickCount() - last_change > 100) ret = user_driver->pGetCursorPos( pt ); if (ret && (dpi = get_thread_dpi())) { HMONITOR monitor = monitor_from_point( *pt, MONITOR_DEFAULTTOPRIMARY, 0 ); diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h index 3b6cab5bdc9..53c30bc9133 100644 --- a/dlls/win32u/ntuser_private.h +++ b/dlls/win32u/ntuser_private.h @@ -127,6 +127,7 @@ struct user_thread_info UINT spy_indent; /* Current spy indent */ BOOL clipping_cursor; /* thread is currently clipping */ DWORD clipping_reset; /* time when clipping was last reset */ + desktop_shm_t *desktop_shm; /* Ptr to server's desktop shared memory */ }; C_ASSERT( sizeof(struct user_thread_info) <= sizeof(((TEB *)0)->Win32ClientInfo) ); @@ -251,6 +252,9 @@ void release_user_handle_ptr( void *ptr ); void *next_process_user_handle_ptr( HANDLE *handle, unsigned int type ); UINT win_set_flags( HWND hwnd, UINT set_mask, UINT clear_mask ); +/* winstation.c */ +extern desktop_shm_t *get_desktop_shared_memory(void) DECLSPEC_HIDDEN; + static inline UINT win_get_flags( HWND hwnd ) { return win_set_flags( hwnd, 0, 0 ); @@ -260,4 +264,24 @@ WND *get_win_ptr( HWND hwnd ); BOOL is_child( HWND parent, HWND child ); BOOL is_window( HWND hwnd ); +#if defined(__i386__) || defined(__x86_64__) +#define __SHARED_READ_SEQ( x ) (*(x)) +#define __SHARED_READ_FENCE do {} while(0) +#else +#define __SHARED_READ_SEQ( x ) __atomic_load_n( x, __ATOMIC_RELAXED ) +#define __SHARED_READ_FENCE __atomic_thread_fence( __ATOMIC_ACQUIRE ) +#endif + +#define SHARED_READ_BEGIN( x ) \ + do { \ + unsigned int __seq; \ + do { \ + while ((__seq = __SHARED_READ_SEQ( x )) & SEQUENCE_MASK) NtYieldExecution(); \ + __SHARED_READ_FENCE; + +#define SHARED_READ_END( x ) \ + __SHARED_READ_FENCE; \ + } while (__SHARED_READ_SEQ( x ) != __seq); \ + } while(0) + #endif /* __WINE_NTUSER_PRIVATE_H */ diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 673082056b1..157e84ecf27 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -6205,6 +6205,12 @@ static void thread_detach(void) cleanup_imm_thread(); NtClose( thread_info->server_queue ); + if (thread_info->desktop_shm) + { + NtUnmapViewOfSection( GetCurrentProcess(), (void *)thread_info->desktop_shm ); + thread_info->desktop_shm = NULL; + } + exiting_thread_id = 0; } diff --git a/dlls/win32u/winstation.c b/dlls/win32u/winstation.c index b187b246941..9e48ef08900 100644 --- a/dlls/win32u/winstation.c +++ b/dlls/win32u/winstation.c @@ -265,6 +265,11 @@ BOOL WINAPI NtUserSetThreadDesktop( HDESK handle ) thread_info->client_info.msg_window = 0; if (key_state_info) key_state_info->time = 0; if (was_virtual_desktop != is_virtual_desktop()) update_display_cache( TRUE ); + if (thread_info->desktop_shm) + { + NtUnmapViewOfSection( GetCurrentProcess(), (void *)thread_info->desktop_shm ); + thread_info->desktop_shm = NULL; + } } return ret; } @@ -607,6 +612,66 @@ static const WCHAR *get_default_desktop( void *buf, size_t buf_size ) return defaultW; } +static volatile void *map_shared_memory_section( const WCHAR *name, SIZE_T size, HANDLE root ) +{ + OBJECT_ATTRIBUTES attr; + UNICODE_STRING section_str; + HANDLE handle; + UINT status; + void *ptr; + + RtlInitUnicodeString( §ion_str, name ); + InitializeObjectAttributes( &attr, §ion_str, 0, root, NULL ); + if (!(status = NtOpenSection( &handle, SECTION_ALL_ACCESS, &attr ))) + { + ptr = NULL; + status = NtMapViewOfSection( handle, GetCurrentProcess(), &ptr, 0, 0, NULL, + &size, ViewUnmap, 0, PAGE_READONLY ); + NtClose( handle ); + } + + if (status) + { + WARN( "Failed to map view of section %s, status %#x\n", debugstr_w(name), status ); + return NULL; + } + + return ptr; +} + +desktop_shm_t *get_desktop_shared_memory(void) +{ + static const WCHAR dir_desktop_maps[] = + { + '_','_','w','i','n','e','_','d','e','s','k','t','o','p','_','m','a','p','p','i','n','g','s','\\',0 + }; + struct user_thread_info *thread_info = get_user_thread_info(); + HANDLE root, handles[2]; + WCHAR buf[MAX_PATH], *ptr; + DWORD i, needed; + + if (thread_info->desktop_shm) return thread_info->desktop_shm; + + handles[0] = NtUserGetProcessWindowStation(); + handles[1] = NtUserGetThreadDesktop( GetCurrentThreadId() ); + + memcpy( buf, dir_desktop_maps, wcslen(dir_desktop_maps) * sizeof(WCHAR) ); + ptr = buf + wcslen(dir_desktop_maps); + + for (i = 0; i < 2; i++) + { + NtUserGetObjectInformation( handles[i], UOI_NAME, (void *)ptr, sizeof(buf) - (ptr - buf) * sizeof(WCHAR), &needed ); + ptr += needed / sizeof(WCHAR); + if (i == 0) *(ptr - 1) = '\\'; + } + + root = get_winstations_dir_handle(); + thread_info->desktop_shm = map_shared_memory_section( buf, sizeof(*thread_info->desktop_shm), root ); + NtClose( root ); + + return thread_info->desktop_shm; +} + /*********************************************************************** * winstation_init * -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3103
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=142999 Your paranoid android. === debian11 (build log) === ../wine/dlls/win32u/ntuser_private.h:256:55: error: expected declaration specifiers before ���DECLSPEC_HIDDEN��� ../wine/dlls/win32u/ntuser_private.h:259:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/include/wine/debug.h:507:40: error: storage class specified for parameter ���__wine_dbch_class��� ../wine/include/wine/debug.h:507:19: error: parameter ���__wine_dbch_class��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/include/wine/debug.h:509:48: error: storage class specified for parameter ���__wine_dbch___default��� ../wine/include/wine/debug.h:509:19: error: parameter ���__wine_dbch___default��� is initialized ../wine/include/wine/debug.h:504:40: error: storage class specified for parameter ���__wine_dbch_win��� ../wine/include/wine/debug.h:504:19: error: parameter ���__wine_dbch_win��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/dlls/win32u/class.c:61:3: error: storage class specified for parameter ���CLASS��� ../wine/dlls/win32u/class.c:78:3: error: storage class specified for parameter ���WINDOWPROC��� ../wine/dlls/win32u/class.c:80:19: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���winproc_array��� ../wine/dlls/win32u/class.c:81:13: error: storage class specified for parameter ���winproc_used��� ../wine/dlls/win32u/class.c:81:1: error: parameter ���winproc_used��� is initialized ../wine/dlls/win32u/class.c:82:24: error: storage class specified for parameter ���winproc_lock��� ../wine/dlls/win32u/class.c:82:1: error: parameter ���winproc_lock��� is initialized ../wine/dlls/win32u/class.c:84:20: error: storage class specified for parameter ���class_list��� ../wine/dlls/win32u/class.c:84:15: error: parameter ���class_list��� is initialized ../wine/dlls/win32u/class.c:86:1: error: parameter ���user32_module��� is initialized ../wine/dlls/win32u/class.c:90:19: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:111:19: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:121:39: error: expected declaration specifiers or ���...��� before ���WINDOWPROC��� ../wine/dlls/win32u/class.c:127:26: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:167:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:177:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:195:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:205:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:241:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:250:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:263:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:305:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:325:14: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:348:32: error: expected declaration specifiers or ���...��� before ���CLASS��� ../wine/dlls/win32u/class.c:353:14: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:387:28: error: expected declaration specifiers or ���...��� before ���CLASS��� ../wine/dlls/win32u/class.c:395:28: error: expected declaration specifiers or ���...��� before ���CLASS��� ../wine/dlls/win32u/class.c:403:28: error: expected declaration specifiers or ���...��� before ���CLASS��� ../wine/dlls/win32u/class.c:416:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:521:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:556:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:594:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:619:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:660:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:706:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:856:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:864:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:872:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:900:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1027:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1032:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1037:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1069:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1080:41: error: storage class specified for parameter ���desktop_builtin_class��� ../wine/dlls/win32u/class.c:1080:21: error: parameter ���desktop_builtin_class��� is initialized ../wine/dlls/win32u/class.c:1088:41: error: storage class specified for parameter ���message_builtin_class��� ../wine/dlls/win32u/class.c:1088:21: error: parameter ���message_builtin_class��� is initialized ../wine/dlls/win32u/class.c:1094:41: error: storage class specified for parameter ���builtin_classes��� ../wine/dlls/win32u/class.c:1094:21: error: parameter ���builtin_classes��� is initialized ../wine/dlls/win32u/class.c:1098:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1099:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1100:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1101:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1102:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1106:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1107:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1108:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1109:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1110:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1114:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1115:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1116:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1117:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1118:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1122:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1123:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1124:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1125:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1126:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1130:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1131:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1132:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1136:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1137:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1138:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1139:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1143:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1144:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1145:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1146:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1147:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1151:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1152:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1153:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1154:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1155:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1156:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1160:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1161:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1162:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1163:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1164:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1168:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1169:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1170:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1171:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1172:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1176:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1177:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1178:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1179:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1180:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1191:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1224:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1248:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1257:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/ntuser_private.h:256:23: error: old-style parameter declarations in prototyped function definition ../wine/dlls/win32u/class.c:1260: error: expected ���{��� at end of input ../wine/dlls/win32u/ntuser_private.h:256:55: error: expected declaration specifiers before ���DECLSPEC_HIDDEN��� ../wine/dlls/win32u/ntuser_private.h:259:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/include/wine/debug.h:507:40: error: storage class specified for parameter ���__wine_dbch_clipboard��� ../wine/include/wine/debug.h:507:19: error: parameter ���__wine_dbch_clipboard��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/include/wine/debug.h:509:48: error: storage class specified for parameter ���__wine_dbch___default��� ../wine/include/wine/debug.h:509:19: error: parameter ���__wine_dbch___default��� is initialized ../wine/dlls/win32u/clipboard.c:41:24: error: storage class specified for parameter ���clipboard_mutex��� ../wine/dlls/win32u/clipboard.c:41:1: error: parameter ���clipboard_mutex��� is initialized ../wine/dlls/win32u/clipboard.c:51:20: error: storage class specified for parameter ���cached_formats��� ../wine/dlls/win32u/clipboard.c:51:15: error: parameter ���cached_formats��� is initialized ../wine/dlls/win32u/clipboard.c:52:20: error: storage class specified for parameter ���formats_to_free��� ../wine/dlls/win32u/clipboard.c:52:15: error: parameter ���formats_to_free��� is initialized ../wine/dlls/win32u/clipboard.c:57:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:98:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:108:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:134:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:146:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:173:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:203:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:228:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:261:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:281:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:302:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:330:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:349:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:374:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:391:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:417:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:434:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:460:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:477:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:492:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:514:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:530:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:546:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:571:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:642:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/ntuser_private.h:256:23: error: old-style parameter declarations in prototyped function definition ../wine/dlls/win32u/clipboard.c:756: error: expected ���{��� at end of input ../wine/dlls/win32u/ntuser_private.h:256:55: error: expected declaration specifiers before ���DECLSPEC_HIDDEN��� ../wine/dlls/win32u/ntuser_private.h:259:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/include/wine/debug.h:507:40: error: storage class specified for parameter ���__wine_dbch_cursor��� ../wine/include/wine/debug.h:507:19: error: parameter ���__wine_dbch_cursor��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/include/wine/debug.h:509:48: error: storage class specified for parameter ���__wine_dbch___default��� ../wine/include/wine/debug.h:509:19: error: parameter ���__wine_dbch___default��� is initialized ../wine/include/wine/debug.h:504:40: error: storage class specified for parameter ���__wine_dbch_icon��� ../wine/include/wine/debug.h:504:19: error: parameter ���__wine_dbch_icon��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/dlls/win32u/cursoricon.c:64:20: error: storage class specified for parameter ���icon_cache��� ../wine/dlls/win32u/cursoricon.c:64:15: error: parameter ���icon_cache��� is initialized ../wine/dlls/win32u/cursoricon.c:67:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:78:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:88:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:109:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:135:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:149:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:160:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:176:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:227:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:246:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:349:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:371:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:391:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:448:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:475:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:545:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:681:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:695:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:713:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:730:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/ntuser_private.h:256:23: error: old-style parameter declarations in prototyped function definition ../wine/dlls/win32u/cursoricon.c:745: error: expected ���{��� at end of input Task: The win32 Wine build failed === debian11b (build log) === ../wine/dlls/win32u/ntuser_private.h:256:55: error: expected declaration specifiers before ���DECLSPEC_HIDDEN��� ../wine/dlls/win32u/ntuser_private.h:259:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/include/wine/debug.h:507:40: error: storage class specified for parameter ���__wine_dbch_class��� ../wine/include/wine/debug.h:507:19: error: parameter ���__wine_dbch_class��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/include/wine/debug.h:509:48: error: storage class specified for parameter ���__wine_dbch___default��� ../wine/include/wine/debug.h:509:19: error: parameter ���__wine_dbch___default��� is initialized ../wine/include/wine/debug.h:504:40: error: storage class specified for parameter ���__wine_dbch_win��� ../wine/include/wine/debug.h:504:19: error: parameter ���__wine_dbch_win��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/dlls/win32u/class.c:61:3: error: storage class specified for parameter ���CLASS��� ../wine/dlls/win32u/class.c:78:3: error: storage class specified for parameter ���WINDOWPROC��� ../wine/dlls/win32u/class.c:80:19: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���winproc_array��� ../wine/dlls/win32u/class.c:81:13: error: storage class specified for parameter ���winproc_used��� ../wine/dlls/win32u/class.c:81:1: error: parameter ���winproc_used��� is initialized ../wine/dlls/win32u/class.c:82:24: error: storage class specified for parameter ���winproc_lock��� ../wine/dlls/win32u/class.c:82:1: error: parameter ���winproc_lock��� is initialized ../wine/dlls/win32u/class.c:84:20: error: storage class specified for parameter ���class_list��� ../wine/dlls/win32u/class.c:84:15: error: parameter ���class_list��� is initialized ../wine/dlls/win32u/class.c:86:1: error: parameter ���user32_module��� is initialized ../wine/dlls/win32u/class.c:90:19: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:111:19: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:121:39: error: expected declaration specifiers or ���...��� before ���WINDOWPROC��� ../wine/dlls/win32u/class.c:127:26: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:167:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:177:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:195:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:205:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:241:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:250:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:263:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:305:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:325:14: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:348:32: error: expected declaration specifiers or ���...��� before ���CLASS��� ../wine/dlls/win32u/class.c:353:14: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���*��� token ../wine/dlls/win32u/class.c:387:28: error: expected declaration specifiers or ���...��� before ���CLASS��� ../wine/dlls/win32u/class.c:395:28: error: expected declaration specifiers or ���...��� before ���CLASS��� ../wine/dlls/win32u/class.c:403:28: error: expected declaration specifiers or ���...��� before ���CLASS��� ../wine/dlls/win32u/class.c:416:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:521:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:556:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:594:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:619:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:660:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:706:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:856:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:864:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:872:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:900:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1027:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1032:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1037:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1069:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1080:41: error: storage class specified for parameter ���desktop_builtin_class��� ../wine/dlls/win32u/class.c:1080:21: error: parameter ���desktop_builtin_class��� is initialized ../wine/dlls/win32u/class.c:1088:41: error: storage class specified for parameter ���message_builtin_class��� ../wine/dlls/win32u/class.c:1088:21: error: parameter ���message_builtin_class��� is initialized ../wine/dlls/win32u/class.c:1094:41: error: storage class specified for parameter ���builtin_classes��� ../wine/dlls/win32u/class.c:1094:21: error: parameter ���builtin_classes��� is initialized ../wine/dlls/win32u/class.c:1098:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1099:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1100:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1101:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1102:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1106:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1107:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1108:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1109:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1110:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1114:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1115:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1116:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1117:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1118:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1122:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1123:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1124:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1125:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1126:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1130:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1131:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1132:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1136:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1137:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1138:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1139:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1143:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1144:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1145:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1146:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1147:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1151:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1152:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1153:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1154:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1155:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1156:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1160:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1161:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1162:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1163:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1164:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1168:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1169:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1170:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1171:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1172:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1176:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1177:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1178:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1179:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1180:9: error: field name not in record or union initializer ../wine/dlls/win32u/class.c:1191:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1224:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1248:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/class.c:1257:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/ntuser_private.h:256:23: error: old-style parameter declarations in prototyped function definition ../wine/dlls/win32u/class.c:1260: error: expected ���{��� at end of input ../wine/dlls/win32u/ntuser_private.h:256:55: error: expected declaration specifiers before ���DECLSPEC_HIDDEN��� ../wine/dlls/win32u/ntuser_private.h:259:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/include/wine/debug.h:507:40: error: storage class specified for parameter ���__wine_dbch_clipboard��� ../wine/include/wine/debug.h:507:19: error: parameter ���__wine_dbch_clipboard��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/include/wine/debug.h:509:48: error: storage class specified for parameter ���__wine_dbch___default��� ../wine/include/wine/debug.h:509:19: error: parameter ���__wine_dbch___default��� is initialized ../wine/dlls/win32u/clipboard.c:41:24: error: storage class specified for parameter ���clipboard_mutex��� ../wine/dlls/win32u/clipboard.c:41:1: error: parameter ���clipboard_mutex��� is initialized ../wine/dlls/win32u/clipboard.c:51:20: error: storage class specified for parameter ���cached_formats��� ../wine/dlls/win32u/clipboard.c:51:15: error: parameter ���cached_formats��� is initialized ../wine/dlls/win32u/clipboard.c:52:20: error: storage class specified for parameter ���formats_to_free��� ../wine/dlls/win32u/clipboard.c:52:15: error: parameter ���formats_to_free��� is initialized ../wine/dlls/win32u/clipboard.c:57:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:98:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:108:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:134:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:146:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:173:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:203:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:228:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:261:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:281:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:302:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:330:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:349:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:374:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:391:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:417:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:434:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:460:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:477:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:492:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:514:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:530:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:546:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:571:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/clipboard.c:642:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/ntuser_private.h:256:23: error: old-style parameter declarations in prototyped function definition ../wine/dlls/win32u/clipboard.c:756: error: expected ���{��� at end of input ../wine/dlls/win32u/ntuser_private.h:256:55: error: expected declaration specifiers before ���DECLSPEC_HIDDEN��� ../wine/dlls/win32u/ntuser_private.h:259:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/include/wine/debug.h:507:40: error: storage class specified for parameter ���__wine_dbch_cursor��� ../wine/include/wine/debug.h:507:19: error: parameter ���__wine_dbch_cursor��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/include/wine/debug.h:509:48: error: storage class specified for parameter ���__wine_dbch___default��� ../wine/include/wine/debug.h:509:19: error: parameter ���__wine_dbch___default��� is initialized ../wine/include/wine/debug.h:504:40: error: storage class specified for parameter ���__wine_dbch_icon��� ../wine/include/wine/debug.h:504:19: error: parameter ���__wine_dbch_icon��� is initialized ../wine/include/winnt.h:424:21: error: expected declaration specifiers before ���_Static_assert��� ../wine/dlls/win32u/cursoricon.c:64:20: error: storage class specified for parameter ���icon_cache��� ../wine/dlls/win32u/cursoricon.c:64:15: error: parameter ���icon_cache��� is initialized ../wine/dlls/win32u/cursoricon.c:67:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:78:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:88:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:109:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:135:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:149:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:160:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:176:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:227:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:246:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:349:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:371:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:391:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:448:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:475:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:545:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:681:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:695:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:713:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/cursoricon.c:730:1: error: expected ���=���, ���,���, ���;���, ���asm��� or ���__attribute__��� before ���{��� token ../wine/dlls/win32u/ntuser_private.h:256:23: error: old-style parameter declarations in prototyped function definition ../wine/dlls/win32u/cursoricon.c:745: error: expected ���{��� at end of input Task: The wow64 Wine build failed
participants (2)
-
Marvin -
Rémi Bernon