OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/host/desktop_session_win.h" | 5 #include "remoting/host/desktop_session_win.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <sddl.h> | 8 #include <sddl.h> |
9 | 9 |
10 #include "base/base_switches.h" | 10 #include "base/base_switches.h" |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 void RdpSession::OnRdpConnected(const net::IPEndPoint& client_endpoint) { | 266 void RdpSession::OnRdpConnected(const net::IPEndPoint& client_endpoint) { |
267 DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 267 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
268 | 268 |
269 StopMonitoring(); | 269 StopMonitoring(); |
270 StartMonitoring(client_endpoint); | 270 StartMonitoring(client_endpoint); |
271 } | 271 } |
272 | 272 |
273 void RdpSession::OnRdpClosed() { | 273 void RdpSession::OnRdpClosed() { |
274 DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 274 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
275 | 275 |
276 OnPermanentError(); | 276 TerminateSession(); |
277 } | 277 } |
278 | 278 |
279 void RdpSession::SetScreenResolution(const ScreenResolution& resolution) { | 279 void RdpSession::SetScreenResolution(const ScreenResolution& resolution) { |
280 DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 280 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
281 | 281 |
282 // TODO(alexeypa): implement resize-to-client for RDP sessions here. | 282 // TODO(alexeypa): implement resize-to-client for RDP sessions here. |
283 // See http://crbug.com/137696. | 283 // See http://crbug.com/137696. |
284 NOTIMPLEMENTED(); | 284 NOTIMPLEMENTED(); |
285 } | 285 } |
286 | 286 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 418 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
419 | 419 |
420 StopMonitoring(); | 420 StopMonitoring(); |
421 } | 421 } |
422 | 422 |
423 void DesktopSessionWin::OnSessionAttachTimeout() { | 423 void DesktopSessionWin::OnSessionAttachTimeout() { |
424 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 424 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
425 | 425 |
426 LOG(ERROR) << "Session attach notification didn't arrived within " | 426 LOG(ERROR) << "Session attach notification didn't arrived within " |
427 << kSessionAttachTimeoutSeconds << " seconds."; | 427 << kSessionAttachTimeoutSeconds << " seconds."; |
428 OnPermanentError(); | 428 TerminateSession(); |
429 } | 429 } |
430 | 430 |
431 void DesktopSessionWin::StartMonitoring( | 431 void DesktopSessionWin::StartMonitoring( |
432 const net::IPEndPoint& client_endpoint) { | 432 const net::IPEndPoint& client_endpoint) { |
433 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 433 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
434 DCHECK(!monitoring_notifications_); | 434 DCHECK(!monitoring_notifications_); |
435 DCHECK(!session_attach_timer_.IsRunning()); | 435 DCHECK(!session_attach_timer_.IsRunning()); |
436 | 436 |
437 ReportElapsedTime("started monitoring"); | 437 ReportElapsedTime("started monitoring"); |
438 | 438 |
(...skipping 12 matching lines...) Expand all Loading... |
451 ReportElapsedTime("stopped monitoring"); | 451 ReportElapsedTime("stopped monitoring"); |
452 | 452 |
453 monitoring_notifications_ = false; | 453 monitoring_notifications_ = false; |
454 monitor_->RemoveWtsTerminalObserver(this); | 454 monitor_->RemoveWtsTerminalObserver(this); |
455 } | 455 } |
456 | 456 |
457 session_attach_timer_.Stop(); | 457 session_attach_timer_.Stop(); |
458 OnSessionDetached(); | 458 OnSessionDetached(); |
459 } | 459 } |
460 | 460 |
| 461 void DesktopSessionWin::TerminateSession() { |
| 462 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| 463 |
| 464 StopMonitoring(); |
| 465 |
| 466 // This call will delete |this| so it should be at the very end of the method. |
| 467 daemon_process()->CloseDesktopSession(id()); |
| 468 } |
| 469 |
461 void DesktopSessionWin::OnChannelConnected(int32 peer_pid) { | 470 void DesktopSessionWin::OnChannelConnected(int32 peer_pid) { |
462 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 471 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
463 | 472 |
464 ReportElapsedTime("channel connected"); | 473 ReportElapsedTime("channel connected"); |
465 | 474 |
466 // Obtain the handle of the desktop process. It will be passed to the network | 475 // Obtain the handle of the desktop process. It will be passed to the network |
467 // process to use to duplicate handles of shared memory objects from | 476 // process to use to duplicate handles of shared memory objects from |
468 // the desktop process. | 477 // the desktop process. |
469 desktop_process_.Set(OpenProcess(PROCESS_DUP_HANDLE, false, peer_pid)); | 478 desktop_process_.Set(OpenProcess(PROCESS_DUP_HANDLE, false, peer_pid)); |
470 if (!desktop_process_.IsValid()) { | 479 if (!desktop_process_.IsValid()) { |
(...skipping 17 matching lines...) Expand all Loading... |
488 IPC_END_MESSAGE_MAP() | 497 IPC_END_MESSAGE_MAP() |
489 | 498 |
490 if (!handled) { | 499 if (!handled) { |
491 LOG(ERROR) << "Received unexpected IPC type: " << message.type(); | 500 LOG(ERROR) << "Received unexpected IPC type: " << message.type(); |
492 CrashDesktopProcess(FROM_HERE); | 501 CrashDesktopProcess(FROM_HERE); |
493 } | 502 } |
494 | 503 |
495 return handled; | 504 return handled; |
496 } | 505 } |
497 | 506 |
498 void DesktopSessionWin::OnPermanentError() { | 507 void DesktopSessionWin::OnPermanentError(int exit_code) { |
499 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 508 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
500 | 509 |
501 StopMonitoring(); | 510 TerminateSession(); |
502 | |
503 // This call will delete |this| so it should be at the very end of the method. | |
504 daemon_process()->CloseDesktopSession(id()); | |
505 } | 511 } |
506 | 512 |
507 void DesktopSessionWin::OnSessionAttached(uint32 session_id) { | 513 void DesktopSessionWin::OnSessionAttached(uint32 session_id) { |
508 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 514 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
509 DCHECK(!launcher_); | 515 DCHECK(!launcher_); |
510 DCHECK(monitoring_notifications_); | 516 DCHECK(monitoring_notifications_); |
511 | 517 |
512 ReportElapsedTime("attached"); | 518 ReportElapsedTime("attached"); |
513 | 519 |
514 // Launch elevated on Win8 to be able to inject Alt+Tab. | 520 // Launch elevated on Win8 to be able to inject Alt+Tab. |
515 bool launch_elevated = base::win::GetVersion() >= base::win::VERSION_WIN8; | 521 bool launch_elevated = base::win::GetVersion() >= base::win::VERSION_WIN8; |
516 | 522 |
517 // Get the name of the executable to run. |kDesktopBinaryName| specifies | 523 // Get the name of the executable to run. |kDesktopBinaryName| specifies |
518 // uiAccess="true" in it's manifest. | 524 // uiAccess="true" in it's manifest. |
519 base::FilePath desktop_binary; | 525 base::FilePath desktop_binary; |
520 bool result; | 526 bool result; |
521 if (launch_elevated) { | 527 if (launch_elevated) { |
522 result = GetInstalledBinaryPath(kDesktopBinaryName, &desktop_binary); | 528 result = GetInstalledBinaryPath(kDesktopBinaryName, &desktop_binary); |
523 } else { | 529 } else { |
524 result = GetInstalledBinaryPath(kHostBinaryName, &desktop_binary); | 530 result = GetInstalledBinaryPath(kHostBinaryName, &desktop_binary); |
525 } | 531 } |
526 | 532 |
527 if (!result) { | 533 if (!result) { |
528 OnPermanentError(); | 534 TerminateSession(); |
529 return; | 535 return; |
530 } | 536 } |
531 | 537 |
532 session_attach_timer_.Stop(); | 538 session_attach_timer_.Stop(); |
533 | 539 |
534 scoped_ptr<CommandLine> target(new CommandLine(desktop_binary)); | 540 scoped_ptr<CommandLine> target(new CommandLine(desktop_binary)); |
535 target->AppendSwitchASCII(kProcessTypeSwitchName, kProcessTypeDesktop); | 541 target->AppendSwitchASCII(kProcessTypeSwitchName, kProcessTypeDesktop); |
536 // Copy the command line switches enabling verbose logging. | 542 // Copy the command line switches enabling verbose logging. |
537 target->CopySwitchesFrom(*CommandLine::ForCurrentProcess(), | 543 target->CopySwitchesFrom(*CommandLine::ForCurrentProcess(), |
538 kCopiedSwitchNames, | 544 kCopiedSwitchNames, |
539 arraysize(kCopiedSwitchNames)); | 545 arraysize(kCopiedSwitchNames)); |
540 | 546 |
541 // Create a delegate capable of launching a process in a different session. | 547 // Create a delegate capable of launching a process in a different session. |
542 scoped_ptr<WtsSessionProcessDelegate> delegate( | 548 scoped_ptr<WtsSessionProcessDelegate> delegate( |
543 new WtsSessionProcessDelegate(io_task_runner_, | 549 new WtsSessionProcessDelegate(io_task_runner_, |
544 target.Pass(), | 550 target.Pass(), |
545 launch_elevated, | 551 launch_elevated, |
546 WideToUTF8(kDaemonIpcSecurityDescriptor))); | 552 WideToUTF8(kDaemonIpcSecurityDescriptor))); |
547 if (!delegate->Initialize(session_id)) { | 553 if (!delegate->Initialize(session_id)) { |
548 OnPermanentError(); | 554 TerminateSession(); |
549 return; | 555 return; |
550 } | 556 } |
551 | 557 |
552 // Create a launcher for the desktop process, using the per-session delegate. | 558 // Create a launcher for the desktop process, using the per-session delegate. |
553 launcher_.reset(new WorkerProcessLauncher(delegate.Pass(), this)); | 559 launcher_.reset(new WorkerProcessLauncher(delegate.Pass(), this)); |
554 } | 560 } |
555 | 561 |
556 void DesktopSessionWin::OnSessionDetached() { | 562 void DesktopSessionWin::OnSessionDetached() { |
557 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 563 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
558 | 564 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 exploded.hour, | 606 exploded.hour, |
601 exploded.minute, | 607 exploded.minute, |
602 exploded.second, | 608 exploded.second, |
603 exploded.millisecond, | 609 exploded.millisecond, |
604 passed.c_str()); | 610 passed.c_str()); |
605 | 611 |
606 last_timestamp_ = now; | 612 last_timestamp_ = now; |
607 } | 613 } |
608 | 614 |
609 } // namespace remoting | 615 } // namespace remoting |
OLD | NEW |