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.
From: Rémi Bernon rbernon@codeweavers.com
Based on a patch by Huw Davies huw@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 ); }
From: Rémi Bernon rbernon@codeweavers.com
Based on a patch by Huw Davies huw@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;
From: Rémi Bernon rbernon@codeweavers.com
Based on a patch by Huw Davies huw@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 */ };
From: Rémi Bernon rbernon@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@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 );
From: Rémi Bernon rbernon@codeweavers.com
Based on a patch by Huw Davies huw@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 *
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