15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/curtain_mode.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 8b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/single_thread_task_runner.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/win/windows_version.h" 10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "remoting/host/client_session_control.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CurtainModeWin : public CurtainMode { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) CurtainModeWin(); 17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overriden from CurtainMode. 19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool Activate() OVERRIDE; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CurtainModeWin); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)CurtainModeWin::CurtainModeWin() { 26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 28b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool CurtainModeWin::Activate() { 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (base::win::GetVersion() < base::win::VERSION_VISTA) { 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LOG(ERROR) << "Curtain mode is not supported on Windows XP/2003"; 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DWORD session_id; 35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!ProcessIdToSessionId(GetCurrentProcessId(), &session_id)) { 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PLOG(ERROR) << "Failed to map the current PID to session ID"; 37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 38b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 39b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // The current session is curtained if it is not attached to the local 41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // console. 42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return WTSGetActiveConsoleSessionId() != session_id; 43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<CurtainMode> CurtainMode::Create( 47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::WeakPtr<ClientSessionControl> client_session_control) { 50b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // |client_session_control| is not used because the client session is 51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // disconnected as soon as the session is re-attached to the local console. 52b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // See RdpDesktopSession for more details. 53b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return scoped_ptr<CurtainMode>(new CurtainModeWin()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 57