Commit 1eb56b20 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

ntdll: Explicitly return whether an async is complete in async_callback_t.

parent f5bd9463
...@@ -4679,34 +4679,34 @@ struct async_fileio *alloc_fileio( DWORD size, async_callback_t callback, HANDLE ...@@ -4679,34 +4679,34 @@ struct async_fileio *alloc_fileio( DWORD size, async_callback_t callback, HANDLE
} }
/* callback for irp async I/O completion */ /* callback for irp async I/O completion */
static NTSTATUS irp_completion( void *user, ULONG_PTR *info, NTSTATUS status ) static BOOL irp_completion( void *user, ULONG_PTR *info, NTSTATUS *status )
{ {
struct async_irp *async = user; struct async_irp *async = user;
if (status == STATUS_ALERTED) if (*status == STATUS_ALERTED)
{ {
SERVER_START_REQ( get_async_result ) SERVER_START_REQ( get_async_result )
{ {
req->user_arg = wine_server_client_ptr( async ); req->user_arg = wine_server_client_ptr( async );
wine_server_set_reply( req, async->buffer, async->size ); wine_server_set_reply( req, async->buffer, async->size );
status = virtual_locked_server_call( req ); *status = virtual_locked_server_call( req );
} }
SERVER_END_REQ; SERVER_END_REQ;
} }
if (status != STATUS_PENDING) release_fileio( &async->io ); release_fileio( &async->io );
return status; return TRUE;
} }
static NTSTATUS async_read_proc( void *user, ULONG_PTR *info, NTSTATUS status ) static BOOL async_read_proc( void *user, ULONG_PTR *info, NTSTATUS *status )
{ {
struct async_fileio_read *fileio = user; struct async_fileio_read *fileio = user;
int fd, needs_close, result; int fd, needs_close, result;
switch (status) switch (*status)
{ {
case STATUS_ALERTED: /* got some new data */ case STATUS_ALERTED: /* got some new data */
/* check to see if the data is ready (non-blocking) */ /* check to see if the data is ready (non-blocking) */
if ((status = server_get_unix_fd( fileio->io.handle, FILE_READ_DATA, &fd, if ((*status = server_get_unix_fd( fileio->io.handle, FILE_READ_DATA, &fd,
&needs_close, NULL, NULL ))) &needs_close, NULL, NULL )))
break; break;
...@@ -4716,48 +4716,48 @@ static NTSTATUS async_read_proc( void *user, ULONG_PTR *info, NTSTATUS status ) ...@@ -4716,48 +4716,48 @@ static NTSTATUS async_read_proc( void *user, ULONG_PTR *info, NTSTATUS status )
if (result < 0) if (result < 0)
{ {
if (errno == EAGAIN || errno == EINTR) if (errno == EAGAIN || errno == EINTR)
status = STATUS_PENDING; return FALSE;
else /* check to see if the transfer is complete */
status = errno_to_status( errno ); /* check to see if the transfer is complete */
*status = errno_to_status( errno );
} }
else if (result == 0) else if (result == 0)
{ {
status = fileio->already ? STATUS_SUCCESS : STATUS_PIPE_BROKEN; *status = fileio->already ? STATUS_SUCCESS : STATUS_PIPE_BROKEN;
} }
else else
{ {
fileio->already += result; fileio->already += result;
if (fileio->already >= fileio->count || fileio->avail_mode)
status = STATUS_SUCCESS; if (fileio->already < fileio->count && !fileio->avail_mode)
else return FALSE;
status = STATUS_PENDING;
*status = STATUS_SUCCESS;
} }
break; break;
case STATUS_TIMEOUT: case STATUS_TIMEOUT:
case STATUS_IO_TIMEOUT: case STATUS_IO_TIMEOUT:
if (fileio->already) status = STATUS_SUCCESS; if (fileio->already) *status = STATUS_SUCCESS;
break; break;
} }
if (status != STATUS_PENDING)
{ *info = fileio->already;
*info = fileio->already; release_fileio( &fileio->io );
release_fileio( &fileio->io ); return TRUE;
}
return status;
} }
static NTSTATUS async_write_proc( void *user, ULONG_PTR *info, NTSTATUS status ) static BOOL async_write_proc( void *user, ULONG_PTR *info, NTSTATUS *status )
{ {
struct async_fileio_write *fileio = user; struct async_fileio_write *fileio = user;
int result, fd, needs_close; int result, fd, needs_close;
enum server_fd_type type; enum server_fd_type type;
switch (status) switch (*status)
{ {
case STATUS_ALERTED: case STATUS_ALERTED:
/* write some data (non-blocking) */ /* write some data (non-blocking) */
if ((status = server_get_unix_fd( fileio->io.handle, FILE_WRITE_DATA, &fd, if ((*status = server_get_unix_fd( fileio->io.handle, FILE_WRITE_DATA, &fd,
&needs_close, &type, NULL ))) &needs_close, &type, NULL )))
break; break;
...@@ -4770,27 +4770,26 @@ static NTSTATUS async_write_proc( void *user, ULONG_PTR *info, NTSTATUS status ) ...@@ -4770,27 +4770,26 @@ static NTSTATUS async_write_proc( void *user, ULONG_PTR *info, NTSTATUS status )
if (result < 0) if (result < 0)
{ {
if (errno == EAGAIN || errno == EINTR) status = STATUS_PENDING; if (errno == EAGAIN || errno == EINTR) return FALSE;
else status = errno_to_status( errno ); *status = errno_to_status( errno );
} }
else else
{ {
fileio->already += result; fileio->already += result;
status = (fileio->already < fileio->count) ? STATUS_PENDING : STATUS_SUCCESS; if (fileio->already < fileio->count) return FALSE;
*status = STATUS_SUCCESS;
} }
break; break;
case STATUS_TIMEOUT: case STATUS_TIMEOUT:
case STATUS_IO_TIMEOUT: case STATUS_IO_TIMEOUT:
if (fileio->already) status = STATUS_SUCCESS; if (fileio->already) *status = STATUS_SUCCESS;
break; break;
} }
if (status != STATUS_PENDING)
{ *info = fileio->already;
*info = fileio->already; release_fileio( &fileio->io );
release_fileio( &fileio->io ); return TRUE;
}
return status;
} }
/* do a read call through the server */ /* do a read call through the server */
...@@ -6054,23 +6053,23 @@ NTSTATUS WINAPI NtUnlockFile( HANDLE handle, IO_STATUS_BLOCK *io_status, LARGE_I ...@@ -6054,23 +6053,23 @@ NTSTATUS WINAPI NtUnlockFile( HANDLE handle, IO_STATUS_BLOCK *io_status, LARGE_I
} }
static NTSTATUS read_changes_apc( void *user, ULONG_PTR *info, NTSTATUS status ) static BOOL read_changes_apc( void *user, ULONG_PTR *info, NTSTATUS *status )
{ {
struct async_fileio_read_changes *fileio = user; struct async_fileio_read_changes *fileio = user;
int size = 0; int size = 0;
if (status == STATUS_ALERTED) if (*status == STATUS_ALERTED)
{ {
SERVER_START_REQ( read_change ) SERVER_START_REQ( read_change )
{ {
req->handle = wine_server_obj_handle( fileio->io.handle ); req->handle = wine_server_obj_handle( fileio->io.handle );
wine_server_set_reply( req, fileio->data, fileio->data_size ); wine_server_set_reply( req, fileio->data, fileio->data_size );
status = wine_server_call( req ); *status = wine_server_call( req );
size = wine_server_reply_size( reply ); size = wine_server_reply_size( reply );
} }
SERVER_END_REQ; SERVER_END_REQ;
if (status == STATUS_SUCCESS && fileio->buffer) if (*status == STATUS_SUCCESS && fileio->buffer)
{ {
FILE_NOTIFY_INFORMATION *pfni = fileio->buffer; FILE_NOTIFY_INFORMATION *pfni = fileio->buffer;
int i, left = fileio->buffer_size; int i, left = fileio->buffer_size;
...@@ -6105,7 +6104,7 @@ static NTSTATUS read_changes_apc( void *user, ULONG_PTR *info, NTSTATUS status ) ...@@ -6105,7 +6104,7 @@ static NTSTATUS read_changes_apc( void *user, ULONG_PTR *info, NTSTATUS status )
if (size) if (size)
{ {
status = STATUS_NOTIFY_ENUM_DIR; *status = STATUS_NOTIFY_ENUM_DIR;
size = 0; size = 0;
} }
else else
...@@ -6116,17 +6115,14 @@ static NTSTATUS read_changes_apc( void *user, ULONG_PTR *info, NTSTATUS status ) ...@@ -6116,17 +6115,14 @@ static NTSTATUS read_changes_apc( void *user, ULONG_PTR *info, NTSTATUS status )
} }
else else
{ {
status = STATUS_NOTIFY_ENUM_DIR; *status = STATUS_NOTIFY_ENUM_DIR;
size = 0; size = 0;
} }
} }
if (status != STATUS_PENDING) *info = size;
{ release_fileio( &fileio->io );
*info = size; return TRUE;
release_fileio( &fileio->io );
}
return status;
} }
#define FILE_NOTIFY_ALL ( \ #define FILE_NOTIFY_ALL ( \
......
...@@ -379,11 +379,13 @@ static void invoke_system_apc( const apc_call_t *call, apc_result_t *result, BOO ...@@ -379,11 +379,13 @@ static void invoke_system_apc( const apc_call_t *call, apc_result_t *result, BOO
{ {
struct async_fileio *user = wine_server_get_ptr( call->async_io.user ); struct async_fileio *user = wine_server_get_ptr( call->async_io.user );
ULONG_PTR info = call->async_io.result; ULONG_PTR info = call->async_io.result;
NTSTATUS status;
result->type = call->type; result->type = call->type;
result->async_io.status = user->callback( user, &info, call->async_io.status ); status = call->async_io.status;
if (result->async_io.status != STATUS_PENDING) if (user->callback( user, &info, &status ))
{ {
result->async_io.status = status;
result->async_io.total = info; result->async_io.total = info;
/* the server will pass us NULL if a call failed synchronously */ /* the server will pass us NULL if a call failed synchronously */
set_async_iosb( call->async_io.sb, result->async_io.status, info ); set_async_iosb( call->async_io.sb, result->async_io.status, info );
......
...@@ -562,28 +562,27 @@ static NTSTATUS try_recv( int fd, struct async_recv_ioctl *async, ULONG_PTR *siz ...@@ -562,28 +562,27 @@ static NTSTATUS try_recv( int fd, struct async_recv_ioctl *async, ULONG_PTR *siz
return status; return status;
} }
static NTSTATUS async_recv_proc( void *user, ULONG_PTR *info, NTSTATUS status ) static BOOL async_recv_proc( void *user, ULONG_PTR *info, NTSTATUS *status )
{ {
struct async_recv_ioctl *async = user; struct async_recv_ioctl *async = user;
int fd, needs_close; int fd, needs_close;
TRACE( "%#x\n", status ); TRACE( "%#x\n", *status );
if (status == STATUS_ALERTED) if (*status == STATUS_ALERTED)
{ {
if ((status = server_get_unix_fd( async->io.handle, 0, &fd, &needs_close, NULL, NULL ))) if ((*status = server_get_unix_fd( async->io.handle, 0, &fd, &needs_close, NULL, NULL )))
return status; return TRUE;
status = try_recv( fd, async, info );
TRACE( "got status %#x, %#lx bytes read\n", status, *info );
if (status == STATUS_DEVICE_NOT_READY)
status = STATUS_PENDING;
*status = try_recv( fd, async, info );
TRACE( "got status %#x, %#lx bytes read\n", *status, *info );
if (needs_close) close( fd ); if (needs_close) close( fd );
if (*status == STATUS_DEVICE_NOT_READY)
return FALSE;
} }
if (status != STATUS_PENDING) release_fileio( &async->io ); release_fileio( &async->io );
return status; return TRUE;
} }
static NTSTATUS sock_recv( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, IO_STATUS_BLOCK *io, static NTSTATUS sock_recv( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, IO_STATUS_BLOCK *io,
...@@ -696,29 +695,26 @@ static ULONG_PTR fill_poll_output( struct async_poll_ioctl *async, NTSTATUS stat ...@@ -696,29 +695,26 @@ static ULONG_PTR fill_poll_output( struct async_poll_ioctl *async, NTSTATUS stat
return offsetof( struct afd_poll_params, sockets[count] ); return offsetof( struct afd_poll_params, sockets[count] );
} }
static NTSTATUS async_poll_proc( void *user, ULONG_PTR *info, NTSTATUS status ) static BOOL async_poll_proc( void *user, ULONG_PTR *info, NTSTATUS *status )
{ {
struct async_poll_ioctl *async = user; struct async_poll_ioctl *async = user;
if (status == STATUS_ALERTED) if (*status == STATUS_ALERTED)
{ {
SERVER_START_REQ( get_async_result ) SERVER_START_REQ( get_async_result )
{ {
req->user_arg = wine_server_client_ptr( async ); req->user_arg = wine_server_client_ptr( async );
wine_server_set_reply( req, async->sockets, async->count * sizeof(async->sockets[0]) ); wine_server_set_reply( req, async->sockets, async->count * sizeof(async->sockets[0]) );
status = wine_server_call( req ); *status = wine_server_call( req );
} }
SERVER_END_REQ; SERVER_END_REQ;
*info = fill_poll_output( async, status ); *info = fill_poll_output( async, *status );
} }
if (status != STATUS_PENDING) free( async->input );
{ release_fileio( &async->io );
free( async->input ); return TRUE;
release_fileio( &async->io );
}
return status;
} }
...@@ -877,32 +873,29 @@ static NTSTATUS try_send( int fd, struct async_send_ioctl *async ) ...@@ -877,32 +873,29 @@ static NTSTATUS try_send( int fd, struct async_send_ioctl *async )
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS async_send_proc( void *user, ULONG_PTR *info, NTSTATUS status ) static BOOL async_send_proc( void *user, ULONG_PTR *info, NTSTATUS *status )
{ {
struct async_send_ioctl *async = user; struct async_send_ioctl *async = user;
int fd, needs_close; int fd, needs_close;
TRACE( "%#x\n", status ); TRACE( "%#x\n", *status );
if (status == STATUS_ALERTED) if (*status == STATUS_ALERTED)
{ {
if ((status = server_get_unix_fd( async->io.handle, 0, &fd, &needs_close, NULL, NULL ))) if ((*status = server_get_unix_fd( async->io.handle, 0, &fd, &needs_close, NULL, NULL )))
return status; return TRUE;
status = try_send( fd, async ); *status = try_send( fd, async );
TRACE( "got status %#x\n", status ); TRACE( "got status %#x\n", *status );
if (status == STATUS_DEVICE_NOT_READY)
status = STATUS_PENDING;
if (needs_close) close( fd ); if (needs_close) close( fd );
if (*status == STATUS_DEVICE_NOT_READY)
return FALSE;
} }
if (status != STATUS_PENDING) *info = async->sent_len;
{ release_fileio( &async->io );
*info = async->sent_len; return TRUE;
release_fileio( &async->io );
}
return status;
} }
static NTSTATUS sock_send( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, static NTSTATUS sock_send( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user,
...@@ -1040,39 +1033,36 @@ static NTSTATUS try_transmit( int sock_fd, int file_fd, struct async_transmit_io ...@@ -1040,39 +1033,36 @@ static NTSTATUS try_transmit( int sock_fd, int file_fd, struct async_transmit_io
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS async_transmit_proc( void *user, ULONG_PTR *info, NTSTATUS status ) static BOOL async_transmit_proc( void *user, ULONG_PTR *info, NTSTATUS *status )
{ {
int sock_fd, file_fd = -1, sock_needs_close = FALSE, file_needs_close = FALSE; int sock_fd, file_fd = -1, sock_needs_close = FALSE, file_needs_close = FALSE;
struct async_transmit_ioctl *async = user; struct async_transmit_ioctl *async = user;
TRACE( "%#x\n", status ); TRACE( "%#x\n", *status );
if (status == STATUS_ALERTED) if (*status == STATUS_ALERTED)
{ {
if ((status = server_get_unix_fd( async->io.handle, 0, &sock_fd, &sock_needs_close, NULL, NULL ))) if ((*status = server_get_unix_fd( async->io.handle, 0, &sock_fd, &sock_needs_close, NULL, NULL )))
return status; return TRUE;
if (async->file && (status = server_get_unix_fd( async->file, 0, &file_fd, &file_needs_close, NULL, NULL ))) if (async->file && (*status = server_get_unix_fd( async->file, 0, &file_fd, &file_needs_close, NULL, NULL )))
{ {
if (sock_needs_close) close( sock_fd ); if (sock_needs_close) close( sock_fd );
return status; return TRUE;
} }
status = try_transmit( sock_fd, file_fd, async ); *status = try_transmit( sock_fd, file_fd, async );
TRACE( "got status %#x\n", status ); TRACE( "got status %#x\n", *status );
if (status == STATUS_DEVICE_NOT_READY)
status = STATUS_PENDING;
if (sock_needs_close) close( sock_fd ); if (sock_needs_close) close( sock_fd );
if (file_needs_close) close( file_fd ); if (file_needs_close) close( file_fd );
if (*status == STATUS_DEVICE_NOT_READY)
return FALSE;
} }
if (status != STATUS_PENDING) *info = async->head_cursor + async->file_cursor + async->tail_cursor;
{ release_fileio( &async->io );
*info = async->head_cursor + async->file_cursor + async->tail_cursor; return TRUE;
release_fileio( &async->io );
}
return status;
} }
static NTSTATUS sock_transmit( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, static NTSTATUS sock_transmit( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user,
......
...@@ -70,7 +70,8 @@ static inline struct ntdll_thread_data *ntdll_get_thread_data(void) ...@@ -70,7 +70,8 @@ static inline struct ntdll_thread_data *ntdll_get_thread_data(void)
return (struct ntdll_thread_data *)&NtCurrentTeb()->GdiTebBatch; return (struct ntdll_thread_data *)&NtCurrentTeb()->GdiTebBatch;
} }
typedef NTSTATUS async_callback_t( void *user, ULONG_PTR *info, NTSTATUS status ); /* returns TRUE if the async is complete; FALSE if it should be restarted */
typedef BOOL async_callback_t( void *user, ULONG_PTR *info, NTSTATUS *status );
struct async_fileio struct async_fileio
{ {
......
...@@ -677,7 +677,7 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) ...@@ -677,7 +677,7 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
if (NT_ERROR(expect_status)) if (NT_ERROR(expect_status))
ok(size == 0xdeadf00d, "got size %u\n", size); ok(size == 0xdeadf00d, "got size %u\n", size);
else if (!NT_ERROR(params->iosb_status)) else if (!NT_ERROR(params->iosb_status))
todo_wine_if (params->iosb_status == STATUS_PENDING) ok(size == 3, "got size %u\n", size); ok(size == 3, "got size %u\n", size);
/* size is garbage if !NT_ERROR(expect_status) && NT_ERROR(iosb_status) */ /* size is garbage if !NT_ERROR(expect_status) && NT_ERROR(iosb_status) */
ok(!strcmp(buffer, expect_buffer), "got buffer %s\n", buffer); ok(!strcmp(buffer, expect_buffer), "got buffer %s\n", buffer);
...@@ -694,11 +694,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) ...@@ -694,11 +694,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
} }
else else
{ {
todo_wine_if (params->iosb_status == STATUS_PENDING) ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
{ ok(io.Information == 3, "got size %Iu\n", io.Information);
ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
ok(io.Information == 3, "got size %Iu\n", io.Information);
}
} }
ok(!strcmp(buffer, expect_buffer), "got buffer %s\n", buffer); ok(!strcmp(buffer, expect_buffer), "got buffer %s\n", buffer);
...@@ -731,11 +728,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) ...@@ -731,11 +728,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
} }
else else
{ {
todo_wine_if (params->iosb_status == STATUS_PENDING) ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
{ ok(io.Information == 3, "got size %Iu\n", io.Information);
ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
ok(io.Information == 3, "got size %Iu\n", io.Information);
}
ret = WaitForSingleObject(event, 0); ret = WaitForSingleObject(event, 0);
ok(!ret, "got %d\n", ret); ok(!ret, "got %d\n", ret);
} }
...@@ -758,8 +752,7 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) ...@@ -758,8 +752,7 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
ok(key == 123, "got key %Iu\n", key); ok(key == 123, "got key %Iu\n", key);
ok(value == 456, "got value %Iu\n", value); ok(value == 456, "got value %Iu\n", value);
ok(io.Status == params->iosb_status, "got iosb status %#x\n", io.Status); ok(io.Status == params->iosb_status, "got iosb status %#x\n", io.Status);
todo_wine_if (params->iosb_status == STATUS_PENDING) ok(io.Information == 3, "got information %Iu\n", io.Information);
ok(io.Information == 3, "got information %Iu\n", io.Information);
} }
/* As above, but set the event first, to show that the event is always /* As above, but set the event first, to show that the event is always
...@@ -782,11 +775,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) ...@@ -782,11 +775,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
} }
else else
{ {
todo_wine_if (params->iosb_status == STATUS_PENDING) ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
{ ok(io.Information == 3, "got size %Iu\n", io.Information);
ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
ok(io.Information == 3, "got size %Iu\n", io.Information);
}
ret = WaitForSingleObject(event, 0); ret = WaitForSingleObject(event, 0);
ok(!ret, "got %d\n", ret); ok(!ret, "got %d\n", ret);
} }
...@@ -813,11 +803,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) ...@@ -813,11 +803,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
} }
else else
{ {
todo_wine_if (params->iosb_status == STATUS_PENDING) ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
{ ok(io.Information == 3, "got size %Iu\n", io.Information);
ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
ok(io.Information == 3, "got size %Iu\n", io.Information);
}
ret = WaitForSingleObject(file, 0); ret = WaitForSingleObject(file, 0);
ok(!ret, "got %d\n", ret); ok(!ret, "got %d\n", ret);
} }
...@@ -848,11 +835,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) ...@@ -848,11 +835,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
} }
else else
{ {
todo_wine_if (params->iosb_status == STATUS_PENDING) ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
{ ok(io.Information == 3, "got size %Iu\n", io.Information);
ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
ok(io.Information == 3, "got size %Iu\n", io.Information);
}
ret = WaitForSingleObject(event, 0); ret = WaitForSingleObject(event, 0);
ok(!ret, "got %d\n", ret); ok(!ret, "got %d\n", ret);
} }
...@@ -883,8 +867,7 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) ...@@ -883,8 +867,7 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
ok(key == 123, "got key %Iu\n", key); ok(key == 123, "got key %Iu\n", key);
ok(value == 456, "got value %Iu\n", value); ok(value == 456, "got value %Iu\n", value);
ok(io.Status == params->iosb_status, "got iosb status %#x\n", io.Status); ok(io.Status == params->iosb_status, "got iosb status %#x\n", io.Status);
todo_wine_if (params->iosb_status == STATUS_PENDING) ok(io.Information == 3, "got information %Iu\n", io.Information);
ok(io.Information == 3, "got information %Iu\n", io.Information);
} }
} }
...@@ -914,11 +897,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) ...@@ -914,11 +897,8 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
} }
else else
{ {
todo_wine_if (params->iosb_status == STATUS_PENDING) ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
{ ok(io.Information == 3, "got size %Iu\n", io.Information);
ok(io.Status == params->iosb_status, "got %#x\n", io.Status);
ok(io.Information == 3, "got size %Iu\n", io.Information);
}
} }
ok(!strcmp(buffer, expect_buffer), "got buffer %s\n", buffer); ok(!strcmp(buffer, expect_buffer), "got buffer %s\n", buffer);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment