ntdll: Introduce server_async helper.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
05410c4aa6
commit
d92bb525b1
|
@ -418,6 +418,19 @@ static struct async_fileio *alloc_fileio( DWORD size, async_callback_t callback,
|
||||||
return io;
|
return io;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async_data_t server_async( HANDLE handle, struct async_fileio *user, HANDLE event,
|
||||||
|
PIO_APC_ROUTINE apc, void *apc_context, IO_STATUS_BLOCK *io )
|
||||||
|
{
|
||||||
|
async_data_t async;
|
||||||
|
async.handle = wine_server_obj_handle( handle );
|
||||||
|
async.callback = wine_server_client_ptr( user ? user->callback : 0 );
|
||||||
|
async.arg = wine_server_client_ptr( user );
|
||||||
|
async.iosb = wine_server_client_ptr( io );
|
||||||
|
async.event = wine_server_obj_handle( event );
|
||||||
|
async.cvalue = wine_server_client_ptr( apc ? 0 : apc_context );
|
||||||
|
return async;
|
||||||
|
}
|
||||||
|
|
||||||
/* callback for irp async I/O completion */
|
/* callback for irp async I/O completion */
|
||||||
static NTSTATUS irp_completion( void *user, IO_STATUS_BLOCK *io, NTSTATUS status, void **apc, void **arg )
|
static NTSTATUS irp_completion( void *user, IO_STATUS_BLOCK *io, NTSTATUS status, void **apc, void **arg )
|
||||||
{
|
{
|
||||||
|
@ -561,7 +574,6 @@ static NTSTATUS server_read_file( HANDLE handle, HANDLE event, PIO_APC_ROUTINE a
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
HANDLE wait_handle;
|
HANDLE wait_handle;
|
||||||
ULONG options;
|
ULONG options;
|
||||||
ULONG_PTR cvalue = apc ? 0 : (ULONG_PTR)apc_context;
|
|
||||||
|
|
||||||
if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle, apc, apc_context )))
|
if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle, apc, apc_context )))
|
||||||
return STATUS_NO_MEMORY;
|
return STATUS_NO_MEMORY;
|
||||||
|
@ -572,13 +584,8 @@ static NTSTATUS server_read_file( HANDLE handle, HANDLE event, PIO_APC_ROUTINE a
|
||||||
|
|
||||||
SERVER_START_REQ( read )
|
SERVER_START_REQ( read )
|
||||||
{
|
{
|
||||||
req->blocking = !apc && !event && !cvalue;
|
req->blocking = !apc && !event && !apc_context;
|
||||||
req->async.handle = wine_server_obj_handle( handle );
|
req->async = server_async( handle, &async->io, event, apc, apc_context, io );
|
||||||
req->async.callback = wine_server_client_ptr( irp_completion );
|
|
||||||
req->async.iosb = wine_server_client_ptr( io );
|
|
||||||
req->async.arg = wine_server_client_ptr( async );
|
|
||||||
req->async.event = wine_server_obj_handle( event );
|
|
||||||
req->async.cvalue = cvalue;
|
|
||||||
req->pos = offset ? offset->QuadPart : 0;
|
req->pos = offset ? offset->QuadPart : 0;
|
||||||
wine_server_set_reply( req, buffer, size );
|
wine_server_set_reply( req, buffer, size );
|
||||||
status = wine_server_call( req );
|
status = wine_server_call( req );
|
||||||
|
@ -608,7 +615,6 @@ static NTSTATUS server_write_file( HANDLE handle, HANDLE event, PIO_APC_ROUTINE
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
HANDLE wait_handle;
|
HANDLE wait_handle;
|
||||||
ULONG options;
|
ULONG options;
|
||||||
ULONG_PTR cvalue = apc ? 0 : (ULONG_PTR)apc_context;
|
|
||||||
|
|
||||||
if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle, apc, apc_context )))
|
if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle, apc, apc_context )))
|
||||||
return STATUS_NO_MEMORY;
|
return STATUS_NO_MEMORY;
|
||||||
|
@ -619,13 +625,8 @@ static NTSTATUS server_write_file( HANDLE handle, HANDLE event, PIO_APC_ROUTINE
|
||||||
|
|
||||||
SERVER_START_REQ( write )
|
SERVER_START_REQ( write )
|
||||||
{
|
{
|
||||||
req->blocking = !apc && !event && !cvalue;
|
req->blocking = !apc && !event && !apc_context;
|
||||||
req->async.handle = wine_server_obj_handle( handle );
|
req->async = server_async( handle, &async->io, event, apc, apc_context, io );
|
||||||
req->async.callback = wine_server_client_ptr( irp_completion );
|
|
||||||
req->async.iosb = wine_server_client_ptr( io );
|
|
||||||
req->async.arg = wine_server_client_ptr( async );
|
|
||||||
req->async.event = wine_server_obj_handle( event );
|
|
||||||
req->async.cvalue = cvalue;
|
|
||||||
req->pos = offset ? offset->QuadPart : 0;
|
req->pos = offset ? offset->QuadPart : 0;
|
||||||
wine_server_add_data( req, buffer, size );
|
wine_server_add_data( req, buffer, size );
|
||||||
status = wine_server_call( req );
|
status = wine_server_call( req );
|
||||||
|
@ -784,7 +785,6 @@ static NTSTATUS register_async_file_read( HANDLE handle, HANDLE event,
|
||||||
IO_STATUS_BLOCK *iosb, void *buffer,
|
IO_STATUS_BLOCK *iosb, void *buffer,
|
||||||
ULONG already, ULONG length, BOOL avail_mode )
|
ULONG already, ULONG length, BOOL avail_mode )
|
||||||
{
|
{
|
||||||
ULONG_PTR cvalue = apc ? 0 : (ULONG_PTR)apc_user;
|
|
||||||
struct async_fileio_read *fileio;
|
struct async_fileio_read *fileio;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
|
||||||
|
@ -800,12 +800,7 @@ static NTSTATUS register_async_file_read( HANDLE handle, HANDLE event,
|
||||||
{
|
{
|
||||||
req->type = ASYNC_TYPE_READ;
|
req->type = ASYNC_TYPE_READ;
|
||||||
req->count = length;
|
req->count = length;
|
||||||
req->async.handle = wine_server_obj_handle( handle );
|
req->async = server_async( handle, &fileio->io, event, apc, apc_user, iosb );
|
||||||
req->async.event = wine_server_obj_handle( event );
|
|
||||||
req->async.callback = wine_server_client_ptr( FILE_AsyncReadService );
|
|
||||||
req->async.iosb = wine_server_client_ptr( iosb );
|
|
||||||
req->async.arg = wine_server_client_ptr( fileio );
|
|
||||||
req->async.cvalue = cvalue;
|
|
||||||
status = wine_server_call( req );
|
status = wine_server_call( req );
|
||||||
}
|
}
|
||||||
SERVER_END_REQ;
|
SERVER_END_REQ;
|
||||||
|
@ -1364,12 +1359,7 @@ NTSTATUS WINAPI NtWriteFile(HANDLE hFile, HANDLE hEvent,
|
||||||
{
|
{
|
||||||
req->type = ASYNC_TYPE_WRITE;
|
req->type = ASYNC_TYPE_WRITE;
|
||||||
req->count = length;
|
req->count = length;
|
||||||
req->async.handle = wine_server_obj_handle( hFile );
|
req->async = server_async( hFile, &fileio->io, hEvent, apc, apc_user, io_status );
|
||||||
req->async.event = wine_server_obj_handle( hEvent );
|
|
||||||
req->async.callback = wine_server_client_ptr( FILE_AsyncWriteService );
|
|
||||||
req->async.iosb = wine_server_client_ptr( io_status );
|
|
||||||
req->async.arg = wine_server_client_ptr( fileio );
|
|
||||||
req->async.cvalue = cvalue;
|
|
||||||
status = wine_server_call( req );
|
status = wine_server_call( req );
|
||||||
}
|
}
|
||||||
SERVER_END_REQ;
|
SERVER_END_REQ;
|
||||||
|
@ -1542,7 +1532,6 @@ static NTSTATUS server_ioctl_file( HANDLE handle, HANDLE event,
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
HANDLE wait_handle;
|
HANDLE wait_handle;
|
||||||
ULONG options;
|
ULONG options;
|
||||||
ULONG_PTR cvalue = apc ? 0 : (ULONG_PTR)apc_context;
|
|
||||||
|
|
||||||
if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle, apc, apc_context )))
|
if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle, apc, apc_context )))
|
||||||
return STATUS_NO_MEMORY;
|
return STATUS_NO_MEMORY;
|
||||||
|
@ -1553,13 +1542,8 @@ static NTSTATUS server_ioctl_file( HANDLE handle, HANDLE event,
|
||||||
SERVER_START_REQ( ioctl )
|
SERVER_START_REQ( ioctl )
|
||||||
{
|
{
|
||||||
req->code = code;
|
req->code = code;
|
||||||
req->blocking = !apc && !event && !cvalue;
|
req->blocking = !apc && !event && !apc_context;
|
||||||
req->async.handle = wine_server_obj_handle( handle );
|
req->async = server_async( handle, &async->io, event, apc, apc_context, io );
|
||||||
req->async.callback = wine_server_client_ptr( irp_completion );
|
|
||||||
req->async.iosb = wine_server_client_ptr( io );
|
|
||||||
req->async.arg = wine_server_client_ptr( async );
|
|
||||||
req->async.event = wine_server_obj_handle( event );
|
|
||||||
req->async.cvalue = cvalue;
|
|
||||||
wine_server_add_data( req, in_buffer, in_size );
|
wine_server_add_data( req, in_buffer, in_size );
|
||||||
if ((code & 3) != METHOD_BUFFERED)
|
if ((code & 3) != METHOD_BUFFERED)
|
||||||
wine_server_add_data( req, out_buffer, out_size );
|
wine_server_add_data( req, out_buffer, out_size );
|
||||||
|
@ -1957,7 +1941,6 @@ NTSTATUS WINAPI NtNotifyChangeDirectoryFile( HANDLE handle, HANDLE event, PIO_AP
|
||||||
struct read_changes_fileio *fileio;
|
struct read_changes_fileio *fileio;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
ULONG size = max( 4096, buffer_size );
|
ULONG size = max( 4096, buffer_size );
|
||||||
ULONG_PTR cvalue = apc ? 0 : (ULONG_PTR)apc_context;
|
|
||||||
|
|
||||||
TRACE( "%p %p %p %p %p %p %u %u %d\n",
|
TRACE( "%p %p %p %p %p %p %u %u %d\n",
|
||||||
handle, event, apc, apc_context, iosb, buffer, buffer_size, filter, subtree );
|
handle, event, apc, apc_context, iosb, buffer, buffer_size, filter, subtree );
|
||||||
|
@ -1978,12 +1961,7 @@ NTSTATUS WINAPI NtNotifyChangeDirectoryFile( HANDLE handle, HANDLE event, PIO_AP
|
||||||
req->filter = filter;
|
req->filter = filter;
|
||||||
req->want_data = (buffer != NULL);
|
req->want_data = (buffer != NULL);
|
||||||
req->subtree = subtree;
|
req->subtree = subtree;
|
||||||
req->async.handle = wine_server_obj_handle( handle );
|
req->async = server_async( handle, &fileio->io, event, apc, apc_context, iosb );
|
||||||
req->async.callback = wine_server_client_ptr( read_changes_apc );
|
|
||||||
req->async.iosb = wine_server_client_ptr( iosb );
|
|
||||||
req->async.arg = wine_server_client_ptr( fileio );
|
|
||||||
req->async.event = wine_server_obj_handle( event );
|
|
||||||
req->async.cvalue = cvalue;
|
|
||||||
status = wine_server_call( req );
|
status = wine_server_call( req );
|
||||||
}
|
}
|
||||||
SERVER_END_REQ;
|
SERVER_END_REQ;
|
||||||
|
@ -3453,8 +3431,7 @@ NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK* IoStatusBlock
|
||||||
SERVER_START_REQ( flush )
|
SERVER_START_REQ( flush )
|
||||||
{
|
{
|
||||||
req->blocking = 1; /* always blocking */
|
req->blocking = 1; /* always blocking */
|
||||||
req->async.handle = wine_server_obj_handle( hFile );
|
req->async = server_async( hFile, NULL, NULL, NULL, NULL, IoStatusBlock );
|
||||||
req->async.iosb = wine_server_client_ptr( IoStatusBlock );
|
|
||||||
ret = wine_server_call( req );
|
ret = wine_server_call( req );
|
||||||
hEvent = wine_server_ptr_handle( reply->event );
|
hEvent = wine_server_ptr_handle( reply->event );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue