server: Add read and write requests on file objects.
This commit is contained in:
parent
860091d2fd
commit
41ea55294e
|
@ -3110,6 +3110,42 @@ struct cancel_async_reply
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct read_request
|
||||||
|
{
|
||||||
|
struct request_header __header;
|
||||||
|
int blocking;
|
||||||
|
async_data_t async;
|
||||||
|
file_pos_t pos;
|
||||||
|
};
|
||||||
|
struct read_reply
|
||||||
|
{
|
||||||
|
struct reply_header __header;
|
||||||
|
obj_handle_t wait;
|
||||||
|
unsigned int options;
|
||||||
|
/* VARARG(data,bytes); */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct write_request
|
||||||
|
{
|
||||||
|
struct request_header __header;
|
||||||
|
int blocking;
|
||||||
|
async_data_t async;
|
||||||
|
file_pos_t pos;
|
||||||
|
/* VARARG(data,bytes); */
|
||||||
|
};
|
||||||
|
struct write_reply
|
||||||
|
{
|
||||||
|
struct reply_header __header;
|
||||||
|
obj_handle_t wait;
|
||||||
|
unsigned int options;
|
||||||
|
data_size_t size;
|
||||||
|
char __pad_20[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct ioctl_request
|
struct ioctl_request
|
||||||
{
|
{
|
||||||
struct request_header __header;
|
struct request_header __header;
|
||||||
|
@ -5319,6 +5355,8 @@ enum request
|
||||||
REQ_set_serial_info,
|
REQ_set_serial_info,
|
||||||
REQ_register_async,
|
REQ_register_async,
|
||||||
REQ_cancel_async,
|
REQ_cancel_async,
|
||||||
|
REQ_read,
|
||||||
|
REQ_write,
|
||||||
REQ_ioctl,
|
REQ_ioctl,
|
||||||
REQ_set_irp_result,
|
REQ_set_irp_result,
|
||||||
REQ_get_irp_result,
|
REQ_get_irp_result,
|
||||||
|
@ -5588,6 +5626,8 @@ union generic_request
|
||||||
struct set_serial_info_request set_serial_info_request;
|
struct set_serial_info_request set_serial_info_request;
|
||||||
struct register_async_request register_async_request;
|
struct register_async_request register_async_request;
|
||||||
struct cancel_async_request cancel_async_request;
|
struct cancel_async_request cancel_async_request;
|
||||||
|
struct read_request read_request;
|
||||||
|
struct write_request write_request;
|
||||||
struct ioctl_request ioctl_request;
|
struct ioctl_request ioctl_request;
|
||||||
struct set_irp_result_request set_irp_result_request;
|
struct set_irp_result_request set_irp_result_request;
|
||||||
struct get_irp_result_request get_irp_result_request;
|
struct get_irp_result_request get_irp_result_request;
|
||||||
|
@ -5855,6 +5895,8 @@ union generic_reply
|
||||||
struct set_serial_info_reply set_serial_info_reply;
|
struct set_serial_info_reply set_serial_info_reply;
|
||||||
struct register_async_reply register_async_reply;
|
struct register_async_reply register_async_reply;
|
||||||
struct cancel_async_reply cancel_async_reply;
|
struct cancel_async_reply cancel_async_reply;
|
||||||
|
struct read_reply read_reply;
|
||||||
|
struct write_reply write_reply;
|
||||||
struct ioctl_reply ioctl_reply;
|
struct ioctl_reply ioctl_reply;
|
||||||
struct set_irp_result_reply set_irp_result_reply;
|
struct set_irp_result_reply set_irp_result_reply;
|
||||||
struct get_irp_result_reply get_irp_result_reply;
|
struct get_irp_result_reply get_irp_result_reply;
|
||||||
|
@ -5978,6 +6020,6 @@ union generic_reply
|
||||||
struct terminate_job_reply terminate_job_reply;
|
struct terminate_job_reply terminate_job_reply;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SERVER_PROTOCOL_VERSION 472
|
#define SERVER_PROTOCOL_VERSION 473
|
||||||
|
|
||||||
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
||||||
|
|
26
server/fd.c
26
server/fd.c
|
@ -2303,6 +2303,32 @@ DECL_HANDLER(get_handle_fd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* perform a read on a file object */
|
||||||
|
DECL_HANDLER(read)
|
||||||
|
{
|
||||||
|
struct fd *fd = get_handle_fd_obj( current->process, req->async.handle, FILE_READ_DATA );
|
||||||
|
|
||||||
|
if (fd)
|
||||||
|
{
|
||||||
|
reply->wait = fd->fd_ops->read( fd, &req->async, req->blocking, req->pos );
|
||||||
|
reply->options = fd->options;
|
||||||
|
release_object( fd );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* perform a write on a file object */
|
||||||
|
DECL_HANDLER(write)
|
||||||
|
{
|
||||||
|
struct fd *fd = get_handle_fd_obj( current->process, req->async.handle, FILE_WRITE_DATA );
|
||||||
|
|
||||||
|
if (fd)
|
||||||
|
{
|
||||||
|
reply->wait = fd->fd_ops->write( fd, &req->async, req->blocking, req->pos, &reply->size );
|
||||||
|
reply->options = fd->options;
|
||||||
|
release_object( fd );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* perform an ioctl on a file */
|
/* perform an ioctl on a file */
|
||||||
DECL_HANDLER(ioctl)
|
DECL_HANDLER(ioctl)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2250,6 +2250,31 @@ enum message_type
|
||||||
@END
|
@END
|
||||||
|
|
||||||
|
|
||||||
|
/* Perform a read on a file object */
|
||||||
|
@REQ(read)
|
||||||
|
int blocking; /* whether it's a blocking read */
|
||||||
|
async_data_t async; /* async I/O parameters */
|
||||||
|
file_pos_t pos; /* read position */
|
||||||
|
@REPLY
|
||||||
|
obj_handle_t wait; /* handle to wait on for blocking read */
|
||||||
|
unsigned int options; /* device open options */
|
||||||
|
VARARG(data,bytes); /* read data */
|
||||||
|
@END
|
||||||
|
|
||||||
|
|
||||||
|
/* Perform a write on a file object */
|
||||||
|
@REQ(write)
|
||||||
|
int blocking; /* whether it's a blocking write */
|
||||||
|
async_data_t async; /* async I/O parameters */
|
||||||
|
file_pos_t pos; /* write position */
|
||||||
|
VARARG(data,bytes); /* write data */
|
||||||
|
@REPLY
|
||||||
|
obj_handle_t wait; /* handle to wait on for blocking write */
|
||||||
|
unsigned int options; /* device open options */
|
||||||
|
data_size_t size; /* size written */
|
||||||
|
@END
|
||||||
|
|
||||||
|
|
||||||
/* Perform an ioctl on a file */
|
/* Perform an ioctl on a file */
|
||||||
@REQ(ioctl)
|
@REQ(ioctl)
|
||||||
ioctl_code_t code; /* ioctl code */
|
ioctl_code_t code; /* ioctl code */
|
||||||
|
|
|
@ -247,6 +247,8 @@ DECL_HANDLER(get_serial_info);
|
||||||
DECL_HANDLER(set_serial_info);
|
DECL_HANDLER(set_serial_info);
|
||||||
DECL_HANDLER(register_async);
|
DECL_HANDLER(register_async);
|
||||||
DECL_HANDLER(cancel_async);
|
DECL_HANDLER(cancel_async);
|
||||||
|
DECL_HANDLER(read);
|
||||||
|
DECL_HANDLER(write);
|
||||||
DECL_HANDLER(ioctl);
|
DECL_HANDLER(ioctl);
|
||||||
DECL_HANDLER(set_irp_result);
|
DECL_HANDLER(set_irp_result);
|
||||||
DECL_HANDLER(get_irp_result);
|
DECL_HANDLER(get_irp_result);
|
||||||
|
@ -515,6 +517,8 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
|
||||||
(req_handler)req_set_serial_info,
|
(req_handler)req_set_serial_info,
|
||||||
(req_handler)req_register_async,
|
(req_handler)req_register_async,
|
||||||
(req_handler)req_cancel_async,
|
(req_handler)req_cancel_async,
|
||||||
|
(req_handler)req_read,
|
||||||
|
(req_handler)req_write,
|
||||||
(req_handler)req_ioctl,
|
(req_handler)req_ioctl,
|
||||||
(req_handler)req_set_irp_result,
|
(req_handler)req_set_irp_result,
|
||||||
(req_handler)req_get_irp_result,
|
(req_handler)req_get_irp_result,
|
||||||
|
@ -1521,6 +1525,21 @@ C_ASSERT( FIELD_OFFSET(struct cancel_async_request, handle) == 12 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct cancel_async_request, iosb) == 16 );
|
C_ASSERT( FIELD_OFFSET(struct cancel_async_request, iosb) == 16 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct cancel_async_request, only_thread) == 24 );
|
C_ASSERT( FIELD_OFFSET(struct cancel_async_request, only_thread) == 24 );
|
||||||
C_ASSERT( sizeof(struct cancel_async_request) == 32 );
|
C_ASSERT( sizeof(struct cancel_async_request) == 32 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct read_request, blocking) == 12 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct read_request, async) == 16 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct read_request, pos) == 56 );
|
||||||
|
C_ASSERT( sizeof(struct read_request) == 64 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct read_reply, wait) == 8 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct read_reply, options) == 12 );
|
||||||
|
C_ASSERT( sizeof(struct read_reply) == 16 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct write_request, blocking) == 12 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct write_request, async) == 16 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct write_request, pos) == 56 );
|
||||||
|
C_ASSERT( sizeof(struct write_request) == 64 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct write_reply, wait) == 8 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct write_reply, options) == 12 );
|
||||||
|
C_ASSERT( FIELD_OFFSET(struct write_reply, size) == 16 );
|
||||||
|
C_ASSERT( sizeof(struct write_reply) == 24 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct ioctl_request, code) == 12 );
|
C_ASSERT( FIELD_OFFSET(struct ioctl_request, code) == 12 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct ioctl_request, async) == 16 );
|
C_ASSERT( FIELD_OFFSET(struct ioctl_request, async) == 16 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct ioctl_request, blocking) == 56 );
|
C_ASSERT( FIELD_OFFSET(struct ioctl_request, blocking) == 56 );
|
||||||
|
|
|
@ -2726,6 +2726,35 @@ static void dump_cancel_async_request( const struct cancel_async_request *req )
|
||||||
fprintf( stderr, ", only_thread=%d", req->only_thread );
|
fprintf( stderr, ", only_thread=%d", req->only_thread );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dump_read_request( const struct read_request *req )
|
||||||
|
{
|
||||||
|
fprintf( stderr, " blocking=%d", req->blocking );
|
||||||
|
dump_async_data( ", async=", &req->async );
|
||||||
|
dump_uint64( ", pos=", &req->pos );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dump_read_reply( const struct read_reply *req )
|
||||||
|
{
|
||||||
|
fprintf( stderr, " wait=%04x", req->wait );
|
||||||
|
fprintf( stderr, ", options=%08x", req->options );
|
||||||
|
dump_varargs_bytes( ", data=", cur_size );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dump_write_request( const struct write_request *req )
|
||||||
|
{
|
||||||
|
fprintf( stderr, " blocking=%d", req->blocking );
|
||||||
|
dump_async_data( ", async=", &req->async );
|
||||||
|
dump_uint64( ", pos=", &req->pos );
|
||||||
|
dump_varargs_bytes( ", data=", cur_size );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dump_write_reply( const struct write_reply *req )
|
||||||
|
{
|
||||||
|
fprintf( stderr, " wait=%04x", req->wait );
|
||||||
|
fprintf( stderr, ", options=%08x", req->options );
|
||||||
|
fprintf( stderr, ", size=%u", req->size );
|
||||||
|
}
|
||||||
|
|
||||||
static void dump_ioctl_request( const struct ioctl_request *req )
|
static void dump_ioctl_request( const struct ioctl_request *req )
|
||||||
{
|
{
|
||||||
dump_ioctl_code( " code=", &req->code );
|
dump_ioctl_code( " code=", &req->code );
|
||||||
|
@ -4292,6 +4321,8 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
|
||||||
(dump_func)dump_set_serial_info_request,
|
(dump_func)dump_set_serial_info_request,
|
||||||
(dump_func)dump_register_async_request,
|
(dump_func)dump_register_async_request,
|
||||||
(dump_func)dump_cancel_async_request,
|
(dump_func)dump_cancel_async_request,
|
||||||
|
(dump_func)dump_read_request,
|
||||||
|
(dump_func)dump_write_request,
|
||||||
(dump_func)dump_ioctl_request,
|
(dump_func)dump_ioctl_request,
|
||||||
(dump_func)dump_set_irp_result_request,
|
(dump_func)dump_set_irp_result_request,
|
||||||
(dump_func)dump_get_irp_result_request,
|
(dump_func)dump_get_irp_result_request,
|
||||||
|
@ -4557,6 +4588,8 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
(dump_func)dump_read_reply,
|
||||||
|
(dump_func)dump_write_reply,
|
||||||
(dump_func)dump_ioctl_reply,
|
(dump_func)dump_ioctl_reply,
|
||||||
NULL,
|
NULL,
|
||||||
(dump_func)dump_get_irp_result_reply,
|
(dump_func)dump_get_irp_result_reply,
|
||||||
|
@ -4822,6 +4855,8 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
|
||||||
"set_serial_info",
|
"set_serial_info",
|
||||||
"register_async",
|
"register_async",
|
||||||
"cancel_async",
|
"cancel_async",
|
||||||
|
"read",
|
||||||
|
"write",
|
||||||
"ioctl",
|
"ioctl",
|
||||||
"set_irp_result",
|
"set_irp_result",
|
||||||
"get_irp_result",
|
"get_irp_result",
|
||||||
|
|
Loading…
Reference in New Issue