Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Unified Diff: remoting/host/win/wts_session_process_delegate.cc

Issue 11118005: Pass the client end handle of the network-to-daemon IPC channel via handle inheritance. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: CR feedback. Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/host/win/wts_session_process_delegate.h ('k') | remoting/remoting.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/host/win/wts_session_process_delegate.cc
diff --git a/remoting/host/win/wts_session_process_delegate.cc b/remoting/host/win/wts_session_process_delegate.cc
index 54fc92c2b5faa88aa12264f714ee26395e4caed0..088a6f11a511104816049cd76cdf89ba6980e924 100644
--- a/remoting/host/win/wts_session_process_delegate.cc
+++ b/remoting/host/win/wts_session_process_delegate.cc
@@ -7,9 +7,6 @@
#include "remoting/host/win/wts_session_process_delegate.h"
-#include <sddl.h>
-#include <limits>
-
#include "base/base_switches.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
@@ -19,10 +16,7 @@
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
-#include "base/path_service.h"
#include "base/single_thread_task_runner.h"
-#include "base/time.h"
-#include "base/timer.h"
#include "base/utf_string_conversions.h"
#include "base/win/scoped_handle.h"
#include "base/win/windows_version.h"
@@ -30,20 +24,14 @@
#include "ipc/ipc_channel_proxy.h"
#include "ipc/ipc_message.h"
#include "remoting/host/host_exit_codes.h"
+#include "remoting/host/ipc_consts.h"
#include "remoting/host/win/launch_process_with_token.h"
#include "remoting/host/win/worker_process_launcher.h"
#include "remoting/host/win/wts_console_monitor.h"
#include "remoting/host/worker_process_ipc_delegate.h"
-using base::TimeDelta;
using base::win::ScopedHandle;
-const FilePath::CharType kDaemonBinaryName[] =
- FILE_PATH_LITERAL("remoting_daemon.exe");
-
-// The command line switch specifying the name of the daemon IPC endpoint.
-const char kDaemonIpcSwitchName[] = "daemon-pipe";
-
const char kElevateSwitchName[] = "elevate";
// The command line parameters that should be copied from the service's command
@@ -66,18 +54,22 @@ class WtsSessionProcessDelegate::Core
Core(scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
const FilePath& binary_path,
- bool launch_elevated);
+ bool launch_elevated,
+ const std::string& channel_security);
// base::MessagePumpForIO::IOHandler implementation.
virtual void OnIOCompleted(base::MessagePumpForIO::IOContext* context,
DWORD bytes_transferred,
DWORD error) OVERRIDE;
+ // IPC::Sender implementation.
+ virtual bool Send(IPC::Message* message) OVERRIDE;
+
// WorkerProcessLauncher::Delegate implementation.
virtual DWORD GetExitCode() OVERRIDE;
virtual void KillProcess(DWORD exit_code) OVERRIDE;
virtual bool LaunchProcess(
- const std::string& channel_name,
+ IPC::Listener* delegate,
base::win::ScopedHandle* process_exit_event_out) OVERRIDE;
// Initializes the object returning true on success.
@@ -116,6 +108,13 @@ class WtsSessionProcessDelegate::Core
// Path to the worker process binary.
FilePath binary_path_;
+ // The server end of the IPC channel used to communicate to the worker
+ // process.
+ scoped_ptr<IPC::ChannelProxy> channel_;
+
+ // Security descriptor (as SDDL) to be applied to |channel_|.
+ std::string channel_security_;
+
// The job object used to control the lifetime of child processes.
base::win::ScopedHandle job_;
@@ -142,10 +141,12 @@ WtsSessionProcessDelegate::Core::Core(
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
const FilePath& binary_path,
- bool launch_elevated)
+ bool launch_elevated,
+ const std::string& channel_security)
: main_task_runner_(main_task_runner),
io_task_runner_(io_task_runner),
binary_path_(binary_path),
+ channel_security_(channel_security),
launch_elevated_(launch_elevated),
stopping_(false) {
DCHECK(main_task_runner_->BelongsToCurrentThread());
@@ -164,6 +165,17 @@ void WtsSessionProcessDelegate::Core::OnIOCompleted(
reinterpret_cast<DWORD>(context)));
}
+bool WtsSessionProcessDelegate::Core::Send(IPC::Message* message) {
+ DCHECK(main_task_runner_->BelongsToCurrentThread());
+
+ if (channel_.get()) {
+ return channel_->Send(message);
+ } else {
+ delete message;
+ return false;
+ }
+}
+
DWORD WtsSessionProcessDelegate::Core::GetExitCode() {
DCHECK(main_task_runner_->BelongsToCurrentThread());
@@ -182,6 +194,8 @@ DWORD WtsSessionProcessDelegate::Core::GetExitCode() {
void WtsSessionProcessDelegate::Core::KillProcess(DWORD exit_code) {
DCHECK(main_task_runner_->BelongsToCurrentThread());
+ channel_.reset();
+
if (launch_elevated_) {
if (job_.IsValid()) {
TerminateJobObject(job_, exit_code);
@@ -194,7 +208,7 @@ void WtsSessionProcessDelegate::Core::KillProcess(DWORD exit_code) {
}
bool WtsSessionProcessDelegate::Core::LaunchProcess(
- const std::string& channel_name,
+ IPC::Listener* delegate,
ScopedHandle* process_exit_event_out) {
DCHECK(main_task_runner_->BelongsToCurrentThread());
@@ -206,12 +220,9 @@ bool WtsSessionProcessDelegate::Core::LaunchProcess(
}
// Construct the helper binary name.
- FilePath dir_path;
- if (!PathService::Get(base::DIR_EXE, &dir_path)) {
- LOG(ERROR) << "Failed to get the executable file name.";
+ FilePath daemon_binary;
+ if (!GetInstalledBinaryPath(kDaemonBinaryName, &daemon_binary))
return false;
- }
- FilePath daemon_binary = dir_path.Append(kDaemonBinaryName);
// Create the command line passing the name of the IPC channel to use and
// copying known switches from the caller's command line.
@@ -223,9 +234,16 @@ bool WtsSessionProcessDelegate::Core::LaunchProcess(
command_line.SetProgram(binary_path_);
}
+ // Create the server end of the IPC channel.
+ scoped_ptr<IPC::ChannelProxy> channel;
+ std::string channel_name = GenerateIpcChannelName(this);
+ if (!CreateIpcChannel(channel_name, channel_security_, io_task_runner_,
+ delegate, &channel))
+ return false;
+
// Create the command line passing the name of the IPC channel to use and
// copying known switches from the caller's command line.
- command_line.AppendSwitchNative(kDaemonIpcSwitchName,
+ command_line.AppendSwitchNative(kDaemonPipeSwitchName,
UTF8ToWide(channel_name));
command_line.CopySwitchesFrom(*CommandLine::ForCurrentProcess(),
kCopiedSwitchNames,
@@ -237,6 +255,7 @@ bool WtsSessionProcessDelegate::Core::LaunchProcess(
if (!LaunchProcessWithToken(command_line.GetProgram(),
command_line.GetCommandLineString(),
session_token_,
+ false,
CREATE_SUSPENDED | CREATE_BREAKAWAY_FROM_JOB,
&worker_process,
&worker_thread)) {
@@ -279,6 +298,7 @@ bool WtsSessionProcessDelegate::Core::LaunchProcess(
return false;
}
+ channel_ = channel.Pass();
*process_exit_event_out = process_exit_event.Pass();
return true;
}
@@ -419,9 +439,10 @@ WtsSessionProcessDelegate::WtsSessionProcessDelegate(
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
const FilePath& binary_path,
uint32 session_id,
- bool launch_elevated) {
+ bool launch_elevated,
+ const std::string& channel_security) {
core_ = new Core(main_task_runner, io_task_runner, binary_path,
- launch_elevated);
+ launch_elevated, channel_security);
if (!core_->Initialize(session_id)) {
core_->Stop();
core_ = NULL;
@@ -432,6 +453,10 @@ WtsSessionProcessDelegate::~WtsSessionProcessDelegate() {
core_->Stop();
}
+bool WtsSessionProcessDelegate::Send(IPC::Message* message) {
+ return core_->Send(message);
+}
+
DWORD WtsSessionProcessDelegate::GetExitCode() {
if (!core_)
return CONTROL_C_EXIT;
@@ -446,12 +471,12 @@ void WtsSessionProcessDelegate::KillProcess(DWORD exit_code) {
}
bool WtsSessionProcessDelegate::LaunchProcess(
- const std::string& channel_name,
+ IPC::Listener* delegate,
base::win::ScopedHandle* process_exit_event_out) {
if (!core_)
return false;
- return core_->LaunchProcess(channel_name, process_exit_event_out);
+ return core_->LaunchProcess(delegate, process_exit_event_out);
}
} // namespace remoting
« no previous file with comments | « remoting/host/win/wts_session_process_delegate.h ('k') | remoting/remoting.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698