mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 19:49:50 +00:00
server: Use pipe_end_get_file_info for FilePipeInformation implementation.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
36c6a16c62
commit
5f43a1b93e
6 changed files with 25 additions and 114 deletions
|
@ -2312,7 +2312,7 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE hFile, PIO_STATUS_BLOCK io,
|
||||||
if (len < info_sizes[class])
|
if (len < info_sizes[class])
|
||||||
return io->u.Status = STATUS_INFO_LENGTH_MISMATCH;
|
return io->u.Status = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
|
||||||
if (class != FilePipeInformation && class != FileAccessInformation)
|
if (class != FileAccessInformation)
|
||||||
{
|
{
|
||||||
if ((io->u.Status = server_get_unix_fd( hFile, 0, &fd, &needs_close, NULL, NULL )))
|
if ((io->u.Status = server_get_unix_fd( hFile, 0, &fd, &needs_close, NULL, NULL )))
|
||||||
{
|
{
|
||||||
|
@ -2442,24 +2442,6 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE hFile, PIO_STATUS_BLOCK io,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FilePipeInformation:
|
|
||||||
{
|
|
||||||
FILE_PIPE_INFORMATION* pi = ptr;
|
|
||||||
|
|
||||||
SERVER_START_REQ( get_named_pipe_info )
|
|
||||||
{
|
|
||||||
req->handle = wine_server_obj_handle( hFile );
|
|
||||||
if (!(io->u.Status = wine_server_call( req )))
|
|
||||||
{
|
|
||||||
pi->ReadMode = (reply->flags & NAMED_PIPE_MESSAGE_STREAM_READ) ?
|
|
||||||
FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE;
|
|
||||||
pi->CompletionMode = (reply->flags & NAMED_PIPE_NONBLOCKING_MODE) ?
|
|
||||||
FILE_PIPE_COMPLETE_OPERATION : FILE_PIPE_QUEUE_OPERATION;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SERVER_END_REQ;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FileNameInformation:
|
case FileNameInformation:
|
||||||
{
|
{
|
||||||
FILE_NAME_INFORMATION *info = ptr;
|
FILE_NAME_INFORMATION *info = ptr;
|
||||||
|
|
|
@ -3419,23 +3419,6 @@ struct create_named_pipe_reply
|
||||||
#define NAMED_PIPE_SERVER_END 0x8000
|
#define NAMED_PIPE_SERVER_END 0x8000
|
||||||
|
|
||||||
|
|
||||||
struct get_named_pipe_info_request
|
|
||||||
{
|
|
||||||
struct request_header __header;
|
|
||||||
obj_handle_t handle;
|
|
||||||
};
|
|
||||||
struct get_named_pipe_info_reply
|
|
||||||
{
|
|
||||||
struct reply_header __header;
|
|
||||||
unsigned int flags;
|
|
||||||
unsigned int sharing;
|
|
||||||
unsigned int maxinstances;
|
|
||||||
unsigned int instances;
|
|
||||||
unsigned int outsize;
|
|
||||||
unsigned int insize;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct set_named_pipe_info_request
|
struct set_named_pipe_info_request
|
||||||
{
|
{
|
||||||
struct request_header __header;
|
struct request_header __header;
|
||||||
|
@ -5805,7 +5788,6 @@ enum request
|
||||||
REQ_ioctl,
|
REQ_ioctl,
|
||||||
REQ_set_irp_result,
|
REQ_set_irp_result,
|
||||||
REQ_create_named_pipe,
|
REQ_create_named_pipe,
|
||||||
REQ_get_named_pipe_info,
|
|
||||||
REQ_set_named_pipe_info,
|
REQ_set_named_pipe_info,
|
||||||
REQ_create_window,
|
REQ_create_window,
|
||||||
REQ_destroy_window,
|
REQ_destroy_window,
|
||||||
|
@ -6102,7 +6084,6 @@ union generic_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 create_named_pipe_request create_named_pipe_request;
|
struct create_named_pipe_request create_named_pipe_request;
|
||||||
struct get_named_pipe_info_request get_named_pipe_info_request;
|
|
||||||
struct set_named_pipe_info_request set_named_pipe_info_request;
|
struct set_named_pipe_info_request set_named_pipe_info_request;
|
||||||
struct create_window_request create_window_request;
|
struct create_window_request create_window_request;
|
||||||
struct destroy_window_request destroy_window_request;
|
struct destroy_window_request destroy_window_request;
|
||||||
|
@ -6397,7 +6378,6 @@ union generic_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 create_named_pipe_reply create_named_pipe_reply;
|
struct create_named_pipe_reply create_named_pipe_reply;
|
||||||
struct get_named_pipe_info_reply get_named_pipe_info_reply;
|
|
||||||
struct set_named_pipe_info_reply set_named_pipe_info_reply;
|
struct set_named_pipe_info_reply set_named_pipe_info_reply;
|
||||||
struct create_window_reply create_window_reply;
|
struct create_window_reply create_window_reply;
|
||||||
struct destroy_window_reply destroy_window_reply;
|
struct destroy_window_reply destroy_window_reply;
|
||||||
|
@ -6532,6 +6512,6 @@ union generic_reply
|
||||||
struct terminate_job_reply terminate_job_reply;
|
struct terminate_job_reply terminate_job_reply;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SERVER_PROTOCOL_VERSION 566
|
#define SERVER_PROTOCOL_VERSION 567
|
||||||
|
|
||||||
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
||||||
|
|
|
@ -555,6 +555,29 @@ static void pipe_end_get_file_info( struct fd *fd, obj_handle_t handle, unsigned
|
||||||
if (reply_size) memcpy( &name_info->FileName[1], name, reply_size );
|
if (reply_size) memcpy( &name_info->FileName[1], name, reply_size );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FilePipeInformation:
|
||||||
|
{
|
||||||
|
FILE_PIPE_INFORMATION *pipe_info;
|
||||||
|
|
||||||
|
if (!(get_handle_access( current->process, handle) & FILE_READ_ATTRIBUTES))
|
||||||
|
{
|
||||||
|
set_error( STATUS_ACCESS_DENIED );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_reply_max_size() < sizeof(*pipe_info))
|
||||||
|
{
|
||||||
|
set_error( STATUS_INFO_LENGTH_MISMATCH );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(pipe_info = set_reply_data_size( sizeof(*pipe_info) ))) return;
|
||||||
|
pipe_info->ReadMode = (pipe_end->flags & NAMED_PIPE_MESSAGE_STREAM_READ)
|
||||||
|
? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE;
|
||||||
|
pipe_info->CompletionMode = (pipe_end->flags & NAMED_PIPE_NONBLOCKING_MODE)
|
||||||
|
? FILE_PIPE_COMPLETE_OPERATION : FILE_PIPE_QUEUE_OPERATION;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case FilePipeLocalInformation:
|
case FilePipeLocalInformation:
|
||||||
{
|
{
|
||||||
FILE_PIPE_LOCAL_INFORMATION *pipe_info;
|
FILE_PIPE_LOCAL_INFORMATION *pipe_info;
|
||||||
|
@ -1320,39 +1343,6 @@ DECL_HANDLER(create_named_pipe)
|
||||||
release_object( pipe );
|
release_object( pipe );
|
||||||
}
|
}
|
||||||
|
|
||||||
DECL_HANDLER(get_named_pipe_info)
|
|
||||||
{
|
|
||||||
struct pipe_end *pipe_end;
|
|
||||||
|
|
||||||
pipe_end = (struct pipe_end *)get_handle_obj( current->process, req->handle,
|
|
||||||
FILE_READ_ATTRIBUTES, &pipe_server_ops );
|
|
||||||
if (!pipe_end)
|
|
||||||
{
|
|
||||||
if (get_error() != STATUS_OBJECT_TYPE_MISMATCH)
|
|
||||||
return;
|
|
||||||
|
|
||||||
clear_error();
|
|
||||||
pipe_end = (struct pipe_end *)get_handle_obj( current->process, req->handle,
|
|
||||||
FILE_READ_ATTRIBUTES, &pipe_client_ops );
|
|
||||||
if (!pipe_end) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pipe_end->pipe)
|
|
||||||
{
|
|
||||||
reply->flags = pipe_end->flags;
|
|
||||||
reply->sharing = pipe_end->pipe->sharing;
|
|
||||||
reply->maxinstances = pipe_end->pipe->maxinstances;
|
|
||||||
reply->instances = pipe_end->pipe->instances;
|
|
||||||
reply->insize = pipe_end->pipe->insize;
|
|
||||||
reply->outsize = pipe_end->pipe->outsize;
|
|
||||||
|
|
||||||
if (pipe_end->obj.ops == &pipe_server_ops) reply->flags |= NAMED_PIPE_SERVER_END;
|
|
||||||
}
|
|
||||||
else set_error( STATUS_PIPE_DISCONNECTED );
|
|
||||||
|
|
||||||
release_object( pipe_end );
|
|
||||||
}
|
|
||||||
|
|
||||||
DECL_HANDLER(set_named_pipe_info)
|
DECL_HANDLER(set_named_pipe_info)
|
||||||
{
|
{
|
||||||
struct pipe_end *pipe_end;
|
struct pipe_end *pipe_end;
|
||||||
|
|
|
@ -2459,18 +2459,6 @@ enum message_type
|
||||||
#define NAMED_PIPE_NONBLOCKING_MODE 0x0004
|
#define NAMED_PIPE_NONBLOCKING_MODE 0x0004
|
||||||
#define NAMED_PIPE_SERVER_END 0x8000
|
#define NAMED_PIPE_SERVER_END 0x8000
|
||||||
|
|
||||||
/* Get named pipe information by handle */
|
|
||||||
@REQ(get_named_pipe_info)
|
|
||||||
obj_handle_t handle;
|
|
||||||
@REPLY
|
|
||||||
unsigned int flags;
|
|
||||||
unsigned int sharing;
|
|
||||||
unsigned int maxinstances;
|
|
||||||
unsigned int instances;
|
|
||||||
unsigned int outsize;
|
|
||||||
unsigned int insize;
|
|
||||||
@END
|
|
||||||
|
|
||||||
/* Set named pipe information by handle */
|
/* Set named pipe information by handle */
|
||||||
@REQ(set_named_pipe_info)
|
@REQ(set_named_pipe_info)
|
||||||
obj_handle_t handle;
|
obj_handle_t handle;
|
||||||
|
|
|
@ -269,7 +269,6 @@ DECL_HANDLER(write);
|
||||||
DECL_HANDLER(ioctl);
|
DECL_HANDLER(ioctl);
|
||||||
DECL_HANDLER(set_irp_result);
|
DECL_HANDLER(set_irp_result);
|
||||||
DECL_HANDLER(create_named_pipe);
|
DECL_HANDLER(create_named_pipe);
|
||||||
DECL_HANDLER(get_named_pipe_info);
|
|
||||||
DECL_HANDLER(set_named_pipe_info);
|
DECL_HANDLER(set_named_pipe_info);
|
||||||
DECL_HANDLER(create_window);
|
DECL_HANDLER(create_window);
|
||||||
DECL_HANDLER(destroy_window);
|
DECL_HANDLER(destroy_window);
|
||||||
|
@ -565,7 +564,6 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
|
||||||
(req_handler)req_ioctl,
|
(req_handler)req_ioctl,
|
||||||
(req_handler)req_set_irp_result,
|
(req_handler)req_set_irp_result,
|
||||||
(req_handler)req_create_named_pipe,
|
(req_handler)req_create_named_pipe,
|
||||||
(req_handler)req_get_named_pipe_info,
|
|
||||||
(req_handler)req_set_named_pipe_info,
|
(req_handler)req_set_named_pipe_info,
|
||||||
(req_handler)req_create_window,
|
(req_handler)req_create_window,
|
||||||
(req_handler)req_destroy_window,
|
(req_handler)req_destroy_window,
|
||||||
|
@ -1647,15 +1645,6 @@ C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, flags) == 48 );
|
||||||
C_ASSERT( sizeof(struct create_named_pipe_request) == 56 );
|
C_ASSERT( sizeof(struct create_named_pipe_request) == 56 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct create_named_pipe_reply, handle) == 8 );
|
C_ASSERT( FIELD_OFFSET(struct create_named_pipe_reply, handle) == 8 );
|
||||||
C_ASSERT( sizeof(struct create_named_pipe_reply) == 16 );
|
C_ASSERT( sizeof(struct create_named_pipe_reply) == 16 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct get_named_pipe_info_request, handle) == 12 );
|
|
||||||
C_ASSERT( sizeof(struct get_named_pipe_info_request) == 16 );
|
|
||||||
C_ASSERT( FIELD_OFFSET(struct get_named_pipe_info_reply, flags) == 8 );
|
|
||||||
C_ASSERT( FIELD_OFFSET(struct get_named_pipe_info_reply, sharing) == 12 );
|
|
||||||
C_ASSERT( FIELD_OFFSET(struct get_named_pipe_info_reply, maxinstances) == 16 );
|
|
||||||
C_ASSERT( FIELD_OFFSET(struct get_named_pipe_info_reply, instances) == 20 );
|
|
||||||
C_ASSERT( FIELD_OFFSET(struct get_named_pipe_info_reply, outsize) == 24 );
|
|
||||||
C_ASSERT( FIELD_OFFSET(struct get_named_pipe_info_reply, insize) == 28 );
|
|
||||||
C_ASSERT( sizeof(struct get_named_pipe_info_reply) == 32 );
|
|
||||||
C_ASSERT( FIELD_OFFSET(struct set_named_pipe_info_request, handle) == 12 );
|
C_ASSERT( FIELD_OFFSET(struct set_named_pipe_info_request, handle) == 12 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct set_named_pipe_info_request, flags) == 16 );
|
C_ASSERT( FIELD_OFFSET(struct set_named_pipe_info_request, flags) == 16 );
|
||||||
C_ASSERT( sizeof(struct set_named_pipe_info_request) == 24 );
|
C_ASSERT( sizeof(struct set_named_pipe_info_request) == 24 );
|
||||||
|
|
|
@ -3020,21 +3020,6 @@ static void dump_create_named_pipe_reply( const struct create_named_pipe_reply *
|
||||||
fprintf( stderr, " handle=%04x", req->handle );
|
fprintf( stderr, " handle=%04x", req->handle );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_get_named_pipe_info_request( const struct get_named_pipe_info_request *req )
|
|
||||||
{
|
|
||||||
fprintf( stderr, " handle=%04x", req->handle );
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_get_named_pipe_info_reply( const struct get_named_pipe_info_reply *req )
|
|
||||||
{
|
|
||||||
fprintf( stderr, " flags=%08x", req->flags );
|
|
||||||
fprintf( stderr, ", sharing=%08x", req->sharing );
|
|
||||||
fprintf( stderr, ", maxinstances=%08x", req->maxinstances );
|
|
||||||
fprintf( stderr, ", instances=%08x", req->instances );
|
|
||||||
fprintf( stderr, ", outsize=%08x", req->outsize );
|
|
||||||
fprintf( stderr, ", insize=%08x", req->insize );
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_set_named_pipe_info_request( const struct set_named_pipe_info_request *req )
|
static void dump_set_named_pipe_info_request( const struct set_named_pipe_info_request *req )
|
||||||
{
|
{
|
||||||
fprintf( stderr, " handle=%04x", req->handle );
|
fprintf( stderr, " handle=%04x", req->handle );
|
||||||
|
@ -4700,7 +4685,6 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
|
||||||
(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_create_named_pipe_request,
|
(dump_func)dump_create_named_pipe_request,
|
||||||
(dump_func)dump_get_named_pipe_info_request,
|
|
||||||
(dump_func)dump_set_named_pipe_info_request,
|
(dump_func)dump_set_named_pipe_info_request,
|
||||||
(dump_func)dump_create_window_request,
|
(dump_func)dump_create_window_request,
|
||||||
(dump_func)dump_destroy_window_request,
|
(dump_func)dump_destroy_window_request,
|
||||||
|
@ -4993,7 +4977,6 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
|
||||||
(dump_func)dump_ioctl_reply,
|
(dump_func)dump_ioctl_reply,
|
||||||
NULL,
|
NULL,
|
||||||
(dump_func)dump_create_named_pipe_reply,
|
(dump_func)dump_create_named_pipe_reply,
|
||||||
(dump_func)dump_get_named_pipe_info_reply,
|
|
||||||
NULL,
|
NULL,
|
||||||
(dump_func)dump_create_window_reply,
|
(dump_func)dump_create_window_reply,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -5286,7 +5269,6 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
|
||||||
"ioctl",
|
"ioctl",
|
||||||
"set_irp_result",
|
"set_irp_result",
|
||||||
"create_named_pipe",
|
"create_named_pipe",
|
||||||
"get_named_pipe_info",
|
|
||||||
"set_named_pipe_info",
|
"set_named_pipe_info",
|
||||||
"create_window",
|
"create_window",
|
||||||
"destroy_window",
|
"destroy_window",
|
||||||
|
|
Loading…
Reference in a new issue