diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c index 80037cba5ec..94db1a2c864 100644 --- a/dlls/ntdll/tests/pipe.c +++ b/dlls/ntdll/tests/pipe.c @@ -1355,7 +1355,6 @@ static void test_pipe_with_data_state(HANDLE pipe, BOOL is_server, DWORD state) memset(&io, 0xcc, sizeof(io)); status = pNtQueryInformationFile(pipe, &io, &local_info, sizeof(local_info), FilePipeLocalInformation); if (!is_server && state == FILE_PIPE_DISCONNECTED_STATE) - todo_wine ok(status == STATUS_PIPE_DISCONNECTED, "NtQueryInformationFile(FilePipeLocalInformation) failed in %s state %u: %x\n", is_server ? "server" : "client", state, status); @@ -1370,7 +1369,6 @@ static void test_pipe_with_data_state(HANDLE pipe, BOOL is_server, DWORD state) status = pNtQueryInformationFile(pipe, &io, &pipe_info, sizeof(pipe_info), FilePipeInformation); if (!is_server && state == FILE_PIPE_DISCONNECTED_STATE) - todo_wine ok(status == STATUS_PIPE_DISCONNECTED, "NtQueryInformationFile(FilePipeInformation) failed in %s state %u: %x\n", is_server ? "server" : "client", state, status); @@ -1555,7 +1553,6 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state) memset(&local_info, 0xcc, sizeof(local_info)); status = pNtQueryInformationFile(pipe, &iosb, &local_info, sizeof(local_info), FilePipeLocalInformation); if (!is_server && state == FILE_PIPE_DISCONNECTED_STATE) - todo_wine ok(status == STATUS_PIPE_DISCONNECTED, "NtQueryInformationFile(FilePipeLocalInformation) failed in %s state %u: %x\n", is_server ? "server" : "client", state, status); @@ -1566,23 +1563,18 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state) if (!status) { ok(local_info.NamedPipeType == 1, "NamedPipeType = %u\n", local_info.NamedPipeType); - todo_wine_if(!is_server && (state == FILE_PIPE_CLOSING_STATE || state == FILE_PIPE_DISCONNECTED_STATE)) ok(local_info.NamedPipeConfiguration == 1, "NamedPipeConfiguration = %u\n", local_info.NamedPipeConfiguration); - todo_wine_if(!is_server && (state == FILE_PIPE_CLOSING_STATE || state == FILE_PIPE_DISCONNECTED_STATE)) ok(local_info.MaximumInstances == 1, "MaximumInstances = %u\n", local_info.MaximumInstances); if (!is_server && state == FILE_PIPE_CLOSING_STATE) ok(local_info.CurrentInstances == 0 || broken(local_info.CurrentInstances == 1 /* winxp */), "CurrentInstances = %u\n", local_info.CurrentInstances); else - todo_wine_if(!is_server && state == FILE_PIPE_DISCONNECTED_STATE) ok(local_info.CurrentInstances == 1, "CurrentInstances = %u\n", local_info.CurrentInstances); - todo_wine_if(!is_server && (state == FILE_PIPE_CLOSING_STATE || state == FILE_PIPE_DISCONNECTED_STATE)) ok(local_info.InboundQuota == 100, "InboundQuota = %u\n", local_info.InboundQuota); ok(local_info.ReadDataAvailable == 0, "ReadDataAvailable = %u\n", local_info.ReadDataAvailable); - todo_wine_if(!is_server && (state == FILE_PIPE_CLOSING_STATE || state == FILE_PIPE_DISCONNECTED_STATE)) ok(local_info.OutboundQuota == 200, "OutboundQuota = %u\n", local_info.OutboundQuota); todo_wine ok(local_info.WriteQuotaAvailable == (is_server ? 200 : 100), "WriteQuotaAvailable = %u\n", @@ -1608,7 +1600,6 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state) &attr, &iosb, FILE_SHARE_WRITE, FILE_CREATE, 0, 0, 0, 0, 1, 100, 200, &timeout); if (!local_info.CurrentInstances) - todo_wine_if(status) /* FIXME */ ok(status == STATUS_SUCCESS, "NtCreateNamedPipeFile failed: %x\n", status); else ok(status == STATUS_INSTANCE_NOT_AVAILABLE, "NtCreateNamedPipeFile failed: %x\n", status); @@ -1625,7 +1616,6 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state) ok(local_info.CurrentInstances == 0 || broken(local_info.CurrentInstances == 1 /* winxp */), "CurrentInstances = %u\n", local_info.CurrentInstances); else - todo_wine_if(!is_server && state == FILE_PIPE_DISCONNECTED_STATE) ok(local_info.CurrentInstances == 1, "CurrentInstances = %u\n", local_info.CurrentInstances); } @@ -1633,7 +1623,6 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state) memset(&iosb, 0xcc, sizeof(iosb)); status = pNtQueryInformationFile(pipe, &iosb, &pipe_info, sizeof(pipe_info), FilePipeInformation); if (!is_server && state == FILE_PIPE_DISCONNECTED_STATE) - todo_wine ok(status == STATUS_PIPE_DISCONNECTED, "NtQueryInformationFile(FilePipeLocalInformation) failed in %s state %u: %x\n", is_server ? "server" : "client", state, status); diff --git a/server/named_pipe.c b/server/named_pipe.c index 95c2442b3b3..e6e497bb086 100644 --- a/server/named_pipe.c +++ b/server/named_pipe.c @@ -1354,39 +1354,35 @@ DECL_HANDLER(create_named_pipe) DECL_HANDLER(get_named_pipe_info) { - struct pipe_server *server; - struct pipe_client *client = NULL; + struct pipe_end *pipe_end; - server = get_pipe_server_obj( current->process, req->handle, FILE_READ_ATTRIBUTES ); - if (!server) + 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(); - client = (struct pipe_client *)get_handle_obj( current->process, req->handle, - 0, &pipe_client_ops ); - if (!client) return; - server = client->server; + pipe_end = (struct pipe_end *)get_handle_obj( current->process, req->handle, + 0, &pipe_client_ops ); + if (!pipe_end) return; } - reply->flags = client ? client->pipe_end.flags : server->pipe_end.flags; - if (server) + if (pipe_end->pipe) { - reply->sharing = server->pipe->sharing; - reply->maxinstances = server->pipe->maxinstances; - reply->instances = server->pipe->instances; - reply->insize = server->pipe->insize; - reply->outsize = server->pipe->outsize; - } + 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 (client) - release_object(client); - else - { - reply->flags |= NAMED_PIPE_SERVER_END; - release_object(server); + 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)