From 92a66c08ba7546e170b193c0209dd85d3dfc3eb1 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 8 Jul 2021 16:21:51 +0200 Subject: [PATCH] ntdll: Pass a length pointer instead of an IO_STATUS_BLOCK to the async callbacks. Signed-off-by: Alexandre Julliard --- dlls/ntdll/unix/file.c | 27 +++++++++------------------ dlls/ntdll/unix/server.c | 9 +++++++-- dlls/ntdll/unix/socket.c | 20 ++++++++------------ dlls/ntdll/unix/unix_private.h | 2 +- 4 files changed, 25 insertions(+), 33 deletions(-) diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index 626a0957644..643daa5ab3f 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -4681,10 +4681,9 @@ static NTSTATUS wait_async( HANDLE handle, BOOL alertable ) } /* callback for irp async I/O completion */ -static NTSTATUS irp_completion( void *user, IO_STATUS_BLOCK *io, NTSTATUS status ) +static NTSTATUS irp_completion( void *user, ULONG_PTR *info, NTSTATUS status ) { struct async_irp *async = user; - ULONG information = 0; if (status == STATUS_ALERTED) { @@ -4693,20 +4692,15 @@ static NTSTATUS irp_completion( void *user, IO_STATUS_BLOCK *io, NTSTATUS status req->user_arg = wine_server_client_ptr( async ); wine_server_set_reply( req, async->buffer, async->size ); status = virtual_locked_server_call( req ); - information = reply->size; + *info = reply->size; } SERVER_END_REQ; } - if (status != STATUS_PENDING) - { - io->u.Status = status; - io->Information = information; - release_fileio( &async->io ); - } + if (status != STATUS_PENDING) release_fileio( &async->io ); return status; } -static NTSTATUS async_read_proc( void *user, IO_STATUS_BLOCK *iosb, NTSTATUS status ) +static NTSTATUS async_read_proc( void *user, ULONG_PTR *info, NTSTATUS status ) { struct async_fileio_read *fileio = user; int fd, needs_close, result; @@ -4750,14 +4744,13 @@ static NTSTATUS async_read_proc( void *user, IO_STATUS_BLOCK *iosb, NTSTATUS sta } if (status != STATUS_PENDING) { - iosb->u.Status = status; - iosb->Information = fileio->already; + *info = fileio->already; release_fileio( &fileio->io ); } return status; } -static NTSTATUS async_write_proc( void *user, IO_STATUS_BLOCK *iosb, NTSTATUS status ) +static NTSTATUS async_write_proc( void *user, ULONG_PTR *info, NTSTATUS status ) { struct async_fileio_write *fileio = user; int result, fd, needs_close; @@ -4797,8 +4790,7 @@ static NTSTATUS async_write_proc( void *user, IO_STATUS_BLOCK *iosb, NTSTATUS st } if (status != STATUS_PENDING) { - iosb->u.Status = status; - iosb->Information = fileio->already; + *info = fileio->already; release_fileio( &fileio->io ); } return status; @@ -6064,7 +6056,7 @@ NTSTATUS WINAPI NtUnlockFile( HANDLE handle, IO_STATUS_BLOCK *io_status, LARGE_I } -static NTSTATUS read_changes_apc( void *user, IO_STATUS_BLOCK *iosb, NTSTATUS status ) +static NTSTATUS read_changes_apc( void *user, ULONG_PTR *info, NTSTATUS status ) { struct async_fileio_read_changes *fileio = user; int size = 0; @@ -6133,8 +6125,7 @@ static NTSTATUS read_changes_apc( void *user, IO_STATUS_BLOCK *iosb, NTSTATUS st if (status != STATUS_PENDING) { - iosb->u.Status = status; - iosb->Information = size; + *info = size; release_fileio( &fileio->io ); } return status; diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c index 1d82e806e17..c2efd36ca6f 100644 --- a/dlls/ntdll/unix/server.c +++ b/dlls/ntdll/unix/server.c @@ -379,11 +379,16 @@ static void invoke_system_apc( const apc_call_t *call, apc_result_t *result, BOO { IO_STATUS_BLOCK *iosb = wine_server_get_ptr( call->async_io.sb ); struct async_fileio *user = wine_server_get_ptr( call->async_io.user ); + ULONG_PTR info = 0; result->type = call->type; - result->async_io.status = user->callback( user, iosb, call->async_io.status ); + result->async_io.status = user->callback( user, &info, call->async_io.status ); if (result->async_io.status != STATUS_PENDING) - result->async_io.total = iosb->Information; + { + result->async_io.total = info; + iosb->Status = result->async_io.status; + iosb->Information = info; + } break; } case APC_VIRTUAL_ALLOC: diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index e5abb3828c3..34796dbfd3d 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -543,7 +543,7 @@ static NTSTATUS try_recv( int fd, struct async_recv_ioctl *async, ULONG_PTR *siz return status; } -static NTSTATUS async_recv_proc( void *user, IO_STATUS_BLOCK *io, NTSTATUS status ) +static NTSTATUS async_recv_proc( void *user, ULONG_PTR *info, NTSTATUS status ) { struct async_recv_ioctl *async = user; ULONG_PTR information = 0; @@ -566,8 +566,7 @@ static NTSTATUS async_recv_proc( void *user, IO_STATUS_BLOCK *io, NTSTATUS statu } if (status != STATUS_PENDING) { - io->Status = status; - io->Information = information; + *info = information; release_fileio( &async->io ); } return status; @@ -684,7 +683,7 @@ static ULONG_PTR fill_poll_output( struct async_poll_ioctl *async, NTSTATUS stat return offsetof( struct afd_poll_params, sockets[count] ); } -static NTSTATUS async_poll_proc( void *user, IO_STATUS_BLOCK *io, NTSTATUS status ) +static NTSTATUS async_poll_proc( void *user, ULONG_PTR *info, NTSTATUS status ) { struct async_poll_ioctl *async = user; ULONG_PTR information = 0; @@ -704,8 +703,7 @@ static NTSTATUS async_poll_proc( void *user, IO_STATUS_BLOCK *io, NTSTATUS statu if (status != STATUS_PENDING) { - io->Status = status; - io->Information = information; + *info = information; free( async->input ); release_fileio( &async->io ); } @@ -868,7 +866,7 @@ static NTSTATUS try_send( int fd, struct async_send_ioctl *async ) return STATUS_SUCCESS; } -static NTSTATUS async_send_proc( void *user, IO_STATUS_BLOCK *io, NTSTATUS status ) +static NTSTATUS async_send_proc( void *user, ULONG_PTR *info, NTSTATUS status ) { struct async_send_ioctl *async = user; int fd, needs_close; @@ -890,8 +888,7 @@ static NTSTATUS async_send_proc( void *user, IO_STATUS_BLOCK *io, NTSTATUS statu } if (status != STATUS_PENDING) { - io->Status = status; - io->Information = async->sent_len; + *info = async->sent_len; release_fileio( &async->io ); } return status; @@ -1033,7 +1030,7 @@ static NTSTATUS try_transmit( int sock_fd, int file_fd, struct async_transmit_io return STATUS_SUCCESS; } -static NTSTATUS async_transmit_proc( void *user, IO_STATUS_BLOCK *io, NTSTATUS status ) +static NTSTATUS async_transmit_proc( void *user, ULONG_PTR *info, NTSTATUS status ) { int sock_fd, file_fd = -1, sock_needs_close = FALSE, file_needs_close = FALSE; struct async_transmit_ioctl *async = user; @@ -1062,8 +1059,7 @@ static NTSTATUS async_transmit_proc( void *user, IO_STATUS_BLOCK *io, NTSTATUS s } if (status != STATUS_PENDING) { - io->Status = status; - io->Information = async->head_cursor + async->file_cursor + async->tail_cursor; + *info = async->head_cursor + async->file_cursor + async->tail_cursor; release_fileio( &async->io ); } return status; diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 3dae2e56258..e7320dbc1af 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -69,7 +69,7 @@ static inline struct ntdll_thread_data *ntdll_get_thread_data(void) return (struct ntdll_thread_data *)&NtCurrentTeb()->GdiTebBatch; } -typedef NTSTATUS async_callback_t( void *user, IO_STATUS_BLOCK *io, NTSTATUS status ); +typedef NTSTATUS async_callback_t( void *user, ULONG_PTR *info, NTSTATUS status ); struct async_fileio {