ntdll/kernel32: Pipe information.
- implemented ntdll.NtQueryInformationFile's FilePipeLocalInformation control code
- reimplemented kernel32.GetNamedPipeInfo on top of it
- enhance current features to make this work both on client and server handles
- now also returning the number of instances
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 278ccc4..2eda03e 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -721,7 +721,7 @@
release_object( pipe );
return;
}
- set_error( 0 ); /* clear the name collision */
+ clear_error(); /* clear the name collision */
}
server = create_pipe_server( pipe, req->options );
@@ -930,15 +930,29 @@
DECL_HANDLER(get_named_pipe_info)
{
struct pipe_server *server;
+ struct pipe_client *client = NULL;
- server = get_pipe_server_obj( current->process, req->handle, 0 );
+ server = get_pipe_server_obj( current->process, req->handle, FILE_READ_ATTRIBUTES );
if (!server)
- return;
+ {
+ clear_error();
+ client = (struct pipe_client *)get_handle_obj( current->process, req->handle,
+ FILE_READ_ATTRIBUTES, &pipe_client_ops );
+ if (!client) return;
+ server = client->server;
+ }
reply->flags = server->pipe->flags;
reply->maxinstances = server->pipe->maxinstances;
+ reply->instances = server->pipe->instances;
reply->insize = server->pipe->insize;
reply->outsize = server->pipe->outsize;
- release_object(server);
+ if (client)
+ release_object(client);
+ else
+ {
+ reply->flags |= NAMED_PIPE_SERVER_END;
+ release_object(server);
+ }
}