| // Copyright (c) 2014 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 "components/browser_watcher/watcher_client_win.h" |
| |
| #include <windows.h> |
| |
| #include "base/command_line.h" |
| #include "base/logging.h" |
| #include "base/process/launch.h" |
| |
| namespace browser_watcher { |
| |
| namespace { |
| |
| base::Process OpenOwnProcessInheritable() { |
| return base::Process( |
| ::OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, |
| TRUE, // Ineritable handle. |
| base::GetCurrentProcId())); |
| } |
| |
| } // namespace |
| |
| WatcherClient::WatcherClient(const CommandLineGenerator& command_line_generator) |
| : command_line_generator_(command_line_generator), |
| process_(base::kNullProcessHandle) {} |
| |
| WatcherClient::~WatcherClient() { |
| } |
| |
| void WatcherClient::LaunchWatcher() { |
| DCHECK(!process_.IsValid()); |
| |
| // Build the command line for the watcher process. |
| base::Process self = OpenOwnProcessInheritable(); |
| DCHECK(self.IsValid()); |
| base::CommandLine cmd_line(command_line_generator_.Run(self.Handle())); |
| |
| base::LaunchOptions options; |
| options.start_hidden = true; |
| |
| // Launch the child process inheriting only |self|. |
| options.handles_to_inherit.push_back(self.Handle()); |
| options.handles_to_inherit.insert(options.handles_to_inherit.end(), |
| inherited_handles_.begin(), |
| inherited_handles_.end()); |
| |
| process_ = base::LaunchProcess(cmd_line, options); |
| if (!process_.IsValid()) |
| LOG(ERROR) << "Failed to launch browser watcher."; |
| } |
| |
| void WatcherClient::AddInheritedHandle(HANDLE handle) { |
| inherited_handles_.push_back(handle); |
| } |
| |
| } // namespace browser_watcher |