diff --git a/dlls/kernel/sync.c b/dlls/kernel/sync.c index 1638ffedc6b..833b781b138 100644 --- a/dlls/kernel/sync.c +++ b/dlls/kernel/sync.c @@ -746,9 +746,27 @@ BOOL WINAPI GetNamedPipeInfo( HANDLE hNamedPipe, LPDWORD lpFlags, LPDWORD lpOutputBufferSize, LPDWORD lpInputBufferSize, LPDWORD lpMaxInstances) { - FIXME("%d %p %p %p %p\n", hNamedPipe, lpFlags, + BOOL ret; + + TRACE("%d %p %p %p %p\n", hNamedPipe, lpFlags, lpOutputBufferSize, lpInputBufferSize, lpMaxInstances); - return FALSE; + + SERVER_START_REQ( get_named_pipe_info ) + { + req->handle = hNamedPipe; + ret = !SERVER_CALL_ERR(); + if(lpFlags) + *lpFlags = req->flags; + if(lpOutputBufferSize) + *lpOutputBufferSize = req->outsize; + if(lpInputBufferSize) + *lpInputBufferSize = req->outsize; + if(lpMaxInstances) + *lpMaxInstances = req->maxinstances; + } + SERVER_END_REQ; + + return ret; } /*********************************************************************** diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index e62090c53da..2065d1dd18f 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -1549,6 +1549,17 @@ struct disconnect_named_pipe_request handle_t handle; }; +struct get_named_pipe_info_request +{ + struct request_header __header; + handle_t handle; + unsigned int flags; + unsigned int maxinstances; + unsigned int outsize; + unsigned int insize; +}; + + enum request { @@ -1674,6 +1685,7 @@ enum request REQ_connect_named_pipe, REQ_wait_named_pipe, REQ_disconnect_named_pipe, + REQ_get_named_pipe_info, REQ_NB_REQUESTS }; @@ -1803,8 +1815,9 @@ union generic_request struct connect_named_pipe_request connect_named_pipe; struct wait_named_pipe_request wait_named_pipe; struct disconnect_named_pipe_request disconnect_named_pipe; + struct get_named_pipe_info_request get_named_pipe_info; }; -#define SERVER_PROTOCOL_VERSION 50 +#define SERVER_PROTOCOL_VERSION 51 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/named_pipe.c b/server/named_pipe.c index bc068a5c9e7..497e641c857 100644 --- a/server/named_pipe.c +++ b/server/named_pipe.c @@ -237,6 +237,15 @@ DECL_HANDLER(create_named_pipe) if(!pipe) return; + if (get_error() != STATUS_OBJECT_NAME_COLLISION) + { + pipe->insize = req->insize; + pipe->outsize = req->outsize; + pipe->maxinstances = req->maxinstances; + pipe->timeout = req->timeout; + pipe->pipemode = req->pipemode; + } + user = create_pipe_user (pipe, -1); if(user) @@ -403,3 +412,20 @@ DECL_HANDLER(disconnect_named_pipe) } release_object(user); } + +DECL_HANDLER(get_named_pipe_info) +{ + struct pipe_user *user; + + user = get_pipe_user_obj(current->process, req->handle, 0); + if(!user) + return; + + req->flags = user->pipe->pipemode; + req->maxinstances = user->pipe->maxinstances; + req->insize = user->pipe->insize; + req->outsize = user->pipe->outsize; + + release_object(user); +} + diff --git a/server/protocol.def b/server/protocol.def index 1fdb2ef8279..d6c6cd33514 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1382,3 +1382,13 @@ enum message_type @REQ(disconnect_named_pipe) handle_t handle; @END + +@REQ(get_named_pipe_info) + handle_t handle; +@REPLY + unsigned int flags; + unsigned int maxinstances; + unsigned int outsize; + unsigned int insize; +@END + diff --git a/server/request.h b/server/request.h index f0852ce5536..3187fe51c47 100644 --- a/server/request.h +++ b/server/request.h @@ -187,6 +187,7 @@ DECL_HANDLER(open_named_pipe); DECL_HANDLER(connect_named_pipe); DECL_HANDLER(wait_named_pipe); DECL_HANDLER(disconnect_named_pipe); +DECL_HANDLER(get_named_pipe_info); #ifdef WANT_REQUEST_HANDLERS @@ -315,6 +316,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = (req_handler)req_connect_named_pipe, (req_handler)req_wait_named_pipe, (req_handler)req_disconnect_named_pipe, + (req_handler)req_get_named_pipe_info, }; #endif /* WANT_REQUEST_HANDLERS */ diff --git a/server/trace.c b/server/trace.c index 71350df6814..f44d0ad2179 100644 --- a/server/trace.c +++ b/server/trace.c @@ -1639,6 +1639,19 @@ static void dump_disconnect_named_pipe_request( const struct disconnect_named_pi fprintf( stderr, " handle=%d", req->handle ); } +static void dump_get_named_pipe_info_request( const struct get_named_pipe_info_request *req ) +{ + fprintf( stderr, " handle=%d", req->handle ); +} + +static void dump_get_named_pipe_info_reply( const struct get_named_pipe_info_request *req ) +{ + fprintf( stderr, " flags=%08x,", req->flags ); + fprintf( stderr, " maxinstances=%08x,", req->maxinstances ); + fprintf( stderr, " outsize=%08x,", req->outsize ); + fprintf( stderr, " insize=%08x", req->insize ); +} + static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_new_process_request, (dump_func)dump_get_new_process_info_request, @@ -1762,6 +1775,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_connect_named_pipe_request, (dump_func)dump_wait_named_pipe_request, (dump_func)dump_disconnect_named_pipe_request, + (dump_func)dump_get_named_pipe_info_request, }; static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { @@ -1887,6 +1901,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)0, (dump_func)0, (dump_func)0, + (dump_func)dump_get_named_pipe_info_reply, }; static const char * const req_names[REQ_NB_REQUESTS] = { @@ -2012,6 +2027,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = { "connect_named_pipe", "wait_named_pipe", "disconnect_named_pipe", + "get_named_pipe_info", }; /* ### make_requests end ### */