summaryrefslogtreecommitdiffstats
path: root/include/VBox/RemoteDesktop
diff options
context:
space:
mode:
Diffstat (limited to 'include/VBox/RemoteDesktop')
-rw-r--r--include/VBox/RemoteDesktop/Makefile.kup0
-rw-r--r--include/VBox/RemoteDesktop/VRDE.h1615
-rw-r--r--include/VBox/RemoteDesktop/VRDEImage.h256
-rw-r--r--include/VBox/RemoteDesktop/VRDEInput.h234
-rw-r--r--include/VBox/RemoteDesktop/VRDEMousePtr.h82
-rw-r--r--include/VBox/RemoteDesktop/VRDEOrders.h310
-rw-r--r--include/VBox/RemoteDesktop/VRDESCard.h528
-rw-r--r--include/VBox/RemoteDesktop/VRDETSMF.h154
-rw-r--r--include/VBox/RemoteDesktop/VRDEVideoIn.h1093
9 files changed, 4272 insertions, 0 deletions
diff --git a/include/VBox/RemoteDesktop/Makefile.kup b/include/VBox/RemoteDesktop/Makefile.kup
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/include/VBox/RemoteDesktop/Makefile.kup
diff --git a/include/VBox/RemoteDesktop/VRDE.h b/include/VBox/RemoteDesktop/VRDE.h
new file mode 100644
index 00000000..56c03226
--- /dev/null
+++ b/include/VBox/RemoteDesktop/VRDE.h
@@ -0,0 +1,1615 @@
+/** @file
+ * VBox Remote Desktop Extension (VRDE) - Public APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2022 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program 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, in version 3 of the
+ * License.
+ *
+ * This program 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 program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+#ifndef VBOX_INCLUDED_RemoteDesktop_VRDE_h
+#define VBOX_INCLUDED_RemoteDesktop_VRDE_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include <iprt/cdefs.h>
+#include <iprt/types.h>
+
+/** @defgroup grp_vrdp VRDE
+ * VirtualBox Remote Desktop Extension (VRDE) interface that lets to use
+ * a Remote Desktop server like RDP.
+ * @{
+ */
+
+RT_C_DECLS_BEGIN
+
+/* Forward declaration of the VRDE server instance handle.
+ * This is an opaque pointer for VirtualBox.
+ * The VRDE library uses it as a pointer to some internal data.
+ */
+#ifdef __cplusplus
+class VRDEServer;
+typedef class VRDEServerType *HVRDESERVER;
+#else
+struct VRDEServer;
+typedef struct VRDEServerType *HVRDESERVER;
+#endif /* !__cplusplus */
+
+/* Callback based VRDE server interface declarations. */
+
+/** The color mouse pointer information. */
+typedef struct _VRDECOLORPOINTER
+{
+ uint16_t u16HotX;
+ uint16_t u16HotY;
+ uint16_t u16Width;
+ uint16_t u16Height;
+ uint16_t u16MaskLen;
+ uint16_t u16DataLen;
+ /* The 1BPP mask and the 24BPP bitmap follow. */
+} VRDECOLORPOINTER;
+
+/** Audio format information packed in a 32 bit value. */
+typedef uint32_t VRDEAUDIOFORMAT;
+
+/** Constructs 32 bit value for given frequency, number of channel and bits per sample. */
+#define VRDE_AUDIO_FMT_MAKE(freq, c, bps, s) ((((s) & 0x1) << 28) + (((bps) & 0xFF) << 20) + (((c) & 0xF) << 16) + ((freq) & 0xFFFF))
+
+/** Decode frequency. */
+#define VRDE_AUDIO_FMT_SAMPLE_FREQ(a) ((a) & 0xFFFF)
+/** Decode number of channels. */
+#define VRDE_AUDIO_FMT_CHANNELS(a) (((a) >> 16) & 0xF)
+/** Decode number signess. */
+#define VRDE_AUDIO_FMT_SIGNED(a) (((a) >> 28) & 0x1)
+/** Decode number of bits per sample. */
+#define VRDE_AUDIO_FMT_BITS_PER_SAMPLE(a) (((a) >> 20) & 0xFF)
+/** Decode number of bytes per sample. */
+#define VRDE_AUDIO_FMT_BYTES_PER_SAMPLE(a) ((VRDE_AUDIO_FMT_BITS_PER_SAMPLE(a) + 7) / 8)
+
+
+/*
+ * Audio input.
+ */
+
+/* Audio input notifications. */
+#define VRDE_AUDIOIN_BEGIN 1
+#define VRDE_AUDIOIN_DATA 2
+#define VRDE_AUDIOIN_END 3
+
+typedef struct VRDEAUDIOINBEGIN
+{
+ VRDEAUDIOFORMAT fmt; /* Actual format of data, which will be sent in VRDE_AUDIOIN_DATA events. */
+} VRDEAUDIOINBEGIN, *PVRDEAUDIOINBEGIN;
+
+
+/*
+ * Remote USB protocol.
+ */
+
+/* The initial version 1. */
+#define VRDE_USB_VERSION_1 (1)
+/* Version 2: look for VRDE_USB_VERSION_2 comments in the code. */
+#define VRDE_USB_VERSION_2 (2)
+/* Version 3: look for VRDE_USB_VERSION_3 comments in the code. */
+#define VRDE_USB_VERSION_3 (3)
+
+/* The default VRDE server version of Remote USB Protocol. */
+#define VRDE_USB_VERSION VRDE_USB_VERSION_3
+
+
+/** USB backend operations. */
+#define VRDE_USB_REQ_OPEN (0)
+#define VRDE_USB_REQ_CLOSE (1)
+#define VRDE_USB_REQ_RESET (2)
+#define VRDE_USB_REQ_SET_CONFIG (3)
+#define VRDE_USB_REQ_CLAIM_INTERFACE (4)
+#define VRDE_USB_REQ_RELEASE_INTERFACE (5)
+#define VRDE_USB_REQ_INTERFACE_SETTING (6)
+#define VRDE_USB_REQ_QUEUE_URB (7)
+#define VRDE_USB_REQ_REAP_URB (8)
+#define VRDE_USB_REQ_CLEAR_HALTED_EP (9)
+#define VRDE_USB_REQ_CANCEL_URB (10)
+
+/** USB service operations. */
+#define VRDE_USB_REQ_DEVICE_LIST (11)
+#define VRDE_USB_REQ_NEGOTIATE (12)
+
+/** An operation completion status is a byte. */
+typedef uint8_t VRDEUSBSTATUS;
+
+/** USB device identifier is an 32 bit value. */
+typedef uint32_t VRDEUSBDEVID;
+
+/** Status codes. */
+#define VRDE_USB_STATUS_SUCCESS ((VRDEUSBSTATUS)0)
+#define VRDE_USB_STATUS_ACCESS_DENIED ((VRDEUSBSTATUS)1)
+#define VRDE_USB_STATUS_DEVICE_REMOVED ((VRDEUSBSTATUS)2)
+
+/*
+ * Data structures to use with VRDEUSBRequest.
+ * The *RET* structures always represent the layout of VRDE data.
+ * The *PARM* structures normally the same as VRDE layout.
+ * However the VRDE_USB_REQ_QUEUE_URB_PARM has a pointer to
+ * URB data in place where actual data will be in VRDE layout.
+ *
+ * Since replies (*RET*) are asynchronous, the 'success'
+ * replies are not required for operations which return
+ * only the status code (VRDEUSBREQRETHDR only):
+ * VRDE_USB_REQ_OPEN
+ * VRDE_USB_REQ_RESET
+ * VRDE_USB_REQ_SET_CONFIG
+ * VRDE_USB_REQ_CLAIM_INTERFACE
+ * VRDE_USB_REQ_RELEASE_INTERFACE
+ * VRDE_USB_REQ_INTERFACE_SETTING
+ * VRDE_USB_REQ_CLEAR_HALTED_EP
+ *
+ */
+
+/* VRDE layout has no alignments. */
+#pragma pack(1)
+/* Common header for all VRDE USB packets. After the reply hdr follows *PARM* or *RET* data. */
+typedef struct _VRDEUSBPKTHDR
+{
+ /* Total length of the reply NOT including the 'length' field. */
+ uint32_t length;
+ /* The operation code for which the reply was sent by the client. */
+ uint8_t code;
+} VRDEUSBPKTHDR;
+
+/* Common header for all return structures. */
+typedef struct _VRDEUSBREQRETHDR
+{
+ /* Device status. */
+ VRDEUSBSTATUS status;
+ /* Device id. */
+ VRDEUSBDEVID id;
+} VRDEUSBREQRETHDR;
+
+
+/* VRDE_USB_REQ_OPEN
+ */
+typedef struct _VRDE_USB_REQ_OPEN_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+} VRDE_USB_REQ_OPEN_PARM;
+
+typedef struct _VRDE_USB_REQ_OPEN_RET
+{
+ VRDEUSBREQRETHDR hdr;
+} VRDE_USB_REQ_OPEN_RET;
+
+
+/* VRDE_USB_REQ_CLOSE
+ */
+typedef struct _VRDE_USB_REQ_CLOSE_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+} VRDE_USB_REQ_CLOSE_PARM;
+
+/* The close request has no returned data. */
+
+
+/* VRDE_USB_REQ_RESET
+ */
+typedef struct _VRDE_USB_REQ_RESET_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+} VRDE_USB_REQ_RESET_PARM;
+
+typedef struct _VRDE_USB_REQ_RESET_RET
+{
+ VRDEUSBREQRETHDR hdr;
+} VRDE_USB_REQ_RESET_RET;
+
+
+/* VRDE_USB_REQ_SET_CONFIG
+ */
+typedef struct _VRDE_USB_REQ_SET_CONFIG_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+ uint8_t configuration;
+} VRDE_USB_REQ_SET_CONFIG_PARM;
+
+typedef struct _VRDE_USB_REQ_SET_CONFIG_RET
+{
+ VRDEUSBREQRETHDR hdr;
+} VRDE_USB_REQ_SET_CONFIG_RET;
+
+
+/* VRDE_USB_REQ_CLAIM_INTERFACE
+ */
+typedef struct _VRDE_USB_REQ_CLAIM_INTERFACE_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+ uint8_t iface;
+} VRDE_USB_REQ_CLAIM_INTERFACE_PARM;
+
+typedef struct _VRDE_USB_REQ_CLAIM_INTERFACE_RET
+{
+ VRDEUSBREQRETHDR hdr;
+} VRDE_USB_REQ_CLAIM_INTERFACE_RET;
+
+
+/* VRDE_USB_REQ_RELEASE_INTERFACE
+ */
+typedef struct _VRDE_USB_REQ_RELEASE_INTERFACE_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+ uint8_t iface;
+} VRDE_USB_REQ_RELEASE_INTERFACE_PARM;
+
+typedef struct _VRDE_USB_REQ_RELEASE_INTERFACE_RET
+{
+ VRDEUSBREQRETHDR hdr;
+} VRDE_USB_REQ_RELEASE_INTERFACE_RET;
+
+
+/* VRDE_USB_REQ_INTERFACE_SETTING
+ */
+typedef struct _VRDE_USB_REQ_INTERFACE_SETTING_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+ uint8_t iface;
+ uint8_t setting;
+} VRDE_USB_REQ_INTERFACE_SETTING_PARM;
+
+typedef struct _VRDE_USB_REQ_INTERFACE_SETTING_RET
+{
+ VRDEUSBREQRETHDR hdr;
+} VRDE_USB_REQ_INTERFACE_SETTING_RET;
+
+
+/* VRDE_USB_REQ_QUEUE_URB
+ */
+
+#define VRDE_USB_TRANSFER_TYPE_CTRL (0)
+#define VRDE_USB_TRANSFER_TYPE_ISOC (1)
+#define VRDE_USB_TRANSFER_TYPE_BULK (2)
+#define VRDE_USB_TRANSFER_TYPE_INTR (3)
+#define VRDE_USB_TRANSFER_TYPE_MSG (4)
+
+#define VRDE_USB_DIRECTION_SETUP (0)
+#define VRDE_USB_DIRECTION_IN (1)
+#define VRDE_USB_DIRECTION_OUT (2)
+
+typedef struct _VRDE_USB_REQ_QUEUE_URB_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+ uint32_t handle; /* Distinguishes that particular URB. Later used in CancelURB and returned by ReapURB */
+ uint8_t type;
+ uint8_t ep;
+ uint8_t direction;
+ uint32_t urblen; /* Length of the URB. */
+ uint32_t datalen; /* Length of the data. */
+ void *data; /* In RDP layout the data follow. */
+} VRDE_USB_REQ_QUEUE_URB_PARM;
+
+/* The queue URB has no explicit return. The reap URB reply will be
+ * eventually the indirect result.
+ */
+
+
+/* VRDE_USB_REQ_REAP_URB
+ * Notificationg from server to client that server expects an URB
+ * from any device.
+ * Only sent if negotiated URB return method is polling.
+ * Normally, the client will send URBs back as soon as they are ready.
+ */
+typedef struct _VRDE_USB_REQ_REAP_URB_PARM
+{
+ uint8_t code;
+} VRDE_USB_REQ_REAP_URB_PARM;
+
+
+#define VRDE_USB_XFER_OK (0)
+#define VRDE_USB_XFER_STALL (1)
+#define VRDE_USB_XFER_DNR (2)
+#define VRDE_USB_XFER_CRC (3)
+/* VRDE_USB_VERSION_2: New error codes. OHCI Completion Codes. */
+#define VRDE_USB_XFER_BS (4) /* BitStuffing */
+#define VRDE_USB_XFER_DTM (5) /* DataToggleMismatch */
+#define VRDE_USB_XFER_PCF (6) /* PIDCheckFailure */
+#define VRDE_USB_XFER_UPID (7) /* UnexpectedPID */
+#define VRDE_USB_XFER_DO (8) /* DataOverrun */
+#define VRDE_USB_XFER_DU (9) /* DataUnderrun */
+#define VRDE_USB_XFER_BO (10) /* BufferOverrun */
+#define VRDE_USB_XFER_BU (11) /* BufferUnderrun */
+#define VRDE_USB_XFER_ERR (12) /* VBox protocol error. */
+
+#define VRDE_USB_REAP_FLAG_CONTINUED (0x0)
+#define VRDE_USB_REAP_FLAG_LAST (0x1)
+/* VRDE_USB_VERSION_3: Fragmented URBs. */
+#define VRDE_USB_REAP_FLAG_FRAGMENT (0x2)
+
+#define VRDE_USB_REAP_VALID_FLAGS (VRDE_USB_REAP_FLAG_LAST)
+/* VRDE_USB_VERSION_3: Fragmented URBs. */
+#define VRDE_USB_REAP_VALID_FLAGS_3 (VRDE_USB_REAP_FLAG_LAST | VRDE_USB_REAP_FLAG_FRAGMENT)
+
+typedef struct _VRDEUSBREQREAPURBBODY
+{
+ VRDEUSBDEVID id; /* From which device the URB arrives. */
+ uint8_t flags; /* VRDE_USB_REAP_FLAG_* */
+ uint8_t error; /* VRDE_USB_XFER_* */
+ uint32_t handle; /* Handle of returned URB. Not 0. */
+ uint32_t len; /* Length of data actually transferred. */
+ /* 'len' bytes of data follow if direction of this URB was VRDE_USB_DIRECTION_IN. */
+} VRDEUSBREQREAPURBBODY;
+
+typedef struct _VRDE_USB_REQ_REAP_URB_RET
+{
+ /* The REAP URB has no header, only completed URBs are returned. */
+ VRDEUSBREQREAPURBBODY body;
+ /* Another body may follow, depending on flags. */
+} VRDE_USB_REQ_REAP_URB_RET;
+
+
+/* VRDE_USB_REQ_CLEAR_HALTED_EP
+ */
+typedef struct _VRDE_USB_REQ_CLEAR_HALTED_EP_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+ uint8_t ep;
+} VRDE_USB_REQ_CLEAR_HALTED_EP_PARM;
+
+typedef struct _VRDE_USB_REQ_CLEAR_HALTED_EP_RET
+{
+ VRDEUSBREQRETHDR hdr;
+} VRDE_USB_REQ_CLEAR_HALTED_EP_RET;
+
+
+/* VRDE_USB_REQ_CANCEL_URB
+ */
+typedef struct _VRDE_USB_REQ_CANCEL_URB_PARM
+{
+ uint8_t code;
+ VRDEUSBDEVID id;
+ uint32_t handle;
+} VRDE_USB_REQ_CANCEL_URB_PARM;
+
+/* The cancel URB request has no return. */
+
+
+/* VRDE_USB_REQ_DEVICE_LIST
+ *
+ * Server polls USB devices on client by sending this request
+ * periodically. Client sends back a list of all devices
+ * connected to it. Each device is assigned with an identifier,
+ * that is used to distinguish the particular device.
+ */
+typedef struct _VRDE_USB_REQ_DEVICE_LIST_PARM
+{
+ uint8_t code;
+} VRDE_USB_REQ_DEVICE_LIST_PARM;
+
+/* Data is a list of the following variable length structures. */
+typedef struct _VRDEUSBDEVICEDESC
+{
+ /* Offset of the next structure. 0 if last. */
+ uint16_t oNext;
+
+ /* Identifier of the device assigned by client. */
+ VRDEUSBDEVID id;
+
+ /** USB version number. */
+ uint16_t bcdUSB;
+ /** Device class. */
+ uint8_t bDeviceClass;
+ /** Device subclass. */
+ uint8_t bDeviceSubClass;
+ /** Device protocol */
+ uint8_t bDeviceProtocol;
+ /** Vendor ID. */
+ uint16_t idVendor;
+ /** Product ID. */
+ uint16_t idProduct;
+ /** Revision, integer part. */
+ uint16_t bcdRev;
+ /** Offset of the UTF8 manufacturer string relative to the structure start. */
+ uint16_t oManufacturer;
+ /** Offset of the UTF8 product string relative to the structure start. */
+ uint16_t oProduct;
+ /** Offset of the UTF8 serial number string relative to the structure start. */
+ uint16_t oSerialNumber;
+ /** Physical USB port the device is connected to. */
+ uint16_t idPort;
+
+} VRDEUSBDEVICEDESC;
+
+#define VRDE_USBDEVICESPEED_UNKNOWN 0 /* Unknown. */
+#define VRDE_USBDEVICESPEED_LOW 1 /* Low speed (1.5 Mbit/s). */
+#define VRDE_USBDEVICESPEED_FULL 2 /* Full speed (12 Mbit/s). */
+#define VRDE_USBDEVICESPEED_HIGH 3 /* High speed (480 Mbit/s). */
+#define VRDE_USBDEVICESPEED_VARIABLE 4 /* Variable speed - USB 2.5 / wireless. */
+#define VRDE_USBDEVICESPEED_SUPERSPEED 5 /* Super Speed - USB 3.0 */
+
+typedef struct _VRDEUSBDEVICEDESCEXT
+{
+ VRDEUSBDEVICEDESC desc;
+
+ /* Extended info.
+ */
+
+ /** The USB device speed: VRDE_USBDEVICESPEED_*. */
+ uint16_t u16DeviceSpeed;
+} VRDEUSBDEVICEDESCEXT;
+
+typedef struct _VRDE_USB_REQ_DEVICE_LIST_RET
+{
+ VRDEUSBDEVICEDESC body;
+ /* Other devices may follow.
+ * The list ends with (uint16_t)0,
+ * which means that an empty list consists of 2 zero bytes.
+ */
+} VRDE_USB_REQ_DEVICE_LIST_RET;
+
+typedef struct _VRDE_USB_REQ_DEVICE_LIST_EXT_RET
+{
+ VRDEUSBDEVICEDESCEXT body;
+ /* Other devices may follow.
+ * The list ends with (uint16_t)0,
+ * which means that an empty list consists of 2 zero bytes.
+ */
+} VRDE_USB_REQ_DEVICE_LIST_EXT_RET;
+
+/* The server requests the version of the port the device is attached to.
+ * The client must use VRDEUSBDEVICEDESCEXT structure.
+ */
+#define VRDE_USB_SERVER_CAPS_PORT_VERSION 0x0001
+
+typedef struct _VRDEUSBREQNEGOTIATEPARM
+{
+ uint8_t code;
+
+ /* Remote USB Protocol version. */
+ /* VRDE_USB_VERSION_3: the 32 bit field is splitted to 16 bit version and 16 bit flags.
+ * Version 1 and 2 servers therefore have 'flags' == 0.
+ * Version 3+ servers can send some capabilities in this field, this way it is possible to add
+ * a new capability without increasing the protocol version.
+ */
+ uint16_t version;
+ uint16_t flags; /* See VRDE_USB_SERVER_CAPS_* */
+
+} VRDEUSBREQNEGOTIATEPARM;
+
+/* VRDEUSBREQNEGOTIATERET flags. */
+#define VRDE_USB_CAPS_FLAG_ASYNC (0x0)
+#define VRDE_USB_CAPS_FLAG_POLL (0x1)
+/* VRDE_USB_VERSION_2: New flag. */
+#define VRDE_USB_CAPS2_FLAG_VERSION (0x2) /* The client is negotiating the protocol version. */
+/* VRDE_USB_VERSION_3: New flag. */
+#define VRDE_USB_CAPS3_FLAG_EXT (0x4) /* The client is negotiating the extended flags.
+ * If this flag is set, then the VRDE_USB_CAPS2_FLAG_VERSION
+ * must also be set.
+ */
+
+
+#define VRDE_USB_CAPS_VALID_FLAGS (VRDE_USB_CAPS_FLAG_POLL)
+/* VRDE_USB_VERSION_2: A set of valid flags. */
+#define VRDE_USB_CAPS2_VALID_FLAGS (VRDE_USB_CAPS_FLAG_POLL | VRDE_USB_CAPS2_FLAG_VERSION)
+/* VRDE_USB_VERSION_3: A set of valid flags. */
+#define VRDE_USB_CAPS3_VALID_FLAGS (VRDE_USB_CAPS_FLAG_POLL | VRDE_USB_CAPS2_FLAG_VERSION | VRDE_USB_CAPS3_FLAG_EXT)
+
+typedef struct _VRDEUSBREQNEGOTIATERET
+{
+ uint8_t flags;
+} VRDEUSBREQNEGOTIATERET;
+
+typedef struct _VRDEUSBREQNEGOTIATERET_2
+{
+ uint8_t flags;
+ uint32_t u32Version; /* This field presents only if the VRDE_USB_CAPS2_FLAG_VERSION flag is set. */
+} VRDEUSBREQNEGOTIATERET_2;
+
+/* The server requests the version of the port the device is attached to.
+ * The client must use VRDEUSBDEVICEDESCEXT structure.
+ */
+#define VRDE_USB_CLIENT_CAPS_PORT_VERSION 0x00000001
+
+typedef struct _VRDEUSBREQNEGOTIATERET_3
+{
+ uint8_t flags;
+ uint32_t u32Version; /* This field presents only if the VRDE_USB_CAPS2_FLAG_VERSION flag is set. */
+ uint32_t u32Flags; /* This field presents only if both VRDE_USB_CAPS2_FLAG_VERSION and
+ * VRDE_USB_CAPS2_FLAG_EXT flag are set.
+ * See VRDE_USB_CLIENT_CAPS_*
+ */
+} VRDEUSBREQNEGOTIATERET_3;
+#pragma pack()
+
+#define VRDE_CLIPBOARD_FORMAT_NULL (0x0)
+#define VRDE_CLIPBOARD_FORMAT_UNICODE_TEXT (0x1)
+#define VRDE_CLIPBOARD_FORMAT_BITMAP (0x2)
+#define VRDE_CLIPBOARD_FORMAT_HTML (0x4)
+
+#define VRDE_CLIPBOARD_FUNCTION_FORMAT_ANNOUNCE (0)
+#define VRDE_CLIPBOARD_FUNCTION_DATA_READ (1)
+#define VRDE_CLIPBOARD_FUNCTION_DATA_WRITE (2)
+
+
+/** Indexes of information values. */
+
+/** Whether a client is connected at the moment.
+ * uint32_t
+ */
+#define VRDE_QI_ACTIVE (0)
+
+/** How many times a client connected up to current moment.
+ * uint32_t
+ */
+#define VRDE_QI_NUMBER_OF_CLIENTS (1)
+
+/** When last connection was established.
+ * int64_t time in milliseconds since 1970-01-01 00:00:00 UTC
+ */
+#define VRDE_QI_BEGIN_TIME (2)
+
+/** When last connection was terminated or current time if connection still active.
+ * int64_t time in milliseconds since 1970-01-01 00:00:00 UTC
+ */
+#define VRDE_QI_END_TIME (3)
+
+/** How many bytes were sent in last (current) connection.
+ * uint64_t
+ */
+#define VRDE_QI_BYTES_SENT (4)
+
+/** How many bytes were sent in all connections.
+ * uint64_t
+ */
+#define VRDE_QI_BYTES_SENT_TOTAL (5)
+
+/** How many bytes were received in last (current) connection.
+ * uint64_t
+ */
+#define VRDE_QI_BYTES_RECEIVED (6)
+
+/** How many bytes were received in all connections.
+ * uint64_t
+ */
+#define VRDE_QI_BYTES_RECEIVED_TOTAL (7)
+
+/** Login user name supplied by the client.
+ * UTF8 nul terminated string.
+ */
+#define VRDE_QI_USER (8)
+
+/** Login domain supplied by the client.
+ * UTF8 nul terminated string.
+ */
+#define VRDE_QI_DOMAIN (9)
+
+/** The client name supplied by the client.
+ * UTF8 nul terminated string.
+ */
+#define VRDE_QI_CLIENT_NAME (10)
+
+/** IP address of the client.
+ * UTF8 nul terminated string.
+ */
+#define VRDE_QI_CLIENT_IP (11)
+
+/** The client software version number.
+ * uint32_t.
+ */
+#define VRDE_QI_CLIENT_VERSION (12)
+
+/** Public key exchange method used when connection was established.
+ * Values: 0 - RDP4 public key exchange scheme.
+ * 1 - X509 sertificates were sent to client.
+ * uint32_t.
+ */
+#define VRDE_QI_ENCRYPTION_STYLE (13)
+
+/** TCP port where the server listens.
+ * Values: 0 - VRDE server failed to start.
+ * -1 - .
+ * int32_t.
+ */
+#define VRDE_QI_PORT (14)
+
+
+/** Hints what has been intercepted by the application. */
+#define VRDE_CLIENT_INTERCEPT_AUDIO RT_BIT(0)
+#define VRDE_CLIENT_INTERCEPT_USB RT_BIT(1)
+#define VRDE_CLIENT_INTERCEPT_CLIPBOARD RT_BIT(2)
+#define VRDE_CLIENT_INTERCEPT_AUDIO_INPUT RT_BIT(3)
+
+
+/** The version of the VRDE server interface. */
+#define VRDE_INTERFACE_VERSION_1 (1)
+#define VRDE_INTERFACE_VERSION_2 (2)
+#define VRDE_INTERFACE_VERSION_3 (3)
+#define VRDE_INTERFACE_VERSION_4 (4)
+
+/** The header that does not change when the interface changes. */
+typedef struct _VRDEINTERFACEHDR
+{
+ /** The version of the interface. */
+ uint64_t u64Version;
+
+ /** The size of the structure. */
+ uint64_t u64Size;
+
+} VRDEINTERFACEHDR;
+
+/** The VRDE server entry points. Interface version 1. */
+typedef struct _VRDEENTRYPOINTS_1
+{
+ /** The header. */
+ VRDEINTERFACEHDR header;
+
+ /** Destroy the server instance.
+ *
+ * @param hServer The server instance handle.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEDestroy,(HVRDESERVER hServer));
+
+ /** The server should start to accept clients connections.
+ *
+ * @param hServer The server instance handle.
+ * @param fEnable Whether to enable or disable client connections.
+ * When is false, all existing clients are disconnected.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEEnableConnections,(HVRDESERVER hServer,
+ bool fEnable));
+
+ /** The server should disconnect the client.
+ *
+ * @param hServer The server instance handle.
+ * @param u32ClientId The client identifier.
+ * @param fReconnect Whether to send a "REDIRECT to the same server" packet to the
+ * client before disconnecting.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEDisconnect,(HVRDESERVER hServer,
+ uint32_t u32ClientId,
+ bool fReconnect));
+
+ /**
+ * Inform the server that the display was resized.
+ * The server will query information about display
+ * from the application via callbacks.
+ *
+ * @param hServer Handle of VRDE server instance.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEResize,(HVRDESERVER hServer));
+
+ /**
+ * Send a update.
+ *
+ * Note: the server must access the framebuffer bitmap only when VRDEUpdate is called.
+ * If the have to access the bitmap later or from another thread, then
+ * it must used an intermediate buffer and copy the framebuffer data to the
+ * intermediate buffer in VRDEUpdate.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param uScreenId The screen index.
+ * @param pvUpdate Pointer to VRDEOrders.h::VRDEORDERHDR structure with extra data.
+ * @param cbUpdate Size of the update data.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEUpdate,(HVRDESERVER hServer,
+ unsigned uScreenId,
+ void *pvUpdate,
+ uint32_t cbUpdate));
+
+ /**
+ * Set the mouse pointer shape.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param pPointer The pointer shape information.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEColorPointer,(HVRDESERVER hServer,
+ const VRDECOLORPOINTER *pPointer));
+
+ /**
+ * Hide the mouse pointer.
+ *
+ * @param hServer Handle of VRDE server instance.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEHidePointer,(HVRDESERVER hServer));
+
+ /**
+ * Queues the samples to be sent to clients.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param pvSamples Address of samples to be sent.
+ * @param cSamples Number of samples.
+ * @param format Encoded audio format for these samples.
+ *
+ * @note Initialized to NULL when the application audio callbacks are NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEAudioSamples,(HVRDESERVER hServer,
+ const void *pvSamples,
+ uint32_t cSamples,
+ VRDEAUDIOFORMAT format));
+
+ /**
+ * Sets the sound volume on clients.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param left 0..0xFFFF volume level for left channel.
+ * @param right 0..0xFFFF volume level for right channel.
+ *
+ * @note Initialized to NULL when the application audio callbacks are NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEAudioVolume,(HVRDESERVER hServer,
+ uint16_t u16Left,
+ uint16_t u16Right));
+
+ /**
+ * Sends a USB request.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param u32ClientId An identifier that allows the server to find the corresponding client.
+ * The identifier is always passed by the server as a parameter
+ * of the FNVRDEUSBCALLBACK. Note that the value is the same as
+ * in the VRDESERVERCALLBACK functions.
+ * @param pvParm Function specific parameters buffer.
+ * @param cbParm Size of the buffer.
+ *
+ * @note Initialized to NULL when the application USB callbacks are NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEUSBRequest,(HVRDESERVER hServer,
+ uint32_t u32ClientId,
+ void *pvParm,
+ uint32_t cbParm));
+
+ /**
+ * Called by the application when (VRDE_CLIPBOARD_FUNCTION_*):
+ * - (0) guest announces available clipboard formats;
+ * - (1) guest requests clipboard data;
+ * - (2) guest responds to the client's request for clipboard data.
+ *
+ * @param hServer The VRDE server handle.
+ * @param u32Function The cause of the call.
+ * @param u32Format Bitmask of announced formats or the format of data.
+ * @param pvData Points to: (1) buffer to be filled with clients data;
+ * (2) data from the host.
+ * @param cbData Size of 'pvData' buffer in bytes.
+ * @param pcbActualRead Size of the copied data in bytes.
+ *
+ * @note Initialized to NULL when the application clipboard callbacks are NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEClipboard,(HVRDESERVER hServer,
+ uint32_t u32Function,
+ uint32_t u32Format,
+ void *pvData,
+ uint32_t cbData,
+ uint32_t *pcbActualRead));
+
+ /**
+ * Query various information from the VRDE server.
+ *
+ * @param hServer The VRDE server handle.
+ * @param index VRDE_QI_* identifier of information to be returned.
+ * @param pvBuffer Address of memory buffer to which the information must be written.
+ * @param cbBuffer Size of the memory buffer in bytes.
+ * @param pcbOut Size in bytes of returned information value.
+ *
+ * @remark The caller must check the *pcbOut. 0 there means no information was returned.
+ * A value greater than cbBuffer means that information is too big to fit in the
+ * buffer, in that case no information was placed to the buffer.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEQueryInfo,(HVRDESERVER hServer,
+ uint32_t index,
+ void *pvBuffer,
+ uint32_t cbBuffer,
+ uint32_t *pcbOut));
+} VRDEENTRYPOINTS_1;
+
+/** The VRDE server entry points. Interface version 2.
+ * A new entry point VRDERedirect has been added relative to version 1.
+ */
+typedef struct _VRDEENTRYPOINTS_2
+{
+ /** The header. */
+ VRDEINTERFACEHDR header;
+
+ /** Destroy the server instance.
+ *
+ * @param hServer The server instance handle.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEDestroy,(HVRDESERVER hServer));
+
+ /** The server should start to accept clients connections.
+ *
+ * @param hServer The server instance handle.
+ * @param fEnable Whether to enable or disable client connections.
+ * When is false, all existing clients are disconnected.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEEnableConnections,(HVRDESERVER hServer,
+ bool fEnable));
+
+ /** The server should disconnect the client.
+ *
+ * @param hServer The server instance handle.
+ * @param u32ClientId The client identifier.
+ * @param fReconnect Whether to send a "REDIRECT to the same server" packet to the
+ * client before disconnecting.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEDisconnect,(HVRDESERVER hServer,
+ uint32_t u32ClientId,
+ bool fReconnect));
+
+ /**
+ * Inform the server that the display was resized.
+ * The server will query information about display
+ * from the application via callbacks.
+ *
+ * @param hServer Handle of VRDE server instance.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEResize,(HVRDESERVER hServer));
+
+ /**
+ * Send a update.
+ *
+ * Note: the server must access the framebuffer bitmap only when VRDEUpdate is called.
+ * If the have to access the bitmap later or from another thread, then
+ * it must used an intermediate buffer and copy the framebuffer data to the
+ * intermediate buffer in VRDEUpdate.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param uScreenId The screen index.
+ * @param pvUpdate Pointer to VRDEOrders.h::VRDEORDERHDR structure with extra data.
+ * @param cbUpdate Size of the update data.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEUpdate,(HVRDESERVER hServer,
+ unsigned uScreenId,
+ void *pvUpdate,
+ uint32_t cbUpdate));
+
+ /**
+ * Set the mouse pointer shape.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param pPointer The pointer shape information.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEColorPointer,(HVRDESERVER hServer,
+ const VRDECOLORPOINTER *pPointer));
+
+ /**
+ * Hide the mouse pointer.
+ *
+ * @param hServer Handle of VRDE server instance.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEHidePointer,(HVRDESERVER hServer));
+
+ /**
+ * Queues the samples to be sent to clients.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param pvSamples Address of samples to be sent.
+ * @param cSamples Number of samples.
+ * @param format Encoded audio format for these samples.
+ *
+ * @note Initialized to NULL when the application audio callbacks are NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEAudioSamples,(HVRDESERVER hServer,
+ const void *pvSamples,
+ uint32_t cSamples,
+ VRDEAUDIOFORMAT format));
+
+ /**
+ * Sets the sound volume on clients.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param left 0..0xFFFF volume level for left channel.
+ * @param right 0..0xFFFF volume level for right channel.
+ *
+ * @note Initialized to NULL when the application audio callbacks are NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEAudioVolume,(HVRDESERVER hServer,
+ uint16_t u16Left,
+ uint16_t u16Right));
+
+ /**
+ * Sends a USB request.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param u32ClientId An identifier that allows the server to find the corresponding client.
+ * The identifier is always passed by the server as a parameter
+ * of the FNVRDEUSBCALLBACK. Note that the value is the same as
+ * in the VRDESERVERCALLBACK functions.
+ * @param pvParm Function specific parameters buffer.
+ * @param cbParm Size of the buffer.
+ *
+ * @note Initialized to NULL when the application USB callbacks are NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEUSBRequest,(HVRDESERVER hServer,
+ uint32_t u32ClientId,
+ void *pvParm,
+ uint32_t cbParm));
+
+ /**
+ * Called by the application when (VRDE_CLIPBOARD_FUNCTION_*):
+ * - (0) guest announces available clipboard formats;
+ * - (1) guest requests clipboard data;
+ * - (2) guest responds to the client's request for clipboard data.
+ *
+ * @param hServer The VRDE server handle.
+ * @param u32Function The cause of the call.
+ * @param u32Format Bitmask of announced formats or the format of data.
+ * @param pvData Points to: (1) buffer to be filled with clients data;
+ * (2) data from the host.
+ * @param cbData Size of 'pvData' buffer in bytes.
+ * @param pcbActualRead Size of the copied data in bytes.
+ *
+ * @note Initialized to NULL when the application clipboard callbacks are NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEClipboard,(HVRDESERVER hServer,
+ uint32_t u32Function,
+ uint32_t u32Format,
+ void *pvData,
+ uint32_t cbData,
+ uint32_t *pcbActualRead));
+
+ /**
+ * Query various information from the VRDE server.
+ *
+ * @param hServer The VRDE server handle.
+ * @param index VRDE_QI_* identifier of information to be returned.
+ * @param pvBuffer Address of memory buffer to which the information must be written.
+ * @param cbBuffer Size of the memory buffer in bytes.
+ * @param pcbOut Size in bytes of returned information value.
+ *
+ * @remark The caller must check the *pcbOut. 0 there means no information was returned.
+ * A value greater than cbBuffer means that information is too big to fit in the
+ * buffer, in that case no information was placed to the buffer.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEQueryInfo,(HVRDESERVER hServer,
+ uint32_t index,
+ void *pvBuffer,
+ uint32_t cbBuffer,
+ uint32_t *pcbOut));
+
+ /**
+ * The server should redirect the client to the specified server.
+ *
+ * @param hServer The server instance handle.
+ * @param u32ClientId The client identifier.
+ * @param pszServer The server to redirect the client to.
+ * @param pszUser The username to use for the redirection.
+ * Can be NULL.
+ * @param pszDomain The domain. Can be NULL.
+ * @param pszPassword The password. Can be NULL.
+ * @param u32SessionId The ID of the session to redirect to.
+ * @param pszCookie The routing token used by a load balancer to
+ * route the redirection. Can be NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDERedirect,(HVRDESERVER hServer,
+ uint32_t u32ClientId,
+ const char *pszServer,
+ const char *pszUser,
+ const char *pszDomain,
+ const char *pszPassword,
+ uint32_t u32SessionId,
+ const char *pszCookie));
+} VRDEENTRYPOINTS_2;
+
+/** The VRDE server entry points. Interface version 3.
+ * New entry points VRDEAudioInOpen and VRDEAudioInClose has been added relative to version 2.
+ */
+typedef struct _VRDEENTRYPOINTS_3
+{
+ /* The header. */
+ VRDEINTERFACEHDR header;
+
+ /*
+ * Same as version 2. See comment in VRDEENTRYPOINTS_2.
+ */
+
+ DECLR3CALLBACKMEMBER(void, VRDEDestroy,(HVRDESERVER hServer));
+
+ DECLR3CALLBACKMEMBER(int, VRDEEnableConnections,(HVRDESERVER hServer,
+ bool fEnable));
+
+ DECLR3CALLBACKMEMBER(void, VRDEDisconnect,(HVRDESERVER hServer,
+ uint32_t u32ClientId,
+ bool fReconnect));
+
+ DECLR3CALLBACKMEMBER(void, VRDEResize,(HVRDESERVER hServer));
+
+ DECLR3CALLBACKMEMBER(void, VRDEUpdate,(HVRDESERVER hServer,
+ unsigned uScreenId,
+ void *pvUpdate,
+ uint32_t cbUpdate));
+
+ DECLR3CALLBACKMEMBER(void, VRDEColorPointer,(HVRDESERVER hServer,
+ const VRDECOLORPOINTER *pPointer));
+
+ DECLR3CALLBACKMEMBER(void, VRDEHidePointer,(HVRDESERVER hServer));
+
+ DECLR3CALLBACKMEMBER(void, VRDEAudioSamples,(HVRDESERVER hServer,
+ const void *pvSamples,
+ uint32_t cSamples,
+ VRDEAUDIOFORMAT format));
+
+ DECLR3CALLBACKMEMBER(void, VRDEAudioVolume,(HVRDESERVER hServer,
+ uint16_t u16Left,
+ uint16_t u16Right));
+
+ DECLR3CALLBACKMEMBER(void, VRDEUSBRequest,(HVRDESERVER hServer,
+ uint32_t u32ClientId,
+ void *pvParm,
+ uint32_t cbParm));
+
+ DECLR3CALLBACKMEMBER(void, VRDEClipboard,(HVRDESERVER hServer,
+ uint32_t u32Function,
+ uint32_t u32Format,
+ void *pvData,
+ uint32_t cbData,
+ uint32_t *pcbActualRead));
+
+ DECLR3CALLBACKMEMBER(void, VRDEQueryInfo,(HVRDESERVER hServer,
+ uint32_t index,
+ void *pvBuffer,
+ uint32_t cbBuffer,
+ uint32_t *pcbOut));
+
+ DECLR3CALLBACKMEMBER(void, VRDERedirect,(HVRDESERVER hServer,
+ uint32_t u32ClientId,
+ const char *pszServer,
+ const char *pszUser,
+ const char *pszDomain,
+ const char *pszPassword,
+ uint32_t u32SessionId,
+ const char *pszCookie));
+
+ /*
+ * New for version 3.
+ */
+
+ /**
+ * Audio input open request.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param pvCtx To be used in VRDECallbackAudioIn.
+ * @param u32ClientId An identifier that allows the server to find the corresponding client.
+ * @param audioFormat Preferred format of audio data.
+ * @param u32SamplesPerBlock Preferred number of samples in one block of audio input data.
+ *
+ * @note Initialized to NULL when the VRDECallbackAudioIn callback is NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEAudioInOpen,(HVRDESERVER hServer,
+ void *pvCtx,
+ uint32_t u32ClientId,
+ VRDEAUDIOFORMAT audioFormat,
+ uint32_t u32SamplesPerBlock));
+
+ /**
+ * Audio input close request.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param u32ClientId An identifier that allows the server to find the corresponding client.
+ *
+ * @note Initialized to NULL when the VRDECallbackAudioIn callback is NULL.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEAudioInClose,(HVRDESERVER hServer,
+ uint32_t u32ClientId));
+} VRDEENTRYPOINTS_3;
+
+
+/* Indexes for VRDECallbackProperty.
+ * *_QP_* queries a property.
+ * *_SP_* sets a property.
+ */
+#define VRDE_QP_NETWORK_PORT (1) /* Obsolete. Use VRDE_QP_NETWORK_PORT_RANGE instead. */
+#define VRDE_QP_NETWORK_ADDRESS (2) /* UTF8 string. Host network interface IP address to bind to. */
+#define VRDE_QP_NUMBER_MONITORS (3) /* 32 bit. Number of monitors in the VM. */
+#define VRDE_QP_NETWORK_PORT_RANGE (4) /* UTF8 string. List of ports. The server must bind to one of
+ * free ports from the list. Example: "3000,3010-3012,4000",
+ * which tells the server to bind to either of ports:
+ * 3000, 3010, 3011, 3012, 4000.
+ */
+#define VRDE_QP_VIDEO_CHANNEL (5)
+#define VRDE_QP_VIDEO_CHANNEL_QUALITY (6)
+#define VRDE_QP_VIDEO_CHANNEL_SUNFLSH (7)
+#define VRDE_QP_FEATURE (8) /* VRDEFEATURE structure. Generic interface to query named VRDE properties. */
+#define VRDE_QP_UNIX_SOCKET_PATH (9) /* Path to a UNIX Socket for incoming connections */
+
+#define VRDE_SP_BASE 0x1000
+#define VRDE_SP_NETWORK_BIND_PORT (VRDE_SP_BASE + 1) /* 32 bit. The port number actually used by the server.
+ * If VRDECreateServer fails, it should set the port to 0.
+ * If VRDECreateServer succeeds, then the port must be set
+ * in VRDEEnableConnections to the actually used value.
+ * VRDEDestroy must set the port to 0xFFFFFFFF.
+ */
+#define VRDE_SP_CLIENT_STATUS (VRDE_SP_BASE + 2) /* UTF8 string. The change of the generic client status:
+ * "ATTACH" - the client is attached;
+ * "DETACH" - the client is detached;
+ * "NAME=..." - the client name changes.
+ * Can be used for other notifications.
+ */
+
+#pragma pack(1)
+/* VRDE_QP_FEATURE data. */
+typedef struct _VRDEFEATURE
+{
+ uint32_t u32ClientId;
+ char achInfo[1]; /* UTF8 property input name and output value. */
+} VRDEFEATURE;
+
+/* VRDE_SP_CLIENT_STATUS data. */
+typedef struct VRDECLIENTSTATUS
+{
+ uint32_t u32ClientId;
+ uint32_t cbStatus;
+ char achStatus[1]; /* UTF8 status string. */
+} VRDECLIENTSTATUS;
+
+/* A framebuffer description. */
+typedef struct _VRDEFRAMEBUFFERINFO
+{
+ const uint8_t *pu8Bits;
+ int xOrigin;
+ int yOrigin;
+ unsigned cWidth;
+ unsigned cHeight;
+ unsigned cBitsPerPixel;
+ unsigned cbLine;
+} VRDEFRAMEBUFFERINFO;
+
+#define VRDE_INPUT_SCANCODE 0
+#define VRDE_INPUT_POINT 1
+#define VRDE_INPUT_CAD 2
+#define VRDE_INPUT_RESET 3
+#define VRDE_INPUT_SYNCH 4
+
+typedef struct _VRDEINPUTSCANCODE
+{
+ unsigned uScancode;
+} VRDEINPUTSCANCODE;
+
+#define VRDE_INPUT_POINT_BUTTON1 0x01
+#define VRDE_INPUT_POINT_BUTTON2 0x02
+#define VRDE_INPUT_POINT_BUTTON3 0x04
+#define VRDE_INPUT_POINT_WHEEL_UP 0x08
+#define VRDE_INPUT_POINT_WHEEL_DOWN 0x10
+
+typedef struct _VRDEINPUTPOINT
+{
+ int x;
+ int y;
+ unsigned uButtons;
+} VRDEINPUTPOINT;
+
+#define VRDE_INPUT_SYNCH_SCROLL 0x01
+#define VRDE_INPUT_SYNCH_NUMLOCK 0x02
+#define VRDE_INPUT_SYNCH_CAPITAL 0x04
+
+typedef struct _VRDEINPUTSYNCH
+{
+ unsigned uLockStatus;
+} VRDEINPUTSYNCH;
+#pragma pack()
+
+/** The VRDE server callbacks. Interface version 1. */
+typedef struct _VRDECALLBACKS_1
+{
+ /** The header. */
+ VRDEINTERFACEHDR header;
+
+ /**
+ * Query or set various information, on how the VRDE server operates, from or to the application.
+ * Queries for properties will always return success, and if the key is not known or has no
+ * value associated with it an empty string is returned.
+ *
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param index VRDE_[Q|S]P_* identifier of information to be returned or set.
+ * @param pvBuffer Address of memory buffer to which the information must be written or read.
+ * @param cbBuffer Size of the memory buffer in bytes.
+ * @param pcbOut Size in bytes of returned information value.
+ *
+ * @return IPRT status code. VINF_BUFFER_OVERFLOW if the buffer is too small for the value.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDECallbackProperty,(void *pvCallback,
+ uint32_t index,
+ void *pvBuffer,
+ uint32_t cbBuffer,
+ uint32_t *pcbOut));
+
+ /* A client is logging in, the application must decide whether
+ * to let to connect the client. The server will drop the connection,
+ * when an error code is returned by the callback.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param u32ClientId An unique client identifier generated by the server.
+ * @param pszUser The username.
+ * @param pszPassword The password.
+ * @param pszDomain The domain.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDECallbackClientLogon,(void *pvCallback,
+ uint32_t u32ClientId,
+ const char *pszUser,
+ const char *pszPassword,
+ const char *pszDomain));
+
+ /* The client has been successfully connected. That is logon was successful and the
+ * remote desktop protocol connection completely established.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param u32ClientId An unique client identifier generated by the server.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackClientConnect,(void *pvCallback,
+ uint32_t u32ClientId));
+
+ /* The client has been disconnected.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param u32ClientId An unique client identifier generated by the server.
+ * @param fu32Intercepted What was intercepted by the client (VRDE_CLIENT_INTERCEPT_*).
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackClientDisconnect,(void *pvCallback,
+ uint32_t u32ClientId,
+ uint32_t fu32Intercepted));
+ /* The client supports one of RDP channels.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param u32ClientId An unique client identifier generated by the server.
+ * @param fu32Intercept What the client wants to intercept. One of VRDE_CLIENT_INTERCEPT_* flags.
+ * @param ppvIntercept The value to be passed to the channel specific callback.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDECallbackIntercept,(void *pvCallback,
+ uint32_t u32ClientId,
+ uint32_t fu32Intercept,
+ void **ppvIntercept));
+
+ /**
+ * Called by the server when a reply is received from a client.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param ppvIntercept The value returned by VRDECallbackIntercept for the VRDE_CLIENT_INTERCEPT_USB.
+ * @param u32ClientId Identifies the client that sent the reply.
+ * @param u8Code The operation code VRDE_USB_REQ_*.
+ * @param pvRet Points to data received from the client.
+ * @param cbRet Size of the data in bytes.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDECallbackUSB,(void *pvCallback,
+ void *pvIntercept,
+ uint32_t u32ClientId,
+ uint8_t u8Code,
+ const void *pvRet,
+ uint32_t cbRet));
+
+ /**
+ * Called by the server when (VRDE_CLIPBOARD_FUNCTION_*):
+ * - (0) client announces available clipboard formats;
+ * - (1) client requests clipboard data.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param ppvIntercept The value returned by VRDECallbackIntercept for the VRDE_CLIENT_INTERCEPT_CLIPBOARD.
+ * @param u32ClientId Identifies the RDP client that sent the reply.
+ * @param u32Function The cause of the callback.
+ * @param u32Format Bitmask of reported formats or the format of received data.
+ * @param pvData Reserved.
+ * @param cbData Reserved.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDECallbackClipboard,(void *pvCallback,
+ void *pvIntercept,
+ uint32_t u32ClientId,
+ uint32_t u32Function,
+ uint32_t u32Format,
+ const void *pvData,
+ uint32_t cbData));
+
+ /* The framebuffer information is queried.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param uScreenId The framebuffer index.
+ * @param pInfo The information structure to ber filled.
+ *
+ * @return Whether the framebuffer is available.
+ */
+ DECLR3CALLBACKMEMBER(bool, VRDECallbackFramebufferQuery,(void *pvCallback,
+ unsigned uScreenId,
+ VRDEFRAMEBUFFERINFO *pInfo));
+
+ /* Request the exclusive access to the framebuffer bitmap.
+ * Currently not used because VirtualBox makes sure that the framebuffer is available
+ * when VRDEUpdate is called.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param uScreenId The framebuffer index.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackFramebufferLock,(void *pvCallback,
+ unsigned uScreenId));
+
+ /* Release the exclusive access to the framebuffer bitmap.
+ * Currently not used because VirtualBox makes sure that the framebuffer is available
+ * when VRDEUpdate is called.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param uScreenId The framebuffer index.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackFramebufferUnlock,(void *pvCallback,
+ unsigned uScreenId));
+
+ /* Input from the client.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param pvInput The input information.
+ * @param cbInput The size of the input information.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackInput,(void *pvCallback,
+ int type,
+ const void *pvInput,
+ unsigned cbInput));
+
+ /* Video mode hint from the client.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param cWidth Requested width.
+ * @param cHeight Requested height.
+ * @param cBitsPerPixel Requested color depth.
+ * @param uScreenId The framebuffer index.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackVideoModeHint,(void *pvCallback,
+ unsigned cWidth,
+ unsigned cHeight,
+ unsigned cBitsPerPixel,
+ unsigned uScreenId));
+
+} VRDECALLBACKS_1;
+
+/* Callbacks are the same for the version 1 and version 2 interfaces. */
+typedef VRDECALLBACKS_1 VRDECALLBACKS_2;
+
+/** The VRDE server callbacks. Interface version 3. */
+typedef struct _VRDECALLBACKS_3
+{
+ /* The header. */
+ VRDEINTERFACEHDR header;
+
+ /*
+ * Same as in version 1 and 2. See comment in VRDECALLBACKS_1.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDECallbackProperty,(void *pvCallback,
+ uint32_t index,
+ void *pvBuffer,
+ uint32_t cbBuffer,
+ uint32_t *pcbOut));
+
+ DECLR3CALLBACKMEMBER(int, VRDECallbackClientLogon,(void *pvCallback,
+ uint32_t u32ClientId,
+ const char *pszUser,
+ const char *pszPassword,
+ const char *pszDomain));
+
+ DECLR3CALLBACKMEMBER(void, VRDECallbackClientConnect,(void *pvCallback,
+ uint32_t u32ClientId));
+
+ DECLR3CALLBACKMEMBER(void, VRDECallbackClientDisconnect,(void *pvCallback,
+ uint32_t u32ClientId,
+ uint32_t fu32Intercepted));
+ DECLR3CALLBACKMEMBER(int, VRDECallbackIntercept,(void *pvCallback,
+ uint32_t u32ClientId,
+ uint32_t fu32Intercept,
+ void **ppvIntercept));
+
+ DECLR3CALLBACKMEMBER(int, VRDECallbackUSB,(void *pvCallback,
+ void *pvIntercept,
+ uint32_t u32ClientId,
+ uint8_t u8Code,
+ const void *pvRet,
+ uint32_t cbRet));
+
+ DECLR3CALLBACKMEMBER(int, VRDECallbackClipboard,(void *pvCallback,
+ void *pvIntercept,
+ uint32_t u32ClientId,
+ uint32_t u32Function,
+ uint32_t u32Format,
+ const void *pvData,
+ uint32_t cbData));
+
+ DECLR3CALLBACKMEMBER(bool, VRDECallbackFramebufferQuery,(void *pvCallback,
+ unsigned uScreenId,
+ VRDEFRAMEBUFFERINFO *pInfo));
+
+ DECLR3CALLBACKMEMBER(void, VRDECallbackFramebufferLock,(void *pvCallback,
+ unsigned uScreenId));
+
+ DECLR3CALLBACKMEMBER(void, VRDECallbackFramebufferUnlock,(void *pvCallback,
+ unsigned uScreenId));
+
+ DECLR3CALLBACKMEMBER(void, VRDECallbackInput,(void *pvCallback,
+ int type,
+ const void *pvInput,
+ unsigned cbInput));
+
+ DECLR3CALLBACKMEMBER(void, VRDECallbackVideoModeHint,(void *pvCallback,
+ unsigned cWidth,
+ unsigned cHeight,
+ unsigned cBitsPerPixel,
+ unsigned uScreenId));
+
+ /*
+ * New for version 3.
+ */
+
+ /**
+ * Called by the server when something happens with audio input.
+ *
+ * @param pvCallback The callback specific pointer.
+ * @param pvCtx The value passed in VRDEAudioInOpen.
+ * @param u32ClientId Identifies the client that sent the reply.
+ * @param u32Event The event code VRDE_AUDIOIN_*.
+ * @param pvData Points to data received from the client.
+ * @param cbData Size of the data in bytes.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackAudioIn,(void *pvCallback,
+ void *pvCtx,
+ uint32_t u32ClientId,
+ uint32_t u32Event,
+ const void *pvData,
+ uint32_t cbData));
+} VRDECALLBACKS_3;
+
+/** The VRDE server entry points. Interface version 4.
+ * New entry point VRDEGetInterface has been added relative to version 3.
+ */
+typedef struct _VRDEENTRYPOINTS_4
+{
+ /* The header. */
+ VRDEINTERFACEHDR header;
+
+ /*
+ * Same as version 3. See comment in VRDEENTRYPOINTS_3.
+ */
+
+ DECLR3CALLBACKMEMBER(void, VRDEDestroy,(HVRDESERVER hServer));
+ DECLR3CALLBACKMEMBER(int, VRDEEnableConnections,(HVRDESERVER hServer, bool fEnable));
+ DECLR3CALLBACKMEMBER(void, VRDEDisconnect,(HVRDESERVER hServer, uint32_t u32ClientId, bool fReconnect));
+ DECLR3CALLBACKMEMBER(void, VRDEResize,(HVRDESERVER hServer));
+ DECLR3CALLBACKMEMBER(void, VRDEUpdate,(HVRDESERVER hServer, unsigned uScreenId, void *pvUpdate,
+ uint32_t cbUpdate));
+ DECLR3CALLBACKMEMBER(void, VRDEColorPointer,(HVRDESERVER hServer, const VRDECOLORPOINTER *pPointer));
+ DECLR3CALLBACKMEMBER(void, VRDEHidePointer,(HVRDESERVER hServer));
+ DECLR3CALLBACKMEMBER(void, VRDEAudioSamples,(HVRDESERVER hServer, const void *pvSamples, uint32_t cSamples,
+ VRDEAUDIOFORMAT format));
+ DECLR3CALLBACKMEMBER(void, VRDEAudioVolume,(HVRDESERVER hServer, uint16_t u16Left, uint16_t u16Right));
+ DECLR3CALLBACKMEMBER(void, VRDEUSBRequest,(HVRDESERVER hServer, uint32_t u32ClientId, void *pvParm,
+ uint32_t cbParm));
+ DECLR3CALLBACKMEMBER(void, VRDEClipboard,(HVRDESERVER hServer, uint32_t u32Function, uint32_t u32Format,
+ void *pvData, uint32_t cbData, uint32_t *pcbActualRead));
+ DECLR3CALLBACKMEMBER(void, VRDEQueryInfo,(HVRDESERVER hServer, uint32_t index, void *pvBuffer, uint32_t cbBuffer,
+ uint32_t *pcbOut));
+ DECLR3CALLBACKMEMBER(void, VRDERedirect,(HVRDESERVER hServer, uint32_t u32ClientId, const char *pszServer,
+ const char *pszUser, const char *pszDomain, const char *pszPassword,
+ uint32_t u32SessionId, const char *pszCookie));
+ DECLR3CALLBACKMEMBER(void, VRDEAudioInOpen,(HVRDESERVER hServer, void *pvCtx, uint32_t u32ClientId,
+ VRDEAUDIOFORMAT audioFormat, uint32_t u32SamplesPerBlock));
+ DECLR3CALLBACKMEMBER(void, VRDEAudioInClose,(HVRDESERVER hServer, uint32_t u32ClientId));
+
+ /**
+ * Generic interface query. An interface is a set of entry points and callbacks.
+ * It is not a reference counted interface.
+ *
+ * @param hServer Handle of VRDE server instance.
+ * @param pszId String identifier of the interface, like uuid.
+ * @param pInterface The interface structure to be initialized by the VRDE server.
+ * Only VRDEINTERFACEHDR is initialized by the caller.
+ * @param pCallbacks Callbacks required by the interface. The server makes a local copy.
+ * VRDEINTERFACEHDR version must correspond to the requested interface version.
+ * @param pvContext The context to be used in callbacks.
+ */
+
+ DECLR3CALLBACKMEMBER(int, VRDEGetInterface, (HVRDESERVER hServer,
+ const char *pszId,
+ VRDEINTERFACEHDR *pInterface,
+ const VRDEINTERFACEHDR *pCallbacks,
+ void *pvContext));
+} VRDEENTRYPOINTS_4;
+
+/* Callbacks are the same for the version 3 and version 4 interfaces. */
+typedef VRDECALLBACKS_3 VRDECALLBACKS_4;
+
+/**
+ * Create a new VRDE server instance. The instance is fully functional but refuses
+ * client connections until the entry point VRDEEnableConnections is called by the application.
+ *
+ * The caller prepares the VRDECALLBACKS_* structure. The header.u64Version field of the
+ * structure must be initialized with the version of the interface to use.
+ * The server will return pointer to VRDEENTRYPOINTS_* table in *ppEntryPoints
+ * to match the requested interface.
+ * That is if pCallbacks->header.u64Version == VRDE_INTERFACE_VERSION_1, then the server
+ * expects pCallbacks to point to VRDECALLBACKS_1 and will return a pointer to VRDEENTRYPOINTS_1.
+ *
+ * @param pCallback Pointer to the application callbacks which let the server to fetch
+ * the configuration data and to access the desktop.
+ * @param pvCallback The callback specific pointer to be passed back to the application.
+ * @param ppEntryPoints Where to store the pointer to the VRDE entry points structure.
+ * @param phServer Pointer to the created server instance handle.
+ *
+ * @return IPRT status code.
+ */
+DECLEXPORT(int) VRDECreateServer (const VRDEINTERFACEHDR *pCallbacks,
+ void *pvCallback,
+ VRDEINTERFACEHDR **ppEntryPoints,
+ HVRDESERVER *phServer);
+
+typedef DECLCALLBACKTYPE(int, FNVRDECREATESERVER,(const VRDEINTERFACEHDR *pCallbacks,
+ void *pvCallback,
+ VRDEINTERFACEHDR **ppEntryPoints,
+ HVRDESERVER *phServer));
+typedef FNVRDECREATESERVER *PFNVRDECREATESERVER;
+
+/**
+ * List of names of the VRDE properties, which are recognized by the VRDE.
+ *
+ * For example VRDESupportedProperties should return gapszProperties declared as:
+ *
+ * static const char * const gapszProperties[] =
+ * {
+ * "TCP/Ports",
+ * "TCP/Address",
+ * NULL
+ * };
+ *
+ * @returns pointer to array of pointers to name strings (UTF8).
+ */
+DECLEXPORT(const char * const *) VRDESupportedProperties (void);
+
+typedef DECLCALLBACKTYPE(const char * const *, FNVRDESUPPORTEDPROPERTIES,(void));
+typedef FNVRDESUPPORTEDPROPERTIES *PFNVRDESUPPORTEDPROPERTIES;
+
+RT_C_DECLS_END
+
+/** @} */
+
+#endif /* !VBOX_INCLUDED_RemoteDesktop_VRDE_h */
diff --git a/include/VBox/RemoteDesktop/VRDEImage.h b/include/VBox/RemoteDesktop/VRDEImage.h
new file mode 100644
index 00000000..54cd674e
--- /dev/null
+++ b/include/VBox/RemoteDesktop/VRDEImage.h
@@ -0,0 +1,256 @@
+/** @file
+ * VBox Remote Desktop Extension (VRDE) - Image updates interface.
+ */
+
+/*
+ * Copyright (C) 2006-2022 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program 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, in version 3 of the
+ * License.
+ *
+ * This program 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 program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+#ifndef VBOX_INCLUDED_RemoteDesktop_VRDEImage_h
+#define VBOX_INCLUDED_RemoteDesktop_VRDEImage_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include <VBox/RemoteDesktop/VRDE.h>
+
+/*
+ * Generic interface for external image updates with a clipping region to be sent
+ * to the client.
+ *
+ * Async callbacks are used for reporting errors, providing feedback, etc.
+ */
+
+#define VRDE_IMAGE_INTERFACE_NAME "IMAGE"
+
+#ifdef __cplusplus
+class VRDEImage;
+typedef class VRDEImage *HVRDEIMAGE;
+#else
+struct VRDEImage;
+typedef struct VRDEImage *HVRDEIMAGE;
+#endif /* __cplusplus */
+
+/*
+ * Format description structures for VRDEImageHandleCreate.
+ */
+typedef struct VRDEIMAGEFORMATBITMAP
+{
+ uint32_t u32BytesPerPixel; /** @todo impl */
+} VRDEIMAGEFORMATBITMAP;
+
+typedef struct VRDEIMAGEBITMAP
+{
+ uint32_t cWidth; /* The width of the bitmap in pixels. */
+ uint32_t cHeight; /* The height of the bitmap in pixels. */
+ const void *pvData; /* Address of pixel buffer. */
+ uint32_t cbData; /* Size of pixel buffer. */
+ const void *pvScanLine0; /* Address of first scanline. */
+ int32_t iScanDelta; /* Difference between two scanlines. */
+} VRDEIMAGEBITMAP;
+
+/*
+ * Image update handle creation flags.
+ */
+#define VRDE_IMAGE_F_CREATE_DEFAULT 0x00000000
+#define VRDE_IMAGE_F_CREATE_CONTENT_3D 0x00000001 /* Input image data is a rendered 3d scene. */
+#define VRDE_IMAGE_F_CREATE_CONTENT_VIDEO 0x00000002 /* Input image data is a sequence of video frames. */
+#define VRDE_IMAGE_F_CREATE_WINDOW 0x00000004 /* pRect parameter is the image update area. */
+
+/*
+ * Completion flags for image update handle creation.
+ */
+#define VRDE_IMAGE_F_COMPLETE_DEFAULT 0x00000000 /* The handle has been created. */
+#define VRDE_IMAGE_F_COMPLETE_ASYNC 0x00000001 /* The server will call VRDEImageCbNotify when the handle is ready. */
+
+/*
+ * Supported input image formats.
+ *
+ * The identifiers are arbitrary and new formats can be introduced later.
+ *
+ */
+#define VRDE_IMAGE_FMT_ID_BITMAP_BGRA8 "BITMAP_BGRA8.07e46a64-e93e-41d4-a845-204094f5ccf1"
+
+/** The VRDE server external image updates interface entry points. Interface version 1. */
+typedef struct VRDEIMAGEINTERFACE
+{
+ /** The header. */
+ VRDEINTERFACEHDR header;
+
+ /** Create image updates handle.
+ *
+ * The server can setup a context which will speed up further updates.
+ *
+ * A failure is returned if the server either does not support requested updates
+ * or it failed to create a handle.
+ *
+ * A success means that the server was able to create an internal context for
+ * the updates.
+ *
+ * @param hServer The server instance handle.
+ * @param phImage The returned image updates handle.
+ * @param pvUser The caller context of the call.
+ * @param u32ScreenId Updates are for this screen in a multimonitor config.
+ * @param fu32Flags VRDE_IMAGE_F_CREATE_* flags, which describe input data.
+ * @param pRect If VRDE_IMAGE_F_CREATE_WINDOW is set, this is the area of expected updates.
+ * Otherwise the entire screen will be used for updates.
+ * @param pvFormat Format specific data.
+ * @param cbFormat Size of format specific data.
+ * @param *pfu32CompletionFlags VRDE_IMAGE_F_COMPLETE_* flags. Async handle creation, etc.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEImageHandleCreate, (HVRDESERVER hServer,
+ HVRDEIMAGE *phImage,
+ void *pvUser,
+ uint32_t u32ScreenId,
+ uint32_t fu32Flags,
+ const RTRECT *pRect,
+ const char *pszFormatId,
+ const void *pvFormat,
+ uint32_t cbFormat,
+ uint32_t *pfu32CompletionFlags));
+
+ /** Create image updates handle.
+ *
+ * @param hImage The image updates handle, which the caller will not use anymore.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEImageHandleClose, (HVRDEIMAGE hImage));
+
+ /** Set a clipping region for a particular screen.
+ *
+ * @param hImage The image updates handle.
+ * @param cRects How many rectangles. 0 clears region for this screen.
+ * @param paRects Rectangles in the screen coordinates.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEImageRegionSet, (HVRDEIMAGE hImage,
+ uint32_t cRects,
+ const RTRECT *paRects));
+
+ /** Set the new position of the update area. Only works if the image handle
+ * has been created with VRDE_IMAGE_F_CREATE_WINDOW.
+ *
+ * @param hImage The image updates handle.
+ * @param pRect New area rectangle in the screen coordinates.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEImageGeometrySet, (HVRDEIMAGE hImage,
+ const RTRECT *pRect));
+
+ /** Set a configuration parameter.
+ *
+ * @param hImage The image updates handle.
+ * @param pszName The parameter name.
+ * @param pszValue The parameter value.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEImagePropertySet, (HVRDEIMAGE hImage,
+ const char *pszName,
+ const char *pszValue));
+
+ /** Query a configuration parameter.
+ *
+ * @param hImage The image updates handle.
+ * @param pszName The parameter name.
+ * @param pszValue The parameter value.
+ * @param cbValueIn The size of pszValue buffer.
+ * @param pcbValueOut The length of data returned in pszValue buffer.
+ *
+ * Properties names:
+ * "ID" - an unique string for this hImage.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEImagePropertyQuery, (HVRDEIMAGE hImage,
+ const char *pszName,
+ char *pszValue,
+ uint32_t cbValueIn,
+ uint32_t *pcbValueOut));
+
+ /** Data for an image update.
+ *
+ * @param hImage The image updates handle.
+ * @param i32TargetX Target x.
+ * @param i32TargetY Target y.
+ * @param i32TargetW Target width.
+ * @param i32TargetH Target height.
+ * @param pvImageData Format specific image data (for example VRDEIMAGEBITMAP).
+ * @param cbImageData Size of format specific image data.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEImageUpdate, (HVRDEIMAGE hImage,
+ int32_t i32TargetX,
+ int32_t i32TargetY,
+ uint32_t u32TargetW,
+ uint32_t u32TargetH,
+ const void *pvImageData,
+ uint32_t cbImageData));
+} VRDEIMAGEINTERFACE;
+
+/*
+ * Notifications.
+ * u32Id parameter of VRDEIMAGECALLBACKS::VRDEImageCbNotify.
+ */
+#define VRDE_IMAGE_NOTIFY_HANDLE_CREATE 1 /* Async result of VRDEImageHandleCreate.
+ * pvData: uint32_t = 0 if stream was not created,
+ * a non zero value otherwise.
+ */
+
+typedef struct VRDEIMAGECALLBACKS
+{
+ /** The header. */
+ VRDEINTERFACEHDR header;
+
+ /** Generic notification callback.
+ *
+ * @param hServer The server instance handle.
+ * @param pvContext The callbacks context specified in VRDEGetInterface.
+ * @param pvUser The pvUser parameter of VRDEImageHandleCreate.
+ * @param hImage The handle, same as returned by VRDEImageHandleCreate.
+ * @param u32Id The notification identifier: VRDE_IMAGE_NOTIFY_*.
+ * @param pvData The callback specific data.
+ * @param cbData The size of buffer pointed by pvData.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEImageCbNotify,(void *pvContext,
+ void *pvUser,
+ HVRDEIMAGE hVideo,
+ uint32_t u32Id,
+ void *pvData,
+ uint32_t cbData));
+} VRDEIMAGECALLBACKS;
+
+#endif /* !VBOX_INCLUDED_RemoteDesktop_VRDEImage_h */
diff --git a/include/VBox/RemoteDesktop/VRDEInput.h b/include/VBox/RemoteDesktop/VRDEInput.h
new file mode 100644
index 00000000..378520ec
--- /dev/null
+++ b/include/VBox/RemoteDesktop/VRDEInput.h
@@ -0,0 +1,234 @@
+/** @file
+ * VBox Remote Desktop Extension (VRDE) - Input interface.
+ */
+
+/*
+ * Copyright (C) 2013-2022 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program 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, in version 3 of the
+ * License.
+ *
+ * This program 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 program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+#ifndef VBOX_INCLUDED_RemoteDesktop_VRDEInput_h
+#define VBOX_INCLUDED_RemoteDesktop_VRDEInput_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include <VBox/RemoteDesktop/VRDE.h>
+
+/*
+ * Interface for receiving input events from the client.
+ */
+
+/* All structures in this file are packed.
+ * Everything is little-endian.
+ */
+#pragma pack(1)
+
+/*
+ * The application interface between VirtualBox and the VRDE server.
+ */
+
+#define VRDE_INPUT_INTERFACE_NAME "VRDE::INPUT"
+
+/*
+ * Supported input methods.
+ */
+#define VRDE_INPUT_METHOD_TOUCH 1
+
+/*
+ * fu32Flags for VRDEInputSetup
+ */
+#define VRDE_INPUT_F_ENABLE 1
+
+/* The interface entry points. Interface version 1. */
+typedef struct VRDEINPUTINTERFACE
+{
+ /* The header. */
+ VRDEINTERFACEHDR header;
+
+ /* Tell the server that an input method will be used or disabled, etc.
+ * VRDECallbackInputSetup will be called with a result.
+ *
+ * @param hServer The VRDE server instance.
+ * @param u32Method The method VRDE_INPUT_METHOD_*.
+ * @param fu32Flags What to do with the method VRDE_INPUT_F_*.
+ * @param pvSetup Method specific parameters (optional).
+ * @param cbSetup Size of method specific parameters (optional).
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEInputSetup, (HVRDESERVER hServer,
+ uint32_t u32Method,
+ uint32_t fu32Flags,
+ const void *pvSetup,
+ uint32_t cbSetup));
+} VRDEINPUTINTERFACE;
+
+
+/* Interface callbacks. */
+typedef struct VRDEINPUTCALLBACKS
+{
+ /* The header. */
+ VRDEINTERFACEHDR header;
+
+ /* VRDPInputSetup async result.
+ *
+ * @param pvCallback The callbacks context specified in VRDEGetInterface.
+ * @param rcSetup The result code of the request.
+ * @param u32Method The method VRDE_INPUT_METHOD_*.
+ * @param pvResult The result information.
+ * @param cbResult The size of buffer pointed by pvResult.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackInputSetup,(void *pvCallback,
+ int rcRequest,
+ uint32_t u32Method,
+ const void *pvResult,
+ uint32_t cbResult));
+
+ /* Input event.
+ *
+ * @param pvCallback The callbacks context specified in VRDEGetInterface.
+ * @param u32Method The method VRDE_INPUT_METHOD_*.
+ * @param pvEvent The event data.
+ * @param cbEvent The size of buffer pointed by pvEvent.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackInputEvent,(void *pvCallback,
+ uint32_t u32Method,
+ const void *pvEvent,
+ uint32_t cbEvent));
+} VRDEINPUTCALLBACKS;
+
+
+/*
+ * Touch input definitions VRDE_INPUT_METHOD_TOUCH.
+ */
+
+/* pvResult is not used */
+
+/* RDPINPUT_HEADER */
+typedef struct VRDEINPUTHEADER
+{
+ uint16_t u16EventId;
+ uint32_t u32PDULength;
+} VRDEINPUTHEADER;
+
+/* VRDEINPUTHEADER::u16EventId */
+#define VRDEINPUT_EVENTID_SC_READY 0x0001
+#define VRDEINPUT_EVENTID_CS_READY 0x0002
+#define VRDEINPUT_EVENTID_TOUCH 0x0003
+#define VRDEINPUT_EVENTID_SUSPEND_TOUCH 0x0004
+#define VRDEINPUT_EVENTID_RESUME_TOUCH 0x0005
+#define VRDEINPUT_EVENTID_DISMISS_HOVERING_CONTACT 0x0006
+
+/* RDPINPUT_SC_READY_PDU */
+typedef struct VRDEINPUT_SC_READY_PDU
+{
+ VRDEINPUTHEADER header;
+ uint32_t u32ProtocolVersion;
+} VRDEINPUT_SC_READY_PDU;
+
+#define VRDEINPUT_PROTOCOL_V1 0x00010000
+#define VRDEINPUT_PROTOCOL_V101 0x00010001
+
+/* RDPINPUT_CS_READY_PDU */
+typedef struct VRDEINPUT_CS_READY_PDU
+{
+ VRDEINPUTHEADER header;
+ uint32_t u32Flags;
+ uint32_t u32ProtocolVersion;
+ uint16_t u16MaxTouchContacts;
+} VRDEINPUT_CS_READY_PDU;
+
+#define VRDEINPUT_READY_FLAGS_SHOW_TOUCH_VISUALS 0x00000001
+#define VRDEINPUT_READY_FLAGS_DISABLE_TIMESTAMP_INJECTION 0x00000002
+
+/* RDPINPUT_CONTACT_DATA */
+typedef struct VRDEINPUT_CONTACT_DATA
+{
+ uint8_t u8ContactId;
+ uint16_t u16FieldsPresent;
+ int32_t i32X;
+ int32_t i32Y;
+ uint32_t u32ContactFlags;
+ int16_t i16ContactRectLeft;
+ int16_t i16ContactRectTop;
+ int16_t i16ContactRectRight;
+ int16_t i16ContactRectBottom;
+ uint32_t u32Orientation;
+ uint32_t u32Pressure;
+} VRDEINPUT_CONTACT_DATA;
+
+#define VRDEINPUT_CONTACT_DATA_CONTACTRECT_PRESENT 0x0001
+#define VRDEINPUT_CONTACT_DATA_ORIENTATION_PRESENT 0x0002
+#define VRDEINPUT_CONTACT_DATA_PRESSURE_PRESENT 0x0004
+
+#define VRDEINPUT_CONTACT_FLAG_DOWN 0x0001
+#define VRDEINPUT_CONTACT_FLAG_UPDATE 0x0002
+#define VRDEINPUT_CONTACT_FLAG_UP 0x0004
+#define VRDEINPUT_CONTACT_FLAG_INRANGE 0x0008
+#define VRDEINPUT_CONTACT_FLAG_INCONTACT 0x0010
+#define VRDEINPUT_CONTACT_FLAG_CANCELED 0x0020
+
+/* RDPINPUT_TOUCH_FRAME */
+typedef struct VRDEINPUT_TOUCH_FRAME
+{
+ uint16_t u16ContactCount;
+ uint64_t u64FrameOffset;
+ VRDEINPUT_CONTACT_DATA aContacts[1];
+} VRDEINPUT_TOUCH_FRAME;
+
+/* RDPINPUT_TOUCH_EVENT_PDU */
+typedef struct VRDEINPUT_TOUCH_EVENT_PDU
+{
+ VRDEINPUTHEADER header;
+ uint32_t u32EncodeTime;
+ uint16_t u16FrameCount;
+ VRDEINPUT_TOUCH_FRAME aFrames[1];
+} VRDEINPUT_TOUCH_EVENT_PDU;
+
+/* RDPINPUT_SUSPEND_TOUCH_PDU */
+typedef struct VRDEINPUT_SUSPEND_TOUCH_PDU
+{
+ VRDEINPUTHEADER header;
+} VRDEINPUT_SUSPEND_TOUCH_PDU;
+
+/* RDPINPUT_RESUME_TOUCH_PDU */
+typedef struct VRDEINPUT_RESUME_TOUCH_PDU
+{
+ VRDEINPUTHEADER header;
+} VRDEINPUT_RESUME_TOUCH_PDU;
+
+/* RDPINPUT_DISMISS_HOVERING_CONTACT_PDU */
+typedef struct VRDEINPUT_DISMISS_HOVERING_CONTACT_PDU
+{
+ VRDEINPUTHEADER header;
+ uint8_t u8ContactId;
+} VRDEINPUT_DISMISS_HOVERING_CONTACT_PDU;
+
+#pragma pack()
+
+#endif /* !VBOX_INCLUDED_RemoteDesktop_VRDEInput_h */
diff --git a/include/VBox/RemoteDesktop/VRDEMousePtr.h b/include/VBox/RemoteDesktop/VRDEMousePtr.h
new file mode 100644
index 00000000..e62bc708
--- /dev/null
+++ b/include/VBox/RemoteDesktop/VRDEMousePtr.h
@@ -0,0 +1,82 @@
+/** @file
+ * VBox Remote Desktop Extension (VRDE) - Mouse pointer updates interface.
+ */
+
+/*
+ * Copyright (C) 2012-2022 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program 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, in version 3 of the
+ * License.
+ *
+ * This program 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 program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+#ifndef VBOX_INCLUDED_RemoteDesktop_VRDEMousePtr_h
+#define VBOX_INCLUDED_RemoteDesktop_VRDEMousePtr_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include <VBox/RemoteDesktop/VRDE.h>
+
+/*
+ * Interface for mouse pointer updates.
+ */
+
+#define VRDE_MOUSEPTR_INTERFACE_NAME "MOUSEPTR"
+
+#pragma pack(1)
+/* The color mouse pointer information: maximum allowed pointer size is 256x256. */
+typedef struct VRDEMOUSEPTRDATA
+{
+ uint16_t u16HotX;
+ uint16_t u16HotY;
+ uint16_t u16Width;
+ uint16_t u16Height;
+ uint16_t u16MaskLen; /* 0 for 32BPP pointers with alpha channel. */
+ uint32_t u32DataLen;
+ /* uint8_t au8Mask[u16MaskLen]; The 1BPP mask. Optional: does not exist if u16MaskLen == 0. */
+ /* uint8_t au8Data[u16DataLen]; The color bitmap, 32 bits color depth. */
+} VRDEMOUSEPTRDATA;
+#pragma pack()
+
+/** The VRDE server external mouse pointer updates interface entry points. Interface version 1. */
+typedef struct VRDEMOUSEPTRINTERFACE
+{
+ /** The header. */
+ VRDEINTERFACEHDR header;
+
+ /** Set the mouse pointer.
+ *
+ * @param hServer The server instance handle.
+ * @param pPointer The mouse pointer description.
+ *
+ */
+ DECLR3CALLBACKMEMBER(void, VRDEMousePtr, (HVRDESERVER hServer,
+ const VRDEMOUSEPTRDATA *pPointer));
+
+} VRDEMOUSEPTRINTERFACE;
+
+#endif /* !VBOX_INCLUDED_RemoteDesktop_VRDEMousePtr_h */
diff --git a/include/VBox/RemoteDesktop/VRDEOrders.h b/include/VBox/RemoteDesktop/VRDEOrders.h
new file mode 100644
index 00000000..06428fe0
--- /dev/null
+++ b/include/VBox/RemoteDesktop/VRDEOrders.h
@@ -0,0 +1,310 @@
+/** @file
+ * VBox Remote Desktop Extension (VRDE) - Graphics Orders Structures.
+ */
+
+/*
+ * Copyright (C) 2006-2022 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program 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, in version 3 of the
+ * License.
+ *
+ * This program 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 program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+#ifndef VBOX_INCLUDED_RemoteDesktop_VRDEOrders_h
+#define VBOX_INCLUDED_RemoteDesktop_VRDEOrders_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include <iprt/types.h>
+
+/*
+ * VRDE gets an information about a graphical update as a pointer
+ * to a memory block and the size of the memory block.
+ * The memory block layout is:
+ * VRDEORDERHDR - Describes the affected rectangle.
+ * Then VRDE orders follow:
+ * VRDEORDERCODE;
+ * a VRDEORDER* structure.
+ *
+ * If size of the memory block is equal to the VRDEORDERHDR, then a bitmap
+ * update is assumed.
+ */
+
+/* VRDE order codes. Must be >= 0, because the VRDE internally
+ * uses negative values to mark some operations.
+ */
+#define VRDE_ORDER_DIRTY_RECT (0)
+#define VRDE_ORDER_SOLIDRECT (1)
+#define VRDE_ORDER_SOLIDBLT (2)
+#define VRDE_ORDER_DSTBLT (3)
+#define VRDE_ORDER_SCREENBLT (4)
+#define VRDE_ORDER_PATBLTBRUSH (5)
+#define VRDE_ORDER_MEMBLT (6)
+#define VRDE_ORDER_CACHED_BITMAP (7)
+#define VRDE_ORDER_DELETED_BITMAP (8)
+#define VRDE_ORDER_LINE (9)
+#define VRDE_ORDER_BOUNDS (10)
+#define VRDE_ORDER_REPEAT (11)
+#define VRDE_ORDER_POLYLINE (12)
+#define VRDE_ORDER_ELLIPSE (13)
+#define VRDE_ORDER_SAVESCREEN (14)
+#define VRDE_ORDER_TEXT (15)
+
+/* 128 bit bitmap hash. */
+typedef uint8_t VRDEBITMAPHASH[16];
+
+#pragma pack(1)
+typedef struct _VRDEORDERHDR
+{
+ /** Coordinates of the affected rectangle. */
+ int16_t x;
+ int16_t y;
+ uint16_t w;
+ uint16_t h;
+} VRDEORDERHDR;
+
+typedef struct _VRDEORDERCODE
+{
+ uint32_t u32Code;
+} VRDEORDERCODE;
+
+typedef struct _VRDEORDERPOINT
+{
+ int16_t x;
+ int16_t y;
+} VRDEORDERPOINT;
+
+typedef struct _VRDEORDERPOLYPOINTS
+{
+ uint8_t c;
+ VRDEORDERPOINT a[16];
+} VRDEORDERPOLYPOINTS;
+
+typedef struct _VRDEORDERAREA
+{
+ int16_t x;
+ int16_t y;
+ uint16_t w;
+ uint16_t h;
+} VRDEORDERAREA;
+
+typedef struct _VRDEORDERRECT
+{
+ int16_t left;
+ int16_t top;
+ int16_t right;
+ int16_t bottom;
+} VRDEORDERRECT;
+
+
+typedef struct _VRDEORDERBOUNDS
+{
+ VRDEORDERPOINT pt1;
+ VRDEORDERPOINT pt2;
+} VRDEORDERBOUNDS;
+
+typedef struct _VRDEORDERREPEAT
+{
+ VRDEORDERBOUNDS bounds;
+} VRDEORDERREPEAT;
+
+
+/* Header for bitmap bits. */
+typedef struct _VRDEDATABITS
+{
+ uint32_t cb; /* Size of bitmap data without the header. */
+ int16_t x;
+ int16_t y;
+ uint16_t cWidth;
+ uint16_t cHeight;
+ uint8_t cbPixel;
+ /* Bitmap data follow. */
+} VRDEDATABITS;
+
+typedef struct _VRDEORDERSOLIDRECT
+{
+ int16_t x;
+ int16_t y;
+ uint16_t w;
+ uint16_t h;
+ uint32_t rgb;
+} VRDEORDERSOLIDRECT;
+
+typedef struct _VRDEORDERSOLIDBLT
+{
+ int16_t x;
+ int16_t y;
+ uint16_t w;
+ uint16_t h;
+ uint32_t rgb;
+ uint8_t rop;
+} VRDEORDERSOLIDBLT;
+
+typedef struct _VRDEORDERDSTBLT
+{
+ int16_t x;
+ int16_t y;
+ uint16_t w;
+ uint16_t h;
+ uint8_t rop;
+} VRDEORDERDSTBLT;
+
+typedef struct _VRDEORDERSCREENBLT
+{
+ int16_t x;
+ int16_t y;
+ uint16_t w;
+ uint16_t h;
+ int16_t xSrc;
+ int16_t ySrc;
+ uint8_t rop;
+} VRDEORDERSCREENBLT;
+
+typedef struct _VRDEORDERPATBLTBRUSH
+{
+ int16_t x;
+ int16_t y;
+ uint16_t w;
+ uint16_t h;
+ int8_t xSrc;
+ int8_t ySrc;
+ uint32_t rgbFG;
+ uint32_t rgbBG;
+ uint8_t rop;
+ uint8_t pattern[8];
+} VRDEORDERPATBLTBRUSH;
+
+typedef struct _VRDEORDERMEMBLT
+{
+ int16_t x;
+ int16_t y;
+ uint16_t w;
+ uint16_t h;
+ int16_t xSrc;
+ int16_t ySrc;
+ uint8_t rop;
+ VRDEBITMAPHASH hash;
+} VRDEORDERMEMBLT;
+
+typedef struct _VRDEORDERCACHEDBITMAP
+{
+ VRDEBITMAPHASH hash;
+ /* VRDEDATABITS and the bitmap data follow. */
+} VRDEORDERCACHEDBITMAP;
+
+typedef struct _VRDEORDERDELETEDBITMAP
+{
+ VRDEBITMAPHASH hash;
+} VRDEORDERDELETEDBITMAP;
+
+typedef struct _VRDEORDERLINE
+{
+ int16_t x1;
+ int16_t y1;
+ int16_t x2;
+ int16_t y2;
+ int16_t xBounds1;
+ int16_t yBounds1;
+ int16_t xBounds2;
+ int16_t yBounds2;
+ uint8_t mix;
+ uint32_t rgb;
+} VRDEORDERLINE;
+
+typedef struct _VRDEORDERPOLYLINE
+{
+ VRDEORDERPOINT ptStart;
+ uint8_t mix;
+ uint32_t rgb;
+ VRDEORDERPOLYPOINTS points;
+} VRDEORDERPOLYLINE;
+
+typedef struct _VRDEORDERELLIPSE
+{
+ VRDEORDERPOINT pt1;
+ VRDEORDERPOINT pt2;
+ uint8_t mix;
+ uint8_t fillMode;
+ uint32_t rgb;
+} VRDEORDERELLIPSE;
+
+typedef struct _VRDEORDERSAVESCREEN
+{
+ VRDEORDERPOINT pt1;
+ VRDEORDERPOINT pt2;
+ uint8_t ident;
+ uint8_t restore;
+} VRDEORDERSAVESCREEN;
+
+typedef struct _VRDEORDERGLYPH
+{
+ uint32_t o32NextGlyph;
+ uint64_t u64Handle;
+
+ /* The glyph origin position on the screen. */
+ int16_t x;
+ int16_t y;
+
+ /* The glyph bitmap dimensions. Note w == h == 0 for the space character. */
+ uint16_t w;
+ uint16_t h;
+
+ /* The character origin in the bitmap. */
+ int16_t xOrigin;
+ int16_t yOrigin;
+
+ /* 1BPP bitmap. Rows are byte aligned. Size is (((w + 7)/8) * h + 3) & ~3. */
+ uint8_t au8Bitmap[1];
+} VRDEORDERGLYPH;
+
+typedef struct _VRDEORDERTEXT
+{
+ uint32_t cbOrder;
+
+ int16_t xBkGround;
+ int16_t yBkGround;
+ uint16_t wBkGround;
+ uint16_t hBkGround;
+
+ int16_t xOpaque;
+ int16_t yOpaque;
+ uint16_t wOpaque;
+ uint16_t hOpaque;
+
+ uint16_t u16MaxGlyph;
+
+ uint8_t u8Glyphs;
+ uint8_t u8Flags;
+ uint16_t u8CharInc;
+ uint32_t u32FgRGB;
+ uint32_t u32BgRGB;
+
+ /* u8Glyphs glyphs follow. Size of each glyph structure may vary. */
+} VRDEORDERTEXT;
+#pragma pack()
+
+#endif /* !VBOX_INCLUDED_RemoteDesktop_VRDEOrders_h */
diff --git a/include/VBox/RemoteDesktop/VRDESCard.h b/include/VBox/RemoteDesktop/VRDESCard.h
new file mode 100644
index 00000000..9281ebed
--- /dev/null
+++ b/include/VBox/RemoteDesktop/VRDESCard.h
@@ -0,0 +1,528 @@
+/** @file
+ * VBox Remote Desktop Extension (VRDE) - SmartCard interface.
+ */
+
+/*
+ * Copyright (C) 2011-2022 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program 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, in version 3 of the
+ * License.
+ *
+ * This program 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 program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+#ifndef VBOX_INCLUDED_RemoteDesktop_VRDESCard_h
+#define VBOX_INCLUDED_RemoteDesktop_VRDESCard_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include <VBox/RemoteDesktop/VRDE.h>
+
+/*
+ * Interface for accessing the smart card reader devices on the client.
+ *
+ * Async callbacks are used for providing feedback, reporting errors, etc.
+ *
+ * The caller prepares a VRDESCARD*REQ structure and submits it.
+ */
+
+#define VRDE_SCARD_INTERFACE_NAME "SCARD"
+
+/** The VRDE server smart card access interface entry points. Interface version 1. */
+typedef struct VRDESCARDINTERFACE
+{
+ /** The header. */
+ VRDEINTERFACEHDR header;
+
+ /** Submit an async IO request to the client.
+ *
+ * @param hServer The VRDE server instance.
+ * @param pvUser The callers context of this request.
+ * @param u32Function The function: VRDE_SCARD_FN_*.
+ * @param pvData Function specific data: VRDESCARD*REQ.
+ * @param cbData Size of data.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDESCardRequest, (HVRDESERVER hServer,
+ void *pvUser,
+ uint32_t u32Function,
+ const void *pvData,
+ uint32_t cbData));
+
+} VRDESCARDINTERFACE;
+
+/* Smartcard interface callbacks. */
+typedef struct VRDESCARDCALLBACKS
+{
+ /** The header. */
+ VRDEINTERFACEHDR header;
+
+ /** Notifications.
+ *
+ * @param pvContext The callbacks context specified in VRDEGetInterface.
+ * @param u32Id The notification identifier: VRDE_SCARD_NOTIFY_*.
+ * @param pvData The notification specific data.
+ * @param cbData The size of buffer pointed by pvData.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDESCardCbNotify, (void *pvContext,
+ uint32_t u32Id,
+ void *pvData,
+ uint32_t cbData));
+
+ /** IO response.
+ *
+ * @param pvContext The callbacks context specified in VRDEGetInterface.
+ * @param rcRequest The IPRT status code for the request.
+ * @param pvUser The pvUser parameter of VRDESCardRequest.
+ * @param u32Function The completed function: VRDE_SCARD_FN_*.
+ * @param pvData Function specific response data: VRDESCARD*RSP.
+ * @param cbData The size of the buffer pointed by pvData.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDESCardCbResponse, (void *pvContext,
+ int rcRequest,
+ void *pvUser,
+ uint32_t u32Function,
+ void *pvData,
+ uint32_t cbData));
+} VRDESCARDCALLBACKS;
+
+
+/*
+ * Notifications.
+ * u32Id parameter of VRDESCARDCALLBACKS::VRDESCardCbNotify.
+ */
+
+#define VRDE_SCARD_NOTIFY_ATTACH 1 /* A SCARD RDPDR device has been attached. */
+#define VRDE_SCARD_NOTIFY_DETACH 2 /* A SCARD RDPDR device has been detached. */
+
+/*
+ * Notifications.
+ * Data structures: pvData of VRDESCARDCALLBACKS::VRDESCardCbNotify.
+ */
+typedef struct VRDESCARDNOTIFYATTACH
+{
+ uint32_t u32ClientId;
+ uint32_t u32DeviceId;
+} VRDESCARDNOTIFYATTACH;
+
+typedef struct VRDESCARDNOTIFYDETACH
+{
+ uint32_t u32ClientId;
+ uint32_t u32DeviceId;
+} VRDESCARDNOTIFYDETACH;
+
+
+/*
+ * IO request codes.
+ * Must be not 0, which is used internally.
+ */
+
+#define VRDE_SCARD_FN_ESTABLISHCONTEXT 1
+#define VRDE_SCARD_FN_LISTREADERS 2
+#define VRDE_SCARD_FN_RELEASECONTEXT 3
+#define VRDE_SCARD_FN_GETSTATUSCHANGE 4
+#define VRDE_SCARD_FN_CANCEL 5
+#define VRDE_SCARD_FN_CONNECT 6
+#define VRDE_SCARD_FN_RECONNECT 7
+#define VRDE_SCARD_FN_DISCONNECT 8
+#define VRDE_SCARD_FN_BEGINTRANSACTION 9
+#define VRDE_SCARD_FN_ENDTRANSACTION 10
+#define VRDE_SCARD_FN_STATE 11
+#define VRDE_SCARD_FN_STATUS 12
+#define VRDE_SCARD_FN_TRANSMIT 13
+#define VRDE_SCARD_FN_CONTROL 14
+#define VRDE_SCARD_FN_GETATTRIB 15
+#define VRDE_SCARD_FN_SETATTRIB 16
+
+#define VRDE_SCARD_MAX_READERS 10
+#define VRDE_SCARD_MAX_ATR_LENGTH 36
+#define VRDE_SCARD_MAX_PCI_DATA 1024
+
+#define VRDE_SCARD_S_SUCCESS 0x00000000
+#define VRDE_SCARD_F_INTERNAL_ERROR 0x80100001
+#define VRDE_SCARD_E_CANCELLED 0x80100002
+#define VRDE_SCARD_E_INVALID_HANDLE 0x80100003
+#define VRDE_SCARD_E_INVALID_PARAMETER 0x80100004
+#define VRDE_SCARD_E_INVALID_TARGET 0x80100005
+#define VRDE_SCARD_E_NO_MEMORY 0x80100006
+#define VRDE_SCARD_F_WAITED_TOO_LONG 0x80100007
+#define VRDE_SCARD_E_INSUFFICIENT_BUFFER 0x80100008
+#define VRDE_SCARD_E_UNKNOWN_READER 0x80100009
+#define VRDE_SCARD_E_TIMEOUT 0x8010000A
+#define VRDE_SCARD_E_SHARING_VIOLATION 0x8010000B
+#define VRDE_SCARD_E_NO_SMARTCARD 0x8010000C
+#define VRDE_SCARD_E_UNKNOWN_CARD 0x8010000D
+#define VRDE_SCARD_E_CANT_DISPOSE 0x8010000E
+#define VRDE_SCARD_E_PROTO_MISMATCH 0x8010000F
+#define VRDE_SCARD_E_NOT_READY 0x80100010
+#define VRDE_SCARD_E_INVALID_VALUE 0x80100011
+#define VRDE_SCARD_E_SYSTEM_CANCELLED 0x80100012
+#define VRDE_SCARD_F_COMM_ERROR 0x80100013
+#define VRDE_SCARD_F_UNKNOWN_ERROR 0x80100014
+#define VRDE_SCARD_E_INVALID_ATR 0x80100015
+#define VRDE_SCARD_E_NOT_TRANSACTED 0x80100016
+#define VRDE_SCARD_E_READER_UNAVAILABLE 0x80100017
+#define VRDE_SCARD_P_SHUTDOWN 0x80100018
+#define VRDE_SCARD_E_PCI_TOO_SMALL 0x80100019
+#define VRDE_SCARD_E_ICC_INSTALLATION 0x80100020
+#define VRDE_SCARD_E_ICC_CREATEORDER 0x80100021
+#define VRDE_SCARD_E_UNSUPPORTED_FEATURE 0x80100022
+#define VRDE_SCARD_E_DIR_NOT_FOUND 0x80100023
+#define VRDE_SCARD_E_FILE_NOT_FOUND 0x80100024
+#define VRDE_SCARD_E_NO_DIR 0x80100025
+#define VRDE_SCARD_E_READER_UNSUPPORTED 0x8010001A
+#define VRDE_SCARD_E_DUPLICATE_READER 0x8010001B
+#define VRDE_SCARD_E_CARD_UNSUPPORTED 0x8010001C
+#define VRDE_SCARD_E_NO_SERVICE 0x8010001D
+#define VRDE_SCARD_E_SERVICE_STOPPED 0x8010001E
+#define VRDE_SCARD_E_UNEXPECTED 0x8010001F
+#define VRDE_SCARD_E_NO_FILE 0x80100026
+#define VRDE_SCARD_E_NO_ACCESS 0x80100027
+#define VRDE_SCARD_E_WRITE_TOO_MANY 0x80100028
+#define VRDE_SCARD_E_BAD_SEEK 0x80100029
+#define VRDE_SCARD_E_INVALID_CHV 0x8010002A
+#define VRDE_SCARD_E_UNKNOWN_RES_MSG 0x8010002B
+#define VRDE_SCARD_E_NO_SUCH_CERTIFICATE 0x8010002C
+#define VRDE_SCARD_E_CERTIFICATE_UNAVAILABLE 0x8010002D
+#define VRDE_SCARD_E_NO_READERS_AVAILABLE 0x8010002E
+#define VRDE_SCARD_E_COMM_DATA_LOST 0x8010002F
+#define VRDE_SCARD_E_NO_KEY_CONTAINER 0x80100030
+#define VRDE_SCARD_E_SERVER_TOO_BUSY 0x80100031
+#define VRDE_SCARD_E_PIN_CACHE_EXPIRED 0x80100032
+#define VRDE_SCARD_E_NO_PIN_CACHE 0x80100033
+#define VRDE_SCARD_E_READ_ONLY_CARD 0x80100034
+#define VRDE_SCARD_W_UNSUPPORTED_CARD 0x80100065
+#define VRDE_SCARD_W_UNRESPONSIVE_CARD 0x80100066
+#define VRDE_SCARD_W_UNPOWERED_CARD 0x80100067
+#define VRDE_SCARD_W_RESET_CARD 0x80100068
+#define VRDE_SCARD_W_REMOVED_CARD 0x80100069
+#define VRDE_SCARD_W_SECURITY_VIOLATION 0x8010006A
+#define VRDE_SCARD_W_WRONG_CHV 0x8010006B
+#define VRDE_SCARD_W_CHV_BLOCKED 0x8010006C
+#define VRDE_SCARD_W_EOF 0x8010006D
+#define VRDE_SCARD_W_CANCELLED_BY_USER 0x8010006E
+#define VRDE_SCARD_W_CARD_NOT_AUTHENTICATED 0x8010006F
+#define VRDE_SCARD_W_CACHE_ITEM_NOT_FOUND 0x80100070
+#define VRDE_SCARD_W_CACHE_ITEM_STALE 0x80100071
+#define VRDE_SCARD_W_CACHE_ITEM_TOO_BIG 0x80100072
+
+#define VRDE_SCARD_STATE_UNAWARE 0x0000
+#define VRDE_SCARD_STATE_IGNORE 0x0001
+#define VRDE_SCARD_STATE_CHANGED 0x0002
+#define VRDE_SCARD_STATE_UNKNOWN 0x0004
+#define VRDE_SCARD_STATE_UNAVAILABLE 0x0008
+#define VRDE_SCARD_STATE_EMPTY 0x0010
+#define VRDE_SCARD_STATE_PRESENT 0x0020
+#define VRDE_SCARD_STATE_ATRMATCH 0x0040
+#define VRDE_SCARD_STATE_EXCLUSIVE 0x0080
+#define VRDE_SCARD_STATE_INUSE 0x0100
+#define VRDE_SCARD_STATE_MUTE 0x0200
+#define VRDE_SCARD_STATE_UNPOWERED 0x0400
+#define VRDE_SCARD_STATE_MASK UINT32_C(0x0000FFFF)
+#define VRDE_SCARD_STATE_COUNT_MASK UINT32_C(0xFFFF0000)
+
+#define VRDE_SCARD_PROTOCOL_UNDEFINED 0x00000000
+#define VRDE_SCARD_PROTOCOL_T0 0x00000001
+#define VRDE_SCARD_PROTOCOL_T1 0x00000002
+#define VRDE_SCARD_PROTOCOL_Tx 0x00000003
+#define VRDE_SCARD_PROTOCOL_RAW 0x00010000
+
+#define VRDE_SCARD_PROTOCOL_DEFAULT 0x80000000
+#define VRDE_SCARD_PROTOCOL_OPTIMAL 0x00000000
+
+#define VRDE_SCARD_SHARE_EXCLUSIVE 0x00000001
+#define VRDE_SCARD_SHARE_SHARED 0x00000002
+#define VRDE_SCARD_SHARE_DIRECT 0x00000003
+
+/* u32Initialization, u32Disposition */
+#define VRDE_SCARD_LEAVE_CARD 0x00000000
+#define VRDE_SCARD_RESET_CARD 0x00000001
+#define VRDE_SCARD_UNPOWER_CARD 0x00000002
+#define VRDE_SCARD_EJECT_CARD 0x00000003
+
+/* VRDESCARDSTATUSRSP::u32State */
+#define VRDE_SCARD_UNKNOWN 0x00000000
+#define VRDE_SCARD_ABSENT 0x00000001
+#define VRDE_SCARD_PRESENT 0x00000002
+#define VRDE_SCARD_SWALLOWED 0x00000003
+#define VRDE_SCARD_POWERED 0x00000004
+#define VRDE_SCARD_NEGOTIABLE 0x00000005
+#define VRDE_SCARD_SPECIFICMODE 0x00000006
+
+
+/*
+ * IO request data structures.
+ */
+typedef struct VRDESCARDCONTEXT
+{
+ uint32_t u32ContextSize;
+ uint8_t au8Context[16];
+} VRDESCARDCONTEXT;
+
+typedef struct VRDESCARDHANDLE
+{
+ VRDESCARDCONTEXT Context;
+ uint32_t u32HandleSize;
+ uint8_t au8Handle[16];
+} VRDESCARDHANDLE;
+
+typedef struct VRDESCARDREADERSTATECALL
+{
+ char *pszReader; /* UTF8 */
+ uint32_t u32CurrentState; /* VRDE_SCARD_STATE_* */
+} VRDESCARDREADERSTATECALL;
+
+typedef struct VRDESCARDREADERSTATERETURN
+{
+ uint32_t u32CurrentState; /* VRDE_SCARD_STATE_* */
+ uint32_t u32EventState; /* VRDE_SCARD_STATE_* */
+ uint32_t u32AtrLength;
+ uint8_t au8Atr[VRDE_SCARD_MAX_ATR_LENGTH];
+} VRDESCARDREADERSTATERETURN;
+
+typedef struct VRDESCARDPCI
+{
+ uint32_t u32Protocol; /* VRDE_SCARD_PROTOCOL_* */
+ uint32_t u32PciLength; /* Includes u32Protocol and u32PciLength fields. 8 if no data in au8PciData. */
+ uint8_t au8PciData[VRDE_SCARD_MAX_PCI_DATA];
+} VRDESCARDPCI;
+
+typedef struct VRDESCARDESTABLISHCONTEXTREQ
+{
+ uint32_t u32ClientId;
+ uint32_t u32DeviceId;
+} VRDESCARDESTABLISHCONTEXTREQ;
+
+typedef struct VRDESCARDESTABLISHCONTEXTRSP
+{
+ uint32_t u32ReturnCode;
+ VRDESCARDCONTEXT Context;
+} VRDESCARDESTABLISHCONTEXTRSP;
+
+typedef struct VRDESCARDLISTREADERSREQ
+{
+ VRDESCARDCONTEXT Context;
+} VRDESCARDLISTREADERSREQ;
+
+typedef struct VRDESCARDLISTREADERSRSP
+{
+ uint32_t u32ReturnCode;
+ uint32_t cReaders;
+ char *apszNames[VRDE_SCARD_MAX_READERS]; /* UTF8 */
+} VRDESCARDLISTREADERSRSP;
+
+typedef struct VRDESCARDRELEASECONTEXTREQ
+{
+ VRDESCARDCONTEXT Context;
+} VRDESCARDRELEASECONTEXTREQ;
+
+typedef struct VRDESCARDRELEASECONTEXTRSP
+{
+ uint32_t u32ReturnCode;
+} VRDESCARDRELEASECONTEXTRSP;
+
+typedef struct VRDESCARDGETSTATUSCHANGEREQ
+{
+ VRDESCARDCONTEXT Context;
+ uint32_t u32Timeout; /* Milliseconds. 0xFFFFFFFF = INFINITE */
+ uint32_t cReaders;
+ VRDESCARDREADERSTATECALL aReaderStates[VRDE_SCARD_MAX_READERS];
+} VRDESCARDGETSTATUSCHANGEREQ;
+
+typedef struct VRDESCARDGETSTATUSCHANGERSP
+{
+ uint32_t u32ReturnCode;
+ uint32_t cReaders;
+ VRDESCARDREADERSTATERETURN aReaderStates[VRDE_SCARD_MAX_READERS];
+} VRDESCARDGETSTATUSCHANGERSP;
+
+typedef struct VRDESCARDCANCELREQ
+{
+ VRDESCARDCONTEXT Context;
+} VRDESCARDCANCELREQ;
+
+typedef struct VRDESCARDCANCELRSP
+{
+ uint32_t u32ReturnCode;
+} VRDESCARDCANCELRSP;
+
+typedef struct VRDESCARDCONNECTREQ
+{
+ VRDESCARDCONTEXT Context;
+ char *pszReader; /* UTF8 */
+ uint32_t u32ShareMode; /* VRDE_SCARD_SHARE_* */
+ uint32_t u32PreferredProtocols;
+} VRDESCARDCONNECTREQ;
+
+typedef struct VRDESCARDCONNECTRSP
+{
+ uint32_t u32ReturnCode;
+ VRDESCARDHANDLE hCard;
+ uint32_t u32ActiveProtocol;
+} VRDESCARDCONNECTRSP;
+
+typedef struct VRDESCARDRECONNECTREQ
+{
+ VRDESCARDHANDLE hCard;
+ uint32_t u32ShareMode;
+ uint32_t u32PreferredProtocols;
+ uint32_t u32Initialization;
+} VRDESCARDRECONNECTREQ;
+
+typedef struct VRDESCARDRECONNECTRSP
+{
+ uint32_t u32ReturnCode;
+ uint32_t u32ActiveProtocol;
+} VRDESCARDRECONNECTRSP;
+
+typedef struct VRDESCARDDISCONNECTREQ
+{
+ VRDESCARDHANDLE hCard;
+ uint32_t u32Disposition;
+} VRDESCARDDISCONNECTREQ;
+
+typedef struct VRDESCARDDISCONNECTRSP
+{
+ uint32_t u32ReturnCode;
+} VRDESCARDDISCONNECTRSP;
+
+typedef struct VRDESCARDBEGINTRANSACTIONREQ
+{
+ VRDESCARDHANDLE hCard;
+ uint32_t u32Disposition;
+} VRDESCARDBEGINTRANSACTIONREQ;
+
+typedef struct VRDESCARDBEGINTRANSACTIONRSP
+{
+ uint32_t u32ReturnCode;
+} VRDESCARDBEGINTRANSACTIONRSP;
+
+typedef struct VRDESCARDENDTRANSACTIONREQ
+{
+ VRDESCARDHANDLE hCard;
+ uint32_t u32Disposition;
+} VRDESCARDENDTRANSACTIONREQ;
+
+typedef struct VRDESCARDENDTRANSACTIONRSP
+{
+ uint32_t u32ReturnCode;
+} VRDESCARDENDTRANSACTIONRSP;
+
+typedef struct VRDESCARDSTATEREQ
+{
+ VRDESCARDHANDLE hCard;
+} VRDESCARDSTATEREQ;
+
+typedef struct VRDESCARDSTATERSP
+{
+ uint32_t u32ReturnCode;
+ uint32_t u32State;
+ uint32_t u32Protocol;
+ uint32_t u32AtrLength;
+ uint8_t au8Atr[VRDE_SCARD_MAX_ATR_LENGTH];
+} VRDESCARDSTATERSP;
+
+typedef struct VRDESCARDSTATUSREQ
+{
+ VRDESCARDHANDLE hCard;
+} VRDESCARDSTATUSREQ;
+
+typedef struct VRDESCARDSTATUSRSP
+{
+ uint32_t u32ReturnCode;
+ char *szReader;
+ uint32_t u32State;
+ uint32_t u32Protocol;
+ uint32_t u32AtrLength;
+ uint8_t au8Atr[VRDE_SCARD_MAX_ATR_LENGTH];
+} VRDESCARDSTATUSRSP;
+
+typedef struct VRDESCARDTRANSMITREQ
+{
+ VRDESCARDHANDLE hCard;
+ VRDESCARDPCI ioSendPci;
+ uint32_t u32SendLength;
+ uint8_t *pu8SendBuffer;
+ uint32_t u32RecvLength;
+} VRDESCARDTRANSMITREQ;
+
+typedef struct VRDESCARDTRANSMITRSP
+{
+ uint32_t u32ReturnCode;
+ VRDESCARDPCI ioRecvPci;
+ uint32_t u32RecvLength;
+ uint8_t *pu8RecvBuffer;
+} VRDESCARDTRANSMITRSP;
+
+typedef struct VRDESCARDCONTROLREQ
+{
+ VRDESCARDHANDLE hCard;
+ uint32_t u32ControlCode;
+ uint32_t u32InBufferSize;
+ uint8_t *pu8InBuffer;
+ uint32_t u32OutBufferSize;
+} VRDESCARDCONTROLREQ;
+
+typedef struct VRDESCARDCONTROLRSP
+{
+ uint32_t u32ReturnCode;
+ uint32_t u32OutBufferSize;
+ uint8_t *pu8OutBuffer;
+} VRDESCARDCONTROLRSP;
+
+typedef struct VRDESCARDGETATTRIBREQ
+{
+ VRDESCARDHANDLE hCard;
+ uint32_t u32AttrId;
+ uint32_t u32AttrLen;
+} VRDESCARDGETATTRIBREQ;
+
+typedef struct VRDESCARDGETATTRIBRSP
+{
+ uint32_t u32ReturnCode;
+ uint32_t u32AttrLength;
+ uint8_t *pu8Attr;
+} VRDESCARDGETATTRIBRSP;
+
+typedef struct VRDESCARDSETATTRIBREQ
+{
+ VRDESCARDHANDLE hCard;
+ uint32_t u32AttrId;
+ uint32_t u32AttrLen;
+ uint8_t *pu8Attr;
+} VRDESCARDSETATTRIBREQ;
+
+typedef struct VRDESCARDSETATTRIBRSP
+{
+ uint32_t u32ReturnCode;
+} VRDESCARDSETATTRIBRSP;
+
+#endif /* !VBOX_INCLUDED_RemoteDesktop_VRDESCard_h */
diff --git a/include/VBox/RemoteDesktop/VRDETSMF.h b/include/VBox/RemoteDesktop/VRDETSMF.h
new file mode 100644
index 00000000..40fb9d5b
--- /dev/null
+++ b/include/VBox/RemoteDesktop/VRDETSMF.h
@@ -0,0 +1,154 @@
+/* @file
+ * VBox Remote Desktop Extension (VRDE) - raw TSMF dynamic channel interface.
+ */
+
+/*
+ * Copyright (C) 2012-2022 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program 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, in version 3 of the
+ * License.
+ *
+ * This program 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 program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+#ifndef VBOX_INCLUDED_RemoteDesktop_VRDETSMF_h
+#define VBOX_INCLUDED_RemoteDesktop_VRDETSMF_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include <VBox/RemoteDesktop/VRDE.h>
+
+/*
+ * Interface creating a TSMF dynamic channel instances and sending/receving data.
+ *
+ * Async callbacks are used for providing feedback, reporting errors, etc.
+ */
+
+#define VRDE_TSMF_INTERFACE_NAME "TSMFRAW"
+
+/* The VRDE server TSMF interface entry points. Interface version 1. */
+typedef struct VRDETSMFINTERFACE
+{
+ /* The header. */
+ VRDEINTERFACEHDR header;
+
+ /* Create a new TSMF channel instance.
+ * The channel is created only for one client, which is connected to the server.
+ * The client is the first which supports dynamic RDP channels.
+ *
+ * If this method return success then the server will use the VRDE_TSMF_N_CREATE_*
+ * notification to report the channel handle.
+ *
+ * @param hServer The VRDE server instance.
+ * @param pvChannel A context to be associated with the channel.
+ * @param u32Flags VRDE_TSMF_F_*
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDETSMFChannelCreate, (HVRDESERVER hServer,
+ void *pvChannel,
+ uint32_t u32Flags));
+
+ /* Close a TSMF channel instance.
+ *
+ * @param hServer The VRDE server instance.
+ * @param u32ChannelHandle Which channel to close.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDETSMFChannelClose, (HVRDESERVER hServer,
+ uint32_t u32ChannelHandle));
+
+ /* Send data to the TSMF channel instance.
+ *
+ * @param hServer The VRDE server instance.
+ * @param u32ChannelHandle Channel to send data.
+ * @param pvData Raw data to be sent, the format depends on which
+ * u32Flags were specified in Create: TSMF message,
+ * or channel header + TSMF message.
+ * @param cbData Size of data.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDETSMFChannelSend, (HVRDESERVER hServer,
+ uint32_t u32ChannelHandle,
+ const void *pvData,
+ uint32_t cbData));
+} VRDETSMFINTERFACE;
+
+/* TSMF interface callbacks. */
+typedef struct VRDETSMFCALLBACKS
+{
+ /* The header. */
+ VRDEINTERFACEHDR header;
+
+ /* Channel event notification.
+ *
+ * @param pvContext The callbacks context specified in VRDEGetInterface.
+ * @param u32Notification The kind of the notification: VRDE_TSMF_N_*.
+ * @param pvChannel A context which was used in VRDETSMFChannelCreate.
+ * @param pvParm The notification specific data.
+ * @param cbParm The size of buffer pointed by pvParm.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDETSMFCbNotify, (void *pvContext,
+ uint32_t u32Notification,
+ void *pvChannel,
+ const void *pvParm,
+ uint32_t cbParm));
+} VRDETSMFCALLBACKS;
+
+
+/* VRDETSMFChannelCreate::u32Flags */
+#define VRDE_TSMF_F_CHANNEL_HEADER 0x00000001
+
+
+/* VRDETSMFCbNotify::u32Notification */
+#define VRDE_TSMF_N_CREATE_ACCEPTED 1
+#define VRDE_TSMF_N_CREATE_DECLINED 2
+#define VRDE_TSMF_N_DATA 3 /* Data received. */
+#define VRDE_TSMF_N_DISCONNECTED 4 /* The channel is not connected anymore. */
+
+
+/*
+ * Notification parameters.
+ */
+
+/* VRDE_TSMF_N_CREATE_ACCEPTED */
+typedef struct VRDETSMFNOTIFYCREATEACCEPTED
+{
+ uint32_t u32ChannelHandle;
+} VRDETSMFNOTIFYCREATEACCEPTED;
+
+/* VRDE_TSMF_N_EVENT_DATA */
+typedef struct VRDETSMFNOTIFYDATA
+{
+ const void *pvData;
+ uint32_t cbData; /* How many bytes available. */
+} VRDETSMFNOTIFYDATA;
+
+#endif /* !VBOX_INCLUDED_RemoteDesktop_VRDETSMF_h */
diff --git a/include/VBox/RemoteDesktop/VRDEVideoIn.h b/include/VBox/RemoteDesktop/VRDEVideoIn.h
new file mode 100644
index 00000000..07c45579
--- /dev/null
+++ b/include/VBox/RemoteDesktop/VRDEVideoIn.h
@@ -0,0 +1,1093 @@
+/** @file
+ * VBox Remote Desktop Extension (VRDE) - Video Input interface.
+ */
+
+/*
+ * Copyright (C) 2012-2022 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program 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, in version 3 of the
+ * License.
+ *
+ * This program 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 program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+#ifndef VBOX_INCLUDED_RemoteDesktop_VRDEVideoIn_h
+#define VBOX_INCLUDED_RemoteDesktop_VRDEVideoIn_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+
+/* Define VRDE_VIDEOIN_WITH_VRDEINTERFACE to include the server VRDE interface parts. */
+
+#ifdef VRDE_VIDEOIN_WITH_VRDEINTERFACE
+# include <VBox/RemoteDesktop/VRDE.h>
+#endif /* VRDE_VIDEOIN_WITH_VRDEINTERFACE */
+
+#ifdef AssertCompileSize
+# define ASSERTSIZE(type, size) AssertCompileSize(type, size);
+#else
+# define ASSERTSIZE(type, size)
+#endif /* AssertCompileSize */
+
+#include <iprt/types.h>
+
+
+/*
+ * Interface for accessing a video camera device on the client.
+ *
+ * Async callbacks are used for providing feedback, reporting errors, etc.
+ *
+ * Initial version supports: Camera + Processing Unit + Streaming Control.
+ *
+ * There are 2 modes:
+ * 1) The virtual WebCam is already attached to the guest.
+ * 2) The virtual WebCam will be attached when the client has it.
+ *
+ * Initially the mode 1 is supported.
+ *
+ * Mode 1 details:
+ * The WebCam has some fixed functionality, according to the descriptors,
+ * which has been already read by the guest. So some of functions will
+ * not work if the client does not support them.
+ *
+ * Mode 2 details:
+ * Virtual WebCam descriptors are built from the client capabilities.
+ *
+ * Similarly to the smartcard, the server will inform the ConsoleVRDE that there is a WebCam.
+ * ConsoleVRDE creates a VRDEVIDEOIN handle and forwards virtual WebCam requests to it.
+ *
+ * Interface with VBox.
+ *
+ * Virtual WebCam ConsoleVRDE VRDE
+ *
+ * Negotiate <->
+ * <- VideoInDeviceNotify(Attached, DeviceId)
+ * -> GetDeviceDesc
+ * <- DeviceDesc
+ * 2 <- CreateCamera
+ * 2 CameraCreated ->
+ *
+ * CameraRequest -> Request ->
+ * Response <- <- Response <- Response
+ * Frame <- <- Frame <- Frame
+ * <- VideoInDeviceNotify(Detached, DeviceId)
+ *
+ * Unsupported requests fail.
+ * The Device Description received from the client may be used to validate WebCam requests
+ * in the ConsoleVRDE code, for example filter out unsupported requests.
+ *
+ */
+
+/* All structures in this file are packed.
+ * Everything is little-endian.
+ */
+#pragma pack(1)
+
+/*
+ * The interface supports generic video input descriptors, capabilities and controls:
+ * * Descriptors
+ * + Interface
+ * - Input, Camera Terminal
+ * - Processing Unit
+ * + Video Streaming
+ * - Input Header
+ * - Payload Format
+ * - Video Frame
+ * - Still Image Frame
+ * * Video Control requests
+ * + Interface
+ * - Power Mode
+ * + Unit and Terminal
+ * camera
+ * - Scanning Mode (interlaced, progressive)
+ * - Auto-Exposure Mode
+ * - Auto-Exposure Priority
+ * - Exposure Time Absolute, Relative
+ * - Focus Absolute, Relative, Auto
+ * - Iris Absolute, Relative
+ * - Zoom Absolute, Relative
+ * - PanTilt Absolute, Relative
+ * - Roll Absolute, Relative
+ * - Privacy
+ * processing
+ * - Backlight Compensation
+ * - Brightness
+ * - Contrast
+ * - Gain
+ * - Power Line Frequency
+ * - Hue Manual, Auto
+ * - Saturation
+ * - Sharpness
+ * - Gamma
+ * - White Balance Temperature Manual, Auto
+ * - White Balance Component Manual, Auto
+ * - Digital Multiplier
+ * - Digital Multiplier Limit
+ * * Video Streaming requests
+ * + Interface
+ * - Synch Delay
+ * - Still Image Trigger
+ * - Generate Key Frame
+ * - Update Frame Segment
+ * - Stream Error Code
+ *
+ *
+ * Notes:
+ * * still capture uses a method similar to method 2, because the still frame will
+ * be send instead of video over the channel.
+ * Also the method 2 can be in principle emulated by both 1 and 3 on the client.
+ * However the client can initiate a still frame transfer, similar to hardware button trigger.
+ * * all control changes are async.
+ * * probe/commit are not used. The server can select a supported format/frame from the list.
+ * * no color matching. sRGB is the default.
+ * * most of constants are the same as in USB Video Class spec, but they are not the same and
+ * should be always converted.
+ */
+
+/*
+ * The DEVICEDEC describes the device and provides a list of supported formats:
+ * VRDEVIDEOINDEVICEDESC
+ * VRDEVIDEOINFORMATDESC[0];
+ * VRDEVIDEOINFRAMEDESC[0..N-1]
+ * VRDEVIDEOINFORMATDESC[1];
+ * VRDEVIDEOINFRAMEDESC[0..M-1]
+ * ...
+ */
+
+typedef struct VRDEVIDEOINDEVICEDESC
+{
+ uint16_t u16ObjectiveFocalLengthMin;
+ uint16_t u16ObjectiveFocalLengthMax;
+ uint16_t u16OcularFocalLength;
+ uint16_t u16MaxMultiplier;
+ uint32_t fu32CameraControls; /* VRDE_VIDEOIN_F_CT_CTRL_* */
+ uint32_t fu32ProcessingControls; /* VRDE_VIDEOIN_F_PU_CTRL_* */
+ uint8_t fu8DeviceCaps; /* VRDE_VIDEOIN_F_DEV_CAP_* */
+ uint8_t u8NumFormats; /* Number of following VRDEVIDEOINFORMATDESC structures. */
+ uint16_t cbExt; /* Size of the optional extended description. */
+ /* An extended description may follow. */
+ /* An array of VRDEVIDEOINFORMATDESC follows. */
+} VRDEVIDEOINDEVICEDESC;
+
+/* VRDEVIDEOINDEVICEDESC::fu32CameraControls */
+#define VRDE_VIDEOIN_F_CT_CTRL_SCANNING_MODE 0x00000001 /* D0: Scanning Mode */
+#define VRDE_VIDEOIN_F_CT_CTRL_AE_MODE 0x00000002 /* D1: Auto-Exposure Mode */
+#define VRDE_VIDEOIN_F_CT_CTRL_AE_PRIORITY 0x00000004 /* D2: Auto-Exposure Priority */
+#define VRDE_VIDEOIN_F_CT_CTRL_EXPOSURE_TIME_ABSOLUTE 0x00000008 /* D3: Exposure Time (Absolute) */
+#define VRDE_VIDEOIN_F_CT_CTRL_EXPOSURE_TIME_RELATIVE 0x00000010 /* D4: Exposure Time (Relative) */
+#define VRDE_VIDEOIN_F_CT_CTRL_FOCUS_ABSOLUTE 0x00000020 /* D5: Focus (Absolute) */
+#define VRDE_VIDEOIN_F_CT_CTRL_FOCUS_RELATIVE 0x00000040 /* D6: Focus (Relative) */
+#define VRDE_VIDEOIN_F_CT_CTRL_IRIS_ABSOLUTE 0x00000080 /* D7: Iris (Absolute) */
+#define VRDE_VIDEOIN_F_CT_CTRL_IRIS_RELATIVE 0x00000100 /* D8: Iris (Relative) */
+#define VRDE_VIDEOIN_F_CT_CTRL_ZOOM_ABSOLUTE 0x00000200 /* D9: Zoom (Absolute) */
+#define VRDE_VIDEOIN_F_CT_CTRL_ZOOM_RELATIVE 0x00000400 /* D10: Zoom (Relative) */
+#define VRDE_VIDEOIN_F_CT_CTRL_PANTILT_ABSOLUTE 0x00000800 /* D11: PanTilt (Absolute) */
+#define VRDE_VIDEOIN_F_CT_CTRL_PANTILT_RELATIVE 0x00001000 /* D12: PanTilt (Relative) */
+#define VRDE_VIDEOIN_F_CT_CTRL_ROLL_ABSOLUTE 0x00002000 /* D13: Roll (Absolute) */
+#define VRDE_VIDEOIN_F_CT_CTRL_ROLL_RELATIVE 0x00004000 /* D14: Roll (Relative) */
+#define VRDE_VIDEOIN_F_CT_CTRL_RESERVED1 0x00008000 /* D15: Reserved */
+#define VRDE_VIDEOIN_F_CT_CTRL_RESERVED2 0x00010000 /* D16: Reserved */
+#define VRDE_VIDEOIN_F_CT_CTRL_FOCUS_AUTO 0x00020000 /* D17: Focus, Auto */
+#define VRDE_VIDEOIN_F_CT_CTRL_PRIVACY 0x00040000 /* D18: Privacy */
+
+/* VRDEVIDEOINDEVICEDESC::fu32ProcessingControls */
+#define VRDE_VIDEOIN_F_PU_CTRL_BRIGHTNESS 0x00000001 /* D0: Brightness */
+#define VRDE_VIDEOIN_F_PU_CTRL_CONTRAST 0x00000002 /* D1: Contrast */
+#define VRDE_VIDEOIN_F_PU_CTRL_HUE 0x00000004 /* D2: Hue */
+#define VRDE_VIDEOIN_F_PU_CTRL_SATURATION 0x00000008 /* D3: Saturation */
+#define VRDE_VIDEOIN_F_PU_CTRL_SHARPNESS 0x00000010 /* D4: Sharpness */
+#define VRDE_VIDEOIN_F_PU_CTRL_GAMMA 0x00000020 /* D5: Gamma */
+#define VRDE_VIDEOIN_F_PU_CTRL_WHITE_BALANCE_TEMPERATURE 0x00000040 /* D6: White Balance Temperature */
+#define VRDE_VIDEOIN_F_PU_CTRL_WHITE_BALANCE_COMPONENT 0x00000080 /* D7: White Balance Component */
+#define VRDE_VIDEOIN_F_PU_CTRL_BACKLIGHT_COMPENSATION 0x00000100 /* D8: Backlight Compensation */
+#define VRDE_VIDEOIN_F_PU_CTRL_GAIN 0x00000200 /* D9: Gain */
+#define VRDE_VIDEOIN_F_PU_CTRL_POWER_LINE_FREQUENCY 0x00000400 /* D10: Power Line Frequency */
+#define VRDE_VIDEOIN_F_PU_CTRL_HUE_AUTO 0x00000800 /* D11: Hue, Auto */
+#define VRDE_VIDEOIN_F_PU_CTRL_WHITE_BALANCE_TEMPERATURE_AUTO 0x00001000 /* D12: White Balance Temperature, Auto */
+#define VRDE_VIDEOIN_F_PU_CTRL_WHITE_BALANCE_COMPONENT_AUTO 0x00002000 /* D13: White Balance Component, Auto */
+#define VRDE_VIDEOIN_F_PU_CTRL_DIGITAL_MULTIPLIER 0x00004000 /* D14: Digital Multiplier */
+#define VRDE_VIDEOIN_F_PU_CTRL_DIGITAL_MULTIPLIER_LIMIT 0x00008000 /* D15: Digital Multiplier Limit */
+
+/* VRDEVIDEOINDEVICEDESC::fu8DeviceCaps */
+#define VRDE_VIDEOIN_F_DEV_CAP_DYNAMICCHANGE 0x01 /* Whether dynamic format change is supported. */
+#define VRDE_VIDEOIN_F_DEV_CAP_TRIGGER 0x02 /* Whether hardware triggering is supported. */
+#define VRDE_VIDEOIN_F_DEV_CAP_TRIGGER_USAGE 0x04 /* 0 - still image, 1 - generic button event.*/
+
+/* VRDEVIDEOINDEVICEDESC extended description. */
+typedef struct VRDEVIDEOINDEVICEEXT
+{
+ uint32_t fu32Fields;
+ /* One or more VRDEVIDEOINDEVICEFIELD follow. */
+} VRDEVIDEOINDEVICEEXT;
+
+typedef struct VRDEVIDEOINDEVICEFIELDHDR
+{
+ uint16_t cbField; /* Number of bytes reserved for this field. */
+} VRDEVIDEOINDEVICEFIELDHDR;
+
+/* VRDEVIDEOINDEVICEDESC::fu32Fields */
+#define VRDE_VIDEOIN_F_DEV_EXT_NAME 0x00000001 /* Utf8 device name. */
+#define VRDE_VIDEOIN_F_DEV_EXT_SERIAL 0x00000002 /* Utf8 device serial number. */
+
+/* The video format descriptor. */
+typedef struct VRDEVIDEOINFORMATDESC
+{
+ uint16_t cbFormat; /* Size of the structure including cbFormat and format specific data. */
+ uint8_t u8FormatId; /* The unique identifier of the format on the client. */
+ uint8_t u8FormatType; /* MJPEG etc. VRDE_VIDEOIN_FORMAT_* */
+ uint8_t u8FormatFlags; /* VRDE_VIDEOIN_F_FMT_* */
+ uint8_t u8NumFrames; /* Number of following VRDEVIDEOINFRAMEDESC structures. */
+ uint16_t u16Reserved; /* Must be set to 0. */
+ /* Other format specific data may follow. */
+ /* An array of VRDEVIDEOINFRAMEDESC follows. */
+} VRDEVIDEOINFORMATDESC;
+
+/* VRDEVIDEOINFORMATDESC::u8FormatType */
+#define VRDE_VIDEOIN_FORMAT_UNCOMPRESSED 0x04
+#define VRDE_VIDEOIN_FORMAT_MJPEG 0x06
+#define VRDE_VIDEOIN_FORMAT_MPEG2TS 0x0A
+#define VRDE_VIDEOIN_FORMAT_DV 0x0C
+#define VRDE_VIDEOIN_FORMAT_FRAME_BASED 0x10
+#define VRDE_VIDEOIN_FORMAT_STREAM_BASED 0x12
+
+/* VRDEVIDEOINFORMATDESC::u8FormatFlags. */
+#define VRDE_VIDEOIN_F_FMT_GENERATEKEYFRAME 0x01 /* Supports Generate Key Frame */
+#define VRDE_VIDEOIN_F_FMT_UPDATEFRAMESEGMENT 0x02 /* Supports Update Frame Segment */
+#define VRDE_VIDEOIN_F_FMT_COPYPROTECT 0x04 /* If duplication should be restricted. */
+#define VRDE_VIDEOIN_F_FMT_COMPQUALITY 0x08 /* If the format supports an adjustable compression quality. */
+
+typedef struct VRDEVIDEOINFRAMEDESC
+{
+ uint16_t cbFrame; /* Size of the structure including cbFrame and frame specific data. */
+ uint8_t u8FrameId; /* The unique identifier of the frame for the corresponding format on the client. */
+ uint8_t u8FrameFlags;
+ uint16_t u16Width;
+ uint16_t u16Height;
+ uint32_t u32NumFrameIntervals; /* The number of supported frame intervals. */
+ uint32_t u32MinFrameInterval; /* Shortest frame interval supported (at highest frame rate), in 100ns units. */
+ uint32_t u32MaxFrameInterval; /* Longest frame interval supported (at lowest frame rate), in 100ns units. */
+ /* Supported frame intervals (in 100ns units) follow if VRDE_VIDEOIN_F_FRM_DISCRETE_INTERVALS is set.
+ * uint32_t au32FrameIntervals[u32NumFrameIntervals];
+ */
+ /* Supported min and max bitrate in bits per second follow if VRDE_VIDEOIN_F_FRM_BITRATE is set.
+ * uint32_t u32MinBitRate;
+ * uint32_t u32MaxBitRate;
+ */
+ /* Other frame specific data may follow. */
+} VRDEVIDEOINFRAMEDESC;
+
+/* VRDEVIDEOINFRAMEDESC::u8FrameFlags. */
+#define VRDE_VIDEOIN_F_FRM_STILL 0x01 /* If still images are supported for this frame. */
+#define VRDE_VIDEOIN_F_FRM_DISCRETE_INTERVALS 0x02 /* If the discrete intervals list is included. */
+#define VRDE_VIDEOIN_F_FRM_BITRATE 0x04 /* If the bitrate fields are included. */
+#define VRDE_VIDEOIN_F_FRM_SIZE_OF_FIELDS 0x08 /* If the all optional fields start with 16 bit field size. */
+
+/*
+ * Controls.
+ *
+ * The same structures are used for both SET and GET requests.
+ * Requests are async. A callback is invoked, when the client returns a reply.
+ * A control change notification also uses these structures.
+ *
+ * If a control request can not be fulfilled, then VRDE_VIDEOIN_CTRLHDR_F_FAIL
+ * will be set and u8Status contains the error code. This replaces the VC_REQUEST_ERROR_CODE_CONTROL.
+ *
+ * If the client receives an unsupported control, then the client must ignore it.
+ * That is the control request must not affect the client in any way.
+ * The client may send a VRDEVIDEOINCTRLHDR response for the unsupported control with:
+ * u16ControlSelector = the received value;
+ * u16RequestType = the received value;
+ * u16ParmSize = 0;
+ * u8Flags = VRDE_VIDEOIN_CTRLHDR_F_FAIL;
+ * u8Status = VRDE_VIDEOIN_CTRLHDR_STATUS_INVALIDCONTROL;
+ */
+
+typedef struct VRDEVIDEOINCTRLHDR
+{
+ uint16_t u16ControlSelector; /* VRDE_VIDEOIN_CTRLSEL_* */
+ uint16_t u16RequestType; /* VRDE_VIDEOIN_CTRLREQ_* */
+ uint16_t u16ParmSize; /* The size of the control specific parameters. */
+ uint8_t u8Flags; /* VRDE_VIDEOIN_CTRLHDR_F_* */
+ uint8_t u8Status; /* VRDE_VIDEOIN_CTRLHDR_STATUS_* */
+ /* Control specific data follows. */
+} VRDEVIDEOINCTRLHDR;
+
+/* Control request types: VRDEVIDEOINCTRLHDR::u16RequestType. */
+#define VRDE_VIDEOIN_CTRLREQ_UNDEFINED 0x00
+#define VRDE_VIDEOIN_CTRLREQ_SET_CUR 0x01
+#define VRDE_VIDEOIN_CTRLREQ_GET_CUR 0x81
+#define VRDE_VIDEOIN_CTRLREQ_GET_MIN 0x82
+#define VRDE_VIDEOIN_CTRLREQ_GET_MAX 0x83
+#define VRDE_VIDEOIN_CTRLREQ_GET_RES 0x84
+#define VRDE_VIDEOIN_CTRLREQ_GET_LEN 0x85
+#define VRDE_VIDEOIN_CTRLREQ_GET_INFO 0x86
+#define VRDE_VIDEOIN_CTRLREQ_GET_DEF 0x87
+
+/* VRDEVIDEOINCTRLHDR::u8Flags */
+#define VRDE_VIDEOIN_CTRLHDR_F_NOTIFY 0x01 /* Control change notification, the attribute is derived from u16RequestType and F_FAIL. */
+#define VRDE_VIDEOIN_CTRLHDR_F_FAIL 0x02 /* The operation failed. Error code is in u8Status. */
+
+/* VRDEVIDEOINCTRLHDR::u8Status if the VRDE_VIDEOIN_CTRLHDR_F_FAIL is set. */
+#define VRDE_VIDEOIN_CTRLHDR_STATUS_SUCCESS 0x00 /**/
+#define VRDE_VIDEOIN_CTRLHDR_STATUS_NOTREADY 0x01 /* Not ready */
+#define VRDE_VIDEOIN_CTRLHDR_STATUS_WRONGSTATE 0x02 /* Wrong state */
+#define VRDE_VIDEOIN_CTRLHDR_STATUS_POWER 0x03 /* Power */
+#define VRDE_VIDEOIN_CTRLHDR_STATUS_OUTOFRANGE 0x04 /* Out of range */
+#define VRDE_VIDEOIN_CTRLHDR_STATUS_INVALIDUNIT 0x05 /* Invalid unit */
+#define VRDE_VIDEOIN_CTRLHDR_STATUS_INVALIDCONTROL 0x06 /* Invalid control */
+#define VRDE_VIDEOIN_CTRLHDR_STATUS_INVALIDREQUEST 0x07 /* Invalid request */
+#define VRDE_VIDEOIN_CTRLHDR_STATUS_UNKNOWN 0xFF /* Unknown */
+
+/* Control selectors. 16 bit. High byte is the category. Low byte is the identifier.*/
+#ifdef RT_MAKE_U16
+#define VRDE_VIDEOIN_CTRLSEL_MAKE(Lo, Hi) RT_MAKE_U16(Lo, Hi)
+#else
+#define VRDE_VIDEOIN_CTRLSEL_MAKE(Lo, Hi) ((uint16_t)( (uint16_t)((uint8_t)(Hi)) << 8 | (uint8_t)(Lo) ))
+#endif
+
+#define VRDE_VIDEOIN_CTRLSEL_VC(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x01)
+#define VRDE_VIDEOIN_CTRLSEL_CT(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x02)
+#define VRDE_VIDEOIN_CTRLSEL_PU(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x03)
+#define VRDE_VIDEOIN_CTRLSEL_VS(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x04)
+#define VRDE_VIDEOIN_CTRLSEL_HW(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x05)
+#define VRDE_VIDEOIN_CTRLSEL_PROT(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x06)
+
+#define VRDE_VIDEOIN_CTRLSEL_VC_VIDEO_POWER_MODE_CONTROL VRDE_VIDEOIN_CTRLSEL_VC(0x01)
+
+#define VRDE_VIDEOIN_CTRLSEL_CT_UNDEFINED VRDE_VIDEOIN_CTRLSEL_CT(0x00)
+#define VRDE_VIDEOIN_CTRLSEL_CT_SCANNING_MODE VRDE_VIDEOIN_CTRLSEL_CT(0x01)
+#define VRDE_VIDEOIN_CTRLSEL_CT_AE_MODE VRDE_VIDEOIN_CTRLSEL_CT(0x02)
+#define VRDE_VIDEOIN_CTRLSEL_CT_AE_PRIORITY VRDE_VIDEOIN_CTRLSEL_CT(0x03)
+#define VRDE_VIDEOIN_CTRLSEL_CT_EXPOSURE_TIME_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x04)
+#define VRDE_VIDEOIN_CTRLSEL_CT_EXPOSURE_TIME_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x05)
+#define VRDE_VIDEOIN_CTRLSEL_CT_FOCUS_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x06)
+#define VRDE_VIDEOIN_CTRLSEL_CT_FOCUS_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x07)
+#define VRDE_VIDEOIN_CTRLSEL_CT_FOCUS_AUTO VRDE_VIDEOIN_CTRLSEL_CT(0x08)
+#define VRDE_VIDEOIN_CTRLSEL_CT_IRIS_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x09)
+#define VRDE_VIDEOIN_CTRLSEL_CT_IRIS_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x0A)
+#define VRDE_VIDEOIN_CTRLSEL_CT_ZOOM_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x0B)
+#define VRDE_VIDEOIN_CTRLSEL_CT_ZOOM_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x0C)
+#define VRDE_VIDEOIN_CTRLSEL_CT_PANTILT_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x0D)
+#define VRDE_VIDEOIN_CTRLSEL_CT_PANTILT_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x0E)
+#define VRDE_VIDEOIN_CTRLSEL_CT_ROLL_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x0F)
+#define VRDE_VIDEOIN_CTRLSEL_CT_ROLL_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x10)
+#define VRDE_VIDEOIN_CTRLSEL_CT_PRIVACY VRDE_VIDEOIN_CTRLSEL_CT(0x11)
+
+#define VRDE_VIDEOIN_CTRLSEL_PU_UNDEFINED VRDE_VIDEOIN_CTRLSEL_PU(0x00)
+#define VRDE_VIDEOIN_CTRLSEL_PU_BACKLIGHT_COMPENSATION VRDE_VIDEOIN_CTRLSEL_PU(0x01)
+#define VRDE_VIDEOIN_CTRLSEL_PU_BRIGHTNESS VRDE_VIDEOIN_CTRLSEL_PU(0x02)
+#define VRDE_VIDEOIN_CTRLSEL_PU_CONTRAST VRDE_VIDEOIN_CTRLSEL_PU(0x03)
+#define VRDE_VIDEOIN_CTRLSEL_PU_GAIN VRDE_VIDEOIN_CTRLSEL_PU(0x04)
+#define VRDE_VIDEOIN_CTRLSEL_PU_POWER_LINE_FREQUENCY VRDE_VIDEOIN_CTRLSEL_PU(0x05)
+#define VRDE_VIDEOIN_CTRLSEL_PU_HUE VRDE_VIDEOIN_CTRLSEL_PU(0x06)
+#define VRDE_VIDEOIN_CTRLSEL_PU_SATURATION VRDE_VIDEOIN_CTRLSEL_PU(0x07)
+#define VRDE_VIDEOIN_CTRLSEL_PU_SHARPNESS VRDE_VIDEOIN_CTRLSEL_PU(0x08)
+#define VRDE_VIDEOIN_CTRLSEL_PU_GAMMA VRDE_VIDEOIN_CTRLSEL_PU(0x09)
+#define VRDE_VIDEOIN_CTRLSEL_PU_WHITE_BALANCE_TEMPERATURE VRDE_VIDEOIN_CTRLSEL_PU(0x0A)
+#define VRDE_VIDEOIN_CTRLSEL_PU_WHITE_BALANCE_TEMPERATURE_AUTO VRDE_VIDEOIN_CTRLSEL_PU(0x0B)
+#define VRDE_VIDEOIN_CTRLSEL_PU_WHITE_BALANCE_COMPONENT VRDE_VIDEOIN_CTRLSEL_PU(0x0C)
+#define VRDE_VIDEOIN_CTRLSEL_PU_WHITE_BALANCE_COMPONENT_AUTO VRDE_VIDEOIN_CTRLSEL_PU(0x0D)
+#define VRDE_VIDEOIN_CTRLSEL_PU_DIGITAL_MULTIPLIER VRDE_VIDEOIN_CTRLSEL_PU(0x0E)
+#define VRDE_VIDEOIN_CTRLSEL_PU_DIGITAL_MULTIPLIER_LIMIT VRDE_VIDEOIN_CTRLSEL_PU(0x0F)
+#define VRDE_VIDEOIN_CTRLSEL_PU_HUE_AUTO VRDE_VIDEOIN_CTRLSEL_PU(0x10)
+#define VRDE_VIDEOIN_CTRLSEL_PU_ANALOG_VIDEO_STANDARD VRDE_VIDEOIN_CTRLSEL_PU(0x11)
+#define VRDE_VIDEOIN_CTRLSEL_PU_ANALOG_LOCK_STATUS VRDE_VIDEOIN_CTRLSEL_PU(0x12)
+
+#define VRDE_VIDEOIN_CTRLSEL_VS_UNDEFINED VRDE_VIDEOIN_CTRLSEL_VS(0x00)
+#define VRDE_VIDEOIN_CTRLSEL_VS_SETUP VRDE_VIDEOIN_CTRLSEL_VS(0x01)
+#define VRDE_VIDEOIN_CTRLSEL_VS_OFF VRDE_VIDEOIN_CTRLSEL_VS(0x02)
+#define VRDE_VIDEOIN_CTRLSEL_VS_ON VRDE_VIDEOIN_CTRLSEL_VS(0x03)
+#define VRDE_VIDEOIN_CTRLSEL_VS_STILL_IMAGE_TRIGGER VRDE_VIDEOIN_CTRLSEL_VS(0x05)
+#define VRDE_VIDEOIN_CTRLSEL_VS_STREAM_ERROR_CODE VRDE_VIDEOIN_CTRLSEL_VS(0x06)
+#define VRDE_VIDEOIN_CTRLSEL_VS_GENERATE_KEY_FRAME VRDE_VIDEOIN_CTRLSEL_VS(0x07)
+#define VRDE_VIDEOIN_CTRLSEL_VS_UPDATE_FRAME_SEGMENT VRDE_VIDEOIN_CTRLSEL_VS(0x08)
+#define VRDE_VIDEOIN_CTRLSEL_VS_SYNCH_DELAY VRDE_VIDEOIN_CTRLSEL_VS(0x09)
+
+#define VRDE_VIDEOIN_CTRLSEL_HW_BUTTON VRDE_VIDEOIN_CTRLSEL_HW(0x01)
+
+#define VRDE_VIDEOIN_CTRLSEL_PROT_PING VRDE_VIDEOIN_CTRLSEL_PROT(0x01)
+#define VRDE_VIDEOIN_CTRLSEL_PROT_SAMPLING VRDE_VIDEOIN_CTRLSEL_PROT(0x02)
+#define VRDE_VIDEOIN_CTRLSEL_PROT_FRAMES VRDE_VIDEOIN_CTRLSEL_PROT(0x03)
+
+typedef struct VRDEVIDEOINCTRL_VIDEO_POWER_MODE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8DevicePowerMode;
+} VRDEVIDEOINCTRL_VIDEO_POWER_MODE;
+
+typedef struct VRDEVIDEOINCTRL_CT_SCANNING_MODE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8ScanningMode;
+} VRDEVIDEOINCTRL_CT_SCANNING_MODE;
+
+typedef struct VRDEVIDEOINCTRL_CT_AE_MODE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8AutoExposureMode;
+} VRDEVIDEOINCTRL_CT_AE_MODE;
+
+typedef struct VRDEVIDEOINCTRL_CT_AE_PRIORITY
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8AutoExposurePriority;
+} VRDEVIDEOINCTRL_CT_AE_PRIORITY;
+
+typedef struct VRDEVIDEOINCTRL_CT_EXPOSURE_TIME_ABSOLUTE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint32_t u32ExposureTimeAbsolute;
+} VRDEVIDEOINCTRL_CT_EXPOSURE_TIME_ABSOLUTE;
+
+typedef struct VRDEVIDEOINCTRL_CT_EXPOSURE_TIME_RELATIVE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8ExposureTimeRelative;
+} VRDEVIDEOINCTRL_CT_EXPOSURE_TIME_RELATIVE;
+
+typedef struct VRDEVIDEOINCTRL_CT_FOCUS_ABSOLUTE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16FocusAbsolute;
+} VRDEVIDEOINCTRL_CT_FOCUS_ABSOLUTE;
+
+typedef struct VRDEVIDEOINCTRL_CT_FOCUS_RELATIVE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8FocusRelative;
+ uint8_t u8Speed;
+} VRDEVIDEOINCTRL_CT_FOCUS_RELATIVE;
+
+typedef struct VRDEVIDEOINCTRL_CT_FOCUS_AUTO
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8FocusAuto;
+} VRDEVIDEOINCTRL_CT_FOCUS_AUTO;
+
+typedef struct VRDEVIDEOINCTRL_CT_IRIS_ABSOLUTE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16IrisAbsolute;
+} VRDEVIDEOINCTRL_CT_IRIS_ABSOLUTE;
+
+typedef struct VRDEVIDEOINCTRL_CT_IRIS_RELATIVE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8IrisRelative;
+} VRDEVIDEOINCTRL_CT_IRIS_RELATIVE;
+
+typedef struct VRDEVIDEOINCTRL_CT_ZOOM_ABSOLUTE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16ZoomAbsolute;
+} VRDEVIDEOINCTRL_CT_ZOOM_ABSOLUTE;
+
+typedef struct VRDEVIDEOINCTRL_CT_ZOOM_RELATIVE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8Zoom;
+ uint8_t u8DigitalZoom;
+ uint8_t u8Speed;
+} VRDEVIDEOINCTRL_CT_ZOOM_RELATIVE;
+
+typedef struct VRDEVIDEOINCTRL_CT_PANTILT_ABSOLUTE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint32_t u32PanAbsolute;
+ uint32_t u32TiltAbsolute;
+} VRDEVIDEOINCTRL_CT_PANTILT_ABSOLUTE;
+
+typedef struct VRDEVIDEOINCTRL_CT_PANTILT_RELATIVE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8PanRelative;
+ uint8_t u8PanSpeed;
+ uint8_t u8TiltRelative;
+ uint8_t u8TiltSpeed;
+} VRDEVIDEOINCTRL_CT_PANTILT_RELATIVE;
+
+typedef struct VRDEVIDEOINCTRL_CT_ROLL_ABSOLUTE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16RollAbsolute;
+} VRDEVIDEOINCTRL_CT_ROLL_ABSOLUTE;
+
+typedef struct VRDEVIDEOINCTRL_CT_ROLL_RELATIVE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8RollRelative;
+ uint8_t u8Speed;
+} VRDEVIDEOINCTRL_CT_ROLL_RELATIVE;
+
+typedef struct VRDEVIDEOINCTRL_CT_PRIVACY_MODE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8Privacy;
+} VRDEVIDEOINCTRL_CT_PRIVACY_MODE;
+
+typedef struct VRDEVIDEOINCTRL_PU_BACKLIGHT_COMPENSATION
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16BacklightCompensation;
+} VRDEVIDEOINCTRL_PU_BACKLIGHT_COMPENSATION;
+
+typedef struct VRDEVIDEOINCTRL_PU_BRIGHTNESS
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16Brightness;
+} VRDEVIDEOINCTRL_PU_BRIGHTNESS;
+
+typedef struct VRDEVIDEOINCTRL_PU_CONTRAST
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16Contrast;
+} VRDEVIDEOINCTRL_PU_CONTRAST;
+
+typedef struct VRDEVIDEOINCTRL_PU_GAIN
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16Gain;
+} VRDEVIDEOINCTRL_PU_GAIN;
+
+typedef struct VRDEVIDEOINCTRL_PU_POWER_LINE_FREQUENCY
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16PowerLineFrequency;
+} VRDEVIDEOINCTRL_PU_POWER_LINE_FREQUENCY;
+
+typedef struct VRDEVIDEOINCTRL_PU_HUE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16Hue;
+} VRDEVIDEOINCTRL_PU_HUE;
+
+typedef struct VRDEVIDEOINCTRL_PU_HUE_AUTO
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8HueAuto;
+} VRDEVIDEOINCTRL_PU_HUE_AUTO;
+
+typedef struct VRDEVIDEOINCTRL_PU_SATURATION
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16Saturation;
+} VRDEVIDEOINCTRL_PU_SATURATION;
+
+typedef struct VRDEVIDEOINCTRL_PU_SHARPNESS
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16Sharpness;
+} VRDEVIDEOINCTRL_PU_SHARPNESS;
+
+typedef struct VRDEVIDEOINCTRL_PU_GAMMA
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16Gamma;
+} VRDEVIDEOINCTRL_PU_GAMMA;
+
+typedef struct VRDEVIDEOINCTRL_PU_WHITE_BALANCE_TEMPERATURE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16WhiteBalanceTemperature;
+} VRDEVIDEOINCTRL_PU_WHITE_BALANCE_TEMPERATURE;
+
+typedef struct VRDEVIDEOINCTRL_PU_WHITE_BALANCE_TEMPERATURE_AUTO
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8WhiteBalanceTemperatureAuto;
+} VRDEVIDEOINCTRL_PU_WHITE_BALANCE_TEMPERATURE_AUTO;
+
+typedef struct VRDEVIDEOINCTRL_PU_WHITE_BALANCE_COMPONENT
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16WhiteBalanceBlue;
+ uint16_t u16WhiteBalanceRed;
+} VRDEVIDEOINCTRL_PU_WHITE_BALANCE_COMPONENT;
+
+typedef struct VRDEVIDEOINCTRL_PU_WHITE_BALANCE_COMPONENT_AUTO
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8WhiteBalanceComponentAuto;
+} VRDEVIDEOINCTRL_PU_WHITE_BALANCE_COMPONENT_AUTO;
+
+typedef struct VRDEVIDEOINCTRL_PU_DIGITAL_MULTIPLIER
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16MultiplierStep;
+} VRDEVIDEOINCTRL_PU_DIGITAL_MULTIPLIER;
+
+typedef struct VRDEVIDEOINCTRL_PU_DIGITAL_MULTIPLIER_LIMIT
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16MultiplierLimit;
+} VRDEVIDEOINCTRL_PU_DIGITAL_MULTIPLIER_LIMIT;
+
+typedef struct VRDEVIDEOINCTRL_PU_ANALOG_VIDEO_STANDARD
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8VideoStandard;
+} VRDEVIDEOINCTRL_PU_ANALOG_VIDEO_STANDARD;
+
+typedef struct VRDEVIDEOINCTRL_PU_ANALOG_LOCK_STATUS
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8Status;
+} VRDEVIDEOINCTRL_PU_ANALOG_LOCK_STATUS;
+
+/* Set streaming parameters. The actual streaming will be enabled by VS_ON. */
+#define VRDEVIDEOINCTRL_F_VS_SETUP_FID 0x01
+#define VRDEVIDEOINCTRL_F_VS_SETUP_EOF 0x02
+
+typedef struct VRDEVIDEOINCTRL_VS_SETUP
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8FormatId; /* The format id on the client: VRDEVIDEOINFORMATDESC::u8FormatId. */
+ uint8_t u8FramingInfo; /* VRDEVIDEOINCTRL_F_VS_SETUP_*. Set by the client. */
+ uint16_t u16Width;
+ uint16_t u16Height;
+ uint32_t u32FrameInterval; /* Frame interval in 100 ns units, 0 means a still image capture.
+ * The client may choose a different interval if this value is
+ * not supported.
+ */
+ uint16_t u16CompQuality; /* 0 .. 10000 = 0 .. 100%.
+ * Applicable if the format has VRDE_VIDEOIN_F_FMT_COMPQUALITY,
+ * otherwise this field is ignored.
+ */
+ uint16_t u16Delay; /* Latency in ms from video data capture to presentation on the channel.
+ * Set by the client, read by the server.
+ */
+ uint32_t u32ClockFrequency; /* @todo just all clocks in 100ns units? */
+} VRDEVIDEOINCTRL_VS_SETUP;
+
+/* Stop sending video frames. */
+typedef struct VRDEVIDEOINCTRL_VS_OFF
+{
+ VRDEVIDEOINCTRLHDR hdr;
+} VRDEVIDEOINCTRL_VS_OFF;
+
+/* Start sending video frames with parameters set by VS_SETUP. */
+typedef struct VRDEVIDEOINCTRL_VS_ON
+{
+ VRDEVIDEOINCTRLHDR hdr;
+} VRDEVIDEOINCTRL_VS_ON;
+
+typedef struct VRDEVIDEOINCTRL_VS_STILL_IMAGE_TRIGGER
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8Trigger;
+} VRDEVIDEOINCTRL_VS_STILL_IMAGE_TRIGGER;
+
+typedef struct VRDEVIDEOINCTRL_VS_STREAM_ERROR_CODE
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8StreamErrorCode;
+} VRDEVIDEOINCTRL_VS_STREAM_ERROR_CODE;
+
+typedef struct VRDEVIDEOINCTRL_VS_GENERATE_KEY_FRAME
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8GenerateKeyFrame;
+} VRDEVIDEOINCTRL_VS_GENERATE_KEY_FRAME;
+
+typedef struct VRDEVIDEOINCTRL_VS_UPDATE_FRAME_SEGMENT
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8StartFrameSegment;
+ uint8_t u8EndFrameSegment;
+} VRDEVIDEOINCTRL_VS_UPDATE_FRAME_SEGMENT;
+
+typedef struct VRDEVIDEOINCTRL_VS_SYNCH_DELAY
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint16_t u16Delay;
+} VRDEVIDEOINCTRL_VS_SYNCH_DELAY;
+
+/* A hardware button was pressed/released on the device. */
+typedef struct VRDEVIDEOINCTRL_HW_BUTTON
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint8_t u8Pressed;
+} VRDEVIDEOINCTRL_HW_BUTTON;
+
+typedef struct VRDEVIDEOINCTRL_PROT_PING
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint32_t u32Timestamp; /* Set in the request and the same value must be send back in the response. */
+} VRDEVIDEOINCTRL_PROT_PING;
+
+typedef struct VRDEVIDEOINCTRL_PROT_SAMPLING
+{
+ VRDEVIDEOINCTRLHDR hdr;
+ uint32_t fu32SampleStart; /* Which parameters must be sampled VRDEVIDEOINCTRL_F_PROT_SAMPLING_*. */
+ uint32_t fu32SampleStop; /* Which parameters to disable VRDEVIDEOINCTRL_F_PROT_SAMPLING_*.
+ * If both Start and Stop is set, then restart the sampling.
+ */
+ uint32_t u32PeriodMS; /* Sampling period in milliseconds. Applies to all samples in fu32SampleStart.
+ * Not mandatory, the actual sampling period may be different.
+ */
+} VRDEVIDEOINCTRL_PROT_SAMPLING;
+
+#define VRDEVIDEOINCTRL_F_PROT_SAMPLING_FRAMES_SOURCE 0x00000001 /* Periodic VRDEVIDEOINCTRL_PROT_FRAMES samples */
+#define VRDEVIDEOINCTRL_F_PROT_SAMPLING_FRAMES_CLIENT_OUT 0x00000002 /* Periodic VRDEVIDEOINCTRL_PROT_FRAMES samples */
+
+typedef struct VRDEVIDEOINCTRL_PROT_FRAMES
+{
+ VRDEVIDEOINCTRLHDR hdr; /* Note: the message should be sent as VRDE_VIDEOIN_FN_CONTROL_NOTIFY. */
+ uint32_t u32Sample; /* Which sample is this, one of VRDEVIDEOINCTRL_F_PROT_SAMPLING_*. */
+ uint32_t u32TimestampMS; /* When the period started, milliseconds since the start of sampling. */
+ uint32_t u32PeriodMS; /* Actual period during which the frames were counted in milliseconds.
+ * This may be different from VRDEVIDEOINCTRL_PROT_SAMPLING::u32PeriodMS.
+ */
+ uint32_t u32FramesCount; /* How many frames per u32PeriodMS milliseconds. */
+} VRDEVIDEOINCTRL_PROT_FRAMES;
+
+
+/*
+ * Payload transfers. How frames are sent to the server:
+ * the client send a PAYLOAD packet, which has the already set format.
+ * The server enables the transfers by sending VRDEVIDEOINCTRL_VS_ON.
+ */
+
+/* Payload header */
+typedef struct VRDEVIDEOINPAYLOADHDR
+{
+ uint8_t u8HeaderLength; /* Entire header. */
+ uint8_t u8HeaderInfo; /* VRDE_VIDEOIN_PAYLOAD_F_* */
+ uint32_t u32PresentationTime; /* @todo define this */
+ uint32_t u32SourceTimeClock; /* @todo At the moment when the frame was sent to the channel.
+ * Allows the server to measure clock drift.
+ */
+ uint16_t u16Reserved; /* @todo */
+} VRDEVIDEOINPAYLOADHDR;
+
+/* VRDEVIDEOINPAYLOADHDR::u8HeaderInfo */
+#define VRDE_VIDEOIN_PAYLOAD_F_FID 0x01 /* Frame ID */
+#define VRDE_VIDEOIN_PAYLOAD_F_EOF 0x02 /* End of Frame */
+#define VRDE_VIDEOIN_PAYLOAD_F_PTS 0x04 /* Presentation Time */
+#define VRDE_VIDEOIN_PAYLOAD_F_SCR 0x08 /* Source Clock Reference */
+#define VRDE_VIDEOIN_PAYLOAD_F_RES 0x10 /* Reserved */
+#define VRDE_VIDEOIN_PAYLOAD_F_STI 0x20 /* Still Image */
+#define VRDE_VIDEOIN_PAYLOAD_F_ERR 0x40 /* Error */
+#define VRDE_VIDEOIN_PAYLOAD_F_EOH 0x80 /* End of header */
+
+
+/*
+ * The network channel specification.
+ */
+
+/*
+ * The protocol uses a dynamic RDP channel.
+ * Everything is little-endian.
+ */
+
+/* The dynamic RDP channel name. */
+#define VRDE_VIDEOIN_CHANNEL "RVIDEOIN"
+
+/* Major functions. */
+#define VRDE_VIDEOIN_FN_NEGOTIATE 0x0000 /* Version and capabilities check. */
+#define VRDE_VIDEOIN_FN_NOTIFY 0x0001 /* Device attach/detach from the client. */
+#define VRDE_VIDEOIN_FN_DEVICEDESC 0x0002 /* Query device description. */
+#define VRDE_VIDEOIN_FN_CONTROL 0x0003 /* Control the device and start/stop video input.
+ * This function is used for sending a request and
+ * the corresponding response.
+ */
+#define VRDE_VIDEOIN_FN_CONTROL_NOTIFY 0x0004 /* The client reports a control change, etc.
+ * This function indicated that the message is
+ * not a response to a CONTROL request.
+ */
+#define VRDE_VIDEOIN_FN_FRAME 0x0005 /* Frame from the client. */
+
+/* Status codes. */
+#define VRDE_VIDEOIN_STATUS_SUCCESS 0 /* Function completed successfully. */
+#define VRDE_VIDEOIN_STATUS_FAILED 1 /* Failed for some reason. */
+
+typedef struct VRDEVIDEOINMSGHDR
+{
+ uint32_t u32Length; /* The length of the message in bytes, including the header. */
+ uint32_t u32DeviceId; /* The client's device id. */
+ uint32_t u32MessageId; /* Unique id assigned by the server. The client must send a reply with the same id.
+ * If the client initiates a request, then this must be set to 0, because there is
+ * currently no client requests, which would require a response from the server.
+ */
+ uint16_t u16FunctionId; /* VRDE_VIDEOIN_FN_* */
+ uint16_t u16Status; /* The result of a request. VRDE_VIDEOIN_STATUS_*. */
+} VRDEVIDEOINMSGHDR;
+ASSERTSIZE(VRDEVIDEOINMSGHDR, 16)
+
+/*
+ * VRDE_VIDEOIN_FN_NEGOTIATE
+ *
+ * Sent by the server when the channel is established and the client replies with its capabilities.
+ */
+#define VRDE_VIDEOIN_NEGOTIATE_VERSION 1
+
+/* VRDEVIDEOINMSG_NEGOTIATE::fu32Capabilities */
+#define VRDE_VIDEOIN_NEGOTIATE_CAP_VOID 0x00000000
+#define VRDE_VIDEOIN_NEGOTIATE_CAP_PROT 0x00000001 /* Supports VRDE_VIDEOIN_CTRLSEL_PROT_* controls. */
+
+typedef struct VRDEVIDEOINMSG_NEGOTIATE
+{
+ VRDEVIDEOINMSGHDR hdr;
+ uint32_t u32Version; /* VRDE_VIDEOIN_NEGOTIATE_VERSION */
+ uint32_t fu32Capabilities; /* VRDE_VIDEOIN_NEGOTIATE_CAP_* */
+} VRDEVIDEOINMSG_NEGOTIATE;
+
+/*
+ * VRDE_VIDEOIN_FN_NOTIFY
+ *
+ * Sent by the client when a webcam is attached or detached.
+ * The client must send the ATTACH notification for each webcam, which is
+ * already connected to the client when the VIDEOIN channel is established.
+ */
+#define VRDE_VIDEOIN_NOTIFY_EVENT_ATTACH 0
+#define VRDE_VIDEOIN_NOTIFY_EVENT_DETACH 1
+#define VRDE_VIDEOIN_NOTIFY_EVENT_NEGOTIATE 2 /* Negotiate again with the client. */
+
+typedef struct VRDEVIDEOINMSG_NOTIFY
+{
+ VRDEVIDEOINMSGHDR hdr;
+ uint32_t u32NotifyEvent; /* VRDE_VIDEOIN_NOTIFY_EVENT_* */
+ /* Event specific data may follow. The underlying protocol provides the length of the message. */
+} VRDEVIDEOINMSG_NOTIFY;
+
+/*
+ * VRDE_VIDEOIN_FN_DEVICEDESC
+ *
+ * The server queries the description of a device.
+ */
+typedef struct VRDEVIDEOINMSG_DEVICEDESC_REQ
+{
+ VRDEVIDEOINMSGHDR hdr;
+} VRDEVIDEOINMSG_DEVICEDESC_REQ;
+
+typedef struct VRDEVIDEOINMSG_DEVICEDESC_RSP
+{
+ VRDEVIDEOINMSGHDR hdr;
+ VRDEVIDEOINDEVICEDESC Device;
+ /*
+ * VRDEVIDEOINFORMATDESC[0]
+ * VRDEVIDEOINFRAMEDESC[0]
+ * ...
+ * VRDEVIDEOINFRAMEDESC[n]
+ * VRDEVIDEOINFORMATDESC[1]
+ * VRDEVIDEOINFRAMEDESC[0]
+ * ...
+ * VRDEVIDEOINFRAMEDESC[m]
+ * ...
+ */
+} VRDEVIDEOINMSG_DEVICEDESC_RSP;
+
+/*
+ * VRDE_VIDEOIN_FN_CONTROL
+ * VRDE_VIDEOIN_FN_CONTROL_NOTIFY
+ *
+ * Either sent by the server or by the client as a notification/response.
+ * If sent by the client as a notification, then hdr.u32MessageId must be 0.
+ */
+typedef struct VRDEVIDEOINMSG_CONTROL
+{
+ VRDEVIDEOINMSGHDR hdr;
+ VRDEVIDEOINCTRLHDR Control;
+ /* Control specific data may follow. */
+} VRDEVIDEOINMSG_CONTROL;
+
+/*
+ * VRDE_VIDEOIN_FN_FRAME
+ *
+ * The client sends a video/still frame in the already specified format.
+ * hdr.u32MessageId must be 0.
+ */
+typedef struct VRDEVIDEOINMSG_FRAME
+{
+ VRDEVIDEOINMSGHDR hdr;
+ VRDEVIDEOINPAYLOADHDR Payload;
+ /* The frame data follow. */
+} VRDEVIDEOINMSG_FRAME;
+
+
+#ifdef VRDE_VIDEOIN_WITH_VRDEINTERFACE
+/*
+ * The application interface between VirtualBox and the VRDE server.
+ */
+
+#define VRDE_VIDEOIN_INTERFACE_NAME "VIDEOIN"
+
+typedef struct VRDEVIDEOINDEVICEHANDLE
+{
+ uint32_t u32ClientId;
+ uint32_t u32DeviceId;
+} VRDEVIDEOINDEVICEHANDLE;
+
+/* The VRDE server video input interface entry points. Interface version 1. */
+typedef struct VRDEVIDEOININTERFACE
+{
+ /* The header. */
+ VRDEINTERFACEHDR header;
+
+ /* Tell the server that this device will be used and associate a context with the device.
+ *
+ * @param hServer The VRDE server instance.
+ * @param pDeviceHandle The device reported by ATTACH notification.
+ * @param pvDeviceCtx The caller context associated with the pDeviceHandle.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEVideoInDeviceAttach, (HVRDESERVER hServer,
+ const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle,
+ void *pvDeviceCtx));
+
+ /* This device will be not be used anymore. The device context must not be used by the server too.
+ *
+ * @param hServer The VRDE server instance.
+ * @param pDeviceHandle The device reported by ATTACH notification.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEVideoInDeviceDetach, (HVRDESERVER hServer,
+ const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle));
+
+ /* Get a device description.
+ *
+ * @param hServer The VRDE server instance.
+ * @param pvUser The callers context of this request.
+ * @param pDeviceHandle The device reported by ATTACH notification.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEVideoInGetDeviceDesc, (HVRDESERVER hServer,
+ void *pvUser,
+ const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle));
+
+ /* Submit a set/get control request.
+ *
+ * @param hServer The VRDE server instance.
+ * @param pvUser The callers context of this request.
+ * @param pDeviceHandle The device reported by ATTACH notification.
+ * @param pReq The request.
+ * @param cbReq Size of the request.
+ *
+ * @return IPRT status code.
+ */
+ DECLR3CALLBACKMEMBER(int, VRDEVideoInControl, (HVRDESERVER hServer,
+ void *pvUser,
+ const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle,
+ const VRDEVIDEOINCTRLHDR *pReq,
+ uint32_t cbReq));
+
+} VRDEVIDEOININTERFACE;
+
+
+/*
+ * Notifications.
+ * Data structures: pvData of VRDEVIDEOINCALLBACKS::VRDECallbackVideoInNotify.
+ */
+typedef struct VRDEVIDEOINNOTIFYATTACH
+{
+ VRDEVIDEOINDEVICEHANDLE deviceHandle;
+ uint32_t u32Version; /* VRDE_VIDEOIN_NEGOTIATE_VERSION */
+ uint32_t fu32Capabilities; /* VRDE_VIDEOIN_NEGOTIATE_CAP_* */
+} VRDEVIDEOINNOTIFYATTACH;
+
+typedef struct VRDEVIDEOINNOTIFYDETACH
+{
+ VRDEVIDEOINDEVICEHANDLE deviceHandle;
+} VRDEVIDEOINNOTIFYDETACH;
+
+/* Notification codes, */
+#define VRDE_VIDEOIN_NOTIFY_ID_ATTACH 0
+#define VRDE_VIDEOIN_NOTIFY_ID_DETACH 1
+
+
+/* Video input interface callbacks. */
+typedef struct VRDEVIDEOINCALLBACKS
+{
+ /* The header. */
+ VRDEINTERFACEHDR header;
+
+ /* Notifications.
+ *
+ * @param pvCallback The callbacks context specified in VRDEGetInterface.
+ * @param u32EventId The notification identifier: VRDE_VIDEOIN_NOTIFY_*.
+ * @param pvData The notification specific data.
+ * @param cbData The size of buffer pointed by pvData.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackVideoInNotify,(void *pvCallback,
+ uint32_t u32Id,
+ const void *pvData,
+ uint32_t cbData));
+
+ /* Device description received from the client.
+ *
+ * @param pvCallback The callbacks context specified in VRDEGetInterface.
+ * @param rcRequest The result code of the request.
+ * @param pDeviceCtx The device context associated with the device in VRDEVideoInGetDeviceDesc.
+ * @param pvUser The pvUser parameter of VRDEVideoInGetDeviceDesc.
+ * @param pDeviceDesc The device description.
+ * @param cbDeviceDesc The size of buffer pointed by pDevice.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackVideoInDeviceDesc,(void *pvCallback,
+ int rcRequest,
+ void *pDeviceCtx,
+ void *pvUser,
+ const VRDEVIDEOINDEVICEDESC *pDeviceDesc,
+ uint32_t cbDeviceDesc));
+
+ /* Control response or notification.
+ *
+ * @param pvCallback The callbacks context specified in VRDEGetInterface.
+ * @param rcRequest The result code of the request.
+ * @param pDeviceCtx The device context associated with the device in VRDEVideoInGetDeviceDesc.
+ * @param pvUser The pvUser parameter of VRDEVideoInControl. NULL if this is a notification.
+ * @param pControl The control information.
+ * @param cbControl The size of buffer pointed by pControl.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackVideoInControl,(void *pvCallback,
+ int rcRequest,
+ void *pDeviceCtx,
+ void *pvUser,
+ const VRDEVIDEOINCTRLHDR *pControl,
+ uint32_t cbControl));
+
+ /* Frame which was received from the client.
+ *
+ * @param pvCallback The callbacks context specified in VRDEGetInterface.
+ * @param rcRequest The result code of the request.
+ * @param pDeviceCtx The device context associated with the device in VRDEVideoInGetDeviceDesc.
+ * @param pFrame The frame data.
+ * @param cbFrame The size of buffer pointed by pFrame.
+ */
+ DECLR3CALLBACKMEMBER(void, VRDECallbackVideoInFrame,(void *pvCallback,
+ int rcRequest,
+ void *pDeviceCtx,
+ const VRDEVIDEOINPAYLOADHDR *pFrame,
+ uint32_t cbFrame));
+
+} VRDEVIDEOINCALLBACKS;
+#endif /* VRDE_VIDEOIN_WITH_VRDEINTERFACE */
+
+#pragma pack()
+
+#endif /* !VBOX_INCLUDED_RemoteDesktop_VRDEVideoIn_h */