diff options
author | Constantin Kaplinsky <const@tightvnc.com> | 2006-05-25 05:12:25 +0000 |
---|---|---|
committer | Constantin Kaplinsky <const@tightvnc.com> | 2006-05-25 05:12:25 +0000 |
commit | 729598cb00d791bbdfe23ebe0023d3a1c3962f83 (patch) | |
tree | ffe1b87705a0541998b8d7c44ea75dc4702dc515 /win/rfb_win32/TsSessions.cxx | |
parent | b30ae7facbdf8273f34f5d67d3d2e9c81db75576 (diff) | |
download | tigervnc-729598cb00d791bbdfe23ebe0023d3a1c3962f83.tar.gz tigervnc-729598cb00d791bbdfe23ebe0023d3a1c3962f83.zip |
Migrating to new directory structure adopted from the RealVNC's source tree. More changes will follow.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@591 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'win/rfb_win32/TsSessions.cxx')
-rw-r--r-- | win/rfb_win32/TsSessions.cxx | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/win/rfb_win32/TsSessions.cxx b/win/rfb_win32/TsSessions.cxx new file mode 100644 index 00000000..efe75640 --- /dev/null +++ b/win/rfb_win32/TsSessions.cxx @@ -0,0 +1,93 @@ +/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#include <rfb_win32/TsSessions.h> +#include <rfb_win32/DynamicFn.h> +#include <rfb/LogWriter.h> +#include <rdr/Exception.h> +#include <tchar.h> + +#ifdef ERROR_CTX_WINSTATION_BUSY +#define RFB_HAVE_WINSTATION_CONNECT +#else +#pragma message(" NOTE: Not building WinStationConnect support.") +#endif + +static rfb::LogWriter vlog("TsSessions"); + +namespace rfb { +namespace win32 { + + // Windows XP (and later) functions used to handle session Ids + typedef BOOLEAN (WINAPI *_WinStationConnect_proto) (HANDLE,ULONG,ULONG,PCWSTR,ULONG); + DynamicFn<_WinStationConnect_proto> _WinStationConnect(_T("winsta.dll"), "WinStationConnectW"); + typedef DWORD (WINAPI *_WTSGetActiveConsoleSessionId_proto) (); + DynamicFn<_WTSGetActiveConsoleSessionId_proto> _WTSGetActiveConsoleSessionId(_T("kernel32.dll"), "WTSGetActiveConsoleSessionId"); + typedef BOOL (WINAPI *_ProcessIdToSessionId_proto) (DWORD, DWORD*); + DynamicFn<_ProcessIdToSessionId_proto> _ProcessIdToSessionId(_T("kernel32.dll"), "ProcessIdToSessionId"); + typedef BOOL (WINAPI *_LockWorkStation_proto)(); + DynamicFn<_LockWorkStation_proto> _LockWorkStation(_T("user32.dll"), "LockWorkStation"); + + + ProcessSessionId::ProcessSessionId(DWORD processId) { + id = 0; + if (!_ProcessIdToSessionId.isValid()) + return; + if (processId == -1) + processId = GetCurrentProcessId(); + if (!(*_ProcessIdToSessionId)(GetCurrentProcessId(), &id)) + throw rdr::SystemException("ProcessIdToSessionId", GetLastError()); + } + + ProcessSessionId mySessionId; + + ConsoleSessionId::ConsoleSessionId() { + if (_WTSGetActiveConsoleSessionId.isValid()) + id = (*_WTSGetActiveConsoleSessionId)(); + else + id = 0; + } + + bool inConsoleSession() { + ConsoleSessionId console; + return console.id == mySessionId.id; + } + + void setConsoleSession(DWORD sessionId) { +#ifdef RFB_HAVE_WINSTATION_CONNECT + if (!_WinStationConnect.isValid()) + throw rdr::Exception("WinSta APIs missing"); + if (sessionId == -1) + sessionId = mySessionId.id; + + // Try to reconnect our session to the console + ConsoleSessionId console; + vlog.info("Console session is %d", console.id); + if (!(*_WinStationConnect)(0, sessionId, console.id, L"", 0)) + throw rdr::SystemException("Unable to connect session to Console", GetLastError()); + + // Lock the newly connected session, for security + if (_LockWorkStation.isValid()) + (*_LockWorkStation)(); +#else + throw rdr::Exception("setConsoleSession not implemented"); +#endif + } + +}; +}; |