ntdll: Make the afd_recvmsg_params structure WoW64-compatible.

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2021-12-10 11:27:35 -06:00 committed by Alexandre Julliard
parent 737f6952da
commit 6697759b99
3 changed files with 23 additions and 15 deletions

View File

@ -91,6 +91,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(winsock);
#define u64_to_user_ptr(u) ((void *)(uintptr_t)(u))
union unix_sockaddr
{
struct sockaddr addr;
@ -1414,6 +1416,7 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc
case IOCTL_AFD_WINE_RECVMSG:
{
struct afd_recvmsg_params *params = in_buffer;
unsigned int *ws_flags = u64_to_user_ptr(params->ws_flags_ptr);
int unix_flags = 0;
if ((status = server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL )))
@ -1425,15 +1428,17 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc
break;
}
if (*params->ws_flags & WS_MSG_OOB)
if (*ws_flags & WS_MSG_OOB)
unix_flags |= MSG_OOB;
if (*params->ws_flags & WS_MSG_PEEK)
if (*ws_flags & WS_MSG_PEEK)
unix_flags |= MSG_PEEK;
if (*params->ws_flags & WS_MSG_WAITALL)
if (*ws_flags & WS_MSG_WAITALL)
FIXME( "MSG_WAITALL is not supported\n" );
status = sock_recv( handle, event, apc, apc_user, io, fd, params->buffers, params->count, params->control,
params->addr, params->addr_len, params->ws_flags, unix_flags, params->force_async );
status = sock_recv( handle, event, apc, apc_user, io, fd, u64_to_user_ptr(params->buffers_ptr),
params->count, u64_to_user_ptr(params->control_ptr),
u64_to_user_ptr(params->addr_ptr), u64_to_user_ptr(params->addr_len_ptr),
ws_flags, unix_flags, params->force_async );
break;
}

View File

@ -35,6 +35,8 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
#define TIMEOUT_INFINITE _I64_MAX
#define u64_from_user_ptr(ptr) ((ULONGLONG)(uintptr_t)(ptr))
static const WSAPROTOCOL_INFOW supported_protocols[] =
{
{
@ -923,13 +925,13 @@ static int WS2_recv_base( SOCKET s, WSABUF *buffers, DWORD buffer_count, DWORD *
apc = socket_apc;
}
params.control = control;
params.addr = addr;
params.addr_len = addr_len;
params.ws_flags = flags;
params.control_ptr = u64_from_user_ptr(control);
params.addr_ptr = u64_from_user_ptr(addr);
params.addr_len_ptr = u64_from_user_ptr(addr_len);
params.ws_flags_ptr = u64_from_user_ptr(flags);
params.force_async = !!overlapped;
params.count = buffer_count;
params.buffers = buffers;
params.buffers_ptr = u64_from_user_ptr(buffers);
status = NtDeviceIoControlFile( (HANDLE)s, event, apc, cvalue, piosb,
IOCTL_AFD_WINE_RECVMSG, &params, sizeof(params), NULL, 0 );

View File

@ -281,14 +281,15 @@ C_ASSERT( sizeof(struct afd_connect_params) == 8 );
struct afd_recvmsg_params
{
WSABUF *control;
struct WS(sockaddr) *addr;
int *addr_len;
unsigned int *ws_flags;
ULONGLONG control_ptr; /* WSABUF */
ULONGLONG addr_ptr; /* WS(sockaddr) */
ULONGLONG addr_len_ptr; /* int */
ULONGLONG ws_flags_ptr; /* unsigned int */
int force_async;
unsigned int count;
WSABUF *buffers;
ULONGLONG buffers_ptr; /* WSABUF[] */
};
C_ASSERT( sizeof(struct afd_recvmsg_params) == 48 );
struct afd_sendmsg_params
{