VirtualBox

source: vbox/trunk/src/VBox/Main/include/ConsoleVRDPServer.h

Last change on this file was 100615, checked in by vboxsync, 10 months ago

Shared Clipboard: Renaming (PFNVRDPCLIPBOARDEXTCALLBACK -> PFNSHCLEXTCALLBACK). bugref:9437

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.8 KB
Line 
1/* $Id: ConsoleVRDPServer.h 100615 2023-07-17 17:53:59Z vboxsync $ */
2/** @file
3 * VBox Console VRDE Server Helper class and implementation of IVRDEServerInfo
4 */
5
6/*
7 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28#ifndef MAIN_INCLUDED_ConsoleVRDPServer_h
29#define MAIN_INCLUDED_ConsoleVRDPServer_h
30#ifndef RT_WITHOUT_PRAGMA_ONCE
31# pragma once
32#endif
33
34#include "VRDEServerInfoWrap.h"
35#include "RemoteUSBBackend.h"
36#include "HGCM.h"
37
38#include "AuthLibrary.h"
39
40#include <VBox/RemoteDesktop/VRDEImage.h>
41#include <VBox/RemoteDesktop/VRDEMousePtr.h>
42#include <VBox/RemoteDesktop/VRDESCard.h>
43#include <VBox/RemoteDesktop/VRDETSMF.h>
44#define VRDE_VIDEOIN_WITH_VRDEINTERFACE /* Get the VRDE interface definitions. */
45#include <VBox/RemoteDesktop/VRDEVideoIn.h>
46#include <VBox/RemoteDesktop/VRDEInput.h>
47
48#include <VBox/HostServices/VBoxClipboardExt.h>
49#include <VBox/HostServices/VBoxHostChannel.h>
50
51#include "SchemaDefs.h"
52
53// ConsoleVRDPServer
54///////////////////////////////////////////////////////////////////////////////
55
56class EmWebcam;
57
58typedef struct _VRDPInputSynch
59{
60 int cGuestNumLockAdaptions;
61 int cGuestCapsLockAdaptions;
62
63 bool fGuestNumLock;
64 bool fGuestCapsLock;
65 bool fGuestScrollLock;
66
67 bool fClientNumLock;
68 bool fClientCapsLock;
69 bool fClientScrollLock;
70} VRDPInputSynch;
71
72/* Member of Console. Helper class for VRDP server management. Not a COM class. */
73class ConsoleVRDPServer
74{
75public:
76 DECLARE_TRANSLATE_METHODS(ConsoleVRDPServer)
77
78 ConsoleVRDPServer (Console *console);
79 ~ConsoleVRDPServer ();
80
81 int Launch (void);
82
83 void NotifyAbsoluteMouse (bool fGuestWantsAbsolute)
84 {
85 m_fGuestWantsAbsolute = fGuestWantsAbsolute;
86 }
87
88 void NotifyKeyboardLedsChange (BOOL fNumLock, BOOL fCapsLock, BOOL fScrollLock)
89 {
90 bool fGuestNumLock = (fNumLock != FALSE);
91 bool fGuestCapsLock = (fCapsLock != FALSE);
92 bool fGuestScrollLock = (fScrollLock != FALSE);
93
94 /* Might need to resync in case the guest itself changed the LED status. */
95 if (m_InputSynch.fClientNumLock != fGuestNumLock)
96 {
97 m_InputSynch.cGuestNumLockAdaptions = 2;
98 }
99
100 if (m_InputSynch.fClientCapsLock != fGuestCapsLock)
101 {
102 m_InputSynch.cGuestCapsLockAdaptions = 2;
103 }
104
105 m_InputSynch.fGuestNumLock = fGuestNumLock;
106 m_InputSynch.fGuestCapsLock = fGuestCapsLock;
107 m_InputSynch.fGuestScrollLock = fGuestScrollLock;
108 }
109
110 void EnableConnections (void);
111 void DisconnectClient (uint32_t u32ClientId, bool fReconnect);
112 int MousePointer(BOOL alpha, ULONG xHot, ULONG yHot, ULONG width, ULONG height, const uint8_t *pu8Shape);
113 void MousePointerUpdate (const VRDECOLORPOINTER *pPointer);
114 void MousePointerHide (void);
115
116 void Stop (void);
117
118 AuthResult Authenticate (const Guid &uuid, AuthGuestJudgement guestJudgement,
119 const char *pszUser, const char *pszPassword, const char *pszDomain,
120 uint32_t u32ClientId);
121
122 void AuthDisconnect (const Guid &uuid, uint32_t u32ClientId);
123
124 void USBBackendCreate (uint32_t u32ClientId, void **ppvIntercept);
125 void USBBackendDelete (uint32_t u32ClientId);
126
127 void *USBBackendRequestPointer (uint32_t u32ClientId, const Guid *pGuid);
128 void USBBackendReleasePointer (const Guid *pGuid);
129
130 /* Private interface for the RemoteUSBBackend destructor. */
131 void usbBackendRemoveFromList (RemoteUSBBackend *pRemoteUSBBackend);
132
133 /* Private methods for the Remote USB thread. */
134 RemoteUSBBackend *usbBackendGetNext (RemoteUSBBackend *pRemoteUSBBackend);
135
136 void notifyRemoteUSBThreadRunning (RTTHREAD thread);
137 bool isRemoteUSBThreadRunning (void);
138 void waitRemoteUSBThreadEvent (RTMSINTERVAL cMillies);
139
140 void ClipboardCreate (uint32_t u32ClientId);
141 void ClipboardDelete (uint32_t u32ClientId);
142
143 /*
144 * Forwarders to VRDP server library.
145 */
146 void SendUpdate (unsigned uScreenId, void *pvUpdate, uint32_t cbUpdate) const;
147 void SendResize (void);
148 void SendUpdateBitmap (unsigned uScreenId, uint32_t x, uint32_t y, uint32_t w, uint32_t h) const;
149
150 void SendAudioSamples (void const *pvSamples, uint32_t cSamples, VRDEAUDIOFORMAT format) const;
151 void SendAudioVolume (uint16_t left, uint16_t right) const;
152 void SendUSBRequest (uint32_t u32ClientId, void *pvParms, uint32_t cbParms) const;
153
154 void QueryInfo (uint32_t index, void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut) const;
155
156 int SendAudioInputBegin(void **ppvUserCtx,
157 void *pvContext,
158 uint32_t cSamples,
159 uint32_t iSampleHz,
160 uint32_t cChannels,
161 uint32_t cBits);
162
163 void SendAudioInputEnd(void *pvUserCtx);
164
165 int SCardRequest(void *pvUser, uint32_t u32Function, const void *pvData, uint32_t cbData);
166
167 int VideoInDeviceAttach(const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle, void *pvDeviceCtx);
168 int VideoInDeviceDetach(const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle);
169 int VideoInGetDeviceDesc(void *pvUser, const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle);
170 int VideoInControl(void *pvUser, const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle,
171 const VRDEVIDEOINCTRLHDR *pReq, uint32_t cbReq);
172
173 Console *getConsole(void) { return mConsole; }
174
175 void onMousePointerShapeChange(BOOL visible, BOOL alpha, ULONG xHot, ULONG yHot,
176 ULONG width, ULONG height, ComSafeArrayIn(BYTE,shape));
177
178private:
179 /* Note: This is not a ComObjPtr here, because the ConsoleVRDPServer object
180 * is actually just a part of the Console.
181 */
182 Console *mConsole;
183
184 HVRDESERVER mhServer;
185 int mServerInterfaceVersion;
186
187 int32_t volatile mcInResize; /* Do not Stop the server if this is not 0. */
188
189 static int loadVRDPLibrary (const char *pszLibraryName);
190
191 /** Static because will never load this more than once! */
192 static RTLDRMOD mVRDPLibrary;
193
194 static PFNVRDECREATESERVER mpfnVRDECreateServer;
195
196 static VRDEENTRYPOINTS_4 mEntryPoints;
197 static VRDEENTRYPOINTS_4 *mpEntryPoints;
198 static VRDECALLBACKS_4 mCallbacks;
199
200 static DECLCALLBACK(int) VRDPCallbackQueryProperty (void *pvCallback, uint32_t index, void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut);
201 static DECLCALLBACK(int) VRDPCallbackClientLogon (void *pvCallback, uint32_t u32ClientId, const char *pszUser, const char *pszPassword, const char *pszDomain);
202 static DECLCALLBACK(void) VRDPCallbackClientConnect (void *pvCallback, uint32_t u32ClientId);
203 static DECLCALLBACK(void) VRDPCallbackClientDisconnect (void *pvCallback, uint32_t u32ClientId, uint32_t fu32Intercepted);
204 static DECLCALLBACK(int) VRDPCallbackIntercept (void *pvCallback, uint32_t u32ClientId, uint32_t fu32Intercept, void **ppvIntercept);
205 static DECLCALLBACK(int) VRDPCallbackUSB (void *pvCallback, void *pvIntercept, uint32_t u32ClientId, uint8_t u8Code, const void *pvRet, uint32_t cbRet);
206 static DECLCALLBACK(int) VRDPCallbackClipboard (void *pvCallback, void *pvIntercept, uint32_t u32ClientId, uint32_t u32Function, uint32_t u32Format, const void *pvData, uint32_t cbData);
207 static DECLCALLBACK(bool) VRDPCallbackFramebufferQuery (void *pvCallback, unsigned uScreenId, VRDEFRAMEBUFFERINFO *pInfo);
208 static DECLCALLBACK(void) VRDPCallbackFramebufferLock (void *pvCallback, unsigned uScreenId);
209 static DECLCALLBACK(void) VRDPCallbackFramebufferUnlock (void *pvCallback, unsigned uScreenId);
210 static DECLCALLBACK(void) VRDPCallbackInput (void *pvCallback, int type, const void *pvInput, unsigned cbInput);
211 static DECLCALLBACK(void) VRDPCallbackVideoModeHint (void *pvCallback, unsigned cWidth, unsigned cHeight, unsigned cBitsPerPixel, unsigned uScreenId);
212 static DECLCALLBACK(void) VRDECallbackAudioIn (void *pvCallback, void *pvCtx, uint32_t u32ClientId, uint32_t u32Event, const void *pvData, uint32_t cbData);
213
214 void fetchCurrentState(void);
215
216 bool m_fGuestWantsAbsolute;
217 int m_mousex;
218 int m_mousey;
219
220 ComPtr<IDisplaySourceBitmap> maSourceBitmaps[SchemaDefs::MaxGuestMonitors];
221
222 ComPtr<IEventListener> mConsoleListener;
223
224 VRDPInputSynch m_InputSynch;
225
226 int32_t mVRDPBindPort;
227
228 RTCRITSECT mCritSect;
229
230 int lockConsoleVRDPServer (void);
231 void unlockConsoleVRDPServer (void);
232
233 int mcClipboardRefs;
234 PFNSHCLEXTCALLBACK mpfnClipboardCallback;
235
236 static DECLCALLBACK(int) ClipboardCallback (void *pvCallback, uint32_t u32ClientId, uint32_t u32Function, uint32_t u32Format, const void *pvData, uint32_t cbData);
237 static DECLCALLBACK(int) ClipboardServiceExtension(void *pvExtension, uint32_t u32Function, void *pvParms, uint32_t cbParms);
238
239#ifdef VBOX_WITH_USB
240 RemoteUSBBackend *usbBackendFindByUUID (const Guid *pGuid);
241 RemoteUSBBackend *usbBackendFind (uint32_t u32ClientId);
242
243 typedef struct _USBBackends
244 {
245 RemoteUSBBackend *pHead;
246 RemoteUSBBackend *pTail;
247
248 RTTHREAD thread;
249
250 bool fThreadRunning;
251
252 RTSEMEVENT event;
253 } USBBackends;
254
255 USBBackends mUSBBackends;
256
257 void remoteUSBThreadStart (void);
258 void remoteUSBThreadStop (void);
259#endif /* VBOX_WITH_USB */
260
261#ifndef VBOX_WITH_VRDEAUTH_IN_VBOXSVC
262 /* External authentication library context. The library is loaded in the
263 * Authenticate method and unloaded at the object destructor.
264 */
265 AUTHLIBRARYCONTEXT mAuthLibCtx;
266#endif
267
268 uint32_t volatile mu32AudioInputClientId;
269
270 int32_t volatile mcClients;
271
272#if 0 /** @todo Chromium got removed (see @bugref{9529}) and this is not available for VMSVGA yet. */
273 static DECLCALLBACK(void) H3DORBegin(const void *pvContext, void **ppvInstance,
274 const char *pszFormat);
275 static DECLCALLBACK(void) H3DORGeometry(void *pvInstance,
276 int32_t x, int32_t y, uint32_t w, uint32_t h);
277 static DECLCALLBACK(void) H3DORVisibleRegion(void *pvInstance,
278 uint32_t cRects, const RTRECT *paRects);
279 static DECLCALLBACK(void) H3DORFrame(void *pvInstance,
280 void *pvData, uint32_t cbData);
281 static DECLCALLBACK(void) H3DOREnd(void *pvInstance);
282 static DECLCALLBACK(int) H3DORContextProperty(const void *pvContext, uint32_t index,
283 void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut);
284#endif
285
286 void remote3DRedirect(bool fEnable);
287
288 /*
289 * VRDE server optional interfaces.
290 */
291
292 /* Image update interface. */
293 bool m_fInterfaceImage;
294 VRDEIMAGECALLBACKS m_interfaceCallbacksImage;
295 VRDEIMAGEINTERFACE m_interfaceImage;
296 static DECLCALLBACK(int) VRDEImageCbNotify (void *pvContext,
297 void *pvUser,
298 HVRDEIMAGE hVideo,
299 uint32_t u32Id,
300 void *pvData,
301 uint32_t cbData);
302 /* Mouse pointer interface. */
303 VRDEMOUSEPTRINTERFACE m_interfaceMousePtr;
304
305 /* Smartcard interface. */
306 VRDESCARDINTERFACE m_interfaceSCard;
307 VRDESCARDCALLBACKS m_interfaceCallbacksSCard;
308 static DECLCALLBACK(int) VRDESCardCbNotify(void *pvContext,
309 uint32_t u32Id,
310 void *pvData,
311 uint32_t cbData);
312 static DECLCALLBACK(int) VRDESCardCbResponse(void *pvContext,
313 int vrcRequest,
314 void *pvUser,
315 uint32_t u32Function,
316 void *pvData,
317 uint32_t cbData);
318
319 /* TSMF interface. */
320 VRDETSMFINTERFACE m_interfaceTSMF;
321 VRDETSMFCALLBACKS m_interfaceCallbacksTSMF;
322 static DECLCALLBACK(void) VRDETSMFCbNotify(void *pvContext,
323 uint32_t u32Notification,
324 void *pvChannel,
325 const void *pvParm,
326 uint32_t cbParm);
327 void setupTSMF(void);
328
329 static DECLCALLBACK(int) tsmfHostChannelAttach(void *pvProvider, void **ppvInstance, uint32_t u32Flags,
330 VBOXHOSTCHANNELCALLBACKS *pCallbacks, void *pvCallbacks);
331 static DECLCALLBACK(void) tsmfHostChannelDetach(void *pvInstance);
332 static DECLCALLBACK(int) tsmfHostChannelSend(void *pvInstance, const void *pvData, uint32_t cbData);
333 static DECLCALLBACK(int) tsmfHostChannelRecv(void *pvInstance, void *pvData, uint32_t cbData,
334 uint32_t *pcbReturned, uint32_t *pcbRemaining);
335 static DECLCALLBACK(int) tsmfHostChannelControl(void *pvInstance, uint32_t u32Code,
336 const void *pvParm, uint32_t cbParm,
337 const void *pvData, uint32_t cbData, uint32_t *pcbDataReturned);
338 int tsmfLock(void);
339 void tsmfUnlock(void);
340 RTCRITSECT mTSMFLock;
341
342 /* Video input interface. */
343 VRDEVIDEOININTERFACE m_interfaceVideoIn;
344 VRDEVIDEOINCALLBACKS m_interfaceCallbacksVideoIn;
345 static DECLCALLBACK(void) VRDECallbackVideoInNotify(void *pvCallback,
346 uint32_t u32Id,
347 const void *pvData,
348 uint32_t cbData);
349 static DECLCALLBACK(void) VRDECallbackVideoInDeviceDesc(void *pvCallback,
350 int vrcRequest,
351 void *pDeviceCtx,
352 void *pvUser,
353 const VRDEVIDEOINDEVICEDESC *pDeviceDesc,
354 uint32_t cbDevice);
355 static DECLCALLBACK(void) VRDECallbackVideoInControl(void *pvCallback,
356 int vrcRequest,
357 void *pDeviceCtx,
358 void *pvUser,
359 const VRDEVIDEOINCTRLHDR *pControl,
360 uint32_t cbControl);
361 static DECLCALLBACK(void) VRDECallbackVideoInFrame(void *pvCallback,
362 int vrcRequest,
363 void *pDeviceCtx,
364 const VRDEVIDEOINPAYLOADHDR *pFrame,
365 uint32_t cbFrame);
366 EmWebcam *mEmWebcam;
367
368 /* Input interface. */
369 VRDEINPUTINTERFACE m_interfaceInput;
370 VRDEINPUTCALLBACKS m_interfaceCallbacksInput;
371 static DECLCALLBACK(void) VRDECallbackInputSetup(void *pvCallback,
372 int vrcRequest,
373 uint32_t u32Method,
374 const void *pvResult,
375 uint32_t cbResult);
376 static DECLCALLBACK(void) VRDECallbackInputEvent(void *pvCallback,
377 uint32_t u32Method,
378 const void *pvEvent,
379 uint32_t cbEvent);
380 uint64_t mu64TouchInputTimestampMCS;
381};
382
383
384class Console;
385
386class ATL_NO_VTABLE VRDEServerInfo :
387 public VRDEServerInfoWrap
388{
389public:
390 DECLARE_NOT_AGGREGATABLE(VRDEServerInfo)
391
392 DECLARE_COMMON_CLASS_METHODS(VRDEServerInfo)
393
394 HRESULT FinalConstruct();
395 void FinalRelease();
396
397 /* Public initializer/uninitializer for internal purposes only. */
398 HRESULT init(Console *aParent);
399 void uninit();
400
401private:
402 // wrapped IVRDEServerInfo properties
403#define DECL_GETTER(_aType, _aName) virtual HRESULT get##_aName(_aType *a##_aName)
404#define DECL_GETTER_REF(_aType, _aName) virtual HRESULT get##_aName(_aType &a##_aName)
405 DECL_GETTER(BOOL, Active);
406 DECL_GETTER(LONG, Port);
407 DECL_GETTER(ULONG, NumberOfClients);
408 DECL_GETTER(LONG64, BeginTime);
409 DECL_GETTER(LONG64, EndTime);
410 DECL_GETTER(LONG64, BytesSent);
411 DECL_GETTER(LONG64, BytesSentTotal);
412 DECL_GETTER(LONG64, BytesReceived);
413 DECL_GETTER(LONG64, BytesReceivedTotal);
414 DECL_GETTER_REF(com::Utf8Str, User);
415 DECL_GETTER_REF(com::Utf8Str, Domain);
416 DECL_GETTER_REF(com::Utf8Str, ClientName);
417 DECL_GETTER_REF(com::Utf8Str, ClientIP);
418 DECL_GETTER(ULONG, ClientVersion);
419 DECL_GETTER(ULONG, EncryptionStyle);
420#undef DECL_GETTER_REF
421#undef DECL_GETTER
422
423 Console * const mParent;
424};
425
426#endif /* !MAIN_INCLUDED_ConsoleVRDPServer_h */
427/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use