| Index: base/win/scoped_process_information.cc
|
| diff --git a/base/win/scoped_process_information.cc b/base/win/scoped_process_information.cc
|
| deleted file mode 100644
|
| index 634a538eece513e8218a47a9ae72fb36bb54b005..0000000000000000000000000000000000000000
|
| --- a/base/win/scoped_process_information.cc
|
| +++ /dev/null
|
| @@ -1,147 +0,0 @@
|
| -// Copyright (c) 2012 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/win/scoped_process_information.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/win/scoped_handle.h"
|
| -#include "base/win/windows_version.h"
|
| -
|
| -namespace base {
|
| -namespace win {
|
| -
|
| -namespace {
|
| -
|
| -// Duplicates source into target, returning true upon success. |target| is
|
| -// guaranteed to be untouched in case of failure. Succeeds with no side-effects
|
| -// if source is NULL.
|
| -bool CheckAndDuplicateHandle(HANDLE source, ScopedHandle* target) {
|
| - if (!source)
|
| - return true;
|
| -
|
| - HANDLE temp = NULL;
|
| -
|
| - // TODO(shrikant): Remove following code as soon as we gather some
|
| - // information regarding AppContainer related DuplicateHandle failures that
|
| - // only seem to happen on certain machine and only random launches (normally
|
| - // renderer launches seem to succeed even on those machines.)
|
| - if (base::win::GetVersion() == base::win::VERSION_WIN8 ||
|
| - base::win::GetVersion() == base::win::VERSION_WIN8_1) {
|
| - typedef LONG (WINAPI *NtDuplicateObject)(
|
| - IN HANDLE SourceProcess,
|
| - IN HANDLE SourceHandle,
|
| - IN HANDLE TargetProcess,
|
| - OUT PHANDLE TargetHandle,
|
| - IN ACCESS_MASK DesiredAccess,
|
| - IN ULONG Attributes,
|
| - IN ULONG Options);
|
| -
|
| - typedef ULONG (WINAPI *RtlNtStatusToDosError)(IN LONG Status);
|
| -
|
| - NtDuplicateObject nt_duplicate_object =
|
| - reinterpret_cast<NtDuplicateObject>(::GetProcAddress(
|
| - GetModuleHandle(L"ntdll.dll"), "NtDuplicateObject"));
|
| - if (nt_duplicate_object != NULL) {
|
| - LONG status = nt_duplicate_object(::GetCurrentProcess(), source,
|
| - ::GetCurrentProcess(), &temp,
|
| - 0, FALSE, DUPLICATE_SAME_ACCESS);
|
| - if (status < 0) {
|
| - DPLOG(ERROR) << "Failed to duplicate a handle.";
|
| - RtlNtStatusToDosError ntstatus_to_doserror =
|
| - reinterpret_cast<RtlNtStatusToDosError>(::GetProcAddress(
|
| - GetModuleHandle(L"ntdll.dll"), "RtlNtStatusToDosError"));
|
| - if (ntstatus_to_doserror != NULL) {
|
| - ::SetLastError(ntstatus_to_doserror(status));
|
| - }
|
| - return false;
|
| - }
|
| - }
|
| - } else {
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), source,
|
| - ::GetCurrentProcess(), &temp, 0, FALSE,
|
| - DUPLICATE_SAME_ACCESS)) {
|
| - DPLOG(ERROR) << "Failed to duplicate a handle.";
|
| - return false;
|
| - }
|
| - }
|
| - target->Set(temp);
|
| - return true;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -ScopedProcessInformation::ScopedProcessInformation()
|
| - : process_id_(0), thread_id_(0) {
|
| -}
|
| -
|
| -ScopedProcessInformation::ScopedProcessInformation(
|
| - const PROCESS_INFORMATION& process_info) : process_id_(0), thread_id_(0) {
|
| - Set(process_info);
|
| -}
|
| -
|
| -ScopedProcessInformation::~ScopedProcessInformation() {
|
| - Close();
|
| -}
|
| -
|
| -bool ScopedProcessInformation::IsValid() const {
|
| - return process_id_ || process_handle_.Get() ||
|
| - thread_id_ || thread_handle_.Get();
|
| -}
|
| -
|
| -void ScopedProcessInformation::Close() {
|
| - process_handle_.Close();
|
| - thread_handle_.Close();
|
| - process_id_ = 0;
|
| - thread_id_ = 0;
|
| -}
|
| -
|
| -void ScopedProcessInformation::Set(const PROCESS_INFORMATION& process_info) {
|
| - if (IsValid())
|
| - Close();
|
| -
|
| - process_handle_.Set(process_info.hProcess);
|
| - thread_handle_.Set(process_info.hThread);
|
| - process_id_ = process_info.dwProcessId;
|
| - thread_id_ = process_info.dwThreadId;
|
| -}
|
| -
|
| -bool ScopedProcessInformation::DuplicateFrom(
|
| - const ScopedProcessInformation& other) {
|
| - DCHECK(!IsValid()) << "target ScopedProcessInformation must be NULL";
|
| - DCHECK(other.IsValid()) << "source ScopedProcessInformation must be valid";
|
| -
|
| - if (CheckAndDuplicateHandle(other.process_handle(), &process_handle_) &&
|
| - CheckAndDuplicateHandle(other.thread_handle(), &thread_handle_)) {
|
| - process_id_ = other.process_id();
|
| - thread_id_ = other.thread_id();
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -PROCESS_INFORMATION ScopedProcessInformation::Take() {
|
| - PROCESS_INFORMATION process_information = {};
|
| - process_information.hProcess = process_handle_.Take();
|
| - process_information.hThread = thread_handle_.Take();
|
| - process_information.dwProcessId = process_id();
|
| - process_information.dwThreadId = thread_id();
|
| - process_id_ = 0;
|
| - thread_id_ = 0;
|
| -
|
| - return process_information;
|
| -}
|
| -
|
| -HANDLE ScopedProcessInformation::TakeProcessHandle() {
|
| - process_id_ = 0;
|
| - return process_handle_.Take();
|
| -}
|
| -
|
| -HANDLE ScopedProcessInformation::TakeThreadHandle() {
|
| - thread_id_ = 0;
|
| - return thread_handle_.Take();
|
| -}
|
| -
|
| -} // namespace win
|
| -} // namespace base
|
|
|