diff --git a/include/wine/afd.h b/include/wine/afd.h index 46d242c7582..35d047c59d8 100644 --- a/include/wine/afd.h +++ b/include/wine/afd.h @@ -147,6 +147,7 @@ struct afd_get_events_params #define IOCTL_AFD_WINE_SIOCATMARK CTL_CODE(FILE_DEVICE_NETWORK, 212, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_AFD_WINE_GET_INTERFACE_LIST CTL_CODE(FILE_DEVICE_NETWORK, 213, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_AFD_WINE_KEEPALIVE_VALS CTL_CODE(FILE_DEVICE_NETWORK, 214, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_AFD_WINE_MESSAGE_SELECT CTL_CODE(FILE_DEVICE_NETWORK, 215, METHOD_BUFFERED, FILE_ANY_ACCESS) struct afd_create_params { @@ -199,4 +200,12 @@ struct afd_transmit_params DWORD flags; }; +struct afd_message_select_params +{ + obj_handle_t handle; + user_handle_t window; + unsigned int message; + int mask; +}; + #endif diff --git a/server/sock.c b/server/sock.c index e1b30507514..6d2ac6af2b7 100644 --- a/server/sock.c +++ b/server/sock.c @@ -2095,6 +2095,35 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async ) return 1; } + case IOCTL_AFD_WINE_MESSAGE_SELECT: + { + const struct afd_message_select_params *params = get_req_data(); + + if (get_req_data_size() < sizeof(params)) + { + set_error( STATUS_BUFFER_TOO_SMALL ); + return 0; + } + + if (sock->event) release_object( sock->event ); + + if (params->window) + { + sock->pending_events = 0; + sock->reported_events = 0; + } + sock->event = NULL; + sock->mask = params->mask; + sock->window = params->window; + sock->message = params->message; + sock->wparam = params->handle; + sock->nonblocking = 1; + + sock_reselect( sock ); + + return 1; + } + default: set_error( STATUS_NOT_SUPPORTED ); return 0;