Index: mojo/edk/embedder/named_platform_handle_utils_win.cc |
diff --git a/mojo/edk/embedder/named_platform_handle_utils_win.cc b/mojo/edk/embedder/named_platform_handle_utils_win.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ccf506217ae222e89e57de95ba85089c7fc575f0 |
--- /dev/null |
+++ b/mojo/edk/embedder/named_platform_handle_utils_win.cc |
@@ -0,0 +1,82 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "mojo/edk/embedder/named_platform_handle_utils.h" |
+ |
+#include <sddl.h> |
+#include <windows.h> |
+ |
+#include <memory> |
+ |
+#include "base/logging.h" |
+#include "base/win/windows_version.h" |
+#include "mojo/edk/embedder/named_platform_handle.h" |
+ |
+namespace mojo { |
+namespace edk { |
+ |
+ScopedPlatformHandle CreateClientHandle( |
+ const NamedPlatformHandle& named_handle) { |
+ if (!named_handle.is_valid()) |
+ return ScopedPlatformHandle(); |
+ |
+ base::string16 pipe_name = named_handle.pipe_name(); |
+ |
+ // Note: This may block. |
+ if (!WaitNamedPipeW(pipe_name.c_str(), NMPWAIT_USE_DEFAULT_WAIT)) |
+ return ScopedPlatformHandle(); |
+ |
+ const DWORD kDesiredAccess = GENERIC_READ | GENERIC_WRITE; |
+ // The SECURITY_ANONYMOUS flag means that the server side cannot impersonate |
+ // the client. |
+ const DWORD kFlags = |
+ SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS | FILE_FLAG_OVERLAPPED; |
+ ScopedPlatformHandle handle( |
+ PlatformHandle(CreateFileW(pipe_name.c_str(), kDesiredAccess, |
+ 0, // No sharing. |
+ nullptr, OPEN_EXISTING, kFlags, |
+ nullptr))); // No template file. |
+ PCHECK(handle.is_valid()); |
+ return handle; |
+} |
+ |
+ScopedPlatformHandle CreateServerHandle(const NamedPlatformHandle& named_handle, |
+ bool enforce_uniqueness) { |
+ if (!named_handle.is_valid()) |
+ return ScopedPlatformHandle(); |
+ |
+ PSECURITY_DESCRIPTOR security_desc = nullptr; |
+ ULONG security_desc_len = 0; |
+ // Create a DACL to grant: |
+ // GA = Generic All |
+ // access to: |
+ // SY = LOCAL_SYSTEM |
+ // BA = BUILTIN_ADMINISTRATORS |
+ // OW = OWNER_RIGHTS |
+ PCHECK(ConvertStringSecurityDescriptorToSecurityDescriptor( |
+ L"D:(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;OW)", SDDL_REVISION_1, |
+ &security_desc, &security_desc_len)); |
+ std::unique_ptr<void, decltype(::LocalFree)*> p(security_desc, ::LocalFree); |
+ SECURITY_ATTRIBUTES security_attributes = {sizeof(SECURITY_ATTRIBUTES), |
+ security_desc, FALSE}; |
+ |
+ const DWORD kOpenMode = enforce_uniqueness |
+ ? PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | |
+ FILE_FLAG_FIRST_PIPE_INSTANCE |
+ : PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED; |
+ const DWORD kPipeMode = |
+ PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_REJECT_REMOTE_CLIENTS; |
+ PlatformHandle handle( |
+ CreateNamedPipeW(named_handle.pipe_name().c_str(), kOpenMode, kPipeMode, |
+ enforce_uniqueness ? 1 : 255, // Max instances. |
+ 4096, // Out buffer size. |
+ 4096, // In buffer size. |
+ 5000, // Timeout in milliseconds. |
+ &security_attributes)); |
+ handle.needs_connection = true; |
+ return ScopedPlatformHandle(handle); |
+} |
+ |
+} // namespace edk |
+} // namespace mojo |