|  | // Copyright 2015 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 "base/memory/shared_memory_handle.h" | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "base/unguessable_token.h" | 
|  |  | 
|  | #include <windows.h> | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | SharedMemoryHandle::SharedMemoryHandle() {} | 
|  |  | 
|  | SharedMemoryHandle::SharedMemoryHandle(HANDLE h, | 
|  | size_t size, | 
|  | const base::UnguessableToken& guid) | 
|  | : handle_(h), guid_(guid), size_(size) {} | 
|  |  | 
|  | void SharedMemoryHandle::Close() const { | 
|  | DCHECK(handle_ != nullptr); | 
|  | ::CloseHandle(handle_); | 
|  | } | 
|  |  | 
|  | bool SharedMemoryHandle::IsValid() const { | 
|  | return handle_ != nullptr; | 
|  | } | 
|  |  | 
|  | SharedMemoryHandle SharedMemoryHandle::Duplicate() const { | 
|  | HANDLE duped_handle; | 
|  | ProcessHandle process = GetCurrentProcess(); | 
|  | BOOL success = ::DuplicateHandle(process, handle_, process, &duped_handle, 0, | 
|  | FALSE, DUPLICATE_SAME_ACCESS); | 
|  | if (!success) | 
|  | return SharedMemoryHandle(); | 
|  |  | 
|  | base::SharedMemoryHandle handle(duped_handle, GetSize(), GetGUID()); | 
|  | handle.SetOwnershipPassesToIPC(true); | 
|  | return handle; | 
|  | } | 
|  |  | 
|  | HANDLE SharedMemoryHandle::GetHandle() const { | 
|  | return handle_; | 
|  | } | 
|  |  | 
|  | void SharedMemoryHandle::SetOwnershipPassesToIPC(bool ownership_passes) { | 
|  | ownership_passes_to_ipc_ = ownership_passes; | 
|  | } | 
|  |  | 
|  | bool SharedMemoryHandle::OwnershipPassesToIPC() const { | 
|  | return ownership_passes_to_ipc_; | 
|  | } | 
|  |  | 
|  | }  // namespace base |