Zebediah Figura : ntdll: Make the afd_transmit_params structure WoW64-compatible.

Alexandre Julliard julliard at winehq.org
Fri Dec 10 15:07:52 CST 2021


Module: wine
Branch: master
Commit: 7747bf9551b753916054b6a01941a8fe58778ac8
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7747bf9551b753916054b6a01941a8fe58778ac8

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Fri Dec 10 11:27:37 2021 -0600

ntdll: Make the afd_transmit_params structure WoW64-compatible.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/socket.c | 30 ++++++++++++++++++------------
 dlls/ws2_32/socket.c     | 12 +++++++++---
 include/wine/afd.h       | 10 +++++++---
 3 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c
index 9b40dd30f25..20368ad6415 100644
--- a/dlls/ntdll/unix/socket.c
+++ b/dlls/ntdll/unix/socket.c
@@ -143,7 +143,10 @@ struct async_transmit_ioctl
     unsigned int tail_cursor;   /* amount of tail data already sent */
     unsigned int file_len;      /* total file length to send */
     DWORD flags;
-    TRANSMIT_FILE_BUFFERS buffers;
+    const char *head;
+    const char *tail;
+    unsigned int head_len;
+    unsigned int tail_len;
     LARGE_INTEGER offset;
 };
 
@@ -1090,11 +1093,11 @@ static NTSTATUS try_transmit( int sock_fd, int file_fd, struct async_transmit_io
 {
     ssize_t ret;
 
-    while (async->head_cursor < async->buffers.HeadLength)
+    while (async->head_cursor < async->head_len)
     {
-        TRACE( "sending %u bytes of header data\n", async->buffers.HeadLength - async->head_cursor );
-        ret = do_send( sock_fd, (char *)async->buffers.Head + async->head_cursor,
-                       async->buffers.HeadLength - async->head_cursor, 0 );
+        TRACE( "sending %u bytes of header data\n", async->head_len - async->head_cursor );
+        ret = do_send( sock_fd, async->head + async->head_cursor,
+                       async->head_len - async->head_cursor, 0 );
         if (ret < 0) return sock_errno_to_status( errno );
         TRACE( "send returned %zd\n", ret );
         async->head_cursor += ret;
@@ -1139,11 +1142,11 @@ static NTSTATUS try_transmit( int sock_fd, int file_fd, struct async_transmit_io
         return STATUS_DEVICE_NOT_READY; /* still more data to send */
     }
 
-    while (async->tail_cursor < async->buffers.TailLength)
+    while (async->tail_cursor < async->tail_len)
     {
-        TRACE( "sending %u bytes of tail data\n", async->buffers.TailLength - async->tail_cursor );
-        ret = do_send( sock_fd, (char *)async->buffers.Tail + async->tail_cursor,
-                       async->buffers.TailLength - async->tail_cursor, 0 );
+        TRACE( "sending %u bytes of tail data\n", async->tail_len - async->tail_cursor );
+        ret = do_send( sock_fd, async->tail + async->tail_cursor,
+                       async->tail_len - async->tail_cursor, 0 );
         if (ret < 0) return sock_errno_to_status( errno );
         TRACE( "send returned %zd\n", ret );
         async->tail_cursor += ret;
@@ -1202,7 +1205,7 @@ static NTSTATUS sock_transmit( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc,
 
     if (params->file)
     {
-        if ((status = server_get_unix_fd( params->file, 0, &file_fd, &file_needs_close, &file_type, NULL )))
+        if ((status = server_get_unix_fd( ULongToHandle( params->file ), 0, &file_fd, &file_needs_close, &file_type, NULL )))
             return status;
         if (file_needs_close) close( file_fd );
 
@@ -1216,7 +1219,7 @@ static NTSTATUS sock_transmit( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc,
     if (!(async = (struct async_transmit_ioctl *)alloc_fileio( sizeof(*async), async_transmit_proc, handle )))
         return STATUS_NO_MEMORY;
 
-    async->file = params->file;
+    async->file = ULongToHandle( params->file );
     async->buffer_size = params->buffer_size ? params->buffer_size : 65536;
     if (!(async->buffer = malloc( async->buffer_size )))
     {
@@ -1230,7 +1233,10 @@ static NTSTATUS sock_transmit( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc,
     async->tail_cursor = 0;
     async->file_len = params->file_len;
     async->flags = params->flags;
-    async->buffers = params->buffers;
+    async->head = u64_to_user_ptr(params->head_ptr);
+    async->head_len = params->head_len;
+    async->tail = u64_to_user_ptr(params->tail_ptr);
+    async->tail_len = params->tail_len;
     async->offset = params->offset;
 
     SERVER_START_REQ( send_socket )
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index e95a9669656..648284c10a3 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -819,7 +819,7 @@ static BOOL WINAPI WS2_AcceptEx( SOCKET listener, SOCKET acceptor, void *dest, D
 static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE file, DWORD file_len, DWORD buffer_size,
                                      OVERLAPPED *overlapped, TRANSMIT_FILE_BUFFERS *buffers, DWORD flags )
 {
-    struct afd_transmit_params params = {0};
+    struct afd_transmit_params params = {{{0}}};
     IO_STATUS_BLOCK iosb, *piosb = &iosb;
     HANDLE event = NULL;
     void *cvalue = NULL;
@@ -844,10 +844,16 @@ static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE file, DWORD file_len, DWOR
         params.offset.QuadPart = FILE_USE_FILE_POINTER_POSITION;
     }
 
-    params.file = file;
+    params.file = HandleToULong( file );
     params.file_len = file_len;
     params.buffer_size = buffer_size;
-    if (buffers) params.buffers = *buffers;
+    if (buffers)
+    {
+        params.head_ptr = u64_from_user_ptr(buffers->Head);
+        params.head_len = buffers->HeadLength;
+        params.tail_ptr = u64_from_user_ptr(buffers->Tail);
+        params.tail_len = buffers->TailLength;
+    }
     params.flags = flags;
 
     status = NtDeviceIoControlFile( (HANDLE)s, event, NULL, cvalue, piosb,
diff --git a/include/wine/afd.h b/include/wine/afd.h
index ee67e255dd0..97128c67ca6 100644
--- a/include/wine/afd.h
+++ b/include/wine/afd.h
@@ -310,13 +310,17 @@ C_ASSERT( sizeof(struct afd_sendmsg_params) == 32 );
 
 struct afd_transmit_params
 {
-    HANDLE file;
+    LARGE_INTEGER offset;
+    ULONGLONG head_ptr;
+    ULONGLONG tail_ptr;
+    DWORD head_len;
+    DWORD tail_len;
+    ULONG file;
     DWORD file_len;
     DWORD buffer_size;
-    LARGE_INTEGER offset;
-    TRANSMIT_FILE_BUFFERS buffers;
     DWORD flags;
 };
+C_ASSERT( sizeof(struct afd_transmit_params) == 48 );
 
 struct afd_message_select_params
 {




More information about the wine-cvs mailing list