diff options
Diffstat (limited to '')
180 files changed, 24517 insertions, 0 deletions
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt new file mode 100644 index 0000000..62caf27 --- /dev/null +++ b/include/CMakeLists.txt @@ -0,0 +1,185 @@ +# FreeRDP: A Remote Desktop Protocol Implementation +# include headers cmake build script +# +# Copyright 2011 O.S. Systems Software Ltda. +# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br> +# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +option(WITH_OPAQUE_SETTINGS "Hide rdpSettings struct definition, only allow getter/setter access" OFF) + +# prepare paths for C +file(TO_NATIVE_PATH "${FREERDP_DATA_PATH}" NATIVE_FREERDP_DATA_PATH) +file(TO_NATIVE_PATH "${FREERDP_KEYMAP_PATH}" NATIVE_FREERDP_KEYMAP_PATH) +file(TO_NATIVE_PATH "${FREERDP_PLUGIN_PATH}" NATIVE_FREERDP_PLUGIN_PATH) +file(TO_NATIVE_PATH "${FREERDP_INSTALL_PREFIX}" NATIVE_FREERDP_INSTALL_PREFIX) +file(TO_NATIVE_PATH "${FREERDP_LIBRARY_PATH}" NATIVE_FREERDP_LIBRARY_PATH) +file(TO_NATIVE_PATH "${FREERDP_ADDIN_PATH}" NATIVE_FREERDP_ADDIN_PATH) +file(TO_NATIVE_PATH "${FREERDP_PROXY_PLUGINDIR}" NATIVE_FREERDP_PROXY_PLUGINDIR) + +if (WIN32) + string(REPLACE "\\" "\\\\" NATIVE_FREERDP_DATA_PATH "${NATIVE_FREERDP_DATA_PATH}") + string(REPLACE "\\" "\\\\" NATIVE_FREERDP_KEYMAP_PATH "${NATIVE_FREERDP_KEYMAP_PATH}") + string(REPLACE "\\" "\\\\" NATIVE_FREERDP_PLUGIN_PATH "${NATIVE_FREERDP_PLUGIN_PATH}") + string(REPLACE "\\" "\\\\" NATIVE_FREERDP_INSTALL_PREFIX "${NATIVE_FREERDP_INSTALL_PREFIX}") + string(REPLACE "\\" "\\\\" NATIVE_FREERDP_LIBRARY_PATH "${NATIVE_FREERDP_LIBRARY_PATH}") + string(REPLACE "\\" "\\\\" NATIVE_FREERDP_ADDIN_PATH "${NATIVE_FREERDP_ADDIN_PATH}") + string(REPLACE "\\" "\\\\" NATIVE_FREERDP_PROXY_PLUGINDIR "${NATIVE_FREERDP_PROXY_PLUGINDIR}") +endif() + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp/version.h) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config/build-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp/build-config.h) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp/config.h) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp/buildflags.h) + +file(STRINGS freerdp/settings_types_private.h SETTINGS_KEYS REGEX "ALIGN64[ \ta-zA-Z0-9]*") + +set (SETTINGS_KEYS_BOOL "") +set (SETTINGS_KEYS_INT16 "") +set (SETTINGS_KEYS_UINT16 "") +set (SETTINGS_KEYS_INT32 "") +set (SETTINGS_KEYS_UINT32 "") +set (SETTINGS_KEYS_INT64 "") +set (SETTINGS_KEYS_UINT64 "") +set (SETTINGS_KEYS_STRING "") +set (SETTINGS_KEYS_POINTER "") + +foreach(KEY ${SETTINGS_KEYS}) + string(STRIP "${KEY}" TRIMMED_KEY) + string(REGEX MATCH "^SETTINGS_DEPRECATED\\(ALIGN64[ \t ]+BOOL[ \t ]+" IS_BOOL "${TRIMMED_KEY}") + string(REGEX MATCH "^SETTINGS_DEPRECATED\\(ALIGN64[ \t ]+INT16[ \t ]+" IS_INT16 "${TRIMMED_KEY}") + string(REGEX MATCH "^SETTINGS_DEPRECATED\\(ALIGN64[ \t ]+UINT16[ \t ]+" IS_UINT16 "${TRIMMED_KEY}") + string(REGEX MATCH "^SETTINGS_DEPRECATED\\(ALIGN64[ \t ]+INT32[ \t ]+" IS_INT32 "${TRIMMED_KEY}") + string(REGEX MATCH "^SETTINGS_DEPRECATED\\(ALIGN64[ \t ]+UINT32[ \t ]+" IS_UINT32 "${TRIMMED_KEY}") + string(REGEX MATCH "^SETTINGS_DEPRECATED\\(ALIGN64[ \t ]+INT64[ \t ]+" IS_INT64 "${TRIMMED_KEY}") + string(REGEX MATCH "^SETTINGS_DEPRECATED\\(ALIGN64[ \t ]+UINT64[ \t ]+" IS_UINT64 "${TRIMMED_KEY}") + string(REGEX MATCH "^SETTINGS_DEPRECATED\\(ALIGN64[ \t ]+(char|CHAR)[ \t ]*\\*[ \t ]+" IS_STRING "${TRIMMED_KEY}") + + string(REGEX REPLACE ".+/\\*" "" index "${TRIMMED_KEY}") + string(REGEX REPLACE "[ \t/\\*]" "" index "${index}") + + if (index MATCHES "^[0-9]+$") + string(REGEX REPLACE "^SETTINGS_DEPRECATED\\(ALIGN64[ \t ]+[a-zA-Z0-9_\\*]+[ \t ]+" "" VALUE ${TRIMMED_KEY}) + string(STRIP "${VALUE}" VALUE) + string(FIND "${VALUE}" ")" SEMICOLON) + string(SUBSTRING "${VALUE}" 0 ${SEMICOLON} KEY_VALUE) + + if (IS_BOOL) + set(KEY_VALUE "FreeRDP_${KEY_VALUE} = ${index}") + list(APPEND SETTINGS_KEYS_BOOL ${KEY_VALUE}) + elseif(IS_INT16) + set(KEY_VALUE "FreeRDP_${KEY_VALUE} = ${index}") + list(APPEND SETTINGS_KEYS_INT16 ${KEY_VALUE}) + elseif(IS_UINT16) + set(KEY_VALUE "FreeRDP_${KEY_VALUE} = ${index}") + list(APPEND SETTINGS_KEYS_UINT16 ${KEY_VALUE}) + elseif(IS_INT32) + set(KEY_VALUE "FreeRDP_${KEY_VALUE} = ${index}") + list(APPEND SETTINGS_KEYS_INT32 ${KEY_VALUE}) + elseif(IS_UINT32) + set(KEY_VALUE "FreeRDP_${KEY_VALUE} = ${index}") + list(APPEND SETTINGS_KEYS_UINT32 ${KEY_VALUE}) + elseif(IS_INT64) + set(KEY_VALUE "FreeRDP_${KEY_VALUE} = ${index}") + list(APPEND SETTINGS_KEYS_INT64 ${KEY_VALUE}) + elseif(IS_UINT64) + set(KEY_VALUE "FreeRDP_${KEY_VALUE} = ${index}") + list(APPEND SETTINGS_KEYS_UINT64 ${KEY_VALUE}) + elseif(IS_STRING) + string(SUBSTRING "${VALUE}" 0 ${SEMICOLON} KEY_VALUE) + set(KEY_VALUE "FreeRDP_${KEY_VALUE} = ${index}") + list(APPEND SETTINGS_KEYS_STRING ${KEY_VALUE}) + else() + set(KEY_VALUE "FreeRDP_${KEY_VALUE} = ${index}") + list(APPEND SETTINGS_KEYS_POINTER ${KEY_VALUE}) + endif() + endif() +endforeach() + +list(APPEND SETTINGS_KEYS_BOOL "FreeRDP_BOOL_UNUSED = -1") +list(APPEND SETTINGS_KEYS_INT16 "FreeRDP_INT16_UNUSED = -1") +list(APPEND SETTINGS_KEYS_UINT16 "FreeRDP_UINT16_UNUSED = -1") +list(APPEND SETTINGS_KEYS_INT32 "FreeRDP_INT32_UNUSED = -1") +list(APPEND SETTINGS_KEYS_UINT32 "FreeRDP_UINT32_UNUSED = -1") +list(APPEND SETTINGS_KEYS_INT64 "FreeRDP_INT64_UNUSED = -1") +list(APPEND SETTINGS_KEYS_UINT64 "FreeRDP_UINT64_UNUSED = -1") +list(APPEND SETTINGS_KEYS_STRING "FreeRDP_STRING_UNUSED = -1") +list(APPEND SETTINGS_KEYS_POINTER "FreeRDP_POINTER_UNUSED = -1") + +string(REPLACE ";" ",\n\t" SETTINGS_KEYS_BOOL "${SETTINGS_KEYS_BOOL}") +string(REPLACE ";" ",\n\t" SETTINGS_KEYS_INT16 "${SETTINGS_KEYS_INT16}") +string(REPLACE ";" ",\n\t" SETTINGS_KEYS_UINT16 "${SETTINGS_KEYS_UINT16}") +string(REPLACE ";" ",\n\t" SETTINGS_KEYS_INT32 "${SETTINGS_KEYS_INT32}") +string(REPLACE ";" ",\n\t" SETTINGS_KEYS_UINT32 "${SETTINGS_KEYS_UINT32}") +string(REPLACE ";" ",\n\t" SETTINGS_KEYS_INT64 "${SETTINGS_KEYS_INT64}") +string(REPLACE ";" ",\n\t" SETTINGS_KEYS_UINT64 "${SETTINGS_KEYS_UINT64}") +string(REPLACE ";" ",\n\t" SETTINGS_KEYS_STRING "${SETTINGS_KEYS_STRING}") +string(REPLACE ";" ",\n\t" SETTINGS_KEYS_POINTER "${SETTINGS_KEYS_POINTER}") + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config/settings_keys.h.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp/settings_keys.h) + +file(GLOB_RECURSE PUBLIC_COMMON_HEADERS + LIST_DIRECTORIES false + "freerdp/*.h" +) +file(GLOB_RECURSE PUBLIC_COMMON_BIN_HEADERS + LIST_DIRECTORIES false + "${CMAKE_CURRENT_BINARY_DIR}/freerdp/*.h" +) +list(SORT PUBLIC_COMMON_HEADERS) + +if (WITH_SERVER) + set(PUBLIC_SERVER_HEADERS ${PUBLIC_COMMON_HEADERS}) + list(FILTER PUBLIC_SERVER_HEADERS INCLUDE REGEX ".*freerdp/server.*") + + set(PUBLIC_PROXY_HEADERS ${PUBLIC_SERVER_HEADERS}) + list(FILTER PUBLIC_SERVER_HEADERS EXCLUDE REGEX ".*freerdp/server/proxy.*") + list(FILTER PUBLIC_PROXY_HEADERS INCLUDE REGEX ".*freerdp/server/proxy.*") + if (WITH_SERVER) + set_property(TARGET freerdp-server APPEND PROPERTY SOURCES + ${PUBLIC_SERVER_HEADERS} + ) + endif() + if (WITH_PROXY) + set_property(TARGET freerdp-server-proxy APPEND PROPERTY SOURCES + ${PUBLIC_PROXY_HEADERS} + ) + endif() +endif() + +if (WITH_CLIENT_COMMON) + set(PUBLIC_CLIENT_HEADERS ${PUBLIC_COMMON_HEADERS}) + list(FILTER PUBLIC_CLIENT_HEADERS INCLUDE REGEX ".*freerdp/client.*") + set_property( TARGET freerdp-client APPEND PROPERTY SOURCES + ${PUBLIC_CLIENT_HEADERS} + ) +endif() + +if (WITH_SERVER) + list(FILTER PUBLIC_COMMON_HEADERS EXCLUDE REGEX ".*freerdp/server.*") +endif() + +list(FILTER PUBLIC_COMMON_HEADERS EXCLUDE REGEX ".*freerdp/client.*") +list(APPEND PUBLIC_COMMON_HEADERS ${PUBLIC_COMMON_BIN_HEADERS}) +set_property(TARGET freerdp APPEND PROPERTY SOURCES + ${PUBLIC_COMMON_HEADERS} +) + +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/freerdp + DESTINATION ${FREERDP_INCLUDE_DIR} + FILES_MATCHING PATTERN "*.h") + +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/freerdp + DESTINATION ${FREERDP_INCLUDE_DIR} + FILES_MATCHING PATTERN "*.h") diff --git a/include/config/build-config.h.in b/include/config/build-config.h.in new file mode 100644 index 0000000..9f16f02 --- /dev/null +++ b/include/config/build-config.h.in @@ -0,0 +1,22 @@ +#ifndef FREERDP_BUILD_CONFIG_H +#define FREERDP_BUILD_CONFIG_H + +#define FREERDP_DATA_PATH "${NATIVE_FREERDP_DATA_PATH}" +#define FREERDP_KEYMAP_PATH "${NATIVE_FREERDP_KEYMAP_PATH}" +#define FREERDP_PLUGIN_PATH "${NATIVE_FREERDP_PLUGIN_PATH}" + +#define FREERDP_INSTALL_PREFIX "${NATIVE_FREERDP_INSTALL_PREFIX}" + +#define FREERDP_LIBRARY_PATH "${NATIVE_FREERDP_LIBRARY_PATH}" + +#define FREERDP_ADDIN_PATH "${NATIVE_FREERDP_ADDIN_PATH}" + +#define FREERDP_SHARED_LIBRARY_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}" +#define FREERDP_SHARED_LIBRARY_PREFIX "${CMAKE_SHARED_LIBRARY_PREFIX}" + +#define FREERDP_VENDOR_STRING "${VENDOR}" +#define FREERDP_PRODUCT_STRING "${PRODUCT}" + +#define FREERDP_PROXY_PLUGINDIR "${NATIVE_FREERDP_PROXY_PLUGINDIR}" + +#endif /* FREERDP_BUILD_CONFIG_H */ diff --git a/include/config/buildflags.h.in b/include/config/buildflags.h.in new file mode 100644 index 0000000..3a286f2 --- /dev/null +++ b/include/config/buildflags.h.in @@ -0,0 +1,11 @@ +#ifndef FREERDP_BUILD_FLAGS_H +#define FREERDP_BUILD_FLAGS_H + +#define FREERDP_CFLAGS "${CMAKE_C_FLAGS}" +#define FREERDP_COMPILER_ID "${CMAKE_C_COMPILER_ID}" +#define FREERDP_COMPILER_VERSION "${CMAKE_C_COMPILER_VERSION}" +#define FREERDP_TARGET_ARCH "${TARGET_ARCH}" +#define FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG}" +#define FREERDP_BUILD_TYPE "${CMAKE_BUILD_TYPE}" + +#endif /* FREERDP_BUILD_FLAGS_H */ diff --git a/include/config/config.h.in b/include/config/config.h.in new file mode 100644 index 0000000..0c6ec7b --- /dev/null +++ b/include/config/config.h.in @@ -0,0 +1,192 @@ +#ifndef FREERDP_CONFIG_H +#define FREERDP_CONFIG_H + +#include <winpr/config.h> + +/* Include files */ +#cmakedefine FREERDP_HAVE_VALGRIND_MEMCHECK_H + +/* Features */ +#cmakedefine SWRESAMPLE_FOUND +#cmakedefine AVRESAMPLE_FOUND + +/* Options */ +#cmakedefine WITH_OPAQUE_SETTINGS + +#cmakedefine WITH_ADD_PLUGIN_TO_RPATH +#cmakedefine WITH_PROFILER +#cmakedefine WITH_GPROF +#cmakedefine WITH_SSE2 +#cmakedefine WITH_NEON +#cmakedefine WITH_IPP +#cmakedefine WITH_CUPS +#cmakedefine WITH_JPEG +#cmakedefine WITH_WIN8 +#cmakedefine WITH_AAD +#cmakedefine WITH_CAIRO +#cmakedefine WITH_SWSCALE +#cmakedefine WITH_RDPSND_DSOUND + +#cmakedefine WITH_WINMM +#cmakedefine WITH_MACAUDIO +#cmakedefine WITH_OSS +#cmakedefine WITH_ALSA +#cmakedefine WITH_PULSE +#cmakedefine WITH_IOSAUDIO +#cmakedefine WITH_OPENSLES +#cmakedefine WITH_GSM +#cmakedefine WITH_LAME +#cmakedefine WITH_OPUS +#cmakedefine WITH_FAAD2 +#cmakedefine WITH_FAAC +#cmakedefine WITH_SOXR +#cmakedefine WITH_GFX_H264 +#cmakedefine WITH_OPENH264 +#cmakedefine WITH_OPENH264_LOADING +#cmakedefine WITH_VIDEO_FFMPEG +#cmakedefine WITH_DSP_EXPERIMENTAL +#cmakedefine WITH_DSP_FFMPEG +#cmakedefine WITH_OPENCL +#cmakedefine WITH_MEDIA_FOUNDATION +#cmakedefine WITH_MEDIACODEC + +#cmakedefine WITH_VAAPI + +#cmakedefine WITH_CHANNELS +#cmakedefine WITH_CLIENT_CHANNELS +#cmakedefine WITH_SERVER_CHANNELS + +#cmakedefine WITH_CHANNEL_GFXREDIR +#cmakedefine WITH_CHANNEL_RDPAPPLIST + +/* Plugins */ +#cmakedefine WITH_RDPDR + +/* Channels */ +#cmakedefine CHANNEL_AINPUT +#cmakedefine CHANNEL_AINPUT_CLIENT +#cmakedefine CHANNEL_AINPUT_SERVER +#cmakedefine CHANNEL_AUDIN +#cmakedefine CHANNEL_AUDIN_CLIENT +#cmakedefine CHANNEL_AUDIN_SERVER +#cmakedefine CHANNEL_CLIPRDR +#cmakedefine CHANNEL_CLIPRDR_CLIENT +#cmakedefine CHANNEL_CLIPRDR_SERVER +#cmakedefine CHANNEL_DISP +#cmakedefine CHANNEL_DISP_CLIENT +#cmakedefine CHANNEL_DISP_SERVER +#cmakedefine CHANNEL_DRDYNVC +#cmakedefine CHANNEL_DRDYNVC_CLIENT +#cmakedefine CHANNEL_DRDYNVC_SERVER +#cmakedefine CHANNEL_DRIVE +#cmakedefine CHANNEL_DRIVE_CLIENT +#cmakedefine CHANNEL_DRIVE_SERVER +#cmakedefine CHANNEL_ECHO +#cmakedefine CHANNEL_ECHO_CLIENT +#cmakedefine CHANNEL_ECHO_SERVER +#cmakedefine CHANNEL_ENCOMSP +#cmakedefine CHANNEL_ENCOMSP_CLIENT +#cmakedefine CHANNEL_ENCOMSP_SERVER +#cmakedefine CHANNEL_GEOMETRY +#cmakedefine CHANNEL_GEOMETRY_CLIENT +#cmakedefine CHANNEL_GEOMETRY_SERVER +#cmakedefine CHANNEL_GFXREDIR +#cmakedefine CHANNEL_GFXREDIR_CLIENT +#cmakedefine CHANNEL_GFXREDIR_SERVER +#cmakedefine CHANNEL_LOCATION +#cmakedefine CHANNEL_LOCATION_CLIENT +#cmakedefine CHANNEL_LOCATION_SERVER +#cmakedefine CHANNEL_PARALLEL +#cmakedefine CHANNEL_PARALLEL_CLIENT +#cmakedefine CHANNEL_PARALLEL_SERVER +#cmakedefine CHANNEL_PRINTER +#cmakedefine CHANNEL_PRINTER_CLIENT +#cmakedefine CHANNEL_PRINTER_SERVER +#cmakedefine CHANNEL_RAIL +#cmakedefine CHANNEL_RAIL_CLIENT +#cmakedefine CHANNEL_RAIL_SERVER +#cmakedefine CHANNEL_RDPAPPLIST +#cmakedefine CHANNEL_RDPAPPLIST_CLIENT +#cmakedefine CHANNEL_RDPAPPLIST_SERVER +#cmakedefine CHANNEL_RDPDR +#cmakedefine CHANNEL_RDPDR_CLIENT +#cmakedefine CHANNEL_RDPDR_SERVER +#cmakedefine CHANNEL_RDPECAM +#cmakedefine CHANNEL_RDPECAM_CLIENT +#cmakedefine CHANNEL_RDPECAM_SERVER +#cmakedefine CHANNEL_RDPEI +#cmakedefine CHANNEL_RDPEI_CLIENT +#cmakedefine CHANNEL_RDPEI_SERVER +#cmakedefine CHANNEL_RDPGFX +#cmakedefine CHANNEL_RDPGFX_CLIENT +#cmakedefine CHANNEL_RDPGFX_SERVER +#cmakedefine CHANNEL_RDPEMSC +#cmakedefine CHANNEL_RDPEMSC_CLIENT +#cmakedefine CHANNEL_RDPEMSC_SERVER +#cmakedefine CHANNEL_RDPSND +#cmakedefine CHANNEL_RDPSND_CLIENT +#cmakedefine CHANNEL_RDPSND_SERVER +#cmakedefine CHANNEL_REMDESK +#cmakedefine CHANNEL_REMDESK_CLIENT +#cmakedefine CHANNEL_REMDESK_SERVER +#cmakedefine CHANNEL_SERIAL +#cmakedefine CHANNEL_SERIAL_CLIENT +#cmakedefine CHANNEL_SERIAL_SERVER +#cmakedefine CHANNEL_SMARTCARD +#cmakedefine CHANNEL_SMARTCARD_CLIENT +#cmakedefine CHANNEL_SMARTCARD_SERVER +#cmakedefine CHANNEL_SSHAGENT +#cmakedefine CHANNEL_SSHAGENT_CLIENT +#cmakedefine CHANNEL_SSHAGENT_SERVER +#cmakedefine CHANNEL_TELEMETRY +#cmakedefine CHANNEL_TELEMETRY_CLIENT +#cmakedefine CHANNEL_TELEMETRY_SERVER +#cmakedefine CHANNEL_TSMF +#cmakedefine CHANNEL_TSMF_CLIENT +#cmakedefine CHANNEL_TSMF_SERVER +#cmakedefine CHANNEL_URBDRC +#cmakedefine CHANNEL_URBDRC_CLIENT +#cmakedefine CHANNEL_URBDRC_SERVER +#cmakedefine CHANNEL_VIDEO +#cmakedefine CHANNEL_VIDEO_CLIENT +#cmakedefine CHANNEL_VIDEO_SERVER + +/* Debug */ +#cmakedefine WITH_DEBUG_CERTIFICATE +#cmakedefine WITH_DEBUG_CAPABILITIES +#cmakedefine WITH_DEBUG_CHANNELS +#cmakedefine WITH_DEBUG_CLIPRDR +#cmakedefine WITH_DEBUG_CODECS +#cmakedefine WITH_DEBUG_RDPGFX +#cmakedefine WITH_DEBUG_DVC +#cmakedefine WITH_DEBUG_TSMF +#cmakedefine WITH_DEBUG_KBD +#cmakedefine WITH_DEBUG_LICENSE +#cmakedefine WITH_DEBUG_NEGO +#cmakedefine WITH_DEBUG_NLA +#cmakedefine WITH_DEBUG_TSG +#cmakedefine WITH_DEBUG_RAIL +#cmakedefine WITH_DEBUG_RDP +#cmakedefine WITH_DEBUG_REDIR +#cmakedefine WITH_DEBUG_RDPDR +#cmakedefine WITH_DEBUG_RFX +#cmakedefine WITH_DEBUG_SCARD +#cmakedefine WITH_DEBUG_SND +#cmakedefine WITH_DEBUG_SVC +#cmakedefine WITH_DEBUG_RDPEI +#cmakedefine WITH_DEBUG_TIMEZONE +#cmakedefine WITH_DEBUG_URBDRC +#cmakedefine WITH_DEBUG_TRANSPORT +#cmakedefine WITH_DEBUG_WND +#cmakedefine WITH_DEBUG_X11 +#cmakedefine WITH_DEBUG_X11_LOCAL_MOVESIZE +#cmakedefine WITH_DEBUG_XV +#cmakedefine WITH_DEBUG_RINGBUFFER + +/* Proxy */ +#cmakedefine WITH_PROXY_MODULES +#cmakedefine WITH_PROXY_EMULATE_SMARTCARD + +#cmakedefine HAVE_AF_VSOCK_H + +#endif /* FREERDP_CONFIG_H */ diff --git a/include/config/settings_keys.h.in b/include/config/settings_keys.h.in new file mode 100644 index 0000000..7f02c6c --- /dev/null +++ b/include/config/settings_keys.h.in @@ -0,0 +1,83 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Internal settings header for functions not exported + * + * Copyright 2023 Armin Novak <armin.novak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SETTINGS_KEYS_H +#define FREERDP_SETTINGS_KEYS_H + +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef enum +{ + @SETTINGS_KEYS_BOOL@ +} FreeRDP_Settings_Keys_Bool; + +typedef enum +{ + @SETTINGS_KEYS_INT16@ +} FreeRDP_Settings_Keys_Int16; + +typedef enum +{ + @SETTINGS_KEYS_UINT16@ +} FreeRDP_Settings_Keys_UInt16; + +typedef enum +{ + @SETTINGS_KEYS_INT32@ +} FreeRDP_Settings_Keys_Int32; + +typedef enum +{ + @SETTINGS_KEYS_UINT32@ +} FreeRDP_Settings_Keys_UInt32; + +typedef enum +{ + @SETTINGS_KEYS_INT64@ +} FreeRDP_Settings_Keys_Int64; + +typedef enum +{ + @SETTINGS_KEYS_UINT64@ +} FreeRDP_Settings_Keys_UInt64; + +typedef enum +{ + @SETTINGS_KEYS_STRING@ +} FreeRDP_Settings_Keys_String; + +typedef enum +{ + @SETTINGS_KEYS_POINTER@ +} FreeRDP_Settings_Keys_Pointer; + + +#define FreeRDP_Settings_StableAPI_MAX 5312 + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SETTINGS_KEYS_H */ diff --git a/include/config/version.h.in b/include/config/version.h.in new file mode 100644 index 0000000..0dffcba --- /dev/null +++ b/include/config/version.h.in @@ -0,0 +1,35 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Version includes + * + * Copyright 2013 Thincast Technologies GmbH + * Copyright 2013 Bernhard Miklautz <bernhard.miklautz@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FREERDP_VERSION_H +#define FREERDP_VERSION_H + +#define FREERDP_VERSION_MAJOR ${FREERDP_VERSION_MAJOR} +#define FREERDP_VERSION_MINOR ${FREERDP_VERSION_MINOR} +#define FREERDP_VERSION_REVISION ${FREERDP_VERSION_REVISION} +#define FREERDP_VERSION_SUFFIX "${FREERDP_VERSION_SUFFIX}" +#define FREERDP_API_VERSION "${FREERDP_API_VERSION}" +#define FREERDP_VERSION "${FREERDP_VERSION}" +#define FREERDP_VERSION_FULL "${FREERDP_VERSION_FULL}" +#define FREERDP_GIT_REVISION "${GIT_REVISION}" +#define FREERDP_USER_AGENT "FreeRDP/${FREERDP_VERSION_FULL}" +#define FREERDP_VENDOR "${VENDOR}" +#define FREERDP_PRODUCT "${PRODUCT}" + +#endif /* FREERDP_VERSION_H */ diff --git a/include/freerdp/addin.h b/include/freerdp/addin.h new file mode 100644 index 0000000..cec491a --- /dev/null +++ b/include/freerdp/addin.h @@ -0,0 +1,81 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Addin Loader + * + * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_COMMON_ADDIN_H +#define FREERDP_COMMON_ADDIN_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#define FREERDP_ADDIN_CLIENT 0x00000001 +#define FREERDP_ADDIN_SERVER 0x00000002 + +#define FREERDP_ADDIN_STATIC 0x00000010 +#define FREERDP_ADDIN_DYNAMIC 0x00000020 + +#define FREERDP_ADDIN_NAME 0x00000100 +#define FREERDP_ADDIN_SUBSYSTEM 0x00000200 +#define FREERDP_ADDIN_TYPE 0x00000400 + +#define FREERDP_ADDIN_CHANNEL_STATIC 0x00001000 +#define FREERDP_ADDIN_CHANNEL_DYNAMIC 0x00002000 +#define FREERDP_ADDIN_CHANNEL_DEVICE 0x00004000 +#define FREERDP_ADDIN_CHANNEL_ENTRYEX 0x00008000 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + DWORD dwFlags; + CHAR cName[16]; + CHAR cType[16]; + CHAR cSubsystem[16]; + } FREERDP_ADDIN; + + typedef PVIRTUALCHANNELENTRY (*FREERDP_LOAD_CHANNEL_ADDIN_ENTRY_FN)(LPCSTR pszName, + LPCSTR pszSubsystem, + LPCSTR pszType, + DWORD dwFlags); + + FREERDP_API LPSTR freerdp_get_library_install_path(void); + FREERDP_API LPSTR freerdp_get_dynamic_addin_install_path(void); + + FREERDP_API int freerdp_register_addin_provider(FREERDP_LOAD_CHANNEL_ADDIN_ENTRY_FN provider, + DWORD dwFlags); + FREERDP_API FREERDP_LOAD_CHANNEL_ADDIN_ENTRY_FN freerdp_get_current_addin_provider(void); + + FREERDP_API PVIRTUALCHANNELENTRY freerdp_load_dynamic_addin(LPCSTR pszFileName, LPCSTR pszPath, + LPCSTR pszEntryName); + FREERDP_API PVIRTUALCHANNELENTRY freerdp_load_dynamic_channel_addin_entry(LPCSTR pszName, + LPCSTR pszSubsystem, + LPCSTR pszType, + DWORD dwFlags); + FREERDP_API PVIRTUALCHANNELENTRY freerdp_load_channel_addin_entry(LPCSTR pszName, + LPCSTR pszSubsystem, + LPCSTR pszType, + DWORD dwFlags); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_COMMON_ADDIN_H */ diff --git a/include/freerdp/altsec.h b/include/freerdp/altsec.h new file mode 100644 index 0000000..348662c --- /dev/null +++ b/include/freerdp/altsec.h @@ -0,0 +1,210 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Alternate Secondary Drawing Orders Interface API + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UPDATE_ALTSEC_H +#define FREERDP_UPDATE_ALTSEC_H + +#include <freerdp/types.h> + +#define DSDNG_STRETCH 0x00000001 +#define DSDNG_TILE 0x00000002 +#define DSDNG_PERPIXELALPHA 0x00000004 +#define DSDNG_TRANSPARENT 0x00000008 +#define DSDNG_MUSTFLIP 0x00000010 +#define DSDNG_TRUESIZE 0x00000020 + +#define FRAME_START 0x00000000 +#define FRAME_END 0x00000001 + +#define STREAM_BITMAP_END 0x01 +#define STREAM_BITMAP_COMPRESSED 0x02 +#define STREAM_BITMAP_V2 0x04 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT32 sIndices; + UINT32 cIndices; + UINT16* indices; + } OFFSCREEN_DELETE_LIST; + + typedef struct + { + UINT32 id; + UINT32 cx; + UINT32 cy; + OFFSCREEN_DELETE_LIST deleteList; + } CREATE_OFFSCREEN_BITMAP_ORDER; + + typedef struct + { + UINT32 bitmapId; + } SWITCH_SURFACE_ORDER; + + typedef struct + { + UINT32 flFlags; + UINT32 ulLeftWidth; + UINT32 ulRightWidth; + UINT32 ulTopHeight; + UINT32 ulBottomHeight; + UINT32 crTransparent; + } NINE_GRID_BITMAP_INFO; + + typedef struct + { + UINT32 bitmapBpp; + UINT32 bitmapId; + UINT32 cx; + UINT32 cy; + NINE_GRID_BITMAP_INFO nineGridInfo; + } CREATE_NINE_GRID_BITMAP_ORDER; + + typedef struct + { + UINT32 action; + } FRAME_MARKER_ORDER; + + typedef struct + { + UINT32 bitmapFlags; + UINT32 bitmapBpp; + UINT32 bitmapType; + UINT32 bitmapWidth; + UINT32 bitmapHeight; + UINT32 bitmapSize; + UINT32 bitmapBlockSize; + BYTE* bitmapBlock; + } STREAM_BITMAP_FIRST_ORDER; + + typedef struct + { + UINT32 bitmapFlags; + UINT32 bitmapType; + UINT32 bitmapBlockSize; + BYTE* bitmapBlock; + } STREAM_BITMAP_NEXT_ORDER; + + typedef struct + { + UINT32 cbSize; + UINT32 cbTotalSize; + UINT32 cbTotalEmfSize; + BYTE* emfRecords; + } DRAW_GDIPLUS_FIRST_ORDER; + + typedef struct + { + UINT32 cbSize; + BYTE* emfRecords; + } DRAW_GDIPLUS_NEXT_ORDER; + + typedef struct + { + UINT32 cbSize; + UINT32 cbTotalSize; + UINT32 cbTotalEmfSize; + BYTE* emfRecords; + } DRAW_GDIPLUS_END_ORDER; + + typedef struct + { + UINT32 flags; + UINT32 cacheType; + UINT32 cacheIndex; + UINT32 cbSize; + UINT32 cbTotalSize; + BYTE* emfRecords; + } DRAW_GDIPLUS_CACHE_FIRST_ORDER; + + typedef struct + { + UINT32 flags; + UINT32 cacheType; + UINT32 cacheIndex; + UINT32 cbSize; + BYTE* emfRecords; + } DRAW_GDIPLUS_CACHE_NEXT_ORDER; + + typedef struct + { + UINT32 flags; + UINT32 cacheType; + UINT32 cacheIndex; + UINT32 cbSize; + UINT32 cbTotalSize; + BYTE* emfRecords; + } DRAW_GDIPLUS_CACHE_END_ORDER; + + typedef BOOL (*pCreateOffscreenBitmap)( + rdpContext* context, const CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap); + typedef BOOL (*pSwitchSurface)(rdpContext* context, const SWITCH_SURFACE_ORDER* switch_surface); + typedef BOOL (*pCreateNineGridBitmap)( + rdpContext* context, const CREATE_NINE_GRID_BITMAP_ORDER* create_nine_grid_bitmap); + typedef BOOL (*pFrameMarker)(rdpContext* context, const FRAME_MARKER_ORDER* frame_marker); + typedef BOOL (*pStreamBitmapFirst)(rdpContext* context, + const STREAM_BITMAP_FIRST_ORDER* stream_bitmap_first); + typedef BOOL (*pStreamBitmapNext)(rdpContext* context, + const STREAM_BITMAP_NEXT_ORDER* stream_bitmap_next); + typedef BOOL (*pDrawGdiPlusFirst)(rdpContext* context, + const DRAW_GDIPLUS_FIRST_ORDER* draw_gdiplus_first); + typedef BOOL (*pDrawGdiPlusNext)(rdpContext* context, + const DRAW_GDIPLUS_NEXT_ORDER* draw_gdiplus_next); + typedef BOOL (*pDrawGdiPlusEnd)(rdpContext* context, + const DRAW_GDIPLUS_END_ORDER* draw_gdiplus_end); + typedef BOOL (*pDrawGdiPlusCacheFirst)( + rdpContext* context, const DRAW_GDIPLUS_CACHE_FIRST_ORDER* draw_gdiplus_cache_first); + typedef BOOL (*pDrawGdiPlusCacheNext)( + rdpContext* context, const DRAW_GDIPLUS_CACHE_NEXT_ORDER* draw_gdiplus_cache_next); + typedef BOOL (*pDrawGdiPlusCacheEnd)( + rdpContext* context, const DRAW_GDIPLUS_CACHE_END_ORDER* draw_gdiplus_cache_end); + typedef BOOL (*pDrawOrderInfo)(rdpContext* context, UINT8 orderType, const char* orderName); + + struct rdp_altsec_update + { + rdpContext* context; /* 0 */ + UINT32 paddingA[16 - 1]; /* 1 */ + + pCreateOffscreenBitmap CreateOffscreenBitmap; /* 16 */ + pSwitchSurface SwitchSurface; /* 17 */ + pCreateNineGridBitmap CreateNineGridBitmap; /* 18 */ + pFrameMarker FrameMarker; /* 19 */ + pStreamBitmapFirst StreamBitmapFirst; /* 20 */ + pStreamBitmapNext StreamBitmapNext; /* 21 */ + pDrawGdiPlusFirst DrawGdiPlusFirst; /* 22 */ + pDrawGdiPlusNext DrawGdiPlusNext; /* 23 */ + pDrawGdiPlusEnd DrawGdiPlusEnd; /* 24 */ + pDrawGdiPlusCacheFirst DrawGdiPlusCacheFirst; /* 25 */ + pDrawGdiPlusCacheNext DrawGdiPlusCacheNext; /* 26 */ + pDrawGdiPlusCacheEnd DrawGdiPlusCacheEnd; /* 27 */ + /* Statistics callback */ + pDrawOrderInfo DrawOrderInfo; /* 28 */ + UINT32 paddingB[32 - 29]; /* 29 */ + }; + typedef struct rdp_altsec_update rdpAltSecUpdate; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UPDATE_ALTSEC_H */ diff --git a/include/freerdp/api.h b/include/freerdp/api.h new file mode 100644 index 0000000..aa25555 --- /dev/null +++ b/include/freerdp/api.h @@ -0,0 +1,116 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Interface + * + * Copyright 2009-2011 Jay Sorg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_API_H +#define FREERDP_API_H + +#include <winpr/winpr.h> +#include <winpr/wlog.h> +#include <winpr/platform.h> + +/* To silence missing prototype warnings for library entry points use this macro. + * It first declares the function as prototype and then again as function implementation + */ +#define FREERDP_ENTRY_POINT(fkt) \ + fkt; \ + fkt + +#ifdef _WIN32 +#define FREERDP_CC __cdecl +#else +#define FREERDP_CC +#endif + +#if defined _WIN32 || defined __CYGWIN__ +#ifdef FREERDP_EXPORTS +#ifdef __GNUC__ +#define FREERDP_API __attribute__((dllexport)) +#else +#define FREERDP_API __declspec(dllexport) +#endif +#else +#ifdef __GNUC__ +#define FREERDP_API __attribute__((dllimport)) +#else +#define FREERDP_API __declspec(dllimport) +#endif +#endif +#else +#if defined(__GNUC__) && (__GNUC__ >= 4) +#define FREERDP_API __attribute__((visibility("default"))) +#else +#define FREERDP_API +#endif +#endif + +#if defined(EXPORT_ALL_SYMBOLS) +#define FREERDP_LOCAL FREERDP_API +#else +#if defined _WIN32 || defined __CYGWIN__ +#define FREERDP_LOCAL +#else +#if defined(__GNUC__) && (__GNUC__ >= 4) +#define FREERDP_LOCAL __attribute__((visibility("hidden"))) +#else +#define FREERDP_LOCAL +#endif +#endif +#endif + +#define IFCALL(_cb, ...) \ + do \ + { \ + if (_cb != NULL) \ + _cb(__VA_ARGS__); \ + else \ + WLog_VRB("com.freerdp.api", "IFCALL(" #_cb ") == NULL"); \ + } while (0) +#define IFCALLRET(_cb, _ret, ...) \ + do \ + { \ + if (_cb != NULL) \ + _ret = _cb(__VA_ARGS__); \ + else \ + WLog_VRB("com.freerdp.api", "IFCALLRET(" #_cb ") == NULL"); \ + } while (0) + +#if 0 // defined(__GNUC__) +#define IFCALLRESULT(_default_return, _cb, ...) \ + ({ \ + (_cb != NULL) ? _cb(__VA_ARGS__) : ({ \ + WLog_VRB("com.freerdp.api", "IFCALLRESULT(" #_cb ") == NULL"); \ + (_default_return); \ + }); \ + }) +#else +#define IFCALLRESULT(_default_return, _cb, ...) \ + ((_cb != NULL) ? _cb(__VA_ARGS__) : (_default_return)) +#endif + +#if defined(__GNUC__) +#define ALIGN64 __attribute__((aligned(8))) +#else +#ifdef _WIN32 +#define ALIGN64 __declspec(align(8)) +#else +#define ALIGN64 +#endif +#endif + +#endif /* FREERDP_API */ diff --git a/include/freerdp/assistance.h b/include/freerdp/assistance.h new file mode 100644 index 0000000..f6e9aa9 --- /dev/null +++ b/include/freerdp/assistance.h @@ -0,0 +1,69 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_REMOTE_ASSISTANCE_H +#define FREERDP_REMOTE_ASSISTANCE_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_assistance_file rdpAssistanceFile; + + FREERDP_API BYTE* freerdp_assistance_hex_string_to_bin(const void* str, size_t* size); + FREERDP_API char* freerdp_assistance_bin_to_hex_string(const void* data, size_t size); + + FREERDP_API char* freerdp_assistance_generate_pass_stub(DWORD flags); + FREERDP_API char* freerdp_assistance_construct_expert_blob(const char* name, const char* pass); + FREERDP_API BYTE* freerdp_assistance_encrypt_pass_stub(const char* password, + const char* passStub, + size_t* pEncryptedSize); + + FREERDP_API int freerdp_assistance_set_connection_string2(rdpAssistanceFile* file, + const char* string, + const char* password); + + FREERDP_API int freerdp_assistance_parse_file_buffer(rdpAssistanceFile* file, + const char* buffer, size_t size, + const char* password); + FREERDP_API int freerdp_assistance_parse_file(rdpAssistanceFile* file, const char* name, + const char* password); + + FREERDP_API BOOL freerdp_assistance_populate_settings_from_assistance_file( + rdpAssistanceFile* file, rdpSettings* settings); + FREERDP_API BOOL freerdp_assistance_get_encrypted_pass_stub(rdpAssistanceFile* file, + const char** pwd, size_t* size); + + FREERDP_API void freerdp_assistance_file_free(rdpAssistanceFile* file); + + WINPR_ATTR_MALLOC(freerdp_assistance_file_free, 1) + FREERDP_API rdpAssistanceFile* freerdp_assistance_file_new(void); + + FREERDP_API void freerdp_assistance_print_file(rdpAssistanceFile* file, wLog* log, DWORD level); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_REMOTE_ASSISTANCE_H */ diff --git a/include/freerdp/autodetect.h b/include/freerdp/autodetect.h new file mode 100644 index 0000000..b855148 --- /dev/null +++ b/include/freerdp/autodetect.h @@ -0,0 +1,144 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Auto-Detect PDUs + * + * Copyright 2014 Dell Software <Mike.McDonald@software.dell.com> + * Copyright 2014 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_AUTODETECT_H +#define FREERDP_AUTODETECT_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + FREERDP_AUTODETECT_STATE_INITIAL, + FREERDP_AUTODETECT_STATE_REQUEST, + FREERDP_AUTODETECT_STATE_RESPONSE, + FREERDP_AUTODETECT_STATE_COMPLETE, + FREERDP_AUTODETECT_STATE_FAIL + } FREERDP_AUTODETECT_STATE; + + typedef enum + { + RDP_NETCHAR_RESERVED = 0x0000U, + /* The baseRTT and averageRTT fields are valid */ + RDP_NETCHAR_RESULT_TYPE_BASE_RTT_AVG_RTT = 0x0840U, + /* The bandwidth and averageRTT fields are valid */ + RDP_NETCHAR_RESULT_TYPE_BW_AVG_RTT = 0x0880U, + /* The baseRTT, bandwidth and averageRTT fields are valid */ + RDP_NETCHAR_RESULT_TYPE_BASE_RTT_BW_AVG_RTT = 0x08C0U + } RDP_NETCHAR_RESULT_TYPE; + + typedef enum + { + RDP_BW_RESULTS_RESPONSE_TYPE_CONNECTTIME = 0x0003, + RDP_BW_RESULTS_RESPONSE_TYPE_CONTINUOUS = 0x000B + } RDP_BW_RESULTS_RESPONSE_TYPE; + + typedef struct rdp_autodetect rdpAutoDetect; + typedef struct rdp_network_characteristics_result rdpNetworkCharacteristicsResult; + + typedef BOOL (*pRTTMeasureRequest)(rdpAutoDetect* autodetect, RDP_TRANSPORT_TYPE transport, + UINT16 sequenceNumber); + typedef BOOL (*pRTTMeasureResponse)(rdpAutoDetect* autodetect, RDP_TRANSPORT_TYPE transport, + UINT16 sequenceNumber); + typedef BOOL (*pBandwidthMeasureStart)(rdpAutoDetect* autodetect, RDP_TRANSPORT_TYPE transport, + UINT16 sequenceNumber); + typedef BOOL (*pBandwidthMeasurePayload)(rdpAutoDetect* autodetect, + RDP_TRANSPORT_TYPE transport, UINT16 sequenceNumber, + UINT16 payloadLength); + typedef BOOL (*pBandwidthMeasureStop)(rdpAutoDetect* autodetect, RDP_TRANSPORT_TYPE transport, + UINT16 sequenceNumber, UINT16 payloadLength); + typedef BOOL (*pBandwidthMeasureResults)(rdpAutoDetect* autodetect, + RDP_TRANSPORT_TYPE transport, UINT16 sequenceNumber, + UINT16 responseType, UINT32 timeDelta, + UINT32 byteCount); + typedef BOOL (*pNetworkCharacteristicsResult)(rdpAutoDetect* autodetect, + RDP_TRANSPORT_TYPE transport, + UINT16 sequenceNumber, + const rdpNetworkCharacteristicsResult* result); + typedef BOOL (*pClientBandwidthMeasureResult)(rdpAutoDetect* autodetect, + RDP_TRANSPORT_TYPE transport, UINT16 responseType, + UINT16 sequenceNumber, UINT32 timeDelta, + UINT32 byteCount); + typedef BOOL (*pNetworkCharacteristicsSync)(rdpAutoDetect* autodetect, + RDP_TRANSPORT_TYPE transport, UINT16 sequenceNumber, + UINT32 bandwidth, UINT32 rtt); + typedef BOOL (*pRxTxReceived)(rdpAutoDetect* autodetect, RDP_TRANSPORT_TYPE transport, + UINT16 requestType, UINT16 sequenceNumber); + typedef FREERDP_AUTODETECT_STATE (*pOnConnectTimeAutoDetect)(rdpAutoDetect* autodetect); + + struct rdp_network_characteristics_result + { + /* Specifies, which fields are valid */ + RDP_NETCHAR_RESULT_TYPE type; + + /* Lowest detected round-trip time in milliseconds. */ + UINT32 baseRTT; + /* Current average round-trip time in milliseconds. */ + UINT32 averageRTT; + /* Current bandwidth in kilobits per second. */ + UINT32 bandwidth; + }; + + struct rdp_autodetect + { + ALIGN64 rdpContext* context; /* 0 */ + /* RTT measurement */ + ALIGN64 UINT64 rttMeasureStartTime; /* 1 */ + /* Bandwidth measurement */ + ALIGN64 UINT64 bandwidthMeasureStartTime; /* 2 */ + ALIGN64 UINT64 bandwidthMeasureTimeDelta; /* 3 */ + ALIGN64 UINT32 bandwidthMeasureByteCount; /* 4 */ + /* Network characteristics (as reported by server) */ + ALIGN64 UINT32 netCharBandwidth; /* 5 */ + ALIGN64 UINT32 netCharBaseRTT; /* 6 */ + ALIGN64 UINT32 netCharAverageRTT; /* 7 */ + ALIGN64 BOOL bandwidthMeasureStarted; /* 8 */ + ALIGN64 FREERDP_AUTODETECT_STATE state; /* 9 */ + ALIGN64 void* custom; /* 10 */ + ALIGN64 wLog* log; /* 11 */ + UINT64 paddingA[16 - 12]; /* 12 */ + + ALIGN64 pRTTMeasureRequest RTTMeasureRequest; /* 16 */ + ALIGN64 pRTTMeasureResponse RTTMeasureResponse; /* 17 */ + ALIGN64 pBandwidthMeasureStart BandwidthMeasureStart; /* 18 */ + ALIGN64 pBandwidthMeasurePayload BandwidthMeasurePayload; /* 19 */ + ALIGN64 pBandwidthMeasureStop BandwidthMeasureStop; /* 20 */ + ALIGN64 pBandwidthMeasureResults BandwidthMeasureResults; /* 21 */ + ALIGN64 pNetworkCharacteristicsResult NetworkCharacteristicsResult; /* 22 */ + ALIGN64 pClientBandwidthMeasureResult ClientBandwidthMeasureResult; /* 23 */ + ALIGN64 pNetworkCharacteristicsSync NetworkCharacteristicsSync; /* 24 */ + ALIGN64 pRxTxReceived RequestReceived; /* 25 */ + ALIGN64 pRxTxReceived ResponseReceived; /* 26 */ + ALIGN64 pOnConnectTimeAutoDetect OnConnectTimeAutoDetectBegin; /* 27 */ + ALIGN64 pOnConnectTimeAutoDetect OnConnectTimeAutoDetectProgress; /* 28 */ + UINT64 paddingB[32 - 29]; /* 29 */ + }; + FREERDP_API rdpAutoDetect* autodetect_get(rdpContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_AUTODETECT_H */ diff --git a/include/freerdp/cache/persistent.h b/include/freerdp/cache/persistent.h new file mode 100644 index 0000000..a36595b --- /dev/null +++ b/include/freerdp/cache/persistent.h @@ -0,0 +1,100 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Persistent Bitmap Cache + * + * Copyright 2016 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_PERSISTENT_CACHE_H +#define FREERDP_PERSISTENT_CACHE_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/update.h> + +#include <winpr/crt.h> +#include <winpr/stream.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_persistent_cache rdpPersistentCache; + +#pragma pack(push, 1) + +/* 12 bytes */ + + typedef struct + { + BYTE sig[8]; + UINT32 flags; /* 0x00000003, 0x00000006 */ + } PERSISTENT_CACHE_HEADER_V3; + +/* 12 bytes */ + + typedef struct + { + UINT64 key64; + UINT16 width; + UINT16 height; + } PERSISTENT_CACHE_ENTRY_V3; + +/* 20 bytes */ + + typedef struct + { + UINT64 key64; + UINT16 width; + UINT16 height; + UINT32 size; + UINT32 flags; /* 0x00000011 */ + } PERSISTENT_CACHE_ENTRY_V2; + +#pragma pack(pop) + + typedef struct + { + UINT64 key64; + UINT16 width; + UINT16 height; + UINT32 size; + UINT32 flags; + BYTE* data; + } PERSISTENT_CACHE_ENTRY; + + FREERDP_API int persistent_cache_get_version(rdpPersistentCache* persistent); + FREERDP_API int persistent_cache_get_count(rdpPersistentCache* persistent); + + FREERDP_API int persistent_cache_read_entry(rdpPersistentCache* persistent, + PERSISTENT_CACHE_ENTRY* entry); + FREERDP_API int persistent_cache_write_entry(rdpPersistentCache* persistent, + const PERSISTENT_CACHE_ENTRY* entry); + + FREERDP_API int persistent_cache_open(rdpPersistentCache* persistent, const char* filename, + BOOL write, UINT32 version); + FREERDP_API int persistent_cache_close(rdpPersistentCache* persistent); + + FREERDP_API void persistent_cache_free(rdpPersistentCache* persistent); + + WINPR_ATTR_MALLOC(persistent_cache_free, 1) + FREERDP_API rdpPersistentCache* persistent_cache_new(void); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_PERSISTENT_CACHE_H */ diff --git a/include/freerdp/channels/ainput.h b/include/freerdp/channels/ainput.h new file mode 100644 index 0000000..aea73bc --- /dev/null +++ b/include/freerdp/channels/ainput.h @@ -0,0 +1,70 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Audio Input Redirection Virtual Channel + * + * Copyright 2022 Armin Novak <anovak@thincast.com> + * Copyright 2022 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_AINPUT_H +#define FREERDP_CHANNEL_AINPUT_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define AINPUT_CHANNEL_NAME "ainput" +#define AINPUT_DVC_CHANNEL_NAME "FreeRDP::Advanced::Input" + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + MSG_AINPUT_VERSION = 0x01, + MSG_AINPUT_MOUSE = 0x02 + } eAInputMsgType; + + typedef enum + { + AINPUT_FLAGS_WHEEL = 0x0001, + AINPUT_FLAGS_MOVE = 0x0004, + AINPUT_FLAGS_DOWN = 0x0008, + + AINPUT_FLAGS_REL = 0x0010, + AINPUT_FLAGS_HAVE_REL = 0x0020, + + /* Pointer Flags */ + AINPUT_FLAGS_BUTTON1 = 0x1000, /* left */ + AINPUT_FLAGS_BUTTON2 = 0x2000, /* right */ + AINPUT_FLAGS_BUTTON3 = 0x4000, /* middle */ + + /* Extended Pointer Flags */ + AINPUT_XFLAGS_BUTTON1 = 0x0100, + AINPUT_XFLAGS_BUTTON2 = 0x0200 + } AInputEventFlags; + + typedef struct ainput_client_context AInputClientContext; + +#define AINPUT_VERSION_MAJOR 1 +#define AINPUT_VERSION_MINOR 0 + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_AINPUT_H */ diff --git a/include/freerdp/channels/audin.h b/include/freerdp/channels/audin.h new file mode 100644 index 0000000..17254e6 --- /dev/null +++ b/include/freerdp/channels/audin.h @@ -0,0 +1,124 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Audio Input Redirection Virtual Channel + * + * Copyright 2010-2011 Vic Lee + * Copyright 2023 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_AUDIN_H +#define FREERDP_CHANNEL_AUDIN_H + +#include <freerdp/api.h> +#include <freerdp/codec/audio.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define AUDIN_CHANNEL_NAME "audin" +#define AUDIN_DVC_CHANNEL_NAME "AUDIO_INPUT" + +typedef struct +{ + BYTE MessageId; +} SNDIN_PDU; + +typedef enum +{ + SNDIN_VERSION_Version_1 = 0x00000001, + SNDIN_VERSION_Version_2 = 0x00000002, +} SNDIN_VERSION_Version; + +typedef struct +{ + SNDIN_PDU Header; + SNDIN_VERSION_Version Version; +} SNDIN_VERSION; + +typedef struct +{ + SNDIN_PDU Header; + UINT32 NumFormats; + UINT32 cbSizeFormatsPacket; + AUDIO_FORMAT* SoundFormats; + size_t ExtraDataSize; +} SNDIN_FORMATS; + +typedef enum +{ + SPEAKER_FRONT_LEFT = 0x00000001, + SPEAKER_FRONT_RIGHT = 0x00000002, + SPEAKER_FRONT_CENTER = 0x00000004, + SPEAKER_LOW_FREQUENCY = 0x00000008, + SPEAKER_BACK_LEFT = 0x00000010, + SPEAKER_BACK_RIGHT = 0x00000020, + SPEAKER_FRONT_LEFT_OF_CENTER = 0x00000040, + SPEAKER_FRONT_RIGHT_OF_CENTER = 0x00000080, + SPEAKER_BACK_CENTER = 0x00000100, + SPEAKER_SIDE_LEFT = 0x00000200, + SPEAKER_SIDE_RIGHT = 0x00000400, + SPEAKER_TOP_CENTER = 0x00000800, + SPEAKER_TOP_FRONT_LEFT = 0x00001000, + SPEAKER_TOP_FRONT_CENTER = 0x00002000, + SPEAKER_TOP_FRONT_RIGHT = 0x00004000, + SPEAKER_TOP_BACK_LEFT = 0x00008000, + SPEAKER_TOP_BACK_CENTER = 0x00010000, + SPEAKER_TOP_BACK_RIGHT = 0x00020000, +} AUDIN_SPEAKER; + +typedef struct +{ + union + { + UINT16 wValidBitsPerSample; + UINT16 wSamplesPerBlock; + UINT16 wReserved; + } Samples; + AUDIN_SPEAKER dwChannelMask; + GUID SubFormat; +} WAVEFORMAT_EXTENSIBLE; + +typedef struct +{ + SNDIN_PDU Header; + UINT32 FramesPerPacket; + UINT32 initialFormat; + AUDIO_FORMAT captureFormat; + WAVEFORMAT_EXTENSIBLE* ExtraFormatData; +} SNDIN_OPEN; + +typedef struct +{ + SNDIN_PDU Header; + UINT32 Result; +} SNDIN_OPEN_REPLY; + +typedef struct +{ + SNDIN_PDU Header; +} SNDIN_DATA_INCOMING; + +typedef struct +{ + SNDIN_PDU Header; + wStream* Data; +} SNDIN_DATA; + +typedef struct +{ + SNDIN_PDU Header; + UINT32 NewFormat; +} SNDIN_FORMATCHANGE; + +#endif /* FREERDP_CHANNEL_AUDIN_H */ diff --git a/include/freerdp/channels/channels.h b/include/freerdp/channels/channels.h new file mode 100644 index 0000000..df96819 --- /dev/null +++ b/include/freerdp/channels/channels.h @@ -0,0 +1,68 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Virtual Channel Manager + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2010-2011 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNELS_H +#define FREERDP_CHANNELS_H + +#include <winpr/crt.h> +#include <winpr/wtsapi.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API int freerdp_channels_client_load(rdpChannels* channels, rdpSettings* settings, + PVIRTUALCHANNELENTRY entry, void* data); + FREERDP_API int freerdp_channels_client_load_ex(rdpChannels* channels, rdpSettings* settings, + PVIRTUALCHANNELENTRYEX entryEx, void* data); + FREERDP_API int freerdp_channels_load_plugin(rdpChannels* channels, rdpSettings* settings, + const char* name, void* data); +#if defined(WITH_FREERDP_DEPRECATED) + FREERDP_API WINPR_DEPRECATED_VAR( + "Use freerdp_channels_get_event_handle", + BOOL freerdp_channels_get_fds(rdpChannels* channels, freerdp* instance, void** read_fds, + int* read_count, void** write_fds, int* write_count)); +#endif + FREERDP_API BOOL freerdp_channels_check_fds(rdpChannels* channels, freerdp* instance); + + FREERDP_API void* freerdp_channels_get_static_channel_interface(rdpChannels* channels, + const char* name); + + FREERDP_API HANDLE freerdp_channels_get_event_handle(freerdp* instance); + FREERDP_API int freerdp_channels_process_pending_messages(freerdp* instance); + + FREERDP_API BOOL freerdp_channels_data(freerdp* instance, UINT16 channelId, const BYTE* data, + size_t dataSize, UINT32 flags, size_t totalSize); + + FREERDP_API UINT16 freerdp_channels_get_id_by_name(freerdp* instance, const char* channel_name); + FREERDP_API const char* freerdp_channels_get_name_by_id(freerdp* instance, UINT16 channelId); + + FREERDP_API const WtsApiFunctionTable* FreeRDP_InitWtsApi(void); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNELS_H */ diff --git a/include/freerdp/channels/cliprdr.h b/include/freerdp/channels/cliprdr.h new file mode 100644 index 0000000..297a977 --- /dev/null +++ b/include/freerdp/channels/cliprdr.h @@ -0,0 +1,208 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Clipboard Virtual Channel Extension + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_CLIPRDR_H +#define FREERDP_CHANNEL_CLIPRDR_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/utils/cliprdr_utils.h> + +#include <winpr/shell.h> + +#define CLIPRDR_CHANNEL_NAME "cliprdr" +#define CLIPRDR_SVC_CHANNEL_NAME "cliprdr" + +/* CLIPRDR_HEADER.msgType */ +typedef enum +{ + CB_MONITOR_READY = 0x0001, + CB_FORMAT_LIST = 0x0002, + CB_FORMAT_LIST_RESPONSE = 0x0003, + CB_FORMAT_DATA_REQUEST = 0x0004, + CB_FORMAT_DATA_RESPONSE = 0x0005, + CB_TEMP_DIRECTORY = 0x0006, + CB_CLIP_CAPS = 0x0007, + CB_FILECONTENTS_REQUEST = 0x0008, + CB_FILECONTENTS_RESPONSE = 0x0009, + CB_LOCK_CLIPDATA = 0x000A, + CB_UNLOCK_CLIPDATA = 0x000B +} CliprdrMsgType; + +/* CLIPRDR_HEADER.msgFlags */ +#define CB_RESPONSE_OK 0x0001 +#define CB_RESPONSE_FAIL 0x0002 +#define CB_ASCII_NAMES 0x0004 + +/* CLIPRDR_CAPS_SET.capabilitySetType */ +#define CB_CAPSTYPE_GENERAL 0x0001 + +/* CLIPRDR_GENERAL_CAPABILITY.lengthCapability */ +#define CB_CAPSTYPE_GENERAL_LEN 12 + +/* CLIPRDR_GENERAL_CAPABILITY.version */ +#define CB_CAPS_VERSION_1 0x00000001 +#define CB_CAPS_VERSION_2 0x00000002 + +/* CLIPRDR_GENERAL_CAPABILITY.generalFlags */ +#define CB_USE_LONG_FORMAT_NAMES 0x00000002 +#define CB_STREAM_FILECLIP_ENABLED 0x00000004 +#define CB_FILECLIP_NO_FILE_PATHS 0x00000008 +#define CB_CAN_LOCK_CLIPDATA 0x00000010 +#define CB_HUGE_FILE_SUPPORT_ENABLED 0x00000020 + +/* File Contents Request Flags */ +#define FILECONTENTS_SIZE 0x00000001 +#define FILECONTENTS_RANGE 0x00000002 + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Special Clipboard Response Formats */ + + typedef struct + { + UINT32 mappingMode; + UINT32 xExt; + UINT32 yExt; + UINT32 metaFileSize; + BYTE* metaFileData; + } CLIPRDR_MFPICT; + + /* Clipboard Messages */ + + typedef struct + { + UINT16 msgType; + UINT16 msgFlags; + UINT32 dataLen; + } CLIPRDR_HEADER; + + typedef struct + { + UINT16 capabilitySetType; + UINT16 capabilitySetLength; + } CLIPRDR_CAPABILITY_SET; + + typedef struct + { + UINT16 capabilitySetType; + UINT16 capabilitySetLength; + + UINT32 version; + UINT32 generalFlags; + } CLIPRDR_GENERAL_CAPABILITY_SET; + + typedef struct + { + CLIPRDR_HEADER common; + + UINT32 cCapabilitiesSets; + CLIPRDR_CAPABILITY_SET* capabilitySets; + } CLIPRDR_CAPABILITIES; + + typedef struct + { + CLIPRDR_HEADER common; + } CLIPRDR_MONITOR_READY; + + typedef struct + { + CLIPRDR_HEADER common; + + char szTempDir[520]; + } CLIPRDR_TEMP_DIRECTORY; + + typedef struct + { + UINT32 formatId; + char* formatName; + } CLIPRDR_FORMAT; + + typedef struct + { + CLIPRDR_HEADER common; + + UINT32 numFormats; + CLIPRDR_FORMAT* formats; + } CLIPRDR_FORMAT_LIST; + + typedef struct + { + CLIPRDR_HEADER common; + } CLIPRDR_FORMAT_LIST_RESPONSE; + + typedef struct + { + CLIPRDR_HEADER common; + + UINT32 clipDataId; + } CLIPRDR_LOCK_CLIPBOARD_DATA; + + typedef struct + { + CLIPRDR_HEADER common; + + UINT32 clipDataId; + } CLIPRDR_UNLOCK_CLIPBOARD_DATA; + + typedef struct + { + CLIPRDR_HEADER common; + + UINT32 requestedFormatId; + } CLIPRDR_FORMAT_DATA_REQUEST; + + typedef struct + { + CLIPRDR_HEADER common; + + const BYTE* requestedFormatData; + } CLIPRDR_FORMAT_DATA_RESPONSE; + + typedef struct + { + CLIPRDR_HEADER common; + + UINT32 streamId; + UINT32 listIndex; + UINT32 dwFlags; + UINT32 nPositionLow; + UINT32 nPositionHigh; + UINT32 cbRequested; + BOOL haveClipDataId; + UINT32 clipDataId; + } CLIPRDR_FILE_CONTENTS_REQUEST; + + typedef struct + { + CLIPRDR_HEADER common; + + UINT32 streamId; + UINT32 cbRequested; + const BYTE* requestedData; + } CLIPRDR_FILE_CONTENTS_RESPONSE; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_CLIPRDR_H */ diff --git a/include/freerdp/channels/disp.h b/include/freerdp/channels/disp.h new file mode 100644 index 0000000..8e08bf2 --- /dev/null +++ b/include/freerdp/channels/disp.h @@ -0,0 +1,89 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDPEDISP Virtual Channel Extension + * + * Copyright 2019 Kobi Mizrachi <kmizrachi18@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_DISP_H +#define FREERDP_CHANNEL_DISP_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#define DISPLAY_CONTROL_PDU_TYPE_CAPS 0x00000005 +#define DISPLAY_CONTROL_PDU_TYPE_MONITOR_LAYOUT 0x00000002 +#define DISPLAY_CONTROL_MONITOR_LAYOUT_SIZE 40 + +#define DISP_CHANNEL_NAME "disp" + +#define DISP_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::DisplayControl" +#define ORIENTATION_LANDSCAPE 0 +#define ORIENTATION_PORTRAIT 90 +#define ORIENTATION_LANDSCAPE_FLIPPED 180 +#define ORIENTATION_PORTRAIT_FLIPPED 270 + +#define DISPLAY_CONTROL_MONITOR_PRIMARY 0x00000001 +#define DISPLAY_CONTROL_HEADER_LENGTH 0x00000008 + +#define DISPLAY_CONTROL_MIN_MONITOR_WIDTH 200 +#define DISPLAY_CONTROL_MAX_MONITOR_WIDTH 8192 + +#define DISPLAY_CONTROL_MIN_MONITOR_HEIGHT 200 +#define DISPLAY_CONTROL_MAX_MONITOR_HEIGHT 8192 + +#define DISPLAY_CONTROL_MIN_PHYSICAL_MONITOR_WIDTH 10 +#define DISPLAY_CONTROL_MAX_PHYSICAL_MONITOR_WIDTH 10000 + +#define DISPLAY_CONTROL_MIN_PHYSICAL_MONITOR_HEIGHT 10 +#define DISPLAY_CONTROL_MAX_PHYSICAL_MONITOR_HEIGHT 10000 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT32 type; + UINT32 length; + } DISPLAY_CONTROL_HEADER; + + typedef struct + { + UINT32 Flags; + INT32 Left; + INT32 Top; + UINT32 Width; + UINT32 Height; + UINT32 PhysicalWidth; + UINT32 PhysicalHeight; + UINT32 Orientation; + UINT32 DesktopScaleFactor; + UINT32 DeviceScaleFactor; + } DISPLAY_CONTROL_MONITOR_LAYOUT; + + typedef struct + { + UINT32 MonitorLayoutSize; + UINT32 NumMonitors; + DISPLAY_CONTROL_MONITOR_LAYOUT* Monitors; + } DISPLAY_CONTROL_MONITOR_LAYOUT_PDU; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_DISP_H */ diff --git a/include/freerdp/channels/drdynvc.h b/include/freerdp/channels/drdynvc.h new file mode 100644 index 0000000..5afc3b2 --- /dev/null +++ b/include/freerdp/channels/drdynvc.h @@ -0,0 +1,68 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Dynamic Virtual Channel Virtual Channel + * + * Copyright 2021 Armin Novak <anovak@thincast.com> + * Copyright 2021 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_DRDYNVC_H +#define FREERDP_CHANNEL_DRDYNVC_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define DRDYNVC_CHANNEL_NAME "drdynvc" +#define DRDYNVC_SVC_CHANNEL_NAME "drdynvc" + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* defined in MS-RDPEDYC 2.2.5.1 Soft-Sync Request PDU (DYNVC_SOFT_SYNC_REQUEST) */ + enum + { + SOFT_SYNC_TCP_FLUSHED = 0x01, + SOFT_SYNC_CHANNEL_LIST_PRESENT = 0x02 + }; + + /* define in MS-RDPEDYC 2.2.5.1.1 Soft-Sync Channel List (DYNVC_SOFT_SYNC_CHANNEL_LIST) */ + enum + { + TUNNELTYPE_UDPFECR = 0x00000001, + TUNNELTYPE_UDPFECL = 0x00000003 + }; + + /* @brief dynamic channel commands */ + typedef enum + { + CREATE_REQUEST_PDU = 0x01, + DATA_FIRST_PDU = 0x02, + DATA_PDU = 0x03, + CLOSE_REQUEST_PDU = 0x04, + CAPABILITY_REQUEST_PDU = 0x05, + DATA_FIRST_COMPRESSED_PDU = 0x06, + DATA_COMPRESSED_PDU = 0x07, + SOFT_SYNC_REQUEST_PDU = 0x08, + SOFT_SYNC_RESPONSE_PDU = 0x09 + } DynamicChannelPDU; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_DRDYNVC_H */ diff --git a/include/freerdp/channels/echo.h b/include/freerdp/channels/echo.h new file mode 100644 index 0000000..263de65 --- /dev/null +++ b/include/freerdp/channels/echo.h @@ -0,0 +1,38 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Audio Input Redirection Virtual Channel + * + * Copyright 2020 Armin Novak <anovak@thincast.com> + * Copyright 2020 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_ECHO_H +#define FREERDP_CHANNEL_ECHO_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define ECHO_CHANNEL_NAME "echo" +#define ECHO_DVC_CHANNEL_NAME "ECHO" + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_ECHO_H */ diff --git a/include/freerdp/channels/encomsp.h b/include/freerdp/channels/encomsp.h new file mode 100644 index 0000000..7fde773 --- /dev/null +++ b/include/freerdp/channels/encomsp.h @@ -0,0 +1,182 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Multiparty Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_ENCOMSP_H +#define FREERDP_CHANNEL_ENCOMSP_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define ENCOMSP_CHANNEL_NAME "encomsp" +#define ENCOMSP_SVC_CHANNEL_NAME "encomsp" + +typedef struct +{ + UINT16 cchString; + WCHAR wString[1024]; +} ENCOMSP_UNICODE_STRING; + +/* Filter Updated PDU Flags */ + +#define ENCOMSP_FILTER_ENABLED 0x0001 + +/* Application Created PDU Flags */ + +#define ENCOMSP_APPLICATION_SHARED 0x0001 + +/* Window Created PDU Flags */ + +#define ENCOMSP_WINDOW_SHARED 0x0001 + +/* Participant Created PDU Flags */ + +#define ENCOMSP_MAY_VIEW 0x0001 +#define ENCOMSP_MAY_INTERACT 0x0002 +#define ENCOMSP_IS_PARTICIPANT 0x0004 + +/* Participant Removed PDU Disconnection Types */ + +#define ENCOMSP_PARTICIPANT_DISCONNECTION_REASON_APP 0x00000000 +#define ENCOMSP_PARTICIPANT_DISCONNECTION_REASON_CLI 0x00000002 + +/* Change Participant Control Level PDU Flags */ + +#define ENCOMSP_REQUEST_VIEW 0x0001 +#define ENCOMSP_REQUEST_INTERACT 0x0002 +#define ENCOMSP_ALLOW_CONTROL_REQUESTS 0x0008 + +/* PDU Order Types */ + +#define ODTYPE_FILTER_STATE_UPDATED 0x0001 +#define ODTYPE_APP_REMOVED 0x0002 +#define ODTYPE_APP_CREATED 0x0003 +#define ODTYPE_WND_REMOVED 0x0004 +#define ODTYPE_WND_CREATED 0x0005 +#define ODTYPE_WND_SHOW 0x0006 +#define ODTYPE_PARTICIPANT_REMOVED 0x0007 +#define ODTYPE_PARTICIPANT_CREATED 0x0008 +#define ODTYPE_PARTICIPANT_CTRL_CHANGED 0x0009 +#define ODTYPE_GRAPHICS_STREAM_PAUSED 0x000A +#define ODTYPE_GRAPHICS_STREAM_RESUMED 0x000B + +#define DEFINE_ENCOMSP_HEADER_COMMON() \ + UINT16 Type; \ + UINT16 Length + +#define ENCOMSP_ORDER_HEADER_SIZE 4 + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); +} ENCOMSP_ORDER_HEADER; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); + + BYTE Flags; +} ENCOMSP_FILTER_UPDATED_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); + + UINT16 Flags; + UINT32 AppId; + ENCOMSP_UNICODE_STRING Name; +} ENCOMSP_APPLICATION_CREATED_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); + + UINT32 AppId; +} ENCOMSP_APPLICATION_REMOVED_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); + + UINT16 Flags; + UINT32 AppId; + UINT32 WndId; + ENCOMSP_UNICODE_STRING Name; +} ENCOMSP_WINDOW_CREATED_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); + + UINT32 WndId; +} ENCOMSP_WINDOW_REMOVED_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); + + UINT32 WndId; +} ENCOMSP_SHOW_WINDOW_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); + + UINT32 ParticipantId; + UINT32 GroupId; + UINT16 Flags; + ENCOMSP_UNICODE_STRING FriendlyName; +} ENCOMSP_PARTICIPANT_CREATED_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); + + UINT32 ParticipantId; + UINT32 DiscType; + UINT32 DiscCode; +} ENCOMSP_PARTICIPANT_REMOVED_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); + + UINT16 Flags; + UINT32 ParticipantId; +} ENCOMSP_CHANGE_PARTICIPANT_CONTROL_LEVEL_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); +} ENCOMSP_GRAPHICS_STREAM_PAUSED_PDU; + +typedef struct +{ + DEFINE_ENCOMSP_HEADER_COMMON(); +} ENCOMSP_GRAPHICS_STREAM_RESUMED_PDU; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_ENCOMSP_H */ diff --git a/include/freerdp/channels/geometry.h b/include/freerdp/channels/geometry.h new file mode 100644 index 0000000..1b00f0f --- /dev/null +++ b/include/freerdp/channels/geometry.h @@ -0,0 +1,69 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Geometry tracking Virtual Channel Extension + * + * Copyright 2017 David Fort <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_GEOMETRY_H +#define FREERDP_CHANNEL_GEOMETRY_H + +#include <winpr/wtypes.h> +#include <freerdp/types.h> + +#define GEOMETRY_CHANNEL_NAME "geometry" +#define GEOMETRY_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Geometry::v08.01" + +#ifdef __cplusplus +extern "C" +{ +#endif + + enum + { + GEOMETRY_UPDATE = 1, + GEOMETRY_CLEAR = 2 + }; + + enum + { + RDH_RECTANGLE = 1 + }; + + typedef struct + { + RDP_RECT boundingRect; + UINT32 nRectCount; + RDP_RECT* rects; + } FREERDP_RGNDATA; + + typedef struct + { + UINT32 version; + UINT64 mappingId; + UINT32 updateType; + UINT64 topLevelId; + INT32 left, top, right, bottom; + INT32 topLevelLeft, topLevelTop, topLevelRight, topLevelBottom; + UINT32 geometryType; + + FREERDP_RGNDATA geometry; + } MAPPED_GEOMETRY_PACKET; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_GEOMETRY_H */ diff --git a/include/freerdp/channels/gfxredir.h b/include/freerdp/channels/gfxredir.h new file mode 100644 index 0000000..b21bcc8 --- /dev/null +++ b/include/freerdp/channels/gfxredir.h @@ -0,0 +1,165 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDPXXXX Remote App Graphics Redirection Virtual Channel Extension + * + * Copyright 2020 Hideyuki Nagase <hideyukn@microsoft.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_GFXREDIR_H +#define FREERDP_CHANNEL_GFXREDIR_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define GFXREDIR_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::RemoteAppGraphicsRedirection" + +/* GFXREDIR_LEGACY_CAPS_PDU.version */ +#define GFXREDIR_CHANNEL_VERSION_LEGACY 1 + +#define GFXREDIR_CHANNEL_VERSION_MAJOR 2 +#define GFXREDIR_CHANNEL_VERSION_MINOR 0 + +/* GFXREDIR_CAPS_VERSION1 */ +#define GFXREDIR_CMDID_LEGACY_CAPS 0x00000001 +#define GFXREDIR_CMDID_ERROR 0x00000006 +#define GFXREDIR_CMDID_CAPS_ADVERTISE 0x00000008 +#define GFXREDIR_CMDID_CAPS_CONFIRM 0x00000009 +/* GFXREDIR_CAPS_VERSION2_0 */ +#define GFXREDIR_CMDID_OPEN_POOL 0x0000000a +#define GFXREDIR_CMDID_CLOSE_POOL 0x0000000b +#define GFXREDIR_CMDID_CREATE_BUFFER 0x0000000c +#define GFXREDIR_CMDID_DESTROY_BUFFER 0x0000000d +#define GFXREDIR_CMDID_PRESENT_BUFFER 0x0000000e +#define GFXREDIR_CMDID_PRESENT_BUFFER_ACK 0x0000000f + +/* GFXREDIR_HEADER */ +#define GFXREDIR_HEADER_SIZE 8 + +/* GFXREDIR_CAPS_HEADER */ +#define GFXREDIR_CAPS_HEADER_SIZE 12 +/* GFXREDIR_CAPS_HEADER.signature */ +#define GFXREDIR_CAPS_SIGNATURE 0x53504143 /* = 'SPAC' */ +/* GFXREDIR_CAPS_HEADER.version */ +#define GFXREDIR_CAPS_VERSION1 0x1 +#define GFXREDIR_CAPS_VERSION2_0 0x2000 + +/* GFXREDIR_CREATE_BUFFER_PDU.format */ +#define GFXREDIR_BUFFER_PIXEL_FORMAT_XRGB_8888 1 +#define GFXREDIR_BUFFER_PIXEL_FORMAT_ARGB_8888 2 + +/* GFXREDIR_PRESENT_BUFFER_PDU.numOpaqueRects */ +#define GFXREDIR_MAX_OPAQUE_RECTS 0x10 + +typedef struct +{ + UINT32 cmdId; + UINT32 length; +} GFXREDIR_HEADER; + +typedef struct +{ + UINT16 version; // GFXREDIR_CHANNEL_VERSION_LEGACY +} GFXREDIR_LEGACY_CAPS_PDU; + +typedef struct +{ + UINT32 signature; // GFXREDIR_CAPS_SIGNATURE + UINT32 version; // GFXREDIR_CAPS_VERSION + UINT32 length; // GFXREDIR_CAPS_HEADER_SIZE + size of capsData +} GFXREDIR_CAPS_HEADER; + +typedef struct +{ + GFXREDIR_CAPS_HEADER header; + UINT32 supportedFeatures; /* Reserved for future extensions */ +} GFXREDIR_CAPS_V2_0_PDU; + +typedef struct +{ + UINT32 errorCode; +} GFXREDIR_ERROR_PDU; + +typedef struct +{ + UINT32 length; // length of caps; + const BYTE* caps; // points variable length array of GFXREDIR_CAPS_HEADER. +} GFXREDIR_CAPS_ADVERTISE_PDU; + +typedef struct +{ + UINT32 version; // confirmed version, must be one of advertised by client. + UINT32 length; // GFXREDIR_CAPS_HEADER_SIZE + size of capsData. + const BYTE* capsData; // confirmed capsData from selected GFXREDIR_CAPS_HEADER.capsData. +} GFXREDIR_CAPS_CONFIRM_PDU; + +typedef struct +{ + UINT64 poolId; + UINT64 poolSize; + UINT32 sectionNameLength; // number of charactor, must include null terminated char. + const unsigned short* sectionName; // Windows-style 2 bytes wchar_t with null-terminated. +} GFXREDIR_OPEN_POOL_PDU; + +typedef struct +{ + UINT64 poolId; +} GFXREDIR_CLOSE_POOL_PDU; + +typedef struct +{ + UINT64 poolId; + UINT64 bufferId; + UINT64 offset; + UINT32 stride; + UINT32 width; + UINT32 height; + UINT32 format; // GFXREDIR_BUFFER_PIXEL_FORMAT_ +} GFXREDIR_CREATE_BUFFER_PDU; + +typedef struct +{ + UINT64 bufferId; +} GFXREDIR_DESTROY_BUFFER_PDU; + +typedef struct +{ + UINT64 timestamp; + UINT64 presentId; + UINT64 windowId; + UINT64 bufferId; + UINT32 orientation; // 0, 90, 180 or 270. + UINT32 targetWidth; + UINT32 targetHeight; + RECTANGLE_32 dirtyRect; + UINT32 numOpaqueRects; + RECTANGLE_32* opaqueRects; +} GFXREDIR_PRESENT_BUFFER_PDU; + +typedef struct +{ + UINT64 windowId; + UINT64 presentId; +} GFXREDIR_PRESENT_BUFFER_ACK_PDU; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_GFXREDIR_H */ diff --git a/include/freerdp/channels/location.h b/include/freerdp/channels/location.h new file mode 100644 index 0000000..5b91ea4 --- /dev/null +++ b/include/freerdp/channels/location.h @@ -0,0 +1,114 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Location Virtual Channel Extension + * + * Copyright 2023 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_LOCATION_H +#define FREERDP_CHANNEL_LOCATION_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define LOCATION_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Location" + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + PDUTYPE_LOC_RESERVED = 0x0000, + PDUTYPE_SERVER_READY = 0x0001, + PDUTYPE_CLIENT_READY = 0x0002, + PDUTYPE_BASE_LOCATION3D = 0x0003, + PDUTYPE_LOCATION2D_DELTA = 0x0004, + PDUTYPE_LOCATION3D_DELTA = 0x0005, + } LOCATION_PDUTYPE; + +#define LOCATION_HEADER_SIZE 6 + + typedef struct + { + LOCATION_PDUTYPE pduType; + UINT32 pduLength; + } RDPLOCATION_HEADER; + + typedef enum + { + RDPLOCATION_PROTOCOL_VERSION_100 = 0x00010000, + RDPLOCATION_PROTOCOL_VERSION_200 = 0x00020000, + } RDPLOCATION_PROTOCOL_VERSION; + + typedef struct + { + RDPLOCATION_HEADER header; + RDPLOCATION_PROTOCOL_VERSION protocolVersion; + UINT32 flags; + } RDPLOCATION_SERVER_READY_PDU; + + typedef struct + { + RDPLOCATION_HEADER header; + RDPLOCATION_PROTOCOL_VERSION protocolVersion; + UINT32 flags; + } RDPLOCATION_CLIENT_READY_PDU; + + typedef enum + { + LOCATIONSOURCE_IP = 0x00, + LOCATIONSOURCE_WIFI = 0x01, + LOCATIONSOURCE_CELL = 0x02, + LOCATIONSOURCE_GNSS = 0x03, + } LOCATIONSOURCE; + + typedef struct + { + RDPLOCATION_HEADER header; + double latitude; + double longitude; + INT32 altitude; + double* speed; + double* heading; + double* horizontalAccuracy; + LOCATIONSOURCE* source; + } RDPLOCATION_BASE_LOCATION3D_PDU; + + typedef struct + { + RDPLOCATION_HEADER header; + double latitudeDelta; + double longitudeDelta; + double* speedDelta; + double* headingDelta; + } RDPLOCATION_LOCATION2D_DELTA_PDU; + + typedef struct + { + RDPLOCATION_HEADER header; + double latitudeDelta; + double longitudeDelta; + INT32 altitudeDelta; + double* speedDelta; + double* headingDelta; + } RDPLOCATION_LOCATION3D_DELTA_PDU; + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_LOCATION_H */ diff --git a/include/freerdp/channels/log.h b/include/freerdp/channels/log.h new file mode 100644 index 0000000..36934e6 --- /dev/null +++ b/include/freerdp/channels/log.h @@ -0,0 +1,35 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Channel log defines + * + * Copyright 2014 Armin Novak <armin.novak@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNELS_LOG_H +#define FREERDP_CHANNELS_LOG_H + +#include <winpr/wlog.h> +#include <freerdp/log.h> + +#define CHANNELS_TAG(tag) FREERDP_TAG("channels.") tag + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_UTILS_DEBUG_H */ diff --git a/include/freerdp/channels/rail.h b/include/freerdp/channels/rail.h new file mode 100644 index 0000000..b8d6b46 --- /dev/null +++ b/include/freerdp/channels/rail.h @@ -0,0 +1,26 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Applications Integrated Locally (RAIL) + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RAIL_H +#define FREERDP_CHANNEL_RAIL_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#endif /* FREERDP_CHANNEL_RAIL_H */ diff --git a/include/freerdp/channels/rdp2tcp.h b/include/freerdp/channels/rdp2tcp.h new file mode 100644 index 0000000..24375e5 --- /dev/null +++ b/include/freerdp/channels/rdp2tcp.h @@ -0,0 +1,38 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * TCP redirection Virtual Channel + * + * Copyright 2021 Armin Novak <anovak@thincast.com> + * Copyright 2021 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDP2TCP_H +#define FREERDP_CHANNEL_RDP2TCP_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define RDP2TCP_DVC_CHANNEL_NAME "rdp2tcp" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_RDP2TCP_H */ diff --git a/include/freerdp/channels/rdpdr.h b/include/freerdp/channels/rdpdr.h new file mode 100644 index 0000000..6315ab7 --- /dev/null +++ b/include/freerdp/channels/rdpdr.h @@ -0,0 +1,392 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Device Redirection Virtual Channel + * + * Copyright 2010-2011 Vic Lee + * Copyright 2010-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPDR_H +#define FREERDP_CHANNEL_RDPDR_H + +#include <winpr/nt.h> +#include <winpr/io.h> +#include <winpr/crt.h> +#include <winpr/file.h> +#include <winpr/synch.h> +#include <winpr/thread.h> +#include <winpr/stream.h> +#include <winpr/interlocked.h> +#include <winpr/collections.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define RDPDR_CHANNEL_NAME "rdpdr" +#define RDPDR_SVC_CHANNEL_NAME "rdpdr" + +#define RDPDR_DEVICE_IO_REQUEST_LENGTH 24 +#define RDPDR_DEVICE_IO_RESPONSE_LENGTH 16 + +#define RDPDR_DEVICE_IO_CONTROL_REQ_HDR_LENGTH 32 +#define RDPDR_DEVICE_IO_CONTROL_RSP_HDR_LENGTH 4 + +#define RDPDR_VERSION_MAJOR 0x0001 + +#define RDPDR_VERSION_MINOR_RDP50 0x0002 +#define RDPDR_VERSION_MINOR_RDP51 0x0005 +#define RDPDR_VERSION_MINOR_RDP52 0x000A +#define RDPDR_VERSION_MINOR_RDP6X 0x000C +#define RDPDR_VERSION_MINOR_RDP10X 0x000D + +/* RDPDR_HEADER.Component */ +enum RDPDR_CTYP +{ + RDPDR_CTYP_CORE = 0x4472, + RDPDR_CTYP_PRN = 0x5052 +}; + +/* RDPDR_HEADER.PacketId */ +enum RDPDR_PAKID +{ + PAKID_CORE_SERVER_ANNOUNCE = 0x496E, + PAKID_CORE_CLIENTID_CONFIRM = 0x4343, + PAKID_CORE_CLIENT_NAME = 0x434E, + PAKID_CORE_DEVICELIST_ANNOUNCE = 0x4441, + PAKID_CORE_DEVICE_REPLY = 0x6472, + PAKID_CORE_DEVICE_IOREQUEST = 0x4952, + PAKID_CORE_DEVICE_IOCOMPLETION = 0x4943, + PAKID_CORE_SERVER_CAPABILITY = 0x5350, + PAKID_CORE_CLIENT_CAPABILITY = 0x4350, + PAKID_CORE_DEVICELIST_REMOVE = 0x444D, + PAKID_CORE_USER_LOGGEDON = 0x554C, + PAKID_PRN_CACHE_DATA = 0x5043, + PAKID_PRN_USING_XPS = 0x5543 +}; + +/* CAPABILITY_HEADER.CapabilityType */ +enum RDPDR_CAP_TYPE +{ + CAP_GENERAL_TYPE = 0x0001, + CAP_PRINTER_TYPE = 0x0002, + CAP_PORT_TYPE = 0x0003, + CAP_DRIVE_TYPE = 0x0004, + CAP_SMARTCARD_TYPE = 0x0005 +}; + +/* CAPABILITY_HEADER.Version */ +enum RDPDR_CAP_VERSION +{ + GENERAL_CAPABILITY_VERSION_01 = 0x00000001, + GENERAL_CAPABILITY_VERSION_02 = 0x00000002, + PRINT_CAPABILITY_VERSION_01 = 0x00000001, + PORT_CAPABILITY_VERSION_01 = 0x00000001, + DRIVE_CAPABILITY_VERSION_01 = 0x00000001, + DRIVE_CAPABILITY_VERSION_02 = 0x00000002, + SMARTCARD_CAPABILITY_VERSION_01 = 0x00000001 +}; + +/* DR_DEVICE_IOREQUEST.MajorFunction */ +enum IRP_MJ +{ + IRP_MJ_CREATE = 0x00000000, + IRP_MJ_CLOSE = 0x00000002, + IRP_MJ_READ = 0x00000003, + IRP_MJ_WRITE = 0x00000004, + IRP_MJ_DEVICE_CONTROL = 0x0000000E, + IRP_MJ_QUERY_VOLUME_INFORMATION = 0x0000000A, + IRP_MJ_SET_VOLUME_INFORMATION = 0x0000000B, + IRP_MJ_QUERY_INFORMATION = 0x00000005, + IRP_MJ_SET_INFORMATION = 0x00000006, + IRP_MJ_DIRECTORY_CONTROL = 0x0000000C, + IRP_MJ_LOCK_CONTROL = 0x00000011 +}; + +/* DR_DEVICE_IOREQUEST.MinorFunction */ +enum IRP_MN +{ + IRP_MN_QUERY_DIRECTORY = 0x00000001, + IRP_MN_NOTIFY_CHANGE_DIRECTORY = 0x00000002 +}; + +/* DR_CREATE_REQ.CreateDisposition */ + +/* DR_CREATE_REQ.CreateOptions [MS-SMB2] */ + +/* DR_CREATE_REQ.DesiredAccess [MS-SMB2] */ + +/* DR_CREATE_RSP.Information */ +/* DR_DRIVE_CREATE_RSP.DeviceCreateResponse */ + + +/* DR_CORE_CLIENT_ANNOUNCE_RSP.VersionMinor */ +#define RDPDR_MAJOR_RDP_VERSION 1 +enum RDPDR_MINOR_RDP_VERSION +{ + RDPDR_MINOR_RDP_VERSION_5_0 = 0x0002, + RDPDR_MINOR_RDP_VERSION_5_1 = 0x0005, + RDPDR_MINOR_RDP_VERSION_5_2 = 0x000A, + RDPDR_MINOR_RDP_VERSION_6_X = 0x000C, + RDPDR_MINOR_RDP_VERSION_13 = 0x000D +}; + +/* DR_CORE_CLIENT_NAME_REQ.UnicodeFlag */ +enum RDPDR_CLIENT_NAME_FLAG +{ + RDPDR_CLIENT_NAME_UNICODE = 0x00000001, + RDPDR_CLIENT_NAME_ASCII = 0x00000000 +}; + +/* GENERAL_CAPS_SET.ioCode1 */ +enum RDPDR_CAPS_IRP_MJ +{ + RDPDR_IRP_MJ_CREATE = 0x00000001, + RDPDR_IRP_MJ_CLEANUP = 0x00000002, + RDPDR_IRP_MJ_CLOSE = 0x00000004, + RDPDR_IRP_MJ_READ = 0x00000008, + RDPDR_IRP_MJ_WRITE = 0x00000010, + RDPDR_IRP_MJ_FLUSH_BUFFERS = 0x00000020, + RDPDR_IRP_MJ_SHUTDOWN = 0x00000040, + RDPDR_IRP_MJ_DEVICE_CONTROL = 0x00000080, + RDPDR_IRP_MJ_QUERY_VOLUME_INFORMATION = 0x00000100, + RDPDR_IRP_MJ_SET_VOLUME_INFORMATION = 0x00000200, + RDPDR_IRP_MJ_QUERY_INFORMATION = 0x00000400, + RDPDR_IRP_MJ_SET_INFORMATION = 0x00000800, + RDPDR_IRP_MJ_DIRECTORY_CONTROL = 0x00001000, + RDPDR_IRP_MJ_LOCK_CONTROL = 0x00002000, + RDPDR_IRP_MJ_QUERY_SECURITY = 0x00004000, + RDPDR_IRP_MJ_SET_SECURITY = 0x00008000 +}; + +/* GENERAL_CAPS_SET.extendedPDU */ +enum RDPDR_CAPS_PDU +{ + RDPDR_DEVICE_REMOVE_PDUS = 0x00000001, + RDPDR_CLIENT_DISPLAY_NAME_PDU = 0x00000002, + RDPDR_USER_LOGGEDON_PDU = 0x00000004 +}; + +/* GENERAL_CAPS_SET.extraFlags1 */ +enum RDPDR_CAPS_FLAG +{ + ENABLE_ASYNCIO = 0x00000001 +}; + +/* DR_DRIVE_LOCK_REQ.Operation */ +enum RDP_LOWIO_OP +{ + RDP_LOWIO_OP_SHAREDLOCK = 0x00000002, + RDP_LOWIO_OP_EXCLUSIVELOCK = 0x00000003, + RDP_LOWIO_OP_UNLOCK = 0x00000004, + RDP_LOWIO_OP_UNLOCK_MULTIPLE = 0x00000005 +}; + +enum RDPDR_PRINTER_ANNOUNCE_FLAG +{ + RDPDR_PRINTER_ANNOUNCE_FLAG_ASCII = 0x00000001, + RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER = 0x00000002, + RDPDR_PRINTER_ANNOUNCE_FLAG_NETWORKPRINTER = 0x00000004, + RDPDR_PRINTER_ANNOUNCE_FLAG_TSPRINTER = 0x00000008, + RDPDR_PRINTER_ANNOUNCE_FLAG_XPSFORMAT = 0x00000010 +}; + +/* [MS-FSCC] FileAttributes */ + +/* Included with winpr/file.h */ + +/* [MS-FSCC] FSCTL Structures */ + +#if !defined(_WIN32) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) +#define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION 0x1400ec +#define FSCTL_PIPE_PEEK 0x11400c +#define FSCTL_PIPE_TRANSCEIVE 0x11c017 +#define FSCTL_PIPE_WAIT 0x110018 +#define FSCTL_QUERY_ON_DISK_VOLUME_INFO 0x9013c +#define FSCTL_QUERY_SPARING_INFO 0x90138 +#endif + +#ifndef _WIN32 +#define FSCTL_CREATE_OR_GET_OBJECT_ID 0x900c0 +#define FSCTL_GET_REPARSE_POINT 0x900a8 +#define FSCTL_GET_RETRIEVAL_POINTERS 0x90073 +#define FSCTL_IS_PATHNAME_VALID 0x9002c +#define FSCTL_READ_FILE_USN_DATA 0x900eb +#define FSCTL_RECALL_FILE 0x90117 +#define FSCTL_QUERY_FAT_BPB 0x90058 +#define FSCTL_QUERY_ALLOCATED_RANGES 0x940cf +#define FSCTL_SET_COMPRESSION 0x9c040 +#define FSCTL_SET_ENCRYPTION 0x900D7 +#define FSCTL_SET_OBJECT_ID 0x90098 +#define FSCTL_SET_OBJECT_ID_EXTENDED 0x900bc +#define FSCTL_SET_REPARSE_POINT 0x900a4 +#define FSCTL_SET_SPARSE 0x900c4 +#define FSCTL_SET_ZERO_DATA 0x980c8 +#define FSCTL_SIS_COPYFILE 0x90100 +#define FSCTL_WRITE_USN_CLOSE_RECORD 0x900ef +#endif + +#if !defined(_WIN32) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) +#define FSCTL_SET_DEFECT_MANAGEMENT 0x98134 +#define FSCTL_SET_ZERO_ON_DEALLOCATION 0x90194 +#endif + +/* [MS-FSCC] FileFsAttributeInformation.FileSystemAttributes */ + +#ifndef _WIN32 + +#define FILE_SUPPORTS_USN_JOURNAL 0x02000000 +#define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000 +#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000 +#define FILE_SUPPORTS_HARD_LINKS 0x00400000 +#define FILE_SUPPORTS_TRANSACTIONS 0x00200000 +#define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000 +#define FILE_READ_ONLY_VOLUME 0x00080000 +#define FILE_NAMED_STREAMS 0x00040000 +#define FILE_SUPPORTS_ENCRYPTION 0x00020000 +#define FILE_SUPPORTS_OBJECT_IDS 0x00010000 +#define FILE_VOLUME_IS_COMPRESSED 0x00008000 +#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100 +#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080 +#define FILE_SUPPORTS_SPARSE_FILES 0x00000040 +#define FILE_VOLUME_QUOTAS 0x00000020 +#define FILE_FILE_COMPRESSION 0x00000010 +#define FILE_PERSISTENT_ACLS 0x00000008 +#define FILE_UNICODE_ON_DISK 0x00000004 +#define FILE_CASE_PRESERVED_NAMES 0x00000002 +#define FILE_CASE_SENSITIVE_SEARCH 0x00000001 + +#endif + +/* [MS-FSCC] FileFsDeviceInformation.DeviceType */ + +#ifndef FILE_DEVICE_CD_ROM +#define FILE_DEVICE_CD_ROM 0x00000002 +#endif + +#ifndef FILE_DEVICE_DISK +#define FILE_DEVICE_DISK 0x00000007 +#endif + +/* [MS-FSCC] FileFsDeviceInformation.Characteristics */ +enum FILE_FS_DEVICE_FLAG +{ + FILE_REMOVABLE_MEDIA = 0x00000001, + FILE_READ_ONLY_DEVICE = 0x00000002, + FILE_FLOPPY_DISKETTE = 0x00000004, + FILE_WRITE_ONCE_MEDIA = 0x00000008, + FILE_REMOTE_DEVICE = 0x00000010, + FILE_DEVICE_IS_MOUNTED = 0x00000020, + FILE_VIRTUAL_VOLUME = 0x00000040, + FILE_DEVICE_SECURE_OPEN = 0x00000100 +}; + +#ifndef __MINGW32__ +enum FILE_FS_INFORMATION_CLASS +{ + FileFsVolumeInformation = 1, + FileFsLabelInformation, + FileFsSizeInformation, + FileFsDeviceInformation, + FileFsAttributeInformation, + FileFsControlInformation, + FileFsFullSizeInformation, + FileFsObjectIdInformation, + FileFsDriverPathInformation, + FileFsMaximumInformation +}; +#endif + +typedef struct S_DEVICE DEVICE; +typedef struct S_IRP IRP; +typedef struct S_DEVMAN DEVMAN; + +typedef UINT (*pcCustomComponentRequest)(DEVICE* device, UINT16 component, UINT16 packetId, + wStream* s); +typedef UINT (*pcIRPRequest)(DEVICE* device, IRP* irp); +typedef UINT (*pcInitDevice)(DEVICE* device); +typedef UINT (*pcFreeDevice)(DEVICE* device); + +struct S_DEVICE +{ + UINT32 id; + + UINT32 type; + const char* name; + wStream* data; + + pcCustomComponentRequest CustomComponentRequest; + pcIRPRequest IRPRequest; + pcInitDevice Init; + pcFreeDevice Free; +}; + +typedef UINT (*pcIRPResponse)(IRP* irp); + +struct S_IRP +{ + WINPR_SLIST_ENTRY ItemEntry; + + DEVICE* device; + DEVMAN* devman; + UINT32 FileId; + UINT32 CompletionId; + UINT32 MajorFunction; + UINT32 MinorFunction; + wStream* input; + + UINT32 IoStatus; + wStream* output; + + pcIRPResponse Complete; + pcIRPResponse Discard; + + HANDLE thread; + BOOL cancelled; +}; + +struct S_DEVMAN +{ + void* plugin; + UINT32 id_sequence; + wListDictionary* devices; +}; + +typedef UINT (*pcRegisterDevice)(DEVMAN* devman, DEVICE* device); + +typedef struct +{ + DEVMAN* devman; + + pcRegisterDevice RegisterDevice; + RDPDR_DEVICE* device; + rdpContext* rdpcontext; +} DEVICE_SERVICE_ENTRY_POINTS; +typedef DEVICE_SERVICE_ENTRY_POINTS* PDEVICE_SERVICE_ENTRY_POINTS; + +typedef UINT (*PDEVICE_SERVICE_ENTRY)(PDEVICE_SERVICE_ENTRY_POINTS); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RDPDR_H */ diff --git a/include/freerdp/channels/rdpecam.h b/include/freerdp/channels/rdpecam.h new file mode 100644 index 0000000..2e41efc --- /dev/null +++ b/include/freerdp/channels/rdpecam.h @@ -0,0 +1,345 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Video Capture Virtual Channel Extension + * + * Copyright 2022 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPECAM_H +#define FREERDP_CHANNEL_RDPECAM_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define RDPECAM_CHANNEL_NAME "rdpecam" +#define RDPECAM_DVC_CHANNEL_NAME "rdpecam" +#define RDPECAM_CONTROL_DVC_CHANNEL_NAME "RDCamera_Device_Enumerator" + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + CAM_MSG_ID_SuccessResponse = 0x01, + CAM_MSG_ID_ErrorResponse = 0x02, + CAM_MSG_ID_SelectVersionRequest = 0x03, + CAM_MSG_ID_SelectVersionResponse = 0x04, + CAM_MSG_ID_DeviceAddedNotification = 0x05, + CAM_MSG_ID_DeviceRemovedNotification = 0x06, + CAM_MSG_ID_ActivateDeviceRequest = 0x07, + CAM_MSG_ID_DeactivateDeviceRequest = 0x08, + CAM_MSG_ID_StreamListRequest = 0x09, + CAM_MSG_ID_StreamListResponse = 0x0A, + CAM_MSG_ID_MediaTypeListRequest = 0x0B, + CAM_MSG_ID_MediaTypeListResponse = 0x0C, + CAM_MSG_ID_CurrentMediaTypeRequest = 0x0D, + CAM_MSG_ID_CurrentMediaTypeResponse = 0x0E, + CAM_MSG_ID_StartStreamsRequest = 0x0F, + CAM_MSG_ID_StopStreamsRequest = 0x10, + CAM_MSG_ID_SampleRequest = 0x11, + CAM_MSG_ID_SampleResponse = 0x12, + CAM_MSG_ID_SampleErrorResponse = 0x13, + CAM_MSG_ID_PropertyListRequest = 0x14, + CAM_MSG_ID_PropertyListResponse = 0x15, + CAM_MSG_ID_PropertyValueRequest = 0x16, + CAM_MSG_ID_PropertyValueResponse = 0x17, + CAM_MSG_ID_SetPropertyValueRequest = 0x18, + } CAM_MSG_ID; + +#define CAM_HEADER_SIZE 2 + +typedef struct +{ + BYTE Version; + CAM_MSG_ID MessageId; +} CAM_SHARED_MSG_HEADER; + +/* Messages Exchanged on the Device Enumeration Channel (2.2.2) */ + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; +} CAM_SELECT_VERSION_REQUEST; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; +} CAM_SELECT_VERSION_RESPONSE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + WCHAR* DeviceName; + char* VirtualChannelName; +} CAM_DEVICE_ADDED_NOTIFICATION; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + char* VirtualChannelName; +} CAM_DEVICE_REMOVED_NOTIFICATION; + +/* Messages Exchanged on Device Channels (2.2.3) */ + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; +} CAM_SUCCESS_RESPONSE; + +typedef enum +{ + CAM_ERROR_CODE_UnexpectedError = 0x00000001, + CAM_ERROR_CODE_InvalidMessage = 0x00000002, + CAM_ERROR_CODE_NotInitialized = 0x00000003, + CAM_ERROR_CODE_InvalidRequest = 0x00000004, + CAM_ERROR_CODE_InvalidStreamNumber = 0x00000005, + CAM_ERROR_CODE_InvalidMediaType = 0x00000006, + CAM_ERROR_CODE_OutOfMemory = 0x00000007, + CAM_ERROR_CODE_ItemNotFound = 0x00000008, + CAM_ERROR_CODE_SetNotFound = 0x00000009, + CAM_ERROR_CODE_OperationNotSupported = 0x0000000A, +} CAM_ERROR_CODE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + CAM_ERROR_CODE ErrorCode; +} CAM_ERROR_RESPONSE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; +} CAM_ACTIVATE_DEVICE_REQUEST; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; +} CAM_DEACTIVATE_DEVICE_REQUEST; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; +} CAM_STREAM_LIST_REQUEST; + +typedef enum +{ + CAM_STREAM_FRAME_SOURCE_TYPE_Color = 0x0001, + CAM_STREAM_FRAME_SOURCE_TYPE_Infrared = 0x0002, + CAM_STREAM_FRAME_SOURCE_TYPE_Custom = 0x0008, +} CAM_STREAM_FRAME_SOURCE_TYPES; + +typedef enum +{ + CAM_STREAM_CATEGORY_Capture = 0x01, +} CAM_STREAM_CATEGORY; + +typedef struct +{ + CAM_STREAM_FRAME_SOURCE_TYPES FrameSourceTypes; + CAM_STREAM_CATEGORY StreamCategory; + BYTE Selected; + BYTE CanBeShared; +} CAM_STREAM_DESCRIPTION; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + BYTE N_Descriptions; + CAM_STREAM_DESCRIPTION StreamDescriptions[255]; +} CAM_STREAM_LIST_RESPONSE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + BYTE StreamIndex; +} CAM_MEDIA_TYPE_LIST_REQUEST; + +typedef enum +{ + CAM_MEDIA_FORMAT_H264 = 0x01, + CAM_MEDIA_FORMAT_MJPG = 0x02, + CAM_MEDIA_FORMAT_YUY2 = 0x03, + CAM_MEDIA_FORMAT_NV12 = 0x04, + CAM_MEDIA_FORMAT_I420 = 0x05, + CAM_MEDIA_FORMAT_RGB24 = 0x06, + CAM_MEDIA_FORMAT_RGB32 = 0x07, +} CAM_MEDIA_FORMAT; + +typedef enum +{ + CAM_MEDIA_TYPE_DESCRIPTION_FLAG_DecodingRequired = 0x01, + CAM_MEDIA_TYPE_DESCRIPTION_FLAG_BottomUpImage = 0x02, +} CAM_MEDIA_TYPE_DESCRIPTION_FLAGS; + +typedef struct +{ + CAM_MEDIA_FORMAT Format; + UINT32 Width; + UINT32 Height; + UINT32 FrameRateNumerator; + UINT32 FrameRateDenominator; + UINT32 PixelAspectRatioNumerator; + UINT32 PixelAspectRatioDenominator; + CAM_MEDIA_TYPE_DESCRIPTION_FLAGS Flags; +} CAM_MEDIA_TYPE_DESCRIPTION; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + size_t N_Descriptions; + CAM_MEDIA_TYPE_DESCRIPTION* MediaTypeDescriptions; +} CAM_MEDIA_TYPE_LIST_RESPONSE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + BYTE StreamIndex; +} CAM_CURRENT_MEDIA_TYPE_REQUEST; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + CAM_MEDIA_TYPE_DESCRIPTION MediaTypeDescription; +} CAM_CURRENT_MEDIA_TYPE_RESPONSE; + +typedef struct +{ + BYTE StreamIndex; + CAM_MEDIA_TYPE_DESCRIPTION MediaTypeDescription; +} CAM_START_STREAM_INFO; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + BYTE N_Infos; + CAM_START_STREAM_INFO StartStreamsInfo[255]; +} CAM_START_STREAMS_REQUEST; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; +} CAM_STOP_STREAMS_REQUEST; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + BYTE StreamIndex; +} CAM_SAMPLE_REQUEST; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + BYTE StreamIndex; + size_t SampleSize; + BYTE* Sample; +} CAM_SAMPLE_RESPONSE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + BYTE StreamIndex; + CAM_ERROR_CODE ErrorCode; +} CAM_SAMPLE_ERROR_RESPONSE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; +} CAM_PROPERTY_LIST_REQUEST; + +typedef enum +{ + CAM_PROPERTY_SET_CameraControl = 0x01, + CAM_PROPERTY_SET_VideoProcAmp = 0x02, +} CAM_PROPERTY_SET; + +/* CameraControl properties */ +#define CAM_PROPERTY_ID_CAMERA_CONTROL_Exposure 0x01 +#define CAM_PROPERTY_ID_CAMERA_CONTROL_Focus 0x02 +#define CAM_PROPERTY_ID_CAMERA_CONTROL_Pan 0x03 +#define CAM_PROPERTY_ID_CAMERA_CONTROL_Roll 0x04 +#define CAM_PROPERTY_ID_CAMERA_CONTROL_Tilt 0x05 +#define CAM_PROPERTY_ID_CAMERA_CONTROL_Zoom 0x06 + +/* VideoProcAmp properties */ +#define CAM_PROPERTY_ID_VIDEO_PROC_AMP_BacklightCompensation 0x01 +#define CAM_PROPERTY_ID_VIDEO_PROC_AMP_Brightness 0x02 +#define CAM_PROPERTY_ID_VIDEO_PROC_AMP_Contrast 0x03 +#define CAM_PROPERTY_ID_VIDEO_PROC_AMP_Hue 0x04 +#define CAM_PROPERTY_ID_VIDEO_PROC_AMP_WhiteBalance 0x05 + +typedef enum +{ + CAM_PROPERTY_CAPABILITY_Manual = 0x01, + CAM_PROPERTY_CAPABILITY_Auto = 0x02, +} CAM_PROPERTY_CAPABILITIES; + +typedef struct +{ + CAM_PROPERTY_SET PropertySet; + BYTE PropertyId; + CAM_PROPERTY_CAPABILITIES Capabilities; + INT32 MinValue; + INT32 MaxValue; + INT32 Step; + INT32 DefaultValue; +} CAM_PROPERTY_DESCRIPTION; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + size_t N_Properties; + CAM_PROPERTY_DESCRIPTION* Properties; +} CAM_PROPERTY_LIST_RESPONSE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + CAM_PROPERTY_SET PropertySet; + BYTE PropertyId; +} CAM_PROPERTY_VALUE_REQUEST; + +typedef enum +{ + CAM_PROPERTY_MODE_Manual = 0x01, + CAM_PROPERTY_MODE_Auto = 0x02, +} CAM_PROPERTY_MODE; + +typedef struct +{ + CAM_PROPERTY_MODE Mode; + INT32 Value; +} CAM_PROPERTY_VALUE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + CAM_PROPERTY_VALUE PropertyValue; +} CAM_PROPERTY_VALUE_RESPONSE; + +typedef struct +{ + CAM_SHARED_MSG_HEADER Header; + CAM_PROPERTY_SET PropertySet; + BYTE PropertyId; + CAM_PROPERTY_VALUE PropertyValue; +} CAM_SET_PROPERTY_VALUE_REQUEST; + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_RDPECAM_H */ diff --git a/include/freerdp/channels/rdpei.h b/include/freerdp/channels/rdpei.h new file mode 100644 index 0000000..1c4fca5 --- /dev/null +++ b/include/freerdp/channels/rdpei.h @@ -0,0 +1,166 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Extended Input channel common definitions + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2014 Thincast Technologies Gmbh. + * Copyright 2014 David FORT <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPEI_H +#define FREERDP_CHANNEL_RDPEI_H + +#include <winpr/wtypes.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define RDPINPUT_HEADER_LENGTH 6 + +#define RDPEI_CHANNEL_NAME "rdpei" +#define RDPEI_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Input" + +/** @brief protocol version */ +enum +{ + RDPINPUT_PROTOCOL_V10 = 0x00010000, + RDPINPUT_PROTOCOL_V101 = 0x00010001, + RDPINPUT_PROTOCOL_V200 = 0x00020000, + RDPINPUT_PROTOCOL_V300 = 0x00030000 +}; + +/* Server feature flags */ +#define SC_READY_MULTIPEN_INJECTION_SUPPORTED 0x0001 + +/* Client Ready Flags */ +#define CS_READY_FLAGS_SHOW_TOUCH_VISUALS 0x00000001 +#define CS_READY_FLAGS_DISABLE_TIMESTAMP_INJECTION 0x00000002 +#define CS_READY_FLAGS_ENABLE_MULTIPEN_INJECTION 0x00000004 + +/* 2.2.3.3.1.1 RDPINPUT_TOUCH_CONTACT */ +#define CONTACT_DATA_CONTACTRECT_PRESENT 0x0001 +#define CONTACT_DATA_ORIENTATION_PRESENT 0x0002 +#define CONTACT_DATA_PRESSURE_PRESENT 0x0004 + +typedef enum +{ + RDPINPUT_PEN_CONTACT_PENFLAGS_PRESENT = 0x0001, + RDPINPUT_PEN_CONTACT_PRESSURE_PRESENT = 0x0002, + RDPINPUT_PEN_CONTACT_ROTATION_PRESENT = 0x0004, + RDPINPUT_PEN_CONTACT_TILTX_PRESENT = 0x0008, + RDPINPUT_PEN_CONTACT_TILTY_PRESENT = 0x0010 +} RDPINPUT_PEN_FIELDS_PRESENT; + +/* + * Valid combinations of RDPINPUT_CONTACT_FLAGS: + * + * See [MS-RDPEI] 2.2.3.3.1.1 RDPINPUT_TOUCH_CONTACT and 3.1.1.1 Touch Contact State Transitions + * + * UP + * UP | CANCELED + * UPDATE + * UPDATE | CANCELED + * DOWN | INRANGE | INCONTACT + * UPDATE | INRANGE | INCONTACT + * UP | INRANGE + * UPDATE | INRANGE + */ +typedef enum +{ + RDPINPUT_CONTACT_FLAG_DOWN = 0x0001, + RDPINPUT_CONTACT_FLAG_UPDATE = 0x0002, + RDPINPUT_CONTACT_FLAG_UP = 0x0004, + RDPINPUT_CONTACT_FLAG_INRANGE = 0x0008, + RDPINPUT_CONTACT_FLAG_INCONTACT = 0x0010, + RDPINPUT_CONTACT_FLAG_CANCELED = 0x0020 +} RDPINPUT_CONTACT_FLAGS; + +typedef enum +{ + RDPINPUT_PEN_FLAG_BARREL_PRESSED = 0x0001, + RDPINPUT_PEN_FLAG_ERASER_PRESSED = 0x0002, + RDPINPUT_PEN_FLAG_INVERTED = 0x0004 +} RDPINPUT_PEN_FLAGS; + +/** @brief a contact point */ +typedef struct +{ + UINT32 contactId; + UINT16 fieldsPresent; /* Mask of CONTACT_DATA_*_PRESENT values */ + INT32 x; + INT32 y; + UINT32 contactFlags; /* See RDPINPUT_CONTACT_FLAG* */ + INT16 contactRectLeft; /* Present if CONTACT_DATA_CONTACTRECT_PRESENT */ + INT16 contactRectTop; /* Present if CONTACT_DATA_CONTACTRECT_PRESENT */ + INT16 contactRectRight; /* Present if CONTACT_DATA_CONTACTRECT_PRESENT */ + INT16 contactRectBottom; /* Present if CONTACT_DATA_CONTACTRECT_PRESENT */ + UINT32 orientation; /* Present if CONTACT_DATA_ORIENTATION_PRESENT, values in degree, [0-359] */ + UINT32 pressure; /* Present if CONTACT_DATA_PRESSURE_PRESENT, normalized value [0-1024] */ +} RDPINPUT_CONTACT_DATA; + +/** @brief a frame containing contact points */ +typedef struct +{ + UINT16 contactCount; + UINT64 frameOffset; + RDPINPUT_CONTACT_DATA* contacts; +} RDPINPUT_TOUCH_FRAME; + +/** @brief a touch event with some frames*/ +typedef struct +{ + UINT32 encodeTime; + UINT16 frameCount; + RDPINPUT_TOUCH_FRAME* frames; +} RDPINPUT_TOUCH_EVENT; + +typedef struct +{ + UINT8 deviceId; + UINT16 fieldsPresent; /* Mask of RDPINPUT_PEN_FIELDS_PRESENT values */ + INT32 x; + INT32 y; + UINT32 contactFlags; /* See RDPINPUT_CONTACT_FLAG* */ + UINT32 penFlags; /* Present if RDPINPUT_PEN_CONTACT_PENFLAGS_PRESENT, values see + RDPINPUT_PEN_FLAGS */ + UINT16 rotation; /* Present if RDPINPUT_PEN_CONTACT_ROTATION_PRESENT, In degree, [0-359] */ + UINT32 + pressure; /* Present if RDPINPUT_PEN_CONTACT_PRESSURE_PRESENT, normalized value [0-1024] */ + INT16 tiltX; /* Present if PEN_CONTACT_TILTX_PRESENT, range [-90, 90] */ + INT16 tiltY; /* Present if PEN_CONTACT_TILTY_PRESENT, range [-90, 90] */ +} RDPINPUT_PEN_CONTACT; + +typedef struct +{ + UINT16 contactCount; + UINT64 frameOffset; + RDPINPUT_PEN_CONTACT* contacts; +} RDPINPUT_PEN_FRAME; + +/** @brief a touch event with some frames*/ +typedef struct +{ + UINT32 encodeTime; + UINT16 frameCount; + RDPINPUT_PEN_FRAME* frames; +} RDPINPUT_PEN_EVENT; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RDPEI_H */ diff --git a/include/freerdp/channels/rdpemsc.h b/include/freerdp/channels/rdpemsc.h new file mode 100644 index 0000000..4620358 --- /dev/null +++ b/include/freerdp/channels/rdpemsc.h @@ -0,0 +1,138 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Mouse Cursor Virtual Channel Extension + * + * Copyright 2023 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPEMSC_H +#define FREERDP_CHANNEL_RDPEMSC_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define RDPEMSC_CHANNEL_NAME "mousecursor" +#define RDPEMSC_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::MouseCursor" + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + PDUTYPE_EMSC_RESERVED = 0x00, + PDUTYPE_CS_CAPS_ADVERTISE = 0x01, + PDUTYPE_SC_CAPS_CONFIRM = 0x02, + PDUTYPE_SC_MOUSEPTR_UPDATE = 0x03, + } RDP_MOUSE_CURSOR_PDUTYPE; + + typedef enum + { + TS_UPDATETYPE_MOUSEPTR_SYSTEM_NULL = 0x05, + TS_UPDATETYPE_MOUSEPTR_SYSTEM_DEFAULT = 0x06, + TS_UPDATETYPE_MOUSEPTR_POSITION = 0x08, + TS_UPDATETYPE_MOUSEPTR_CACHED = 0x0A, + TS_UPDATETYPE_MOUSEPTR_POINTER = 0x0B, + TS_UPDATETYPE_MOUSEPTR_LARGE_POINTER = 0x0C, + } TS_UPDATETYPE_MOUSEPTR; + +#define RDPEMSC_HEADER_SIZE 4 + + typedef struct + { + RDP_MOUSE_CURSOR_PDUTYPE pduType; + TS_UPDATETYPE_MOUSEPTR updateType; + UINT16 reserved; + } RDP_MOUSE_CURSOR_HEADER; + + typedef enum + { + RDP_MOUSE_CURSOR_CAPVERSION_INVALID = 0x00000000, + RDP_MOUSE_CURSOR_CAPVERSION_1 = 0x00000001, + } RDP_MOUSE_CURSOR_CAPVERSION; + + typedef struct + { + UINT32 signature; + RDP_MOUSE_CURSOR_CAPVERSION version; + UINT32 size; + } RDP_MOUSE_CURSOR_CAPSET; + + typedef struct + { + RDP_MOUSE_CURSOR_CAPSET capsetHeader; + } RDP_MOUSE_CURSOR_CAPSET_VERSION1; + + typedef struct + { + RDP_MOUSE_CURSOR_HEADER header; + wArrayList* capsSets; + } RDP_MOUSE_CURSOR_CAPS_ADVERTISE_PDU; + + typedef struct + { + RDP_MOUSE_CURSOR_HEADER header; + RDP_MOUSE_CURSOR_CAPSET* capsSet; + } RDP_MOUSE_CURSOR_CAPS_CONFIRM_PDU; + + typedef struct + { + UINT16 xPos; + UINT16 yPos; + } TS_POINT16; + + typedef struct + { + UINT16 xorBpp; + UINT16 cacheIndex; + TS_POINT16 hotSpot; + UINT16 width; + UINT16 height; + UINT16 lengthAndMask; + UINT16 lengthXorMask; + BYTE* xorMaskData; + BYTE* andMaskData; + BYTE pad; + } TS_POINTERATTRIBUTE; + + typedef struct + { + UINT16 xorBpp; + UINT16 cacheIndex; + TS_POINT16 hotSpot; + UINT16 width; + UINT16 height; + UINT32 lengthAndMask; + UINT32 lengthXorMask; + BYTE* xorMaskData; + BYTE* andMaskData; + BYTE pad; + } TS_LARGEPOINTERATTRIBUTE; + + typedef struct + { + RDP_MOUSE_CURSOR_HEADER header; + TS_POINT16* position; + UINT16* cachedPointerIndex; + TS_POINTERATTRIBUTE* pointerAttribute; + TS_LARGEPOINTERATTRIBUTE* largePointerAttribute; + } RDP_MOUSE_CURSOR_MOUSEPTR_UPDATE_PDU; + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_RDPEMSC_H */ diff --git a/include/freerdp/channels/rdpewa.h b/include/freerdp/channels/rdpewa.h new file mode 100644 index 0000000..a056f9d --- /dev/null +++ b/include/freerdp/channels/rdpewa.h @@ -0,0 +1,39 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Video Capture Virtual Channel Extension + * + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPEWA_H +#define FREERDP_CHANNEL_RDPEWA_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define RDPEWA_CHANNEL_NAME "rdpewa" +#define RDPEWA_DVC_CHANNEL_NAME "rdpewa" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_RDPEWA_H */ diff --git a/include/freerdp/channels/rdpgfx.h b/include/freerdp/channels/rdpgfx.h new file mode 100644 index 0000000..b608e0f --- /dev/null +++ b/include/freerdp/channels/rdpgfx.h @@ -0,0 +1,409 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Graphics Pipeline Extension + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPGFX_H +#define FREERDP_CHANNEL_RDPGFX_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define RDPGFX_CHANNEL_NAME "rdpgfx" +#define RDPGFX_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Graphics" + +#ifdef __cplusplus +extern "C" +{ +#endif + /** + * Common Data Types + */ + + typedef struct + { + UINT16 x; + UINT16 y; + } RDPGFX_POINT16; + + typedef struct + { + BYTE B; + BYTE G; + BYTE R; + BYTE XA; + } RDPGFX_COLOR32; + +#define GFX_PIXEL_FORMAT_XRGB_8888 0x20 +#define GFX_PIXEL_FORMAT_ARGB_8888 0x21 + +typedef BYTE RDPGFX_PIXELFORMAT; + +#define RDPGFX_CMDID_UNUSED_0000 0x0000 +#define RDPGFX_CMDID_WIRETOSURFACE_1 0x0001 +#define RDPGFX_CMDID_WIRETOSURFACE_2 0x0002 +#define RDPGFX_CMDID_DELETEENCODINGCONTEXT 0x0003 +#define RDPGFX_CMDID_SOLIDFILL 0x0004 +#define RDPGFX_CMDID_SURFACETOSURFACE 0x0005 +#define RDPGFX_CMDID_SURFACETOCACHE 0x0006 +#define RDPGFX_CMDID_CACHETOSURFACE 0x0007 +#define RDPGFX_CMDID_EVICTCACHEENTRY 0x0008 +#define RDPGFX_CMDID_CREATESURFACE 0x0009 +#define RDPGFX_CMDID_DELETESURFACE 0x000A +#define RDPGFX_CMDID_STARTFRAME 0x000B +#define RDPGFX_CMDID_ENDFRAME 0x000C +#define RDPGFX_CMDID_FRAMEACKNOWLEDGE 0x000D +#define RDPGFX_CMDID_RESETGRAPHICS 0x000E +#define RDPGFX_CMDID_MAPSURFACETOOUTPUT 0x000F +#define RDPGFX_CMDID_CACHEIMPORTOFFER 0x0010 +#define RDPGFX_CMDID_CACHEIMPORTREPLY 0x0011 +#define RDPGFX_CMDID_CAPSADVERTISE 0x0012 +#define RDPGFX_CMDID_CAPSCONFIRM 0x0013 +#define RDPGFX_CMDID_UNUSED_0014 0x0014 +#define RDPGFX_CMDID_MAPSURFACETOWINDOW 0x0015 +#define RDPGFX_CMDID_QOEFRAMEACKNOWLEDGE 0x0016 +#define RDPGFX_CMDID_MAPSURFACETOSCALEDOUTPUT 0x0017 +#define RDPGFX_CMDID_MAPSURFACETOSCALEDWINDOW 0x0018 + +#define RDPGFX_HEADER_SIZE 8 + +typedef struct +{ + UINT16 cmdId; + UINT16 flags; + UINT32 pduLength; +} RDPGFX_HEADER; + +/** + * Capability Sets [MS-RDPEGFX] 2.2.3 + */ + +#define RDPGFX_CAPVERSION_8 0x00080004 /** [MS-RDPEGFX] 2.2.3.1 */ +#define RDPGFX_CAPVERSION_81 0x00080105 /** [MS-RDPEGFX] 2.2.3.2 */ +#define RDPGFX_CAPVERSION_10 0x000A0002 /** [MS-RDPEGFX] 2.2.3.3 */ +#define RDPGFX_CAPVERSION_101 0x000A0100 /** [MS-RDPEGFX] 2.2.3.4 */ +#define RDPGFX_CAPVERSION_102 0x000A0200 /** [MS-RDPEGFX] 2.2.3.5 */ +#define RDPGFX_CAPVERSION_103 0x000A0301 /** [MS-RDPEGFX] 2.2.3.6 */ +#define RDPGFX_CAPVERSION_104 0x000A0400 /** [MS-RDPEGFX] 2.2.3.7 */ +#define RDPGFX_CAPVERSION_105 0x000A0502 /** [MS-RDPEGFX] 2.2.3.8 */ +#define RDPGFX_CAPVERSION_106 \ + 0x000A0600 /** [MS-RDPEGFX] 2.2.3.9 (the value in the doc is wrong, see \ + * [MS-RDPEGFX]-180912-errata] \ + * Since this is/was documented for a long time, also define \ + * the incorrect value in case some server actually uses it. \ + */ +#define RDPGFX_CAPVERSION_106_ERR 0x000A0601 +#define RDPGFX_CAPVERSION_107 0x000A0701 /** [MS-RDPEGFX] 2.2.3.10 */ + +#define RDPGFX_NUMBER_CAPSETS 11 +#define RDPGFX_CAPSET_BASE_SIZE 8 + +typedef struct +{ + UINT32 version; + UINT32 length; + UINT32 flags; +} RDPGFX_CAPSET; + +#define RDPGFX_CAPS_FLAG_THINCLIENT 0x00000001U /* 8.0+ */ +#define RDPGFX_CAPS_FLAG_SMALL_CACHE 0x00000002U /* 8.0+ */ +#define RDPGFX_CAPS_FLAG_AVC420_ENABLED 0x00000010U /* 8.1+ */ +#define RDPGFX_CAPS_FLAG_AVC_DISABLED 0x00000020U /* 10.0+ */ +#define RDPGFX_CAPS_FLAG_AVC_THINCLIENT 0x00000040U /* 10.3+ */ +#define RDPGFX_CAPS_FLAG_SCALEDMAP_DISABLE 0x00000080U /* 10.7+ */ + +typedef struct +{ + UINT32 version; + UINT32 capsDataLength; + UINT32 flags; +} RDPGFX_CAPSET_VERSION8; + +typedef struct +{ + UINT32 version; + UINT32 capsDataLength; + UINT32 flags; +} RDPGFX_CAPSET_VERSION81; + +typedef struct +{ + UINT32 version; + UINT32 capsDataLength; + UINT32 flags; +} RDPGFX_CAPSET_VERSION10; + +/** + * Graphics Messages + */ + +#define RDPGFX_CODECID_UNCOMPRESSED 0x0000 +#define RDPGFX_CODECID_CAVIDEO 0x0003 +#define RDPGFX_CODECID_CLEARCODEC 0x0008 +#define RDPGFX_CODECID_PLANAR 0x000A +#define RDPGFX_CODECID_AVC420 0x000B +#define RDPGFX_CODECID_ALPHA 0x000C +#define RDPGFX_CODECID_AVC444 0x000E +#define RDPGFX_CODECID_AVC444v2 0x000F + +#define RDPGFX_WIRE_TO_SURFACE_PDU_1_SIZE 17 + +typedef struct +{ + UINT16 surfaceId; + UINT16 codecId; + RDPGFX_PIXELFORMAT pixelFormat; + RECTANGLE_16 destRect; + UINT32 bitmapDataLength; + BYTE* bitmapData; +} RDPGFX_WIRE_TO_SURFACE_PDU_1; + +#define RDPGFX_CODECID_CAPROGRESSIVE 0x0009 +#define RDPGFX_CODECID_CAPROGRESSIVE_V2 0x000D + +#define RDPGFX_WIRE_TO_SURFACE_PDU_2_SIZE 13 + +typedef struct +{ + UINT16 surfaceId; + UINT16 codecId; + UINT32 codecContextId; + RDPGFX_PIXELFORMAT pixelFormat; + UINT32 bitmapDataLength; + BYTE* bitmapData; +} RDPGFX_WIRE_TO_SURFACE_PDU_2; + +typedef struct +{ + UINT32 surfaceId; + UINT32 codecId; + UINT32 contextId; + UINT32 format; /* FreeRDP color format. @see freerdp/codec/color.h */ + UINT32 left; + UINT32 top; + UINT32 right; + UINT32 bottom; + UINT32 width; + UINT32 height; + UINT32 length; + BYTE* data; + void* extra; +} RDPGFX_SURFACE_COMMAND; + +typedef struct +{ + UINT16 surfaceId; + UINT32 codecContextId; +} RDPGFX_DELETE_ENCODING_CONTEXT_PDU; + +typedef struct +{ + UINT16 surfaceId; + RDPGFX_COLOR32 fillPixel; + UINT16 fillRectCount; + RECTANGLE_16* fillRects; +} RDPGFX_SOLID_FILL_PDU; + +typedef struct +{ + UINT16 surfaceIdSrc; + UINT16 surfaceIdDest; + RECTANGLE_16 rectSrc; + UINT16 destPtsCount; + RDPGFX_POINT16* destPts; +} RDPGFX_SURFACE_TO_SURFACE_PDU; + +typedef struct +{ + UINT16 surfaceId; + UINT64 cacheKey; + UINT16 cacheSlot; + RECTANGLE_16 rectSrc; +} RDPGFX_SURFACE_TO_CACHE_PDU; + +typedef struct +{ + UINT16 cacheSlot; + UINT16 surfaceId; + UINT16 destPtsCount; + RDPGFX_POINT16* destPts; +} RDPGFX_CACHE_TO_SURFACE_PDU; + +typedef struct +{ + UINT16 cacheSlot; +} RDPGFX_EVICT_CACHE_ENTRY_PDU; + +typedef struct +{ + UINT16 surfaceId; + UINT16 width; + UINT16 height; + RDPGFX_PIXELFORMAT pixelFormat; +} RDPGFX_CREATE_SURFACE_PDU; + +typedef struct +{ + UINT16 surfaceId; +} RDPGFX_DELETE_SURFACE_PDU; + +#define RDPGFX_START_FRAME_PDU_SIZE 8 + +typedef struct +{ + UINT32 timestamp; + UINT32 frameId; +} RDPGFX_START_FRAME_PDU; + +#define RDPGFX_END_FRAME_PDU_SIZE 4 + +typedef struct +{ + UINT32 frameId; +} RDPGFX_END_FRAME_PDU; + +#define QUEUE_DEPTH_UNAVAILABLE 0x00000000 +#define SUSPEND_FRAME_ACKNOWLEDGEMENT 0xFFFFFFFF + +typedef struct +{ + UINT32 queueDepth; + UINT32 frameId; + UINT32 totalFramesDecoded; +} RDPGFX_FRAME_ACKNOWLEDGE_PDU; + +typedef struct +{ + UINT32 width; + UINT32 height; + UINT32 monitorCount; + MONITOR_DEF* monitorDefArray; +} RDPGFX_RESET_GRAPHICS_PDU; + +typedef struct +{ + UINT16 surfaceId; + UINT16 reserved; + UINT32 outputOriginX; + UINT32 outputOriginY; +} RDPGFX_MAP_SURFACE_TO_OUTPUT_PDU; + +typedef struct +{ + UINT16 surfaceId; + UINT16 reserved; + UINT32 outputOriginX; + UINT32 outputOriginY; + UINT32 targetWidth; + UINT32 targetHeight; +} RDPGFX_MAP_SURFACE_TO_SCALED_OUTPUT_PDU; + +typedef struct +{ + UINT64 cacheKey; + UINT32 bitmapLength; +} RDPGFX_CACHE_ENTRY_METADATA; + +#define RDPGFX_CACHE_ENTRY_MAX_COUNT 5462 + +typedef struct +{ + UINT16 cacheEntriesCount; + RDPGFX_CACHE_ENTRY_METADATA cacheEntries[RDPGFX_CACHE_ENTRY_MAX_COUNT]; +} RDPGFX_CACHE_IMPORT_OFFER_PDU; + +typedef struct +{ + UINT16 importedEntriesCount; + UINT16 cacheSlots[RDPGFX_CACHE_ENTRY_MAX_COUNT]; +} RDPGFX_CACHE_IMPORT_REPLY_PDU; + +typedef struct +{ + UINT16 capsSetCount; + RDPGFX_CAPSET* capsSets; +} RDPGFX_CAPS_ADVERTISE_PDU; + +typedef struct +{ + RDPGFX_CAPSET* capsSet; +} RDPGFX_CAPS_CONFIRM_PDU; + +typedef struct +{ + UINT16 surfaceId; + UINT64 windowId; + UINT32 mappedWidth; + UINT32 mappedHeight; +} RDPGFX_MAP_SURFACE_TO_WINDOW_PDU; + +typedef struct +{ + UINT16 surfaceId; + UINT64 windowId; + UINT32 mappedWidth; + UINT32 mappedHeight; + UINT32 targetWidth; + UINT32 targetHeight; +} RDPGFX_MAP_SURFACE_TO_SCALED_WINDOW_PDU; + +/* H264 */ + +typedef struct +{ + BYTE qpVal; + BYTE qualityVal; + + BYTE qp; + BYTE r; + BYTE p; +} RDPGFX_H264_QUANT_QUALITY; + +typedef struct +{ + UINT32 numRegionRects; + RECTANGLE_16* regionRects; + RDPGFX_H264_QUANT_QUALITY* quantQualityVals; +} RDPGFX_H264_METABLOCK; + +typedef struct +{ + RDPGFX_H264_METABLOCK meta; + UINT32 length; + BYTE* data; +} RDPGFX_AVC420_BITMAP_STREAM; + +typedef struct +{ + UINT32 cbAvc420EncodedBitstream1; + BYTE LC; + RDPGFX_AVC420_BITMAP_STREAM bitstream[2]; +} RDPGFX_AVC444_BITMAP_STREAM; + +typedef struct +{ + UINT32 frameId; + UINT32 timestamp; + UINT16 timeDiffSE; + UINT16 timeDiffEDR; +} RDPGFX_QOE_FRAME_ACKNOWLEDGE_PDU; + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_RDPGFX_H */ diff --git a/include/freerdp/channels/rdpsnd.h b/include/freerdp/channels/rdpsnd.h new file mode 100644 index 0000000..e5c6c6f --- /dev/null +++ b/include/freerdp/channels/rdpsnd.h @@ -0,0 +1,32 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Audio Virtual Channel Types + * + * Copyright 2012 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPSND_H +#define FREERDP_CHANNEL_RDPSND_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/codec/audio.h> + +#define RDPSND_CHANNEL_NAME "rdpsnd" +#define RDPSND_DVC_CHANNEL_NAME "AUDIO_PLAYBACK_DVC" +#define RDPSND_LOSSY_DVC_CHANNEL_NAME "AUDIO_PLAYBACK_LOSSY_DVC" + +#endif /* FREERDP_CHANNEL_RDPSND_H */ diff --git a/include/freerdp/channels/remdesk.h b/include/freerdp/channels/remdesk.h new file mode 100644 index 0000000..281317a --- /dev/null +++ b/include/freerdp/channels/remdesk.h @@ -0,0 +1,161 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_REMDESK_H +#define FREERDP_CHANNEL_REMDESK_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define REMDESK_CHANNEL_NAME "remdesk" +#define REMDESK_SVC_CHANNEL_NAME "remdesk" + +#define REMDESK_ERROR_NOERROR 0 +#define REMDESK_ERROR_NOINFO 1 +#define REMDESK_ERROR_LOCALNOTERROR 3 +#define REMDESK_ERROR_REMOTEBYUSER 4 +#define REMDESK_ERROR_BYSERVER 5 +#define REMDESK_ERROR_DNSLOOKUPFAILED 6 +#define REMDESK_ERROR_OUTOFMEMORY 7 +#define REMDESK_ERROR_CONNECTIONTIMEDOUT 8 +#define REMDESK_ERROR_SOCKETCONNECTFAILED 9 +#define REMDESK_ERROR_HOSTNOTFOUND 11 +#define REMDESK_ERROR_WINSOCKSENDFAILED 12 +#define REMDESK_ERROR_INVALIDIPADDR 14 +#define REMDESK_ERROR_SOCKETRECVFAILED 15 +#define REMDESK_ERROR_INVALIDENCRYPTION 18 +#define REMDESK_ERROR_GETHOSTBYNAMEFAILED 20 +#define REMDESK_ERROR_LICENSINGFAILED 21 +#define REMDESK_ERROR_ENCRYPTIONERROR 22 +#define REMDESK_ERROR_DECRYPTIONERROR 23 +#define REMDESK_ERROR_INVALIDPARAMETERSTRING 24 +#define REMDESK_ERROR_HELPSESSIONNOTFOUND 25 +#define REMDESK_ERROR_INVALIDPASSWORD 26 +#define REMDESK_ERROR_HELPSESSIONEXPIRED 27 +#define REMDESK_ERROR_CANTOPENRESOLVER 28 +#define REMDESK_ERROR_UNKNOWNSESSMGRERROR 29 +#define REMDESK_ERROR_CANTFORMLINKTOUSERSESSION 30 +#define REMDESK_ERROR_RCPROTOCOLERROR 32 +#define REMDESK_ERROR_RCUNKNOWNERROR 33 +#define REMDESK_ERROR_INTERNALERROR 34 +#define REMDESK_ERROR_HELPEERESPONSEPENDING 35 +#define REMDESK_ERROR_HELPEESAIDYES 36 +#define REMDESK_ERROR_HELPEEALREADYBEINGHELPED 37 +#define REMDESK_ERROR_HELPEECONSIDERINGHELP 38 +#define REMDESK_ERROR_HELPEENEVERRESPONDED 40 +#define REMDESK_ERROR_HELPEESAIDNO 41 +#define REMDESK_ERROR_HELPSESSIONACCESSDENIED 42 +#define REMDESK_ERROR_USERNOTFOUND 43 +#define REMDESK_ERROR_SESSMGRERRORNOTINIT 44 +#define REMDESK_ERROR_SELFHELPNOTSUPPORTED 45 +#define REMDESK_ERROR_INCOMPATIBLEVERSION 47 +#define REMDESK_ERROR_SESSIONNOTCONNECTED 48 +#define REMDESK_ERROR_SYSTEMSHUTDOWN 50 +#define REMDESK_ERROR_STOPLISTENBYUSER 51 +#define REMDESK_ERROR_WINSOCK_FAILED 52 +#define REMDESK_ERROR_MISMATCHPARMS 53 +#define REMDESK_ERROR_PASSWORDS_DONT_MATCH 61 +#define REMDESK_ERROR_SHADOWEND_BASE 300 +#define REMDESK_ERROR_SHADOWEND_CONFIGCHANGE 301 +#define REMDESK_ERROR_SHADOWEND_UNKNOWN 302 + +typedef struct +{ + UINT32 DataLength; + char ChannelName[32]; +} REMDESK_CHANNEL_HEADER; + +#define REMDESK_CHANNEL_CTL_NAME "RC_CTL" +#define REMDESK_CHANNEL_CTL_SIZE 22 + +typedef struct +{ + REMDESK_CHANNEL_HEADER ch; + + UINT32 msgType; +} REMDESK_CTL_HEADER; + +#define REMDESK_CTL_REMOTE_CONTROL_DESKTOP 1 +#define REMDESK_CTL_RESULT 2 +#define REMDESK_CTL_AUTHENTICATE 3 +#define REMDESK_CTL_SERVER_ANNOUNCE 4 +#define REMDESK_CTL_DISCONNECT 5 +#define REMDESK_CTL_VERSIONINFO 6 +#define REMDESK_CTL_ISCONNECTED 7 +#define REMDESK_CTL_VERIFY_PASSWORD 8 +#define REMDESK_CTL_EXPERT_ON_VISTA 9 +#define REMDESK_CTL_RANOVICE_NAME 10 +#define REMDESK_CTL_RAEXPERT_NAME 11 +#define REMDESK_CTL_TOKEN 12 + +typedef struct +{ + REMDESK_CTL_HEADER ctlHeader; + + UINT32 result; +} REMDESK_CTL_RESULT_PDU; + +typedef struct +{ + REMDESK_CTL_HEADER ctlHeader; + + UINT32 versionMajor; + UINT32 versionMinor; +} REMDESK_CTL_VERSION_INFO_PDU; + +typedef struct +{ + REMDESK_CTL_HEADER ctlHeader; + + char* raConnectionString; + char* expertBlob; +} REMDESK_CTL_AUTHENTICATE_PDU; + +typedef struct +{ + REMDESK_CTL_HEADER ctlHeader; + + char* raConnectionString; +} REMDESK_CTL_REMOTE_CONTROL_DESKTOP_PDU; + +typedef struct +{ + REMDESK_CTL_HEADER ctlHeader; + + char* expertBlob; +} REMDESK_CTL_VERIFY_PASSWORD_PDU; + +typedef struct +{ + REMDESK_CTL_HEADER ctlHeader; + + BYTE* EncryptedPassword; + UINT32 EncryptedPasswordLength; +} REMDESK_CTL_EXPERT_ON_VISTA_PDU; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_REMDESK_H */ diff --git a/include/freerdp/channels/scard.h b/include/freerdp/channels/scard.h new file mode 100644 index 0000000..d83e2c8 --- /dev/null +++ b/include/freerdp/channels/scard.h @@ -0,0 +1,500 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Smartcard Redirection Virtual Channel + * + * Copyright 2021 Armin Novak <anovak@thincast.com> + * Copyright 2021 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_SCARD_H +#define FREERDP_CHANNEL_SCARD_H + +#include <winpr/crt.h> +#include <winpr/smartcard.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define RDP_SCARD_CTL_CODE(code) \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, (code), METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define SCARD_IOCTL_ESTABLISHCONTEXT RDP_SCARD_CTL_CODE(5) /* SCardEstablishContext */ +#define SCARD_IOCTL_RELEASECONTEXT RDP_SCARD_CTL_CODE(6) /* SCardReleaseContext */ +#define SCARD_IOCTL_ISVALIDCONTEXT RDP_SCARD_CTL_CODE(7) /* SCardIsValidContext */ +#define SCARD_IOCTL_LISTREADERGROUPSA RDP_SCARD_CTL_CODE(8) /* SCardListReaderGroupsA */ +#define SCARD_IOCTL_LISTREADERGROUPSW RDP_SCARD_CTL_CODE(9) /* SCardListReaderGroupsW */ +#define SCARD_IOCTL_LISTREADERSA RDP_SCARD_CTL_CODE(10) /* SCardListReadersA */ +#define SCARD_IOCTL_LISTREADERSW RDP_SCARD_CTL_CODE(11) /* SCardListReadersW */ +#define SCARD_IOCTL_INTRODUCEREADERGROUPA RDP_SCARD_CTL_CODE(20) /* SCardIntroduceReaderGroupA */ +#define SCARD_IOCTL_INTRODUCEREADERGROUPW RDP_SCARD_CTL_CODE(21) /* SCardIntroduceReaderGroupW */ +#define SCARD_IOCTL_FORGETREADERGROUPA RDP_SCARD_CTL_CODE(22) /* SCardForgetReaderGroupA */ +#define SCARD_IOCTL_FORGETREADERGROUPW RDP_SCARD_CTL_CODE(23) /* SCardForgetReaderGroupW */ +#define SCARD_IOCTL_INTRODUCEREADERA RDP_SCARD_CTL_CODE(24) /* SCardIntroduceReaderA */ +#define SCARD_IOCTL_INTRODUCEREADERW RDP_SCARD_CTL_CODE(25) /* SCardIntroduceReaderW */ +#define SCARD_IOCTL_FORGETREADERA RDP_SCARD_CTL_CODE(26) /* SCardForgetReaderA */ +#define SCARD_IOCTL_FORGETREADERW RDP_SCARD_CTL_CODE(27) /* SCardForgetReaderW */ +#define SCARD_IOCTL_ADDREADERTOGROUPA RDP_SCARD_CTL_CODE(28) /* SCardAddReaderToGroupA */ +#define SCARD_IOCTL_ADDREADERTOGROUPW RDP_SCARD_CTL_CODE(29) /* SCardAddReaderToGroupW */ +#define SCARD_IOCTL_REMOVEREADERFROMGROUPA \ + RDP_SCARD_CTL_CODE(30) /* SCardRemoveReaderFromGroupA \ + */ +#define SCARD_IOCTL_REMOVEREADERFROMGROUPW \ + RDP_SCARD_CTL_CODE(31) /* SCardRemoveReaderFromGroupW \ + */ +#define SCARD_IOCTL_LOCATECARDSA RDP_SCARD_CTL_CODE(38) /* SCardLocateCardsA */ +#define SCARD_IOCTL_LOCATECARDSW RDP_SCARD_CTL_CODE(39) /* SCardLocateCardsW */ +#define SCARD_IOCTL_GETSTATUSCHANGEA RDP_SCARD_CTL_CODE(40) /* SCardGetStatusChangeA */ +#define SCARD_IOCTL_GETSTATUSCHANGEW RDP_SCARD_CTL_CODE(41) /* SCardGetStatusChangeW */ +#define SCARD_IOCTL_CANCEL RDP_SCARD_CTL_CODE(42) /* SCardCancel */ +#define SCARD_IOCTL_CONNECTA RDP_SCARD_CTL_CODE(43) /* SCardConnectA */ +#define SCARD_IOCTL_CONNECTW RDP_SCARD_CTL_CODE(44) /* SCardConnectW */ +#define SCARD_IOCTL_RECONNECT RDP_SCARD_CTL_CODE(45) /* SCardReconnect */ +#define SCARD_IOCTL_DISCONNECT RDP_SCARD_CTL_CODE(46) /* SCardDisconnect */ +#define SCARD_IOCTL_BEGINTRANSACTION RDP_SCARD_CTL_CODE(47) /* SCardBeginTransaction */ +#define SCARD_IOCTL_ENDTRANSACTION RDP_SCARD_CTL_CODE(48) /* SCardEndTransaction */ +#define SCARD_IOCTL_STATE RDP_SCARD_CTL_CODE(49) /* SCardState */ +#define SCARD_IOCTL_STATUSA RDP_SCARD_CTL_CODE(50) /* SCardStatusA */ +#define SCARD_IOCTL_STATUSW RDP_SCARD_CTL_CODE(51) /* SCardStatusW */ +#define SCARD_IOCTL_TRANSMIT RDP_SCARD_CTL_CODE(52) /* SCardTransmit */ +#define SCARD_IOCTL_CONTROL RDP_SCARD_CTL_CODE(53) /* SCardControl */ +#define SCARD_IOCTL_GETATTRIB RDP_SCARD_CTL_CODE(54) /* SCardGetAttrib */ +#define SCARD_IOCTL_SETATTRIB RDP_SCARD_CTL_CODE(55) /* SCardSetAttrib */ +#define SCARD_IOCTL_ACCESSSTARTEDEVENT RDP_SCARD_CTL_CODE(56) /* SCardAccessStartedEvent */ +#define SCARD_IOCTL_RELEASETARTEDEVENT RDP_SCARD_CTL_CODE(57) /* SCardReleaseStartedEvent */ +#define SCARD_IOCTL_LOCATECARDSBYATRA RDP_SCARD_CTL_CODE(58) /* SCardLocateCardsByATRA */ +#define SCARD_IOCTL_LOCATECARDSBYATRW RDP_SCARD_CTL_CODE(59) /* SCardLocateCardsByATRW */ +#define SCARD_IOCTL_READCACHEA RDP_SCARD_CTL_CODE(60) /* SCardReadCacheA */ +#define SCARD_IOCTL_READCACHEW RDP_SCARD_CTL_CODE(61) /* SCardReadCacheW */ +#define SCARD_IOCTL_WRITECACHEA RDP_SCARD_CTL_CODE(62) /* SCardWriteCacheA */ +#define SCARD_IOCTL_WRITECACHEW RDP_SCARD_CTL_CODE(63) /* SCardWriteCacheW */ +#define SCARD_IOCTL_GETTRANSMITCOUNT RDP_SCARD_CTL_CODE(64) /* SCardGetTransmitCount */ +#define SCARD_IOCTL_GETREADERICON RDP_SCARD_CTL_CODE(65) /* SCardGetReaderIconA */ +#define SCARD_IOCTL_GETDEVICETYPEID RDP_SCARD_CTL_CODE(66) /* SCardGetDeviceTypeIdA */ + +#pragma pack(push, 1) + +/* interface type_scard_pack */ +/* [unique][version][uuid] */ + +typedef struct +{ + /* [range] */ DWORD cbContext; + /* [size_is][unique] */ BYTE pbContext[8]; +} REDIR_SCARDCONTEXT; + +typedef struct +{ + /* [range] */ DWORD cbHandle; + /* [size_is] */ BYTE pbHandle[8]; +} REDIR_SCARDHANDLE; + +typedef struct +{ + LONG ReturnCode; +} Long_Return; + +typedef struct +{ + LONG ReturnCode; + /* [range] */ DWORD cBytes; + /* [size_is][unique] */ BYTE* msz; +} ListReaderGroups_Return, ListReaders_Return; + +typedef struct +{ + LONG ReturnCode; + REDIR_SCARDCONTEXT hContext; +} EstablishContext_Return; + +typedef struct +{ + DWORD dwCurrentState; + DWORD dwEventState; + /* [range] */ DWORD cbAtr; + BYTE rgbAtr[36]; +} ReaderState_Return; + +typedef struct +{ + /* [range] */ DWORD cbAtr; + BYTE rgbAtr[36]; + BYTE rgbMask[36]; +} LocateCards_ATRMask; + +typedef struct +{ + LONG ReturnCode; + /* [range] */ DWORD cReaders; + /* [size_is] */ ReaderState_Return* rgReaderStates; +} LocateCards_Return, GetStatusChange_Return; + +typedef struct +{ + LONG ReturnCode; + ULONG cbDataLen; + BYTE* pbData; +} GetReaderIcon_Return; + +typedef struct +{ + LONG ReturnCode; + ULONG dwDeviceId; +} GetDeviceTypeId_Return; + +typedef struct +{ + LONG ReturnCode; + REDIR_SCARDCONTEXT hContext; + REDIR_SCARDHANDLE hCard; + DWORD dwActiveProtocol; +} Connect_Return; + +typedef struct +{ + LONG ReturnCode; + DWORD dwActiveProtocol; +} Reconnect_Return; + +typedef struct +{ + LONG ReturnCode; + DWORD dwState; + DWORD dwProtocol; + /* [range] */ DWORD cbAtrLen; + /* [size_is][unique] */ BYTE rgAtr[36]; +} State_Return; + +typedef struct +{ + LONG ReturnCode; + /* [range] */ DWORD cBytes; + /* [size_is][unique] */ BYTE* mszReaderNames; + DWORD dwState; + DWORD dwProtocol; + BYTE pbAtr[32]; + /* [range] */ DWORD cbAtrLen; +} Status_Return; + +typedef struct +{ + DWORD dwProtocol; + /* [range] */ DWORD cbExtraBytes; + /* [size_is][unique] */ BYTE* pbExtraBytes; +} SCardIO_Request; + +typedef struct +{ + LONG ReturnCode; + /* [unique] */ LPSCARD_IO_REQUEST pioRecvPci; + /* [range] */ DWORD cbRecvLength; + /* [size_is][unique] */ BYTE* pbRecvBuffer; +} Transmit_Return; + +typedef struct +{ + LONG ReturnCode; + DWORD cTransmitCount; +} GetTransmitCount_Return; + +typedef struct +{ + LONG ReturnCode; + /* [range] */ DWORD cbOutBufferSize; + /* [size_is][unique] */ BYTE* pvOutBuffer; +} Control_Return; + +typedef struct +{ + LONG ReturnCode; + /* [range] */ DWORD cbAttrLen; + /* [size_is][unique] */ BYTE* pbAttr; +} GetAttrib_Return; + +typedef struct +{ + LONG ReturnCode; + /* [range] */ DWORD cbDataLen; + /* [size_is][unique] */ BYTE* pbData; +} ReadCache_Return; +#pragma pack(pop) + +typedef struct +{ + REDIR_SCARDCONTEXT hContext; + REDIR_SCARDHANDLE hCard; +} Handles_Call; + +typedef struct +{ + Handles_Call handles; + LONG fmszGroupsIsNULL; + DWORD cchGroups; +} ListReaderGroups_Call; + +typedef struct +{ + Handles_Call handles; + /* [range] */ DWORD cBytes; + /* [size_is][unique] */ BYTE* mszGroups; + LONG fmszReadersIsNULL; + DWORD cchReaders; +} ListReaders_Call; + +typedef struct +{ + Handles_Call handles; + DWORD dwTimeOut; + /* [range] */ DWORD cReaders; + /* [size_is] */ LPSCARD_READERSTATEA rgReaderStates; +} GetStatusChangeA_Call; + +typedef struct +{ + Handles_Call handles; + /* [range] */ DWORD cBytes; + /* [size_is] */ CHAR* mszCards; + /* [range] */ DWORD cReaders; + /* [size_is] */ LPSCARD_READERSTATEA rgReaderStates; +} LocateCardsA_Call; + +typedef struct +{ + Handles_Call handles; + /* [range] */ DWORD cBytes; + /* [size_is] */ WCHAR* mszCards; + /* [range] */ DWORD cReaders; + /* [size_is] */ LPSCARD_READERSTATEW rgReaderStates; +} LocateCardsW_Call; + +typedef struct +{ + Handles_Call handles; + /* [range] */ DWORD cAtrs; + /* [size_is] */ LocateCards_ATRMask* rgAtrMasks; + /* [range] */ DWORD cReaders; + /* [size_is] */ LPSCARD_READERSTATEA rgReaderStates; +} LocateCardsByATRA_Call; + +typedef struct +{ + Handles_Call handles; + /* [range] */ DWORD cAtrs; + /* [size_is] */ LocateCards_ATRMask* rgAtrMasks; + /* [range] */ DWORD cReaders; + /* [size_is] */ LPSCARD_READERSTATEW rgReaderStates; +} LocateCardsByATRW_Call; + +typedef struct +{ + Handles_Call handles; + DWORD dwTimeOut; + /* [range] */ DWORD cReaders; + /* [size_is] */ LPSCARD_READERSTATEW rgReaderStates; +} GetStatusChangeW_Call; + +typedef struct +{ + Handles_Call handles; + WCHAR* szReaderName; +} GetReaderIcon_Call; + +typedef struct +{ + Handles_Call handles; + WCHAR* szReaderName; +} GetDeviceTypeId_Call; + +typedef struct +{ + Handles_Call handles; + DWORD dwShareMode; + DWORD dwPreferredProtocols; +} Connect_Common_Call; + +typedef struct +{ + Connect_Common_Call Common; + /* [string] */ CHAR* szReader; +} ConnectA_Call; + +typedef struct +{ + Connect_Common_Call Common; + /* [string] */ WCHAR* szReader; +} ConnectW_Call; + +typedef struct +{ + Handles_Call handles; + DWORD dwShareMode; + DWORD dwPreferredProtocols; + DWORD dwInitialization; +} Reconnect_Call; + +typedef struct +{ + Handles_Call handles; + DWORD dwDisposition; +} HCardAndDisposition_Call; + +typedef struct +{ + Handles_Call handles; + LONG fpbAtrIsNULL; + DWORD cbAtrLen; +} State_Call; + +typedef struct +{ + Handles_Call handles; + LONG fmszReaderNamesIsNULL; + DWORD cchReaderLen; + DWORD cbAtrLen; +} Status_Call; + +typedef struct +{ + Handles_Call handles; + LPSCARD_IO_REQUEST pioSendPci; + /* [range] */ DWORD cbSendLength; + /* [size_is] */ BYTE* pbSendBuffer; + /* [unique] */ LPSCARD_IO_REQUEST pioRecvPci; + LONG fpbRecvBufferIsNULL; + DWORD cbRecvLength; +} Transmit_Call; + +typedef struct +{ + Handles_Call handles; + LONG LongValue; +} Long_Call; + +typedef struct +{ + Handles_Call handles; +} Context_Call; + +typedef struct +{ + Handles_Call handles; + /* [string] */ char* sz; +} ContextAndStringA_Call; + +typedef struct +{ + Handles_Call handles; + /* [string] */ WCHAR* sz; +} ContextAndStringW_Call; + +typedef struct +{ + Handles_Call handles; + /* [string] */ char* sz1; + /* [string] */ char* sz2; +} ContextAndTwoStringA_Call; + +typedef struct +{ + Handles_Call handles; + /* [string] */ WCHAR* sz1; + /* [string] */ WCHAR* sz2; +} ContextAndTwoStringW_Call; + +typedef struct +{ + Handles_Call handles; + DWORD dwScope; +} EstablishContext_Call; + +typedef struct +{ + Handles_Call handles; +} GetTransmitCount_Call; + +typedef struct +{ + Handles_Call handles; + DWORD dwControlCode; + /* [range] */ DWORD cbInBufferSize; + /* [size_is][unique] */ BYTE* pvInBuffer; + LONG fpvOutBufferIsNULL; + DWORD cbOutBufferSize; +} Control_Call; + +typedef struct +{ + Handles_Call handles; + DWORD dwAttrId; + LONG fpbAttrIsNULL; + DWORD cbAttrLen; +} GetAttrib_Call; + +typedef struct +{ + Handles_Call handles; + DWORD dwAttrId; + /* [range] */ DWORD cbAttrLen; + /* [size_is] */ BYTE* pbAttr; +} SetAttrib_Call; + +typedef struct +{ + Handles_Call handles; + UUID* CardIdentifier; + DWORD FreshnessCounter; + LONG fPbDataIsNULL; + DWORD cbDataLen; +} ReadCache_Common; + +typedef struct +{ + ReadCache_Common Common; + /* [string] */ char* szLookupName; +} ReadCacheA_Call; + +typedef struct +{ + ReadCache_Common Common; + /* [string] */ WCHAR* szLookupName; +} ReadCacheW_Call; + +typedef struct +{ + Handles_Call handles; + UUID* CardIdentifier; + DWORD FreshnessCounter; + /* [range] */ DWORD cbDataLen; + /* [size_is][unique] */ BYTE* pbData; +} WriteCache_Common; + +typedef struct +{ + WriteCache_Common Common; + /* [string] */ char* szLookupName; +} WriteCacheA_Call; + +typedef struct +{ + WriteCache_Common Common; + /* [string] */ WCHAR* szLookupName; +} WriteCacheW_Call; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_SCARD_H */ diff --git a/include/freerdp/channels/telemetry.h b/include/freerdp/channels/telemetry.h new file mode 100644 index 0000000..cf96d6d --- /dev/null +++ b/include/freerdp/channels/telemetry.h @@ -0,0 +1,47 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Telemetry Virtual Channel Extension + * + * Copyright 2022 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_TELEMETRY_H +#define FREERDP_CHANNEL_TELEMETRY_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define TELEMETRY_CHANNEL_NAME "telemetry" +#define TELEMETRY_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Telemetry" + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT32 PromptForCredentialsMillis; + UINT32 PromptForCredentialsDoneMillis; + UINT32 GraphicsChannelOpenedMillis; + UINT32 FirstGraphicsReceivedMillis; + } TELEMETRY_RDP_TELEMETRY_PDU; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_TELEMETRY_H */ diff --git a/include/freerdp/channels/tsmf.h b/include/freerdp/channels/tsmf.h new file mode 100644 index 0000000..aa943c9 --- /dev/null +++ b/include/freerdp/channels/tsmf.h @@ -0,0 +1,36 @@ +/* + * FreeRDP: A Remote Desktop Protocol Implementation + * Video Redirection Virtual Channel - Callback interface + * + * (C) Copyright 2014 Thincast Technologies GmbH + * (C) Copyright 2014 Armin Novak <armin.novak@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* DEPRECATION WARNING: + * + * This channel is unmaintained and not used since windows 7. + * Only compile and use it if absolutely necessary, otherwise + * deactivate it or use the newer [MS-RDPEVOR] video redirection. + */ + +#ifndef FREERDP_CHANNEL_TSMF_H +#define FREERDP_CHANNEL_TSMF_H + +#include <freerdp/types.h> + +#define TSMF_CHANNEL_NAME "tsmf" +#define TSMF_DVC_CHANNEL_NAME "TSMF" + +#endif /* FREERDP_CHANNEL_TSMF_H */ diff --git a/include/freerdp/channels/urbdrc.h b/include/freerdp/channels/urbdrc.h new file mode 100644 index 0000000..f3d918d --- /dev/null +++ b/include/freerdp/channels/urbdrc.h @@ -0,0 +1,31 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Server USB redirection Virtual Channel + * + * Copyright 2019 Armin Novak <armin.novak@thincast.com> + * Copyright 2019 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_URBDRC_H +#define FREERDP_CHANNEL_URBDRC_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/types.h> + +#define URBDRC_CHANNEL_NAME "urbdrc" +#define URBDRC_DVC_CHANNEL_NAME "urbdrc" + +#endif /* FREERDP_CHANNEL_URBDRC_H */ diff --git a/include/freerdp/channels/video.h b/include/freerdp/channels/video.h new file mode 100644 index 0000000..b552475 --- /dev/null +++ b/include/freerdp/channels/video.h @@ -0,0 +1,122 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Video Optimized Remoting Virtual Channel Extension + * + * Copyright 2018 David Fort <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_VIDEO_H +#define FREERDP_CHANNEL_VIDEO_H + +#include <winpr/wtypes.h> +#include <freerdp/types.h> + +#define VIDEO_CHANNEL_NAME "video" +#define VIDEO_CONTROL_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Video::Control::v08.01" +#define VIDEO_DATA_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Video::Data::v08.01" + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @brief TSNM packet type */ + enum + { + TSMM_PACKET_TYPE_PRESENTATION_REQUEST = 1, + TSMM_PACKET_TYPE_PRESENTATION_RESPONSE = 2, + TSMM_PACKET_TYPE_CLIENT_NOTIFICATION = 3, + TSMM_PACKET_TYPE_VIDEO_DATA = 4 + }; + + /** @brief TSMM_PRESENTATION_REQUEST commands */ + enum + { + TSMM_START_PRESENTATION = 1, + TSMM_STOP_PRESENTATION = 2 + }; + + /** @brief presentation request struct */ + typedef struct + { + BYTE PresentationId; + BYTE Version; + BYTE Command; + BYTE FrameRate; + UINT32 SourceWidth, SourceHeight; + UINT32 ScaledWidth, ScaledHeight; + UINT64 hnsTimestampOffset; + UINT64 GeometryMappingId; + BYTE VideoSubtypeId[16]; + UINT32 cbExtra; + BYTE* pExtraData; + } TSMM_PRESENTATION_REQUEST; + + /** @brief response to a TSMM_PRESENTATION_REQUEST */ + typedef struct + { + BYTE PresentationId; + } TSMM_PRESENTATION_RESPONSE; + + /** @brief TSMM_VIDEO_DATA flags */ + enum + { + TSMM_VIDEO_DATA_FLAG_HAS_TIMESTAMPS = 0x01, + TSMM_VIDEO_DATA_FLAG_KEYFRAME = 0x02, + TSMM_VIDEO_DATA_FLAG_NEW_FRAMERATE = 0x04 + }; + + /** @brief a video data packet */ + typedef struct + { + BYTE PresentationId; + BYTE Version; + BYTE Flags; + UINT64 hnsTimestamp; + UINT64 hnsDuration; + UINT16 CurrentPacketIndex; + UINT16 PacketsInSample; + UINT32 SampleNumber; + UINT32 cbSample; + BYTE* pSample; + } TSMM_VIDEO_DATA; + + /** @brief values for NotificationType in TSMM_CLIENT_NOTIFICATION */ + enum + { + TSMM_CLIENT_NOTIFICATION_TYPE_NETWORK_ERROR = 1, + TSMM_CLIENT_NOTIFICATION_TYPE_FRAMERATE_OVERRIDE = 2 + }; + + /** @brief struct used when NotificationType is FRAMERATE_OVERRIDE */ + typedef struct + { + UINT32 Flags; + UINT32 DesiredFrameRate; + } TSMM_CLIENT_NOTIFICATION_FRAMERATE_OVERRIDE; + + /** @brief a client to server notification struct */ + typedef struct + { + BYTE PresentationId; + BYTE NotificationType; + TSMM_CLIENT_NOTIFICATION_FRAMERATE_OVERRIDE FramerateOverride; + } TSMM_CLIENT_NOTIFICATION; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_VIDEO_H */ diff --git a/include/freerdp/channels/wtsvc.h b/include/freerdp/channels/wtsvc.h new file mode 100644 index 0000000..db7feac --- /dev/null +++ b/include/freerdp/channels/wtsvc.h @@ -0,0 +1,98 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Server Virtual Channel Interface + * + * Copyright 2011-2012 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * The server-side virtual channel API follows the Microsoft Remote Desktop + * Services API functions WTSVirtualChannel* defined in: + * http://msdn.microsoft.com/en-us/library/windows/desktop/aa383464.aspx + * + * Difference between the MS API are documented in this header. All functions + * are implemented in and integrated with libfreerdp-channels. + * + * Unlike MS API, all functions except WTSVirtualChannelOpenEx in this + * implementation are thread-safe. + */ + +#ifndef FREERDP_WTSVC_H +#define FREERDP_WTSVC_H + +#include <freerdp/types.h> +#include <freerdp/peer.h> + +#include <winpr/winpr.h> +#include <winpr/wtypes.h> +#include <winpr/wtsapi.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + enum + { + DRDYNVC_STATE_NONE = 0, + DRDYNVC_STATE_INITIALIZED = 1, + DRDYNVC_STATE_READY = 2, + DRDYNVC_STATE_FAILED = 3 + }; + + typedef BOOL (*psDVCCreationStatusCallback)(void* userdata, UINT32 channelId, + INT32 creationStatus); + + /** + * WTSVirtualChannelManager functions are FreeRDP extensions to the API. + */ +#if defined(WITH_FREERDP_DEPRECATED) + FREERDP_API WINPR_DEPRECATED_VAR( + "Use WTSVirtualChannelManagerGetEventHandle", + void WTSVirtualChannelManagerGetFileDescriptor(HANDLE hServer, void** fds, int* fds_count)); +#endif + FREERDP_API BOOL WTSVirtualChannelManagerOpen(HANDLE hServer); + FREERDP_API BOOL WTSVirtualChannelManagerCheckFileDescriptor(HANDLE hServer); + FREERDP_API BOOL WTSVirtualChannelManagerCheckFileDescriptorEx(HANDLE hServer, BOOL autoOpen); + FREERDP_API HANDLE WTSVirtualChannelManagerGetEventHandle(HANDLE hServer); + FREERDP_API BOOL WTSVirtualChannelManagerIsChannelJoined(HANDLE hServer, const char* name); + FREERDP_API BYTE WTSVirtualChannelManagerGetDrdynvcState(HANDLE hServer); + FREERDP_API void WTSVirtualChannelManagerSetDVCCreationCallback(HANDLE hServer, + psDVCCreationStatusCallback cb, + void* userdata); + + /** + * Extended FreeRDP WTS functions for channel handling + */ + FREERDP_API UINT16 WTSChannelGetId(freerdp_peer* client, const char* channel_name); + FREERDP_API BOOL WTSIsChannelJoinedByName(freerdp_peer* client, const char* channel_name); + FREERDP_API BOOL WTSIsChannelJoinedById(freerdp_peer* client, const UINT16 channel_id); + FREERDP_API BOOL WTSChannelSetHandleByName(freerdp_peer* client, const char* channel_name, + void* handle); + FREERDP_API BOOL WTSChannelSetHandleById(freerdp_peer* client, const UINT16 channel_id, + void* handle); + FREERDP_API void* WTSChannelGetHandleByName(freerdp_peer* client, const char* channel_name); + FREERDP_API void* WTSChannelGetHandleById(freerdp_peer* client, const UINT16 channel_id); + FREERDP_API const char* WTSChannelGetName(freerdp_peer* client, UINT16 channel_id); + FREERDP_API char** WTSGetAcceptedChannelNames(freerdp_peer* client, size_t* count); + FREERDP_API INT64 WTSChannelGetOptions(freerdp_peer* client, UINT16 channel_id); + + FREERDP_API UINT32 WTSChannelGetIdByHandle(HANDLE hChannelHandle); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_WTSVC_H */ diff --git a/include/freerdp/client.h b/include/freerdp/client.h new file mode 100644 index 0000000..d30c417 --- /dev/null +++ b/include/freerdp/client.h @@ -0,0 +1,302 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Client Interface + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CLIENT_H +#define FREERDP_CLIENT_H + +#include <freerdp/config.h> +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/event.h> +#include <freerdp/freerdp.h> + +#if defined(CHANNEL_AINPUT_CLIENT) +#include <freerdp/client/ainput.h> +#endif + +#if defined(CHANNEL_RDPEI_CLIENT) +#include <freerdp/client/rdpei.h> +#endif + +#if defined(CHANNEL_ENCOMSP_CLIENT) +#include <freerdp/client/encomsp.h> +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Client Entry Points + */ + + typedef BOOL (*pRdpGlobalInit)(void); + typedef void (*pRdpGlobalUninit)(void); + + typedef BOOL (*pRdpClientNew)(freerdp* instance, rdpContext* context); + typedef void (*pRdpClientFree)(freerdp* instance, rdpContext* context); + + typedef int (*pRdpClientStart)(rdpContext* context); + typedef int (*pRdpClientStop)(rdpContext* context); + + struct rdp_client_entry_points_v1 + { + DWORD Size; + DWORD Version; + + rdpSettings* settings; + + pRdpGlobalInit GlobalInit; + pRdpGlobalUninit GlobalUninit; + + DWORD ContextSize; + pRdpClientNew ClientNew; + pRdpClientFree ClientFree; + + pRdpClientStart ClientStart; + pRdpClientStop ClientStop; + }; + +#define RDP_CLIENT_INTERFACE_VERSION 1 +#define RDP_CLIENT_ENTRY_POINT_NAME "RdpClientEntry" + + typedef int (*pRdpClientEntry)(RDP_CLIENT_ENTRY_POINTS* pEntryPoints); + + /* Common Client Interface */ +#define FREERDP_MAX_TOUCH_CONTACTS 10 + + typedef struct + { + ALIGN64 INT32 id; + ALIGN64 UINT32 count; + ALIGN64 INT32 x; + ALIGN64 INT32 y; + ALIGN64 UINT32 flags; + ALIGN64 UINT32 pressure; + } FreeRDP_TouchContact; + +#define FREERDP_MAX_PEN_DEVICES 10 + + typedef struct pen_device + { + ALIGN64 INT32 deviceid; + ALIGN64 UINT32 flags; + ALIGN64 double max_pressure; + ALIGN64 BOOL hovering; + ALIGN64 BOOL pressed; + ALIGN64 INT32 last_x; + ALIGN64 INT32 last_y; + } FreeRDP_PenDevice; + + struct rdp_client_context + { + rdpContext context; + ALIGN64 HANDLE thread; /**< (offset 0) */ +#if defined(CHANNEL_AINPUT_CLIENT) + ALIGN64 AInputClientContext* ainput; /**< (offset 1) */ +#else + UINT64 reserved1; +#endif + +#if defined(CHANNEL_RDPEI_CLIENT) + ALIGN64 RdpeiClientContext* rdpei; /**< (offset 2) */ +#else + UINT64 reserved2; +#endif + + ALIGN64 INT32 lastX; /**< (offset 3) */ + ALIGN64 INT32 lastY; /**< (offset 4) */ + ALIGN64 BOOL mouse_grabbed; /** < (offset 5) */ + +#if defined(CHANNEL_ENCOMSP_CLIENT) + ALIGN64 EncomspClientContext* encomsp; /** < (offset 6) */ + ALIGN64 BOOL controlToggle; /**< (offset 7) */ +#else + UINT64 reserved3[2]; +#endif + ALIGN64 FreeRDP_TouchContact contacts[FREERDP_MAX_TOUCH_CONTACTS]; /**< (offset 8) */ + ALIGN64 FreeRDP_PenDevice pens[FREERDP_MAX_PEN_DEVICES]; /**< (offset 9) */ + UINT64 reserved[128 - 9]; /**< (offset 9) */ + }; + + /* Common client functions */ + + FREERDP_API void freerdp_client_context_free(rdpContext* context); + + WINPR_ATTR_MALLOC(freerdp_client_context_free, 1) + FREERDP_API rdpContext* freerdp_client_context_new(const RDP_CLIENT_ENTRY_POINTS* pEntryPoints); + + FREERDP_API int freerdp_client_start(rdpContext* context); + FREERDP_API int freerdp_client_stop(rdpContext* context); + + FREERDP_API freerdp* freerdp_client_get_instance(rdpContext* context); + FREERDP_API HANDLE freerdp_client_get_thread(rdpContext* context); + + FREERDP_API int freerdp_client_settings_parse_command_line(rdpSettings* settings, int argc, + char** argv, BOOL allowUnknown); + + FREERDP_API int freerdp_client_settings_parse_connection_file(rdpSettings* settings, + const char* filename); + FREERDP_API int freerdp_client_settings_parse_connection_file_buffer(rdpSettings* settings, + const BYTE* buffer, + size_t size); + FREERDP_API int freerdp_client_settings_write_connection_file(const rdpSettings* settings, + const char* filename, + BOOL unicode); + + FREERDP_API int freerdp_client_settings_parse_assistance_file(rdpSettings* settings, int argc, + char* argv[]); + + FREERDP_API BOOL client_cli_authenticate_ex(freerdp* instance, char** username, char** password, + char** domain, rdp_auth_reason reason); + + FREERDP_API BOOL client_cli_choose_smartcard(freerdp* instance, SmartcardCertInfo** cert_list, + DWORD count, DWORD* choice, BOOL gateway); + + FREERDP_API int client_cli_logon_error_info(freerdp* instance, UINT32 data, UINT32 type); + + FREERDP_API BOOL client_cli_get_access_token(freerdp* instance, AccessTokenType tokenType, + char** token, size_t count, ...); + FREERDP_API BOOL client_common_get_access_token(freerdp* instance, const char* request, + char** token); + + FREERDP_API SSIZE_T client_common_retry_dialog(freerdp* instance, const char* what, + size_t current, void* userarg); + + FREERDP_API void + freerdp_client_OnChannelConnectedEventHandler(void* context, + const ChannelConnectedEventArgs* e); + FREERDP_API void + freerdp_client_OnChannelDisconnectedEventHandler(void* context, + const ChannelDisconnectedEventArgs* e); + +#if defined(WITH_FREERDP_DEPRECATED) + FREERDP_API WINPR_DEPRECATED_VAR("Use client_cli_authenticate_ex", + BOOL client_cli_authenticate(freerdp* instance, + char** username, char** password, + char** domain)); + FREERDP_API + WINPR_DEPRECATED_VAR("Use client_cli_authenticate_ex", + BOOL client_cli_gw_authenticate(freerdp* instance, char** username, + char** password, char** domain)); + + FREERDP_API WINPR_DEPRECATED_VAR( + "Use client_cli_verify_certificate_ex", + DWORD client_cli_verify_certificate(freerdp* instance, const char* common_name, + const char* subject, const char* issuer, + const char* fingerprint, BOOL host_mismatch)); +#endif + + FREERDP_API DWORD client_cli_verify_certificate_ex(freerdp* instance, const char* host, + UINT16 port, const char* common_name, + const char* subject, const char* issuer, + const char* fingerprint, DWORD flags); + +#if defined(WITH_FREERDP_DEPRECATED) + FREERDP_API WINPR_DEPRECATED_VAR("Use client_cli_verify_changed_certificate_ex", + DWORD client_cli_verify_changed_certificate( + freerdp* instance, const char* common_name, + const char* subject, const char* issuer, + const char* fingerprint, const char* old_subject, + const char* old_issuer, const char* old_fingerprint)); +#endif + + FREERDP_API DWORD client_cli_verify_changed_certificate_ex( + freerdp* instance, const char* host, UINT16 port, const char* common_name, + const char* subject, const char* issuer, const char* fingerprint, const char* old_subject, + const char* old_issuer, const char* old_fingerprint, DWORD flags); + + FREERDP_API BOOL client_cli_present_gateway_message(freerdp* instance, UINT32 type, + BOOL isDisplayMandatory, + BOOL isConsentMandatory, size_t length, + const WCHAR* message); + + FREERDP_API BOOL client_auto_reconnect(freerdp* instance); + FREERDP_API BOOL client_auto_reconnect_ex(freerdp* instance, + BOOL (*window_events)(freerdp* instance)); + + typedef enum + { + FREERDP_TOUCH_DOWN = 0x01, + FREERDP_TOUCH_UP = 0x02, + FREERDP_TOUCH_MOTION = 0x04, + FREERDP_TOUCH_HAS_PRESSURE = 0x100 + } FreeRDPTouchEventType; + + FREERDP_API BOOL freerdp_client_handle_touch(rdpClientContext* cctx, UINT32 flags, INT32 finger, + UINT32 pressure, INT32 x, INT32 y); + + typedef enum + { + FREERDP_PEN_REGISTER = 0x01, + FREERDP_PEN_ERASER_PRESSED = 0x02, + FREERDP_PEN_PRESS = 0x04, + FREERDP_PEN_MOTION = 0x08, + FREERDP_PEN_RELEASE = 0x10, + FREERDP_PEN_BARREL_PRESSED = 0x20, + FREERDP_PEN_HAS_PRESSURE = 0x40, + FREERDP_PEN_HAS_ROTATION = 0x80, + FREERDP_PEN_HAS_TILTX = 0x100, + FREERDP_PEN_HAS_TILTY = 0x200, + FREERDP_PEN_IS_INVERTED = 0x400 + } FreeRDPPenEventType; + + FREERDP_API BOOL freerdp_client_handle_pen(rdpClientContext* cctx, UINT32 flags, INT32 deviceid, + ...); + FREERDP_API BOOL freerdp_client_is_pen(rdpClientContext* cctx, INT32 deviceid); + + FREERDP_API BOOL freerdp_client_pen_cancel_all(rdpClientContext* cctx); + + FREERDP_API BOOL freerdp_client_send_wheel_event(rdpClientContext* cctx, UINT16 mflags); + + FREERDP_API BOOL freerdp_client_send_mouse_event(rdpClientContext* cctx, UINT64 mflags, INT32 x, + INT32 y); + + /** @brief this function checks if relative mouse events are supported and enabled for this + * session. + * + * @param cctx The \b rdpClientContext to check + * + * @return \b TRUE if relative mouse events are to be sent, \b FALSE otherwise + */ + FREERDP_API BOOL freerdp_client_use_relative_mouse_events(rdpClientContext* cctx); + + FREERDP_API BOOL freerdp_client_send_button_event(rdpClientContext* cctx, BOOL relative, + UINT16 mflags, INT32 x, INT32 y); + + FREERDP_API BOOL freerdp_client_send_extended_button_event(rdpClientContext* cctx, + BOOL relative, UINT16 mflags, + INT32 x, INT32 y); + + FREERDP_API int freerdp_client_common_stop(rdpContext* context); + + FREERDP_API BOOL freerdp_client_load_channels(freerdp* instance); + +#if defined(CHANNEL_ENCOMSP_CLIENT) + FREERDP_API BOOL freerdp_client_encomsp_toggle_control(EncomspClientContext* encomsp); + FREERDP_API BOOL freerdp_client_encomsp_set_control(EncomspClientContext* encomsp, + BOOL control); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CLIENT_H */ diff --git a/include/freerdp/client/ainput.h b/include/freerdp/client/ainput.h new file mode 100644 index 0000000..c432677 --- /dev/null +++ b/include/freerdp/client/ainput.h @@ -0,0 +1,48 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Display Update Virtual Channel Extension + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_AINPUT_CLIENT_AINPUT_H +#define FREERDP_CHANNEL_AINPUT_CLIENT_AINPUT_H + +#include <winpr/assert.h> +#include <freerdp/channels/ainput.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef UINT (*pcAInputSendInputEvent)(AInputClientContext* context, UINT64 flags, INT32 x, + INT32 y); + + struct ainput_client_context + { + void* handle; + void* custom; + + pcAInputSendInputEvent AInputSendInputEvent; + }; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_AINPUT_CLIENT_AINPUT_H */ diff --git a/include/freerdp/client/audin.h b/include/freerdp/client/audin.h new file mode 100644 index 0000000..604b60e --- /dev/null +++ b/include/freerdp/client/audin.h @@ -0,0 +1,73 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Audio Input Redirection Virtual Channel + * + * Copyright 2010-2011 Vic Lee + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_AUDIN_CLIENT_AUDIN_H +#define FREERDP_CHANNEL_AUDIN_CLIENT_AUDIN_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/channels/audin.h> +#include <freerdp/codec/audio.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Subsystem Interface + */ + + typedef UINT (*AudinReceive)(const AUDIO_FORMAT* format, const BYTE* data, size_t size, + void* userData); + + typedef struct s_IAudinDevice IAudinDevice; + struct s_IAudinDevice + { + UINT (*Open)(IAudinDevice* devplugin, AudinReceive receive, void* userData); + BOOL (*FormatSupported)(IAudinDevice* devplugin, const AUDIO_FORMAT* format); + UINT(*SetFormat) + (IAudinDevice* devplugin, const AUDIO_FORMAT* format, UINT32 FramesPerPacket); + UINT (*Close)(IAudinDevice* devplugin); + UINT (*Free)(IAudinDevice* devplugin); + }; + +#define AUDIN_DEVICE_EXPORT_FUNC_NAME "freerdp_audin_client_subsystem_entry" + +typedef UINT (*PREGISTERAUDINDEVICE)(IWTSPlugin* plugin, IAudinDevice* device); + +typedef struct +{ + IWTSPlugin* plugin; + PREGISTERAUDINDEVICE pRegisterAudinDevice; + const ADDIN_ARGV* args; + rdpContext* rdpcontext; +} FREERDP_AUDIN_DEVICE_ENTRY_POINTS; +typedef FREERDP_AUDIN_DEVICE_ENTRY_POINTS* PFREERDP_AUDIN_DEVICE_ENTRY_POINTS; + +typedef UINT (*PFREERDP_AUDIN_DEVICE_ENTRY)(PFREERDP_AUDIN_DEVICE_ENTRY_POINTS pEntryPoints); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_AUDIN_CLIENT_AUDIN_H */ diff --git a/include/freerdp/client/channels.h b/include/freerdp/client/channels.h new file mode 100644 index 0000000..cfdc866 --- /dev/null +++ b/include/freerdp/client/channels.h @@ -0,0 +1,94 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Client Channels + * + * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNELS_CLIENT_H +#define FREERDP_CHANNELS_CLIENT_H + +#include <freerdp/api.h> +#include <freerdp/dvc.h> +#include <freerdp/config.h> +#include <freerdp/addin.h> +#include <freerdp/channels/channels.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + IWTSVirtualChannelCallback iface; + IWTSPlugin* plugin; + IWTSVirtualChannelManager* channel_mgr; + IWTSVirtualChannel* channel; + } GENERIC_CHANNEL_CALLBACK; + + typedef struct + { + IWTSListenerCallback iface; + IWTSPlugin* plugin; + IWTSVirtualChannelManager* channel_mgr; + IWTSVirtualChannel* channel; + GENERIC_CHANNEL_CALLBACK* channel_callback; + } GENERIC_LISTENER_CALLBACK; + + typedef struct GENERIC_DYNVC_PLUGIN GENERIC_DYNVC_PLUGIN; + typedef UINT (*DYNVC_PLUGIN_INIT_FN)(GENERIC_DYNVC_PLUGIN* plugin, rdpContext* context, + rdpSettings* settings); + typedef void (*DYNVC_PLUGIN_TERMINATE_FN)(GENERIC_DYNVC_PLUGIN* plugin); + + struct GENERIC_DYNVC_PLUGIN + { + IWTSPlugin iface; + GENERIC_LISTENER_CALLBACK* listener_callback; + IWTSListener* listener; + BOOL attached; + BOOL initialized; + wLog* log; + char* dynvc_name; + size_t channelCallbackSize; + const IWTSVirtualChannelCallback* channel_callbacks; + DYNVC_PLUGIN_TERMINATE_FN terminatePluginFn; + }; + +#if defined(WITH_CHANNELS) + FREERDP_API void* freerdp_channels_client_find_static_entry(const char* name, + const char* identifier); + FREERDP_API PVIRTUALCHANNELENTRY freerdp_channels_load_static_addin_entry(LPCSTR pszName, + LPCSTR pszSubsystem, + LPCSTR pszType, + DWORD dwFlags); + + FREERDP_API FREERDP_ADDIN** freerdp_channels_list_addins(LPCSTR lpName, LPCSTR lpSubsystem, + LPCSTR lpType, DWORD dwFlags); + FREERDP_API void freerdp_channels_addin_list_free(FREERDP_ADDIN** ppAddins); + + FREERDP_API BOOL freerdp_initialize_generic_dynvc_plugin(GENERIC_DYNVC_PLUGIN* plugin); + FREERDP_API UINT freerdp_generic_DVCPluginEntry( + IDRDYNVC_ENTRY_POINTS* pEntryPoints, const char* logTag, const char* name, + size_t pluginSize, size_t channelCallbackSize, + const IWTSVirtualChannelCallback* channel_callbacks, DYNVC_PLUGIN_INIT_FN initPluginFn, + DYNVC_PLUGIN_TERMINATE_FN terminatePluginFn); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNELS_CLIENT_H */ diff --git a/include/freerdp/client/client_cliprdr_file.h b/include/freerdp/client/client_cliprdr_file.h new file mode 100644 index 0000000..6dca587 --- /dev/null +++ b/include/freerdp/client/client_cliprdr_file.h @@ -0,0 +1,105 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * X11 Clipboard Redirection + * + * Copyright 2010-2011 Vic Lee + * Copyright 2023 Armin Novak <armin.novak@thincst.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CLIENT_X11_CLIPRDR_FILE_H +#define FREERDP_CLIENT_X11_CLIPRDR_FILE_H + +#include <winpr/clipboard.h> + +#include <freerdp/client/cliprdr.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct cliprdr_file_context CliprdrFileContext; + + FREERDP_API void cliprdr_file_context_free(CliprdrFileContext* file); + + WINPR_ATTR_MALLOC(cliprdr_file_context_free, 1) + FREERDP_API CliprdrFileContext* cliprdr_file_context_new(void* context); + + /**! \brief returns if the implementation supports pasting files in a client file browser. + * + * \param file the file context to query + * + * \return \b TRUE if files can be pasted locally, \b FALSE if not (e.g. no FUSE, ...) + */ + FREERDP_API BOOL cliprdr_file_context_has_local_support(CliprdrFileContext* file); + + /**! \brief sets state of local file paste support + * + * \param file the file context to update + * \param available \b TRUE if the client supports pasting files to local file browsers, \b + * FALSE otherwise + * + * \return \b TRUE for success, \b FALSE otherwise + */ + FREERDP_API BOOL cliprdr_file_context_set_locally_available(CliprdrFileContext* file, + BOOL available); + FREERDP_API BOOL cliprdr_file_context_remote_set_flags(CliprdrFileContext* file, UINT32 flags); + FREERDP_API UINT32 cliprdr_file_context_remote_get_flags(CliprdrFileContext* file); + + FREERDP_API UINT32 cliprdr_file_context_current_flags(CliprdrFileContext* file); + + FREERDP_API void* cliprdr_file_context_get_context(CliprdrFileContext* file); + + FREERDP_API BOOL cliprdr_file_context_init(CliprdrFileContext* file, + CliprdrClientContext* cliprdr); + FREERDP_API BOOL cliprdr_file_context_uninit(CliprdrFileContext* file, + CliprdrClientContext* cliprdr); + + FREERDP_API BOOL cliprdr_file_context_clear(CliprdrFileContext* file); + + FREERDP_API UINT + cliprdr_file_context_notify_new_server_format_list(CliprdrFileContext* file_context); + + FREERDP_API UINT + cliprdr_file_context_notify_new_client_format_list(CliprdrFileContext* file_context); + + /** \brief updates the files the client announces to the server + * + * \param file the file context to update + * \param data the file list + * \param count the length of the file list + * + * \return \b TRUE for success, \b FALSE otherwise + */ + FREERDP_API BOOL cliprdr_file_context_update_client_data(CliprdrFileContext* file, + const char* data, size_t count); + /** \brief updates the files the server announces to the client + * + * \param file the file context to update + * \param clip the clipboard instance to use + * \param data the file list [MS-RDPECLIP] 2.2.5.2.3 Packed File List (CLIPRDR_FILELIST) + * \param size the length of the file list + * + * \return \b TRUE for success, \b FALSE otherwise + */ + FREERDP_API BOOL cliprdr_file_context_update_server_data(CliprdrFileContext* file, + wClipboard* clip, const void* data, + size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CLIENT_X11_CLIPRDR_FILE_H */ diff --git a/include/freerdp/client/cliprdr.h b/include/freerdp/client/cliprdr.h new file mode 100644 index 0000000..5d1073b --- /dev/null +++ b/include/freerdp/client/cliprdr.h @@ -0,0 +1,201 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Clipboard Virtual Channel Extension + * + * Copyright 2011 Vic Lee + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_CLIPRDR_CLIENT_CLIPRDR_H +#define FREERDP_CHANNEL_CLIPRDR_CLIENT_CLIPRDR_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/message.h> +#include <freerdp/channels/cliprdr.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Client Interface + */ + + typedef struct s_cliprdr_client_context CliprdrClientContext; + + typedef UINT (*pcCliprdrServerCapabilities)(CliprdrClientContext* context, + const CLIPRDR_CAPABILITIES* capabilities); + typedef UINT (*pcCliprdrClientCapabilities)(CliprdrClientContext* context, + const CLIPRDR_CAPABILITIES* capabilities); + typedef UINT (*pcCliprdrMonitorReady)(CliprdrClientContext* context, + const CLIPRDR_MONITOR_READY* monitorReady); + typedef UINT (*pcCliprdrTempDirectory)(CliprdrClientContext* context, + const CLIPRDR_TEMP_DIRECTORY* tempDirectory); + typedef UINT (*pcCliprdrClientFormatList)(CliprdrClientContext* context, + const CLIPRDR_FORMAT_LIST* formatList); + typedef UINT (*pcCliprdrServerFormatList)(CliprdrClientContext* context, + const CLIPRDR_FORMAT_LIST* formatList); + typedef UINT (*pcCliprdrClientFormatListResponse)( + CliprdrClientContext* context, const CLIPRDR_FORMAT_LIST_RESPONSE* formatListResponse); + typedef UINT (*pcCliprdrServerFormatListResponse)( + CliprdrClientContext* context, const CLIPRDR_FORMAT_LIST_RESPONSE* formatListResponse); + typedef UINT (*pcCliprdrClientLockClipboardData)( + CliprdrClientContext* context, const CLIPRDR_LOCK_CLIPBOARD_DATA* lockClipboardData); + typedef UINT (*pcCliprdrServerLockClipboardData)( + CliprdrClientContext* context, const CLIPRDR_LOCK_CLIPBOARD_DATA* lockClipboardData); + typedef UINT (*pcCliprdrClientUnlockClipboardData)( + CliprdrClientContext* context, const CLIPRDR_UNLOCK_CLIPBOARD_DATA* unlockClipboardData); + typedef UINT (*pcCliprdrServerUnlockClipboardData)( + CliprdrClientContext* context, const CLIPRDR_UNLOCK_CLIPBOARD_DATA* unlockClipboardData); + typedef UINT (*pcCliprdrClientFormatDataRequest)( + CliprdrClientContext* context, const CLIPRDR_FORMAT_DATA_REQUEST* formatDataRequest); + typedef UINT (*pcCliprdrServerFormatDataRequest)( + CliprdrClientContext* context, const CLIPRDR_FORMAT_DATA_REQUEST* formatDataRequest); + typedef UINT (*pcCliprdrClientFormatDataResponse)( + CliprdrClientContext* context, const CLIPRDR_FORMAT_DATA_RESPONSE* formatDataResponse); + typedef UINT (*pcCliprdrServerFormatDataResponse)( + CliprdrClientContext* context, const CLIPRDR_FORMAT_DATA_RESPONSE* formatDataResponse); + typedef UINT (*pcCliprdrClientFileContentsRequest)( + CliprdrClientContext* context, const CLIPRDR_FILE_CONTENTS_REQUEST* fileContentsRequest); + typedef UINT (*pcCliprdrServerFileContentsRequest)( + CliprdrClientContext* context, const CLIPRDR_FILE_CONTENTS_REQUEST* fileContentsRequest); + typedef UINT (*pcCliprdrClientFileContentsResponse)( + CliprdrClientContext* context, const CLIPRDR_FILE_CONTENTS_RESPONSE* fileContentsResponse); + typedef UINT (*pcCliprdrServerFileContentsResponse)( + CliprdrClientContext* context, const CLIPRDR_FILE_CONTENTS_RESPONSE* fileContentsResponse); + + struct s_cliprdr_client_context + { + void* handle; + void* custom; + + pcCliprdrServerCapabilities ServerCapabilities; + pcCliprdrClientCapabilities ClientCapabilities; + pcCliprdrMonitorReady MonitorReady; + pcCliprdrTempDirectory TempDirectory; + pcCliprdrClientFormatList ClientFormatList; + pcCliprdrServerFormatList ServerFormatList; + pcCliprdrClientFormatListResponse ClientFormatListResponse; + pcCliprdrServerFormatListResponse ServerFormatListResponse; + pcCliprdrClientLockClipboardData ClientLockClipboardData; + pcCliprdrServerLockClipboardData ServerLockClipboardData; + pcCliprdrClientUnlockClipboardData ClientUnlockClipboardData; + pcCliprdrServerUnlockClipboardData ServerUnlockClipboardData; + pcCliprdrClientFormatDataRequest ClientFormatDataRequest; + pcCliprdrServerFormatDataRequest ServerFormatDataRequest; + pcCliprdrClientFormatDataResponse ClientFormatDataResponse; + pcCliprdrServerFormatDataResponse ServerFormatDataResponse; + pcCliprdrClientFileContentsRequest ClientFileContentsRequest; + pcCliprdrServerFileContentsRequest ServerFileContentsRequest; + pcCliprdrClientFileContentsResponse ClientFileContentsResponse; + pcCliprdrServerFileContentsResponse ServerFileContentsResponse; + + UINT32 lastRequestedFormatId; + rdpContext* rdpcontext; + }; + + typedef struct + { + UINT32 id; + char* name; + int length; + } CLIPRDR_FORMAT_NAME; + + /** + * Clipboard Events + */ + + typedef struct + { + wMessage event; + UINT32 capabilities; + } RDP_CB_CLIP_CAPS; + + typedef struct + { + wMessage event; + UINT32 capabilities; + } RDP_CB_MONITOR_READY_EVENT; + + typedef struct + { + wMessage event; + UINT32* formats; + UINT16 num_formats; + BYTE* raw_format_data; + UINT32 raw_format_data_size; + BOOL raw_format_unicode; + } RDP_CB_FORMAT_LIST_EVENT; + + typedef struct + { + wMessage event; + UINT32 format; + } RDP_CB_DATA_REQUEST_EVENT; + + typedef struct + { + wMessage event; + BYTE* data; + UINT32 size; + } RDP_CB_DATA_RESPONSE_EVENT; + + typedef struct + { + wMessage event; + UINT32 streamId; + UINT32 lindex; + UINT32 dwFlags; + UINT32 nPositionLow; + UINT32 nPositionHigh; + UINT32 cbRequested; + UINT32 clipDataId; + } RDP_CB_FILECONTENTS_REQUEST_EVENT; + + typedef struct + { + wMessage event; + BYTE* data; + UINT32 size; + UINT32 streamId; + } RDP_CB_FILECONTENTS_RESPONSE_EVENT; + + typedef struct + { + wMessage event; + UINT32 clipDataId; + } RDP_CB_LOCK_CLIPDATA_EVENT; + + typedef struct + { + wMessage event; + UINT32 clipDataId; + } RDP_CB_UNLOCK_CLIPDATA_EVENT; + + typedef struct + { + wMessage event; + char dirname[520]; + } RDP_CB_TEMPDIR_EVENT; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_CLIPRDR_CLIENT_CLIPRDR_H */ diff --git a/include/freerdp/client/cmdline.h b/include/freerdp/client/cmdline.h new file mode 100644 index 0000000..36c8499 --- /dev/null +++ b/include/freerdp/client/cmdline.h @@ -0,0 +1,103 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Client Command-Line Interface + * + * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CLIENT_CMDLINE_H +#define FREERDP_CLIENT_CMDLINE_H + +#include <winpr/cmdline.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** \brief parses command line arguments to appropriate settings values. + * + * \param settings The settings instance to store the parsed values to + * \param argc the number of argv values + * \param argv an array of strings (char pointer) + * \param allowUnknown Allow unknown command line arguments or \b FALSE if not. + * + * \return \b 0 in case of success, a negative number in case of failure. + */ + FREERDP_API int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, + int argc, char** argv, + BOOL allowUnknown); + + /** \brief parses command line arguments to appropriate settings values. Additionally allows + * supplying custom command line arguments and a handler function. + * + * \param settings The settings instance to store the parsed values to + * \param argc the number of argv values + * \param argv an array of strings (char pointer) + * \param allowUnknown Allow unknown command line arguments or \b FALSE if not. + * \param args Pointer to the custom arguments + * \param count The number of custom arguments + * \param handle_option the handler function for custom arguments. + * \param handle_userdata custom data supplied to \b handle_option as context + * + * \return \b 0 in case of success, a negative number in case of failure. + */ + FREERDP_API int freerdp_client_settings_parse_command_line_arguments_ex( + rdpSettings* settings, int argc, char** argv, BOOL allowUnknown, + COMMAND_LINE_ARGUMENT_A* args, size_t count, + int (*handle_option)(const COMMAND_LINE_ARGUMENT* arg, void* custom), + void* handle_userdata); + + FREERDP_API int freerdp_client_settings_command_line_status_print(rdpSettings* settings, + int status, int argc, + char** argv); + FREERDP_API int + freerdp_client_settings_command_line_status_print_ex(rdpSettings* settings, int status, + int argc, char** argv, + const COMMAND_LINE_ARGUMENT_A* custom); + FREERDP_API BOOL freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings); + + FREERDP_API void freerdp_client_warn_unmaintained(int argc, char* argv[]); + FREERDP_API void freerdp_client_warn_experimental(int argc, char* argv[]); + FREERDP_API void freerdp_client_warn_deprecated(int argc, char* argv[]); + + FREERDP_API BOOL freerdp_client_print_version(void); + FREERDP_API BOOL freerdp_client_print_buildconfig(void); + FREERDP_API BOOL freerdp_client_print_command_line_help(int argc, char** argv); + FREERDP_API BOOL freerdp_client_print_command_line_help_ex( + int argc, char** argv, const COMMAND_LINE_ARGUMENT_A* custom); + + FREERDP_API BOOL freerdp_parse_username(const char* username, char** user, char** domain); + FREERDP_API BOOL freerdp_parse_hostname(const char* hostname, char** host, int* port); + FREERDP_API BOOL freerdp_set_connection_type(rdpSettings* settings, UINT32 type); + + FREERDP_API BOOL freerdp_client_add_device_channel(rdpSettings* settings, size_t count, + const char** params); + FREERDP_API BOOL freerdp_client_add_static_channel(rdpSettings* settings, size_t count, + const char** params); + FREERDP_API BOOL freerdp_client_del_static_channel(rdpSettings* settings, const char* name); + FREERDP_API BOOL freerdp_client_add_dynamic_channel(rdpSettings* settings, size_t count, + const char** params); + FREERDP_API BOOL freerdp_client_del_dynamic_channel(rdpSettings* settings, const char* name); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CLIENT_CMDLINE_H */ diff --git a/include/freerdp/client/disp.h b/include/freerdp/client/disp.h new file mode 100644 index 0000000..26eff27 --- /dev/null +++ b/include/freerdp/client/disp.h @@ -0,0 +1,52 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Display Update Virtual Channel Extension + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_DISP_CLIENT_DISP_H +#define FREERDP_CHANNEL_DISP_CLIENT_DISP_H + +#include <freerdp/channels/disp.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_disp_client_context DispClientContext; + + typedef UINT (*pcDispCaps)(DispClientContext* context, UINT32 MaxNumMonitors, + UINT32 MaxMonitorAreaFactorA, UINT32 MaxMonitorAreaFactorB); + typedef UINT (*pcDispSendMonitorLayout)(DispClientContext* context, UINT32 NumMonitors, + DISPLAY_CONTROL_MONITOR_LAYOUT* Monitors); + + struct s_disp_client_context + { + void* handle; + void* custom; + + pcDispCaps DisplayControlCaps; + pcDispSendMonitorLayout SendMonitorLayout; + }; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_DISP_CLIENT_DISP_H */ diff --git a/include/freerdp/client/drdynvc.h b/include/freerdp/client/drdynvc.h new file mode 100644 index 0000000..897f9dd --- /dev/null +++ b/include/freerdp/client/drdynvc.h @@ -0,0 +1,62 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Dynamic Virtual Channel Extension + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_DRDYNVC_CLIENT_DRDYNVC_H +#define FREERDP_CHANNEL_DRDYNVC_CLIENT_DRDYNVC_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Client Interface + */ + + typedef struct s_drdynvc_client_context DrdynvcClientContext; + + typedef int (*pcDrdynvcGetVersion)(DrdynvcClientContext* context); + typedef UINT (*pcDrdynvcOnChannelConnected)(DrdynvcClientContext* context, const char* name, + void* pInterface); + typedef UINT (*pcDrdynvcOnChannelDisconnected)(DrdynvcClientContext* context, const char* name, + void* pInterface); + typedef UINT (*pcDrdynvcOnChannelAttached)(DrdynvcClientContext* context, const char* name, + void* pInterface); + typedef UINT (*pcDrdynvcOnChannelDetached)(DrdynvcClientContext* context, const char* name, + void* pInterface); + + struct s_drdynvc_client_context + { + void* handle; + void* custom; + + pcDrdynvcGetVersion GetVersion; + pcDrdynvcOnChannelConnected OnChannelConnected; + pcDrdynvcOnChannelDisconnected OnChannelDisconnected; + pcDrdynvcOnChannelAttached OnChannelAttached; + pcDrdynvcOnChannelDetached OnChannelDetached; + }; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_DRDYNVC_CLIENT_DRDYNVC_H */ diff --git a/include/freerdp/client/encomsp.h b/include/freerdp/client/encomsp.h new file mode 100644 index 0000000..005c8b3 --- /dev/null +++ b/include/freerdp/client/encomsp.h @@ -0,0 +1,88 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Multiparty Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_ENCOMSP_CLIENT_ENCOMSP_H +#define FREERDP_CHANNEL_ENCOMSP_CLIENT_ENCOMSP_H + +#include <freerdp/channels/encomsp.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Client Interface + */ + + typedef struct s_encomsp_client_context EncomspClientContext; + + typedef UINT (*pcEncomspFilterUpdated)(EncomspClientContext* context, + const ENCOMSP_FILTER_UPDATED_PDU* filterUpdated); + typedef UINT (*pcEncomspApplicationCreated)( + EncomspClientContext* context, const ENCOMSP_APPLICATION_CREATED_PDU* applicationCreated); + typedef UINT (*pcEncomspApplicationRemoved)( + EncomspClientContext* context, const ENCOMSP_APPLICATION_REMOVED_PDU* applicationRemoved); + typedef UINT (*pcEncomspWindowCreated)(EncomspClientContext* context, + const ENCOMSP_WINDOW_CREATED_PDU* windowCreated); + typedef UINT (*pcEncomspWindowRemoved)(EncomspClientContext* context, + const ENCOMSP_WINDOW_REMOVED_PDU* windowRemoved); + typedef UINT (*pcEncomspShowWindow)(EncomspClientContext* context, + const ENCOMSP_SHOW_WINDOW_PDU* showWindow); + typedef UINT (*pcEncomspParticipantCreated)( + EncomspClientContext* context, const ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated); + typedef UINT (*pcEncomspParticipantRemoved)( + EncomspClientContext* context, const ENCOMSP_PARTICIPANT_REMOVED_PDU* participantRemoved); + typedef UINT (*pcEncomspChangeParticipantControlLevel)( + EncomspClientContext* context, + const ENCOMSP_CHANGE_PARTICIPANT_CONTROL_LEVEL_PDU* changeParticipantControlLevel); + typedef UINT (*pcEncomspGraphicsStreamPaused)( + EncomspClientContext* context, + const ENCOMSP_GRAPHICS_STREAM_PAUSED_PDU* graphicsStreamPaused); + typedef UINT (*pcEncomspGraphicsStreamResumed)( + EncomspClientContext* context, + const ENCOMSP_GRAPHICS_STREAM_RESUMED_PDU* graphicsStreamResumed); + + struct s_encomsp_client_context + { + void* handle; + void* custom; + + pcEncomspFilterUpdated FilterUpdated; + pcEncomspApplicationCreated ApplicationCreated; + pcEncomspApplicationRemoved ApplicationRemoved; + pcEncomspWindowCreated WindowCreated; + pcEncomspWindowRemoved WindowRemoved; + pcEncomspShowWindow ShowWindow; + pcEncomspParticipantCreated ParticipantCreated; + pcEncomspParticipantRemoved ParticipantRemoved; + pcEncomspChangeParticipantControlLevel ChangeParticipantControlLevel; + pcEncomspGraphicsStreamPaused GraphicsStreamPaused; + pcEncomspGraphicsStreamResumed GraphicsStreamResumed; + + UINT32 participantId; + }; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_ENCOMSP_CLIENT_ENCOMSP_H */ diff --git a/include/freerdp/client/file.h b/include/freerdp/client/file.h new file mode 100644 index 0000000..30c6543 --- /dev/null +++ b/include/freerdp/client/file.h @@ -0,0 +1,82 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * .rdp file + * + * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CLIENT_RDP_FILE_H +#define FREERDP_CLIENT_RDP_FILE_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> + +/* Ignore invalid integer values */ +#define RDP_FILE_FLAG_PARSE_INT_RELAXED 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_file rdpFile; + typedef BOOL (*rdp_file_fkt_parse)(void* context, const char* key, char type, + const char* value); + + /* When using freerdp_client_parse_rdp_file_ex or freerdp_client_parse_rdp_file_buffer_ex + * set the context for the callback with this function. */ + FREERDP_API void freerdp_client_rdp_file_set_callback_context(rdpFile* file, void* context); + + FREERDP_API BOOL freerdp_client_parse_rdp_file(rdpFile* file, const char* name); + FREERDP_API BOOL freerdp_client_parse_rdp_file_ex(rdpFile* file, const char* name, + rdp_file_fkt_parse parse); + FREERDP_API BOOL freerdp_client_parse_rdp_file_buffer(rdpFile* file, const BYTE* buffer, + size_t size); + FREERDP_API BOOL freerdp_client_parse_rdp_file_buffer_ex(rdpFile* file, const BYTE* buffer, + size_t size, rdp_file_fkt_parse parse); + FREERDP_API BOOL freerdp_client_populate_settings_from_rdp_file(const rdpFile* file, + rdpSettings* settings); + + FREERDP_API BOOL freerdp_client_populate_rdp_file_from_settings(rdpFile* file, + const rdpSettings* settings); + FREERDP_API BOOL freerdp_client_write_rdp_file(const rdpFile* file, const char* name, + BOOL unicode); + FREERDP_API size_t freerdp_client_write_rdp_file_buffer(const rdpFile* file, char* buffer, + size_t size); + + FREERDP_API int freerdp_client_rdp_file_set_string_option(rdpFile* file, const char* name, + const char* value); + FREERDP_API const char* freerdp_client_rdp_file_get_string_option(const rdpFile* file, + const char* name); + + FREERDP_API int freerdp_client_rdp_file_set_integer_option(rdpFile* file, const char* name, + int value); + FREERDP_API int freerdp_client_rdp_file_get_integer_option(const rdpFile* file, + const char* name); + + FREERDP_API void freerdp_client_rdp_file_free(rdpFile* file); + + WINPR_ATTR_MALLOC(freerdp_client_rdp_file_free, 1) + FREERDP_API rdpFile* freerdp_client_rdp_file_new(void); + + WINPR_ATTR_MALLOC(freerdp_client_rdp_file_free, 1) + FREERDP_API rdpFile* freerdp_client_rdp_file_new_ex(DWORD flags); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CLIENT_RDP_FILE_H */ diff --git a/include/freerdp/client/geometry.h b/include/freerdp/client/geometry.h new file mode 100644 index 0000000..f1c4e7b --- /dev/null +++ b/include/freerdp/client/geometry.h @@ -0,0 +1,76 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Geometry tracking Virtual Channel Extension + * + * Copyright 2017 David Fort <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNELS_CLIENT_GEOMETRY_H +#define FREERDP_CHANNELS_CLIENT_GEOMETRY_H + +#include <winpr/collections.h> +#include <freerdp/api.h> +#include <freerdp/channels/geometry.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Client Interface + */ + typedef struct s_geometry_client_context GeometryClientContext; + + typedef struct S_MAPPED_GEOMETRY MAPPED_GEOMETRY; + typedef BOOL (*pcMappedGeometryAdded)(GeometryClientContext* context, + MAPPED_GEOMETRY* geometry); + typedef BOOL (*pcMappedGeometryUpdate)(MAPPED_GEOMETRY* geometry); + typedef BOOL (*pcMappedGeometryClear)(MAPPED_GEOMETRY* geometry); + + /** @brief a geometry record tracked by the geometry channel */ + struct S_MAPPED_GEOMETRY + { + volatile LONG refCounter; + UINT64 mappingId; + UINT64 topLevelId; + INT32 left, top, right, bottom; + INT32 topLevelLeft, topLevelTop, topLevelRight, topLevelBottom; + FREERDP_RGNDATA geometry; + + void* custom; + pcMappedGeometryUpdate MappedGeometryUpdate; + pcMappedGeometryClear MappedGeometryClear; + }; + + /** @brief the geometry context for client channel */ + struct s_geometry_client_context + { + wHashTable* geometries; + void* handle; + void* custom; + + pcMappedGeometryAdded MappedGeometryAdded; + UINT32 remoteVersion; + }; + + FREERDP_API void mappedGeometryRef(MAPPED_GEOMETRY* g); + FREERDP_API void mappedGeometryUnref(MAPPED_GEOMETRY* g); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNELS_CLIENT_GEOMETRY_H */ diff --git a/include/freerdp/client/printer.h b/include/freerdp/client/printer.h new file mode 100644 index 0000000..fd44345 --- /dev/null +++ b/include/freerdp/client/printer.h @@ -0,0 +1,89 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Print Virtual Channel + * + * Copyright 2010-2011 Vic Lee + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * Copyright 2016 Armin Novak <armin.novak@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_PRINTER_CLIENT_PRINTER_H +#define FREERDP_CHANNEL_PRINTER_CLIENT_PRINTER_H + +#include <freerdp/channels/rdpdr.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_printer_driver rdpPrinterDriver; + typedef struct rdp_printer rdpPrinter; + typedef struct rdp_print_job rdpPrintJob; + + typedef void (*pcReferencePrinterDriver)(rdpPrinterDriver* driver); + typedef rdpPrinter** (*pcEnumPrinters)(rdpPrinterDriver* driver); + typedef void (*pcReleaseEnumPrinters)(rdpPrinter** printers); + + typedef rdpPrinter* (*pcGetPrinter)(rdpPrinterDriver* driver, const char* name, + const char* driverName, BOOL isDefault); + typedef void (*pcReferencePrinter)(rdpPrinter* printer); + + struct rdp_printer_driver + { + pcEnumPrinters EnumPrinters; + pcReleaseEnumPrinters ReleaseEnumPrinters; + pcGetPrinter GetPrinter; + + pcReferencePrinterDriver AddRef; + pcReferencePrinterDriver ReleaseRef; + }; + + typedef rdpPrintJob* (*pcCreatePrintJob)(rdpPrinter* printer, UINT32 id); + typedef rdpPrintJob* (*pcFindPrintJob)(rdpPrinter* printer, UINT32 id); + + struct rdp_printer + { + size_t id; + char* name; + char* driver; + BOOL is_default; + + size_t references; + rdpPrinterDriver* backend; + pcCreatePrintJob CreatePrintJob; + pcFindPrintJob FindPrintJob; + pcReferencePrinter AddRef; + pcReferencePrinter ReleaseRef; + }; + + typedef UINT (*pcWritePrintJob)(rdpPrintJob* printjob, const BYTE* data, size_t size); + typedef void (*pcClosePrintJob)(rdpPrintJob* printjob); + + struct rdp_print_job + { + UINT32 id; + rdpPrinter* printer; + + pcWritePrintJob Write; + pcClosePrintJob Close; + }; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_PRINTER_CLIENT_PRINTER_H */ diff --git a/include/freerdp/client/rail.h b/include/freerdp/client/rail.h new file mode 100644 index 0000000..18582b9 --- /dev/null +++ b/include/freerdp/client/rail.h @@ -0,0 +1,143 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Applications Integrated Locally (RAIL) + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RAIL_CLIENT_RAIL_H +#define FREERDP_CHANNEL_RAIL_CLIENT_RAIL_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/rail.h> +#include <freerdp/message.h> +#include <freerdp/channels/rail.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Client Interface + */ + + typedef struct s_rail_client_context RailClientContext; + + typedef UINT (*pcRailOnOpen)(RailClientContext* context, BOOL* sendHandshake); + + typedef UINT (*pcRailClientExecute)(RailClientContext* context, const RAIL_EXEC_ORDER* exec); + typedef UINT (*pcRailClientActivate)(RailClientContext* context, + const RAIL_ACTIVATE_ORDER* activate); + typedef UINT (*pcRailClientSystemParam)(RailClientContext* context, + const RAIL_SYSPARAM_ORDER* sysparam); + typedef UINT (*pcRailServerSystemParam)(RailClientContext* context, + const RAIL_SYSPARAM_ORDER* sysparam); + typedef UINT (*pcRailClientSystemCommand)(RailClientContext* context, + const RAIL_SYSCOMMAND_ORDER* syscommand); + typedef UINT (*pcRailClientHandshake)(RailClientContext* context, + const RAIL_HANDSHAKE_ORDER* handshake); + typedef UINT (*pcRailServerHandshake)(RailClientContext* context, + const RAIL_HANDSHAKE_ORDER* handshake); + typedef UINT (*pcRailServerHandshakeEx)(RailClientContext* context, + const RAIL_HANDSHAKE_EX_ORDER* handshakeEx); + typedef UINT (*pcRailClientNotifyEvent)(RailClientContext* context, + const RAIL_NOTIFY_EVENT_ORDER* notifyEvent); + typedef UINT (*pcRailClientWindowMove)(RailClientContext* context, + const RAIL_WINDOW_MOVE_ORDER* windowMove); + typedef UINT (*pcRailServerLocalMoveSize)(RailClientContext* context, + const RAIL_LOCALMOVESIZE_ORDER* localMoveSize); + typedef UINT (*pcRailServerMinMaxInfo)(RailClientContext* context, + const RAIL_MINMAXINFO_ORDER* minMaxInfo); + typedef UINT (*pcRailClientInformation)(RailClientContext* context, + const RAIL_CLIENT_STATUS_ORDER* clientStatus); + typedef UINT (*pcRailClientSystemMenu)(RailClientContext* context, + const RAIL_SYSMENU_ORDER* sysmenu); + typedef UINT (*pcRailServerTaskBarInfo)(RailClientContext* context, + const RAIL_TASKBAR_INFO_ORDER* taskBarInfo); + typedef UINT (*pcRailClientLanguageBarInfo)(RailClientContext* context, + const RAIL_LANGBAR_INFO_ORDER* langBarInfo); + typedef UINT (*pcRailServerLanguageBarInfo)(RailClientContext* context, + const RAIL_LANGBAR_INFO_ORDER* langBarInfo); + typedef UINT (*pcRailClientLanguageIMEInfo)(RailClientContext* context, + const RAIL_LANGUAGEIME_INFO_ORDER* langImeInfo); + typedef UINT (*pcRailServerExecuteResult)(RailClientContext* context, + const RAIL_EXEC_RESULT_ORDER* execResult); + typedef UINT (*pcRailClientGetAppIdRequest)(RailClientContext* context, + const RAIL_GET_APPID_REQ_ORDER* getAppIdReq); + typedef UINT (*pcRailServerGetAppIdResponse)(RailClientContext* context, + const RAIL_GET_APPID_RESP_ORDER* getAppIdResp); + typedef UINT (*pcRailServerZOrderSync)(RailClientContext* context, + const RAIL_ZORDER_SYNC* zorder); + typedef UINT (*pcRailServerCloak)(RailClientContext* context, const RAIL_CLOAK* cloak); + typedef UINT (*pcRailClientCloak)(RailClientContext* context, const RAIL_CLOAK* cloak); + typedef UINT (*pcRailServerPowerDisplayRequest)(RailClientContext* context, + const RAIL_POWER_DISPLAY_REQUEST* power); + typedef UINT (*pcRailClientSnapArrange)(RailClientContext* context, + const RAIL_SNAP_ARRANGE* snap); + typedef UINT (*pcRailServerGetAppidResponseExtended)(RailClientContext* context, + const RAIL_GET_APPID_RESP_EX* id); + typedef UINT (*pcRailClientCompartmentInfo)(RailClientContext* context, + const RAIL_COMPARTMENT_INFO_ORDER* compartmentInfo); + typedef UINT (*pcRailClientTextScale)(RailClientContext* context, UINT32 TextScale); + typedef UINT (*pcRailClientCaretBlinkRate)(RailClientContext* context, UINT32 CaretBlinkRate); + + struct s_rail_client_context + { + void* handle; + void* custom; + + pcRailClientExecute ClientExecute; + pcRailClientActivate ClientActivate; + pcRailClientSystemParam ClientSystemParam; + pcRailServerSystemParam ServerSystemParam; + pcRailClientSystemCommand ClientSystemCommand; + pcRailClientHandshake ClientHandshake; + pcRailServerHandshake ServerHandshake; + pcRailServerHandshakeEx ServerHandshakeEx; + pcRailClientNotifyEvent ClientNotifyEvent; + pcRailClientWindowMove ClientWindowMove; + pcRailServerLocalMoveSize ServerLocalMoveSize; + pcRailServerMinMaxInfo ServerMinMaxInfo; + pcRailClientInformation ClientInformation; + pcRailClientSystemMenu ClientSystemMenu; + pcRailServerTaskBarInfo ServerTaskBarInfo; + pcRailClientLanguageBarInfo ClientLanguageBarInfo; + pcRailServerLanguageBarInfo ServerLanguageBarInfo; + pcRailClientLanguageIMEInfo ClientLanguageIMEInfo; + pcRailServerExecuteResult ServerExecuteResult; + pcRailClientGetAppIdRequest ClientGetAppIdRequest; + pcRailServerGetAppIdResponse ServerGetAppIdResponse; + pcRailServerZOrderSync ServerZOrderSync; + pcRailClientCloak ClientCloak; + pcRailServerCloak ServerCloak; + pcRailServerPowerDisplayRequest ServerPowerDisplayRequest; + pcRailClientSnapArrange ClientSnapArrange; + pcRailServerGetAppidResponseExtended ServerGetAppidResponseExtended; + pcRailClientCompartmentInfo ClientCompartmentInfo; + pcRailOnOpen OnOpen; + pcRailClientTextScale ClientTextScale; + pcRailClientCaretBlinkRate ClientCaretBlinkRate; + }; + + FREERDP_API UINT client_rail_server_start_cmd(RailClientContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RAIL_CLIENT_RAIL_H */ diff --git a/include/freerdp/client/rdpei.h b/include/freerdp/client/rdpei.h new file mode 100644 index 0000000..50624f4 --- /dev/null +++ b/include/freerdp/client/rdpei.h @@ -0,0 +1,110 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Dynamic Virtual Channel Extension + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPEI_CLIENT_RDPEI_H +#define FREERDP_CHANNEL_RDPEI_CLIENT_RDPEI_H + +#include <freerdp/channels/rdpei.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Client Interface + */ + + typedef struct s_rdpei_client_context RdpeiClientContext; + + typedef UINT32 (*pcRdpeiGetVersion)(RdpeiClientContext* context); + typedef UINT32 (*pcRdpeiGetFeatures)(RdpeiClientContext* context); + + typedef UINT (*pcRdpeiAddContact)(RdpeiClientContext* context, + const RDPINPUT_CONTACT_DATA* contact); + + typedef UINT (*pcRdpeiTouchEvent)(RdpeiClientContext* context, INT32 externalId, INT32 x, + INT32 y, INT32* contactId); + typedef UINT (*pcRdpeiTouchRawEvent)(RdpeiClientContext* context, INT32 externalId, INT32 x, + INT32 y, INT32* contactId, UINT32 contactFlags, + UINT32 fieldFlags, ...); + typedef UINT (*pcRdpeiTouchRawEventVA)(RdpeiClientContext* context, INT32 externalId, INT32 x, + INT32 y, INT32* contactId, UINT32 contactFlags, + UINT32 fieldFlags, va_list args); + + typedef UINT (*pcRdpeiAddPen)(RdpeiClientContext* context, INT32 externalId, + const RDPINPUT_PEN_CONTACT* contact); + + typedef UINT (*pcRdpeiPen)(RdpeiClientContext* context, INT32 externalId, UINT32 fieldFlags, + INT32 x, INT32 y, ...); + + typedef UINT (*pcRdpeiPenRawEvent)(RdpeiClientContext* context, INT32 externalId, + UINT32 contactFlags, UINT32 fieldFlags, INT32 x, INT32 y, + ...); + typedef UINT (*pcRdpeiPenRawEventVA)(RdpeiClientContext* context, INT32 externalId, + UINT32 contactFlags, UINT32 fieldFlags, INT32 x, INT32 y, + va_list args); + + typedef UINT (*pcRdpeiSuspendTouch)(RdpeiClientContext* context); + typedef UINT (*pcRdpeiResumeTouch)(RdpeiClientContext* context); + + struct s_rdpei_client_context + { + void* handle; + void* custom; + + pcRdpeiGetVersion GetVersion; + pcRdpeiGetFeatures GetFeatures; + + pcRdpeiAddContact AddContact; + + pcRdpeiTouchEvent TouchBegin; + pcRdpeiTouchEvent TouchUpdate; + pcRdpeiTouchEvent TouchEnd; + + pcRdpeiAddPen AddPen; + + pcRdpeiPen PenBegin; + pcRdpeiPen PenUpdate; + pcRdpeiPen PenEnd; + pcRdpeiPen PenHoverBegin; + pcRdpeiPen PenHoverUpdate; + pcRdpeiPen PenHoverCancel; + + pcRdpeiSuspendTouch SuspendTouch; + pcRdpeiResumeTouch ResumeTouch; + + pcRdpeiTouchEvent TouchCancel; + pcRdpeiTouchRawEvent TouchRawEvent; + pcRdpeiTouchRawEventVA TouchRawEventVA; + + pcRdpeiPen PenCancel; + pcRdpeiPenRawEvent PenRawEvent; + pcRdpeiPenRawEventVA PenRawEventVA; + + UINT32 clientFeaturesMask; + }; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RDPEI_CLIENT_RDPEI_H */ diff --git a/include/freerdp/client/rdpgfx.h b/include/freerdp/client/rdpgfx.h new file mode 100644 index 0000000..df9e2a7 --- /dev/null +++ b/include/freerdp/client/rdpgfx.h @@ -0,0 +1,189 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Graphics Pipeline Extension + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPGFX_CLIENT_RDPGFX_H +#define FREERDP_CHANNEL_RDPGFX_CLIENT_RDPGFX_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/codecs.h> + +#include <freerdp/channels/rdpgfx.h> +#include <freerdp/utils/profiler.h> + +#include <freerdp/cache/persistent.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Client Interface + */ + typedef struct gdi_gfx_surface gdiGfxSurface; + typedef struct s_rdpgfx_client_context RdpgfxClientContext; + + typedef UINT (*pcRdpgfxResetGraphics)(RdpgfxClientContext* context, + const RDPGFX_RESET_GRAPHICS_PDU* resetGraphics); + typedef UINT (*pcRdpgfxStartFrame)(RdpgfxClientContext* context, + const RDPGFX_START_FRAME_PDU* startFrame); + typedef UINT (*pcRdpgfxEndFrame)(RdpgfxClientContext* context, + const RDPGFX_END_FRAME_PDU* endFrame); + typedef UINT (*pcRdpgfxSurfaceCommand)(RdpgfxClientContext* context, + const RDPGFX_SURFACE_COMMAND* cmd); + typedef UINT (*pcRdpgfxDeleteEncodingContext)( + RdpgfxClientContext* context, + const RDPGFX_DELETE_ENCODING_CONTEXT_PDU* deleteEncodingContext); + typedef UINT (*pcRdpgfxCreateSurface)(RdpgfxClientContext* context, + const RDPGFX_CREATE_SURFACE_PDU* createSurface); + typedef UINT (*pcRdpgfxDeleteSurface)(RdpgfxClientContext* context, + const RDPGFX_DELETE_SURFACE_PDU* deleteSurface); + typedef UINT (*pcRdpgfxSolidFill)(RdpgfxClientContext* context, + const RDPGFX_SOLID_FILL_PDU* solidFill); + typedef UINT (*pcRdpgfxSurfaceToSurface)(RdpgfxClientContext* context, + const RDPGFX_SURFACE_TO_SURFACE_PDU* surfaceToSurface); + typedef UINT (*pcRdpgfxSurfaceToCache)(RdpgfxClientContext* context, + const RDPGFX_SURFACE_TO_CACHE_PDU* surfaceToCache); + typedef UINT (*pcRdpgfxCacheToSurface)(RdpgfxClientContext* context, + const RDPGFX_CACHE_TO_SURFACE_PDU* cacheToSurface); + typedef UINT (*pcRdpgfxCacheImportOffer)(RdpgfxClientContext* context, + const RDPGFX_CACHE_IMPORT_OFFER_PDU* cacheImportOffer); + typedef UINT (*pcRdpgfxCacheImportReply)(RdpgfxClientContext* context, + const RDPGFX_CACHE_IMPORT_REPLY_PDU* cacheImportReply); + typedef UINT (*pcRdpgfxEvictCacheEntry)(RdpgfxClientContext* context, + const RDPGFX_EVICT_CACHE_ENTRY_PDU* evictCacheEntry); + typedef UINT (*pcRdpgfxImportCacheEntry)(RdpgfxClientContext* context, UINT16 cacheSlot, + const PERSISTENT_CACHE_ENTRY* importCacheEntry); + typedef UINT (*pcRdpgfxExportCacheEntry)(RdpgfxClientContext* context, UINT16 cacheSlot, + PERSISTENT_CACHE_ENTRY* importCacheEntry); + typedef UINT (*pcRdpgfxMapSurfaceToOutput)( + RdpgfxClientContext* context, const RDPGFX_MAP_SURFACE_TO_OUTPUT_PDU* surfaceToOutput); + typedef UINT (*pcRdpgfxMapSurfaceToScaledOutput)( + RdpgfxClientContext* context, + const RDPGFX_MAP_SURFACE_TO_SCALED_OUTPUT_PDU* surfaceToOutput); + typedef UINT (*pcRdpgfxMapSurfaceToWindow)( + RdpgfxClientContext* context, const RDPGFX_MAP_SURFACE_TO_WINDOW_PDU* surfaceToWindow); + typedef UINT (*pcRdpgfxMapSurfaceToScaledWindow)( + RdpgfxClientContext* context, + const RDPGFX_MAP_SURFACE_TO_SCALED_WINDOW_PDU* surfaceToWindow); + typedef UINT (*pcRdpgfxSetSurfaceData)(RdpgfxClientContext* context, UINT16 surfaceId, + void* pData); + typedef void* (*pcRdpgfxGetSurfaceData)(RdpgfxClientContext* context, UINT16 surfaceId); + typedef UINT (*pcRdpgfxGetSurfaceIds)(RdpgfxClientContext* context, UINT16** ppSurfaceIds, + UINT16* count); + typedef UINT (*pcRdpgfxSetCacheSlotData)(RdpgfxClientContext* context, UINT16 cacheSlot, + void* pData); + typedef void* (*pcRdpgfxGetCacheSlotData)(RdpgfxClientContext* context, UINT16 cacheSlot); + + typedef UINT (*pcRdpgfxUpdateSurfaces)(RdpgfxClientContext* context); + + typedef UINT (*pcRdpgfxUpdateWindowFromSurface)(RdpgfxClientContext* context, + gdiGfxSurface* surface); + + typedef UINT (*pcRdpgfxUpdateSurfaceArea)(RdpgfxClientContext* context, UINT16 surfaceId, + UINT32 nrRects, const RECTANGLE_16* rects); + + typedef UINT (*pcRdpgfxOnOpen)(RdpgfxClientContext* context, BOOL* do_caps_advertise, + BOOL* do_frame_acks); + typedef UINT (*pcRdpgfxOnClose)(RdpgfxClientContext* context); + typedef UINT (*pcRdpgfxCapsAdvertise)(RdpgfxClientContext* context, + const RDPGFX_CAPS_ADVERTISE_PDU* capsAdvertise); + typedef UINT (*pcRdpgfxCapsConfirm)(RdpgfxClientContext* context, + const RDPGFX_CAPS_CONFIRM_PDU* capsConfirm); + typedef UINT (*pcRdpgfxFrameAcknowledge)(RdpgfxClientContext* context, + const RDPGFX_FRAME_ACKNOWLEDGE_PDU* frameAcknowledge); + typedef UINT (*pcRdpgfxQoeFrameAcknowledge)( + RdpgfxClientContext* context, const RDPGFX_QOE_FRAME_ACKNOWLEDGE_PDU* qoeFrameAcknowledge); + + typedef UINT (*pcRdpgfxMapWindowForSurface)(RdpgfxClientContext* context, UINT16 surfaceID, + UINT64 windowID); + typedef UINT (*pcRdpgfxUnmapWindowForSurface)(RdpgfxClientContext* context, UINT64 windowID); + + struct s_rdpgfx_client_context + { + void* handle; + void* custom; + + /* Implementations require locking */ + pcRdpgfxResetGraphics ResetGraphics; + pcRdpgfxStartFrame StartFrame; + pcRdpgfxEndFrame EndFrame; + pcRdpgfxSurfaceCommand SurfaceCommand; + pcRdpgfxDeleteEncodingContext DeleteEncodingContext; + pcRdpgfxCreateSurface CreateSurface; + pcRdpgfxDeleteSurface DeleteSurface; + pcRdpgfxSolidFill SolidFill; + pcRdpgfxSurfaceToSurface SurfaceToSurface; + pcRdpgfxSurfaceToCache SurfaceToCache; + pcRdpgfxCacheToSurface CacheToSurface; + pcRdpgfxCacheImportOffer CacheImportOffer; + pcRdpgfxCacheImportReply CacheImportReply; + pcRdpgfxImportCacheEntry ImportCacheEntry; + pcRdpgfxExportCacheEntry ExportCacheEntry; + pcRdpgfxEvictCacheEntry EvictCacheEntry; + pcRdpgfxMapSurfaceToOutput MapSurfaceToOutput; + pcRdpgfxMapSurfaceToScaledOutput MapSurfaceToScaledOutput; + pcRdpgfxMapSurfaceToWindow MapSurfaceToWindow; + pcRdpgfxMapSurfaceToScaledWindow MapSurfaceToScaledWindow; + + pcRdpgfxGetSurfaceIds GetSurfaceIds; + pcRdpgfxSetSurfaceData SetSurfaceData; + pcRdpgfxGetSurfaceData GetSurfaceData; + pcRdpgfxSetCacheSlotData SetCacheSlotData; + pcRdpgfxGetCacheSlotData GetCacheSlotData; + + /* Proxy callbacks */ + pcRdpgfxOnOpen OnOpen; + pcRdpgfxOnClose OnClose; + pcRdpgfxCapsAdvertise CapsAdvertise; + pcRdpgfxCapsConfirm CapsConfirm; + pcRdpgfxFrameAcknowledge FrameAcknowledge; + pcRdpgfxQoeFrameAcknowledge QoeFrameAcknowledge; + + /* No locking required */ + pcRdpgfxUpdateSurfaces UpdateSurfaces; + pcRdpgfxUpdateSurfaceArea UpdateSurfaceArea; + pcRdpgfxUpdateWindowFromSurface UpdateWindowFromSurface; + + /* These callbacks allow creating/destroying a window directly + * mapped to a surface. + * NOTE: The surface is already locked. + */ + pcRdpgfxMapWindowForSurface MapWindowForSurface; + pcRdpgfxUnmapWindowForSurface UnmapWindowForSurface; + + CRITICAL_SECTION mux; + rdpCodecs* codecs; + PROFILER_DEFINE(SurfaceProfiler) + }; + + FREERDP_API void rdpgfx_client_context_free(RdpgfxClientContext* context); + + WINPR_ATTR_MALLOC(rdpgfx_client_context_free, 1) + FREERDP_API RdpgfxClientContext* rdpgfx_client_context_new(rdpContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RDPGFX_CLIENT_RDPGFX_H */ diff --git a/include/freerdp/client/rdpsnd.h b/include/freerdp/client/rdpsnd.h new file mode 100644 index 0000000..7a77a2c --- /dev/null +++ b/include/freerdp/client/rdpsnd.h @@ -0,0 +1,90 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Audio Output Virtual Channel + * + * Copyright 2010-2011 Vic Lee + * Copyright 2012-2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPSND_CLIENT_RDPSND_H +#define FREERDP_CHANNEL_RDPSND_CLIENT_RDPSND_H + +#include <freerdp/channels/rdpsnd.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Subsystem Interface + */ + typedef struct rdpsnd_plugin rdpsndPlugin; + + typedef struct rdpsnd_device_plugin rdpsndDevicePlugin; + + typedef BOOL (*pcFormatSupported)(rdpsndDevicePlugin* device, const AUDIO_FORMAT* format); + typedef BOOL (*pcOpen)(rdpsndDevicePlugin* device, const AUDIO_FORMAT* format, UINT32 latency); + typedef UINT32 (*pcGetVolume)(rdpsndDevicePlugin* device); + typedef BOOL (*pcSetVolume)(rdpsndDevicePlugin* device, UINT32 value); + typedef UINT (*pcPlay)(rdpsndDevicePlugin* device, const BYTE* data, size_t size); + typedef UINT (*pcPlayEx)(rdpsndDevicePlugin* device, const AUDIO_FORMAT* format, + const BYTE* data, size_t size); + typedef void (*pcStart)(rdpsndDevicePlugin* device); + typedef void (*pcClose)(rdpsndDevicePlugin* device); + typedef void (*pcFree)(rdpsndDevicePlugin* device); + typedef BOOL (*pcDefaultFormat)(rdpsndDevicePlugin* device, const AUDIO_FORMAT* desired, + AUDIO_FORMAT* defaultFormat); + typedef UINT (*pcServerFormatAnnounce)(rdpsndDevicePlugin* device, const AUDIO_FORMAT* formats, + size_t count); + + struct rdpsnd_device_plugin + { + rdpsndPlugin* rdpsnd; + + pcFormatSupported FormatSupported; + pcOpen Open; + pcGetVolume GetVolume; + pcSetVolume SetVolume; + pcPlay Play; + pcStart Start; /* Deprecated, unused. */ + pcClose Close; + pcFree Free; + pcDefaultFormat DefaultFormat; + pcServerFormatAnnounce ServerFormatAnnounce; + pcPlayEx PlayEx; + }; + +#define RDPSND_DEVICE_EXPORT_FUNC_NAME "freerdp_rdpsnd_client_subsystem_entry" + +typedef void (*PREGISTERRDPSNDDEVICE)(rdpsndPlugin* rdpsnd, rdpsndDevicePlugin* device); + +typedef struct +{ + rdpsndPlugin* rdpsnd; + PREGISTERRDPSNDDEVICE pRegisterRdpsndDevice; + const ADDIN_ARGV* args; +} FREERDP_RDPSND_DEVICE_ENTRY_POINTS; +typedef FREERDP_RDPSND_DEVICE_ENTRY_POINTS* PFREERDP_RDPSND_DEVICE_ENTRY_POINTS; + +typedef UINT (*PFREERDP_RDPSND_DEVICE_ENTRY)(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints); + +FREERDP_API rdpContext* freerdp_rdpsnd_get_context(rdpsndPlugin* plugin); + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_RDPSND_CLIENT_RDPSND_H */ diff --git a/include/freerdp/client/remdesk.h b/include/freerdp/client/remdesk.h new file mode 100644 index 0000000..cc9799d --- /dev/null +++ b/include/freerdp/client/remdesk.h @@ -0,0 +1,44 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_REMDESK_CLIENT_REMDESK_H +#define FREERDP_CHANNEL_REMDESK_CLIENT_REMDESK_H + +#include <freerdp/channels/remdesk.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Client Interface + */ + + typedef struct + { + void* handle; + void* custom; + } RemdeskClientContext; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_REMDESK_CLIENT_REMDESK_H */ diff --git a/include/freerdp/client/sshagent.h b/include/freerdp/client/sshagent.h new file mode 100644 index 0000000..c3404d1 --- /dev/null +++ b/include/freerdp/client/sshagent.h @@ -0,0 +1,95 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * SSH Agent Virtual Channel Extension + * + * Copyright 2017 Ben Cohen + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_CLIENT_SSHAGENT_H +#define FREERDP_CHANNEL_CLIENT_SSHAGENT_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/message.h> +#include <freerdp/channels/cliprdr.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + int ProtocolVersion; + int MaxConnections; + } SSHAgentClientContext; + + /* + * The channel is defined by the sshagent channel in xrdp as follows. + * + * Server to client commands + * ------------------------- + * + * Capabilities (at start of channel stream): + * + * INT32 SA_TAG_CAPABILITY + * INT32 SSHAGENT_CHAN_PROT_VERSION := 1 + * INT32 SSHAGENT_MAX_CONNECTIONS + * + * Open connection: + * + * INT32 SA_TAG_OPEN + * INT32 Connection id (0, ..., SSHAGENT_MAX_CONNECTIONS - 1) + * + * Send data: + * + * INT32 SA_TAG_WRITE + * INT32 Connection id (0, ..., SSHAGENT_MAX_CONNECTIONS - 1) + * INT32 Data length + * DATA ... + * + * Close connection: + * + * INT32 SA_TAG_CLOSE + * INT32 Connection id (0, ..., SSHAGENT_MAX_CONNECTIONS - 1) + * + * Client to server commands + * ------------------------- + * + * Capabilities (in reply to server capabilities): + * + * INT32 SA_TAG_CAPABILITY + * INT32 SSHAGENT_CHAN_PROT_VERSION := 1 + * INT32 SSHAGENT_MAX_CONNECTIONS + * + * Send data: + * + * INT32 SA_TAG_WRITE + * INT32 Connection id (0, ..., SSHAGENT_MAX_CONNECTIONS - 1) + * INT32 Data length + * DATA ... + * + * Close connection (abnormal): + * + * INT32 SA_TAG_CLOSE + * INT32 Connection id (0, ..., SSHAGENT_MAX_CONNECTIONS - 1) + */ + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_CLIENT_SSHAGENT_H */ diff --git a/include/freerdp/client/tsmf.h b/include/freerdp/client/tsmf.h new file mode 100644 index 0000000..e9cff3c --- /dev/null +++ b/include/freerdp/client/tsmf.h @@ -0,0 +1,79 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Multimedia Redirection Virtual Channel Types + * + * Copyright 2011 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* DEPRECATION WARNING: + * + * This channel is unmaintained and not used since windows 7. + * Only compile and use it if absolutely necessary, otherwise + * deactivate it or use the newer [MS-RDPEVOR] video redirection. + */ + +#ifndef FREERDP_CHANNEL_TSMF_CLIENT_TSMF_H +#define FREERDP_CHANNEL_TSMF_CLIENT_TSMF_H + +#include <freerdp/codec/region.h> + +#include <freerdp/channels/tsmf.h> + +/* RDP_VIDEO_FRAME_EVENT.frame_pixfmt */ +/* http://www.fourcc.org/yuv.php */ +#define RDP_PIXFMT_I420 0x30323449 +#define RDP_PIXFMT_YV12 0x32315659 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + BYTE* frameData; + UINT32 frameSize; + UINT32 framePixFmt; + INT16 frameWidth; + INT16 frameHeight; + INT16 x; + INT16 y; + INT16 width; + INT16 height; + UINT16 numVisibleRects; + RECTANGLE_16* visibleRects; + } TSMF_VIDEO_FRAME_EVENT; + + /** + * Client Interface + */ + + typedef struct s_tsmf_client_context TsmfClientContext; + + typedef int (*pcTsmfFrameEvent)(TsmfClientContext* context, TSMF_VIDEO_FRAME_EVENT* event); + + struct s_tsmf_client_context + { + void* handle; + void* custom; + + pcTsmfFrameEvent FrameEvent; + }; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_TSMF_CLIENT_TSMF_H */ diff --git a/include/freerdp/client/utils/smartcard_cli.h b/include/freerdp/client/utils/smartcard_cli.h new file mode 100644 index 0000000..4aec92b --- /dev/null +++ b/include/freerdp/client/utils/smartcard_cli.h @@ -0,0 +1,37 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Smartcard client functions + * + * Copyright 2021 David Fort <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UTILS_SMARTCARD_CLI_H__ +#define UTILS_SMARTCARD_CLI_H__ + +#include <freerdp/api.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + FREERDP_API BOOL freerdp_smartcard_list(const rdpSettings* settings); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* UTILS_SMARTCARD_CLI_H__ */ diff --git a/include/freerdp/client/video.h b/include/freerdp/client/video.h new file mode 100644 index 0000000..e520e98 --- /dev/null +++ b/include/freerdp/client/video.h @@ -0,0 +1,74 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Video Optimized Remoting Virtual Channel Extension + * + * Copyright 2017 David Fort <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNELS_CLIENT_VIDEO_H +#define FREERDP_CHANNELS_CLIENT_VIDEO_H + +#include <freerdp/client/geometry.h> +#include <freerdp/channels/video.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_VideoClientContext VideoClientContext; + typedef struct s_VideoClientContextPriv VideoClientContextPriv; + + /** @brief an implementation of surface used by the video channel */ + typedef struct + { + UINT32 x, y, w, h; + UINT32 alignedWidth, alignedHeight; + BYTE* data; + DWORD format; + UINT32 scanline; + } VideoSurface; + + typedef void (*pcVideoTimer)(VideoClientContext* video, UINT64 now); + typedef void (*pcVideoSetGeometry)(VideoClientContext* video, GeometryClientContext* geometry); + typedef VideoSurface* (*pcVideoCreateSurface)(VideoClientContext* video, UINT32 x, UINT32 y, + UINT32 width, UINT32 height); + typedef BOOL (*pcVideoShowSurface)(VideoClientContext* video, const VideoSurface* surface, + UINT32 destinationWidth, UINT32 destinationHeight); + typedef BOOL (*pcVideoDeleteSurface)(VideoClientContext* video, VideoSurface* surface); + + /** @brief context for the video (MS-RDPEVOR) channel */ + struct s_VideoClientContext + { + void* handle; + void* custom; + VideoClientContextPriv* priv; + + pcVideoSetGeometry setGeometry; + pcVideoTimer timer; + pcVideoCreateSurface createSurface; + pcVideoShowSurface showSurface; + pcVideoDeleteSurface deleteSurface; + }; + + FREERDP_API VideoSurface* VideoClient_CreateCommonContext(size_t size, UINT32 x, UINT32 y, + UINT32 w, UINT32 h); + FREERDP_API void VideoClient_DestroyCommonContext(VideoSurface* surface); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNELS_CLIENT_VIDEO_H */ diff --git a/include/freerdp/codec/audio.h b/include/freerdp/codec/audio.h new file mode 100644 index 0000000..08be77d --- /dev/null +++ b/include/freerdp/codec/audio.h @@ -0,0 +1,228 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Audio Formats + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_AUDIO_H +#define FREERDP_CODEC_AUDIO_H + +#include <winpr/wlog.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + struct AUDIO_FORMAT + { + UINT16 wFormatTag; + UINT16 nChannels; + UINT32 nSamplesPerSec; + UINT32 nAvgBytesPerSec; + UINT16 nBlockAlign; + UINT16 wBitsPerSample; + UINT16 cbSize; + BYTE* data; + }; + typedef struct AUDIO_FORMAT AUDIO_FORMAT; + +#define SNDC_CLOSE 1 +#define SNDC_WAVE 2 +#define SNDC_SETVOLUME 3 +#define SNDC_SETPITCH 4 +#define SNDC_WAVECONFIRM 5 +#define SNDC_TRAINING 6 +#define SNDC_FORMATS 7 +#define SNDC_CRYPTKEY 8 +#define SNDC_WAVEENCRYPT 9 +#define SNDC_UDPWAVE 10 +#define SNDC_UDPWAVELAST 11 +#define SNDC_QUALITYMODE 12 +#define SNDC_WAVE2 13 + +#define TSSNDCAPS_ALIVE 1 +#define TSSNDCAPS_VOLUME 2 +#define TSSNDCAPS_PITCH 4 + +#define DYNAMIC_QUALITY 0x0000 +#define MEDIUM_QUALITY 0x0001 +#define HIGH_QUALITY 0x0002 + + /* + * Format Tags: + * http://tools.ietf.org/html/rfc2361 + */ + +#ifndef WAVE_FORMAT_UNKNOWN +#define WAVE_FORMAT_UNKNOWN 0x0000 +#endif /* !WAVE_FORMAT_UNKNOWN */ + +#ifndef WAVE_FORMAT_PCM +#define WAVE_FORMAT_PCM 0x0001 +#endif /* !WAVE_FORMAT_PCM */ + +#ifndef WAVE_FORMAT_ADPCM +#define WAVE_FORMAT_ADPCM 0x0002 +#define WAVE_FORMAT_IEEE_FLOAT 0x0003 +#define WAVE_FORMAT_VSELP 0x0004 +#define WAVE_FORMAT_IBM_CVSD 0x0005 +#define WAVE_FORMAT_ALAW 0x0006 +#define WAVE_FORMAT_MULAW 0x0007 +#define WAVE_FORMAT_OKI_ADPCM 0x0010 +#define WAVE_FORMAT_DVI_ADPCM 0x0011 +#define WAVE_FORMAT_MEDIASPACE_ADPCM 0x0012 +#define WAVE_FORMAT_SIERRA_ADPCM 0x0013 +#define WAVE_FORMAT_G723_ADPCM 0x0014 +#define WAVE_FORMAT_DIGISTD 0x0015 +#define WAVE_FORMAT_DIGIFIX 0x0016 +#define WAVE_FORMAT_DIALOGIC_OKI_ADPCM 0x0017 +#define WAVE_FORMAT_MEDIAVISION_ADPCM 0x0018 +#define WAVE_FORMAT_CU_CODEC 0x0019 +#define WAVE_FORMAT_YAMAHA_ADPCM 0x0020 +#define WAVE_FORMAT_SONARC 0x0021 +#define WAVE_FORMAT_DSPGROUP_TRUESPEECH 0x0022 +#define WAVE_FORMAT_ECHOSC1 0x0023 +#define WAVE_FORMAT_AUDIOFILE_AF36 0x0024 +#define WAVE_FORMAT_APTX 0x0025 +#define WAVE_FORMAT_AUDIOFILE_AF10 0x0026 +#define WAVE_FORMAT_PROSODY_1612 0x0027 +#define WAVE_FORMAT_LRC 0x0028 +#define WAVE_FORMAT_DOLBY_AC2 0x0030 +#define WAVE_FORMAT_GSM610 0x0031 +#define WAVE_FORMAT_MSNAUDIO 0x0032 +#define WAVE_FORMAT_ANTEX_ADPCME 0x0033 +#define WAVE_FORMAT_CONTROL_RES_VQLPC 0x0034 +#define WAVE_FORMAT_DIGIREAL 0x0035 +#define WAVE_FORMAT_DIGIADPCM 0x0036 +#define WAVE_FORMAT_CONTROL_RES_CR10 0x0037 +#define WAVE_FORMAT_NMS_VBXADPCM 0x0038 +#define WAVE_FORMAT_ROLAND_RDAC 0x0039 +#define WAVE_FORMAT_ECHOSC3 0x003A +#define WAVE_FORMAT_ROCKWELL_ADPCM 0x003B +#define WAVE_FORMAT_ROCKWELL_DIGITALK 0x003C +#define WAVE_FORMAT_XEBEC 0x003D +#define WAVE_FORMAT_G721_ADPCM 0x0040 +#define WAVE_FORMAT_G728_CELP 0x0041 +#define WAVE_FORMAT_MSG723 0x0042 +#define WAVE_FORMAT_MPEG 0x0050 +#define WAVE_FORMAT_RT24 0x0052 +#define WAVE_FORMAT_PAC 0x0053 +#endif /* !WAVE_FORMAT_ADPCM */ + +#ifndef WAVE_FORMAT_MPEGLAYER3 +#define WAVE_FORMAT_MPEGLAYER3 0x0055 +#endif + +#ifndef WAVE_FORMAT_LUCENT_G723 +#define WAVE_FORMAT_LUCENT_G723 0x0059 +#define WAVE_FORMAT_CIRRUS 0x0060 +#define WAVE_FORMAT_ESPCM 0x0061 +#define WAVE_FORMAT_VOXWARE 0x0062 +#define WAVE_FORMAT_CANOPUS_ATRAC 0x0063 +#define WAVE_FORMAT_G726_ADPCM 0x0064 +#define WAVE_FORMAT_G722_ADPCM 0x0065 +#define WAVE_FORMAT_DSAT 0x0066 +#define WAVE_FORMAT_DSAT_DISPLAY 0x0067 +#define WAVE_FORMAT_VOXWARE_BYTE_ALIGNED 0x0069 +#define WAVE_FORMAT_VOXWARE_AC8 0x0070 +#define WAVE_FORMAT_VOXWARE_AC10 0x0071 +#define WAVE_FORMAT_VOXWARE_AC16 0x0072 +#define WAVE_FORMAT_VOXWARE_AC20 0x0073 +#define WAVE_FORMAT_VOXWARE_RT24 0x0074 +#define WAVE_FORMAT_VOXWARE_RT29 0x0075 +#define WAVE_FORMAT_VOXWARE_RT29HW 0x0076 +#define WAVE_FORMAT_VOXWARE_VR12 0x0077 +#define WAVE_FORMAT_VOXWARE_VR18 0x0078 +#define WAVE_FORMAT_VOXWARE_TQ40 0x0079 +#define WAVE_FORMAT_SOFTSOUND 0x0080 +#define WAVE_FORMAT_VOXWARE_TQ60 0x0081 +#define WAVE_FORMAT_MSRT24 0x0082 +#define WAVE_FORMAT_G729A 0x0083 +#define WAVE_FORMAT_MVI_MV12 0x0084 +#define WAVE_FORMAT_DF_G726 0x0085 +#define WAVE_FORMAT_DF_GSM610 0x0086 +#define WAVE_FORMAT_ISIAUDIO 0x0088 +#define WAVE_FORMAT_ONLIVE 0x0089 +#define WAVE_FORMAT_SBC24 0x0091 +#define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092 +#define WAVE_FORMAT_ZYXEL_ADPCM 0x0097 +#define WAVE_FORMAT_PHILIPS_LPCBB 0x0098 +#define WAVE_FORMAT_PACKED 0x0099 +#define WAVE_FORMAT_RHETOREX_ADPCM 0x0100 +#define WAVE_FORMAT_IRAT 0x0101 +#define WAVE_FORMAT_VIVO_G723 0x0111 +#define WAVE_FORMAT_VIVO_SIREN 0x0112 +#define WAVE_FORMAT_DIGITAL_G723 0x0123 +#define WAVE_FORMAT_WMAUDIO2 0x0161 +#define WAVE_FORMAT_WMAUDIO3 0x0162 +#define WAVE_FORMAT_WMAUDIO_LOSSLESS 0x0163 +#define WAVE_FORMAT_CREATIVE_ADPCM 0x0200 +#define WAVE_FORMAT_CREATIVE_FASTSPEECH8 0x0202 +#define WAVE_FORMAT_CREATIVE_FASTSPEECH10 0x0203 +#define WAVE_FORMAT_QUARTERDECK 0x0220 +#define WAVE_FORMAT_FM_TOWNS_SND 0x0300 +#define WAVE_FORMAT_BTV_DIGITAL 0x0400 +#define WAVE_FORMAT_VME_VMPCM 0x0680 +#define WAVE_FORMAT_OLIGSM 0x1000 +#define WAVE_FORMAT_OLIADPCM 0x1001 +#define WAVE_FORMAT_OLICELP 0x1002 +#define WAVE_FORMAT_OLISBC 0x1003 +#define WAVE_FORMAT_OLIOPR 0x1004 +#define WAVE_FORMAT_LH_CODEC 0x1100 +#define WAVE_FORMAT_NORRIS 0x1400 +#define WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS 0x1500 +#define WAVE_FORMAT_DVM 0x2000 +#endif /* !WAVE_FORMAT_LUCENT_G723 */ +#define WAVE_FORMAT_OPUS 0x704F +#define WAVE_FORMAT_AAC_MS 0xA106 + +#define WAVE_FORMAT_EXTENSIBLE 0xFFFE + + /** + * Audio Format Functions + */ + + FREERDP_API UINT32 audio_format_compute_time_length(const AUDIO_FORMAT* format, size_t size); + + FREERDP_API char* audio_format_get_tag_string(UINT16 wFormatTag); + + FREERDP_API void audio_format_print(wLog* log, DWORD level, const AUDIO_FORMAT* format); + FREERDP_API void audio_formats_print(wLog* log, DWORD level, const AUDIO_FORMAT* formats, + UINT16 count); + + FREERDP_API BOOL audio_format_read(wStream* s, AUDIO_FORMAT* format); + FREERDP_API BOOL audio_format_write(wStream* s, const AUDIO_FORMAT* format); + FREERDP_API BOOL audio_format_copy(const AUDIO_FORMAT* srcFormat, AUDIO_FORMAT* dstFormat); + FREERDP_API BOOL audio_format_compatible(const AUDIO_FORMAT* with, const AUDIO_FORMAT* what); + + FREERDP_API void audio_format_free(AUDIO_FORMAT* format); + FREERDP_API void audio_formats_free(AUDIO_FORMAT* formats, size_t count); + + WINPR_ATTR_MALLOC(audio_formats_free, 1) + FREERDP_API AUDIO_FORMAT* audio_format_new(void); + + WINPR_ATTR_MALLOC(audio_formats_free, 1) + FREERDP_API AUDIO_FORMAT* audio_formats_new(size_t count); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_AUDIO_H */ diff --git a/include/freerdp/codec/bitmap.h b/include/freerdp/codec/bitmap.h new file mode 100644 index 0000000..d64bbef --- /dev/null +++ b/include/freerdp/codec/bitmap.h @@ -0,0 +1,44 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Compressed Bitmap + * + * Copyright 2011 Jay Sorg <jay.sorg@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_BITMAP_H +#define FREERDP_CODEC_BITMAP_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/codec/color.h> + +#include <winpr/crt.h> +#include <winpr/stream.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API SSIZE_T freerdp_bitmap_compress(const void* in_data, UINT32 width, UINT32 height, + wStream* s, UINT32 bpp, UINT32 byte_limit, + UINT32 start_line, wStream* temp_s, UINT32 e); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_BITMAP_H */ diff --git a/include/freerdp/codec/bulk.h b/include/freerdp/codec/bulk.h new file mode 100644 index 0000000..6f20c80 --- /dev/null +++ b/include/freerdp/codec/bulk.h @@ -0,0 +1,39 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Bulk Data Compression + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_BULK_H +#define FREERDP_CODEC_BULK_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +/* Level-2 Compression Flags */ + +#define PACKET_COMPRESSED 0x20 +#define PACKET_AT_FRONT 0x40 +#define PACKET_FLUSHED 0x80 + +/* Level-1 Compression Flags */ + +#define L1_PACKET_AT_FRONT 0x04 +#define L1_NO_COMPRESSION 0x02 +#define L1_COMPRESSED 0x01 +#define L1_INNER_COMPRESSION 0x10 + +#endif /* FREERDP_CODEC_BULK_H */ diff --git a/include/freerdp/codec/clear.h b/include/freerdp/codec/clear.h new file mode 100644 index 0000000..4f6ab2a --- /dev/null +++ b/include/freerdp/codec/clear.h @@ -0,0 +1,56 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * ClearCodec Bitmap Compression + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_CLEAR_H +#define FREERDP_CODEC_CLEAR_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/codec/nsc.h> +#include <freerdp/codec/color.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_CLEAR_CONTEXT CLEAR_CONTEXT; + + FREERDP_API int clear_compress(CLEAR_CONTEXT* clear, const BYTE* pSrcData, UINT32 SrcSize, + BYTE** ppDstData, UINT32* pDstSize); + + FREERDP_API INT32 clear_decompress(CLEAR_CONTEXT* clear, const BYTE* pSrcData, UINT32 SrcSize, + UINT32 nWidth, UINT32 nHeight, BYTE* pDstData, + UINT32 DstFormat, UINT32 nDstStep, UINT32 nXDst, + UINT32 nYDst, UINT32 nDstWidth, UINT32 nDstHeight, + const gdiPalette* palette); + + FREERDP_API BOOL clear_context_reset(CLEAR_CONTEXT* clear); + + FREERDP_API void clear_context_free(CLEAR_CONTEXT* clear); + + WINPR_ATTR_MALLOC(clear_context_free, 1) + FREERDP_API CLEAR_CONTEXT* clear_context_new(BOOL Compressor); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_CLEAR_H */ diff --git a/include/freerdp/codec/color.h b/include/freerdp/codec/color.h new file mode 100644 index 0000000..10b35ef --- /dev/null +++ b/include/freerdp/codec/color.h @@ -0,0 +1,428 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Color Conversion Routines + * + * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2016 Armin Novak <armin.novak@thincast.com> + * Copyright 2016 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_COLOR_H +#define FREERDP_CODEC_COLOR_H + +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define FREERDP_PIXEL_FORMAT_TYPE_A 0 +#define FREERDP_PIXEL_FORMAT_TYPE_ARGB 1 +#define FREERDP_PIXEL_FORMAT_TYPE_ABGR 2 +#define FREERDP_PIXEL_FORMAT_TYPE_RGBA 3 +#define FREERDP_PIXEL_FORMAT_TYPE_BGRA 4 + +#define FREERDP_PIXEL_FORMAT_IS_ABGR(_format) \ + (FREERDP_PIXEL_FORMAT_TYPE(_format) == FREERDP_PIXEL_FORMAT_TYPE_ABGR) + +enum FREERDP_IMAGE_FLAGS +{ + FREERDP_FLIP_NONE = 0, + FREERDP_FLIP_VERTICAL = 1, + FREERDP_FLIP_HORIZONTAL = 2, + FREERDP_KEEP_DST_ALPHA = 4 +}; + +#define FREERDP_PIXEL_FORMAT(_bpp, _type, _a, _r, _g, _b) \ + ((_bpp << 24) | (_type << 16) | (_a << 12) | (_r << 8) | (_g << 4) | (_b)) + +#define FREERDP_PIXEL_FORMAT_TYPE(_format) (((_format) >> 16) & 0x07) + +/*** Design considerations + * + * The format naming scheme is based on byte position in memory. + * RGBA for example names a byte array with red on positon 0, green on 1 etc. + * + * To read and write the appropriate format from / to memory use FreeRDPReadColor and + * FreeRDPWriteColor. + * + * The single pixel manipulation functions use an intermediate integer representation + * that must not be interpreted outside the functions as it is platform dependent. + * + * X for alpha channel denotes unused (but existing) alpha channel data. + */ + +/* 32bpp formats */ +#define PIXEL_FORMAT_ARGB32 FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 8, 8, 8, 8) +#define PIXEL_FORMAT_XRGB32 FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 0, 8, 8, 8) +#define PIXEL_FORMAT_ABGR32 FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 8, 8, 8, 8) +#define PIXEL_FORMAT_XBGR32 FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 0, 8, 8, 8) +#define PIXEL_FORMAT_BGRA32 FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_BGRA, 8, 8, 8, 8) +#define PIXEL_FORMAT_BGRX32 FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_BGRA, 0, 8, 8, 8) +#define PIXEL_FORMAT_RGBA32 FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_RGBA, 8, 8, 8, 8) +#define PIXEL_FORMAT_RGBX32 FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_RGBA, 0, 8, 8, 8) +#define PIXEL_FORMAT_BGRX32_DEPTH30 \ + FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_BGRA, 0, 10, 10, 10) +#define PIXEL_FORMAT_RGBX32_DEPTH30 \ + FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_RGBA, 0, 10, 10, 10) + +/* 24bpp formats */ +#define PIXEL_FORMAT_RGB24 FREERDP_PIXEL_FORMAT(24, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 0, 8, 8, 8) +#define PIXEL_FORMAT_BGR24 FREERDP_PIXEL_FORMAT(24, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 0, 8, 8, 8) + +/* 16bpp formats */ +#define PIXEL_FORMAT_RGB16 FREERDP_PIXEL_FORMAT(16, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 0, 5, 6, 5) +#define PIXEL_FORMAT_BGR16 FREERDP_PIXEL_FORMAT(16, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 0, 5, 6, 5) +#define PIXEL_FORMAT_ARGB15 FREERDP_PIXEL_FORMAT(16, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 1, 5, 5, 5) +#define PIXEL_FORMAT_RGB15 FREERDP_PIXEL_FORMAT(15, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 0, 5, 5, 5) +#define PIXEL_FORMAT_ABGR15 FREERDP_PIXEL_FORMAT(16, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 1, 5, 5, 5) +#define PIXEL_FORMAT_BGR15 FREERDP_PIXEL_FORMAT(15, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 0, 5, 5, 5) + +/* 8bpp formats */ +#define PIXEL_FORMAT_RGB8 FREERDP_PIXEL_FORMAT(8, FREERDP_PIXEL_FORMAT_TYPE_A, 8, 0, 0, 0) + +/* 4 bpp formats */ +#define PIXEL_FORMAT_A4 FREERDP_PIXEL_FORMAT(4, FREERDP_PIXEL_FORMAT_TYPE_A, 4, 0, 0, 0) + +/* 1bpp formats */ +#define PIXEL_FORMAT_MONO FREERDP_PIXEL_FORMAT(1, FREERDP_PIXEL_FORMAT_TYPE_A, 1, 0, 0, 0) + +struct gdi_palette +{ + UINT32 format; + UINT32 palette[256]; +}; +typedef struct gdi_palette gdiPalette; + + /* Compare two color formats but ignore differences in alpha channel. + */ + FREERDP_API DWORD FreeRDPAreColorFormatsEqualNoAlpha(DWORD first, DWORD second); + + /* Color Space Conversions: http://msdn.microsoft.com/en-us/library/ff566496/ */ + + /*** + * + * Get a string representation of a color + * + * @param format The pixel color format + * + * @return A string representation of format + */ +#if defined(WITH_FREERDP_DEPRECATED) +#define GetColorFormatName(...) FreeRDPGetColorFormatName(__VA_ARGS__) +#endif + FREERDP_API const char* FreeRDPGetColorFormatName(UINT32 format); + + /*** + * + * Converts a pixel color in internal representation to its red, green, blue + * and alpha components. + * + * @param color The color in format internal representation + * @param format one of PIXEL_FORMAT_* color format defines + * @param _r red color value + * @param _g green color value + * @param _b blue color value + * @param _a alpha color value + * @param palette pallete to use (only used for 8 bit color!) + */ +#if defined(WITH_FREERDP_DEPRECATED) +#define SplitColor(...) FreeRDPSplitColor(__VA_ARGS__) +#endif + FREERDP_API void FreeRDPSplitColor(UINT32 color, UINT32 format, BYTE* _r, BYTE* _g, BYTE* _b, + BYTE* _a, const gdiPalette* palette); + + /*** + * + * Converts red, green, blue and alpha values to internal representation. + * + * @param format one of PIXEL_FORMAT_* color format defines + * @param r red color value + * @param g green color value + * @param b blue color value + * @param a alpha color value + * + * @return The pixel color in the desired format. Value is in internal + * representation. + */ +#if defined(WITH_FREERDP_DEPRECATED) +#define GetColor(...) FreeRDPGetColor(__VA_ARGS__) +#endif + FREERDP_API UINT32 FreeRDPGetColor(UINT32 format, BYTE r, BYTE g, BYTE b, BYTE a); + + /*** + * + * Returns the number of bits the format format uses. + * + * @param format One of PIXEL_FORMAT_* defines + * + * @return The number of bits the format requires per pixel. + */ +#if defined(WITH_FREERDP_DEPRECATED) +#define GetBitsPerPixel(...) FreeRDPGetBitsPerPixel(__VA_ARGS__) +#endif + static INLINE UINT32 FreeRDPGetBitsPerPixel(UINT32 format) + { + return (((format) >> 24) & 0x3F); + } + + /*** + * @param format one of PIXEL_FORMAT_* color format defines + * + * @return TRUE if the format has an alpha channel, FALSE otherwise. + */ +#if defined(WITH_FREERDP_DEPRECATED) +#define ColorHasAlpha(...) FreeRDPColorHasAlpha(__VA_ARGS__) +#endif + static INLINE BOOL FreeRDPColorHasAlpha(UINT32 format) + { + UINT32 alpha = (((format) >> 12) & 0x0F); + + if (alpha == 0) + return FALSE; + + return TRUE; + } + + /*** + * + * Read a pixel from memory to internal representation + * + * @param src The source buffer + * @param format The PIXEL_FORMAT_* define the source buffer uses for encoding + * + * @return The pixel color in internal representation + */ +#if defined(WITH_FREERDP_DEPRECATED) +#define ReadColor(...) FreeRDPReadColor(__VA_ARGS__) +#endif + FREERDP_API UINT32 FreeRDPReadColor(const BYTE* WINPR_RESTRICT src, UINT32 format); + + /*** + * + * Write a pixel from internal representation to memory + * + * @param dst The destination buffer + * @param format The PIXEL_FORMAT_* define for encoding + * @param color The pixel color in internal representation + * + * @return TRUE if successful, FALSE otherwise + */ +#if defined(WITH_FREERDP_DEPRECATED) +#define WriteColor(...) FreeRDPWriteColor(__VA_ARGS__) +#define WriteColorIgnoreAlpha(...) FreeRDPWriteColorIgnoreAlpha(__VA_ARGS__) +#endif + FREERDP_API BOOL FreeRDPWriteColor(BYTE* WINPR_RESTRICT dst, UINT32 format, UINT32 color); + FREERDP_API BOOL FreeRDPWriteColorIgnoreAlpha(BYTE* WINPR_RESTRICT dst, UINT32 format, + UINT32 color); + + /*** + * + * Converts a pixel in internal representation format srcFormat to internal + * representation format dstFormat + * + * @param color The pixel color in srcFormat representation + * @param srcFormat The PIXEL_FORMAT_* of color + * @param dstFormat The PIXEL_FORMAT_* of the return. + * @param palette pallete to use (only used for 8 bit color!) + * + * @return The converted pixel color in dstFormat representation + */ +#if defined(WITH_FREERDP_DEPRECATED) +#define ConvertColor(...) FreeRDPConvertColor(__VA_ARGS__) +#endif + static INLINE UINT32 FreeRDPConvertColor(UINT32 color, UINT32 srcFormat, UINT32 dstFormat, + const gdiPalette* palette) + { + BYTE r = 0; + BYTE g = 0; + BYTE b = 0; + BYTE a = 0; + FreeRDPSplitColor(color, srcFormat, &r, &g, &b, &a, palette); + return FreeRDPGetColor(dstFormat, r, g, b, a); + } + + /*** + * + * Returns the number of bytes the format format uses. + * + * @param format One of PIXEL_FORMAT_* defines + * + * @return The number of bytes the format requires per pixel. + */ +#if defined(WITH_FREERDP_DEPRECATED) +#define GetBytesPerPixel(...) FreeRDPGetBytesPerPixel(__VA_ARGS__) +#endif + static INLINE UINT32 FreeRDPGetBytesPerPixel(UINT32 format) + { + return (FreeRDPGetBitsPerPixel(format) + 7) / 8; + } + + /*** + * + * @param width width to copy in pixels + * @param height height to copy in pixels + * @param data source buffer, must be (nWidth + 7) / 8 bytes long + * + * @return A buffer allocated with winpr_aligned_malloc(width * height, 16) + * if successful, NULL otherwise. + */ + FREERDP_API BYTE* freerdp_glyph_convert(UINT32 width, UINT32 height, const BYTE* data); + + /*** + * + * @param pDstData destination buffer + * @param DstFormat destination buffer format + * @param nDstStep destination buffer stride (line in bytes) 0 for default + * @param nXDst destination buffer offset x + * @param nYDst destination buffer offset y + * @param nWidth width to copy in pixels + * @param nHeight height to copy in pixels + * @param pSrcData source buffer, must be (nWidth + 7) / 8 bytes long + * @param backColor The background color in internal representation format + * @param foreColor The foreground color in internal representation format + * @param palette palette to use (only used for 8 bit color!) + * + * @return TRUE if success, FALSE otherwise + */ + FREERDP_API BOOL freerdp_image_copy_from_monochrome( + BYTE* WINPR_RESTRICT pDstData, UINT32 DstFormat, UINT32 nDstStep, UINT32 nXDst, + UINT32 nYDst, UINT32 nWidth, UINT32 nHeight, const BYTE* WINPR_RESTRICT pSrcData, + UINT32 backColor, UINT32 foreColor, const gdiPalette* WINPR_RESTRICT palette); + + /*** + * + * @param pDstData destination buffer + * @param DstFormat destination buffer format + * @param nDstStep destination buffer stride (line in bytes) 0 for default + * @param nXDst destination buffer offset x + * @param nYDst destination buffer offset y + * @param nWidth width to copy in pixels + * @param nHeight height to copy in pixels + * @param bitsColor icon's image data buffer + * @param cbBitsColor length of the image data buffer in bytes + * @param bitsMask icon's 1bpp image mask buffer + * @param cbBitsMask length of the image mask buffer in bytes + * @param colorTable icon's image color table + * @param cbColorTable length of the image color table buffer in bytes + * @param bpp color image data bits per pixel + * + * @return TRUE if success, FALSE otherwise + */ + FREERDP_API BOOL freerdp_image_copy_from_icon_data( + BYTE* WINPR_RESTRICT pDstData, UINT32 DstFormat, UINT32 nDstStep, UINT32 nXDst, + UINT32 nYDst, UINT16 nWidth, UINT16 nHeight, const BYTE* WINPR_RESTRICT bitsColor, + UINT16 cbBitsColor, const BYTE* WINPR_RESTRICT bitsMask, UINT16 cbBitsMask, + const BYTE* WINPR_RESTRICT colorTable, UINT16 cbColorTable, UINT32 bpp); + + /*** + * + * @param pDstData destination buffer + * @param DstFormat destination buffer format + * @param nDstStep destination buffer stride (line in bytes) 0 for default + * @param nXDst destination buffer offset x + * @param nYDst destination buffer offset y + * @param nWidth width to copy in pixels + * @param nHeight height to copy in pixels + * @param xorMask XOR mask buffer + * @param xorMaskLength XOR mask length in bytes + * @param andMask AND mask buffer + * @param andMaskLength AND mask length in bytes + * @param xorBpp XOR bits per pixel + * @param palette palette to use (only used for 8 bit color!) + * + * @return TRUE if success, FALSE otherwise + */ + FREERDP_API BOOL freerdp_image_copy_from_pointer_data( + BYTE* WINPR_RESTRICT pDstData, UINT32 DstFormat, UINT32 nDstStep, UINT32 nXDst, + UINT32 nYDst, UINT32 nWidth, UINT32 nHeight, const BYTE* WINPR_RESTRICT xorMask, + UINT32 xorMaskLength, const BYTE* WINPR_RESTRICT andMask, UINT32 andMaskLength, + UINT32 xorBpp, const gdiPalette* WINPR_RESTRICT palette); + + /*** + * + * @param pDstData destination buffer + * @param DstFormat destination buffer format + * @param nDstStep destination buffer stride (line in bytes) 0 for default + * @param nXDst destination buffer offset x + * @param nYDst destination buffer offset y + * @param nWidth width to copy in pixels + * @param nHeight height to copy in pixels + * @param pSrcData source buffer + * @param SrcFormat source buffer format + * @param nSrcStep source buffer stride (line in bytes) 0 for default + * @param nXSrc source buffer x offset in pixels + * @param nYSrc source buffer y offset in pixels + * @param palette palette to use (only used for 8 bit color!) + * @param flags Image flipping flags FREERDP_FLIP_NONE et al + * + * @return TRUE if success, FALSE otherwise + */ + FREERDP_API BOOL freerdp_image_copy(BYTE* pDstData, DWORD DstFormat, UINT32 nDstStep, + UINT32 nXDst, UINT32 nYDst, UINT32 nWidth, UINT32 nHeight, + const BYTE* pSrcData, DWORD SrcFormat, UINT32 nSrcStep, + UINT32 nXSrc, UINT32 nYSrc, const gdiPalette* palette, + UINT32 flags); + + /*** + * + * @param pDstData destination buffer + * @param DstFormat destination buffer format + * @param nDstStep destination buffer stride (line in bytes) 0 for default + * @param nXDst destination buffer offset x + * @param nYDst destination buffer offset y + * @param nDstWidth width of destination in pixels + * @param nDstHeight height of destination in pixels + * @param pSrcData source buffer + * @param SrcFormat source buffer format + * @param nSrcStep source buffer stride (line in bytes) 0 for default + * @param nXSrc source buffer x offset in pixels + * @param nYSrc source buffer y offset in pixels + * @param nSrcWidth width of source in pixels + * @param nSrcHeight height of source in pixels + * + * @return TRUE if success, FALSE otherwise + */ + FREERDP_API BOOL freerdp_image_scale(BYTE* WINPR_RESTRICT pDstData, DWORD DstFormat, + UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, + UINT32 nDstWidth, UINT32 nDstHeight, + const BYTE* WINPR_RESTRICT pSrcData, DWORD SrcFormat, + UINT32 nSrcStep, UINT32 nXSrc, UINT32 nYSrc, + UINT32 nSrcWidth, UINT32 nSrcHeight); + + /*** + * + * @param pDstData destionation buffer + * @param DstFormat destionation buffer format + * @param nDstStep destionation buffer stride (line in bytes) 0 for default + * @param nXDst destination buffer offset x + * @param nYDst destination buffer offset y + * @param nWidth width to copy in pixels + * @param nHeight height to copy in pixels + * @param color Pixel color in DstFormat (internal representation format, + * use FreeRDPGetColor to create) + * + * @return TRUE if success, FALSE otherwise + */ + FREERDP_API BOOL freerdp_image_fill(BYTE* WINPR_RESTRICT pDstData, DWORD DstFormat, + UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, UINT32 nWidth, + UINT32 nHeight, UINT32 color); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_COLOR_H */ diff --git a/include/freerdp/codec/dsp.h b/include/freerdp/codec/dsp.h new file mode 100644 index 0000000..8fbdad7 --- /dev/null +++ b/include/freerdp/codec/dsp.h @@ -0,0 +1,54 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Digital Sound Processing + * + * Copyright 2010-2011 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_DSP_H +#define FREERDP_CODEC_DSP_H + +#include <winpr/stream.h> + +#include <freerdp/api.h> +#include <freerdp/codec/audio.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_FREERDP_DSP_CONTEXT FREERDP_DSP_CONTEXT; + + FREERDP_API void freerdp_dsp_context_free(FREERDP_DSP_CONTEXT* context); + + WINPR_ATTR_MALLOC(freerdp_dsp_context_free, 1) + FREERDP_API FREERDP_DSP_CONTEXT* freerdp_dsp_context_new(BOOL encoder); + + FREERDP_API BOOL freerdp_dsp_supports_format(const AUDIO_FORMAT* format, BOOL encode); + FREERDP_API BOOL freerdp_dsp_encode(FREERDP_DSP_CONTEXT* context, const AUDIO_FORMAT* srcFormat, + const BYTE* data, size_t length, wStream* out); + FREERDP_API BOOL freerdp_dsp_decode(FREERDP_DSP_CONTEXT* context, const AUDIO_FORMAT* srcFormat, + const BYTE* data, size_t length, wStream* out); + + FREERDP_API BOOL freerdp_dsp_context_reset(FREERDP_DSP_CONTEXT* context, + const AUDIO_FORMAT* targetFormat, + UINT32 FramesPerPacket); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_DSP_H */ diff --git a/include/freerdp/codec/h264.h b/include/freerdp/codec/h264.h new file mode 100644 index 0000000..6ad96f9 --- /dev/null +++ b/include/freerdp/codec/h264.h @@ -0,0 +1,94 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * H.264 Bitmap Compression + * + * Copyright 2014 Mike McDonald <Mike.McDonald@software.dell.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_H264_H +#define FREERDP_CODEC_H264_H + +#include <winpr/wlog.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/channels/rdpgfx.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_H264_CONTEXT_SUBSYSTEM H264_CONTEXT_SUBSYSTEM; + typedef struct S_H264_CONTEXT H264_CONTEXT; + typedef struct S_YUV_CONTEXT YUV_CONTEXT; + + typedef enum + { + H264_RATECONTROL_VBR = 0, + H264_RATECONTROL_CQP + } H264_RATECONTROL_MODE; + + typedef enum + { + H264_CONTEXT_OPTION_RATECONTROL, + H264_CONTEXT_OPTION_BITRATE, + H264_CONTEXT_OPTION_FRAMERATE, + H264_CONTEXT_OPTION_QP + } H264_CONTEXT_OPTION; + + FREERDP_API void free_h264_metablock(RDPGFX_H264_METABLOCK* meta); + + FREERDP_API BOOL h264_context_set_option(H264_CONTEXT* h264, H264_CONTEXT_OPTION option, + UINT32 value); + FREERDP_API UINT32 h264_context_get_option(H264_CONTEXT* h264, H264_CONTEXT_OPTION option); + + FREERDP_API INT32 avc420_compress(H264_CONTEXT* h264, const BYTE* pSrcData, DWORD SrcFormat, + UINT32 nSrcStep, UINT32 nSrcWidth, UINT32 nSrcHeight, + const RECTANGLE_16* regionRect, BYTE** ppDstData, + UINT32* pDstSize, RDPGFX_H264_METABLOCK* meta); + + FREERDP_API INT32 avc420_decompress(H264_CONTEXT* h264, const BYTE* pSrcData, UINT32 SrcSize, + BYTE* pDstData, DWORD DstFormat, UINT32 nDstStep, + UINT32 nDstWidth, UINT32 nDstHeight, + const RECTANGLE_16* regionRects, UINT32 numRegionRect); + + FREERDP_API INT32 avc444_compress(H264_CONTEXT* h264, const BYTE* pSrcData, DWORD SrcFormat, + UINT32 nSrcStep, UINT32 nSrcWidth, UINT32 nSrcHeight, + BYTE version, const RECTANGLE_16* regionRect, BYTE* op, + BYTE** pDstData, UINT32* pDstSize, BYTE** pAuxDstData, + UINT32* pAuxDstSize, RDPGFX_H264_METABLOCK* meta, + RDPGFX_H264_METABLOCK* auxMeta); + + FREERDP_API INT32 avc444_decompress(H264_CONTEXT* h264, BYTE op, + const RECTANGLE_16* regionRects, UINT32 numRegionRect, + const BYTE* pSrcData, UINT32 SrcSize, + const RECTANGLE_16* auxRegionRects, UINT32 numAuxRegionRect, + const BYTE* pAuxSrcData, UINT32 AuxSrcSize, BYTE* pDstData, + DWORD DstFormat, UINT32 nDstStep, UINT32 nDstWidth, + UINT32 nDstHeight, UINT32 codecId); + + FREERDP_API BOOL h264_context_reset(H264_CONTEXT* h264, UINT32 width, UINT32 height); + + FREERDP_API void h264_context_free(H264_CONTEXT* h264); + + WINPR_ATTR_MALLOC(h264_context_free, 1) + FREERDP_API H264_CONTEXT* h264_context_new(BOOL Compressor); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_H264_H */ diff --git a/include/freerdp/codec/interleaved.h b/include/freerdp/codec/interleaved.h new file mode 100644 index 0000000..964fb04 --- /dev/null +++ b/include/freerdp/codec/interleaved.h @@ -0,0 +1,60 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Interleaved RLE Bitmap Codec + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_INTERLEAVED_H +#define FREERDP_CODEC_INTERLEAVED_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/codec/color.h> +#include <freerdp/codec/bitmap.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_BITMAP_INTERLEAVED_CONTEXT BITMAP_INTERLEAVED_CONTEXT; + + FREERDP_API BOOL interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved, + const BYTE* pSrcData, UINT32 SrcSize, UINT32 nSrcWidth, + UINT32 nSrcHeight, UINT32 bpp, BYTE* pDstData, + UINT32 DstFormat, UINT32 nDstStep, UINT32 nXDst, + UINT32 nYDst, UINT32 nDstWidth, UINT32 nDstHeight, + const gdiPalette* palette); + + FREERDP_API BOOL interleaved_compress(BITMAP_INTERLEAVED_CONTEXT* interleaved, BYTE* pDstData, + UINT32* pDstSize, UINT32 nWidth, UINT32 nHeight, + const BYTE* pSrcData, UINT32 SrcFormat, UINT32 nSrcStep, + UINT32 nXSrc, UINT32 nYSrc, const gdiPalette* palette, + UINT32 bpp); + + FREERDP_API BOOL bitmap_interleaved_context_reset(BITMAP_INTERLEAVED_CONTEXT* interleaved); + + FREERDP_API void bitmap_interleaved_context_free(BITMAP_INTERLEAVED_CONTEXT* interleaved); + + WINPR_ATTR_MALLOC(bitmap_interleaved_context_free, 1) + FREERDP_API BITMAP_INTERLEAVED_CONTEXT* bitmap_interleaved_context_new(BOOL Compressor); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_INTERLEAVED_H */ diff --git a/include/freerdp/codec/jpeg.h b/include/freerdp/codec/jpeg.h new file mode 100644 index 0000000..b9621fd --- /dev/null +++ b/include/freerdp/codec/jpeg.h @@ -0,0 +1,38 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Compressed Bitmap + * + * Copyright 2012 Jay Sorg <jay.sorg@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_JPEG_H +#define FREERDP_CODEC_JPEG_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API BOOL jpeg_decompress(const BYTE* input, BYTE* output, int width, int height, + int size, int bpp); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_JPEG_H */ diff --git a/include/freerdp/codec/nsc.h b/include/freerdp/codec/nsc.h new file mode 100644 index 0000000..a0a266d --- /dev/null +++ b/include/freerdp/codec/nsc.h @@ -0,0 +1,78 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * NSCodec Codec + * + * Copyright 2011 Samsung, Author Jiten Pathy + * Copyright 2012 Vic Lee + * Copyright 2016 Armin Novak <armin.novak@thincast.com> + * Copyright 2016 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_NSCODEC_H +#define FREERDP_CODEC_NSCODEC_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/constants.h> + +#include <winpr/stream.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + NSC_COLOR_LOSS_LEVEL, + NSC_ALLOW_SUBSAMPLING, + NSC_DYNAMIC_COLOR_FIDELITY, + NSC_COLOR_FORMAT + } NSC_PARAMETER; + + typedef struct S_NSC_CONTEXT NSC_CONTEXT; + +#if defined(WITH_FREERDP_DEPRECATED) + FREERDP_API WINPR_DEPRECATED_VAR("Use nsc_context_set_parameters(NSC_COLOR_FORMAT)", + BOOL nsc_context_set_pixel_format(NSC_CONTEXT* context, + UINT32 pixel_format)); +#endif + + FREERDP_API BOOL nsc_context_set_parameters(NSC_CONTEXT* context, NSC_PARAMETER what, + UINT32 value); + + FREERDP_API BOOL nsc_process_message(NSC_CONTEXT* context, UINT16 bpp, UINT32 width, + UINT32 height, const BYTE* data, UINT32 length, + BYTE* pDstData, UINT32 DstFormat, UINT32 nDstStride, + UINT32 nXDst, UINT32 nYDst, UINT32 nWidth, UINT32 nHeight, + UINT32 flip); + FREERDP_API BOOL nsc_compose_message(NSC_CONTEXT* context, wStream* s, const BYTE* bmpdata, + UINT32 width, UINT32 height, UINT32 rowstride); + FREERDP_API BOOL nsc_decompose_message(NSC_CONTEXT* context, wStream* s, BYTE* bmpdata, + UINT32 x, UINT32 y, UINT32 width, UINT32 height, + UINT32 rowstride, UINT32 format, UINT32 flip); + + FREERDP_API BOOL nsc_context_reset(NSC_CONTEXT* context, UINT32 width, UINT32 height); + + FREERDP_API void nsc_context_free(NSC_CONTEXT* context); + + WINPR_ATTR_MALLOC(nsc_context_free, 1) + FREERDP_API NSC_CONTEXT* nsc_context_new(void); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_NSCODEC_H */ diff --git a/include/freerdp/codec/planar.h b/include/freerdp/codec/planar.h new file mode 100644 index 0000000..e29bce2 --- /dev/null +++ b/include/freerdp/codec/planar.h @@ -0,0 +1,75 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP6 Planar Codec + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2016 Armin Novak <armin.novak@thincast.com> + * Copyright 2016 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_PLANAR_H +#define FREERDP_CODEC_PLANAR_H + +#include <winpr/crt.h> + +#include <freerdp/codec/color.h> +#include <freerdp/codec/bitmap.h> + +#define PLANAR_FORMAT_HEADER_CS (1 << 3) +#define PLANAR_FORMAT_HEADER_RLE (1 << 4) +#define PLANAR_FORMAT_HEADER_NA (1 << 5) +#define PLANAR_FORMAT_HEADER_CLL_MASK 0x07 + +#define PLANAR_CONTROL_BYTE(_nRunLength, _cRawBytes) \ + (_nRunLength & 0x0F) | ((_cRawBytes & 0x0F) << 4) + +#define PLANAR_CONTROL_BYTE_RUN_LENGTH(_controlByte) (_controlByte & 0x0F) +#define PLANAR_CONTROL_BYTE_RAW_BYTES(_controlByte) ((_controlByte >> 4) & 0x0F) + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_BITMAP_PLANAR_CONTEXT BITMAP_PLANAR_CONTEXT; + + FREERDP_API BYTE* freerdp_bitmap_compress_planar(BITMAP_PLANAR_CONTEXT* context, + const BYTE* data, UINT32 format, UINT32 width, + UINT32 height, UINT32 scanline, BYTE* dstData, + UINT32* pDstSize); + + FREERDP_API BOOL freerdp_bitmap_planar_context_reset(BITMAP_PLANAR_CONTEXT* context, + UINT32 width, UINT32 height); + + FREERDP_API void freerdp_bitmap_planar_context_free(BITMAP_PLANAR_CONTEXT* context); + + WINPR_ATTR_MALLOC(freerdp_bitmap_planar_context_free, 1) + FREERDP_API BITMAP_PLANAR_CONTEXT* freerdp_bitmap_planar_context_new(DWORD flags, UINT32 width, + UINT32 height); + + FREERDP_API void freerdp_planar_switch_bgr(BITMAP_PLANAR_CONTEXT* planar, BOOL bgr); + FREERDP_API void freerdp_planar_topdown_image(BITMAP_PLANAR_CONTEXT* planar, BOOL topdown); + + FREERDP_API BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar, const BYTE* pSrcData, + UINT32 SrcSize, UINT32 nSrcWidth, UINT32 nSrcHeight, + BYTE* pDstData, UINT32 DstFormat, UINT32 nDstStep, + UINT32 nXDst, UINT32 nYDst, UINT32 nDstWidth, + UINT32 nDstHeight, BOOL vFlip); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_PLANAR_H */ diff --git a/include/freerdp/codec/progressive.h b/include/freerdp/codec/progressive.h new file mode 100644 index 0000000..6593e63 --- /dev/null +++ b/include/freerdp/codec/progressive.h @@ -0,0 +1,76 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Progressive Codec Bitmap Compression + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_PROGRESSIVE_H +#define FREERDP_CODEC_PROGRESSIVE_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <winpr/wlog.h> +#include <winpr/collections.h> + +#include <freerdp/codec/rfx.h> +#include <freerdp/codec/color.h> +#include <freerdp/codec/region.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_PROGRESSIVE_CONTEXT PROGRESSIVE_CONTEXT; + + FREERDP_API int progressive_compress(PROGRESSIVE_CONTEXT* progressive, const BYTE* pSrcData, + UINT32 SrcSize, UINT32 SrcFormat, UINT32 Width, + UINT32 Height, UINT32 ScanLine, + const REGION16* invalidRegion, BYTE** ppDstData, + UINT32* pDstSize); + + FREERDP_API INT32 progressive_decompress(PROGRESSIVE_CONTEXT* progressive, const BYTE* pSrcData, + UINT32 SrcSize, BYTE* pDstData, UINT32 DstFormat, + UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, + REGION16* invalidRegion, UINT16 surfaceId, + UINT32 frameId); + + FREERDP_API INT32 progressive_create_surface_context(PROGRESSIVE_CONTEXT* progressive, + UINT16 surfaceId, UINT32 width, + UINT32 height); + FREERDP_API int progressive_delete_surface_context(PROGRESSIVE_CONTEXT* progressive, + UINT16 surfaceId); + + FREERDP_API BOOL progressive_context_reset(PROGRESSIVE_CONTEXT* progressive); + + FREERDP_API void progressive_context_free(PROGRESSIVE_CONTEXT* progressive); + + WINPR_ATTR_MALLOC(progressive_context_free, 1) + FREERDP_API PROGRESSIVE_CONTEXT* progressive_context_new(BOOL Compressor); + + WINPR_ATTR_MALLOC(progressive_context_free, 1) + FREERDP_API PROGRESSIVE_CONTEXT* progressive_context_new_ex(BOOL Compressor, + UINT32 ThreadingFlags); + + FREERDP_API BOOL progressive_rfx_write_message_progressive_simple( + PROGRESSIVE_CONTEXT* progressive, wStream* s, const RFX_MESSAGE* msg); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_PROGRESSIVE_H */ diff --git a/include/freerdp/codec/region.h b/include/freerdp/codec/region.h new file mode 100644 index 0000000..19239b6 --- /dev/null +++ b/include/freerdp/codec/region.h @@ -0,0 +1,148 @@ +/** + * Copyright © 2014 Thincast Technologies GmbH + * Copyright © 2014 Hardening <contact@hardening-consulting.com> + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the copyright holders not be used in + * advertising or publicity pertaining to distribution of the software + * without specific, written prior permission. The copyright holders make + * no representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef FREERDP_CODEC_REGION_H +#define FREERDP_CODEC_REGION_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_REGION16_DATA REGION16_DATA; + + typedef struct + { + RECTANGLE_16 extents; + REGION16_DATA* data; + } REGION16; + + /** computes if two rectangles are equal + * @param r1 first rectangle + * @param r2 second rectangle + * @return if the two rectangles are equal + */ + FREERDP_API BOOL rectangles_equal(const RECTANGLE_16* r1, const RECTANGLE_16* r2); + + /** computes if two rectangles intersect + * @param r1 first rectangle + * @param r2 second rectangle + * @return if the two rectangles intersect + */ + FREERDP_API BOOL rectangles_intersects(const RECTANGLE_16* r1, const RECTANGLE_16* r2); + + /** computes the intersection of two rectangles + * @param r1 first rectangle + * @param r2 second rectangle + * @param dst resulting intersection + * @return if the two rectangles intersect + */ + FREERDP_API BOOL rectangles_intersection(const RECTANGLE_16* r1, const RECTANGLE_16* r2, + RECTANGLE_16* dst); + + /** initialize a region16 + * @param region the region to initialise + */ + FREERDP_API void region16_init(REGION16* region); + + /** @return the number of rectangles of this region16 */ + FREERDP_API int region16_n_rects(const REGION16* region); + + /** returns a pointer to rectangles and the number of rectangles in this region. + * nbRects can be set to NULL if not interested in the number of rectangles. + * @param region the input region + * @param nbRects if non-NULL returns the number of rectangles + * @return a pointer on the rectangles + */ + FREERDP_API const RECTANGLE_16* region16_rects(const REGION16* region, UINT32* nbRects); + + /** @return the extents rectangle of this region */ + FREERDP_API const RECTANGLE_16* region16_extents(const REGION16* region); + + /** returns if the rectangle is empty + * @param rect the rectangle to check + * @return if the rectangle is empty + */ + FREERDP_API BOOL rectangle_is_empty(const RECTANGLE_16* rect); + + /** returns if the region is empty + * @param region the region to check + * @return if the region is empty + */ + FREERDP_API BOOL region16_is_empty(const REGION16* region); + + /** clears the region, the region is reset to a (0,0,0,0) region + * @param region the region to clear + */ + FREERDP_API void region16_clear(REGION16* region); + + /** dumps the region on stderr + * @param region the region to dump + */ + FREERDP_API void region16_print(const REGION16* region); + + /** copies the region to another region + * @param dst destination region + * @param src source region + * @return if the operation was successful (false meaning out-of-memory) + */ + FREERDP_API BOOL region16_copy(REGION16* dst, const REGION16* src); + + /** adds a rectangle in src and stores the resulting region in dst + * @param dst destination region + * @param src source region + * @param rect the rectangle to add + * @return if the operation was successful (false meaning out-of-memory) + */ + FREERDP_API BOOL region16_union_rect(REGION16* dst, const REGION16* src, + const RECTANGLE_16* rect); + + /** returns if a rectangle intersects the region + * @param src the region + * @param arg2 the rectangle + * @return if region and rectangle intersect + */ + FREERDP_API BOOL region16_intersects_rect(const REGION16* src, const RECTANGLE_16* arg2); + + /** computes the intersection between a region and a rectangle + * @param dst destination region + * @param src the source region + * @param arg2 the rectangle that intersects + * @return if the operation was successful (false meaning out-of-memory) + */ + FREERDP_API BOOL region16_intersect_rect(REGION16* dst, const REGION16* src, + const RECTANGLE_16* arg2); + + /** release internal data associated with this region + * @param region the region to release + */ + FREERDP_API void region16_uninit(REGION16* region); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_REGION_H */ diff --git a/include/freerdp/codec/rfx.h b/include/freerdp/codec/rfx.h new file mode 100644 index 0000000..2b122be --- /dev/null +++ b/include/freerdp/codec/rfx.h @@ -0,0 +1,144 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RemoteFX Codec + * + * Copyright 2011 Vic Lee + * Copyright 2016 Armin Novak <armin.novak@thincast.com> + * Copyright 2016 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_REMOTEFX_H +#define FREERDP_CODEC_REMOTEFX_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/constants.h> +#include <freerdp/codec/region.h> + +#include <winpr/stream.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + RLGR1, + RLGR3 + } RLGR_MODE; + + typedef struct + { + UINT16 x; + UINT16 y; + UINT16 width; + UINT16 height; + } RFX_RECT; + + typedef struct + { + UINT16 x; + UINT16 y; + UINT32 width; + UINT32 height; + BYTE* data; + UINT32 scanline; + BOOL allocated; + BYTE quantIdxY; + BYTE quantIdxCb; + BYTE quantIdxCr; + UINT16 xIdx; + UINT16 yIdx; + UINT16 YLen; + UINT16 CbLen; + UINT16 CrLen; + BYTE* YData; + BYTE* CbData; + BYTE* CrData; + BYTE* YCbCrData; + } RFX_TILE; + + typedef struct S_RFX_MESSAGE_LIST RFX_MESSAGE_LIST; + typedef struct S_RFX_MESSAGE RFX_MESSAGE; + typedef struct S_RFX_CONTEXT RFX_CONTEXT; + + FREERDP_API BOOL rfx_process_message(RFX_CONTEXT* context, const BYTE* data, UINT32 length, + UINT32 left, UINT32 top, BYTE* dst, UINT32 dstFormat, + UINT32 dstStride, UINT32 dstHeight, + REGION16* invalidRegion); + + FREERDP_API UINT32 rfx_message_get_frame_idx(const RFX_MESSAGE* message); + FREERDP_API const UINT32* rfx_message_get_quants(const RFX_MESSAGE* message, + UINT16* numQuantVals); + + FREERDP_API const RFX_TILE** rfx_message_get_tiles(const RFX_MESSAGE* message, + UINT16* numTiles); + FREERDP_API UINT16 rfx_message_get_tile_count(const RFX_MESSAGE* message); + + FREERDP_API const RFX_RECT* rfx_message_get_rects(const RFX_MESSAGE* message, UINT16* numRects); + FREERDP_API UINT16 rfx_message_get_rect_count(const RFX_MESSAGE* message); + + FREERDP_API void rfx_message_free(RFX_CONTEXT* context, RFX_MESSAGE* message); + + FREERDP_API BOOL rfx_compose_message(RFX_CONTEXT* context, wStream* s, const RFX_RECT* rects, + size_t num_rects, const BYTE* image_data, UINT32 width, + UINT32 height, UINT32 rowstride); + + FREERDP_API RFX_MESSAGE* rfx_encode_message(RFX_CONTEXT* context, const RFX_RECT* rects, + size_t numRects, const BYTE* data, UINT32 width, + UINT32 height, size_t scanline); + + FREERDP_API RFX_MESSAGE_LIST* rfx_encode_messages(RFX_CONTEXT* context, const RFX_RECT* rects, + size_t numRects, const BYTE* data, + UINT32 width, UINT32 height, UINT32 scanline, + size_t* numMessages, size_t maxDataSize); + FREERDP_API void rfx_message_list_free(RFX_MESSAGE_LIST* messages); + + FREERDP_API const RFX_MESSAGE* rfx_message_list_get(const RFX_MESSAGE_LIST* messages, + size_t idx); + + FREERDP_API BOOL rfx_write_message(RFX_CONTEXT* context, wStream* s, + const RFX_MESSAGE* message); + + FREERDP_API void rfx_context_free(RFX_CONTEXT* context); + + WINPR_ATTR_MALLOC(rfx_context_free, 1) + FREERDP_API RFX_CONTEXT* rfx_context_new_ex(BOOL encoder, UINT32 ThreadingFlags); + + WINPR_ATTR_MALLOC(rfx_context_free, 1) + FREERDP_API RFX_CONTEXT* rfx_context_new(BOOL encoder); + + FREERDP_API BOOL rfx_context_reset(RFX_CONTEXT* context, UINT32 width, UINT32 height); + + FREERDP_API BOOL rfx_context_set_mode(RFX_CONTEXT* context, RLGR_MODE mode); + FREERDP_API RLGR_MODE rfx_context_get_mode(RFX_CONTEXT* context); + + FREERDP_API void rfx_context_set_pixel_format(RFX_CONTEXT* context, UINT32 pixel_format); + FREERDP_API UINT32 rfx_context_get_pixel_format(RFX_CONTEXT* context); + + FREERDP_API void rfx_context_set_palette(RFX_CONTEXT* context, const BYTE* palette); + FREERDP_API const BYTE* rfx_context_get_palette(RFX_CONTEXT* context); + + FREERDP_API UINT32 rfx_context_get_frame_idx(const RFX_CONTEXT* context); + + FREERDP_API BOOL rfx_write_message_progressive_simple(RFX_CONTEXT* rfx, wStream* s, + const RFX_MESSAGE* msg); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_REMOTEFX_H */ diff --git a/include/freerdp/codec/yuv.h b/include/freerdp/codec/yuv.h new file mode 100644 index 0000000..6a1ea17 --- /dev/null +++ b/include/freerdp/codec/yuv.h @@ -0,0 +1,65 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * YUV decoder + * + * Copyright 2017 David Fort <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_YUV_H +#define FREERDP_CODEC_YUV_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/constants.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_YUV_CONTEXT YUV_CONTEXT; + + FREERDP_API BOOL yuv420_context_decode(YUV_CONTEXT* context, const BYTE* pYUVData[3], + const UINT32 iStride[3], UINT32 yuvHeight, + DWORD DstFormat, BYTE* dest, UINT32 nDstStep, + const RECTANGLE_16* regionRects, UINT32 numRegionRects); + FREERDP_API BOOL yuv420_context_encode(YUV_CONTEXT* context, const BYTE* rgbData, + UINT32 srcStep, UINT32 srcFormat, + const UINT32 iStride[3], BYTE* yuvData[3], + const RECTANGLE_16* regionRects, UINT32 numRegionRects); + + FREERDP_API BOOL yuv444_context_decode(YUV_CONTEXT* context, BYTE type, const BYTE* pYUVData[3], + const UINT32 iStride[3], UINT32 srcYuvHeight, + BYTE* pYUVDstData[3], const UINT32 iDstStride[3], + DWORD DstFormat, BYTE* dest, UINT32 nDstStep, + const RECTANGLE_16* regionRects, UINT32 numRegionRects); + FREERDP_API BOOL yuv444_context_encode(YUV_CONTEXT* context, BYTE version, const BYTE* pSrcData, + UINT32 nSrcStep, UINT32 SrcFormat, + const UINT32 iStride[3], BYTE* pYUVLumaData[3], + BYTE* pYUVChromaData[3], const RECTANGLE_16* regionRects, + UINT32 numRegionRects); + + FREERDP_API BOOL yuv_context_reset(YUV_CONTEXT* context, UINT32 width, UINT32 height); + + FREERDP_API void yuv_context_free(YUV_CONTEXT* context); + + WINPR_ATTR_MALLOC(yuv_context_free, 1) + FREERDP_API YUV_CONTEXT* yuv_context_new(BOOL encoder, UINT32 ThreadingFlags); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_YUV_H */ diff --git a/include/freerdp/codec/zgfx.h b/include/freerdp/codec/zgfx.h new file mode 100644 index 0000000..53e211c --- /dev/null +++ b/include/freerdp/codec/zgfx.h @@ -0,0 +1,61 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * ZGFX (RDP8) Bulk Data Compression + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_ZGFX_H +#define FREERDP_CODEC_ZGFX_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/codec/bulk.h> + +#define ZGFX_SEGMENTED_SINGLE 0xE0 +#define ZGFX_SEGMENTED_MULTIPART 0xE1 + +#define ZGFX_PACKET_COMPR_TYPE_RDP8 0x04 + +#define ZGFX_SEGMENTED_MAXSIZE 65535 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_ZGFX_CONTEXT ZGFX_CONTEXT; + + FREERDP_API int zgfx_decompress(ZGFX_CONTEXT* zgfx, const BYTE* pSrcData, UINT32 SrcSize, + BYTE** ppDstData, UINT32* pDstSize, UINT32 flags); + FREERDP_API int zgfx_compress(ZGFX_CONTEXT* zgfx, const BYTE* pSrcData, UINT32 SrcSize, + BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags); + FREERDP_API int zgfx_compress_to_stream(ZGFX_CONTEXT* zgfx, wStream* sDst, + const BYTE* pUncompressed, UINT32 uncompressedSize, + UINT32* pFlags); + + FREERDP_API void zgfx_context_reset(ZGFX_CONTEXT* zgfx, BOOL flush); + + FREERDP_API void zgfx_context_free(ZGFX_CONTEXT* zgfx); + + WINPR_ATTR_MALLOC(zgfx_context_free, 1) + FREERDP_API ZGFX_CONTEXT* zgfx_context_new(BOOL Compressor); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_ZGFX_H */ diff --git a/include/freerdp/codecs.h b/include/freerdp/codecs.h new file mode 100644 index 0000000..1de39b5 --- /dev/null +++ b/include/freerdp/codecs.h @@ -0,0 +1,83 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP Codecs + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODECS_H +#define FREERDP_CODECS_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/codec/color.h> + +#include <freerdp/codec/rfx.h> +#include <freerdp/codec/nsc.h> +#include <freerdp/codec/h264.h> +#include <freerdp/codec/clear.h> +#include <freerdp/codec/planar.h> +#include <freerdp/codec/interleaved.h> +#include <freerdp/codec/progressive.h> + +typedef enum +{ + FREERDP_CODEC_INTERLEAVED = 0x00000001, + FREERDP_CODEC_PLANAR = 0x00000002, + FREERDP_CODEC_NSCODEC = 0x00000004, + FREERDP_CODEC_REMOTEFX = 0x00000008, + FREERDP_CODEC_CLEARCODEC = 0x00000010, + FREERDP_CODEC_ALPHACODEC = 0x00000020, + FREERDP_CODEC_PROGRESSIVE = 0x00000040, + FREERDP_CODEC_AVC420 = 0x00000080, + FREERDP_CODEC_AVC444 = 0x00000100, + FREERDP_CODEC_ALL = 0x7FFFFFFF /* C enum types are restricted to int */ +} FreeRDP_CodecFlags; + +#ifdef __cplusplus +extern "C" +{ +#endif + + struct rdp_codecs + { + rdpContext* context; + + RFX_CONTEXT* rfx; + NSC_CONTEXT* nsc; + H264_CONTEXT* h264; + CLEAR_CONTEXT* clear; + PROGRESSIVE_CONTEXT* progressive; + BITMAP_PLANAR_CONTEXT* planar; + BITMAP_INTERLEAVED_CONTEXT* interleaved; + }; + typedef struct rdp_codecs rdpCodecs; + + FREERDP_API BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width, + UINT32 height); + FREERDP_API BOOL freerdp_client_codecs_reset(rdpCodecs* codecs, UINT32 flags, UINT32 width, + UINT32 height); + + FREERDP_API void codecs_free(rdpCodecs* codecs); + + WINPR_ATTR_MALLOC(codecs_free, 1) + FREERDP_API rdpCodecs* codecs_new(rdpContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODECS_H */ diff --git a/include/freerdp/constants.h b/include/freerdp/constants.h new file mode 100644 index 0000000..b1cb0d7 --- /dev/null +++ b/include/freerdp/constants.h @@ -0,0 +1,70 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP Constants + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CONSTANTS_H +#define FREERDP_CONSTANTS_H + +/** + * Codec IDs + */ +enum RDP_CODEC_ID +{ + RDP_CODEC_ID_NONE = 0x00, + RDP_CODEC_ID_NSCODEC = 0x01, + RDP_CODEC_ID_JPEG = 0x02, + RDP_CODEC_ID_REMOTEFX = 0x03, + RDP_CODEC_ID_IMAGE_REMOTEFX = 0x04 +}; + +/** + * CPU Optimization flags + */ +#define CPU_SSE2 0x1 + +/** + * OSMajorType + */ +#define OSMAJORTYPE_UNSPECIFIED 0x0000 +#define OSMAJORTYPE_WINDOWS 0x0001 +#define OSMAJORTYPE_OS2 0x0002 +#define OSMAJORTYPE_MACINTOSH 0x0003 +#define OSMAJORTYPE_UNIX 0x0004 +#define OSMAJORTYPE_IOS 0x0005 +#define OSMAJORTYPE_OSX 0x0006 +#define OSMAJORTYPE_ANDROID 0x0007 +#define OSMAJORTYPE_CHROME_OS 0x0008 + +/** + * OSMinorType + */ +#define OSMINORTYPE_UNSPECIFIED 0x0000 +#define OSMINORTYPE_WINDOWS_31X 0x0001 +#define OSMINORTYPE_WINDOWS_95 0x0002 +#define OSMINORTYPE_WINDOWS_NT 0x0003 +#define OSMINORTYPE_OS2_V21 0x0004 +#define OSMINORTYPE_POWER_PC 0x0005 +#define OSMINORTYPE_MACINTOSH 0x0006 +#define OSMINORTYPE_NATIVE_XSERVER 0x0007 +#define OSMINORTYPE_PSEUDO_XSERVER 0x0008 +#define OSMINORTYPE_WINDOWS_RT 0x0009 +/* As of 2022-03-29 the following does not exist officially in [MS-RDPBCGR] */ +#define OSMINORTYPE_NATIVE_WAYLAND (0xFFFF - 1) +#define OSMINORTYPE_NATIVE_SDL (0xFFFF - 2) + +#endif /* FREERDP_CONSTANTS_H */ diff --git a/include/freerdp/crypto/ber.h b/include/freerdp/crypto/ber.h new file mode 100644 index 0000000..072517c --- /dev/null +++ b/include/freerdp/crypto/ber.h @@ -0,0 +1,106 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * ASN.1 Basic Encoding Rules (BER) + * + * Copyright 2011-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CRYPTO_BER_H +#define FREERDP_CRYPTO_BER_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <winpr/stream.h> + +/* BER type */ + +/* Class - bits 8 and 7 */ +#define BER_CLASS_MASK 0xC0 +#define BER_CLASS_UNIV 0x00 /* 0 0 */ +#define BER_CLASS_APPL 0x40 /* 0 1 */ +#define BER_CLASS_CTXT 0x80 /* 1 0 */ +#define BER_CLASS_PRIV 0xC0 /* 1 1 */ + +/* P/C - bit 6 */ +#define BER_PC_MASK 0x20 +#define BER_PRIMITIVE 0x00 /* 0 */ +#define BER_CONSTRUCT 0x20 /* 1 */ + +/* Tag - bits 5 to 1 */ +#define BER_TAG_MASK 0x1F +#define BER_TAG_BOOLEAN 0x01 +#define BER_TAG_INTEGER 0x02 +#define BER_TAG_BIT_STRING 0x03 +#define BER_TAG_OCTET_STRING 0x04 +#define BER_TAG_OBJECT_IDENFIER 0x06 +#define BER_TAG_ENUMERATED 0x0A +#define BER_TAG_SEQUENCE 0x10 +#define BER_TAG_SEQUENCE_OF 0x10 + +#define BER_PC(_pc) (_pc ? BER_CONSTRUCT : BER_PRIMITIVE) + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API BOOL ber_read_length(wStream* s, size_t* length); + FREERDP_API size_t ber_write_length(wStream* s, size_t length); + FREERDP_API size_t _ber_sizeof_length(size_t length); + FREERDP_API BOOL ber_read_universal_tag(wStream* s, BYTE tag, BOOL pc); + FREERDP_API size_t ber_write_universal_tag(wStream* s, BYTE tag, BOOL pc); + FREERDP_API BOOL ber_read_application_tag(wStream* s, BYTE tag, size_t* length); + FREERDP_API void ber_write_application_tag(wStream* s, BYTE tag, size_t length); + FREERDP_API BOOL ber_read_enumerated(wStream* s, BYTE* enumerated, BYTE count); + FREERDP_API void ber_write_enumerated(wStream* s, BYTE enumerated, BYTE count); + FREERDP_API BOOL ber_read_contextual_tag(wStream* s, BYTE tag, size_t* length, BOOL pc); + FREERDP_API size_t ber_write_contextual_tag(wStream* s, BYTE tag, size_t length, BOOL pc); + FREERDP_API size_t ber_sizeof_contextual_tag(size_t length); + FREERDP_API BOOL ber_read_sequence_tag(wStream* s, size_t* length); + FREERDP_API size_t ber_write_sequence_tag(wStream* s, size_t length); + FREERDP_API size_t ber_sizeof_sequence(size_t length); + FREERDP_API size_t ber_sizeof_sequence_tag(size_t length); + FREERDP_API BOOL ber_read_bit_string(wStream* s, size_t* length, BYTE* padding); + + FREERDP_API BOOL ber_read_octet_string_tag(wStream* s, size_t* length); + FREERDP_API BOOL ber_read_octet_string(wStream* s, BYTE** content, size_t* length); + FREERDP_API size_t ber_write_octet_string_tag(wStream* s, size_t length); + FREERDP_API size_t ber_sizeof_octet_string(size_t length); + FREERDP_API size_t ber_sizeof_contextual_octet_string(size_t length); + FREERDP_API size_t ber_write_char_to_unicode_octet_string(wStream* s, const char* str); + FREERDP_API size_t ber_write_contextual_char_to_unicode_octet_string(wStream* s, BYTE tag, + const char* oct_str); + FREERDP_API size_t ber_write_octet_string(wStream* s, const BYTE* oct_str, size_t length); + FREERDP_API BOOL ber_read_char_from_unicode_octet_string(wStream* s, char** str); + FREERDP_API BOOL ber_read_unicode_octet_string(wStream* s, LPWSTR* str); + FREERDP_API size_t ber_write_contextual_octet_string(wStream* s, BYTE tag, const BYTE* oct_str, + size_t length); + FREERDP_API size_t ber_write_contextual_unicode_octet_string(wStream* s, BYTE tag, LPWSTR str); + + FREERDP_API BOOL ber_read_BOOL(wStream* s, BOOL* value); + FREERDP_API void ber_write_BOOL(wStream* s, BOOL value); + FREERDP_API BOOL ber_read_integer(wStream* s, UINT32* value); + FREERDP_API size_t ber_write_integer(wStream* s, UINT32 value); + FREERDP_API size_t ber_write_contextual_integer(wStream* s, BYTE tag, UINT32 value); + FREERDP_API BOOL ber_read_integer_length(wStream* s, size_t* length); + FREERDP_API size_t ber_sizeof_integer(UINT32 value); + FREERDP_API size_t ber_sizeof_contextual_integer(UINT32 value); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CRYPTO_BER_H */ diff --git a/include/freerdp/crypto/certificate.h b/include/freerdp/crypto/certificate.h new file mode 100644 index 0000000..d16f903 --- /dev/null +++ b/include/freerdp/crypto/certificate.h @@ -0,0 +1,103 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Certificate Handling + * + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CRYPTO_CERTIFICATE_H +#define FREERDP_CRYPTO_CERTIFICATE_H + +#include <winpr/crypto.h> + +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + enum FREERDP_CERT_PARAM + { + FREERDP_CERT_RSA_E, + FREERDP_CERT_RSA_N + }; + + typedef struct rdp_certificate rdpCertificate; + + FREERDP_API void freerdp_certificate_free(rdpCertificate* certificate); + + WINPR_ATTR_MALLOC(freerdp_certificate_free, 1) + FREERDP_API rdpCertificate* freerdp_certificate_new(void); + + WINPR_ATTR_MALLOC(freerdp_certificate_free, 1) + FREERDP_API rdpCertificate* freerdp_certificate_new_from_file(const char* file); + + WINPR_ATTR_MALLOC(freerdp_certificate_free, 1) + FREERDP_API rdpCertificate* freerdp_certificate_new_from_pem(const char* pem); + + WINPR_ATTR_MALLOC(freerdp_certificate_free, 1) + FREERDP_API rdpCertificate* freerdp_certificate_new_from_der(const BYTE* data, size_t length); + + FREERDP_API BOOL freerdp_certificate_is_rsa(const rdpCertificate* certificate); + + FREERDP_API char* freerdp_certificate_get_hash(const rdpCertificate* certificate, + const char* hash, size_t* plength); + + FREERDP_API char* freerdp_certificate_get_fingerprint_by_hash(const rdpCertificate* certificate, + const char* hash); + FREERDP_API char* + freerdp_certificate_get_fingerprint_by_hash_ex(const rdpCertificate* certificate, + const char* hash, BOOL separator); + FREERDP_API char* freerdp_certificate_get_fingerprint(const rdpCertificate* certificate); + FREERDP_API char* freerdp_certificate_get_pem(const rdpCertificate* certificate, + size_t* pLength); + FREERDP_API BYTE* freerdp_certificate_get_der(const rdpCertificate* certificate, + size_t* pLength); + + FREERDP_API char* freerdp_certificate_get_subject(const rdpCertificate* certificate); + FREERDP_API char* freerdp_certificate_get_issuer(const rdpCertificate* certificate); + + FREERDP_API char* freerdp_certificate_get_upn(const rdpCertificate* certificate); + FREERDP_API char* freerdp_certificate_get_email(const rdpCertificate* certificate); + + FREERDP_API WINPR_MD_TYPE freerdp_certificate_get_signature_alg(const rdpCertificate* cert); + + FREERDP_API char* freerdp_certificate_get_common_name(const rdpCertificate* cert, + size_t* plength); + FREERDP_API char** freerdp_certificate_get_dns_names(const rdpCertificate* cert, size_t* pcount, + size_t** pplengths); + FREERDP_API void freerdp_certificate_free_dns_names(size_t count, size_t* lengths, + char** names); + + FREERDP_API BOOL freerdp_certificate_check_eku(const rdpCertificate* certificate, int nid); + + FREERDP_API BOOL freerdp_certificate_get_public_key(const rdpCertificate* cert, + BYTE** PublicKey, DWORD* PublicKeyLength); + + FREERDP_API BOOL freerdp_certificate_verify(const rdpCertificate* cert, + const char* certificate_store_path); + + FREERDP_API BOOL freerdp_certificate_is_rdp_security_compatible(const rdpCertificate* cert); + + FREERDP_API char* freerdp_certificate_get_param(const rdpCertificate* cert, + enum FREERDP_CERT_PARAM what, size_t* psize); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CRYPTO_CERTIFICATE_H */ diff --git a/include/freerdp/crypto/certificate_data.h b/include/freerdp/crypto/certificate_data.h new file mode 100644 index 0000000..275d654 --- /dev/null +++ b/include/freerdp/crypto/certificate_data.h @@ -0,0 +1,72 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Certificate Handling + * + * Copyright 2011-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CRYPTO_CERTIFICATE_DATA_H +#define FREERDP_CRYPTO_CERTIFICATE_DATA_H + +#include <freerdp/api.h> +#include <freerdp/settings.h> +#include <freerdp/crypto/certificate.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_certificate_data rdpCertificateData; + + FREERDP_API char* freerdp_certificate_data_hash(const char* hostname, UINT16 port); + + FREERDP_API void freerdp_certificate_data_free(rdpCertificateData* data); + + WINPR_ATTR_MALLOC(freerdp_certificate_data_free, 1) + FREERDP_API rdpCertificateData* freerdp_certificate_data_new(const char* hostname, UINT16 port, + const rdpCertificate* xcert); + + WINPR_ATTR_MALLOC(freerdp_certificate_data_free, 1) + FREERDP_API rdpCertificateData* freerdp_certificate_data_new_from_pem(const char* hostname, + UINT16 port, + const char* pem, + size_t length); + + WINPR_ATTR_MALLOC(freerdp_certificate_data_free, 1) + FREERDP_API rdpCertificateData* + freerdp_certificate_data_new_from_file(const char* hostname, UINT16 port, const char* file); + + FREERDP_API BOOL freerdp_certificate_data_equal(const rdpCertificateData* a, + const rdpCertificateData* b); + + FREERDP_API const char* freerdp_certificate_data_get_hash(const rdpCertificateData* cert); + + FREERDP_API const char* freerdp_certificate_data_get_host(const rdpCertificateData* cert); + FREERDP_API UINT16 freerdp_certificate_data_get_port(const rdpCertificateData* cert); + + FREERDP_API const char* freerdp_certificate_data_get_pem(const rdpCertificateData* cert); + FREERDP_API const char* freerdp_certificate_data_get_subject(const rdpCertificateData* cert); + FREERDP_API const char* freerdp_certificate_data_get_issuer(const rdpCertificateData* cert); + FREERDP_API const char* + freerdp_certificate_data_get_fingerprint(const rdpCertificateData* cert); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CRYPTO_CERTIFICATE_DATA_H */ diff --git a/include/freerdp/crypto/certificate_store.h b/include/freerdp/crypto/certificate_store.h new file mode 100644 index 0000000..e7e43e1 --- /dev/null +++ b/include/freerdp/crypto/certificate_store.h @@ -0,0 +1,72 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Certificate Handling + * + * Copyright 2011-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CRYPTO_CERTIFICATE_STORE_H +#define FREERDP_CRYPTO_CERTIFICATE_STORE_H + +#include <freerdp/api.h> +#include <freerdp/settings.h> +#include <freerdp/crypto/certificate_data.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_certificate_store rdpCertificateStore; + + typedef enum + { + CERT_STORE_NOT_FOUND = 1, + CERT_STORE_MATCH = 0, + CERT_STORE_MISMATCH = -1 + } freerdp_certificate_store_result; + + FREERDP_API void freerdp_certificate_store_free(rdpCertificateStore* store); + + WINPR_ATTR_MALLOC(freerdp_certificate_store_free, 1) + FREERDP_API rdpCertificateStore* freerdp_certificate_store_new(const rdpSettings* settings); + + FREERDP_API freerdp_certificate_store_result freerdp_certificate_store_contains_data( + rdpCertificateStore* store, const rdpCertificateData* data); + + WINPR_ATTR_MALLOC(freerdp_certificate_data_free, 1) + FREERDP_API rdpCertificateData* + freerdp_certificate_store_load_data(rdpCertificateStore* store, const char* host, UINT16 port); + + FREERDP_API BOOL freerdp_certificate_store_save_data(rdpCertificateStore* store, + const rdpCertificateData* data); + FREERDP_API BOOL freerdp_certificate_store_remove_data(rdpCertificateStore* store, + const rdpCertificateData* data); + + FREERDP_API const char* + freerdp_certificate_store_get_certs_path(const rdpCertificateStore* store); + FREERDP_API const char* + freerdp_certificate_store_get_hosts_path(const rdpCertificateStore* store); + + FREERDP_API char* freerdp_certificate_store_get_cert_path(const rdpCertificateStore* store, + const char* host, UINT16 port); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CRYPTO_CERTIFICATE_STORE_H */ diff --git a/include/freerdp/crypto/crypto.h b/include/freerdp/crypto/crypto.h new file mode 100644 index 0000000..6137769 --- /dev/null +++ b/include/freerdp/crypto/crypto.h @@ -0,0 +1,58 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Cryptographic Abstraction Layer + * + * Copyright 2011-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CRYPTO_H +#define FREERDP_CRYPTO_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/crypto/certificate_data.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + struct rdp_CertInfo + { + BYTE* Modulus; + DWORD ModulusLength; + BYTE exponent[4]; + }; + typedef struct rdp_CertInfo rdpCertInfo; + + FREERDP_API char* crypto_base64_encode(const BYTE* data, size_t length); + FREERDP_API char* crypto_base64_encode_ex(const BYTE* data, size_t length, BOOL withCrLf); + + FREERDP_API void crypto_base64_decode(const char* enc_data, size_t length, BYTE** dec_data, + size_t* res_length); + + FREERDP_API char* crypto_base64url_encode(const BYTE* data, size_t length); + FREERDP_API void crypto_base64url_decode(const char* enc_data, size_t length, BYTE** dec_data, + size_t* res_length); + + FREERDP_API char* crypto_read_pem(const char* filename, size_t* plength); + FREERDP_API BOOL crypto_write_pem(const char* filename, const char* pem, size_t length); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CRYPTO_H */ diff --git a/include/freerdp/crypto/der.h b/include/freerdp/crypto/der.h new file mode 100644 index 0000000..8ec27f0 --- /dev/null +++ b/include/freerdp/crypto/der.h @@ -0,0 +1,44 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * ASN.1 Basic Encoding Rules (DER) + * + * Copyright 2011 Samsung, Author Jiten Pathy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CRYPTO_DER_H +#define FREERDP_CRYPTO_DER_H + +#include <freerdp/crypto/er.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API int _der_skip_length(int length); + FREERDP_API int der_write_length(wStream* s, int length); + FREERDP_API int der_get_content_length(int length); + FREERDP_API int der_skip_octet_string(int length); + FREERDP_API int der_skip_sequence_tag(int length); + FREERDP_API int der_write_sequence_tag(wStream* s, int length); + FREERDP_API int der_skip_contextual_tag(int length); + FREERDP_API int der_write_contextual_tag(wStream* s, BYTE tag, int length, BOOL pc); + FREERDP_API void der_write_octet_string(wStream* s, BYTE* oct_str, int length); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CRYPTO_DER_H */ diff --git a/include/freerdp/crypto/er.h b/include/freerdp/crypto/er.h new file mode 100644 index 0000000..d981b4e --- /dev/null +++ b/include/freerdp/crypto/er.h @@ -0,0 +1,97 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * ASN.1 Encoding Rules (BER/DER common functions) + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Modified by Jiten Pathy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CRYPTO_ER_H +#define FREERDP_CRYPTO_ER_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <winpr/stream.h> + +/* ER type */ + +/* Class - bits 8 and 7 */ +#define ER_CLASS_MASK 0xC0 +#define ER_CLASS_UNIV 0x00 /* 0 0 */ +#define ER_CLASS_APPL 0x40 /* 0 1 */ +#define ER_CLASS_CTXT 0x80 /* 1 0 */ +#define ER_CLASS_PRIV 0xC0 /* 1 1 */ + +/* P/C - bit 6 */ +#define ER_PC_MASK 0x20 +#define ER_PRIMITIVE 0x00 /* 0 */ +#define ER_CONSTRUCT 0x20 /* 1 */ + +/* Tag - bits 5 to 1 */ +#define ER_TAG_MASK 0x1F +#define ER_TAG_BOOLEAN 0x01 +#define ER_TAG_INTEGER 0x02 +#define ER_TAG_BIT_STRING 0x03 +#define ER_TAG_OCTET_STRING 0x04 +#define ER_TAG_OBJECT_IDENTIFIER 0x06 +#define ER_TAG_ENUMERATED 0x0A +#define ER_TAG_SEQUENCE 0x10 +#define ER_TAG_SEQUENCE_OF 0x10 +#define ER_TAG_GENERAL_STRING 0x1B +#define ER_TAG_GENERALIZED_TIME 0x18 + +#define ER_PC(_pc) (_pc ? ER_CONSTRUCT : ER_PRIMITIVE) + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API void er_read_length(wStream* s, int* length); + FREERDP_API int er_write_length(wStream* s, int length, BOOL flag); + FREERDP_API int _er_skip_length(int length); + FREERDP_API int er_get_content_length(int length); + FREERDP_API BOOL er_read_universal_tag(wStream* s, BYTE tag, BOOL pc); + FREERDP_API void er_write_universal_tag(wStream* s, BYTE tag, BOOL pc); + FREERDP_API BOOL er_read_application_tag(wStream* s, BYTE tag, int* length); + FREERDP_API void er_write_application_tag(wStream* s, BYTE tag, int length, BOOL flag); + FREERDP_API BOOL er_read_enumerated(wStream* s, BYTE* enumerated, BYTE count); + FREERDP_API void er_write_enumerated(wStream* s, BYTE enumerated, BYTE count, BOOL flag); + FREERDP_API BOOL er_read_contextual_tag(wStream* s, BYTE tag, int* length, BOOL pc); + FREERDP_API int er_write_contextual_tag(wStream* s, BYTE tag, int length, BOOL pc, BOOL flag); + FREERDP_API int er_skip_contextual_tag(int length); + FREERDP_API BOOL er_read_sequence_tag(wStream* s, int* length); + FREERDP_API int er_write_sequence_tag(wStream* s, int length, BOOL flag); + FREERDP_API int er_skip_sequence(int length); + FREERDP_API int er_skip_sequence_tag(int length); + FREERDP_API BOOL er_read_bit_string(wStream* s, int* length, BYTE* padding); + FREERDP_API BOOL er_write_bit_string_tag(wStream* s, UINT32 length, BYTE padding, BOOL flag); + FREERDP_API BOOL er_read_octet_string(wStream* s, int* length); + FREERDP_API void er_write_octet_string(wStream* s, BYTE* oct_str, int length, BOOL flag); + FREERDP_API int er_write_octet_string_tag(wStream* s, int length, BOOL flag); + FREERDP_API int er_skip_octet_string(int length); + FREERDP_API BOOL er_read_BOOL(wStream* s, BOOL* value); + FREERDP_API void er_write_BOOL(wStream* s, BOOL value); + FREERDP_API BOOL er_read_integer(wStream* s, UINT32* value); + FREERDP_API int er_write_integer(wStream* s, INT32 value); + FREERDP_API BOOL er_read_integer_length(wStream* s, int* length); + FREERDP_API int er_skip_integer(INT32 value); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CRYPTO_ER_H */ diff --git a/include/freerdp/crypto/per.h b/include/freerdp/crypto/per.h new file mode 100644 index 0000000..087a17f --- /dev/null +++ b/include/freerdp/crypto/per.h @@ -0,0 +1,62 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * ASN.1 Packed Encoding Rules (BER) + * + * Copyright 2011-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CRYPTO_PER_H +#define FREERDP_CRYPTO_PER_H + +#include <freerdp/api.h> + +#include <winpr/stream.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API BOOL per_read_length(wStream* s, UINT16* length); + FREERDP_API BOOL per_write_length(wStream* s, UINT16 length); + FREERDP_API BOOL per_read_choice(wStream* s, BYTE* choice); + FREERDP_API BOOL per_write_choice(wStream* s, BYTE choice); + FREERDP_API BOOL per_read_selection(wStream* s, BYTE* selection); + FREERDP_API BOOL per_write_selection(wStream* s, BYTE selection); + FREERDP_API BOOL per_read_number_of_sets(wStream* s, BYTE* number); + FREERDP_API BOOL per_write_number_of_sets(wStream* s, BYTE number); + FREERDP_API BOOL per_read_padding(wStream* s, UINT16 length); + FREERDP_API BOOL per_write_padding(wStream* s, UINT16 length); + FREERDP_API BOOL per_read_integer(wStream* s, UINT32* integer); + FREERDP_API BOOL per_read_integer16(wStream* s, UINT16* integer, UINT16 min); + FREERDP_API BOOL per_write_integer(wStream* s, UINT32 integer); + FREERDP_API BOOL per_write_integer16(wStream* s, UINT16 integer, UINT16 min); + FREERDP_API BOOL per_read_enumerated(wStream* s, BYTE* enumerated, BYTE count); + FREERDP_API BOOL per_write_enumerated(wStream* s, BYTE enumerated, BYTE count); + FREERDP_API BOOL per_write_object_identifier(wStream* s, const BYTE oid[6]); + FREERDP_API BOOL per_read_object_identifier(wStream* s, const BYTE oid[6]); + FREERDP_API BOOL per_read_octet_string(wStream* s, const BYTE* oct_str, UINT16 length, + UINT16 min); + FREERDP_API BOOL per_write_octet_string(wStream* s, const BYTE* oct_str, UINT16 length, + UINT16 min); + FREERDP_API BOOL per_read_numeric_string(wStream* s, UINT16 min); + FREERDP_API BOOL per_write_numeric_string(wStream* s, const BYTE* num_str, UINT16 length, + UINT16 min); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CRYPTO_PER_H */ diff --git a/include/freerdp/crypto/privatekey.h b/include/freerdp/crypto/privatekey.h new file mode 100644 index 0000000..58fd94b --- /dev/null +++ b/include/freerdp/crypto/privatekey.h @@ -0,0 +1,52 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Private key Handling + * + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CRYPTO_PRIVATEKEY_H +#define FREERDP_CRYPTO_PRIVATEKEY_H + +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_private_key rdpPrivateKey; + + FREERDP_API void freerdp_key_free(rdpPrivateKey* key); + + WINPR_ATTR_MALLOC(freerdp_key_free, 1) + FREERDP_API rdpPrivateKey* freerdp_key_new(void); + + WINPR_ATTR_MALLOC(freerdp_key_free, 1) + FREERDP_API rdpPrivateKey* freerdp_key_new_from_file(const char* keyfile); + + WINPR_ATTR_MALLOC(freerdp_key_free, 1) + FREERDP_API rdpPrivateKey* freerdp_key_new_from_pem(const char* pem); + + FREERDP_API BOOL freerdp_key_is_rsa(const rdpPrivateKey* key); + + FREERDP_API size_t freerdp_key_get_bits(const rdpPrivateKey* key); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CRYPTO_PRIVATEKEY_H */ diff --git a/include/freerdp/display.h b/include/freerdp/display.h new file mode 100644 index 0000000..33ae6c7 --- /dev/null +++ b/include/freerdp/display.h @@ -0,0 +1,39 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Display update notifications + * + * Copyright 2019 Kobi Mizrachi <kmizrachi18@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_DISPLAY_H +#define FREERDP_DISPLAY_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API BOOL freerdp_display_send_monitor_layout(rdpContext* context, UINT32 monitorCount, + const MONITOR_DEF* monitorDefArray); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_DISPLAY_UPDATE_H */ diff --git a/include/freerdp/dvc.h b/include/freerdp/dvc.h new file mode 100644 index 0000000..427d086 --- /dev/null +++ b/include/freerdp/dvc.h @@ -0,0 +1,180 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Dynamic Virtual Channel Interface + * + * Copyright 2010-2011 Vic Lee + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * DVC Plugin API: See the original MS DVC Client API: + * http://msdn.microsoft.com/en-us/library/bb540880%28v=VS.85%29.aspx + * + * The FreeRDP DVC Plugin API is a simulation of the MS DVC Client API in C. + * The main difference is that every interface method must take an instance + * pointer as the first parameter. + */ + +/** + * Implemented by DRDYNVC: + * o IWTSVirtualChannelManager + * o IWTSListener + * o IWTSVirtualChannel + * + * Implemented by DVC plugin: + * o IWTSPlugin + * o IWTSListenerCallback + * o IWTSVirtualChannelCallback + * + * A basic DVC plugin implementation: + * 1. DVCPluginEntry: + * The plugin entry point, which creates and initializes a new IWTSPlugin + * instance + * 2. IWTSPlugin.Initialize: + * Call IWTSVirtualChannelManager.CreateListener with a newly created + * IWTSListenerCallback instance + * 3. IWTSListenerCallback.OnNewChannelConnection: + * Create IWTSVirtualChannelCallback instance if the new channel is accepted + */ + +#ifndef FREERDP_DVC_H +#define FREERDP_DVC_H + +#include <freerdp/types.h> +#include <freerdp/addin.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_IWTSVirtualChannelManager IWTSVirtualChannelManager; + typedef struct s_IWTSListener IWTSListener; + typedef struct s_IWTSVirtualChannel IWTSVirtualChannel; + + typedef struct s_IWTSPlugin IWTSPlugin; + typedef struct s_IWTSListenerCallback IWTSListenerCallback; + typedef struct s_IWTSVirtualChannelCallback IWTSVirtualChannelCallback; + + struct s_IWTSListener + { + /* Retrieves the listener-specific configuration. */ + UINT (*GetConfiguration)(IWTSListener* pListener, void** ppPropertyBag); + + void* pInterface; + }; + + struct s_IWTSVirtualChannel + { + /* Starts a write request on the channel. */ + UINT(*Write) + (IWTSVirtualChannel* pChannel, ULONG cbSize, const BYTE* pBuffer, void* pReserved); + /* Closes the channel. */ + UINT (*Close)(IWTSVirtualChannel* pChannel); + }; + + struct s_IWTSVirtualChannelManager + { + /* Returns an instance of a listener object that listens on a specific + endpoint, or creates a static channel. */ + UINT(*CreateListener) + (IWTSVirtualChannelManager* pChannelMgr, const char* pszChannelName, ULONG ulFlags, + IWTSListenerCallback* pListenerCallback, IWTSListener** ppListener); + /* Find the channel or ID to send data to a specific endpoint. */ + UINT32 (*GetChannelId)(IWTSVirtualChannel* channel); + IWTSVirtualChannel* (*FindChannelById)(IWTSVirtualChannelManager* pChannelMgr, + UINT32 ChannelId); + const char* (*GetChannelName)(IWTSVirtualChannel* channel); + UINT (*DestroyListener)(IWTSVirtualChannelManager* pChannelMgr, IWTSListener* ppListener); + }; + + struct s_IWTSPlugin + { + /* Used for the first call that is made from the client to the plug-in. */ + UINT (*Initialize)(IWTSPlugin* pPlugin, IWTSVirtualChannelManager* pChannelMgr); + /* Notifies the plug-in that the Remote Desktop Connection (RDC) client + has successfully connected to the Remote Desktop Session Host (RD + Session Host) server. */ + UINT (*Connected)(IWTSPlugin* pPlugin); + /* Notifies the plug-in that the Remote Desktop Connection (RDC) client + has disconnected from the RD Session Host server. */ + UINT (*Disconnected)(IWTSPlugin* pPlugin, DWORD dwDisconnectCode); + /* Notifies the plug-in that the Remote Desktop Connection (RDC) client + has terminated. */ + UINT (*Terminated)(IWTSPlugin* pPlugin); + + UINT (*Attached)(IWTSPlugin* pPlugin); + + UINT (*Detached)(IWTSPlugin* pPlugin); + + /* Extended */ + + void* pInterface; + }; + + struct s_IWTSListenerCallback + { + /* Accepts or denies a connection request for an incoming connection to + the associated listener. */ + UINT(*OnNewChannelConnection) + (IWTSListenerCallback* pListenerCallback, IWTSVirtualChannel* pChannel, BYTE* Data, + BOOL* pbAccept, IWTSVirtualChannelCallback** ppCallback); + + void* pInterface; + }; + + struct s_IWTSVirtualChannelCallback + { + UINT(*OnDataReceived) + (IWTSVirtualChannelCallback* pChannelCallback, + wStream* data); /**< Notifies the user about data that is being received. */ + UINT(*OnOpen) + (IWTSVirtualChannelCallback* + pChannelCallback); /**< Notifies the user that the channel has been opened. */ + UINT(*OnClose) + (IWTSVirtualChannelCallback* + pChannelCallback); /**< Notifies the user that the channel has been closed. */ + + void* pInterface; + }; + + /* The DVC Plugin entry points */ + typedef struct rdp_context rdpContext; /* forward declaration, necessary to avoid + * circular includes */ + + typedef struct S_IDRDYNVC_ENTRY_POINTS IDRDYNVC_ENTRY_POINTS; + struct S_IDRDYNVC_ENTRY_POINTS + { + UINT(*RegisterPlugin) + (IDRDYNVC_ENTRY_POINTS* pEntryPoints, const char* name, IWTSPlugin* pPlugin); + IWTSPlugin* (*GetPlugin)(IDRDYNVC_ENTRY_POINTS* pEntryPoints, const char* name); + const ADDIN_ARGV* (*GetPluginData)(IDRDYNVC_ENTRY_POINTS* pEntryPoints); + rdpSettings* (*GetRdpSettings)(IDRDYNVC_ENTRY_POINTS* pEntryPoints); + rdpContext* (*GetRdpContext)(IDRDYNVC_ENTRY_POINTS* pEntryPoints); + }; + + typedef UINT (*PDVC_PLUGIN_ENTRY)(IDRDYNVC_ENTRY_POINTS*); + + void* get_callback_by_name(const char* name, void** context); + void add_callback_by_name(const char* name, void* fkt, void* context); + void remove_callback_by_name(const char* name, void* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_DVC_H */ diff --git a/include/freerdp/emulate/scard/smartcard_emulate.h b/include/freerdp/emulate/scard/smartcard_emulate.h new file mode 100644 index 0000000..c2865b4 --- /dev/null +++ b/include/freerdp/emulate/scard/smartcard_emulate.h @@ -0,0 +1,363 @@ +/** + * WinPR: Windows Portable Runtime + * Smart Card API emulation + * + * Copyright 2021 Armin Novak <armin.novak@thincast.com> + * Copyright 2021 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WINPR_SMARTCARD_EMULATE_PRIVATE_H +#define WINPR_SMARTCARD_EMULATE_PRIVATE_H + +#include <winpr/platform.h> +#include <winpr/smartcard.h> + +#include <freerdp/api.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct smartcard_emulation_context SmartcardEmulationContext; + + FREERDP_API void Emulate_Free(SmartcardEmulationContext* context); + + WINPR_ATTR_MALLOC(Emulate_Free, 1) + FREERDP_API SmartcardEmulationContext* Emulate_New(const rdpSettings* settings); + + FREERDP_API BOOL Emulate_IsConfigured(SmartcardEmulationContext* context); + + FREERDP_API LONG WINAPI Emulate_SCardEstablishContext(SmartcardEmulationContext* smartcard, + DWORD dwScope, LPCVOID pvReserved1, + LPCVOID pvReserved2, + LPSCARDCONTEXT phContext); + + FREERDP_API LONG WINAPI Emulate_SCardReleaseContext(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext); + + FREERDP_API LONG WINAPI Emulate_SCardIsValidContext(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext); + + FREERDP_API LONG WINAPI Emulate_SCardListReaderGroupsA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPSTR mszGroups, + LPDWORD pcchGroups); + + FREERDP_API LONG WINAPI Emulate_SCardListReaderGroupsW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPWSTR mszGroups, + LPDWORD pcchGroups); + + FREERDP_API LONG WINAPI Emulate_SCardListReadersA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCSTR mszGroups, + LPSTR mszReaders, LPDWORD pcchReaders); + + FREERDP_API LONG WINAPI Emulate_SCardListReadersW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCWSTR mszGroups, + LPWSTR mszReaders, LPDWORD pcchReaders); + + FREERDP_API LONG WINAPI Emulate_SCardListCardsA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCBYTE pbAtr, + LPCGUID rgquidInterfaces, + DWORD cguidInterfaceCount, CHAR* mszCards, + LPDWORD pcchCards); + + FREERDP_API LONG WINAPI Emulate_SCardListCardsW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCBYTE pbAtr, + LPCGUID rgquidInterfaces, + DWORD cguidInterfaceCount, WCHAR* mszCards, + LPDWORD pcchCards); + + FREERDP_API LONG WINAPI Emulate_SCardListInterfacesA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCSTR szCard, + LPGUID pguidInterfaces, + LPDWORD pcguidInterfaces); + + FREERDP_API LONG WINAPI Emulate_SCardListInterfacesW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCWSTR szCard, + LPGUID pguidInterfaces, + LPDWORD pcguidInterfaces); + + FREERDP_API LONG WINAPI Emulate_SCardGetProviderIdA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCSTR szCard, + LPGUID pguidProviderId); + + FREERDP_API LONG WINAPI Emulate_SCardGetProviderIdW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCWSTR szCard, + LPGUID pguidProviderId); + + FREERDP_API LONG WINAPI Emulate_SCardGetCardTypeProviderNameA( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCSTR szCardName, + DWORD dwProviderId, CHAR* szProvider, LPDWORD pcchProvider); + + FREERDP_API LONG WINAPI Emulate_SCardGetCardTypeProviderNameW( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCWSTR szCardName, + DWORD dwProviderId, WCHAR* szProvider, LPDWORD pcchProvider); + + FREERDP_API LONG WINAPI Emulate_SCardIntroduceReaderGroupA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCSTR szGroupName); + + FREERDP_API LONG WINAPI Emulate_SCardIntroduceReaderGroupW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCWSTR szGroupName); + + FREERDP_API LONG WINAPI Emulate_SCardForgetReaderGroupA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCSTR szGroupName); + + FREERDP_API LONG WINAPI Emulate_SCardForgetReaderGroupW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCWSTR szGroupName); + + FREERDP_API LONG WINAPI Emulate_SCardIntroduceReaderA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCSTR szReaderName, LPCSTR szDeviceName); + + FREERDP_API LONG WINAPI Emulate_SCardIntroduceReaderW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCWSTR szReaderName, + LPCWSTR szDeviceName); + + FREERDP_API LONG WINAPI Emulate_SCardForgetReaderA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCSTR szReaderName); + + FREERDP_API LONG WINAPI Emulate_SCardForgetReaderW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCWSTR szReaderName); + + FREERDP_API LONG WINAPI Emulate_SCardAddReaderToGroupA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCSTR szReaderName, LPCSTR szGroupName); + + FREERDP_API LONG WINAPI Emulate_SCardAddReaderToGroupW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCWSTR szReaderName, + LPCWSTR szGroupName); + + FREERDP_API LONG WINAPI + Emulate_SCardRemoveReaderFromGroupA(SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, + LPCSTR szReaderName, LPCSTR szGroupName); + + FREERDP_API LONG WINAPI + Emulate_SCardRemoveReaderFromGroupW(SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, + LPCWSTR szReaderName, LPCWSTR szGroupName); + + FREERDP_API LONG WINAPI Emulate_SCardIntroduceCardTypeA( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCSTR szCardName, + LPCGUID pguidPrimaryProvider, LPCGUID rgguidInterfaces, DWORD dwInterfaceCount, + LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen); + + FREERDP_API LONG WINAPI Emulate_SCardIntroduceCardTypeW( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCWSTR szCardName, + LPCGUID pguidPrimaryProvider, LPCGUID rgguidInterfaces, DWORD dwInterfaceCount, + LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen); + + FREERDP_API LONG WINAPI Emulate_SCardSetCardTypeProviderNameA( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCSTR szCardName, + DWORD dwProviderId, LPCSTR szProvider); + + FREERDP_API LONG WINAPI Emulate_SCardSetCardTypeProviderNameW( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCWSTR szCardName, + DWORD dwProviderId, LPCWSTR szProvider); + + FREERDP_API LONG WINAPI Emulate_SCardForgetCardTypeA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCSTR szCardName); + + FREERDP_API LONG WINAPI Emulate_SCardForgetCardTypeW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCWSTR szCardName); + + FREERDP_API LONG WINAPI Emulate_SCardFreeMemory(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPVOID pvMem); + + FREERDP_API HANDLE WINAPI Emulate_SCardAccessStartedEvent(SmartcardEmulationContext* smartcard); + + FREERDP_API void WINAPI Emulate_SCardReleaseStartedEvent(SmartcardEmulationContext* smartcard); + + FREERDP_API LONG WINAPI Emulate_SCardLocateCardsA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCSTR mszCards, + LPSCARD_READERSTATEA rgReaderStates, + DWORD cReaders); + + FREERDP_API LONG WINAPI Emulate_SCardLocateCardsW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCWSTR mszCards, + LPSCARD_READERSTATEW rgReaderStates, + DWORD cReaders); + + FREERDP_API LONG WINAPI Emulate_SCardLocateCardsByATRA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs, + LPSCARD_READERSTATEA rgReaderStates, + DWORD cReaders); + + FREERDP_API LONG WINAPI Emulate_SCardLocateCardsByATRW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs, + LPSCARD_READERSTATEW rgReaderStates, + DWORD cReaders); + + FREERDP_API LONG WINAPI Emulate_SCardGetStatusChangeA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, DWORD dwTimeout, + LPSCARD_READERSTATEA rgReaderStates, + DWORD cReaders); + + FREERDP_API LONG WINAPI Emulate_SCardGetStatusChangeW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, DWORD dwTimeout, + LPSCARD_READERSTATEW rgReaderStates, + DWORD cReaders); + + FREERDP_API LONG WINAPI Emulate_SCardCancel(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext); + + FREERDP_API LONG WINAPI Emulate_SCardConnectA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCSTR szReader, + DWORD dwShareMode, DWORD dwPreferredProtocols, + LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol); + + FREERDP_API LONG WINAPI Emulate_SCardConnectW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCWSTR szReader, + DWORD dwShareMode, DWORD dwPreferredProtocols, + LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol); + + FREERDP_API LONG WINAPI Emulate_SCardReconnect(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, DWORD dwShareMode, + DWORD dwPreferredProtocols, + DWORD dwInitialization, + LPDWORD pdwActiveProtocol); + + FREERDP_API LONG WINAPI Emulate_SCardDisconnect(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, DWORD dwDisposition); + + FREERDP_API LONG WINAPI Emulate_SCardBeginTransaction(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard); + + FREERDP_API LONG WINAPI Emulate_SCardEndTransaction(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, DWORD dwDisposition); + + FREERDP_API LONG WINAPI Emulate_SCardCancelTransaction(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard); + + FREERDP_API LONG WINAPI Emulate_SCardState(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, LPDWORD pdwState, + LPDWORD pdwProtocol, LPBYTE pbAtr, + LPDWORD pcbAtrLen); + + FREERDP_API LONG WINAPI Emulate_SCardStatusA(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, LPSTR mszReaderNames, + LPDWORD pcchReaderLen, LPDWORD pdwState, + LPDWORD pdwProtocol, LPBYTE pbAtr, + LPDWORD pcbAtrLen); + + FREERDP_API LONG WINAPI Emulate_SCardStatusW(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, LPWSTR mszReaderNames, + LPDWORD pcchReaderLen, LPDWORD pdwState, + LPDWORD pdwProtocol, LPBYTE pbAtr, + LPDWORD pcbAtrLen); + + FREERDP_API LONG WINAPI Emulate_SCardTransmit(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci, + LPCBYTE pbSendBuffer, DWORD cbSendLength, + LPSCARD_IO_REQUEST pioRecvPci, + LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength); + + FREERDP_API LONG WINAPI Emulate_SCardGetTransmitCount(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, + LPDWORD pcTransmitCount); + + FREERDP_API LONG WINAPI Emulate_SCardControl(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, DWORD dwControlCode, + LPCVOID lpInBuffer, DWORD cbInBufferSize, + LPVOID lpOutBuffer, DWORD cbOutBufferSize, + LPDWORD lpBytesReturned); + + FREERDP_API LONG WINAPI Emulate_SCardGetAttrib(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, + LPDWORD pcbAttrLen); + + FREERDP_API LONG WINAPI Emulate_SCardSetAttrib(SmartcardEmulationContext* smartcard, + SCARDHANDLE hCard, DWORD dwAttrId, + LPCBYTE pbAttr, DWORD cbAttrLen); + + FREERDP_API LONG WINAPI Emulate_SCardUIDlgSelectCardA(SmartcardEmulationContext* smartcard, + LPOPENCARDNAMEA_EX pDlgStruc); + + FREERDP_API LONG WINAPI Emulate_SCardUIDlgSelectCardW(SmartcardEmulationContext* smartcard, + LPOPENCARDNAMEW_EX pDlgStruc); + + FREERDP_API LONG WINAPI Emulate_GetOpenCardNameA(SmartcardEmulationContext* smartcard, + LPOPENCARDNAMEA pDlgStruc); + + FREERDP_API LONG WINAPI Emulate_GetOpenCardNameW(SmartcardEmulationContext* smartcard, + LPOPENCARDNAMEW pDlgStruc); + + FREERDP_API LONG WINAPI Emulate_SCardDlgExtendedError(SmartcardEmulationContext* smartcard); + + FREERDP_API LONG WINAPI Emulate_SCardReadCacheA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, UUID* CardIdentifier, + DWORD FreshnessCounter, LPSTR LookupName, + PBYTE Data, DWORD* DataLen); + + FREERDP_API LONG WINAPI Emulate_SCardReadCacheW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, UUID* CardIdentifier, + DWORD FreshnessCounter, LPWSTR LookupName, + PBYTE Data, DWORD* DataLen); + + FREERDP_API LONG WINAPI Emulate_SCardWriteCacheA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, UUID* CardIdentifier, + DWORD FreshnessCounter, LPSTR LookupName, + PBYTE Data, DWORD DataLen); + + FREERDP_API LONG WINAPI Emulate_SCardWriteCacheW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, UUID* CardIdentifier, + DWORD FreshnessCounter, LPWSTR LookupName, + PBYTE Data, DWORD DataLen); + + FREERDP_API LONG WINAPI Emulate_SCardGetReaderIconA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCSTR szReaderName, + LPBYTE pbIcon, LPDWORD pcbIcon); + + FREERDP_API LONG WINAPI Emulate_SCardGetReaderIconW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, LPCWSTR szReaderName, + LPBYTE pbIcon, LPDWORD pcbIcon); + + FREERDP_API LONG WINAPI Emulate_SCardGetDeviceTypeIdA(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCSTR szReaderName, + LPDWORD pdwDeviceTypeId); + FREERDP_API LONG WINAPI Emulate_SCardGetDeviceTypeIdW(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, + LPCWSTR szReaderName, + LPDWORD pdwDeviceTypeId); + + FREERDP_API LONG WINAPI Emulate_SCardGetReaderDeviceInstanceIdA( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCSTR szReaderName, + LPSTR szDeviceInstanceId, LPDWORD pcchDeviceInstanceId); + + FREERDP_API LONG WINAPI Emulate_SCardGetReaderDeviceInstanceIdW( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCWSTR szReaderName, + LPWSTR szDeviceInstanceId, LPDWORD pcchDeviceInstanceId); + FREERDP_API LONG WINAPI Emulate_SCardListReadersWithDeviceInstanceIdA( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCSTR szDeviceInstanceId, + LPSTR mszReaders, LPDWORD pcchReaders); + FREERDP_API LONG WINAPI Emulate_SCardListReadersWithDeviceInstanceIdW( + SmartcardEmulationContext* smartcard, SCARDCONTEXT hContext, LPCWSTR szDeviceInstanceId, + LPWSTR mszReaders, LPDWORD pcchReaders); + FREERDP_API LONG WINAPI Emulate_SCardAudit(SmartcardEmulationContext* smartcard, + SCARDCONTEXT hContext, DWORD dwEvent); + +#ifdef __cplusplus +} +#endif + +#endif /* WINPR_SMARTCARD_EMULATE_PRIVATE_H */ diff --git a/include/freerdp/error.h b/include/freerdp/error.h new file mode 100644 index 0000000..58f9316 --- /dev/null +++ b/include/freerdp/error.h @@ -0,0 +1,360 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Error Codes + * + * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_ERROR_H +#define FREERDP_ERROR_H + +#include <winpr/crt.h> + +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Error categories */ +#define CAT_NONE "success" +#define CAT_USE "use" +#define CAT_BROKER "broker" +#define CAT_GATEWAY "gateway" +#define CAT_LICENSING "licensing" +#define CAT_SERVER "server" +#define CAT_CONFIG "config" +#define CAT_PROTOCOL "protocol" +#define CAT_ADMIN "administrative" + +/** + * Error Info Codes (Error Info PDU) + */ + +/* Protocol-independent codes */ +#define ERRINFO_RPC_INITIATED_DISCONNECT 0x00000001 +#define ERRINFO_RPC_INITIATED_LOGOFF 0x00000002 +#define ERRINFO_IDLE_TIMEOUT 0x00000003 +#define ERRINFO_LOGON_TIMEOUT 0x00000004 +#define ERRINFO_DISCONNECTED_BY_OTHER_CONNECTION 0x00000005 +#define ERRINFO_OUT_OF_MEMORY 0x00000006 +#define ERRINFO_SERVER_DENIED_CONNECTION 0x00000007 +#define ERRINFO_SERVER_INSUFFICIENT_PRIVILEGES 0x00000009 +#define ERRINFO_SERVER_FRESH_CREDENTIALS_REQUIRED 0x0000000A +#define ERRINFO_RPC_INITIATED_DISCONNECT_BY_USER 0x0000000B +#define ERRINFO_LOGOFF_BY_USER 0x0000000C +#define ERRINFO_CLOSE_STACK_ON_DRIVER_NOT_READY 0x0000000F +#define ERRINFO_SERVER_DWM_CRASH 0x00000010 +#define ERRINFO_CLOSE_STACK_ON_DRIVER_FAILURE 0x00000011 +#define ERRINFO_CLOSE_STACK_ON_DRIVER_IFACE_FAILURE 0x00000012 +#define ERRINFO_SERVER_WINLOGON_CRASH 0x00000017 +#define ERRINFO_SERVER_CSRSS_CRASH 0x00000018 + +/* Protocol-independent licensing codes */ +#define ERRINFO_LICENSE_INTERNAL 0x00000100 +#define ERRINFO_LICENSE_NO_LICENSE_SERVER 0x00000101 +#define ERRINFO_LICENSE_NO_LICENSE 0x00000102 +#define ERRINFO_LICENSE_BAD_CLIENT_MSG 0x00000103 +#define ERRINFO_LICENSE_HWID_DOESNT_MATCH_LICENSE 0x00000104 +#define ERRINFO_LICENSE_BAD_CLIENT_LICENSE 0x00000105 +#define ERRINFO_LICENSE_CANT_FINISH_PROTOCOL 0x00000106 +#define ERRINFO_LICENSE_CLIENT_ENDED_PROTOCOL 0x00000107 +#define ERRINFO_LICENSE_BAD_CLIENT_ENCRYPTION 0x00000108 +#define ERRINFO_LICENSE_CANT_UPGRADE_LICENSE 0x00000109 +#define ERRINFO_LICENSE_NO_REMOTE_CONNECTIONS 0x0000010A + +/* Protocol-independent codes generated by the Connection Broker */ +#define ERRINFO_CB_DESTINATION_NOT_FOUND 0x0000400 +#define ERRINFO_CB_LOADING_DESTINATION 0x0000402 +#define ERRINFO_CB_REDIRECTING_TO_DESTINATION 0x0000404 +#define ERRINFO_CB_SESSION_ONLINE_VM_WAKE 0x0000405 +#define ERRINFO_CB_SESSION_ONLINE_VM_BOOT 0x0000406 +#define ERRINFO_CB_SESSION_ONLINE_VM_NO_DNS 0x0000407 +#define ERRINFO_CB_DESTINATION_POOL_NOT_FREE 0x0000408 +#define ERRINFO_CB_CONNECTION_CANCELLED 0x0000409 +#define ERRINFO_CB_CONNECTION_ERROR_INVALID_SETTINGS 0x0000410 +#define ERRINFO_CB_SESSION_ONLINE_VM_BOOT_TIMEOUT 0x0000411 +#define ERRINFO_CB_SESSION_ONLINE_VM_SESSMON_FAILED 0x0000412 + +/* RDP specific codes */ +#define ERRINFO_UNKNOWN_DATA_PDU_TYPE 0x000010C9 +#define ERRINFO_UNKNOWN_PDU_TYPE 0x000010CA +#define ERRINFO_DATA_PDU_SEQUENCE 0x000010CB +#define ERRINFO_CONTROL_PDU_SEQUENCE 0x000010CD +#define ERRINFO_INVALID_CONTROL_PDU_ACTION 0x000010CE +#define ERRINFO_INVALID_INPUT_PDU_TYPE 0x000010CF +#define ERRINFO_INVALID_INPUT_PDU_MOUSE 0x000010D0 +#define ERRINFO_INVALID_REFRESH_RECT_PDU 0x000010D1 +#define ERRINFO_CREATE_USER_DATA_FAILED 0x000010D2 +#define ERRINFO_CONNECT_FAILED 0x000010D3 +#define ERRINFO_CONFIRM_ACTIVE_HAS_WRONG_SHAREID 0x000010D4 +#define ERRINFO_CONFIRM_ACTIVE_HAS_WRONG_ORIGINATOR 0x000010D5 +#define ERRINFO_PERSISTENT_KEY_PDU_BAD_LENGTH 0x000010DA +#define ERRINFO_PERSISTENT_KEY_PDU_ILLEGAL_FIRST 0x000010DB +#define ERRINFO_PERSISTENT_KEY_PDU_TOO_MANY_TOTAL_KEYS 0x000010DC +#define ERRINFO_PERSISTENT_KEY_PDU_TOO_MANY_CACHE_KEYS 0x000010DD +#define ERRINFO_INPUT_PDU_BAD_LENGTH 0x000010DE +#define ERRINFO_BITMAP_CACHE_ERROR_PDU_BAD_LENGTH 0x000010DF +#define ERRINFO_SECURITY_DATA_TOO_SHORT 0x000010E0 +#define ERRINFO_VCHANNEL_DATA_TOO_SHORT 0x000010E1 +#define ERRINFO_SHARE_DATA_TOO_SHORT 0x000010E2 +#define ERRINFO_BAD_SUPPRESS_OUTPUT_PDU 0x000010E3 +#define ERRINFO_CONFIRM_ACTIVE_PDU_TOO_SHORT 0x000010E5 +#define ERRINFO_CAPABILITY_SET_TOO_SMALL 0x000010E7 +#define ERRINFO_CAPABILITY_SET_TOO_LARGE 0x000010E8 +#define ERRINFO_NO_CURSOR_CACHE 0x000010E9 +#define ERRINFO_BAD_CAPABILITIES 0x000010EA +#define ERRINFO_VIRTUAL_CHANNEL_DECOMPRESSION 0x000010EC +#define ERRINFO_INVALID_VC_COMPRESSION_TYPE 0x000010ED +#define ERRINFO_INVALID_CHANNEL_ID 0x000010EF +#define ERRINFO_VCHANNELS_TOO_MANY 0x000010F0 +#define ERRINFO_REMOTEAPP_NOT_ENABLED 0x000010F3 +#define ERRINFO_CACHE_CAP_NOT_SET 0x000010F4 +#define ERRINFO_BITMAP_CACHE_ERROR_PDU_BAD_LENGTH2 0x000010F5 +#define ERRINFO_OFFSCREEN_CACHE_ERROR_PDU_BAD_LENGTH 0x000010F6 +#define ERRINFO_DRAWNINEGRID_CACHE_ERROR_PDU_BAD_LENGTH 0x000010F7 +#define ERRINFO_GDIPLUS_PDU_BAD_LENGTH 0x000010F8 +#define ERRINFO_SECURITY_DATA_TOO_SHORT2 0x00001111 +#define ERRINFO_SECURITY_DATA_TOO_SHORT3 0x00001112 +#define ERRINFO_SECURITY_DATA_TOO_SHORT4 0x00001113 +#define ERRINFO_SECURITY_DATA_TOO_SHORT5 0x00001114 +#define ERRINFO_SECURITY_DATA_TOO_SHORT6 0x00001115 +#define ERRINFO_SECURITY_DATA_TOO_SHORT7 0x00001116 +#define ERRINFO_SECURITY_DATA_TOO_SHORT8 0x00001117 +#define ERRINFO_SECURITY_DATA_TOO_SHORT9 0x00001118 +#define ERRINFO_SECURITY_DATA_TOO_SHORT10 0x00001119 +#define ERRINFO_SECURITY_DATA_TOO_SHORT11 0x0000111A +#define ERRINFO_SECURITY_DATA_TOO_SHORT12 0x0000111B +#define ERRINFO_SECURITY_DATA_TOO_SHORT13 0x0000111C +#define ERRINFO_SECURITY_DATA_TOO_SHORT14 0x0000111D +#define ERRINFO_SECURITY_DATA_TOO_SHORT15 0x0000111E +#define ERRINFO_SECURITY_DATA_TOO_SHORT16 0x0000111F +#define ERRINFO_SECURITY_DATA_TOO_SHORT17 0x00001120 +#define ERRINFO_SECURITY_DATA_TOO_SHORT18 0x00001121 +#define ERRINFO_SECURITY_DATA_TOO_SHORT19 0x00001122 +#define ERRINFO_SECURITY_DATA_TOO_SHORT20 0x00001123 +#define ERRINFO_SECURITY_DATA_TOO_SHORT21 0x00001124 +#define ERRINFO_SECURITY_DATA_TOO_SHORT22 0x00001125 +#define ERRINFO_SECURITY_DATA_TOO_SHORT23 0x00001126 +#define ERRINFO_BAD_MONITOR_DATA 0x00001129 +#define ERRINFO_VC_DECOMPRESSED_REASSEMBLE_FAILED 0x0000112A +#define ERRINFO_VC_DATA_TOO_LONG 0x0000112B +#define ERRINFO_BAD_FRAME_ACK_DATA 0x0000112C +#define ERRINFO_GRAPHICS_MODE_NOT_SUPPORTED 0x0000112D +#define ERRINFO_GRAPHICS_SUBSYSTEM_RESET_FAILED 0x0000112E +#define ERRINFO_GRAPHICS_SUBSYSTEM_FAILED 0x0000112F +#define ERRINFO_TIMEZONE_KEY_NAME_LENGTH_TOO_SHORT 0x00001130 +#define ERRINFO_TIMEZONE_KEY_NAME_LENGTH_TOO_LONG 0x00001131 +#define ERRINFO_DYNAMIC_DST_DISABLED_FIELD_MISSING 0x00001132 +#define ERRINFO_VC_DECODING_ERROR 0x00001133 +#define ERRINFO_VIRTUALDESKTOPTOOLARGE 0x00001134 +#define ERRINFO_MONITORGEOMETRYVALIDATIONFAILED 0x00001135 +#define ERRINFO_INVALIDMONITORCOUNT 0x00001136 +#define ERRINFO_UPDATE_SESSION_KEY_FAILED 0x00001191 +#define ERRINFO_DECRYPT_FAILED 0x00001192 +#define ERRINFO_ENCRYPT_FAILED 0x00001193 +#define ERRINFO_ENCRYPTION_PACKAGE_MISMATCH 0x00001194 +#define ERRINFO_DECRYPT_FAILED2 0x00001195 +#define ERRINFO_PEER_DISCONNECTED 0x00001196 + +#define ERRINFO_SUCCESS 0x00000000 +#define ERRINFO_NONE 0xFFFFFFFF + + FREERDP_API const char* freerdp_get_error_info_string(UINT32 code); + FREERDP_API const char* freerdp_get_error_info_name(UINT32 code); + FREERDP_API const char* freerdp_get_error_info_category(UINT32 code); + + /** + * FreeRDP Context Error Codes + */ + +#define MAKE_FREERDP_ERROR(_class, _type) (((FREERDP_ERROR_##_class##_CLASS) << 16) | (_type)) + +#define GET_FREERDP_ERROR_CLASS(_errorCode) ((_errorCode >> 16) & 0xFFFF) + +#define GET_FREERDP_ERROR_TYPE(_errorCode) (_errorCode & 0xFFFF) + +#define GET_FREERDP_ERROR_SUBCODE + +#define FREERDP_ERROR_BASE 0 + +/** + * Error Base Codes + */ +#define FREERDP_ERROR_ERRBASE_CLASS (FREERDP_ERROR_BASE + 0) + +#define ERRBASE_SUCCESS ERRINFO_SUCCESS +#define ERRBASE_NONE ERRINFO_NONE + + FREERDP_API const char* freerdp_get_error_base_string(UINT32 code); + FREERDP_API const char* freerdp_get_error_base_name(UINT32 code); + FREERDP_API const char* freerdp_get_error_base_category(UINT32 code); + +#define FREERDP_ERROR_SUCCESS ERRINFO_SUCCESS +#define FREERDP_ERROR_NONE ERRINFO_NONE + + /* Error Info Codes */ + +#define FREERDP_ERROR_ERRINFO_CLASS (FREERDP_ERROR_BASE + 1) + +#define FREERDP_ERROR_RPC_INITIATED_DISCONNECT \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_RPC_INITIATED_DISCONNECT) +#define FREERDP_ERROR_RPC_INITIATED_LOGOFF MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_RPC_INITIATED_LOGOFF) +#define FREERDP_ERROR_IDLE_TIMEOUT MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_IDLE_TIMEOUT) +#define FREERDP_ERROR_LOGON_TIMEOUT MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_LOGON_TIMEOUT) +#define FREERDP_ERROR_DISCONNECTED_BY_OTHER_CONNECTION \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_DISCONNECTED_BY_OTHER_CONNECTION) +#define FREERDP_ERROR_OUT_OF_MEMORY MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_OUT_OF_MEMORY) +#define FREERDP_ERROR_SERVER_DENIED_CONNECTION \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_SERVER_DENIED_CONNECTION) +#define FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_SERVER_INSUFFICIENT_PRIVILEGES) +#define FREERDP_ERROR_SERVER_FRESH_CREDENTIALS_REQUIRED \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_SERVER_FRESH_CREDENTIALS_REQUIRED) +#define FREERDP_ERROR_RPC_INITIATED_DISCONNECT_BY_USER \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_RPC_INITIATED_DISCONNECT_BY_USER) +#define FREERDP_ERROR_LOGOFF_BY_USER MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_LOGOFF_BY_USER) + +#define FREERDP_ERROR_CLOSE_STACK_ON_DRIVER_NOT_READY \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_CLOSE_STACK_ON_DRIVER_NOT_READY) +#define FREERDP_ERROR_SERVER_DWM_CRASH MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_SERVER_DWM_CRASH) +#define FREERDP_ERROR_CLOSE_STACK_ON_DRIVER_FAILURE \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_CLOSE_STACK_ON_DRIVER_FAILURE) +#define FREERDP_ERROR_CLOSE_STACK_ON_DRIVER_IFACE_FAILURE \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_CLOSE_STACK_ON_DRIVER_IFACE_FAILURE) +#define FREERDP_ERROR_SERVER_WINLOGON_CRASH \ + MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_SERVER_WINLOGON_CRASH) +#define FREERDP_ERROR_SERVER_CSRSS_CRASH MAKE_FREERDP_ERROR(ERRINFO, ERRINFO_SERVER_CSRSS_CRASH) + +/* Connection Error Codes */ +#define ERRCONNECT_PRE_CONNECT_FAILED 0x00000001 +#define ERRCONNECT_CONNECT_UNDEFINED 0x00000002 +#define ERRCONNECT_POST_CONNECT_FAILED 0x00000003 +#define ERRCONNECT_DNS_ERROR 0x00000004 +#define ERRCONNECT_DNS_NAME_NOT_FOUND 0x00000005 +#define ERRCONNECT_CONNECT_FAILED 0x00000006 +#define ERRCONNECT_MCS_CONNECT_INITIAL_ERROR 0x00000007 +#define ERRCONNECT_TLS_CONNECT_FAILED 0x00000008 +#define ERRCONNECT_AUTHENTICATION_FAILED 0x00000009 +#define ERRCONNECT_INSUFFICIENT_PRIVILEGES 0x0000000A +#define ERRCONNECT_CONNECT_CANCELLED 0x0000000B +#define ERRCONNECT_SECURITY_NEGO_CONNECT_FAILED 0x0000000C +#define ERRCONNECT_CONNECT_TRANSPORT_FAILED 0x0000000D +#define ERRCONNECT_PASSWORD_EXPIRED 0x0000000E +/* For non-domain workstation where we can't contact a kerberos server */ +#define ERRCONNECT_PASSWORD_CERTAINLY_EXPIRED 0x0000000F +#define ERRCONNECT_CLIENT_REVOKED 0x00000010 +#define ERRCONNECT_KDC_UNREACHABLE 0x00000011 + +#define ERRCONNECT_ACCOUNT_DISABLED 0x00000012 +#define ERRCONNECT_PASSWORD_MUST_CHANGE 0x00000013 +#define ERRCONNECT_LOGON_FAILURE 0x00000014 +#define ERRCONNECT_WRONG_PASSWORD 0x00000015 +#define ERRCONNECT_ACCESS_DENIED 0x00000016 +#define ERRCONNECT_ACCOUNT_RESTRICTION 0x00000017 +#define ERRCONNECT_ACCOUNT_LOCKED_OUT 0x00000018 +#define ERRCONNECT_ACCOUNT_EXPIRED 0x00000019 +#define ERRCONNECT_LOGON_TYPE_NOT_GRANTED 0x0000001A +#define ERRCONNECT_NO_OR_MISSING_CREDENTIALS 0x0000001B +#define ERRCONNECT_ACTIVATION_TIMEOUT 0x0000001C + +#define ERRCONNECT_SUCCESS ERRINFO_SUCCESS +#define ERRCONNECT_NONE ERRINFO_NONE + + FREERDP_API const char* freerdp_get_error_connect_string(UINT32 code); + FREERDP_API const char* freerdp_get_error_connect_name(UINT32 code); + FREERDP_API const char* freerdp_get_error_connect_category(UINT32 code); + +#define FREERDP_ERROR_CONNECT_CLASS (FREERDP_ERROR_BASE + 2) + +#define FREERDP_ERROR_PRE_CONNECT_FAILED MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_PRE_CONNECT_FAILED) + +#define FREERDP_ERROR_CONNECT_UNDEFINED MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_CONNECT_UNDEFINED) + +#define FREERDP_ERROR_POST_CONNECT_FAILED \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_POST_CONNECT_FAILED) + +#define FREERDP_ERROR_DNS_ERROR MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_DNS_ERROR) + +#define FREERDP_ERROR_DNS_NAME_NOT_FOUND MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_DNS_NAME_NOT_FOUND) + +#define FREERDP_ERROR_CONNECT_FAILED MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_CONNECT_FAILED) + +#define FREERDP_ERROR_MCS_CONNECT_INITIAL_ERROR \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_MCS_CONNECT_INITIAL_ERROR) + +#define FREERDP_ERROR_TLS_CONNECT_FAILED MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_TLS_CONNECT_FAILED) + +#define FREERDP_ERROR_AUTHENTICATION_FAILED \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_AUTHENTICATION_FAILED) + +#define FREERDP_ERROR_INSUFFICIENT_PRIVILEGES \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_INSUFFICIENT_PRIVILEGES) + +#define FREERDP_ERROR_CONNECT_CANCELLED MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_CONNECT_CANCELLED) + +#define FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_SECURITY_NEGO_CONNECT_FAILED) + +#define FREERDP_ERROR_CONNECT_TRANSPORT_FAILED \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_CONNECT_TRANSPORT_FAILED) + +#define FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_PASSWORD_EXPIRED) + +#define FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_PASSWORD_MUST_CHANGE) + +#define FREERDP_ERROR_CONNECT_KDC_UNREACHABLE \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_KDC_UNREACHABLE) + +#define FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_ACCOUNT_DISABLED) + +#define FREERDP_ERROR_CONNECT_PASSWORD_CERTAINLY_EXPIRED \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_PASSWORD_CERTAINLY_EXPIRED) + +#define FREERDP_ERROR_CONNECT_CLIENT_REVOKED MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_CLIENT_REVOKED) + +#define FREERDP_ERROR_CONNECT_LOGON_FAILURE MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_LOGON_FAILURE) + +#define FREERDP_ERROR_CONNECT_WRONG_PASSWORD MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_WRONG_PASSWORD) + +#define FREERDP_ERROR_CONNECT_ACCESS_DENIED MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_ACCESS_DENIED) + +#define FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_ACCOUNT_RESTRICTION) + +#define FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_ACCOUNT_LOCKED_OUT) + +#define FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_ACCOUNT_EXPIRED) + +#define FREERDP_ERROR_CONNECT_LOGON_TYPE_NOT_GRANTED \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_LOGON_TYPE_NOT_GRANTED) + +#define FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_NO_OR_MISSING_CREDENTIALS) + +#define FREERDP_ERROR_CONNECT_ACTIVATION_TIMEOUT \ + MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_ACTIVATION_TIMEOUT) + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_ERROR_H */ diff --git a/include/freerdp/event.h b/include/freerdp/event.h new file mode 100644 index 0000000..41662d6 --- /dev/null +++ b/include/freerdp/event.h @@ -0,0 +1,133 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Event Definitions + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_EVENT_H +#define FREERDP_EVENT_H + +#include <freerdp/api.h> + +#include <winpr/collections.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define FREERDP_WINDOW_STATE_NORMAL 0 +#define FREERDP_WINDOW_STATE_MINIMIZED 1 +#define FREERDP_WINDOW_STATE_MAXIMIZED 2 +#define FREERDP_WINDOW_STATE_FULLSCREEN 3 +#define FREERDP_WINDOW_STATE_ACTIVE 4 + + DEFINE_EVENT_BEGIN(WindowStateChange) + int state; + DEFINE_EVENT_END(WindowStateChange) + + DEFINE_EVENT_BEGIN(ResizeWindow) + int width; + int height; + DEFINE_EVENT_END(ResizeWindow) + + DEFINE_EVENT_BEGIN(PanningChange) + int dx; + int dy; + DEFINE_EVENT_END(PanningChange) + + DEFINE_EVENT_BEGIN(ZoomingChange) + int dx; + int dy; + DEFINE_EVENT_END(ZoomingChange) + + DEFINE_EVENT_BEGIN(LocalResizeWindow) + int width; + int height; + DEFINE_EVENT_END(LocalResizeWindow) + + DEFINE_EVENT_BEGIN(EmbedWindow) + BOOL embed; + void* handle; + DEFINE_EVENT_END(EmbedWindow) + + DEFINE_EVENT_BEGIN(ErrorInfo) + UINT32 code; + DEFINE_EVENT_END(ErrorInfo) + + DEFINE_EVENT_BEGIN(Activated) + BOOL firstActivation; + DEFINE_EVENT_END(Activated) + + DEFINE_EVENT_BEGIN(ConnectionStateChange) + int state; + BOOL active; + DEFINE_EVENT_END(ConnectionStateChange) + + DEFINE_EVENT_BEGIN(Terminate) + int code; + DEFINE_EVENT_END(Terminate) + + DEFINE_EVENT_BEGIN(ConnectionResult) + int result; + DEFINE_EVENT_END(ConnectionResult) + + DEFINE_EVENT_BEGIN(ChannelConnected) + const char* name; + void* pInterface; + DEFINE_EVENT_END(ChannelConnected) + + DEFINE_EVENT_BEGIN(ChannelDisconnected) + const char* name; + void* pInterface; + DEFINE_EVENT_END(ChannelDisconnected) + + DEFINE_EVENT_BEGIN(ChannelAttached) + const char* name; + void* pInterface; + DEFINE_EVENT_END(ChannelAttached) + + DEFINE_EVENT_BEGIN(ChannelDetached) + const char* name; + void* pInterface; + DEFINE_EVENT_END(ChannelDetached) + + DEFINE_EVENT_BEGIN(MouseEvent) + UINT16 flags; + UINT16 x; + UINT16 y; + DEFINE_EVENT_END(MouseEvent) + + DEFINE_EVENT_BEGIN(MouseEventEx) + UINT16 flags; + UINT16 x; + UINT16 y; + DEFINE_EVENT_END(MouseEventEx) + + DEFINE_EVENT_BEGIN(Timer) + UINT64 now; + DEFINE_EVENT_END(Timer) + + DEFINE_EVENT_BEGIN(GraphicsReset) + UINT32 width; + UINT32 height; + DEFINE_EVENT_END(GraphicsReset) + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_EVENT_H */ diff --git a/include/freerdp/extension.h b/include/freerdp/extension.h new file mode 100644 index 0000000..1f9d4cb --- /dev/null +++ b/include/freerdp/extension.h @@ -0,0 +1,66 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP Extensions + * + * Copyright 2010-2011 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_EXTENSION_H +#define FREERDP_EXTENSION_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#define FREERDP_EXT_EXPORT_FUNC_NAME "FreeRDPExtensionEntry" + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_ext_plugin rdpExtPlugin; + + struct rdp_ext_plugin + { + void* ext; + int (*init)(rdpExtPlugin* plugin, freerdp* instance); + int (*uninit)(rdpExtPlugin* plugin, freerdp* instance); + }; + + typedef UINT32(FREERDP_CC* PFREERDP_EXTENSION_HOOK)(rdpExtPlugin* plugin, freerdp* instance); + + typedef UINT32(FREERDP_CC* PREGISTEREXTENSION)(rdpExtPlugin* plugin); + typedef UINT32(FREERDP_CC* PREGISTERPRECONNECTHOOK)(rdpExtPlugin* plugin, + PFREERDP_EXTENSION_HOOK hook); + typedef UINT32(FREERDP_CC* PREGISTERPOSTCONNECTHOOK)(rdpExtPlugin* plugin, + PFREERDP_EXTENSION_HOOK hook); + + typedef struct + { + void* ext; /* Reference to internal instance */ + PREGISTEREXTENSION pRegisterExtension; + PREGISTERPRECONNECTHOOK pRegisterPreConnectHook; + PREGISTERPOSTCONNECTHOOK pRegisterPostConnectHook; + void* data; + } FREERDP_EXTENSION_ENTRY_POINTS; + typedef FREERDP_EXTENSION_ENTRY_POINTS* PFREERDP_EXTENSION_ENTRY_POINTS; + + typedef int(FREERDP_CC* PFREERDP_EXTENSION_ENTRY)(PFREERDP_EXTENSION_ENTRY_POINTS pEntryPoints); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_EXTENSION_H */ diff --git a/include/freerdp/freerdp.h b/include/freerdp/freerdp.h new file mode 100644 index 0000000..cf0176f --- /dev/null +++ b/include/freerdp/freerdp.h @@ -0,0 +1,708 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Interface + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_H +#define FREERDP_H + +#include <winpr/stream.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/error.h> +#include <freerdp/event.h> + +#include <freerdp/settings.h> + +#include <freerdp/gdi/gdi.h> +#include <freerdp/codecs.h> +#include <freerdp/metrics.h> +#include <freerdp/extension.h> +#include <freerdp/heartbeat.h> +#include <freerdp/message.h> +#include <freerdp/autodetect.h> +#include <freerdp/streamdump.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_rdp rdpRdp; + typedef struct rdp_rail rdpRail; + typedef struct rdp_cache rdpCache; + + typedef struct rdp_client_context rdpClientContext; + typedef struct rdp_client_entry_points_v1 RDP_CLIENT_ENTRY_POINTS_V1; + typedef RDP_CLIENT_ENTRY_POINTS_V1 RDP_CLIENT_ENTRY_POINTS; + +#include <freerdp/utils/smartcardlogon.h> +#include <freerdp/update.h> +#include <freerdp/input.h> +#include <freerdp/graphics.h> + +#define MCS_BASE_CHANNEL_ID 1001 +#define MCS_GLOBAL_CHANNEL_ID 1003 + +/* Flags used by certificate callbacks */ +#define VERIFY_CERT_FLAG_NONE 0x00 +#define VERIFY_CERT_FLAG_LEGACY 0x02 +#define VERIFY_CERT_FLAG_REDIRECT 0x10 +#define VERIFY_CERT_FLAG_GATEWAY 0x20 +#define VERIFY_CERT_FLAG_CHANGED 0x40 +#define VERIFY_CERT_FLAG_MISMATCH 0x80 +#define VERIFY_CERT_FLAG_MATCH_LEGACY_SHA1 0x100 +#define VERIFY_CERT_FLAG_FP_IS_PEM 0x200 + +/* Message types used by gateway messaging callback */ +#define GATEWAY_MESSAGE_CONSENT 1 +#define GATEWAY_MESSAGE_SERVICE 2 + + typedef enum + { + AUTH_NLA, + AUTH_TLS, + AUTH_RDP, + GW_AUTH_HTTP, + GW_AUTH_RDG, + GW_AUTH_RPC, + AUTH_SMARTCARD_PIN + } rdp_auth_reason; + + typedef BOOL (*pContextNew)(freerdp* instance, rdpContext* context); + typedef void (*pContextFree)(freerdp* instance, rdpContext* context); + + typedef BOOL (*pConnectCallback)(freerdp* instance); + typedef void (*pPostDisconnect)(freerdp* instance); + + /** \brief Authentication callback function pointer definition + * + * \param instance A pointer to the instance to work on + * \param username A pointer to the username string. On input the current username, on output + * the username that should be used. Must not be NULL. \param password A pointer to the password + * string. On input the current password, on output the password that sohould be used. Must not + * be NULL. \param domain A pointer to the domain string. On input the current domain, on output + * the domain that sohould be used. Must not be NULL. + * + * \return \b FALSE no valid credentials supplied, continue without \b TRUE valid credentials + * should be available. + */ + + typedef BOOL (*pAuthenticate)(freerdp* instance, char** username, char** password, + char** domain); + + /** \brief Extended authentication callback function pointer definition + * + * \param instance A pointer to the instance to work on + * \param username A pointer to the username string. On input the current username, on output + * the username that should be used. Must not be NULL. \param password A pointer to the password + * string. On input the current password, on output the password that sohould be used. Must not + * be NULL. \param domain A pointer to the domain string. On input the current domain, on output + * the domain that sohould be used. Must not be NULL. \param reason The reason the callback was + * called. (e.g. NLA, TLS, RDP, GATEWAY, ...) + * + * \return \b FALSE to abort the connection, \b TRUE otherwise. + * \note To not provide valid credentials and not abort the connection return \b TRUE and empty + * (as in empty string) credentials + */ + typedef BOOL (*pAuthenticateEx)(freerdp* instance, char** username, char** password, + char** domain, rdp_auth_reason reason); + typedef BOOL (*pChooseSmartcard)(freerdp* instance, SmartcardCertInfo** cert_list, DWORD count, + DWORD* choice, BOOL gateway); + + typedef enum + { + ACCESS_TOKEN_TYPE_AAD, /**!< oauth2 access token for RDS AAD authentication */ + ACCESS_TOKEN_TYPE_AVD /**!< oauth2 access token for Azure Virtual Desktop */ + } AccessTokenType; + + typedef BOOL (*pGetAccessToken)(freerdp* instance, AccessTokenType tokenType, char** token, + size_t count, ...); + + /** @brief Callback used to inform about a reconnection attempt + * + * @param instance The instance the information is for + * @param what A '\0' terminated string describing the module attempting to retry an operation + * @param current The current reconnection attempt, the first attempt will always have the + * value \b 0 + * @param userarg An optional custom argument + * + * @return \b -1 in case of failure (attempts exceeded, ...) or a \b delay in [ms] to wait + * before the next attempt + */ + typedef SSIZE_T (*pRetryDialog)(freerdp* instance, const char* what, size_t current, + void* userarg); + + /** @brief Callback used if user interaction is required to accept + * an unknown certificate. + * + * @deprecated Use pVerifyCertificateEx + * @param common_name The certificate registered hostname. + * @param subject The common name of the certificate. + * @param issuer The issuer of the certificate. + * @param fingerprint The fingerprint of the certificate (old) or the certificate in PEM + * format + * @param host_mismatch A flag indicating the certificate + * subject does not match the host connecting to. + * + * @return 1 to accept and store a certificate, 2 to accept + * a certificate only for this session, 0 otherwise. + */ +#if defined(WITH_FREERDP_DEPRECATED) + typedef WINPR_DEPRECATED_VAR( + "Use pVerifyCertificateEx", + DWORD (*pVerifyCertificate)(freerdp* instance, const char* common_name, const char* subject, + const char* issuer, const char* fingerprint, + BOOL host_mismatch)); +#endif + + /** @brief Callback used if user interaction is required to accept + * an unknown certificate. + * + * @param host The hostname connecting to. + * @param port The port connecting to. + * @param common_name The certificate registered hostname. + * @param subject The common name of the certificate. + * @param issuer The issuer of the certificate. + * @param fingerprint The fingerprint of the certificate (old) or the certificate in PEM + * format (VERIFY_CERT_FLAG_FP_IS_PEM set) + * @param flags Flags of type VERIFY_CERT_FLAG* + * + * @return 1 to accept and store a certificate, 2 to accept + * a certificate only for this session, 0 otherwise. + */ + typedef DWORD (*pVerifyCertificateEx)(freerdp* instance, const char* host, UINT16 port, + const char* common_name, const char* subject, + const char* issuer, const char* fingerprint, DWORD flags); + + /** @brief Callback used if user interaction is required to accept + * a changed certificate. + * + * @deprecated Use pVerifyChangedCertificateEx + * @param common_name The certificate registered hostname. + * @param subject The common name of the new certificate. + * @param issuer The issuer of the new certificate. + * @param new_fingerprint The fingerprint of the new certificate. + * @param old_subject The common name of the old certificate. + * @param old_issuer The issuer of the new certificate. + * @param old_fingerprint The fingerprint of the old certificate. + * + * @return 1 to accept and store a certificate, 2 to accept + * a certificate only for this session, 0 otherwise. + */ +#if defined(WITH_FREERDP_DEPRECATED) + typedef WINPR_DEPRECATED_VAR( + "Use pVerifyChangedCertificateEx", + DWORD (*pVerifyChangedCertificate)(freerdp* instance, const char* common_name, + const char* subject, const char* issuer, + const char* new_fingerprint, const char* old_subject, + const char* old_issuer, const char* old_fingerprint)); +#endif + + /** @brief Callback used if user interaction is required to accept + * a changed certificate. + * + * @param host The hostname connecting to. + * @param port The port connecting to. + * @param common_name The certificate registered hostname. + * @param subject The common name of the new certificate. + * @param issuer The issuer of the new certificate. + * @param new_fingerprint The fingerprint of the new certificate (old) or the certificate in + * PEM format (VERIFY_CERT_FLAG_FP_IS_PEM set) + * @param old_subject The common name of the old certificate. + * @param old_issuer The issuer of the new certificate. + * @param old_fingerprint The fingerprint of the old certificate (old) or the certificate in + * PEM format (VERIFY_CERT_FLAG_FP_IS_PEM set) + * @param flags Flags of type VERIFY_CERT_FLAG* + * + * @return 1 to accept and store a certificate, 2 to accept + * a certificate only for this session, 0 otherwise. + */ + + typedef DWORD (*pVerifyChangedCertificateEx)(freerdp* instance, const char* host, UINT16 port, + const char* common_name, const char* subject, + const char* issuer, const char* new_fingerprint, + const char* old_subject, const char* old_issuer, + const char* old_fingerprint, DWORD flags); + + /** @brief Callback used if user interaction is required to accept + * a certificate. + * + * @param instance Pointer to the freerdp instance. + * @param data Pointer to certificate data (full chain) in PEM format. + * @param length The length of the certificate data. + * @param hostname The hostname connecting to. + * @param port The port connecting to. + * @param flags Flags of type VERIFY_CERT_FLAG* + * + * @return 1 to accept and store a certificate, 2 to accept + * a certificate only for this session, 0 otherwise. + */ + typedef int (*pVerifyX509Certificate)(freerdp* instance, const BYTE* data, size_t length, + const char* hostname, UINT16 port, DWORD flags); + + typedef int (*pLogonErrorInfo)(freerdp* instance, UINT32 data, UINT32 type); + + typedef BOOL (*pSendChannelData)(freerdp* instance, UINT16 channelId, const BYTE* data, + size_t size); + typedef BOOL (*pSendChannelPacket)(freerdp* instance, UINT16 channelId, size_t totalSize, + UINT32 flags, const BYTE* data, size_t chunkSize); + typedef BOOL (*pReceiveChannelData)(freerdp* instance, UINT16 channelId, const BYTE* data, + size_t size, UINT32 flags, size_t totalSize); + + /* type can be one of the GATEWAY_MESSAGE_ type defines */ + typedef BOOL (*pPresentGatewayMessage)(freerdp* instance, UINT32 type, BOOL isDisplayMandatory, + BOOL isConsentMandatory, size_t length, + const WCHAR* message); + + /** + * Defines the context for a given instance of RDP connection. + * It is embedded in the rdp_freerdp structure, and allocated by a call to + * freerdp_context_new(). It is deallocated by a call to freerdp_context_free(). + */ + struct rdp_context + { + ALIGN64 freerdp* instance; /**< (offset 0) + Pointer to a rdp_freerdp structure. + This is a back-link to retrieve the freerdp instance from the context. + It is set by the freerdp_context_new() function */ + ALIGN64 freerdp_peer* peer; /**< (offset 1) + Pointer to the client peer. + This is set by a call to freerdp_peer_context_new() during peer + initialization. This field is used only on the server side. */ + ALIGN64 BOOL ServerMode; /**< (offset 2) true when context is in server mode */ + + ALIGN64 UINT32 LastError; /* 3 */ + + UINT64 paddingA[16 - 4]; /* 4 */ + + ALIGN64 int argc; /**< (offset 16) + Number of arguments given to the program at launch time. + Used to keep this data available and used later on, typically just before + connection initialization. + @see freerdp_parse_args() */ + ALIGN64 char** argv; /**< (offset 17) + List of arguments given to the program at launch time. + Used to keep this data available and used later on, typically just before + connection initialization. + @see freerdp_parse_args() */ + + ALIGN64 wPubSub* pubSub; /* (offset 18) */ + + ALIGN64 HANDLE channelErrorEvent; /* (offset 19)*/ + ALIGN64 UINT channelErrorNum; /*(offset 20)*/ + ALIGN64 char* errorDescription; /*(offset 21)*/ + + UINT64 paddingB[32 - 22]; /* 22 */ + + ALIGN64 rdpRdp* + rdp; /**< (offset 32) + Pointer to a rdp_rdp structure used to keep the connection's parameters. + It is allocated by freerdp_context_new() and deallocated by + freerdp_context_free(), at the same time that this rdp_context + structure - there is no need to specifically allocate/deallocate this. */ + ALIGN64 rdpGdi* gdi; /**< (offset 33) + Pointer to a rdp_gdi structure used to keep the gdi settings. + It is allocated by gdi_init() and deallocated by gdi_free(). + It must be deallocated before deallocating this rdp_context structure. */ + ALIGN64 rdpRail* rail; /* 34 */ + ALIGN64 rdpCache* cache; /* 35 */ + ALIGN64 rdpChannels* channels; /* 36 */ + ALIGN64 rdpGraphics* graphics; /* 37 */ + ALIGN64 rdpInput* input; /* 38 owned by rdpRdp */ + ALIGN64 rdpUpdate* update; /* 39 owned by rdpRdp */ + ALIGN64 rdpSettings* settings; /* 40 owned by rdpRdp */ + ALIGN64 rdpMetrics* metrics; /* 41 */ + ALIGN64 rdpCodecs* codecs; /* 42 */ + ALIGN64 rdpAutoDetect* autodetect; /* 43 owned by rdpRdp */ + UINT64 paddingC1[45 - 44]; /* 44 */ + ALIGN64 int disconnectUltimatum; /* 45 */ + UINT64 paddingC[64 - 46]; /* 46 */ + + ALIGN64 rdpStreamDumpContext* dump; /* 64 */ + ALIGN64 wLog* log; /* 65 */ + + UINT64 paddingD[96 - 66]; /* 66 */ + UINT64 paddingE[128 - 96]; /* 96 */ + }; + + /** + * Defines the possible disconnect reasons in the MCS Disconnect Provider + * Ultimatum PDU + */ + + enum Disconnect_Ultimatum + { + Disconnect_Ultimatum_domain_disconnected = 0, + Disconnect_Ultimatum_provider_initiated = 1, + Disconnect_Ultimatum_token_purged = 2, + Disconnect_Ultimatum_user_requested = 3, + Disconnect_Ultimatum_channel_purged = 4 + }; + +#include <freerdp/client.h> + + /** Defines the options for a given instance of RDP connection. + * This is built by the client and given to the FreeRDP library to create the connection + * with the expected options. + * It is allocated by a call to freerdp_new() and deallocated by a call to freerdp_free(). + * Some of its content need specific allocation/deallocation - see field description for + * details. + */ + struct rdp_freerdp + { + ALIGN64 + rdpContext* context; /**< (offset 0) + Pointer to a rdpContext structure. + Client applications can use the ContextSize field to register a + context bigger than the rdpContext structure. This allow clients to + use additional context information. When using this capability, client + application should ALWAYS declare their structure with the rdpContext + field first, and any additional content following it. Can be allocated + by a call to freerdp_context_new(). Must be deallocated by a call to + freerdp_context_free() before deallocating the current instance. */ + + ALIGN64 RDP_CLIENT_ENTRY_POINTS* pClientEntryPoints; + + UINT64 paddingA[16 - 2]; /* 2 */ + +#if defined(WITH_FREERDP_DEPRECATED) + WINPR_DEPRECATED_VAR("use rdpContext::input instead", ALIGN64 rdpInput* input;) /* (offset + 16) Input handle for the connection. Will be initialized by a call + to freerdp_context_new() owned by rdpRdp */ + WINPR_DEPRECATED_VAR("use rdpContext::update instead", + ALIGN64 rdpUpdate* update;) /* (offset 17) + Update display parameters. Used to register display events callbacks +and settings. Will be initialized by a call to freerdp_context_new() owned by rdpRdp */ + WINPR_DEPRECATED_VAR("use rdpContext::settings instead", + ALIGN64 rdpSettings* settings;) /**< (offset 18) + Pointer to a rdpSettings structure. Will be used to maintain the + required RDP settings. Will be + initialized by a call to freerdp_context_new() + owned by rdpRdp + */ + WINPR_DEPRECATED_VAR("use rdpContext::autodetect instead", + ALIGN64 rdpAutoDetect* autodetect;) /* (offset 19) + Auto-Detect handle for the connection. + Will be initialized by a call to freerdp_context_new() +owned by rdpRdp */ +#else + UINT64 paddingX[4]; +#endif + ALIGN64 rdpHeartbeat* heartbeat; /* (offset 21) owned by rdpRdp*/ + + UINT64 paddingB[32 - 21]; /* 21 */ + + ALIGN64 size_t + ContextSize; /* (offset 32) + Specifies the size of the 'context' field. freerdp_context_new() will use this + size to allocate the context buffer. freerdp_new() sets it to + sizeof(rdpContext). If modifying it, there should always be a minimum of + sizeof(rdpContext), as the freerdp library will assume it can use the 'context' + field to set the required informations in it. Clients will typically make it + bigger, and use a context structure embedding the rdpContext, and adding + additional information after that. + */ + + ALIGN64 pContextNew + ContextNew; /**< (offset 33) + Callback for context allocation + Can be set before calling freerdp_context_new() to have it executed after + allocation and initialization. Must be set to NULL if not needed. */ + + ALIGN64 pContextFree + ContextFree; /**< (offset 34) + Callback for context deallocation + Can be set before calling freerdp_context_free() to have it executed before + deallocation. Must be set to NULL if not needed. */ + UINT64 paddingC[47 - 35]; /* 35 */ + + ALIGN64 UINT ConnectionCallbackState; /* 47 */ + + ALIGN64 pConnectCallback + PreConnect; /**< (offset 48) + Callback for pre-connect operations. + Can be set before calling freerdp_connect() to have it executed before the + actual connection happens. Must be set to NULL if not needed. */ + + ALIGN64 pConnectCallback + PostConnect; /**< (offset 49) + Callback for post-connect operations. + Can be set before calling freerdp_connect() to have it executed after the + actual connection has succeeded. Must be set to NULL if not needed. */ + + ALIGN64 pAuthenticate Authenticate; /**< (offset 50) + Callback for authentication. + It is used to get the username/password when it was not + provided at connection time. */ +#if defined(WITH_FREERDP_DEPRECATED) + WINPR_DEPRECATED_VAR("Use VerifyCertificateEx or VerifyX509Certificate instead", + ALIGN64 pVerifyCertificate VerifyCertificate;) /**< (offset 51) */ + WINPR_DEPRECATED_VAR("Use VerifyChangedCertificateEx or VerifyX509Certificate instead", + ALIGN64 pVerifyChangedCertificate + VerifyChangedCertificate;) /**< (offset 52) */ +#else + ALIGN64 UINT64 reserved[2]; +#endif + ALIGN64 pVerifyX509Certificate + VerifyX509Certificate; /**< (offset 53) Callback for X509 certificate verification + (PEM format) */ + + ALIGN64 pLogonErrorInfo + LogonErrorInfo; /**< (offset 54) Callback for logon error info, important for logon + system messages with RemoteApp */ + + ALIGN64 pPostDisconnect + PostDisconnect; /**< (offset 55) + Callback for cleaning up + resources allocated by post connect callback. + + This will be called before disconnecting and cleaning up the + channels. + */ + + ALIGN64 pAuthenticate GatewayAuthenticate; /**< (offset 56) + Callback for gateway authentication. + It is used to get the username/password when it was not + provided at connection time. */ + + ALIGN64 pPresentGatewayMessage PresentGatewayMessage; /**< (offset 57) + Callback for gateway consent messages. + It is used to present consent messages to the user. */ + + ALIGN64 pConnectCallback Redirect; /**< (offset 58) + Callback for redirect operations. + Can be set after + rdp_client_disconnect_and_clear and applying redirection settings but before + rdp_client_connect() to have it executed after the actual connection has + succeeded. Must be set to NULL if not needed. */ + ALIGN64 pConnectCallback + LoadChannels; /**< (offset 59) + * callback for loading channel configuration. Might be called multiple + * times when redirection occurs. */ + + ALIGN64 pPostDisconnect + PostFinalDisconnect; /** < (offset 60) + * callback for cleaning up resources allocated in PreConnect + * + * This will be called after all instance related channels and + * threads have been stopped + */ + UINT64 paddingD[64 - 61]; /* 61 */ + + ALIGN64 pSendChannelData + SendChannelData; /* (offset 64) + Callback for sending data to a channel. + By default, it is set by freerdp_new() to freerdp_send_channel_data(), which + eventually calls freerdp_channel_send() */ + ALIGN64 pReceiveChannelData + ReceiveChannelData; /* (offset 65) + Callback for receiving data from a channel. + This is called by freerdp_channel_process() (if not NULL). + Clients will typically use a function that calls freerdp_channels_data() + to perform the needed tasks. */ + + ALIGN64 pVerifyCertificateEx + VerifyCertificateEx; /**< (offset 66) + Callback for certificate validation. + Used to verify that an unknown certificate is trusted. */ + ALIGN64 pVerifyChangedCertificateEx + VerifyChangedCertificateEx; /**< (offset 67) + Callback for changed certificate validation. + Used when a certificate differs from stored fingerprint. */ + ALIGN64 pSendChannelPacket + SendChannelPacket; /* (offset 68) + * Callback for sending RAW data to a channel. In contrast to + * SendChannelData data fragmentation is up to the user and this + * function sends data as is with the provided flags. + */ + ALIGN64 pAuthenticateEx AuthenticateEx; /**< (offset 69) + Callback for authentication. + It is used to get the username/password. The reason + argument tells why it was called. */ + ALIGN64 pChooseSmartcard + ChooseSmartcard; /* (offset 70) + Callback for choosing a smartcard for logon. + Used when multiple smartcards are available. Returns an index into a list + of SmartcardCertInfo pointers */ + ALIGN64 pGetAccessToken GetAccessToken; /* (offset 71) + Callback for obtaining an access token + for \b AccessTokenType authentication */ + ALIGN64 pRetryDialog RetryDialog; /* (offset 72) Callback for displaying a dialog in case of + something needs a retry */ + UINT64 paddingE[80 - 73]; /* 73 */ + }; + + struct rdp_channel_handles + { + wListDictionary* init; + wListDictionary* open; + }; + typedef struct rdp_channel_handles rdpChannelHandles; + + FREERDP_API void freerdp_context_free(freerdp* instance); + + FREERDP_API BOOL freerdp_context_new(freerdp* instance); + FREERDP_API BOOL freerdp_context_new_ex(freerdp* instance, rdpSettings* settings); + + FREERDP_API BOOL freerdp_context_reset(freerdp* instance); + + FREERDP_API BOOL freerdp_connect(freerdp* instance); + + WINPR_DEPRECATED_VAR("use freerdp_abort_connect_context instead", + FREERDP_API BOOL freerdp_abort_connect(freerdp* instance)); + + FREERDP_API BOOL freerdp_abort_connect_context(rdpContext* context); + FREERDP_API HANDLE freerdp_abort_event(rdpContext* context); + + WINPR_DEPRECATED_VAR("use freerdp_shall_disconnect_context instead", + FREERDP_API BOOL freerdp_shall_disconnect(freerdp* instance)); + + FREERDP_API BOOL freerdp_shall_disconnect_context(rdpContext* context); + FREERDP_API BOOL freerdp_disconnect(freerdp* instance); + + WINPR_DEPRECATED_VAR("use freerdp_disconnect_before_reconnect_context instead", + FREERDP_API BOOL freerdp_disconnect_before_reconnect(freerdp* instance)); + FREERDP_API BOOL freerdp_disconnect_before_reconnect_context(rdpContext* context); + + FREERDP_API BOOL freerdp_reconnect(freerdp* instance); + + FREERDP_API UINT freerdp_channels_attach(freerdp* instance); + FREERDP_API UINT freerdp_channels_detach(freerdp* instance); + +#if defined(WITH_FREERDP_DEPRECATED) + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_get_event_handles", + BOOL freerdp_get_fds(freerdp* instance, void** rfds, + int* rcount, void** wfds, int* wcount)); +#endif + + FREERDP_API BOOL freerdp_check_fds(freerdp* instance); + + FREERDP_API DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events, DWORD count); + FREERDP_API BOOL freerdp_check_event_handles(rdpContext* context); + + FREERDP_API wMessageQueue* freerdp_get_message_queue(freerdp* instance, DWORD id); + FREERDP_API HANDLE freerdp_get_message_queue_event_handle(freerdp* instance, DWORD id); + FREERDP_API int freerdp_message_queue_process_message(freerdp* instance, DWORD id, + wMessage* message); + FREERDP_API int freerdp_message_queue_process_pending_messages(freerdp* instance, DWORD id); + + FREERDP_API UINT32 freerdp_error_info(freerdp* instance); + FREERDP_API void freerdp_set_error_info(rdpRdp* rdp, UINT32 error); + FREERDP_API BOOL freerdp_send_error_info(rdpRdp* rdp); + FREERDP_API BOOL freerdp_get_stats(rdpRdp* rdp, UINT64* inBytes, UINT64* outBytes, + UINT64* inPackets, UINT64* outPackets); + + FREERDP_API void freerdp_get_version(int* major, int* minor, int* revision); + FREERDP_API const char* freerdp_get_version_string(void); + FREERDP_API const char* freerdp_get_build_revision(void); + FREERDP_API const char* freerdp_get_build_config(void); + + FREERDP_API void freerdp_free(freerdp* instance); + + WINPR_ATTR_MALLOC(freerdp_free, 1) + FREERDP_API freerdp* freerdp_new(void); + + FREERDP_API BOOL freerdp_focus_required(freerdp* instance); + FREERDP_API void freerdp_set_focus(freerdp* instance); + + FREERDP_API int freerdp_get_disconnect_ultimatum(rdpContext* context); + + FREERDP_API UINT32 freerdp_get_last_error(rdpContext* context); + FREERDP_API const char* freerdp_get_last_error_name(UINT32 error); + FREERDP_API const char* freerdp_get_last_error_string(UINT32 error); + FREERDP_API const char* freerdp_get_last_error_category(UINT32 error); + +#define freerdp_set_last_error(context, lastError) \ + freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__) + +#define freerdp_set_last_error_if_not(context, lastError) \ + do \ + { \ + if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) \ + freerdp_set_last_error_log(context, lastError); \ + } while (0) + +#define freerdp_set_last_error_log(context, lastError) \ + freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__) + FREERDP_API void freerdp_set_last_error_ex(rdpContext* context, UINT32 lastError, + const char* fkt, const char* file, int line); + + FREERDP_API const char* freerdp_get_logon_error_info_type(UINT32 type); + FREERDP_API const char* freerdp_get_logon_error_info_type_ex(UINT32 type, char* buffer, + size_t size); + + FREERDP_API const char* freerdp_get_logon_error_info_data(UINT32 data); + FREERDP_API const char* freerdp_get_logon_error_info_data_ex(UINT32 data, char* buffer, + size_t size); + + FREERDP_API ULONG freerdp_get_transport_sent(rdpContext* context, BOOL resetCount); + + FREERDP_API BOOL freerdp_nla_impersonate(rdpContext* context); + FREERDP_API BOOL freerdp_nla_revert_to_self(rdpContext* context); + + FREERDP_API UINT32 freerdp_get_nla_sspi_error(rdpContext* context); + + FREERDP_API void clearChannelError(rdpContext* context); + FREERDP_API HANDLE getChannelErrorEventHandle(rdpContext* context); + FREERDP_API UINT getChannelError(rdpContext* context); + FREERDP_API const char* getChannelErrorDescription(rdpContext* context); + FREERDP_API void setChannelError(rdpContext* context, UINT errorNum, const char* format, ...); + FREERDP_API BOOL checkChannelErrorEvent(rdpContext* context); + + FREERDP_API const char* freerdp_nego_get_routing_token(rdpContext* context, DWORD* length); + + /** \brief returns the current \b CONNECTION_STATE of the context. + * + * \param context A pointer to the context to query state + * + * \return A \b CONNECTION_STATE the context is currently in + */ + FREERDP_API CONNECTION_STATE freerdp_get_state(const rdpContext* context); + + /** \brief returns a string representation of a \b CONNECTION_STATE + * + * \param state the \b CONNECTION_STATE to stringify + * + * \return The string representation of the \b CONNECTION_STATE + */ + FREERDP_API const char* freerdp_state_string(CONNECTION_STATE state); + + /** \brief Queries if the current \b CONNECTION_STATE of the context is an active connection. + * + * A connection is active, if the connection sequence has been passed, no disconnection requests + * have been received and no network or other errors have forced a disconnect. + * + * \param context A pointer to the context to query state + * + * \return \b TRUE if the connection state indicates an active connection, \b FALSE otherwise + */ + FREERDP_API BOOL freerdp_is_active_state(const rdpContext* context); + + FREERDP_API BOOL freerdp_channels_from_mcs(rdpSettings* settings, const rdpContext* context); + + FREERDP_API BOOL freerdp_is_valid_mcs_create_request(const BYTE* data, size_t size); + FREERDP_API BOOL freerdp_is_valid_mcs_create_response(const BYTE* data, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_H */ diff --git a/include/freerdp/gdi/bitmap.h b/include/freerdp/gdi/bitmap.h new file mode 100644 index 0000000..5f784f0 --- /dev/null +++ b/include/freerdp/gdi/bitmap.h @@ -0,0 +1,54 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * GDI Bitmap Functions + * + * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2016 Armin Novak <armin.novak@thincast.com> + * Copyright 2016 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_GDI_BITMAP_H +#define FREERDP_GDI_BITMAP_H + +#include <freerdp/api.h> +#include <freerdp/gdi/gdi.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API UINT32 gdi_GetPixel(HGDI_DC hdc, UINT32 nXPos, UINT32 nYPos); + FREERDP_API UINT32 gdi_SetPixel(HGDI_DC hdc, UINT32 X, UINT32 Y, UINT32 crColor); + FREERDP_API BYTE* gdi_GetPointer(HGDI_BITMAP hBmp, UINT32 X, UINT32 Y); + + FREERDP_API HGDI_BITMAP gdi_CreateBitmap(UINT32 nWidth, UINT32 nHeight, UINT32 format, + BYTE* data); + FREERDP_API HGDI_BITMAP gdi_CreateBitmapEx(UINT32 nWidth, UINT32 nHeight, UINT32 format, + UINT32 stride, BYTE* data, void (*fkt_free)(void*)); + FREERDP_API HGDI_BITMAP gdi_CreateCompatibleBitmap(HGDI_DC hdc, UINT32 nWidth, UINT32 nHeight); + + FREERDP_API BOOL gdi_BitBlt(HGDI_DC hdcDest, INT32 nXDest, INT32 nYDest, INT32 nWidth, + INT32 nHeight, HGDI_DC hdcSrc, INT32 nXSrc, INT32 nYSrc, DWORD rop, + const gdiPalette* palette); + + typedef BOOL (*p_BitBlt)(HGDI_DC hdcDest, INT32 nXDest, INT32 nYDest, INT32 nWidth, + INT32 nHeight, HGDI_DC hdcSrc, INT32 nXSrc, INT32 nYSrc, DWORD rop); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_GDI_BITMAP_H */ diff --git a/include/freerdp/gdi/dc.h b/include/freerdp/gdi/dc.h new file mode 100644 index 0000000..d9b5c2b --- /dev/null +++ b/include/freerdp/gdi/dc.h @@ -0,0 +1,44 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * GDI Device Context Functions + * + * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2016 Armin Novak <armin.novak@thincast.com> + * Copyright 2016 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_GDI_DC_H +#define FREERDP_GDI_DC_H + +#include <freerdp/api.h> +#include <freerdp/gdi/gdi.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API HGDI_DC gdi_GetDC(void); + FREERDP_API HGDI_DC gdi_CreateDC(UINT32 format); + FREERDP_API HGDI_DC gdi_CreateCompatibleDC(HGDI_DC hdc); + FREERDP_API HGDIOBJECT gdi_SelectObject(HGDI_DC hdc, HGDIOBJECT hgdiobject); + FREERDP_API BOOL gdi_DeleteObject(HGDIOBJECT hgdiobject); + FREERDP_API BOOL gdi_DeleteDC(HGDI_DC hdc); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_GDI_DC_H */ diff --git a/include/freerdp/gdi/gdi.h b/include/freerdp/gdi/gdi.h new file mode 100644 index 0000000..ab6f172 --- /dev/null +++ b/include/freerdp/gdi/gdi.h @@ -0,0 +1,548 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * GDI Library + * + * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2016 Armin Novak <armin.novak@thincast.com> + * Copyright 2016 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_GDI_H +#define FREERDP_GDI_H + +#include <winpr/wlog.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/log.h> +#include <freerdp/types.h> +#include <freerdp/codec/color.h> +#include <freerdp/codec/region.h> + +#include <freerdp/client/rdpgfx.h> +#include <freerdp/client/geometry.h> +#include <freerdp/client/video.h> + +/* For more information, see [MS-RDPEGDI] */ + +/* Binary Raster Operations (ROP2) */ +#define GDI_R2_BLACK 0x01 /* D = 0 */ +#define GDI_R2_NOTMERGEPEN 0x02 /* D = ~(D | P) */ +#define GDI_R2_MASKNOTPEN 0x03 /* D = D & ~P */ +#define GDI_R2_NOTCOPYPEN 0x04 /* D = ~P */ +#define GDI_R2_MASKPENNOT 0x05 /* D = P & ~D */ +#define GDI_R2_NOT 0x06 /* D = ~D */ +#define GDI_R2_XORPEN 0x07 /* D = D ^ P */ +#define GDI_R2_NOTMASKPEN 0x08 /* D = ~(D & P) */ +#define GDI_R2_MASKPEN 0x09 /* D = D & P */ +#define GDI_R2_NOTXORPEN 0x0A /* D = ~(D ^ P) */ +#define GDI_R2_NOP 0x0B /* D = D */ +#define GDI_R2_MERGENOTPEN 0x0C /* D = D | ~P */ +#define GDI_R2_COPYPEN 0x0D /* D = P */ +#define GDI_R2_MERGEPENNOT 0x0E /* D = P | ~D */ +#define GDI_R2_MERGEPEN 0x0F /* D = P | D */ +#define GDI_R2_WHITE 0x10 /* D = 1 */ + +/* Ternary Raster Operations (ROP3) */ +#define GDI_BLACKNESS 0x00000042 +#define GDI_DPSoon 0x00010289 +#define GDI_DPSona 0x00020C89 +#define GDI_PSon 0x000300AA +#define GDI_SDPona 0x00040C88 +#define GDI_DPon 0x000500A9 +#define GDI_PDSxnon 0x00060865 +#define GDI_PDSaon 0x000702C5 +#define GDI_SDPnaa 0x00080F08 +#define GDI_PDSxon 0x00090245 +#define GDI_DPna 0x000A0329 +#define GDI_PSDnaon 0x000B0B2A +#define GDI_SPna 0x000C0324 +#define GDI_PDSnaon 0x000D0B25 +#define GDI_PDSonon 0x000E08A5 +#define GDI_Pn 0x000F0001 +#define GDI_PDSona 0x00100C85 +#define GDI_NOTSRCERASE 0x001100A6 +#define GDI_SDPxnon 0x00120868 +#define GDI_SDPaon 0x001302C8 +#define GDI_DPSxnon 0x00140869 +#define GDI_DPSaon 0x001502C9 +#define GDI_PSDPSanaxx 0x00165CCA +#define GDI_SSPxDSxaxn 0x00171D54 +#define GDI_SPxPDxa 0x00180D59 +#define GDI_SDPSanaxn 0x00191CC8 +#define GDI_PDSPaox 0x001A06C5 +#define GDI_SDPSxaxn 0x001B0768 +#define GDI_PSDPaox 0x001C06CA +#define GDI_DSPDxaxn 0x001D0766 +#define GDI_PDSox 0x001E01A5 +#define GDI_PDSoan 0x001F0385 +#define GDI_DPSnaa 0x00200F09 +#define GDI_SDPxon 0x00210248 +#define GDI_DSna 0x00220326 +#define GDI_SPDnaon 0x00230B24 +#define GDI_SPxDSxa 0x00240D55 +#define GDI_PDSPanaxn 0x00251CC5 +#define GDI_SDPSaox 0x002606C8 +#define GDI_SDPSxnox 0x00271868 +#define GDI_DPSxa 0x00280369 +#define GDI_PSDPSaoxxn 0x002916CA +#define GDI_DPSana 0x002A0CC9 +#define GDI_SSPxPDxaxn 0x002B1D58 +#define GDI_SPDSoax 0x002C0784 +#define GDI_PSDnox 0x002D060A +#define GDI_PSDPxox 0x002E064A +#define GDI_PSDnoan 0x002F0E2A +#define GDI_PSna 0x0030032A +#define GDI_SDPnaon 0x00310B28 +#define GDI_SDPSoox 0x00320688 +#define GDI_NOTSRCCOPY 0x00330008 +#define GDI_SPDSaox 0x003406C4 +#define GDI_SPDSxnox 0x00351864 +#define GDI_SDPox 0x003601A8 +#define GDI_SDPoan 0x00370388 +#define GDI_PSDPoax 0x0038078A +#define GDI_SPDnox 0x00390604 +#define GDI_SPDSxox 0x003A0644 +#define GDI_SPDnoan 0x003B0E24 +#define GDI_PSx 0x003C004A +#define GDI_SPDSonox 0x003D18A4 +#define GDI_SPDSnaox 0x003E1B24 +#define GDI_PSan 0x003F00EA +#define GDI_PSDnaa 0x00400F0A +#define GDI_DPSxon 0x00410249 +#define GDI_SDxPDxa 0x00420D5D +#define GDI_SPDSanaxn 0x00431CC4 +#define GDI_SRCERASE 0x00440328 +#define GDI_DPSnaon 0x00450B29 +#define GDI_DSPDaox 0x004606C6 +#define GDI_PSDPxaxn 0x0047076A +#define GDI_SDPxa 0x00480368 +#define GDI_PDSPDaoxxn 0x004916C5 +#define GDI_DPSDoax 0x004A0789 +#define GDI_PDSnox 0x004B0605 +#define GDI_SDPana 0x004C0CC8 +#define GDI_SSPxDSxoxn 0x004D1954 +#define GDI_PDSPxox 0x004E0645 +#define GDI_PDSnoan 0x004F0E25 +#define GDI_PDna 0x00500325 +#define GDI_DSPnaon 0x00510B26 +#define GDI_DPSDaox 0x005206C9 +#define GDI_SPDSxaxn 0x00530764 +#define GDI_DPSonon 0x005408A9 +#define GDI_DSTINVERT 0x00550009 +#define GDI_DPSox 0x005601A9 +#define GDI_DPSoan 0x00570389 +#define GDI_PDSPoax 0x00580785 +#define GDI_DPSnox 0x00590609 +#define GDI_PATINVERT 0x005A0049 +#define GDI_DPSDonox 0x005B18A9 +#define GDI_DPSDxox 0x005C0649 +#define GDI_DPSnoan 0x005D0E29 +#define GDI_DPSDnaox 0x005E1B29 +#define GDI_DPan 0x005F00E9 +#define GDI_PDSxa 0x00600365 +#define GDI_DSPDSaoxxn 0x006116C6 +#define GDI_DSPDoax 0x00620786 +#define GDI_SDPnox 0x00630608 +#define GDI_SDPSoax 0x00640788 +#define GDI_DSPnox 0x00650606 +#define GDI_SRCINVERT 0x00660046 +#define GDI_SDPSonox 0x006718A8 +#define GDI_DSPDSonoxxn 0x006858A6 +#define GDI_PDSxxn 0x00690145 +#define GDI_DPSax 0x006A01E9 +#define GDI_PSDPSoaxxn 0x006B178A +#define GDI_SDPax 0x006C01E8 +#define GDI_PDSPDoaxxn 0x006D1785 +#define GDI_SDPSnoax 0x006E1E28 +#define GDI_PDSxnan 0x006F0C65 +#define GDI_PDSana 0x00700CC5 +#define GDI_SSDxPDxaxn 0x00711D5C +#define GDI_SDPSxox 0x00720648 +#define GDI_SDPnoan 0x00730E28 +#define GDI_DSPDxox 0x00740646 +#define GDI_DSPnoan 0x00750E26 +#define GDI_SDPSnaox 0x00761B28 +#define GDI_DSan 0x007700E6 +#define GDI_PDSax 0x007801E5 +#define GDI_DSPDSoaxxn 0x00791786 +#define GDI_DPSDnoax 0x007A1E29 +#define GDI_SDPxnan 0x007B0C68 +#define GDI_SPDSnoax 0x007C1E24 +#define GDI_DPSxnan 0x007D0C69 +#define GDI_SPxDSxo 0x007E0955 +#define GDI_DPSaan 0x007F03C9 +#define GDI_DPSaa 0x008003E9 +#define GDI_SPxDSxon 0x00810975 +#define GDI_DPSxna 0x00820C49 +#define GDI_SPDSnoaxn 0x00831E04 +#define GDI_SDPxna 0x00840C48 +#define GDI_PDSPnoaxn 0x00851E05 +#define GDI_DSPDSoaxx 0x008617A6 +#define GDI_PDSaxn 0x008701C5 +#define GDI_SRCAND 0x008800C6 +#define GDI_SDPSnaoxn 0x00891B08 +#define GDI_DSPnoa 0x008A0E06 +#define GDI_DSPDxoxn 0x008B0666 +#define GDI_SDPnoa 0x008C0E08 +#define GDI_SDPSxoxn 0x008D0668 +#define GDI_SSDxPDxax 0x008E1D7C +#define GDI_PDSanan 0x008F0CE5 +#define GDI_PDSxna 0x00900C45 +#define GDI_SDPSnoaxn 0x00911E08 +#define GDI_DPSDPoaxx 0x009217A9 +#define GDI_SPDaxn 0x009301C4 +#define GDI_PSDPSoaxx 0x009417AA +#define GDI_DPSaxn 0x009501C9 +#define GDI_DPSxx 0x00960169 +#define GDI_PSDPSonoxx 0x0097588A +#define GDI_SDPSonoxn 0x00981888 +#define GDI_DSxn 0x00990066 +#define GDI_DPSnax 0x009A0709 +#define GDI_SDPSoaxn 0x009B07A8 +#define GDI_SPDnax 0x009C0704 +#define GDI_DSPDoaxn 0x009D07A6 +#define GDI_DSPDSaoxx 0x009E16E6 +#define GDI_PDSxan 0x009F0345 +#define GDI_DPa 0x00A000C9 +#define GDI_PDSPnaoxn 0x00A11B05 +#define GDI_DPSnoa 0x00A20E09 +#define GDI_DPSDxoxn 0x00A30669 +#define GDI_PDSPonoxn 0x00A41885 +#define GDI_PDxn 0x00A50065 +#define GDI_DSPnax 0x00A60706 +#define GDI_PDSPoaxn 0x00A707A5 +#define GDI_DPSoa 0x00A803A9 +#define GDI_DPSoxn 0x00A90189 +#define GDI_DSTCOPY 0x00AA0029 +#define GDI_DPSono 0x00AB0889 +#define GDI_SPDSxax 0x00AC0744 +#define GDI_DPSDaoxn 0x00AD06E9 +#define GDI_DSPnao 0x00AE0B06 +#define GDI_DPno 0x00AF0229 +#define GDI_PDSnoa 0x00B00E05 +#define GDI_PDSPxoxn 0x00B10665 +#define GDI_SSPxDSxox 0x00B21974 +#define GDI_SDPanan 0x00B30CE8 +#define GDI_PSDnax 0x00B4070A +#define GDI_DPSDoaxn 0x00B507A9 +#define GDI_DPSDPaoxx 0x00B616E9 +#define GDI_SDPxan 0x00B70348 +#define GDI_PSDPxax 0x00B8074A +#define GDI_DSPDaoxn 0x00B906E6 +#define GDI_DPSnao 0x00BA0B09 +#define GDI_MERGEPAINT 0x00BB0226 +#define GDI_SPDSanax 0x00BC1CE4 +#define GDI_SDxPDxan 0x00BD0D7D +#define GDI_DPSxo 0x00BE0269 +#define GDI_DPSano 0x00BF08C9 +#define GDI_MERGECOPY 0x00C000CA +#define GDI_SPDSnaoxn 0x00C11B04 +#define GDI_SPDSonoxn 0x00C21884 +#define GDI_PSxn 0x00C3006A +#define GDI_SPDnoa 0x00C40E04 +#define GDI_SPDSxoxn 0x00C50664 +#define GDI_SDPnax 0x00C60708 +#define GDI_PSDPoaxn 0x00C707AA +#define GDI_SDPoa 0x00C803A8 +#define GDI_SPDoxn 0x00C90184 +#define GDI_DPSDxax 0x00CA0749 +#define GDI_SPDSaoxn 0x00CB06E4 +#define GDI_SRCCOPY 0x00CC0020 +#define GDI_SDPono 0x00CD0888 +#define GDI_SDPnao 0x00CE0B08 +#define GDI_SPno 0x00CF0224 +#define GDI_PSDnoa 0x00D00E0A +#define GDI_PSDPxoxn 0x00D1066A +#define GDI_PDSnax 0x00D20705 +#define GDI_SPDSoaxn 0x00D307A4 +#define GDI_SSPxPDxax 0x00D41D78 +#define GDI_DPSanan 0x00D50CE9 +#define GDI_PSDPSaoxx 0x00D616EA +#define GDI_DPSxan 0x00D70349 +#define GDI_PDSPxax 0x00D80745 +#define GDI_SDPSaoxn 0x00D906E8 +#define GDI_DPSDanax 0x00DA1CE9 +#define GDI_SPxDSxan 0x00DB0D75 +#define GDI_SPDnao 0x00DC0B04 +#define GDI_SDno 0x00DD0228 +#define GDI_SDPxo 0x00DE0268 +#define GDI_SDPano 0x00DF08C8 +#define GDI_PDSoa 0x00E003A5 +#define GDI_PDSoxn 0x00E10185 +#define GDI_DSPDxax 0x00E20746 +#define GDI_PSDPaoxn 0x00E306EA +#define GDI_SDPSxax 0x00E40748 +#define GDI_PDSPaoxn 0x00E506E5 +#define GDI_SDPSanax 0x00E61CE8 +#define GDI_SPxPDxan 0x00E70D79 +#define GDI_SSPxDSxax 0x00E81D74 +#define GDI_DSPDSanaxxn 0x00E95CE6 +#define GDI_DPSao 0x00EA02E9 +#define GDI_DPSxno 0x00EB0849 +#define GDI_SDPao 0x00EC02E8 +#define GDI_SDPxno 0x00ED0848 +#define GDI_SRCPAINT 0x00EE0086 +#define GDI_SDPnoo 0x00EF0A08 +#define GDI_PATCOPY 0x00F00021 +#define GDI_PDSono 0x00F10885 +#define GDI_PDSnao 0x00F20B05 +#define GDI_PSno 0x00F3022A +#define GDI_PSDnao 0x00F40B0A +#define GDI_PDno 0x00F50225 +#define GDI_PDSxo 0x00F60265 +#define GDI_PDSano 0x00F708C5 +#define GDI_PDSao 0x00F802E5 +#define GDI_PDSxno 0x00F90845 +#define GDI_DPo 0x00FA0089 +#define GDI_PATPAINT 0x00FB0A09 +#define GDI_PSo 0x00FC008A +#define GDI_PSDnoo 0x00FD0A0A +#define GDI_DPSoo 0x00FE02A9 +#define GDI_WHITENESS 0x00FF0062 +#define GDI_GLYPH_ORDER 0xFFFFFFFF + +/* Brush Styles */ +#define GDI_BS_SOLID 0x00 +#define GDI_BS_NULL 0x01 +#define GDI_BS_HATCHED 0x02 +#define GDI_BS_PATTERN 0x03 + +/* Hatch Patterns */ +#define GDI_HS_HORIZONTAL 0x00 +#define GDI_HS_VERTICAL 0x01 +#define GDI_HS_FDIAGONAL 0x02 +#define GDI_HS_BDIAGONAL 0x03 +#define GDI_HS_CROSS 0x04 +#define GDI_HS_DIAGCROSS 0x05 + +/* Pen Styles */ +#define GDI_PS_SOLID 0x00 +#define GDI_PS_DASH 0x01 +#define GDI_PS_NULL 0x05 + +/* Background Modes */ +#define GDI_OPAQUE 0x00000001 +#define GDI_TRANSPARENT 0x00000002 + +/* Fill Modes */ +#define GDI_FILL_ALTERNATE 0x01 +#define GDI_FILL_WINDING 0x02 + +/* GDI Object Types */ +#define GDIOBJECT_BITMAP 0x00 +#define GDIOBJECT_PEN 0x01 +#define GDIOBJECT_PALETTE 0x02 +#define GDIOBJECT_BRUSH 0x03 +#define GDIOBJECT_RECT 0x04 +#define GDIOBJECT_REGION 0x05 + +/* Region return values */ +#ifndef NULLREGION +#define NULLREGION 0x01 +#define SIMPLEREGION 0x02 +#define COMPLEXREGION 0x03 +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + BYTE objectType; + } GDIOBJECT; + typedef GDIOBJECT* HGDIOBJECT; + + typedef struct + { + BYTE objectType; + INT32 left; + INT32 top; + INT32 right; + INT32 bottom; + } GDI_RECT; + typedef GDI_RECT* HGDI_RECT; + + typedef struct + { + BYTE objectType; + INT32 x; /* left */ + INT32 y; /* top */ + INT32 w; /* width */ + INT32 h; /* height */ + BOOL null; /* null region */ + } GDI_RGN; + typedef GDI_RGN* HGDI_RGN; + + typedef struct + { + BYTE objectType; + UINT32 format; + INT32 width; + INT32 height; + UINT32 scanline; + BYTE* data; + void (*free)(void*); + } GDI_BITMAP; + typedef GDI_BITMAP* HGDI_BITMAP; + + typedef struct + { + BYTE objectType; + UINT32 style; + INT32 width; + INT32 posX; + INT32 posY; + UINT32 color; + UINT32 format; + const gdiPalette* palette; + } GDI_PEN; + typedef GDI_PEN* HGDI_PEN; + + typedef struct + { + BYTE red; + BYTE green; + BYTE blue; + } GDI_PALETTEENTRY; + + typedef struct + { + UINT16 count; + GDI_PALETTEENTRY* entries; + } GDI_PALETTE; + typedef GDI_PALETTE* HGDI_PALETTE; + + typedef struct + { + INT32 x; + INT32 y; + } GDI_POINT; + typedef GDI_POINT* HGDI_POINT; + + typedef struct + { + BYTE objectType; + int style; + HGDI_BITMAP pattern; + UINT32 color; + INT32 nXOrg; + INT32 nYOrg; + } GDI_BRUSH; + typedef GDI_BRUSH* HGDI_BRUSH; + + typedef struct + { + UINT32 count; + INT32 ninvalid; + HGDI_RGN invalid; + HGDI_RGN cinvalid; + } GDI_WND; + typedef GDI_WND* HGDI_WND; + + typedef struct + { + HGDIOBJECT selectedObject; + UINT32 format; + UINT32 bkColor; + UINT32 textColor; + HGDI_BRUSH brush; + HGDI_RGN clip; + HGDI_PEN pen; + HGDI_WND hwnd; + INT32 drawMode; + INT32 bkMode; + } GDI_DC; + typedef GDI_DC* HGDI_DC; + + struct gdi_bitmap + { + rdpBitmap _p; + + HGDI_DC hdc; + HGDI_BITMAP bitmap; + HGDI_BITMAP org_bitmap; + }; + typedef struct gdi_bitmap gdiBitmap; + + struct gdi_glyph + { + rdpBitmap _p; + + HGDI_DC hdc; + HGDI_BITMAP bitmap; + HGDI_BITMAP org_bitmap; + }; + typedef struct gdi_glyph gdiGlyph; + + struct rdp_gdi + { + rdpContext* context; + + INT32 width; + INT32 height; + UINT32 stride; + UINT32 dstFormat; + UINT32 cursor_x; + UINT32 cursor_y; + + HGDI_DC hdc; + gdiBitmap* primary; + gdiBitmap* drawing; + UINT32 bitmap_size; + UINT32 bitmap_stride; + BYTE* primary_buffer; + gdiPalette palette; + gdiBitmap* image; + void (*free)(void*); + + BOOL inGfxFrame; + BOOL graphicsReset; /* deprecated, remove with FreeRDP v3 */ + BOOL suppressOutput; + UINT16 outputSurfaceId; + UINT32 frameId; + RdpgfxClientContext* gfx; + VideoClientContext* video; + GeometryClientContext* geometry; + + wLog* log; + }; + typedef struct rdp_gdi rdpGdi; + + FREERDP_API DWORD gdi_rop3_code(BYTE code); + FREERDP_API const char* gdi_rop3_code_string(BYTE code); + FREERDP_API const char* gdi_rop3_string(DWORD rop); + + FREERDP_API UINT32 gdi_get_pixel_format(UINT32 bitsPerPixel); + FREERDP_API BOOL gdi_decode_color(rdpGdi* gdi, const UINT32 srcColor, UINT32* color, + UINT32* format); + FREERDP_API BOOL gdi_resize(rdpGdi* gdi, UINT32 width, UINT32 height); + FREERDP_API BOOL gdi_resize_ex(rdpGdi* gdi, UINT32 width, UINT32 height, UINT32 stride, + UINT32 format, BYTE* buffer, void (*pfree)(void*)); + FREERDP_API BOOL gdi_init(freerdp* instance, UINT32 format); + FREERDP_API BOOL gdi_init_ex(freerdp* instance, UINT32 format, UINT32 stride, BYTE* buffer, + void (*pfree)(void*)); + FREERDP_API void gdi_free(freerdp* instance); + + FREERDP_API BOOL gdi_send_suppress_output(rdpGdi* gdi, BOOL suppress); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_GDI_H */ diff --git a/include/freerdp/gdi/gfx.h b/include/freerdp/gdi/gfx.h new file mode 100644 index 0000000..4e731b3 --- /dev/null +++ b/include/freerdp/gdi/gfx.h @@ -0,0 +1,77 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * GDI Graphics Pipeline + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_GDI_GFX_H +#define FREERDP_GDI_GFX_H + +#include <freerdp/api.h> +#include <freerdp/gdi/gdi.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + struct gdi_gfx_surface + { + UINT16 surfaceId; + rdpCodecs* codecs; + H264_CONTEXT* h264; + UINT32 width; + UINT32 height; + UINT32 mappedWidth; + UINT32 mappedHeight; + BYTE* data; + UINT32 scanline; + UINT32 format; + BOOL outputMapped; + UINT32 outputOriginX; + UINT32 outputOriginY; + REGION16 invalidRegion; + UINT64 windowId; + UINT32 outputTargetWidth; + UINT32 outputTargetHeight; + BOOL windowMapped; + BOOL handleInUpdateSurfaceArea; + }; + typedef struct gdi_gfx_surface gdiGfxSurface; + + struct gdi_gfx_cache_entry + { + UINT64 cacheKey; + UINT32 width; + UINT32 height; + BYTE* data; + UINT32 scanline; + UINT32 format; + }; + typedef struct gdi_gfx_cache_entry gdiGfxCacheEntry; + + FREERDP_API BOOL gdi_graphics_pipeline_init(rdpGdi* gdi, RdpgfxClientContext* gfx); + FREERDP_API BOOL gdi_graphics_pipeline_init_ex(rdpGdi* gdi, RdpgfxClientContext* gfx, + pcRdpgfxMapWindowForSurface map, + pcRdpgfxUnmapWindowForSurface unmap, + pcRdpgfxUpdateSurfaceArea update); + FREERDP_API void gdi_graphics_pipeline_uninit(rdpGdi* gdi, RdpgfxClientContext* gfx); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_GDI_GFX_H */ diff --git a/include/freerdp/gdi/pen.h b/include/freerdp/gdi/pen.h new file mode 100644 index 0000000..880ef25 --- /dev/null +++ b/include/freerdp/gdi/pen.h @@ -0,0 +1,39 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * GDI Pen Functions + * + * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_GDI_PEN_H +#define FREERDP_GDI_PEN_H + +#include <freerdp/api.h> +#include <freerdp/gdi/gdi.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API HGDI_PEN gdi_CreatePen(UINT32 fnPenStyle, UINT32 nWidth, UINT32 crColor, + UINT32 format, const gdiPalette* palette); + FREERDP_API UINT32 gdi_GetPenColor(HGDI_PEN pen, UINT32 format); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_GDI_PEN_H */ diff --git a/include/freerdp/gdi/region.h b/include/freerdp/gdi/region.h new file mode 100644 index 0000000..d515b7b --- /dev/null +++ b/include/freerdp/gdi/region.h @@ -0,0 +1,64 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * GDI Region Functions + * + * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2016 Armin Novak <armin.novak@thincast.com> + * Copyright 2016 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_GDI_REGION_H +#define FREERDP_GDI_REGION_H + +#include <freerdp/api.h> +#include <freerdp/gdi/gdi.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API HGDI_RGN gdi_CreateRectRgn(INT32 nLeftRect, INT32 nTopRect, INT32 nRightRect, + INT32 nBottomRect); + FREERDP_API HGDI_RECT gdi_CreateRect(INT32 xLeft, INT32 yTop, INT32 xRight, INT32 yBottom); + FREERDP_API BOOL gdi_RectToRgn(const HGDI_RECT rect, HGDI_RGN rgn); + FREERDP_API BOOL gdi_CRectToRgn(INT32 left, INT32 top, INT32 right, INT32 bottom, HGDI_RGN rgn); + FREERDP_API BOOL gdi_RectToCRgn(const HGDI_RECT rect, INT32* x, INT32* y, INT32* w, INT32* h); + FREERDP_API BOOL gdi_CRectToCRgn(INT32 left, INT32 top, INT32 right, INT32 bottom, INT32* x, + INT32* y, INT32* w, INT32* h); + FREERDP_API BOOL gdi_RgnToRect(const HGDI_RGN rgn, HGDI_RECT rect); + FREERDP_API BOOL gdi_CRgnToRect(INT64 x, INT64 y, INT32 w, INT32 h, HGDI_RECT rect); + FREERDP_API BOOL gdi_RgnToCRect(const HGDI_RGN rgn, INT32* left, INT32* top, INT32* right, + INT32* bottom); + FREERDP_API BOOL gdi_CRgnToCRect(INT32 x, INT32 y, INT32 w, INT32 h, INT32* left, INT32* top, + INT32* right, INT32* bottom); + FREERDP_API BOOL gdi_CopyOverlap(INT32 x, INT32 y, INT32 width, INT32 height, INT32 srcx, + INT32 srcy); + FREERDP_API BOOL gdi_SetRect(HGDI_RECT rc, INT32 xLeft, INT32 yTop, INT32 xRight, + INT32 yBottom); + FREERDP_API BOOL gdi_SetRgn(HGDI_RGN hRgn, INT32 nXLeft, INT32 nYLeft, INT32 nWidth, + INT32 nHeight); + FREERDP_API BOOL gdi_SetRectRgn(HGDI_RGN hRgn, INT32 nLeftRect, INT32 nTopRect, + INT32 nRightRect, INT32 nBottomRect); + FREERDP_API BOOL gdi_EqualRgn(const HGDI_RGN hSrcRgn1, const HGDI_RGN hSrcRgn2); + FREERDP_API BOOL gdi_CopyRect(HGDI_RECT dst, const HGDI_RECT src); + FREERDP_API BOOL gdi_PtInRect(const HGDI_RECT rc, INT32 x, INT32 y); + FREERDP_API BOOL gdi_InvalidateRegion(HGDI_DC hdc, INT32 x, INT32 y, INT32 w, INT32 h); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_GDI_REGION_H */ diff --git a/include/freerdp/gdi/shape.h b/include/freerdp/gdi/shape.h new file mode 100644 index 0000000..d4a183e --- /dev/null +++ b/include/freerdp/gdi/shape.h @@ -0,0 +1,44 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * GDI Shape Functions + * + * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_GDI_SHAPE_H +#define FREERDP_GDI_SHAPE_H + +#include <freerdp/api.h> +#include <freerdp/gdi/gdi.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API BOOL gdi_Ellipse(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, + int nBottomRect); + FREERDP_API BOOL gdi_FillRect(HGDI_DC hdc, const HGDI_RECT rect, HGDI_BRUSH hbr); + FREERDP_API BOOL gdi_Polygon(HGDI_DC hdc, GDI_POINT* lpPoints, int nCount); + FREERDP_API BOOL gdi_PolyPolygon(HGDI_DC hdc, GDI_POINT* lpPoints, int* lpPolyCounts, + int nCount); + FREERDP_API BOOL gdi_Rectangle(HGDI_DC hdc, INT32 nXDst, INT32 nYDst, INT32 nWidth, + INT32 nHeight); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_GDI_SHAPE_H */ diff --git a/include/freerdp/gdi/video.h b/include/freerdp/gdi/video.h new file mode 100644 index 0000000..a9e50f8 --- /dev/null +++ b/include/freerdp/gdi/video.h @@ -0,0 +1,53 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Video Optimized Remoting Virtual Channel Extension for X11 + * + * Copyright 2017 David Fort <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FREERDP_GDI_VIDEO_H_ +#define FREERDP_GDI_VIDEO_H_ + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/gdi/gdi.h> +#include <freerdp/client/geometry.h> +#include <freerdp/client/video.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_gdiVideoContext gdiVideoContext; + + FREERDP_API void gdi_video_geometry_init(rdpGdi* gdi, GeometryClientContext* geom); + FREERDP_API void gdi_video_geometry_uninit(rdpGdi* gdi, GeometryClientContext* geom); + + FREERDP_API void gdi_video_control_init(rdpGdi* gdi, VideoClientContext* video); + FREERDP_API void gdi_video_control_uninit(rdpGdi* gdi, VideoClientContext* video); + + FREERDP_API void gdi_video_data_init(rdpGdi* gdi, VideoClientContext* video); + FREERDP_API void gdi_video_data_uninit(rdpGdi* gdi, VideoClientContext* context); + + FREERDP_API void gdi_video_free(gdiVideoContext* context); + + WINPR_ATTR_MALLOC(gdi_video_free, 1) + FREERDP_API gdiVideoContext* gdi_video_new(rdpGdi* gdi); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_GDI_VIDEO_H_ */ diff --git a/include/freerdp/graphics.h b/include/freerdp/graphics.h new file mode 100644 index 0000000..1b98635 --- /dev/null +++ b/include/freerdp/graphics.h @@ -0,0 +1,175 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Graphical Objects + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2016 Armin Novak <armin.novak@thincast.com> + * Copyright 2016 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_GRAPHICS_H +#define FREERDP_GRAPHICS_H + +#include <stdlib.h> +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_bitmap rdpBitmap; + typedef struct rdp_pointer rdpPointer; + typedef struct rdp_glyph rdpGlyph; + + /* Bitmap Class */ + typedef BOOL (*pBitmap_New)(rdpContext* context, rdpBitmap* bitmap); + typedef void (*pBitmap_Free)(rdpContext* context, rdpBitmap* bitmap); + typedef BOOL (*pBitmap_Paint)(rdpContext* context, rdpBitmap* bitmap); + typedef BOOL (*pBitmap_Decompress)(rdpContext* context, rdpBitmap* bitmap, const BYTE* data, + UINT32 width, UINT32 height, UINT32 bpp, UINT32 length, + BOOL compressed, UINT32 codec_id); + typedef BOOL (*pBitmap_SetSurface)(rdpContext* context, rdpBitmap* bitmap, BOOL primary); + + struct rdp_bitmap + { + size_t size; /* 0 */ + pBitmap_New New; /* 1 */ + pBitmap_Free Free; /* 2 */ + pBitmap_Paint Paint; /* 3 */ + pBitmap_Decompress Decompress; /* 4 */ + pBitmap_SetSurface SetSurface; /* 5 */ + UINT32 paddingA[16 - 6]; /* 6 */ + + UINT32 left; /* 16 */ + UINT32 top; /* 17 */ + UINT32 right; /* 18 */ + UINT32 bottom; /* 19 */ + UINT32 width; /* 20 */ + UINT32 height; /* 21 */ + UINT32 format; /* 22 */ + UINT32 flags; /* 23 */ + UINT32 length; /* 24 */ + BYTE* data; /* 25 */ + UINT64 key64; /* 26 */ + UINT32 paddingB[32 - 27]; /* 27 */ + + BOOL compressed; /* 32 */ + BOOL ephemeral; /* 33 */ + UINT32 paddingC[64 - 34]; /* 34 */ + }; + + FREERDP_API rdpBitmap* Bitmap_Alloc(rdpContext* context); + FREERDP_API BOOL Bitmap_SetRectangle(rdpBitmap* bitmap, UINT16 left, UINT16 top, UINT16 right, + UINT16 bottom); + FREERDP_API BOOL Bitmap_SetDimensions(rdpBitmap* bitmap, UINT16 width, UINT16 height); + + /* Pointer Class */ + + typedef BOOL (*pPointer_New)(rdpContext* context, rdpPointer* pointer); + typedef void (*pPointer_Free)(rdpContext* context, rdpPointer* pointer); + typedef BOOL (*pPointer_Set)(rdpContext* context, rdpPointer* pointer); + typedef BOOL (*pPointer_SetNull)(rdpContext* context); + typedef BOOL (*pPointer_SetDefault)(rdpContext* context); + typedef BOOL (*pPointer_SetPosition)(rdpContext* context, UINT32 x, UINT32 y); + + struct rdp_pointer + { + size_t size; /* 0 */ + pPointer_New New; /* 1 */ + pPointer_Free Free; /* 2 */ + pPointer_Set Set; /* 3 */ + pPointer_SetNull SetNull; /* 4*/ + pPointer_SetDefault SetDefault; /* 5 */ + pPointer_SetPosition SetPosition; /* 6 */ + UINT32 paddingA[16 - 7]; /* 7 */ + + UINT32 xPos; /* 16 */ + UINT32 yPos; /* 17 */ + UINT32 width; /* 18 */ + UINT32 height; /* 19 */ + UINT32 xorBpp; /* 20 */ + UINT32 lengthAndMask; /* 21 */ + UINT32 lengthXorMask; /* 22 */ + BYTE* xorMaskData; /* 23 */ + BYTE* andMaskData; /* 24 */ + UINT32 paddingB[32 - 25]; /* 25 */ + }; + + FREERDP_API rdpPointer* Pointer_Alloc(rdpContext* context); + + /* Glyph Class */ + typedef BOOL (*pGlyph_New)(rdpContext* context, rdpGlyph* glyph); + typedef void (*pGlyph_Free)(rdpContext* context, rdpGlyph* glyph); + typedef BOOL (*pGlyph_Draw)(rdpContext* context, const rdpGlyph* glyph, INT32 x, INT32 y, + INT32 w, INT32 h, INT32 sx, INT32 sy, BOOL fOpRedundant); + typedef BOOL (*pGlyph_BeginDraw)(rdpContext* context, INT32 x, INT32 y, INT32 width, + INT32 height, UINT32 bgcolor, UINT32 fgcolor, + BOOL fOpRedundant); + typedef BOOL (*pGlyph_EndDraw)(rdpContext* context, INT32 x, INT32 y, INT32 width, INT32 height, + UINT32 bgcolor, UINT32 fgcolor); + typedef BOOL (*pGlyph_SetBounds)(rdpContext* context, INT32 x, INT32 y, INT32 width, + INT32 height); + + struct rdp_glyph + { + size_t size; /* 0 */ + pGlyph_New New; /* 1 */ + pGlyph_Free Free; /* 2 */ + pGlyph_Draw Draw; /* 3 */ + pGlyph_BeginDraw BeginDraw; /* 4 */ + pGlyph_EndDraw EndDraw; /* 5 */ + pGlyph_SetBounds SetBounds; /* 6 */ + UINT32 paddingA[16 - 7]; /* 7 */ + + INT32 x; /* 16 */ + INT32 y; /* 17 */ + UINT32 cx; /* 18 */ + UINT32 cy; /* 19 */ + UINT32 cb; /* 20 */ + BYTE* aj; /* 21 */ + UINT32 paddingB[32 - 22]; /* 22 */ + }; + + FREERDP_API rdpGlyph* Glyph_Alloc(rdpContext* context, INT32 x, INT32 y, UINT32 cx, UINT32 cy, + UINT32 cb, const BYTE* aj); + + /* Graphics Module */ + + struct rdp_graphics + { + rdpContext* context; /* 0 */ + rdpBitmap* Bitmap_Prototype; /* 1 */ + rdpPointer* Pointer_Prototype; /* 2 */ + rdpGlyph* Glyph_Prototype; /* 3 */ + UINT32 paddingA[16 - 4]; /* 4 */ + }; + typedef struct rdp_graphics rdpGraphics; + + FREERDP_API void graphics_register_bitmap(rdpGraphics* graphics, const rdpBitmap* bitmap); + FREERDP_API void graphics_register_pointer(rdpGraphics* graphics, const rdpPointer* pointer); + FREERDP_API void graphics_register_glyph(rdpGraphics* graphics, const rdpGlyph* glyph); + + FREERDP_API void graphics_free(rdpGraphics* graphics); + + WINPR_ATTR_MALLOC(graphics_free, 1) + FREERDP_API rdpGraphics* graphics_new(rdpContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_GRAPHICS_H */ diff --git a/include/freerdp/heartbeat.h b/include/freerdp/heartbeat.h new file mode 100644 index 0000000..61512e6 --- /dev/null +++ b/include/freerdp/heartbeat.h @@ -0,0 +1,47 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Heartbeat PDUs + * + * Copyright 2014 Dell Software <Mike.McDonald@software.dell.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_HEARTBEAT_H +#define FREERDP_HEARTBEAT_H + +#include <freerdp/types.h> +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_heartbeat rdpHeartbeat; + + typedef BOOL (*pServerHeartbeat)(freerdp* instance, BYTE period, BYTE count1, BYTE count2); + + struct rdp_heartbeat + { + pServerHeartbeat ServerHeartbeat; + }; + + FREERDP_API BOOL freerdp_heartbeat_send_heartbeat_pdu(freerdp_peer* peer, BYTE period, + BYTE count1, BYTE count2); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_HEARTBEAT_H */ diff --git a/include/freerdp/input.h b/include/freerdp/input.h new file mode 100644 index 0000000..512fcee --- /dev/null +++ b/include/freerdp/input.h @@ -0,0 +1,123 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Input Interface API + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_INPUT_H +#define FREERDP_INPUT_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/scancode.h> + +#include <winpr/crt.h> +#include <winpr/collections.h> + +/* keyboard Flags */ +#define KBD_FLAGS_EXTENDED 0x0100 +#define KBD_FLAGS_EXTENDED1 0x0200 +#define KBD_FLAGS_DOWN \ + 0x4000 /**< Presence of this flag indicates the key was already down previously */ +#define KBD_FLAGS_RELEASE \ + 0x8000 /**< Presence of this flag indicates a key was released. Absence a key press */ + +/* Pointer Flags */ +#define PTR_FLAGS_HWHEEL 0x0400 +#define PTR_FLAGS_WHEEL 0x0200 +#define PTR_FLAGS_WHEEL_NEGATIVE 0x0100 +#define PTR_FLAGS_MOVE 0x0800 +#define PTR_FLAGS_DOWN 0x8000 +#define PTR_FLAGS_BUTTON1 0x1000 /* left */ +#define PTR_FLAGS_BUTTON2 0x2000 /* right */ +#define PTR_FLAGS_BUTTON3 0x4000 /* middle */ +#define WheelRotationMask 0x01FF + +/* Extended Pointer Flags */ +#define PTR_XFLAGS_DOWN 0x8000 +#define PTR_XFLAGS_BUTTON1 0x0001 +#define PTR_XFLAGS_BUTTON2 0x0002 + +/* Keyboard Toggle Flags */ +#define KBD_SYNC_SCROLL_LOCK 0x00000001 +#define KBD_SYNC_NUM_LOCK 0x00000002 +#define KBD_SYNC_CAPS_LOCK 0x00000004 +#define KBD_SYNC_KANA_LOCK 0x00000008 + +#define RDP_CLIENT_INPUT_PDU_HEADER_LENGTH 4 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_input rdpInput; + + /* defined inside libfreerdp-core */ + typedef struct rdp_input_proxy rdpInputProxy; + + /* Input Interface */ + + typedef BOOL (*pSynchronizeEvent)(rdpInput* input, UINT32 flags); + typedef BOOL (*pKeyboardEvent)(rdpInput* input, UINT16 flags, UINT8 code); + typedef BOOL (*pUnicodeKeyboardEvent)(rdpInput* input, UINT16 flags, UINT16 code); + typedef BOOL (*pMouseEvent)(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); + typedef BOOL (*pRelMouseEvent)(rdpInput* input, UINT16 flags, INT16 xDelta, INT16 yDelta); + typedef BOOL (*pQoEEvent)(rdpInput* input, UINT32 timestampMS); + typedef BOOL (*pExtendedMouseEvent)(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); + typedef BOOL (*pFocusInEvent)(rdpInput* input, UINT16 toggleStates); + typedef BOOL (*pKeyboardPauseEvent)(rdpInput* input); + + struct rdp_input + { + rdpContext* context; /* 0 */ + void* param1; /* 1 */ + UINT32 paddingA[16 - 2]; /* 2 */ + + pSynchronizeEvent SynchronizeEvent; /* 16 */ + pKeyboardEvent KeyboardEvent; /* 17 */ + pUnicodeKeyboardEvent UnicodeKeyboardEvent; /* 18 */ + pMouseEvent MouseEvent; /* 19 */ + pExtendedMouseEvent ExtendedMouseEvent; /* 20 */ + pFocusInEvent FocusInEvent; /*21 */ + pKeyboardPauseEvent KeyboardPauseEvent; /* 22 */ + pRelMouseEvent RelMouseEvent; /* 23 */ + pQoEEvent QoEEvent; /* 24 */ + + UINT32 paddingB[32 - 25]; /* 25 */ + }; + + FREERDP_API BOOL freerdp_input_send_synchronize_event(rdpInput* input, UINT32 flags); + FREERDP_API BOOL freerdp_input_send_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code); + FREERDP_API BOOL freerdp_input_send_keyboard_event_ex(rdpInput* input, BOOL down, BOOL repeat, + UINT32 rdp_scancode); + FREERDP_API BOOL freerdp_input_send_keyboard_pause_event(rdpInput* input); + FREERDP_API BOOL freerdp_input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, + UINT16 code); + FREERDP_API BOOL freerdp_input_send_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, + UINT16 y); + FREERDP_API BOOL freerdp_input_send_rel_mouse_event(rdpInput* input, UINT16 flags, INT16 xDelta, + INT16 yDelta); + FREERDP_API BOOL freerdp_input_send_qoe_timestamp(rdpInput* input, UINT32 timestampMS); + FREERDP_API BOOL freerdp_input_send_extended_mouse_event(rdpInput* input, UINT16 flags, + UINT16 x, UINT16 y); + FREERDP_API BOOL freerdp_input_send_focus_in_event(rdpInput* input, UINT16 toggleStates); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_INPUT_H */ diff --git a/include/freerdp/license.h b/include/freerdp/license.h new file mode 100644 index 0000000..dc195a4 --- /dev/null +++ b/include/freerdp/license.h @@ -0,0 +1,62 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Licensing API + * + * Copyright 2018 David Fort <contact@hardening-consulting.com> + * Copyright 2022 Armin Novak <armin.novak@thincast.com> + * Copyright 2022 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_LICENSE_H +#define FREERDP_LICENSE_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + LICENSE_STATE_INITIAL, + LICENSE_STATE_CONFIGURED, + LICENSE_STATE_REQUEST, + LICENSE_STATE_NEW_REQUEST, + LICENSE_STATE_PLATFORM_CHALLENGE, + LICENSE_STATE_PLATFORM_CHALLENGE_RESPONSE, + LICENSE_STATE_COMPLETED, + LICENSE_STATE_ABORTED + } LICENSE_STATE; + + typedef enum + { + LICENSE_TYPE_INVALID = 0, + LICENSE_TYPE_NONE, + LICENSE_TYPE_ISSUED + } LICENSE_TYPE; + + typedef struct rdp_license rdpLicense; + + FREERDP_API rdpLicense* license_get(rdpContext* context); + FREERDP_API LICENSE_STATE license_get_state(const rdpLicense* license); + FREERDP_API LICENSE_TYPE license_get_type(const rdpLicense* license); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_LICENSE_H */ diff --git a/include/freerdp/listener.h b/include/freerdp/listener.h new file mode 100644 index 0000000..56ede56 --- /dev/null +++ b/include/freerdp/listener.h @@ -0,0 +1,86 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP Server Listener + * + * Copyright 2011 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_LISTENER_H +#define FREERDP_LISTENER_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> +#include <freerdp/peer.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_freerdp_listener freerdp_listener; + + typedef BOOL (*psListenerOpen)(freerdp_listener* instance, const char* bind_address, + UINT16 port); + typedef BOOL (*psListenerOpenLocal)(freerdp_listener* instance, const char* path); + typedef BOOL (*psListenerOpenFromSocket)(freerdp_listener* instance, int fd); +#if defined(WITH_FREERDP_DEPRECATED) + WINPR_DEPRECATED_VAR("Use psListenerGetEventHandles instead", + typedef BOOL (*psListenerGetFileDescriptor)(freerdp_listener* instance, + void** rfds, int* rcount);) +#endif + typedef DWORD (*psListenerGetEventHandles)(freerdp_listener* instance, HANDLE* events, + DWORD nCount); + typedef BOOL (*psListenerCheckFileDescriptor)(freerdp_listener* instance); + typedef void (*psListenerClose)(freerdp_listener* instance); + typedef BOOL (*psPeerAccepted)(freerdp_listener* instance, freerdp_peer* client); + + struct rdp_freerdp_listener + { + void* info; + void* listener; + void* param1; + void* param2; + void* param3; + void* param4; + + psListenerOpen Open; + psListenerOpenLocal OpenLocal; +#if defined(WITH_FREERDP_DEPRECATED) + WINPR_DEPRECATED_VAR("Use rdp_freerdp_listener::GetEventHandles instead", + psListenerGetFileDescriptor GetFileDescriptor;) +#else + void* reserved; +#endif + psListenerGetEventHandles GetEventHandles; + psListenerCheckFileDescriptor CheckFileDescriptor; + psListenerClose Close; + + psPeerAccepted PeerAccepted; + psListenerOpenFromSocket OpenFromSocket; + + psListenerCheckFileDescriptor CheckPeerAcceptRestrictions; + }; + + FREERDP_API void freerdp_listener_free(freerdp_listener* instance); + + WINPR_ATTR_MALLOC(freerdp_listener_free, 1) + FREERDP_API freerdp_listener* freerdp_listener_new(void); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_LISTENER_H */ diff --git a/include/freerdp/locale/keyboard.h b/include/freerdp/locale/keyboard.h new file mode 100644 index 0000000..e35cf69 --- /dev/null +++ b/include/freerdp/locale/keyboard.h @@ -0,0 +1,239 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Keyboard Mapping + * + * Copyright 2009-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_LOCALE_KEYBOARD_H +#define FREERDP_LOCALE_KEYBOARD_H + +#include <winpr/input.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/scancode.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define RDP_KEYBOARD_LAYOUT_TYPE_STANDARD 1 +#define RDP_KEYBOARD_LAYOUT_TYPE_VARIANT 2 +#define RDP_KEYBOARD_LAYOUT_TYPE_IME 4 + +typedef struct +{ + UINT16 id; + UINT8 primaryId; + UINT8 subId; + char locale[512]; + char primaryLanguage[512]; + char primaryLanguageSymbol[512]; + char subLanguage[512]; + char subLanguageSymbol[512]; +} RDP_CODEPAGE; + +typedef struct +{ + DWORD code; /* Keyboard layout code */ + char* name; /* Keyboard layout name */ +} RDP_KEYBOARD_LAYOUT; + +/* Keyboard layout IDs */ + +#define KBD_ARABIC_101 0x00000401 +#define KBD_BULGARIAN 0x00000402 +#define KBD_CHINESE_TRADITIONAL_US 0x00000404 +#define KBD_CZECH 0x00000405 +#define KBD_DANISH 0x00000406 +#define KBD_GERMAN 0x00000407 +#define KBD_GREEK 0x00000408 +#define KBD_US 0x00000409 +#define KBD_SPANISH 0x0000040A +#define KBD_FINNISH 0x0000040B +#define KBD_FRENCH 0x0000040C +#define KBD_HEBREW 0x0000040D +#define KBD_HUNGARIAN 0x0000040E +#define KBD_ICELANDIC 0x0000040F +#define KBD_ITALIAN 0x00000410 +#define KBD_JAPANESE 0x00000411 +#define KBD_KOREAN 0x00000412 +#define KBD_DUTCH 0x00000413 +#define KBD_NORWEGIAN 0x00000414 +#define KBD_POLISH_PROGRAMMERS 0x00000415 +#define KBD_PORTUGUESE_BRAZILIAN_ABNT 0x00000416 +#define KBD_ROMANIAN 0x00000418 +#define KBD_RUSSIAN 0x00000419 +#define KBD_CROATIAN 0x0000041A +#define KBD_SLOVAK 0x0000041B +#define KBD_ALBANIAN 0x0000041C +#define KBD_SWEDISH 0x0000041D +#define KBD_THAI_KEDMANEE 0x0000041E +#define KBD_TURKISH_Q 0x0000041F +#define KBD_URDU 0x00000420 +#define KBD_UKRAINIAN 0x00000422 +#define KBD_BELARUSIAN 0x00000423 +#define KBD_SLOVENIAN 0x00000424 +#define KBD_ESTONIAN 0x00000425 +#define KBD_LATVIAN 0x00000426 +#define KBD_LITHUANIAN_IBM 0x00000427 +#define KBD_FARSI 0x00000429 +#define KBD_VIETNAMESE 0x0000042A +#define KBD_ARMENIAN_EASTERN 0x0000042B +#define KBD_AZERI_LATIN 0x0000042C +#define KBD_FYRO_MACEDONIAN 0x0000042F +#define KBD_GEORGIAN 0x00000437 +#define KBD_FAEROESE 0x00000438 +#define KBD_DEVANAGARI_INSCRIPT 0x00000439 +#define KBD_MALTESE_47_KEY 0x0000043A +#define KBD_NORWEGIAN_WITH_SAMI 0x0000043B +#define KBD_KAZAKH 0x0000043F +#define KBD_KYRGYZ_CYRILLIC 0x00000440 +#define KBD_TATAR 0x00000444 +#define KBD_BENGALI 0x00000445 +#define KBD_PUNJABI 0x00000446 +#define KBD_GUJARATI 0x00000447 +#define KBD_TAMIL 0x00000449 +#define KBD_TELUGU 0x0000044A +#define KBD_KANNADA 0x0000044B +#define KBD_MALAYALAM 0x0000044C +#define KBD_MARATHI 0x0000044E +#define KBD_MONGOLIAN_CYRILLIC 0x00000450 +#define KBD_UNITED_KINGDOM_EXTENDED 0x00000452 +#define KBD_SYRIAC 0x0000045A +#define KBD_NEPALI 0x00000461 +#define KBD_PASHTO 0x00000463 +#define KBD_DIVEHI_PHONETIC 0x00000465 +#define KBD_LUXEMBOURGISH 0x0000046E +#define KBD_MAORI 0x00000481 +#define KBD_CHINESE_SIMPLIFIED_US 0x00000804 +#define KBD_SWISS_GERMAN 0x00000807 +#define KBD_UNITED_KINGDOM 0x00000809 +#define KBD_LATIN_AMERICAN 0x0000080A +#define KBD_BELGIAN_FRENCH 0x0000080C +#define KBD_BELGIAN_PERIOD 0x00000813 +#define KBD_PORTUGUESE 0x00000816 +#define KBD_SERBIAN_LATIN 0x0000081A +#define KBD_AZERI_CYRILLIC 0x0000082C +#define KBD_SWEDISH_WITH_SAMI 0x0000083B +#define KBD_UZBEK_CYRILLIC 0x00000843 +#define KBD_INUKTITUT_LATIN 0x0000085D +#define KBD_CANADIAN_FRENCH_LEGACY 0x00000C0C +#define KBD_SERBIAN_CYRILLIC 0x00000C1A +#define KBD_CANADIAN_FRENCH 0x00001009 +#define KBD_SWISS_FRENCH 0x0000100C +#define KBD_BOSNIAN 0x0000141A +#define KBD_IRISH 0x00001809 +#define KBD_BOSNIAN_CYRILLIC 0x0000201A + +/* Keyboard layout variant IDs */ + +#define KBD_ARABIC_102 0x00010401 +#define KBD_BULGARIAN_LATIN 0x00010402 +#define KBD_CZECH_QWERTY 0x00010405 +#define KBD_GERMAN_IBM 0x00010407 +#define KBD_GREEK_220 0x00010408 +#define KBD_UNITED_STATES_DVORAK 0x00010409 +#define KBD_SPANISH_VARIATION 0x0001040A +#define KBD_HUNGARIAN_101_KEY 0x0001040E +#define KBD_ITALIAN_142 0x00010410 +#define KBD_POLISH_214 0x00010415 +#define KBD_PORTUGUESE_BRAZILIAN_ABNT2 0x00010416 +#define KBD_ROMANIAN_STANDARD 0x00010418 +#define KBD_RUSSIAN_TYPEWRITER 0x00010419 +#define KBD_SLOVAK_QWERTY 0x0001041B +#define KBD_THAI_PATTACHOTE 0x0001041E +#define KBD_TURKISH_F 0x0001041F +#define KBD_LATVIAN_QWERTY 0x00010426 +#define KBD_LITHUANIAN 0x00010427 +#define KBD_ARMENIAN_WESTERN 0x0001042B +#define KBD_GEORGIAN_QUERTY 0x00010437 +#define KBD_HINDI_TRADITIONAL 0x00010439 +#define KBD_MALTESE_48_KEY 0x0001043A +#define KBD_SAMI_EXTENDED_NORWAY 0x0001043B +#define KBD_BENGALI_INSCRIPT 0x00010445 +#define KBD_KHMER 0x00010453 +#define KBD_SYRIAC_PHONETIC 0x0001045A +#define KBD_DIVEHI_TYPEWRITER 0x00010465 +#define KBD_BELGIAN_COMMA 0x0001080C +#define KBD_FINNISH_WITH_SAMI 0x0001083B +#define KBD_CANADIAN_MULTILINGUAL_STANDARD 0x00011009 +#define KBD_GAELIC 0x00011809 +#define KBD_ARABIC_102_AZERTY 0x00020401 +#define KBD_CZECH_PROGRAMMERS 0x00020405 +#define KBD_GREEK_319 0x00020408 +#define KBD_UNITED_STATES_INTERNATIONAL 0x00020409 +#define KBD_RUSSIAN_PHONETIC 0x00020419 +#define KBD_THAI_KEDMANEE_NON_SHIFTLOCK 0x0002041E +#define KBD_BANGLA 0x00020445 +#define KBD_SAMI_EXTENDED_FINLAND_SWEDEN 0x0002083B +#define KBD_GREEK_220_LATIN 0x00030408 +#define KBD_UNITED_STATES_DVORAK_FOR_LEFT_HAND 0x00030409 +#define KBD_THAI_PATTACHOTE_NON_SHIFTLOCK 0x0003041E +#define KBD_BULGARIAN_PHONETIC 0x00040402 +#define KBD_GREEK_319_LATIN 0x00040408 +#define KBD_UNITED_STATES_DVORAK_FOR_RIGHT_HAND 0x00040409 +#define KBD_UNITED_STATES_DVORAK_PROGRAMMER 0x19360409 +#define KBD_GREEK_LATIN 0x00050408 +#define KBD_PERSIAN 0x00050429 +#define KBD_US_ENGLISH_TABLE_FOR_IBM_ARABIC_238_L 0x00050409 +#define KBD_GREEK_POLYTONIC 0x00060408 +#define KBD_FRENCH_BEPO 0xa000040c +#define KBD_GERMAN_NEO 0xB0000407 + +/* Global Input Method Editor (IME) IDs */ + +#define KBD_CHINESE_TRADITIONAL_PHONETIC 0xE0010404 +#define KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002 0xE0010411 +#define KBD_KOREAN_INPUT_SYSTEM_IME_2000 0xE0010412 +#define KBD_CHINESE_SIMPLIFIED_QUANPIN 0xE0010804 +#define KBD_CHINESE_TRADITIONAL_CHANGJIE 0xE0020404 +#define KBD_CHINESE_SIMPLIFIED_SHUANGPIN 0xE0020804 +#define KBD_CHINESE_TRADITIONAL_QUICK 0xE0030404 +#define KBD_CHINESE_SIMPLIFIED_ZHENGMA 0xE0030804 +#define KBD_CHINESE_TRADITIONAL_BIG5_CODE 0xE0040404 +#define KBD_CHINESE_TRADITIONAL_ARRAY 0xE0050404 +#define KBD_CHINESE_SIMPLIFIED_NEIMA 0xE0050804 +#define KBD_CHINESE_TRADITIONAL_DAYI 0xE0060404 +#define KBD_CHINESE_TRADITIONAL_UNICODE 0xE0070404 +#define KBD_CHINESE_TRADITIONAL_NEW_PHONETIC 0xE0080404 +#define KBD_CHINESE_TRADITIONAL_NEW_CHANGJIE 0xE0090404 +#define KBD_CHINESE_TRADITIONAL_MICROSOFT_PINYIN_IME_3 0xE00E0804 +#define KBD_CHINESE_TRADITIONAL_ALPHANUMERIC 0xE00F0404 + + FREERDP_API DWORD freerdp_keyboard_init(DWORD keyboardLayoutId); + FREERDP_API DWORD freerdp_keyboard_init_ex(DWORD keyboardLayoutId, + const char* keyboardRemappingList); + FREERDP_API RDP_KEYBOARD_LAYOUT* freerdp_keyboard_get_layouts(DWORD types, size_t* count); + FREERDP_API void freerdp_keyboard_layouts_free(RDP_KEYBOARD_LAYOUT* layouts, size_t count); + FREERDP_API const char* freerdp_keyboard_get_layout_name_from_id(DWORD keyboardLayoutId); + FREERDP_API DWORD freerdp_keyboard_get_layout_id_from_name(const char* name); + FREERDP_API DWORD freerdp_keyboard_get_rdp_scancode_from_x11_keycode(DWORD keycode); + FREERDP_API DWORD freerdp_keyboard_get_x11_keycode_from_rdp_scancode(DWORD scancode, + BOOL extended); + + FREERDP_API RDP_CODEPAGE* + freerdp_keyboard_get_matching_codepages(DWORD column, const char* filter, size_t* count); + FREERDP_API void freerdp_codepages_free(RDP_CODEPAGE*); + + FREERDP_API const char* freerdp_keyboard_scancode_name(DWORD scancode); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_LOCALE_KEYBOARD_H */ diff --git a/include/freerdp/locale/locale.h b/include/freerdp/locale/locale.h new file mode 100644 index 0000000..6647bb2 --- /dev/null +++ b/include/freerdp/locale/locale.h @@ -0,0 +1,250 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Microsoft Locales + * + * Copyright 2009-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Detection of plausible keyboard layout id based on current locale (LANG) setting. */ + +/* + * Refer to "Windows XP/Server 2003 - List of Locale IDs, Input Locale, and Language Collection": + * http://www.microsoft.com/globaldev/reference/winxp/xp-lcid.mspx + */ + +#ifndef FREERDP_LOCALE_H +#define FREERDP_LOCALE_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#define AFRIKAANS 0x0436 +#define ALBANIAN 0x041C +#define ALSATIAN 0x0484 +#define AMHARIC 0x045E +#define ARABIC_SAUDI_ARABIA 0x0401 +#define ARABIC_IRAQ 0x0801 +#define ARABIC_EGYPT 0x0C01 +#define ARABIC_LIBYA 0x1001 +#define ARABIC_ALGERIA 0x1401 +#define ARABIC_MOROCCO 0x1801 +#define ARABIC_TUNISIA 0x1C01 +#define ARABIC_OMAN 0x2001 +#define ARABIC_YEMEN 0x2401 +#define ARABIC_SYRIA 0x2801 +#define ARABIC_JORDAN 0x2C01 +#define ARABIC_LEBANON 0x3001 +#define ARABIC_KUWAIT 0x3401 +#define ARABIC_UAE 0x3801 +#define ARABIC_BAHRAIN 0x3C01 +#define ARABIC_QATAR 0x4001 +#define ARMENIAN 0x042B +#define ASSAMESE 0x044D +#define AZERI_LATIN 0x042C +#define AZERI_CYRILLIC 0x082C +#define BASHKIR 0x046D +#define BASQUE 0x042D +#define BELARUSIAN 0x0423 +#define BENGALI_INDIA 0x0445 +#define BOSNIAN_LATIN 0x141A +#define BRETON 0x047E +#define BULGARIAN 0x0402 +#define CATALAN 0x0403 +#define CHEROKEE 0x045C +#define CHINESE_TAIWAN 0x0404 +#define CHINESE_PRC 0x0804 +#define CHINESE_HONG_KONG 0x0C04 +#define CHINESE_SINGAPORE 0x1004 +#define CHINESE_MACAU 0x1404 +#define CROATIAN 0x041A +#define CROATIAN_BOSNIA_HERZEGOVINA 0x101A +#define CZECH 0x0405 +#define DANISH 0x0406 +#define DARI 0x048C +#define DIVEHI 0x0465 +#define DUTCH_STANDARD 0x0413 +#define DUTCH_BELGIAN 0x0813 +#define ENGLISH_UNITED_STATES 0x0409 +#define ENGLISH_UNITED_KINGDOM 0x0809 +#define ENGLISH_AUSTRALIAN 0x0C09 +#define ENGLISH_CANADIAN 0x1009 +#define ENGLISH_NEW_ZEALAND 0x1409 +#define ENGLISH_INDIA 0x4009 +#define ENGLISH_IRELAND 0x1809 +#define ENGLISH_MALAYSIA 0x4409 +#define ENGLISH_SOUTH_AFRICA 0x1C09 +#define ENGLISH_JAMAICA 0x2009 +#define ENGLISH_CARIBBEAN 0x2409 +#define ENGLISH_BELIZE 0x2809 +#define ENGLISH_TRINIDAD 0x2C09 +#define ENGLISH_ZIMBABWE 0x3009 +#define ENGLISH_PHILIPPINES 0x3409 +#define ENGLISH_SINGAPORE 0x4809 +#define ESTONIAN 0x0425 +#define FAEROESE 0x0438 +#define FARSI 0x0429 +#define FILIPINO 0x0464 +#define FINNISH 0x040B +#define FRENCH_STANDARD 0x040C +#define FRENCH_BELGIAN 0x080C +#define FRENCH_CANADIAN 0x0C0C +#define FRENCH_SWISS 0x100C +#define FRENCH_LUXEMBOURG 0x140C +#define FRENCH_MONACO 0x180C +#define FRISIAN 0x0462 +#define GEORGIAN 0x0437 +#define GALICIAN 0x0456 +#define GERMAN_STANDARD 0x0407 +#define GERMAN_SWISS 0x0807 +#define GERMAN_AUSTRIAN 0x0C07 +#define GERMAN_LUXEMBOURG 0x1007 +#define GERMAN_LIECHTENSTEIN 0x1407 +#define GREEK 0x0408 +#define GREENLANDIC 0x046F +#define GUJARATI 0x0447 +#define HAWAIIAN 0x0475 +#define HEBREW 0x040D +#define HINDI 0x0439 +#define HUNGARIAN 0x040E +#define ICELANDIC 0x040F +#define IGBO 0x0470 +#define INDONESIAN 0x0421 +#define INUKTITUT 0x045D +#define IRISH 0x083C +#define ITALIAN_STANDARD 0x0410 +#define ITALIAN_SWISS 0x0810 +#define JAPANESE 0x0411 +#define KANNADA 0x044B +#define KAZAKH 0x043F +#define KHMER 0x0453 +#define KICHE 0x0486 +#define KINYARWANDA 0x0487 +#define KONKANI 0x0457 +#define KOREAN 0x0412 +#define KYRGYZ 0x0440 +#define LAO 0x0454 +#define LATVIAN 0x0426 +#define LITHUANIAN 0x0427 +#define LOWER_SORBIAN 0x082E +#define LUXEMBOURGISH 0x046E +#define MACEDONIAN 0x042F +#define MALAY_MALAYSIA 0x043E +#define MALAY_BRUNEI_DARUSSALAM 0x083E +#define MALAYALAM 0x044C +#define MALTESE 0x043A +#define MAPUDUNGUN 0x047A +#define MAORI 0x0481 +#define MARATHI 0x044E +#define MOHAWK 0x047C +#define MONGOLIAN 0x0450 +#define MYANMAR 0x0455 +#define NEPALI 0x0461 +#define NORWEGIAN_BOKMAL 0x0414 +#define NORWEGIAN_NYNORSK 0x0814 +#define OCCITAN 0x0482 +#define ORIYA 0x0448 +#define PASHTO 0x0463 +#define POLISH 0x0415 +#define PORTUGUESE_BRAZILIAN 0x0416 +#define PORTUGUESE_STANDARD 0x0816 +#define PUNJABI 0x0446 +#define QUECHUA_BOLIVIA 0x046B +#define QUECHUA_ECUADOR 0x086B +#define QUECHUA_PERU 0x0C6B +#define ROMANIAN 0x0418 +#define ROMANSH 0x0417 +#define RUSSIAN 0x0419 +#define SAMI_INARI 0x243B +#define SAMI_LULE_NORWAY 0x103B +#define SAMI_LULE_SWEDEN 0x143B +#define SAMI_NORTHERN_FINLAND 0x0C3B +#define SAMI_NORTHERN_NORWAY 0x043B +#define SAMI_NORTHERN_SWEDEN 0x083B +#define SAMI_SKOLT 0x203B +#define SAMI_SOUTHERN_NORWAY 0x183B +#define SAMI_SOUTHERN_SWEDEN 0x1C3B +#define SANSKRIT 0x044F +#define SERBIAN_LATIN 0x081A +#define SERBIAN_LATIN_BOSNIA_HERZEGOVINA 0x181A +#define SERBIAN_CYRILLIC 0x0C1A +#define SERBIAN_CYRILLIC_BOSNIA_HERZEGOVINA 0x1C1A +#define SESOTHO_SA_LEBOA 0x046C +#define SINHALA 0x045B +#define SLOVAK 0x041B +#define SLOVENIAN 0x0424 +#define SPANISH_TRADITIONAL_SORT 0x040A +#define SPANISH_MEXICAN 0x080A +#define SPANISH_MODERN_SORT 0x0C0A +#define SPANISH_GUATEMALA 0x100A +#define SPANISH_COSTA_RICA 0x140A +#define SPANISH_PANAMA 0x180A +#define SPANISH_DOMINICAN_REPUBLIC 0x1C0A +#define SPANISH_VENEZUELA 0x200A +#define SPANISH_COLOMBIA 0x240A +#define SPANISH_PERU 0x280A +#define SPANISH_ARGENTINA 0x2C0A +#define SPANISH_ECUADOR 0x300A +#define SPANISH_CHILE 0x340A +#define SPANISH_UNITED_STATES 0x540A +#define SPANISH_URUGUAY 0x380A +#define SPANISH_PARAGUAY 0x3C0A +#define SPANISH_BOLIVIA 0x400A +#define SPANISH_EL_SALVADOR 0x440A +#define SPANISH_HONDURAS 0x480A +#define SPANISH_NICARAGUA 0x4C0A +#define SPANISH_PUERTO_RICO 0x500A +#define SWAHILI 0x0441 +#define SWEDISH 0x041D +#define SWEDISH_FINLAND 0x081D +#define SYRIAC 0x045A +#define TAMIL 0x0449 +#define TATAR 0x0444 +#define TELUGU 0x044A +#define THAI 0x041E +#define TIBETAN_BHUTAN 0x0851 +#define TIBETAN_PRC 0x0451 +#define TSWANA 0x0432 +#define UKRAINIAN 0x0422 +#define TURKISH 0x041F +#define TURKMEN 0x0442 +#define UIGHUR 0x0480 +#define UPPER_SORBIAN 0x042E +#define URDU 0x0420 +#define URDU_INDIA 0x0820 +#define UZBEK_LATIN 0x0443 +#define UZBEK_CYRILLIC 0x0843 +#define VIETNAMESE 0x042A +#define WELSH 0x0452 +#define WOLOF 0x0488 +#define XHOSA 0x0434 +#define YAKUT 0x0485 +#define YI 0x0478 +#define YORUBA 0x046A +#define ZULU 0x0435 + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API DWORD freerdp_get_system_locale_id(void); + FREERDP_API const char* freerdp_get_system_locale_name_from_id(DWORD localeId); + FREERDP_API int freerdp_detect_keyboard_layout_from_system_locale(DWORD* keyboardLayoutId); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_LOCALE_H */ diff --git a/include/freerdp/log.h b/include/freerdp/log.h new file mode 100644 index 0000000..2343889 --- /dev/null +++ b/include/freerdp/log.h @@ -0,0 +1,29 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP log defines + * + * Copyright 2014 Armin Novak <armin.novak@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_LOG_H +#define FREERDP_LOG_H + +#include <winpr/wlog.h> + +#define FREERDP_TAG(tag) "com.freerdp." tag +#define SERVER_TAG(tag) FREERDP_TAG("server.") tag +#define CLIENT_TAG(tag) FREERDP_TAG("client.") tag + +#endif /* FREERDP_UTILS_DEBUG_H */ diff --git a/include/freerdp/message.h b/include/freerdp/message.h new file mode 100644 index 0000000..1c47b9f --- /dev/null +++ b/include/freerdp/message.h @@ -0,0 +1,376 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Asynchronous Message Interface + * + * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_MESSAGE_H +#define FREERDP_MESSAGE_H + +#define GetMessageType(_id) (_id & 0xFF) +#define GetMessageClass(_id) ((_id >> 16) & 0xFF) + +#define GetMessageId(_class, _type) ((_class << 16) | _type) + +#define MakeMessageId(_class, _type) (((_class##_Class) << 16) | (_class##_##_type)) + +/** + * Update Message Queue + */ + +#define FREERDP_UPDATE_MESSAGE_QUEUE 1 + +#define Update_Base 0 + +/* Update */ + +#define Update_Class (Update_Base + 1) + +#define Update_BeginPaint 1 +#define Update_EndPaint 2 +#define Update_SetBounds 3 +#define Update_Synchronize 4 +#define Update_DesktopResize 5 +#define Update_BitmapUpdate 6 +#define Update_Palette 7 +#define Update_PlaySound 8 +#define Update_RefreshRect 9 +#define Update_SuppressOutput 10 +#define Update_SurfaceCommand 11 +#define Update_SurfaceBits 12 +#define Update_SurfaceFrameMarker 13 +#define Update_SurfaceFrameAcknowledge 14 +#define Update_SetKeyboardIndicators 15 +#define Update_SetKeyboardImeStatus 16 + +#define FREERDP_UPDATE_BEGIN_PAINT MakeMessageId(Update, BeginPaint) +#define FREERDP_UPDATE_ END_PAINT MakeMessageId(Update, EndPaint) +#define FREERDP_UPDATE_SET_BOUNDS MakeMessageId(Update, SetBounds) +#define FREERDP_UPDATE_SYNCHRONIZE MakeMessageId(Update, Synchronize) +#define FREERDP_UPDATE_DESKTOP_RESIZE MakeMessageId(Update, DesktopResize) +#define FREERDP_UPDATE_BITMAP_UPDATE MakeMessageId(Update, BitmapUpdate) +#define FREERDP_UPDATE_PALETTE MakeMessageId(Update, Palette) +#define FREERDP_UPDATE_PLAY_SOUND MakeMessageId(Update, PlaySound) +#define FREERDP_UPDATE_REFRESH_RECT MakeMessageId(Update, RefreshRect) +#define FREERDP_UPDATE_SUPPRESS_OUTPUT MakeMessageId(Update, SuppressOutput) +#define FREERDP_UPDATE_SURFACE_COMMAND MakeMessageId(Update, SurfaceCommand) +#define FREERDP_UPDATE_SURFACE_BITS MakeMessageId(Update, SurfaceBits) +#define FREERDP_UPDATE_SURFACE_FRAME_MARKER MakeMessageId(Update, SurfaceFrameMarker) +#define FREERDP_UPDATE_SURFACE_FRAME_ACKNOWLEDGE MakeMessageId(Update, SurfaceFrameAcknowledge) +#define FREERDP_UPDATE_SET_KEYBOARD_INDICATORS MakeMessageId(Update, SetKeyboardIndicators) + +/* Primary Update */ + +#define PrimaryUpdate_Class (Update_Base + 2) + +#define PrimaryUpdate_DstBlt 1 +#define PrimaryUpdate_PatBlt 2 +#define PrimaryUpdate_ScrBlt 3 +#define PrimaryUpdate_OpaqueRect 4 +#define PrimaryUpdate_DrawNineGrid 5 +#define PrimaryUpdate_MultiDstBlt 6 +#define PrimaryUpdate_MultiPatBlt 7 +#define PrimaryUpdate_MultiScrBlt 8 +#define PrimaryUpdate_MultiOpaqueRect 9 +#define PrimaryUpdate_MultiDrawNineGrid 10 +#define PrimaryUpdate_LineTo 11 +#define PrimaryUpdate_Polyline 12 +#define PrimaryUpdate_MemBlt 13 +#define PrimaryUpdate_Mem3Blt 14 +#define PrimaryUpdate_SaveBitmap 15 +#define PrimaryUpdate_GlyphIndex 16 +#define PrimaryUpdate_FastIndex 17 +#define PrimaryUpdate_FastGlyph 18 +#define PrimaryUpdate_PolygonSC 19 +#define PrimaryUpdate_PolygonCB 20 +#define PrimaryUpdate_EllipseSC 21 +#define PrimaryUpdate_EllipseCB 22 + +#define FREERDP_PRIMARY_UPDATE_DSTBLT MakeMessageId(PrimaryUpdate, DstBlt) +#define FREERDP_PRIMARY_UPDATE_PATBLT MakeMessageId(PrimaryUpdate, PatBlt) +#define FREERDP_PRIMARY_UPDATE_SCRBLT MakeMessageId(PrimaryUpdate, ScrBlt) +#define FREERDP_PRIMARY_UPDATE_OPAQUE_RECT MakeMessageId(PrimaryUpdate, OpaqueRect) +#define FREERDP_PRIMARY_UPDATE_DRAW_NINE_GRID MakeMessageId(PrimaryUpdate, DrawNineGrid) +#define FREERDP_PRIMARY_UPDATE_MULTI_DSTBLT MakeMessageId(PrimaryUpdate, MultiDstBlt) +#define FREERDP_PRIMARY_UPDATE_MULTI_PATBLT MakeMessageId(PrimaryUpdate, MultiPatBlt) +#define FREERDP_PRIMARY_UPDATE_MULTI_SCRBLT MakeMessageId(PrimaryUpdate, MultiScrBlt) +#define FREERDP_PRIMARY_UPDATE_MULTI_OPAQUE_RECT MakeMessageId(PrimaryUpdate, MultiOpaqueRect) +#define FREERDP_PRIMARY_UPDATE_MULTI_DRAW_NINE_GRID MakeMessageId(PrimaryUpdate, MultiDrawNineGrid) +#define FREERDP_PRIMARY_UPDATE_LINE_TO MakeMessageId(PrimaryUpdate, LineTo) +#define FREERDP_PRIMARY_UPDATE_POLYLINE MakeMessageId(PrimaryUpdate, Polyline) +#define FREERDP_PRIMARY_UPDATE_MEMBLT MakeMessageId(PrimaryUpdate, MemBlt) +#define FREERDP_PRIMARY_UPDATE_MEM3BLT MakeMessageId(PrimaryUpdate, Mem3Blt) +#define FREERDP_PRIMARY_UPDATE_SAVE_BITMAP MakeMessageId(PrimaryUpdate, SaveBitmap) +#define FREERDP_PRIMARY_UPDATE_GLYPH_INDEX MakeMessageId(PrimaryUpdate, GlyphIndex) +#define FREERDP_PRIMARY_UPDATE_FAST_INDEX MakeMessageId(PrimaryUpdate, FastIndex) +#define FREERDP_PRIMARY_UPDATE_FAST_GLYPH MakeMessageId(PrimaryUpdate, FastGlyph) +#define FREERDP_PRIMARY_UPDATE_POLYGON_SC MakeMessageId(PrimaryUpdate, PolygonSC) +#define FREERDP_PRIMARY_UPDATE_POLYGON_CB MakeMessageId(PrimaryUpdate, PolygonCB) +#define FREERDP_PRIMARY_UPDATE_ELLIPSE_SC MakeMessageId(PrimaryUpdate, EllipseSC) +#define FREERDP_PRIMARY_UPDATE_ELLIPSE_CB MakeMessageId(PrimaryUpdate, EllipseCB) + +/* Secondary Update */ + +#define SecondaryUpdate_Class (Update_Base + 3) + +#define SecondaryUpdate_CacheBitmap 1 +#define SecondaryUpdate_CacheBitmapV2 2 +#define SecondaryUpdate_CacheBitmapV3 3 +#define SecondaryUpdate_CacheColorTable 4 +#define SecondaryUpdate_CacheGlyph 5 +#define SecondaryUpdate_CacheGlyphV2 6 +#define SecondaryUpdate_CacheBrush 7 + +#define FREERDP_SECONDARY_UPDATE_CACHE_BITMAP MakeMessageId(SecondaryUpdate, CacheBitmap) +#define FREERDP_SECONDARY_UPDATE_CACHE_BITMAP_V2 MakeMessageId(SecondaryUpdate, CacheBitmapV2) +#define FREERDP_SECONDARY_UPDATE_CACHE_BITMAP_V3 MakeMessageId(SecondaryUpdate, CacheBitmapV3) +#define FREERDP_SECONDARY_UPDATE_CACHE_COLOR_TABLE MakeMessageId(SecondaryUpdate, CacheColorTable) +#define FREERDP_SECONDARY_UPDATE_CACHE_GLYPH MakeMessageId(SecondaryUpdate, CacheGlyph) +#define FREERDP_SECONDARY_UPDATE_CACHE_GLYPH_V2 MakeMessageId(SecondaryUpdate, CacheGlyphV2) +#define FREERDP_SECONDARY_UPDATE_CACHE_BRUSH MakeMessageId(SecondaryUpdate, CacheBrush) + +/* Alternate Secondary Update */ + +#define AltSecUpdate_Class (Update_Base + 4) + +#define AltSecUpdate_CreateOffscreenBitmap 1 +#define AltSecUpdate_SwitchSurface 2 +#define AltSecUpdate_CreateNineGridBitmap 3 +#define AltSecUpdate_FrameMarker 4 +#define AltSecUpdate_StreamBitmapFirst 5 +#define AltSecUpdate_StreamBitmapNext 6 +#define AltSecUpdate_DrawGdiPlusFirst 7 +#define AltSecUpdate_DrawGdiPlusNext 8 +#define AltSecUpdate_DrawGdiPlusEnd 9 +#define AltSecUpdate_DrawGdiPlusCacheFirst 10 +#define AltSecUpdate_DrawGdiPlusCacheNext 11 +#define AltSecUpdate_DrawGdiPlusCacheEnd 12 + +#define FREERDP_ALTSEC_UPDATE_CREATE_OFFSCREEN_BITMAP \ + MakeMessageId(AltSecUpdate, CreateOffscreenBitmap) +#define FREERDP_ALTSEC_UPDATE_SWITCH_SURFACE MakeMessageId(AltSecUpdate, SwitchSurface) +#define FREERDP_ALTSEC_UPDATE_CREATE_NINE_GRID_BITMAP \ + MakeMessageId(AltSecUpdate, CreateNineGridBitmap) +#define FREERDP_ALTSEC_UPDATE_FRAME_MARKER MakeMessageId(AltSecUpdate, FrameMarker) +#define FREERDP_ALTSEC_UPDATE_STREAM_BITMAP_FIRST MakeMessageId(AltSecUpdate, StreamBitmapFirst) +#define FREERDP_ALTSEC_UPDATE_STREAM_BITMAP_NEXT MakeMessageId(AltSecUpdate, StreamBitmapNext) +#define FREERDP_ALTSEC_UPDATE_DRAW_GDI_PLUS_FIRST MakeMessageId(AltSecUpdate, DrawGdiPlusFirst) +#define FREERDP_ALTSEC_UPDATE_DRAW_GDI_PLUS_NEXT MakeMessageId(AltSecUpdate, DrawGdiPlusNext) +#define FREERDP_ALTSEC_UPDATE_DRAW_GDI_PLUS_END MakeMessageId(AltSecUpdate, DrawGdiPlusEnd) +#define FREERDP_ALTSEC_UPDATE_DRAW_GDI_PLUS_CACHE_FIRST \ + MakeMessageId(AltSecUpdate, DrawGdiPlusCacheFirst) +#define FREERDP_ALTSEC_UPDATE_DRAW_GDI_PLUS_CACHE_NEXT \ + MakeMessageId(AltSecUpdate, DrawGdiPlusCacheNext) +#define FREERDP_ALTSEC_UPDATE_DRAW_GDI_PLUS_CACHE_END \ + MakeMessageId(AltSecUpdate, DrawGdiPlusCacheEnd) + +/* Window Update */ + +#define WindowUpdate_Class (Update_Base + 5) + +#define WindowUpdate_WindowCreate 1 +#define WindowUpdate_WindowUpdate 2 +#define WindowUpdate_WindowIcon 3 +#define WindowUpdate_WindowCachedIcon 4 +#define WindowUpdate_WindowDelete 5 +#define WindowUpdate_NotifyIconCreate 6 +#define WindowUpdate_NotifyIconUpdate 7 +#define WindowUpdate_NotifyIconDelete 8 +#define WindowUpdate_MonitoredDesktop 9 +#define WindowUpdate_NonMonitoredDesktop 10 + +#define FREERDP_WINDOW_UPDATE_WINDOW_CREATE MakeMessageId(WindowUpdate, WindowCreate) +#define FREERDP_WINDOW_UPDATE_WINDOW_UPDATE MakeMessageId(WindowUpdate, WindowUpdate) +#define FREERDP_WINDOW_UPDATE_WINDOW_ICON MakeMessageId(WindowUpdate, WindowIcon) +#define FREERDP_WINDOW_UPDATE_WINDOW_CACHED_ICON MakeMessageId(WindowUpdate, WindowCachedIcon) +#define FREERDP_WINDOW_UPDATE_WINDOW_DELETE MakeMessageId(WindowUpdate, WindowDelete) +#define FREERDP_WINDOW_UPDATE_NOTIFY_ICON_CREATE MakeMessageId(WindowUpdate, NotifyIconCreate) +#define FREERDP_WINDOW_UPDATE_NOTIFY_ICON_UPDATE MakeMessageId(WindowUpdate, NotifyIconUpdate) +#define FREERDP_WINDOW_UPDATE_NOTIFY_ICON_DELETE MakeMessageId(WindowUpdate, NotifyIconDelete) +#define FREERDP_WINDOW_UPDATE_MONITORED_DESKTOP MakeMessageId(WindowUpdate, MonitoredDesktop) +#define FREERDP_WINDOW_UPDATE_NON_MONITORED_DESKTOP MakeMessageId(WindowUpdate, NonMonitoredDesktop) + +/* Pointer Update */ + +#define PointerUpdate_Class (Update_Base + 6) + +#define PointerUpdate_PointerPosition 1 +#define PointerUpdate_PointerSystem 2 +#define PointerUpdate_PointerColor 3 +#define PointerUpdate_PointerNew 4 +#define PointerUpdate_PointerCached 5 +#define PointerUpdate_PointerLarge 6 + +#define FREERDP_POINTER_UPDATE_ POINTER_POSITION MakeMessageId(PointerUpdate, PointerPosition) +#define FREERDP_POINTER_UPDATE_POINTER_SYSTEM MakeMessageId(PointerUpdate, PointerSystem) +#define FREERDP_POINTER_UPDATE_POINTER_COLOR MakeMessageId(PointerUpdate, PointerColor) +#define FREERDP_POINTER_UPDATE_POINTER_NEW MakeMessageId(PointerUpdate, PointerNew) +#define FREERDP_POINTER_UPDATE_POINTER_CACHED MakeMessageId(PointerUpdate, PointerCached) +#define FREERDP_POINTER_UPDATE_POINTER_LARGE MakeMessageId(PointerUpdate, PointerLarge) + +/** + * Input Message Queue + */ + +#define FREERDP_INPUT_MESSAGE_QUEUE 2 + +#define Input_Base 16 + +/* Input */ + +#define Input_Class (Input_Base + 1) + +#define Input_SynchronizeEvent 1 +#define Input_KeyboardEvent 2 +#define Input_UnicodeKeyboardEvent 3 +#define Input_MouseEvent 4 +#define Input_ExtendedMouseEvent 5 +#define Input_FocusInEvent 6 +#define Input_KeyboardPauseEvent 7 + +#define FREERDP_INPUT_SYNCHRONIZE_EVENT MakeMessageId(Input, SynchronizeEvent) +#define FREERDP_INPUT_KEYBOARD_EVENT MakeMessageId(Input, KeyboardEvent) +#define FREERDP_INPUT_UNICODE_KEYBOARD_EVENT MakeMessageId(Input, UnicodeKeyboardEvent) +#define FREERDP_INPUT_MOUSE_EVENT MakeMessageId(Input, MouseEvent) +#define FREERDP_INPUT_EXTENDED_MOUSE_EVENT MakeMessageId(Input, ExtendedMouseEvent) +#define FREERDP_INPUT_FOCUS_IN_EVENT MakeMessageId(Input, FocusInEvent) +#define FREERDP_INPUT_KEYBOARD_PAUSE_EVENT MakeMessageId(Input, KeyboardPauseEvent) + +/** + * Static Channel Message Queues + */ + +#define FREERDP_CHANNEL_MESSAGE_QUEUE 3 + +#define Channel_Base 20 + +/** + * Debug Channel + */ + +#define DebugChannel_Class (Channel_Base + 1) + +/** + * Clipboard Channel + */ + +#define CliprdrChannel_Class (Channel_Base + 2) + +#define CliprdrChannel_MonitorReady 1 +#define CliprdrChannel_FormatList 2 +#define CliprdrChannel_DataRequest 3 +#define CliprdrChannel_DataResponse 4 +#define CliprdrChannel_ClipCaps 5 +#define CliprdrChannel_FilecontentsRequest 6 +#define CliprdrChannel_FilecontentsResponse 7 +#define CliprdrChannel_LockClipdata 8 +#define CliprdrChannel_UnLockClipdata 9 +#define CliprdrChannel_TemporaryDirectory 10 + +#define FREERDP_CLIPRDR_CHANNEL_MONITOR_READY MakeMessageId(CliprdrChannel, MonitorReady) +#define FREERDP_CLIPRDR_CHANNEL_FORMAT_LIST MakeMessageId(CliprdrChannel, FormatList) +#define FREERDP_CLIPRDR_CHANNEL_DATA_REQUEST MakeMessageId(CliprdrChannel, DataRequest) +#define FREERDP_CLIPRDR_CHANNEL_DATA_RESPONSE MakeMessageId(CliprdrChannel, DataResponse) +#define FREERDP_CLIPRDR_CHANNEL_CLIP_CAPS MakeMessageId(CliprdrChannel, ClipCaps) + +/** + * Multimedia Redirection Channel + */ + +#define TsmfChannel_Class (Channel_Base + 3) + +#define TsmfChannel_VideoFrame 1 +#define TsmfChannel_Redraw 2 + +#define FREERDP_TSMF_CHANNEL_VIDEO_FRAME MakeMessageId(TsmfChannel, VideoFrame) +#define FREERDP_TSMF_CHANNEL_REDRAW MakeMessageId(TsmfChannel, Redraw) + +/** + * RemoteApp Channel + */ + +#define RailChannel_Class (Channel_Base + 4) + +#define RailChannel_ClientExecute 1 +#define RailChannel_ClientActivate 2 +#define RailChannel_GetSystemParam 3 +#define RailChannel_ClientSystemParam 4 +#define RailChannel_ServerSystemParam 5 +#define RailChannel_ClientSystemCommand 6 +#define RailChannel_ClientHandshake 7 +#define RailChannel_ServerHandshake 8 +#define RailChannel_ClientNotifyEvent 9 +#define RailChannel_ClientWindowMove 10 +#define RailChannel_ServerLocalMoveSize 11 +#define RailChannel_ServerMinMaxInfo 12 +#define RailChannel_ClientInformation 13 +#define RailChannel_ClientSystemMenu 14 +#define RailChannel_ClientLanguageBarInfo 15 +#define RailChannel_ServerLanguageBarInfo 16 +#define RailChannel_ServerExecuteResult 17 +#define RailChannel_ClientGetAppIdRequest 18 +#define RailChannel_ServerGetAppIdResponse 19 +#define RailChannel_ClientHandshakeEx 20 +#define RailChannel_ServerHandshakeEx 21 + +#define FREERDP_RAIL_CHANNEL_CLIENT_EXECUTE MakeMessageId(RailChannel, ClientExecute) +#define FREERDP_RAIL_CHANNEL_CLIENT_ACTIVATE MakeMessageId(RailChannel, ClientActivate) +#define FREERDP_RAIL_CHANNEL_GET_SYSTEM_PARAM MakeMessageId(RailChannel, GetSystemParam) +#define FREERDP_RAIL_CHANNEL_CLIENT_SYSTEM_PARAM MakeMessageId(RailChannel, ClientSystemParam) +#define FREERDP_RAIL_CHANNEL_SERVER_SYSTEM_PARAM MakeMessageId(RailChannel, ClientSystemParam) +#define FREERDP_RAIL_CHANNEL_CLIENT_SYSTEM_COMMAND MakeMessageId(RailChannel, ClientSystemCommand) +#define FREERDP_RAIL_CHANNEL_CLIENT_HANDSHAKE MakeMessageId(RailChannel, ClientHandshake) +#define FREERDP_RAIL_CHANNEL_SERVER_HANDSHAKE MakeMessageId(RailChannel, ServerHandshake) +#define FREERDP_RAIL_CHANNEL_CLIENT_NOTIFY_EVENT MakeMessageId(RailChannel, ClientNotifyEvent) +#define FREERDP_RAIL_CHANNEL_CLIENT_WINDOW_MOVE MakeMessageId(RailChannel, ClientWindowMove) +#define FREERDP_RAIL_CHANNEL_SERVER_LOCAL_MOVE_SIZE MakeMessageId(RailChannel, ServerLocalMoveSize) +#define FREERDP_RAIL_CHANNEL_SERVER_MIN_MAX_INFO MakeMessageId(RailChannel, ServerMinMaxInfo) +#define FREERDP_RAIL_CHANNEL_CLIENT_INFORMATION MakeMessageId(RailChannel, ClientInformation) +#define FREERDP_RAIL_CHANNEL_CLIENT_SYSTEM_MENU MakeMessageId(RailChannel, ClientSystemMenu) +#define FREERDP_RAIL_CHANNEL_CLIENT_LANGUAGE_BAR_INFO \ + MakeMessageId(RailChannel, ClientLanguageBarInfo) +#define FREERDP_RAIL_CHANNEL_SERVER_LANGUAGE_BAR_INFO \ + MakeMessageId(RailChannel, ServerLanguageBarInfo) +#define FREERDP_RAIL_CHANNEL_SERVER_EXECUTE_RESULT MakeMessageId(RailChannel, ServerExecuteResult) +#define FREERDP_RAIL_CHANNEL_CLIENT_GET_APP_ID_REQUEST \ + MakeMessageId(RailChannel, ClientGetAppIdRequest) +#define FREERDP_RAIL_CHANNEL_SERVER_GET_APP_ID_RESPONSE \ + MakeMessageId(RailChannel, ServerGetAppIdResponse) +#define FREERDP_RAIL_CHANNEL_CLIENT_HANDSHAKE_EX MakeMessageId(RailChannel, ClientHandshakeEx) +#define FREERDP_RAIL_CHANNEL_SERVER_HANDSHAKE_EX MakeMessageId(RailChannel, ServerHandshakeEx) + +/** + * MultiTouch Input Channel Extension (MS-RDPEDI) + */ + +#define RdpeiChannel_Class (Channel_Base + 5) + +#define RdpeiChannel_ServerReady 1 +#define RdpeiChannel_ClientReady 2 +#define RdpeiChannel_TouchEvent 3 +#define RdpeiChannel_SuspendTouch 4 +#define RdpeiChannel_ResumeTouch 5 +#define RdpeiChannel_DismissHoveringContact 6 + +#define FREERDP_RDPEI_CHANNEL_SERVER_READY MakeMessageId(RdpeiChannel, ServerReady) +#define FREERDP_RDPEI_CHANNEL_CLIENT_READY MakeMessageId(RdpeiChannel, ClientReady) +#define FREERDP_RDPEI_CHANNEL_TOUCH_EVENT MakeMessageId(RdpeiChannel, TouchEvent) +#define FREERDP_RDPEI_CHANNEL_SUSPEND_TOUCH MakeMessageId(RdpeiChannel, SuspendTouch) +#define FREERDP_RDPEI_CHANNEL_RESUME_TOUCH MakeMessageId(RdpeiChannel, ResumeTouch) +#define FREERDP_RDPEI_CHANNEL_DISMISS_HOVERING_CONTACT \ + MakeMessageId(RdpeiChannel, DismissHoveringContact) + +#endif /* FREERDP_MESSAGE_H */ diff --git a/include/freerdp/metrics.h b/include/freerdp/metrics.h new file mode 100644 index 0000000..6d00bfd --- /dev/null +++ b/include/freerdp/metrics.h @@ -0,0 +1,52 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Protocol Metrics + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_METRICS_H +#define FREERDP_METRICS_H + +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + struct rdp_metrics + { + rdpContext* context; + + UINT64 TotalCompressedBytes; + UINT64 TotalUncompressedBytes; + double TotalCompressionRatio; + }; + typedef struct rdp_metrics rdpMetrics; + + FREERDP_API double metrics_write_bytes(rdpMetrics* metrics, UINT32 UncompressedBytes, + UINT32 CompressedBytes); + + FREERDP_API void metrics_free(rdpMetrics* metrics); + + WINPR_ATTR_MALLOC(metrics_free, 1) + FREERDP_API rdpMetrics* metrics_new(rdpContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_METRICS_H */ diff --git a/include/freerdp/peer.h b/include/freerdp/peer.h new file mode 100644 index 0000000..db09228 --- /dev/null +++ b/include/freerdp/peer.h @@ -0,0 +1,218 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP Server Peer + * + * Copyright 2011 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_PEER_H +#define FREERDP_PEER_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> +#include <freerdp/input.h> +#include <freerdp/update.h> +#include <freerdp/autodetect.h> +#include <freerdp/redirection.h> + +#include <winpr/sspi.h> +#include <winpr/ntlm.h> +#include <winpr/winsock.h> +#include <winpr/secapi.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef BOOL (*psPeerContextNew)(freerdp_peer* peer, rdpContext* context); + typedef void (*psPeerContextFree)(freerdp_peer* peer, rdpContext* context); + + typedef BOOL (*psPeerInitialize)(freerdp_peer* peer); +#if defined(WITH_FREERDP_DEPRECATED) + WINPR_DEPRECATED_VAR("Use psPeerGetEventHandle instead", + typedef BOOL (*psPeerGetFileDescriptor)(freerdp_peer* peer, void** rfds, + int* rcount);) +#endif + typedef HANDLE (*psPeerGetEventHandle)(freerdp_peer* peer); + typedef DWORD (*psPeerGetEventHandles)(freerdp_peer* peer, HANDLE* events, DWORD count); + typedef HANDLE (*psPeerGetReceiveEventHandle)(freerdp_peer* peer); + typedef BOOL (*psPeerCheckFileDescriptor)(freerdp_peer* peer); + typedef BOOL (*psPeerIsWriteBlocked)(freerdp_peer* peer); + typedef int (*psPeerDrainOutputBuffer)(freerdp_peer* peer); + typedef BOOL (*psPeerHasMoreToRead)(freerdp_peer* peer); + typedef BOOL (*psPeerClose)(freerdp_peer* peer); + typedef void (*psPeerDisconnect)(freerdp_peer* peer); + typedef BOOL (*psPeerRemoteCredentials)(freerdp_peer* peer, KERB_TICKET_LOGON* logonCreds, + MSV1_0_SUPPLEMENTAL_CREDENTIAL* suppCreds); + typedef BOOL (*psPeerCapabilities)(freerdp_peer* peer); + typedef BOOL (*psPeerPostConnect)(freerdp_peer* peer); + typedef BOOL (*psPeerActivate)(freerdp_peer* peer); + typedef BOOL (*psPeerLogon)(freerdp_peer* peer, const SEC_WINNT_AUTH_IDENTITY* identity, + BOOL automatic); + typedef BOOL (*psPeerSendServerRedirection)(freerdp_peer* peer, + const rdpRedirection* redirection); + typedef BOOL (*psPeerAdjustMonitorsLayout)(freerdp_peer* peer); + typedef BOOL (*psPeerClientCapabilities)(freerdp_peer* peer); + + typedef BOOL (*psPeerSendChannelData)(freerdp_peer* peer, UINT16 channelId, const BYTE* data, + size_t size); + typedef BOOL (*psPeerSendChannelPacket)(freerdp_peer* client, UINT16 channelId, + size_t totalSize, UINT32 flags, const BYTE* data, + size_t chunkSize); + typedef BOOL (*psPeerReceiveChannelData)(freerdp_peer* peer, UINT16 channelId, const BYTE* data, + size_t size, UINT32 flags, size_t totalSize); + + typedef HANDLE (*psPeerVirtualChannelOpen)(freerdp_peer* peer, const char* name, UINT32 flags); + typedef BOOL (*psPeerVirtualChannelClose)(freerdp_peer* peer, HANDLE hChannel); + typedef int (*psPeerVirtualChannelRead)(freerdp_peer* peer, HANDLE hChannel, BYTE* buffer, + UINT32 length); + typedef int (*psPeerVirtualChannelWrite)(freerdp_peer* peer, HANDLE hChannel, + const BYTE* buffer, UINT32 length); + typedef void* (*psPeerVirtualChannelGetData)(freerdp_peer* peer, HANDLE hChannel); + typedef int (*psPeerVirtualChannelSetData)(freerdp_peer* peer, HANDLE hChannel, void* data); + typedef BOOL (*psPeerSetState)(freerdp_peer* peer, CONNECTION_STATE state); + typedef BOOL (*psPeerReachedState)(freerdp_peer* peer, CONNECTION_STATE state); + + /** @brief the result of the license callback */ + typedef enum + { + LICENSE_CB_INTERNAL_ERROR, /** an internal error happened in the callback */ + LICENSE_CB_ABORT, /** licensing process failed, abort the connection */ + LICENSE_CB_IN_PROGRESS, /** incoming packet has been treated, we're waiting for further + packets to complete the workflow */ + LICENSE_CB_COMPLETED /** the licensing workflow has completed, go to next step */ + } LicenseCallbackResult; + + typedef LicenseCallbackResult (*psPeerLicenseCallback)(freerdp_peer* peer, wStream* s); + + struct rdp_freerdp_peer + { + ALIGN64 rdpContext* context; + + ALIGN64 int sockfd; + ALIGN64 char hostname[50]; + +#if defined(WITH_FREERDP_DEPRECATED) + WINPR_DEPRECATED_VAR("Use rdpContext::update instead", ALIGN64 rdpUpdate* update;) + WINPR_DEPRECATED_VAR("Use rdpContext::settings instead", ALIGN64 rdpSettings* settings;) + WINPR_DEPRECATED_VAR("Use rdpContext::autodetect instead", + ALIGN64 rdpAutoDetect* autodetect;) +#else + UINT64 reservedX[3]; +#endif + + ALIGN64 void* ContextExtra; + ALIGN64 size_t ContextSize; + ALIGN64 psPeerContextNew ContextNew; + ALIGN64 psPeerContextFree ContextFree; + + ALIGN64 psPeerInitialize Initialize; +#if defined(WITH_FREERDP_DEPRECATED) + WINPR_DEPRECATED_VAR("Use freerdp_peer::GetEventHandle instead", + ALIGN64 psPeerGetFileDescriptor GetFileDescriptor;) +#else + UINT64 reserved; +#endif + ALIGN64 psPeerGetEventHandle GetEventHandle; + ALIGN64 psPeerGetReceiveEventHandle GetReceiveEventHandle; + ALIGN64 psPeerCheckFileDescriptor CheckFileDescriptor; + ALIGN64 psPeerClose Close; + ALIGN64 psPeerDisconnect Disconnect; + + ALIGN64 psPeerCapabilities Capabilities; + ALIGN64 psPeerPostConnect PostConnect; + ALIGN64 psPeerActivate Activate; + ALIGN64 psPeerLogon Logon; + + ALIGN64 psPeerSendServerRedirection SendServerRedirection; + + ALIGN64 psPeerSendChannelData SendChannelData; + ALIGN64 psPeerReceiveChannelData ReceiveChannelData; + + ALIGN64 psPeerVirtualChannelOpen VirtualChannelOpen; + ALIGN64 psPeerVirtualChannelClose VirtualChannelClose; + ALIGN64 psPeerVirtualChannelRead VirtualChannelRead; + ALIGN64 psPeerVirtualChannelWrite VirtualChannelWrite; + ALIGN64 psPeerVirtualChannelGetData VirtualChannelGetData; + ALIGN64 psPeerVirtualChannelSetData VirtualChannelSetData; + + ALIGN64 int pId; + ALIGN64 UINT32 ack_frame_id; + ALIGN64 BOOL local; + ALIGN64 BOOL connected; + ALIGN64 BOOL activated; + ALIGN64 BOOL authenticated; + ALIGN64 SEC_WINNT_AUTH_IDENTITY identity; + + ALIGN64 psPeerIsWriteBlocked IsWriteBlocked; + ALIGN64 psPeerDrainOutputBuffer DrainOutputBuffer; + ALIGN64 psPeerHasMoreToRead HasMoreToRead; + ALIGN64 psPeerGetEventHandles GetEventHandles; + ALIGN64 psPeerAdjustMonitorsLayout AdjustMonitorsLayout; + ALIGN64 psPeerClientCapabilities ClientCapabilities; +#if defined(WITH_FREERDP_DEPRECATED) + WINPR_DEPRECATED_VAR("Use freerdp_peer::SspiNtlmHashCallback instead", + ALIGN64 psPeerComputeNtlmHash ComputeNtlmHash;) +#else + UINT64 reserved2; +#endif + ALIGN64 psPeerLicenseCallback LicenseCallback; + + ALIGN64 psPeerSendChannelPacket SendChannelPacket; + + /** + * @brief SetState Function pointer allowing to manually set the state of the + * internal state machine. + * + * This is useful if certain parts of a RDP connection must be skipped (e.g. + * when replaying a RDP connection dump the authentication/negotiate parts + * must be skipped) + * + * \note Must be called after \b Initialize as that also modifies the state. + */ + ALIGN64 psPeerSetState SetState; + ALIGN64 psPeerReachedState ReachedState; + ALIGN64 psSspiNtlmHashCallback SspiNtlmHashCallback; + /** + * @brief RemoteCredentials Function pointer that will be called when remote + * credentials guard are used by the peer and we receive the logonCreds (kerberos) + * and supplementary creds (NTLM). + */ + ALIGN64 psPeerRemoteCredentials RemoteCredentials; + }; + + FREERDP_API void freerdp_peer_context_free(freerdp_peer* client); + + FREERDP_API BOOL freerdp_peer_context_new(freerdp_peer* client); + FREERDP_API BOOL freerdp_peer_context_new_ex(freerdp_peer* client, const rdpSettings* settings); + + FREERDP_API const char* freerdp_peer_os_major_type_string(freerdp_peer* client); + FREERDP_API const char* freerdp_peer_os_minor_type_string(freerdp_peer* client); + + FREERDP_API void freerdp_peer_free(freerdp_peer* client); + + WINPR_ATTR_MALLOC(freerdp_peer_free, 1) + FREERDP_API freerdp_peer* freerdp_peer_new(int sockfd); + + FREERDP_API BOOL freerdp_peer_set_local_and_hostname(freerdp_peer* client, + const struct sockaddr_storage* peer_addr); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_PEER_H */ diff --git a/include/freerdp/pointer.h b/include/freerdp/pointer.h new file mode 100644 index 0000000..351c021 --- /dev/null +++ b/include/freerdp/pointer.h @@ -0,0 +1,118 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Pointer Updates Interface API + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UPDATE_POINTER_H +#define FREERDP_UPDATE_POINTER_H + +#include <freerdp/types.h> + +#define PTR_MSG_TYPE_SYSTEM 0x0001 +#define PTR_MSG_TYPE_POSITION 0x0003 +#define PTR_MSG_TYPE_COLOR 0x0006 +#define PTR_MSG_TYPE_CACHED 0x0007 +#define PTR_MSG_TYPE_POINTER 0x0008 +#define PTR_MSG_TYPE_POINTER_LARGE 0x0009 + +#define SYSPTR_NULL 0x00000000 +#define SYSPTR_DEFAULT 0x00007F00 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT32 xPos; + UINT32 yPos; + } POINTER_POSITION_UPDATE; + + typedef struct + { + UINT32 type; + } POINTER_SYSTEM_UPDATE; + + typedef struct + { + UINT16 cacheIndex; + UINT16 hotSpotX; + UINT16 hotSpotY; + UINT16 width; + UINT16 height; + UINT16 lengthAndMask; + UINT16 lengthXorMask; + BYTE* xorMaskData; + BYTE* andMaskData; + } POINTER_COLOR_UPDATE; + + typedef struct + { + UINT16 xorBpp; + UINT16 cacheIndex; + UINT16 hotSpotX; + UINT16 hotSpotY; + UINT16 width; + UINT16 height; + UINT32 lengthAndMask; + UINT32 lengthXorMask; + BYTE* xorMaskData; + BYTE* andMaskData; + } POINTER_LARGE_UPDATE; + + typedef struct + { + UINT32 xorBpp; + POINTER_COLOR_UPDATE colorPtrAttr; + } POINTER_NEW_UPDATE; + + typedef struct + { + UINT32 cacheIndex; + } POINTER_CACHED_UPDATE; + + typedef BOOL (*pPointerPosition)(rdpContext* context, + const POINTER_POSITION_UPDATE* pointer_position); + typedef BOOL (*pPointerSystem)(rdpContext* context, + const POINTER_SYSTEM_UPDATE* pointer_system); + typedef BOOL (*pPointerColor)(rdpContext* context, const POINTER_COLOR_UPDATE* pointer_color); + typedef BOOL (*pPointerNew)(rdpContext* context, const POINTER_NEW_UPDATE* pointer_new); + typedef BOOL (*pPointerCached)(rdpContext* context, + const POINTER_CACHED_UPDATE* pointer_cached); + typedef BOOL (*pPointerLarge)(rdpContext* context, const POINTER_LARGE_UPDATE* pointer_large); + + struct rdp_pointer_update + { + rdpContext* context; /* 0 */ + UINT32 paddingA[16 - 1]; /* 1 */ + + pPointerPosition PointerPosition; /* 16 */ + pPointerSystem PointerSystem; /* 17 */ + pPointerColor PointerColor; /* 18 */ + pPointerNew PointerNew; /* 19 */ + pPointerCached PointerCached; /* 20 */ + pPointerLarge PointerLarge; /* 21 */ + UINT32 paddingB[32 - 22]; /* 22 */ + }; + typedef struct rdp_pointer_update rdpPointerUpdate; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UPDATE_POINTER_H */ diff --git a/include/freerdp/primary.h b/include/freerdp/primary.h new file mode 100644 index 0000000..77f3b39 --- /dev/null +++ b/include/freerdp/primary.h @@ -0,0 +1,481 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Primary Drawing Orders Interface API + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UPDATE_PRIMARY_H +#define FREERDP_UPDATE_PRIMARY_H + +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT32 cacheIndex; + INT16 x; + INT16 y; + UINT32 cx; + UINT32 cy; + UINT32 cb; + BYTE* aj; + } GLYPH_DATA; + + typedef struct + { + UINT32 cacheIndex; + INT32 x; + INT32 y; + UINT32 cx; + UINT32 cy; + UINT32 cb; + BYTE* aj; + } GLYPH_DATA_V2; + +#define BACKMODE_TRANSPARENT 0x0001 +#define BACKMODE_OPAQUE 0x0002 + +struct rdp_bounds +{ + INT32 left; + INT32 top; + INT32 right; + INT32 bottom; +}; +typedef struct rdp_bounds rdpBounds; + +struct rdp_brush +{ + UINT32 x; + UINT32 y; + UINT32 bpp; + UINT32 style; + UINT32 hatch; + UINT32 index; + BYTE* data; + BYTE p8x8[8]; +}; +typedef struct rdp_brush rdpBrush; + +typedef struct +{ + UINT32 controlFlags; + UINT32 orderType; + UINT32 fieldFlags; + UINT32 boundsFlags; + rdpBounds bounds; + BOOL deltaCoordinates; +} ORDER_INFO; + +typedef struct +{ + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 bRop; +} DSTBLT_ORDER; + +typedef struct +{ + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 bRop; + UINT32 backColor; + UINT32 foreColor; + rdpBrush brush; +} PATBLT_ORDER; + +typedef struct +{ + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 bRop; + INT32 nXSrc; + INT32 nYSrc; +} SCRBLT_ORDER; + +typedef struct +{ + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 color; +} OPAQUE_RECT_ORDER; + +typedef struct +{ + INT32 srcLeft; + INT32 srcTop; + INT32 srcRight; + INT32 srcBottom; + UINT32 bitmapId; +} DRAW_NINE_GRID_ORDER; + +typedef struct +{ + INT32 left; + INT32 top; + INT32 width; + INT32 height; +} DELTA_RECT; + +typedef struct +{ + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 bRop; + UINT32 numRectangles; + UINT32 cbData; + DELTA_RECT rectangles[45]; +} MULTI_DSTBLT_ORDER; + +typedef struct +{ + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 bRop; + UINT32 backColor; + UINT32 foreColor; + rdpBrush brush; + UINT32 numRectangles; + UINT32 cbData; + DELTA_RECT rectangles[45]; +} MULTI_PATBLT_ORDER; + +typedef struct +{ + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 bRop; + INT32 nXSrc; + INT32 nYSrc; + UINT32 numRectangles; + UINT32 cbData; + DELTA_RECT rectangles[45]; +} MULTI_SCRBLT_ORDER; + +typedef struct +{ + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 color; + UINT32 numRectangles; + UINT32 cbData; + DELTA_RECT rectangles[45]; +} MULTI_OPAQUE_RECT_ORDER; + +typedef struct +{ + INT32 srcLeft; + INT32 srcTop; + INT32 srcRight; + INT32 srcBottom; + UINT32 bitmapId; + UINT32 nDeltaEntries; + UINT32 cbData; + DELTA_RECT rectangles[45]; +} MULTI_DRAW_NINE_GRID_ORDER; + +typedef struct +{ + UINT32 backMode; + INT32 nXStart; + INT32 nYStart; + INT32 nXEnd; + INT32 nYEnd; + UINT32 backColor; + UINT32 bRop2; + UINT32 penStyle; + UINT32 penWidth; + UINT32 penColor; +} LINE_TO_ORDER; + +typedef struct +{ + INT32 x; + INT32 y; +} DELTA_POINT; + +typedef struct +{ + INT32 xStart; + INT32 yStart; + UINT32 bRop2; + UINT32 penColor; + UINT32 numDeltaEntries; + UINT32 cbData; + DELTA_POINT* points; +} POLYLINE_ORDER; + +typedef struct +{ + UINT32 cacheId; + UINT32 colorIndex; + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 bRop; + INT32 nXSrc; + INT32 nYSrc; + UINT32 cacheIndex; + rdpBitmap* bitmap; +} MEMBLT_ORDER; + +typedef struct +{ + UINT32 cacheId; + UINT32 colorIndex; + INT32 nLeftRect; + INT32 nTopRect; + INT32 nWidth; + INT32 nHeight; + UINT32 bRop; + INT32 nXSrc; + INT32 nYSrc; + UINT32 backColor; + UINT32 foreColor; + rdpBrush brush; + UINT32 cacheIndex; + rdpBitmap* bitmap; +} MEM3BLT_ORDER; + +typedef struct +{ + UINT32 savedBitmapPosition; + INT32 nLeftRect; + INT32 nTopRect; + INT32 nRightRect; + INT32 nBottomRect; + UINT32 operation; +} SAVE_BITMAP_ORDER; + +typedef struct +{ + UINT32 index; + UINT32 delta; +} GLYPH_FRAGMENT_INDEX; + +typedef struct +{ + UINT32 operation; + UINT32 index; + UINT32 size; + UINT32 nindices; + GLYPH_FRAGMENT_INDEX* indices; +} GLYPH_FRAGMENT; + +typedef struct +{ + UINT32 cacheId; + UINT32 flAccel; + UINT32 ulCharInc; + UINT32 fOpRedundant; + UINT32 backColor; + UINT32 foreColor; + INT32 bkLeft; + INT32 bkTop; + INT32 bkRight; + INT32 bkBottom; + INT32 opLeft; + INT32 opTop; + INT32 opRight; + INT32 opBottom; + rdpBrush brush; + INT32 x; + INT32 y; + UINT32 cbData; + BYTE data[256]; +} GLYPH_INDEX_ORDER; + +typedef struct +{ + UINT32 cacheId; + UINT32 flAccel; + UINT32 ulCharInc; + UINT32 backColor; + UINT32 foreColor; + INT32 bkLeft; + INT32 bkTop; + INT32 bkRight; + INT32 bkBottom; + INT32 opLeft; + INT32 opTop; + INT32 opRight; + INT32 opBottom; + BOOL opaqueRect; + INT32 x; + INT32 y; + UINT32 cbData; + BYTE data[256]; +} FAST_INDEX_ORDER; + +typedef struct +{ + UINT32 cacheId; + UINT32 flAccel; + UINT32 ulCharInc; + UINT32 backColor; + UINT32 foreColor; + INT32 bkLeft; + INT32 bkTop; + INT32 bkRight; + INT32 bkBottom; + INT32 opLeft; + INT32 opTop; + INT32 opRight; + INT32 opBottom; + INT32 x; + INT32 y; + UINT32 cbData; + BYTE data[256]; + GLYPH_DATA_V2 glyphData; +} FAST_GLYPH_ORDER; + +typedef struct +{ + INT32 xStart; + INT32 yStart; + UINT32 bRop2; + UINT32 fillMode; + UINT32 brushColor; + UINT32 numPoints; + UINT32 cbData; + DELTA_POINT* points; +} POLYGON_SC_ORDER; + +typedef struct +{ + INT32 xStart; + INT32 yStart; + UINT32 bRop2; + UINT32 backMode; + UINT32 fillMode; + UINT32 backColor; + UINT32 foreColor; + rdpBrush brush; + UINT32 numPoints; + UINT32 cbData; + DELTA_POINT* points; +} POLYGON_CB_ORDER; + +typedef struct +{ + INT32 leftRect; + INT32 topRect; + INT32 rightRect; + INT32 bottomRect; + UINT32 bRop2; + UINT32 fillMode; + UINT32 color; +} ELLIPSE_SC_ORDER; + +typedef struct +{ + INT32 leftRect; + INT32 topRect; + INT32 rightRect; + INT32 bottomRect; + UINT32 bRop2; + UINT32 fillMode; + UINT32 backColor; + UINT32 foreColor; + rdpBrush brush; +} ELLIPSE_CB_ORDER; + +typedef BOOL (*pDstBlt)(rdpContext* context, const DSTBLT_ORDER* dstblt); +typedef BOOL (*pPatBlt)(rdpContext* context, PATBLT_ORDER* patblt); +typedef BOOL (*pScrBlt)(rdpContext* context, const SCRBLT_ORDER* scrblt); +typedef BOOL (*pOpaqueRect)(rdpContext* context, const OPAQUE_RECT_ORDER* opaque_rect); +typedef BOOL (*pDrawNineGrid)(rdpContext* context, const DRAW_NINE_GRID_ORDER* draw_nine_grid); +typedef BOOL (*pMultiDstBlt)(rdpContext* context, const MULTI_DSTBLT_ORDER* multi_dstblt); +typedef BOOL (*pMultiPatBlt)(rdpContext* context, const MULTI_PATBLT_ORDER* multi_patblt); +typedef BOOL (*pMultiScrBlt)(rdpContext* context, const MULTI_SCRBLT_ORDER* multi_scrblt); +typedef BOOL (*pMultiOpaqueRect)(rdpContext* context, + const MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect); +typedef BOOL (*pMultiDrawNineGrid)(rdpContext* context, + const MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid); +typedef BOOL (*pLineTo)(rdpContext* context, const LINE_TO_ORDER* line_to); +typedef BOOL (*pPolyline)(rdpContext* context, const POLYLINE_ORDER* polyline); +typedef BOOL (*pMemBlt)(rdpContext* context, MEMBLT_ORDER* memblt); +typedef BOOL (*pMem3Blt)(rdpContext* context, MEM3BLT_ORDER* memblt); +typedef BOOL (*pSaveBitmap)(rdpContext* context, const SAVE_BITMAP_ORDER* save_bitmap); +typedef BOOL (*pGlyphIndex)(rdpContext* context, GLYPH_INDEX_ORDER* glyph_index); +typedef BOOL (*pFastIndex)(rdpContext* context, const FAST_INDEX_ORDER* fast_index); +typedef BOOL (*pFastGlyph)(rdpContext* context, const FAST_GLYPH_ORDER* fast_glyph); +typedef BOOL (*pPolygonSC)(rdpContext* context, const POLYGON_SC_ORDER* polygon_sc); +typedef BOOL (*pPolygonCB)(rdpContext* context, POLYGON_CB_ORDER* polygon_cb); +typedef BOOL (*pEllipseSC)(rdpContext* context, const ELLIPSE_SC_ORDER* ellipse_sc); +typedef BOOL (*pEllipseCB)(rdpContext* context, const ELLIPSE_CB_ORDER* ellipse_cb); +typedef BOOL (*pOrderInfo)(rdpContext* context, const ORDER_INFO* order_info, + const char* order_name); + +struct rdp_primary_update +{ + rdpContext* context; /* 0 */ + UINT32 paddingA[16 - 1]; /* 1 */ + + pDstBlt DstBlt; /* 16 */ + pPatBlt PatBlt; /* 17 */ + pScrBlt ScrBlt; /* 18 */ + pOpaqueRect OpaqueRect; /* 19 */ + pDrawNineGrid DrawNineGrid; /* 20 */ + pMultiDstBlt MultiDstBlt; /* 21 */ + pMultiPatBlt MultiPatBlt; /* 22 */ + pMultiScrBlt MultiScrBlt; /* 23 */ + pMultiOpaqueRect MultiOpaqueRect; /* 24 */ + pMultiDrawNineGrid MultiDrawNineGrid; /* 25 */ + pLineTo LineTo; /* 26 */ + pPolyline Polyline; /* 27 */ + pMemBlt MemBlt; /* 28 */ + pMem3Blt Mem3Blt; /* 29 */ + pSaveBitmap SaveBitmap; /* 30 */ + pGlyphIndex GlyphIndex; /* 31 */ + pFastIndex FastIndex; /* 32 */ + pFastGlyph FastGlyph; /* 33 */ + pPolygonSC PolygonSC; /* 34 */ + pPolygonCB PolygonCB; /* 35 */ + pEllipseSC EllipseSC; /* 36 */ + pEllipseCB EllipseCB; /* 37 */ + /* Statistics callback */ + pOrderInfo OrderInfo; /* 38 */ + UINT32 paddingB[48 - 39]; /* 39 */ +}; +typedef struct rdp_primary_update rdpPrimaryUpdate; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UPDATE_PRIMARY_H */ diff --git a/include/freerdp/primitives.h b/include/freerdp/primitives.h new file mode 100644 index 0000000..20b74d6 --- /dev/null +++ b/include/freerdp/primitives.h @@ -0,0 +1,240 @@ +/* primitives.h + * vi:ts=4 sw=4 + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. Algorithms used by + * this code may be covered by patents by HP, Microsoft, or other parties. + */ + +#ifdef __GNUC__ +#pragma once +#endif + +#ifndef FREERDP_PRIMITIVES_H +#define FREERDP_PRIMITIVES_H + +#include <winpr/wtypes.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/codec/color.h> + +#include <winpr/platform.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef INT32 pstatus_t; /* match IppStatus. */ +#define PRIMITIVES_SUCCESS (0) /* match ippStsNoErr */ + +/* Simple macro for address of an x,y location in 2d 4-byte memory block */ +#define PIXMAP4_ADDR(_dst_, _x_, _y_, _span_) \ + ((void*)(((BYTE*)(_dst_)) + (((_x_) + (_y_) * (_span_)) << 2))) + +#define PRIM_X86_MMX_AVAILABLE (1U << 0) +#define PRIM_X86_3DNOW_AVAILABLE (1U << 1) +#define PRIM_X86_3DNOW_PREFETCH_AVAILABLE (1U << 2) +#define PRIM_X86_SSE_AVAILABLE (1U << 3) +#define PRIM_X86_SSE2_AVAILABLE (1U << 4) +#define PRIM_X86_SSE3_AVAILABLE (1U << 5) +#define PRIM_X86_SSSE3_AVAILABLE (1U << 6) +#define PRIM_X86_SSE41_AVAILABLE (1U << 7) +#define PRIM_X86_SSE42_AVAILABLE (1U << 8) +#define PRIM_X86_AVX_AVAILABLE (1U << 9) +#define PRIM_X86_FMA_AVAILABLE (1U << 10) +#define PRIM_X86_AVX_AES_AVAILABLE (1U << 11) +#define PRIM_X86_AVX2_AVAILABLE (1U << 12) + +#define PRIM_ARM_VFP1_AVAILABLE (1U << 0) +#define PRIM_ARM_VFP2_AVAILABLE (1U << 1) +#define PRIM_ARM_VFP3_AVAILABLE (1U << 2) +#define PRIM_ARM_VFP4_AVAILABLE (1U << 3) +#define PRIM_ARM_FPA_AVAILABLE (1U << 4) +#define PRIM_ARM_FPE_AVAILABLE (1U << 5) +#define PRIM_ARM_IWMMXT_AVAILABLE (1U << 6) +#define PRIM_ARM_NEON_AVAILABLE (1U << 7) + +/** @brief flags of primitives */ +enum +{ + PRIM_FLAGS_HAVE_EXTCPU = (1U << 0), /* primitives are using CPU extensions */ + PRIM_FLAGS_HAVE_EXTGPU = (1U << 1), /* primitives are using the GPU */ +}; + +/* Structures compatible with IPP */ +typedef struct +{ + UINT32 width; + UINT32 height; +} prim_size_t; /* like IppiSize */ + +typedef enum +{ + AVC444_LUMA, + AVC444_CHROMAv1, + AVC444_CHROMAv2 +} avc444_frame_type; + +/* Function prototypes for all of the supported primitives. */ +typedef pstatus_t (*__copy_t)(const void* WINPR_RESTRICT pSrc, void* WINPR_RESTRICT pDst, + INT32 bytes); +typedef pstatus_t (*__copy_8u_t)(const BYTE* WINPR_RESTRICT pSrc, BYTE* WINPR_RESTRICT pDst, + INT32 len); +typedef pstatus_t (*__copy_8u_AC4r_t)(const BYTE* WINPR_RESTRICT pSrc, INT32 srcStep, /* bytes */ + BYTE* WINPR_RESTRICT pDst, INT32 dstStep, /* bytes */ + INT32 width, INT32 height); /* pixels */ +typedef pstatus_t (*__set_8u_t)(BYTE val, BYTE* WINPR_RESTRICT pDst, UINT32 len); +typedef pstatus_t (*__set_32s_t)(INT32 val, INT32* WINPR_RESTRICT pDst, UINT32 len); +typedef pstatus_t (*__set_32u_t)(UINT32 val, UINT32* WINPR_RESTRICT pDst, UINT32 len); +typedef pstatus_t (*__zero_t)(void* WINPR_RESTRICT pDst, size_t bytes); +typedef pstatus_t (*__alphaComp_argb_t)(const BYTE* WINPR_RESTRICT pSrc1, UINT32 src1Step, + const BYTE* WINPR_RESTRICT pSrc2, UINT32 src2Step, + BYTE* WINPR_RESTRICT pDst, UINT32 dstStep, UINT32 width, + UINT32 height); +typedef pstatus_t (*__add_16s_t)(const INT16* WINPR_RESTRICT pSrc1, + const INT16* WINPR_RESTRICT pSrc2, INT16* WINPR_RESTRICT pDst, + UINT32 len); +typedef pstatus_t (*__lShiftC_16s_t)(const INT16* pSrc, UINT32 val, INT16* pSrcDst, UINT32 len); +typedef pstatus_t (*__lShiftC_16u_t)(const UINT16* pSrc, UINT32 val, UINT16* pSrcDst, UINT32 len); +typedef pstatus_t (*__rShiftC_16s_t)(const INT16* pSrc, UINT32 val, INT16* pSrcDst, UINT32 len); +typedef pstatus_t (*__rShiftC_16u_t)(const UINT16* pSrc, UINT32 val, UINT16* pSrcDst, UINT32 len); +typedef pstatus_t (*__shiftC_16s_t)(const INT16* pSrc, INT32 val, INT16* pSrcDst, UINT32 len); +typedef pstatus_t (*__shiftC_16u_t)(const UINT16* pSrc, INT32 val, UINT16* pSrcDst, UINT32 len); +typedef pstatus_t (*__sign_16s_t)(const INT16* WINPR_RESTRICT pSrc, INT16* WINPR_RESTRICT pDst, + UINT32 len); +typedef pstatus_t (*__yCbCrToRGB_16s8u_P3AC4R_t)(const INT16* const WINPR_RESTRICT pSrc[3], + UINT32 srcStep, BYTE* WINPR_RESTRICT pDst, + UINT32 dstStep, UINT32 DstFormat, + const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__yCbCrToRGB_16s16s_P3P3_t)(const INT16* const WINPR_RESTRICT pSrc[3], + INT32 srcStep, INT16* WINPR_RESTRICT pDst[3], + INT32 dstStep, + const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__RGBToYCbCr_16s16s_P3P3_t)(const INT16* const WINPR_RESTRICT pSrc[3], + INT32 srcStep, INT16* WINPR_RESTRICT pDst[3], + INT32 dstStep, + const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__RGBToRGB_16s8u_P3AC4R_t)(const INT16* const WINPR_RESTRICT pSrc[3], + UINT32 srcStep, BYTE* WINPR_RESTRICT pDst, + UINT32 dstStep, UINT32 DstFormat, + const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__YCoCgToRGB_8u_AC4R_t)(const BYTE* WINPR_RESTRICT pSrc, INT32 srcStep, + BYTE* WINPR_RESTRICT pDst, UINT32 DstFormat, + INT32 dstStep, UINT32 width, UINT32 height, UINT8 shift, + BOOL withAlpha); +typedef pstatus_t (*__RGB565ToARGB_16u32u_C3C4_t)(const UINT16* WINPR_RESTRICT pSrc, INT32 srcStep, + UINT32* WINPR_RESTRICT pDst, INT32 dstStep, + UINT32 width, UINT32 height, UINT32 format); +typedef pstatus_t (*__YUV420ToRGB_8u_P3AC4R_t)(const BYTE* const WINPR_RESTRICT pSrc[3], + const UINT32 srcStep[3], BYTE* WINPR_RESTRICT pDst, + UINT32 dstStep, UINT32 DstFormat, + const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__YUV444ToRGB_8u_P3AC4R_t)(const BYTE* const WINPR_RESTRICT pSrc[3], + const UINT32 srcStep[3], BYTE* WINPR_RESTRICT pDst, + UINT32 dstStep, UINT32 DstFormat, + const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__RGBToYUV420_8u_P3AC4R_t)(const BYTE* WINPR_RESTRICT pSrc, UINT32 SrcFormat, + UINT32 srcStep, BYTE* WINPR_RESTRICT pDst[3], + const UINT32 dstStep[3], + const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__RGBToYUV444_8u_P3AC4R_t)(const BYTE* WINPR_RESTRICT pSrc, UINT32 SrcFormat, + UINT32 srcStep, BYTE* WINPR_RESTRICT pDst[3], + UINT32 dstStep[3], + const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__YUV420CombineToYUV444_t)(avc444_frame_type type, + const BYTE* const WINPR_RESTRICT pSrc[3], + const UINT32 srcStep[3], UINT32 nWidth, + UINT32 nHeight, BYTE* WINPR_RESTRICT pDst[3], + const UINT32 dstStep[3], + const RECTANGLE_16* WINPR_RESTRICT roi); +typedef pstatus_t (*__YUV444SplitToYUV420_t)( + const BYTE* const WINPR_RESTRICT pSrc[3], const UINT32 srcStep[3], + BYTE* WINPR_RESTRICT pMainDst[3], const UINT32 dstMainStep[3], BYTE* WINPR_RESTRICT pAuxDst[3], + const UINT32 srcAuxStep[3], const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__RGBToAVC444YUV_t)(const BYTE* WINPR_RESTRICT pSrc, UINT32 srcFormat, + UINT32 srcStep, BYTE* WINPR_RESTRICT pMainDst[3], + const UINT32 dstMainStep[3], + BYTE* WINPR_RESTRICT pAuxDst[3], const UINT32 dstAuxStep[3], + const prim_size_t* WINPR_RESTRICT roi); +typedef pstatus_t (*__andC_32u_t)(const UINT32* WINPR_RESTRICT pSrc, UINT32 val, + UINT32* WINPR_RESTRICT pDst, INT32 len); +typedef pstatus_t (*__orC_32u_t)(const UINT32* WINPR_RESTRICT pSrc, UINT32 val, + UINT32* WINPR_RESTRICT pDst, INT32 len); +typedef pstatus_t (*primitives_uninit_t)(void); + +typedef struct +{ + /* Memory-to-memory copy routines */ + __copy_t copy; /* memcpy/memmove, basically */ + __copy_8u_t copy_8u; /* more strongly typed */ + __copy_8u_AC4r_t copy_8u_AC4r; /* pixel copy function */ + /* Memory setting routines */ + __set_8u_t set_8u; /* memset, basically */ + __set_32s_t set_32s; + __set_32u_t set_32u; + __zero_t zero; /* bzero or faster */ + /* Arithmetic functions */ + __add_16s_t add_16s; + /* And/or */ + __andC_32u_t andC_32u; + __orC_32u_t orC_32u; + /* Shifts */ + __lShiftC_16s_t lShiftC_16s; + __lShiftC_16u_t lShiftC_16u; + __rShiftC_16s_t rShiftC_16s; + __rShiftC_16u_t rShiftC_16u; + __shiftC_16s_t shiftC_16s; + __shiftC_16u_t shiftC_16u; + /* Alpha Composition */ + __alphaComp_argb_t alphaComp_argb; + /* Sign */ + __sign_16s_t sign_16s; + /* Color conversions */ + __yCbCrToRGB_16s8u_P3AC4R_t yCbCrToRGB_16s8u_P3AC4R; + __yCbCrToRGB_16s16s_P3P3_t yCbCrToRGB_16s16s_P3P3; + __RGBToYCbCr_16s16s_P3P3_t RGBToYCbCr_16s16s_P3P3; + __RGBToRGB_16s8u_P3AC4R_t RGBToRGB_16s8u_P3AC4R; + __YCoCgToRGB_8u_AC4R_t YCoCgToRGB_8u_AC4R; + __YUV420ToRGB_8u_P3AC4R_t YUV420ToRGB_8u_P3AC4R; + __RGBToYUV420_8u_P3AC4R_t RGBToYUV420_8u_P3AC4R; + __RGBToYUV444_8u_P3AC4R_t RGBToYUV444_8u_P3AC4R; + __YUV420CombineToYUV444_t YUV420CombineToYUV444; + __YUV444SplitToYUV420_t YUV444SplitToYUV420; + __YUV444ToRGB_8u_P3AC4R_t YUV444ToRGB_8u_P3AC4R; + __RGBToAVC444YUV_t RGBToAVC444YUV; + __RGBToAVC444YUV_t RGBToAVC444YUVv2; + /* flags */ + DWORD flags; + primitives_uninit_t uninit; +} primitives_t; + +typedef enum +{ + PRIMITIVES_PURE_SOFT, /** use generic software implementation */ + PRIMITIVES_ONLY_CPU, /** use generic software or cpu optimized routines */ + PRIMITIVES_ONLY_GPU, /** use opencl optimized routines */ + PRIMITIVES_AUTODETECT /** detect the best routines */ +} primitive_hints; + + FREERDP_API primitives_t* primitives_get(void); + FREERDP_API void primitives_set_hints(primitive_hints hints); + FREERDP_API primitive_hints primitives_get_hints(void); + FREERDP_API primitives_t* primitives_get_generic(void); + FREERDP_API DWORD primitives_flags(primitives_t* p); + FREERDP_API BOOL primitives_init(primitives_t* p, primitive_hints hints); + FREERDP_API void primitives_uninit(void); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_PRIMITIVES_H */ diff --git a/include/freerdp/rail.h b/include/freerdp/rail.h new file mode 100644 index 0000000..66ad34b --- /dev/null +++ b/include/freerdp/rail.h @@ -0,0 +1,590 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Applications Integrated Locally (RAIL) + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_RAIL_GLOBAL_H +#define FREERDP_RAIL_GLOBAL_H + +#include <winpr/windows.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define RAIL_SVC_CHANNEL_NAME "rail" + +/* DEPRECATED: RAIL PDU flags use the spec conformant naming with TS_ prefix */ +#if defined(WITH_FREERDP_DEPRECATED) +#define RAIL_EXEC_FLAG_EXPAND_WORKINGDIRECTORY 0x0001 +#define RAIL_EXEC_FLAG_TRANSLATE_FILES 0x0002 +#define RAIL_EXEC_FLAG_FILE 0x0004 +#define RAIL_EXEC_FLAG_EXPAND_ARGUMENTS 0x0008 +#endif + +/* RAIL PDU flags */ +#define TS_RAIL_EXEC_FLAG_EXPAND_WORKINGDIRECTORY 0x0001 +#define TS_RAIL_EXEC_FLAG_TRANSLATE_FILES 0x0002 +#define TS_RAIL_EXEC_FLAG_FILE 0x0004 +#define TS_RAIL_EXEC_FLAG_EXPAND_ARGUMENTS 0x0008 +#define TS_RAIL_EXEC_FLAG_APP_USER_MODEL_ID 0x0010 + +/* Notification Icon Balloon Tooltip */ +#define NIIF_NONE 0x00000000 +#define NIIF_INFO 0x00000001 +#define NIIF_WARNING 0x00000002 +#define NIIF_ERROR 0x00000003 +#define NIIF_NOSOUND 0x00000010 +#define NIIF_LARGE_ICON 0x00000020 + +/* Client Execute PDU Flags */ +#define RAIL_EXEC_FLAG_EXPAND_WORKING_DIRECTORY 0x0001 +#define RAIL_EXEC_FLAG_TRANSLATE_FILES 0x0002 +#define RAIL_EXEC_FLAG_FILE 0x0004 +#define RAIL_EXEC_FLAG_EXPAND_ARGUMENTS 0x0008 +#define RAIL_EXEC_FLAG_APP_USER_MODEL_ID 0x0010 + +/* Server Execute Result PDU */ +#define RAIL_EXEC_S_OK 0x0000 +#define RAIL_EXEC_E_HOOK_NOT_LOADED 0x0001 +#define RAIL_EXEC_E_DECODE_FAILED 0x0002 +#define RAIL_EXEC_E_NOT_IN_ALLOWLIST 0x0003 +#define RAIL_EXEC_E_FILE_NOT_FOUND 0x0005 +#define RAIL_EXEC_E_FAIL 0x0006 +#define RAIL_EXEC_E_SESSION_LOCKED 0x0007 + +/* DEPRECATED: Server System Parameters Update PDU + * use the spec conformant naming scheme from winpr/windows.h + */ +#define SPI_SET_SCREEN_SAVE_ACTIVE 0x00000011 +#define SPI_SET_SCREEN_SAVE_SECURE 0x00000077 + +/*Bit mask values for SPI_ parameters*/ +enum SPI_MASK +{ + SPI_MASK_SET_DRAG_FULL_WINDOWS = 0x00000001, + SPI_MASK_SET_KEYBOARD_CUES = 0x00000002, + SPI_MASK_SET_KEYBOARD_PREF = 0x00000004, + SPI_MASK_SET_MOUSE_BUTTON_SWAP = 0x00000008, + SPI_MASK_SET_WORK_AREA = 0x00000010, + SPI_MASK_DISPLAY_CHANGE = 0x00000020, + SPI_MASK_TASKBAR_POS = 0x00000040, + SPI_MASK_SET_HIGH_CONTRAST = 0x00000080, + SPI_MASK_SET_SCREEN_SAVE_ACTIVE = 0x00000100, + SPI_MASK_SET_SET_SCREEN_SAVE_SECURE = 0x00000200, + SPI_MASK_SET_CARET_WIDTH = 0x00000400, + SPI_MASK_SET_STICKY_KEYS = 0x00000800, + SPI_MASK_SET_TOGGLE_KEYS = 0x00001000, + SPI_MASK_SET_FILTER_KEYS = 0x00002000 +}; + +/* Client System Parameters Update PDU + * some are defined in winuser.h (winpr/windows.h wrapper) + */ +#define SPI_SET_DRAG_FULL_WINDOWS 0x00000025 +#define SPI_SET_KEYBOARD_CUES 0x0000100B +#define SPI_SET_KEYBOARD_PREF 0x00000045 +#define SPI_SET_MOUSE_BUTTON_SWAP 0x00000021 +#define SPI_SET_WORK_AREA 0x0000002F +#define SPI_DISPLAY_CHANGE 0x0000F001 +#define SPI_TASKBAR_POS 0x0000F000 +#define SPI_SET_HIGH_CONTRAST 0x00000043 + +/* Client System Command PDU */ +#define SC_SIZE 0xF000 +#define SC_MOVE 0xF010 +#define SC_MINIMIZE 0xF020 +#define SC_MAXIMIZE 0xF030 +#define SC_CLOSE 0xF060 +#define SC_KEYMENU 0xF100 +#define SC_RESTORE 0xF120 +#define SC_DEFAULT 0xF160 + +/* Client Notify Event PDU */ +#ifndef _WIN32 +#define WM_LBUTTONDOWN 0x00000201 +#define WM_LBUTTONUP 0x00000202 +#define WM_RBUTTONDOWN 0x00000204 +#define WM_RBUTTONUP 0x00000205 +#define WM_CONTEXTMENU 0x0000007b +#define WM_LBUTTONDBLCLK 0x00000203 +#define WM_RBUTTONDBLCLK 0x00000206 + +#define NIN_SELECT 0x00000400 +#define NIN_KEYSELECT 0x00000401 +#define NIN_BALLOONSHOW 0x00000402 +#define NIN_BALLOONHIDE 0x00000403 +#define NIN_BALLOONTIMEOUT 0x00000404 +#define NIN_BALLOONUSERCLICK 0x00000405 +#else +#include <shellapi.h> +#endif + +/* DEPRECATED: Client Information PDU + * use the spec conformant naming scheme TS_ below + */ +#define RAIL_CLIENTSTATUS_ALLOWLOCALMOVESIZE 0x00000001 +#define RAIL_CLIENTSTATUS_AUTORECONNECT 0x00000002 + +/* Client Information PDU */ +typedef enum +{ + TS_RAIL_CLIENTSTATUS_ALLOWLOCALMOVESIZE = 0x00000001, + TS_RAIL_CLIENTSTATUS_AUTORECONNECT = 0x00000002, + TS_RAIL_CLIENTSTATUS_ZORDER_SYNC = 0x00000004, + TS_RAIL_CLIENTSTATUS_WINDOW_RESIZE_MARGIN_SUPPORTED = 0x00000010, + TS_RAIL_CLIENTSTATUS_HIGH_DPI_ICONS_SUPPORTED = 0x00000020, + TS_RAIL_CLIENTSTATUS_APPBAR_REMOTING_SUPPORTED = 0x00000040, + TS_RAIL_CLIENTSTATUS_POWER_DISPLAY_REQUEST_SUPPORTED = 0x00000080, + TS_RAIL_CLIENTSTATUS_GET_APPID_RESPONSE_EX_SUPPORTED = 0x00000100, + TS_RAIL_CLIENTSTATUS_BIDIRECTIONAL_CLOAK_SUPPORTED = 0x00000200, + TS_RAIL_CLIENTSTATUS_SUPPRESS_ICON_ORDERS = 0x00000400 +} CLIENT_INFO_PDU; + +/* Server Move/Size Start PDU */ +#define RAIL_WMSZ_LEFT 0x0001 +#define RAIL_WMSZ_RIGHT 0x0002 +#define RAIL_WMSZ_TOP 0x0003 +#define RAIL_WMSZ_TOPLEFT 0x0004 +#define RAIL_WMSZ_TOPRIGHT 0x0005 +#define RAIL_WMSZ_BOTTOM 0x0006 +#define RAIL_WMSZ_BOTTOMLEFT 0x0007 +#define RAIL_WMSZ_BOTTOMRIGHT 0x0008 +#define RAIL_WMSZ_MOVE 0x0009 +#define RAIL_WMSZ_KEYMOVE 0x000A +#define RAIL_WMSZ_KEYSIZE 0x000B + +/* Language Bar Information PDU */ +#define TF_SFT_SHOWNORMAL 0x00000001 +#define TF_SFT_DOCK 0x00000002 +#define TF_SFT_MINIMIZED 0x00000004 +#define TF_SFT_HIDDEN 0x00000008 +#define TF_SFT_NOTRANSPARENCY 0x00000010 +#define TF_SFT_LOWTRANSPARENCY 0x00000020 +#define TF_SFT_HIGHTRANSPARENCY 0x00000040 +#define TF_SFT_LABELS 0x00000080 +#define TF_SFT_NOLABELS 0x00000100 +#define TF_SFT_EXTRAICONSONMINIMIZED 0x00000200 +#define TF_SFT_NOEXTRAICONSONMINIMIZED 0x00000400 +#define TF_SFT_DESKBAND 0x00000800 + +/* DEPRECATED: Extended Handshake Flags + * use the spec conformant naming scheme TS_ below + */ +#define RAIL_ORDER_HANDSHAKEEX_FLAGS_HIDEF 0x00000001 +#define RAIL_ORDER_HANDSHAKE_EX_FLAGS_EXTENDED_SPI_SUPPORTED 0x00000002 +#define RAIL_ORDER_HANDSHAKE_EX_FLAGS_SNAP_ARRANGE_SUPPORTED 0x00000004 + +/* Extended Handshake Flags */ +typedef enum +{ + TS_RAIL_ORDER_HANDSHAKEEX_FLAGS_HIDEF = 0x00000001, + TS_RAIL_ORDER_HANDSHAKE_EX_FLAGS_EXTENDED_SPI_SUPPORTED = 0x00000002, + TS_RAIL_ORDER_HANDSHAKE_EX_FLAGS_SNAP_ARRANGE_SUPPORTED = 0x00000004, + TS_RAIL_ORDER_HANDSHAKE_EX_FLAGS_TEXT_SCALE_SUPPORTED = 0x00000008, + TS_RAIL_ORDER_HANDSHAKE_EX_FLAGS_CARET_BLINK_SUPPORTED = 0x00000010, + TS_RAIL_ORDER_HANDSHAKE_EX_FLAGS_EXTENDED_SPI_2_SUPPORTED = 0x00000020 +} EXTENDED_HANDSHAKE_FLAGS; +/* Language Profile Information Flags */ +#define TF_PROFILETYPE_INPUTPROCESSOR 0x00000001 +#define TF_PROFILETYPE_KEYBOARDLAYOUT 0x00000002 + +/* LanguageProfileCLSID and ProfileGUID */ +#ifndef _WIN32 +#define GUID_NULL \ + { \ + 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \ + } +#else +#include <cguid.h> +#endif +#define GUID_MSIME_JPN \ + { \ + 0x03B5835F, 0xF03C, 0x411B, 0x9C, 0xE2, 0xAA, 0x23, 0xE1, 0x17, 0x1E, 0x36 \ + } +#define GUID_MSIME_KOR \ + { \ + 0xA028AE76, 0x01B1, 0x46C2, 0x99, 0xC4, 0xAC, 0xD9, 0x85, 0x8A, 0xE0, 0x02 \ + } +#define GUID_CHSIME \ + { \ + 0x81D4E9C9, 0x1D3B, 0x41BC, 0x9E, 0x6C, 0x4B, 0x40, 0xBF, 0x79, 0xE3, 0x5E \ + } +#define GUID_CHTIME \ + { \ + 0x531FDEBF, 0x9B4C, 0x4A43, 0xA2, 0xAA, 0x96, 0x0E, 0x8F, 0xCD, 0xC7, 0x32 \ + } +#define GUID_PROFILE_NEWPHONETIC \ + { \ + 0xB2F9C502, 0x1742, 0x11D4, 0x97, 0x90, 0x00, 0x80, 0xC8, 0x82, 0x68, 0x7E \ + } +#define GUID_PROFILE_CHANGJIE \ + { \ + 0x4BDF9F03, 0xC7D3, 0x11D4, 0xB2, 0xAB, 0x00, 0x80, 0xC8, 0x82, 0x68, 0x7E \ + } +#define GUID_PROFILE_QUICK \ + { \ + 0x6024B45F, 0x5C54, 0x11D4, 0xB9, 0x21, 0x00, 0x80, 0xC8, 0x82, 0x68, 0x7E \ + } +#define GUID_PROFILE_CANTONESE \ + { \ + 0x0AEC109C, 0x7E96, 0x11D4, 0xB2, 0xEF, 0x00, 0x80, 0xC8, 0x82, 0x68, 0x7E \ + } +#define GUID_PROFILE_PINYIN \ + { \ + 0xF3BA9077, 0x6C7E, 0x11D4, 0x97, 0xFA, 0x00, 0x80, 0xC8, 0x82, 0x68, 0x7E \ + } +#define GUID_PROFILE_SIMPLEFAST \ + { \ + 0xFA550B04, 0x5AD7, 0x411F, 0xA5, 0xAC, 0xCA, 0x03, 0x8E, 0xC5, 0x15, 0xD7 \ + } +#define GUID_GUID_PROFILE_MSIME_JPN \ + { \ + 0xA76C93D9, 0x5523, 0x4E90, 0xAA, 0xFA, 0x4D, 0xB1, 0x12, 0xF9, 0xAC, 0x76 \ + } +#define GUID_PROFILE_MSIME_KOR \ + { \ + 0xB5FE1F02, 0xD5F2, 0x4445, 0x9C, 0x03, 0xC5, 0x68, 0xF2, 0x3C, 0x99, 0xA1 \ + } + +/* ImeState */ +#define IME_STATE_CLOSED 0x00000000 +#define IME_STATE_OPEN 0x00000001 + +/* ImeConvMode */ +#if !defined(_IME_CMODES_) && !defined(__MINGW32__) +#define IME_CMODE_NATIVE 0x00000001 +#define IME_CMODE_KATAKANA 0x00000002 +#define IME_CMODE_FULLSHAPE 0x00000008 +#define IME_CMODE_ROMAN 0x00000010 +#define IME_CMODE_CHARCODE 0x00000020 +#define IME_CMODE_HANJACONVERT 0x00000040 +#define IME_CMODE_SOFTKBD 0x00000080 +#define IME_CMODE_NOCONVERSION 0x00000100 +#define IME_CMODE_EUDC 0x00000200 +#define IME_CMODE_SYMBOL 0x00000400 +#define IME_CMODE_FIXED 0x00000800 +#endif + +/* ImeSentenceMode */ +#ifndef _IMM_ +#define IME_SMODE_NONE 0x00000000 +#define IME_SMODE_PLURALCASE 0x00000001 +#define IME_SMODE_SINGLECONVERT 0x00000002 +#define IME_SMODE_AUTOMATIC 0x00000004 +#define IME_SMODE_PHRASEPREDICT 0x00000008 +#define IME_SMODE_CONVERSATION 0x00000010 +#endif + +/* KANAMode */ +#define KANA_MODE_OFF 0x00000000 +#define KANA_MODE_ON 0x00000001 + +/* Taskbar */ +#define RAIL_TASKBAR_MSG_TAB_REGISTER 0x00000001 +#define RAIL_TASKBAR_MSG_TAB_UNREGISTER 0x00000002 +#define RAIL_TASKBAR_MSG_TAB_ORDER 0x00000003 +#define RAIL_TASKBAR_MSG_TAB_ACTIVE 0x00000004 +#define RAIL_TASKBAR_MSG_TAB_PROPERTIES 0x00000005 + +/* Taskbar body */ +#define RAIL_TASKBAR_MSG_TAB_REGISTER 0x00000001 +#define RAIL_TASKBAR_MSG_TAB_UNREGISTER 0x00000002 +#define RAIL_TASKBAR_MSG_TAB_ORDER 0x00000003 +#define RAIL_TASKBAR_MSG_TAB_ACTIVE 0x00000004 +#define RAIL_TASKBAR_MSG_TAB_PROPERTIES 0x00000005 + +typedef struct +{ + UINT16 length; + BYTE* string; +} RAIL_UNICODE_STRING; + +typedef struct +{ + UINT32 flags; + UINT32 colorSchemeLength; + RAIL_UNICODE_STRING colorScheme; +} RAIL_HIGH_CONTRAST; + +/* RAIL Orders */ + +typedef struct +{ + UINT32 buildNumber; +} RAIL_HANDSHAKE_ORDER; + +typedef struct +{ + UINT32 buildNumber; + UINT32 railHandshakeFlags; +} RAIL_HANDSHAKE_EX_ORDER; + +typedef struct +{ + UINT32 flags; +} RAIL_CLIENT_STATUS_ORDER; + +typedef struct +{ + UINT16 flags; + char* RemoteApplicationProgram; + char* RemoteApplicationWorkingDir; + char* RemoteApplicationArguments; +} RAIL_EXEC_ORDER; + +typedef struct +{ + UINT16 flags; + UINT16 execResult; + UINT32 rawResult; + RAIL_UNICODE_STRING exeOrFile; +} RAIL_EXEC_RESULT_ORDER; + +typedef struct +{ + UINT32 Flags; + UINT32 WaitTime; + UINT32 DelayTime; + UINT32 RepeatTime; + UINT32 BounceTime; +} TS_FILTERKEYS; + +typedef struct +{ + UINT32 param; + UINT32 params; + BOOL dragFullWindows; + BOOL keyboardCues; + BOOL keyboardPref; + BOOL mouseButtonSwap; + RECTANGLE_16 workArea; + RECTANGLE_16 displayChange; + RECTANGLE_16 taskbarPos; + RAIL_HIGH_CONTRAST highContrast; + UINT32 caretWidth; + UINT32 stickyKeys; + UINT32 toggleKeys; + TS_FILTERKEYS filterKeys; + BOOL setScreenSaveActive; + BOOL setScreenSaveSecure; +} RAIL_SYSPARAM_ORDER; + +typedef struct +{ + UINT32 windowId; + BOOL enabled; +} RAIL_ACTIVATE_ORDER; + +typedef struct +{ + UINT32 windowId; + INT16 left; + INT16 top; +} RAIL_SYSMENU_ORDER; + +typedef struct +{ + UINT32 windowId; + UINT16 command; +} RAIL_SYSCOMMAND_ORDER; + +typedef struct +{ + UINT32 windowId; + UINT32 notifyIconId; + UINT32 message; +} RAIL_NOTIFY_EVENT_ORDER; + +typedef struct +{ + UINT32 windowId; + INT16 maxWidth; + INT16 maxHeight; + INT16 maxPosX; + INT16 maxPosY; + INT16 minTrackWidth; + INT16 minTrackHeight; + INT16 maxTrackWidth; + INT16 maxTrackHeight; +} RAIL_MINMAXINFO_ORDER; + +typedef struct +{ + UINT32 windowId; + BOOL isMoveSizeStart; + UINT16 moveSizeType; + INT16 posX; + INT16 posY; +} RAIL_LOCALMOVESIZE_ORDER; + +typedef struct +{ + UINT32 windowId; + INT16 left; + INT16 top; + INT16 right; + INT16 bottom; +} RAIL_WINDOW_MOVE_ORDER; + +typedef struct +{ + UINT32 windowId; +} RAIL_GET_APPID_REQ_ORDER; + +typedef struct +{ + UINT32 windowId; + WCHAR applicationId[260]; +} RAIL_GET_APPID_RESP_ORDER; + +typedef struct +{ + UINT32 languageBarStatus; +} RAIL_LANGBAR_INFO_ORDER; + +typedef struct +{ + UINT32 ImeState; + UINT32 ImeConvMode; + UINT32 ImeSentenceMode; + UINT32 KanaMode; +} RAIL_COMPARTMENT_INFO_ORDER; + +typedef struct +{ + UINT32 windowIdMarker; +} RAIL_ZORDER_SYNC; + +typedef struct +{ + UINT32 windowId; + BOOL cloak; +} RAIL_CLOAK; + +typedef struct +{ + UINT32 active; +} RAIL_POWER_DISPLAY_REQUEST; + +typedef struct +{ + UINT32 TaskbarMessage; + UINT32 WindowIdTab; + UINT32 Body; +} RAIL_TASKBAR_INFO_ORDER; + +typedef struct +{ + UINT32 ProfileType; + UINT32 LanguageID; + GUID LanguageProfileCLSID; + GUID ProfileGUID; + UINT32 KeyboardLayout; +} RAIL_LANGUAGEIME_INFO_ORDER; + +typedef struct +{ + UINT32 windowId; + INT16 left; + INT16 top; + INT16 right; + INT16 bottom; +} RAIL_SNAP_ARRANGE; + +typedef struct +{ + UINT32 windowID; + WCHAR applicationID[520 / sizeof(WCHAR)]; + UINT32 processId; + WCHAR processImageName[520 / sizeof(WCHAR)]; +} RAIL_GET_APPID_RESP_EX; + +/* DEPRECATED: RAIL Constants + * use the spec conformant naming scheme TS_ below + */ + +#define RDP_RAIL_ORDER_EXEC 0x0001 +#define RDP_RAIL_ORDER_ACTIVATE 0x0002 +#define RDP_RAIL_ORDER_SYSPARAM 0x0003 +#define RDP_RAIL_ORDER_SYSCOMMAND 0x0004 +#define RDP_RAIL_ORDER_HANDSHAKE 0x0005 +#define RDP_RAIL_ORDER_NOTIFY_EVENT 0x0006 +#define RDP_RAIL_ORDER_WINDOWMOVE 0x0008 +#define RDP_RAIL_ORDER_LOCALMOVESIZE 0x0009 +#define RDP_RAIL_ORDER_MINMAXINFO 0x000A +#define RDP_RAIL_ORDER_CLIENTSTATUS 0x000B +#define RDP_RAIL_ORDER_SYSMENU 0x000C +#define RDP_RAIL_ORDER_LANGBARINFO 0x000D +#define RDP_RAIL_ORDER_EXEC_RESULT 0x0080 +#define RDP_RAIL_ORDER_GET_APPID_REQ 0x000E +#define RDP_RAIL_ORDER_GET_APPID_RESP 0x000F +#define RDP_RAIL_ORDER_LANGUAGEIMEINFO 0x0011 +#define RDP_RAIL_ORDER_COMPARTMENTINFO 0x0012 +#define RDP_RAIL_ORDER_HANDSHAKE_EX 0x0013 +#define RDP_RAIL_ORDER_ZORDER_SYNC 0x0014 +#define RDP_RAIL_ORDER_CLOAK 0x0015 +#define RDP_RAIL_ORDER_POWER_DISPLAY_REQUEST 0x0016 +#define RDP_RAIL_ORDER_SNAP_ARRANGE 0x0017 +#define RDP_RAIL_ORDER_GET_APPID_RESP_EX 0x0018 + +/* RAIL Constants */ + +typedef enum +{ + TS_RAIL_ORDER_EXEC = 0x0001, + TS_RAIL_ORDER_ACTIVATE = 0x0002, + TS_RAIL_ORDER_SYSPARAM = 0x0003, + TS_RAIL_ORDER_SYSCOMMAND = 0x0004, + TS_RAIL_ORDER_HANDSHAKE = 0x0005, + TS_RAIL_ORDER_NOTIFY_EVENT = 0x0006, + TS_RAIL_ORDER_WINDOWMOVE = 0x0008, + TS_RAIL_ORDER_LOCALMOVESIZE = 0x0009, + TS_RAIL_ORDER_MINMAXINFO = 0x000A, + TS_RAIL_ORDER_CLIENTSTATUS = 0x000B, + TS_RAIL_ORDER_SYSMENU = 0x000C, + TS_RAIL_ORDER_LANGBARINFO = 0x000D, + TS_RAIL_ORDER_GET_APPID_REQ = 0x000E, + TS_RAIL_ORDER_GET_APPID_RESP = 0x000F, + TS_RAIL_ORDER_TASKBARINFO = 0x0010, + TS_RAIL_ORDER_LANGUAGEIMEINFO = 0x0011, + TS_RAIL_ORDER_COMPARTMENTINFO = 0x0012, + TS_RAIL_ORDER_HANDSHAKE_EX = 0x0013, + TS_RAIL_ORDER_ZORDER_SYNC = 0x0014, + TS_RAIL_ORDER_CLOAK = 0x0015, + TS_RAIL_ORDER_POWER_DISPLAY_REQUEST = 0x0016, + TS_RAIL_ORDER_SNAP_ARRANGE = 0x0017, + TS_RAIL_ORDER_GET_APPID_RESP_EX = 0x0018, + TS_RAIL_ORDER_TEXTSCALEINFO = 0x0019, + TS_RAIL_ORDER_CARETBLINKINFO = 0x001A, + TS_RAIL_ORDER_EXEC_RESULT = 0x0080 +} ORDER_TYPE; + + FREERDP_API BOOL rail_read_unicode_string(wStream* s, RAIL_UNICODE_STRING* unicode_string); + FREERDP_API BOOL utf8_string_to_rail_string(const char* string, + RAIL_UNICODE_STRING* unicode_string); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_RAIL_GLOBAL_H */ diff --git a/include/freerdp/redirection.h b/include/freerdp/redirection.h new file mode 100644 index 0000000..2f40e10 --- /dev/null +++ b/include/freerdp/redirection.h @@ -0,0 +1,84 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP Server Redirection + * + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_REDIRECTION_H +#define FREERDP_REDIRECTION_H + +#include <freerdp/api.h> + +/* Redirection Flags */ +#define LB_TARGET_NET_ADDRESS 0x00000001 +#define LB_LOAD_BALANCE_INFO 0x00000002 +#define LB_USERNAME 0x00000004 +#define LB_DOMAIN 0x00000008 +#define LB_PASSWORD 0x00000010 +#define LB_DONTSTOREUSERNAME 0x00000020 +#define LB_SMARTCARD_LOGON 0x00000040 +#define LB_NOREDIRECT 0x00000080 +#define LB_TARGET_FQDN 0x00000100 +#define LB_TARGET_NETBIOS_NAME 0x00000200 +#define LB_TARGET_NET_ADDRESSES 0x00000800 +#define LB_CLIENT_TSV_URL 0x00001000 +#define LB_SERVER_TSV_CAPABLE 0x00002000 +#define LB_PASSWORD_IS_PK_ENCRYPTED 0x00004000 +#define LB_REDIRECTION_GUID 0x00008000 +#define LB_TARGET_CERTIFICATE 0x00010000 + +#define LB_PASSWORD_MAX_LENGTH 512 + +#define ENCODING_TYPE_ASN1_DER 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_redirection rdpRedirection; + + FREERDP_API void redirection_free(rdpRedirection* redirection); + + WINPR_ATTR_MALLOC(redirection_free, 1) + FREERDP_API rdpRedirection* redirection_new(void); + + /** \brief This function checks if all necessary settings for a given \b rdpRedirection are + * available. + * + * \param redirection The redirection settings to check + * \param pFlags An (optional) pointer to UINT32. Is set to the flags that do not have + * necessary data available. + * + * \return \b TRUE if the redirection settings are ready to use, \b FALSE otherwise. + */ + FREERDP_API BOOL redirection_settings_are_valid(rdpRedirection* redirection, UINT32* pFlags); + + FREERDP_API BOOL redirection_set_flags(rdpRedirection* redirection, UINT32 flags); + FREERDP_API BOOL redirection_set_session_id(rdpRedirection* redirection, UINT32 session_id); + FREERDP_API BOOL redirection_set_byte_option(rdpRedirection* redirection, UINT32 flag, + const BYTE* data, size_t length); + FREERDP_API BOOL redirection_set_string_option(rdpRedirection* redirection, UINT32 flag, + const char* str); + FREERDP_API BOOL redirection_set_array_option(rdpRedirection* redirection, UINT32 flag, + const char** str, size_t count); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_REDIRECTION_H */ diff --git a/include/freerdp/scancode.h b/include/freerdp/scancode.h new file mode 100644 index 0000000..0ee3635 --- /dev/null +++ b/include/freerdp/scancode.h @@ -0,0 +1,237 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP protocol "scancodes" + * + * Copyright 2009-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_LOCALE_KEYBOARD_RDP_SCANCODE_H +#define FREERDP_LOCALE_KEYBOARD_RDP_SCANCODE_H + +#include <winpr/input.h> + +/* msdn{cc240584} says: + * "... (a scancode is an 8-bit value specifying a key location on the keyboard). + * The server accepts a scancode value and translates it into the correct character depending on the + * language locale and keyboard layout used in the session." The 8-bit value is later called + * "keyCode" The extended flag is for all practical an important 9th bit with a strange encoding - + * not just a modifier. + */ + +#define RDP_SCANCODE_CODE(_rdp_scancode) ((BYTE)(_rdp_scancode & 0xFF)) +#define RDP_SCANCODE_EXTENDED(_rdp_scancode) (((_rdp_scancode)&KBDEXT) ? TRUE : FALSE) +#define MAKE_RDP_SCANCODE(_code, _extended) (((_code)&0xFF) | ((_extended) ? KBDEXT : 0)) + +/* Defines for known RDP_SCANCODE protocol values. + * Mostly the same as the PKBDLLHOOKSTRUCT scanCode, "A hardware scan code for the key", + * msdn{ms644967}. Based msdn{ms894073} US, msdn{ms894072} UK, msdn{ms892472} */ + +#define RDP_SCANCODE_UNKNOWN MAKE_RDP_SCANCODE(0x00, FALSE) + +#define RDP_SCANCODE_ESCAPE MAKE_RDP_SCANCODE(0x01, FALSE) /* VK_ESCAPE */ +#define RDP_SCANCODE_KEY_1 MAKE_RDP_SCANCODE(0x02, FALSE) /* VK_KEY_1 */ +#define RDP_SCANCODE_KEY_2 MAKE_RDP_SCANCODE(0x03, FALSE) /* VK_KEY_2 */ +#define RDP_SCANCODE_KEY_3 MAKE_RDP_SCANCODE(0x04, FALSE) /* VK_KEY_3 */ +#define RDP_SCANCODE_KEY_4 MAKE_RDP_SCANCODE(0x05, FALSE) /* VK_KEY_4 */ +#define RDP_SCANCODE_KEY_5 MAKE_RDP_SCANCODE(0x06, FALSE) /* VK_KEY_5 */ +#define RDP_SCANCODE_KEY_6 MAKE_RDP_SCANCODE(0x07, FALSE) /* VK_KEY_6 */ +#define RDP_SCANCODE_KEY_7 MAKE_RDP_SCANCODE(0x08, FALSE) /* VK_KEY_7 */ +#define RDP_SCANCODE_KEY_8 MAKE_RDP_SCANCODE(0x09, FALSE) /* VK_KEY_8 */ +#define RDP_SCANCODE_KEY_9 MAKE_RDP_SCANCODE(0x0A, FALSE) /* VK_KEY_9 */ +#define RDP_SCANCODE_KEY_0 MAKE_RDP_SCANCODE(0x0B, FALSE) /* VK_KEY_0 */ +#define RDP_SCANCODE_OEM_MINUS MAKE_RDP_SCANCODE(0x0C, FALSE) /* VK_OEM_MINUS */ +#define RDP_SCANCODE_OEM_PLUS MAKE_RDP_SCANCODE(0x0D, FALSE) /* VK_OEM_PLUS */ +#define RDP_SCANCODE_BACKSPACE MAKE_RDP_SCANCODE(0x0E, FALSE) /* VK_BACK Backspace */ +#define RDP_SCANCODE_TAB MAKE_RDP_SCANCODE(0x0F, FALSE) /* VK_TAB */ +#define RDP_SCANCODE_KEY_Q MAKE_RDP_SCANCODE(0x10, FALSE) /* VK_KEY_Q */ +#define RDP_SCANCODE_KEY_W MAKE_RDP_SCANCODE(0x11, FALSE) /* VK_KEY_W */ +#define RDP_SCANCODE_KEY_E MAKE_RDP_SCANCODE(0x12, FALSE) /* VK_KEY_E */ +#define RDP_SCANCODE_KEY_R MAKE_RDP_SCANCODE(0x13, FALSE) /* VK_KEY_R */ +#define RDP_SCANCODE_KEY_T MAKE_RDP_SCANCODE(0x14, FALSE) /* VK_KEY_T */ +#define RDP_SCANCODE_KEY_Y MAKE_RDP_SCANCODE(0x15, FALSE) /* VK_KEY_Y */ +#define RDP_SCANCODE_KEY_U MAKE_RDP_SCANCODE(0x16, FALSE) /* VK_KEY_U */ +#define RDP_SCANCODE_KEY_I MAKE_RDP_SCANCODE(0x17, FALSE) /* VK_KEY_I */ +#define RDP_SCANCODE_KEY_O MAKE_RDP_SCANCODE(0x18, FALSE) /* VK_KEY_O */ +#define RDP_SCANCODE_KEY_P MAKE_RDP_SCANCODE(0x19, FALSE) /* VK_KEY_P */ +#define RDP_SCANCODE_OEM_4 MAKE_RDP_SCANCODE(0x1A, FALSE) /* VK_OEM_4 '[' on US */ +#define RDP_SCANCODE_OEM_6 MAKE_RDP_SCANCODE(0x1B, FALSE) /* VK_OEM_6 ']' on US */ +#define RDP_SCANCODE_RETURN MAKE_RDP_SCANCODE(0x1C, FALSE) /* VK_RETURN Normal Enter */ +#define RDP_SCANCODE_LCONTROL MAKE_RDP_SCANCODE(0x1D, FALSE) /* VK_LCONTROL */ +#define RDP_SCANCODE_KEY_A MAKE_RDP_SCANCODE(0x1E, FALSE) /* VK_KEY_A */ +#define RDP_SCANCODE_KEY_S MAKE_RDP_SCANCODE(0x1F, FALSE) /* VK_KEY_S */ +#define RDP_SCANCODE_KEY_D MAKE_RDP_SCANCODE(0x20, FALSE) /* VK_KEY_D */ +#define RDP_SCANCODE_KEY_F MAKE_RDP_SCANCODE(0x21, FALSE) /* VK_KEY_F */ +#define RDP_SCANCODE_KEY_G MAKE_RDP_SCANCODE(0x22, FALSE) /* VK_KEY_G */ +#define RDP_SCANCODE_KEY_H MAKE_RDP_SCANCODE(0x23, FALSE) /* VK_KEY_H */ +#define RDP_SCANCODE_KEY_J MAKE_RDP_SCANCODE(0x24, FALSE) /* VK_KEY_J */ +#define RDP_SCANCODE_KEY_K MAKE_RDP_SCANCODE(0x25, FALSE) /* VK_KEY_K */ +#define RDP_SCANCODE_KEY_L MAKE_RDP_SCANCODE(0x26, FALSE) /* VK_KEY_L */ +#define RDP_SCANCODE_OEM_1 MAKE_RDP_SCANCODE(0x27, FALSE) /* VK_OEM_1 ';' on US */ +#define RDP_SCANCODE_OEM_7 MAKE_RDP_SCANCODE(0x28, FALSE) /* VK_OEM_7 "'" on US */ +#define RDP_SCANCODE_OEM_3 \ + MAKE_RDP_SCANCODE(0x29, FALSE) /* VK_OEM_3 Top left, '`' on US, JP DBE_SBCSCHAR */ +#define RDP_SCANCODE_LSHIFT MAKE_RDP_SCANCODE(0x2A, FALSE) /* VK_LSHIFT */ +#define RDP_SCANCODE_OEM_5 MAKE_RDP_SCANCODE(0x2B, FALSE) /* VK_OEM_5 Next to Enter, '\' on US */ +#define RDP_SCANCODE_KEY_Z MAKE_RDP_SCANCODE(0x2C, FALSE) /* VK_KEY_Z */ +#define RDP_SCANCODE_KEY_X MAKE_RDP_SCANCODE(0x2D, FALSE) /* VK_KEY_X */ +#define RDP_SCANCODE_KEY_C MAKE_RDP_SCANCODE(0x2E, FALSE) /* VK_KEY_C */ +#define RDP_SCANCODE_KEY_V MAKE_RDP_SCANCODE(0x2F, FALSE) /* VK_KEY_V */ +#define RDP_SCANCODE_KEY_B MAKE_RDP_SCANCODE(0x30, FALSE) /* VK_KEY_B */ +#define RDP_SCANCODE_KEY_N MAKE_RDP_SCANCODE(0x31, FALSE) /* VK_KEY_N */ +#define RDP_SCANCODE_KEY_M MAKE_RDP_SCANCODE(0x32, FALSE) /* VK_KEY_M */ +#define RDP_SCANCODE_OEM_COMMA MAKE_RDP_SCANCODE(0x33, FALSE) /* VK_OEM_COMMA */ +#define RDP_SCANCODE_OEM_PERIOD MAKE_RDP_SCANCODE(0x34, FALSE) /* VK_OEM_PERIOD */ +#define RDP_SCANCODE_OEM_2 MAKE_RDP_SCANCODE(0x35, FALSE) /* VK_OEM_2 '/' on US */ +#define RDP_SCANCODE_RSHIFT MAKE_RDP_SCANCODE(0x36, FALSE) /* VK_RSHIFT */ +#define RDP_SCANCODE_MULTIPLY MAKE_RDP_SCANCODE(0x37, FALSE) /* VK_MULTIPLY Numerical */ +#define RDP_SCANCODE_LMENU MAKE_RDP_SCANCODE(0x38, FALSE) /* VK_LMENU Left 'Alt' key */ +#define RDP_SCANCODE_SPACE MAKE_RDP_SCANCODE(0x39, FALSE) /* VK_SPACE */ +#define RDP_SCANCODE_CAPSLOCK \ + MAKE_RDP_SCANCODE(0x3A, FALSE) /* VK_CAPITAL 'Caps Lock', JP DBE_ALPHANUMERIC */ +#define RDP_SCANCODE_F1 MAKE_RDP_SCANCODE(0x3B, FALSE) /* VK_F1 */ +#define RDP_SCANCODE_F2 MAKE_RDP_SCANCODE(0x3C, FALSE) /* VK_F2 */ +#define RDP_SCANCODE_F3 MAKE_RDP_SCANCODE(0x3D, FALSE) /* VK_F3 */ +#define RDP_SCANCODE_F4 MAKE_RDP_SCANCODE(0x3E, FALSE) /* VK_F4 */ +#define RDP_SCANCODE_F5 MAKE_RDP_SCANCODE(0x3F, FALSE) /* VK_F5 */ +#define RDP_SCANCODE_F6 MAKE_RDP_SCANCODE(0x40, FALSE) /* VK_F6 */ +#define RDP_SCANCODE_F7 MAKE_RDP_SCANCODE(0x41, FALSE) /* VK_F7 */ +#define RDP_SCANCODE_F8 MAKE_RDP_SCANCODE(0x42, FALSE) /* VK_F8 */ +#define RDP_SCANCODE_F9 MAKE_RDP_SCANCODE(0x43, FALSE) /* VK_F9 */ +#define RDP_SCANCODE_F10 MAKE_RDP_SCANCODE(0x44, FALSE) /* VK_F10 */ +#define RDP_SCANCODE_NUMLOCK \ + MAKE_RDP_SCANCODE(0x45, FALSE) \ + /* VK_NUMLOCK */ /* Note: when this seems to appear in PKBDLLHOOKSTRUCT it means Pause which \ + must be sent as Ctrl + NumLock */ +#define RDP_SCANCODE_SCROLLLOCK \ + MAKE_RDP_SCANCODE(0x46, FALSE) /* VK_SCROLL 'Scroll Lock', JP OEM_SCROLL */ +#define RDP_SCANCODE_NUMPAD7 MAKE_RDP_SCANCODE(0x47, FALSE) /* VK_NUMPAD7 */ +#define RDP_SCANCODE_NUMPAD8 MAKE_RDP_SCANCODE(0x48, FALSE) /* VK_NUMPAD8 */ +#define RDP_SCANCODE_NUMPAD9 MAKE_RDP_SCANCODE(0x49, FALSE) /* VK_NUMPAD9 */ +#define RDP_SCANCODE_SUBTRACT MAKE_RDP_SCANCODE(0x4A, FALSE) /* VK_SUBTRACT */ +#define RDP_SCANCODE_NUMPAD4 MAKE_RDP_SCANCODE(0x4B, FALSE) /* VK_NUMPAD4 */ +#define RDP_SCANCODE_NUMPAD5 MAKE_RDP_SCANCODE(0x4C, FALSE) /* VK_NUMPAD5 */ +#define RDP_SCANCODE_NUMPAD6 MAKE_RDP_SCANCODE(0x4D, FALSE) /* VK_NUMPAD6 */ +#define RDP_SCANCODE_ADD MAKE_RDP_SCANCODE(0x4E, FALSE) /* VK_ADD */ +#define RDP_SCANCODE_NUMPAD1 MAKE_RDP_SCANCODE(0x4F, FALSE) /* VK_NUMPAD1 */ +#define RDP_SCANCODE_NUMPAD2 MAKE_RDP_SCANCODE(0x50, FALSE) /* VK_NUMPAD2 */ +#define RDP_SCANCODE_NUMPAD3 MAKE_RDP_SCANCODE(0x51, FALSE) /* VK_NUMPAD3 */ +#define RDP_SCANCODE_NUMPAD0 MAKE_RDP_SCANCODE(0x52, FALSE) /* VK_NUMPAD0 */ +#define RDP_SCANCODE_DECIMAL MAKE_RDP_SCANCODE(0x53, FALSE) /* VK_DECIMAL Numerical, '.' on US */ +#define RDP_SCANCODE_SYSREQ MAKE_RDP_SCANCODE(0x54, FALSE) /* Sys Req */ +#define RDP_SCANCODE_OEM_102 MAKE_RDP_SCANCODE(0x56, FALSE) /* VK_OEM_102 Lower left '\' on US */ +#define RDP_SCANCODE_F11 MAKE_RDP_SCANCODE(0x57, FALSE) /* VK_F11 */ +#define RDP_SCANCODE_F12 MAKE_RDP_SCANCODE(0x58, FALSE) /* VK_F12 */ +#define RDP_SCANCODE_SLEEP \ + MAKE_RDP_SCANCODE(0x5F, FALSE) /* VK_SLEEP OEM_8 on FR (undocumented?) \ + */ +#define RDP_SCANCODE_ZOOM MAKE_RDP_SCANCODE(0x62, FALSE) /* VK_ZOOM (undocumented?) */ +#define RDP_SCANCODE_HELP MAKE_RDP_SCANCODE(0x63, FALSE) /* VK_HELP (undocumented?) */ + +#define RDP_SCANCODE_F13 \ + MAKE_RDP_SCANCODE(0x64, FALSE) /* VK_F13 */ /* JP agree, should 0x7d according to ms894073 */ +#define RDP_SCANCODE_F14 MAKE_RDP_SCANCODE(0x65, FALSE) /* VK_F14 */ +#define RDP_SCANCODE_F15 MAKE_RDP_SCANCODE(0x66, FALSE) /* VK_F15 */ +#define RDP_SCANCODE_F16 MAKE_RDP_SCANCODE(0x67, FALSE) /* VK_F16 */ +#define RDP_SCANCODE_F17 MAKE_RDP_SCANCODE(0x68, FALSE) /* VK_F17 */ +#define RDP_SCANCODE_F18 MAKE_RDP_SCANCODE(0x69, FALSE) /* VK_F18 */ +#define RDP_SCANCODE_F19 MAKE_RDP_SCANCODE(0x6A, FALSE) /* VK_F19 */ +#define RDP_SCANCODE_F20 MAKE_RDP_SCANCODE(0x6B, FALSE) /* VK_F20 */ +#define RDP_SCANCODE_F21 MAKE_RDP_SCANCODE(0x6C, FALSE) /* VK_F21 */ +#define RDP_SCANCODE_F22 MAKE_RDP_SCANCODE(0x6D, FALSE) /* VK_F22 */ +#define RDP_SCANCODE_F23 MAKE_RDP_SCANCODE(0x6E, FALSE) /* VK_F23 */ /* JP agree */ +#define RDP_SCANCODE_F24 \ + MAKE_RDP_SCANCODE(0x6F, FALSE) /* VK_F24 */ /* 0x87 according to ms894073 */ + +#define RDP_SCANCODE_HIRAGANA MAKE_RDP_SCANCODE(0x70, FALSE) /* JP DBE_HIRAGANA */ +#define RDP_SCANCODE_HANJA_KANJI \ + MAKE_RDP_SCANCODE(0x71, FALSE) /* VK_HANJA / VK_KANJI (undocumented?) */ +#define RDP_SCANCODE_KANA_HANGUL \ + MAKE_RDP_SCANCODE(0x72, FALSE) /* VK_KANA / VK_HANGUL (undocumented?) */ +#define RDP_SCANCODE_ABNT_C1 MAKE_RDP_SCANCODE(0x73, FALSE) /* VK_ABNT_C1 JP OEM_102 */ +#define RDP_SCANCODE_F24_JP MAKE_RDP_SCANCODE(0x76, FALSE) /* JP F24 */ +#define RDP_SCANCODE_CONVERT_JP MAKE_RDP_SCANCODE(0x79, FALSE) /* JP VK_CONVERT */ +#define RDP_SCANCODE_NONCONVERT_JP MAKE_RDP_SCANCODE(0x7B, FALSE) /* JP VK_NONCONVERT */ +#define RDP_SCANCODE_TAB_JP MAKE_RDP_SCANCODE(0x7C, FALSE) /* JP TAB */ +#define RDP_SCANCODE_BACKSLASH_JP MAKE_RDP_SCANCODE(0x7D, FALSE) /* JP OEM_5 ('\') */ +#define RDP_SCANCODE_ABNT_C2 MAKE_RDP_SCANCODE(0x7E, FALSE) /* VK_ABNT_C2, JP */ +#define RDP_SCANCODE_HANJA MAKE_RDP_SCANCODE(0x71, FALSE) /* KR VK_HANJA */ +#define RDP_SCANCODE_HANGUL MAKE_RDP_SCANCODE(0x72, FALSE) /* KR VK_HANGUL */ + +#define RDP_SCANCODE_RETURN_KP \ + MAKE_RDP_SCANCODE(0x1C, TRUE) /* not RDP_SCANCODE_RETURN Numerical Enter */ +#define RDP_SCANCODE_RCONTROL MAKE_RDP_SCANCODE(0x1D, TRUE) /* VK_RCONTROL */ +#define RDP_SCANCODE_DIVIDE MAKE_RDP_SCANCODE(0x35, TRUE) /* VK_DIVIDE Numerical */ +#define RDP_SCANCODE_PRINTSCREEN \ + MAKE_RDP_SCANCODE(0x37, TRUE) /* VK_EXECUTE/VK_PRINT/VK_SNAPSHOT Print Screen */ +#define RDP_SCANCODE_RMENU MAKE_RDP_SCANCODE(0x38, TRUE) /* VK_RMENU Right 'Alt' / 'Alt Gr' */ +#define RDP_SCANCODE_PAUSE \ + MAKE_RDP_SCANCODE(0x46, TRUE) /* VK_PAUSE Pause / Break (Slightly special handling) */ +#define RDP_SCANCODE_HOME MAKE_RDP_SCANCODE(0x47, TRUE) /* VK_HOME */ +#define RDP_SCANCODE_UP MAKE_RDP_SCANCODE(0x48, TRUE) /* VK_UP */ +#define RDP_SCANCODE_PRIOR MAKE_RDP_SCANCODE(0x49, TRUE) /* VK_PRIOR 'Page Up' */ +#define RDP_SCANCODE_LEFT MAKE_RDP_SCANCODE(0x4B, TRUE) /* VK_LEFT */ +#define RDP_SCANCODE_RIGHT MAKE_RDP_SCANCODE(0x4D, TRUE) /* VK_RIGHT */ +#define RDP_SCANCODE_END MAKE_RDP_SCANCODE(0x4F, TRUE) /* VK_END */ +#define RDP_SCANCODE_DOWN MAKE_RDP_SCANCODE(0x50, TRUE) /* VK_DOWN */ +#define RDP_SCANCODE_NEXT MAKE_RDP_SCANCODE(0x51, TRUE) /* VK_NEXT 'Page Down' */ +#define RDP_SCANCODE_INSERT MAKE_RDP_SCANCODE(0x52, TRUE) /* VK_INSERT */ +#define RDP_SCANCODE_DELETE MAKE_RDP_SCANCODE(0x53, TRUE) /* VK_DELETE */ +#define RDP_SCANCODE_NULL MAKE_RDP_SCANCODE(0x54, TRUE) /* <00> */ +#define RDP_SCANCODE_HELP2 \ + MAKE_RDP_SCANCODE(0x56, TRUE) /* Help - documented, different from VK_HELP */ +#define RDP_SCANCODE_LWIN MAKE_RDP_SCANCODE(0x5B, TRUE) /* VK_LWIN */ +#define RDP_SCANCODE_RWIN MAKE_RDP_SCANCODE(0x5C, TRUE) /* VK_RWIN */ +#define RDP_SCANCODE_APPS MAKE_RDP_SCANCODE(0x5D, TRUE) /* VK_APPS Application */ +#define RDP_SCANCODE_POWER_JP MAKE_RDP_SCANCODE(0x5E, TRUE) /* JP POWER */ +#define RDP_SCANCODE_SLEEP_JP MAKE_RDP_SCANCODE(0x5F, TRUE) /* JP SLEEP */ + +/* _not_ valid scancode, but this is what a windows PKBDLLHOOKSTRUCT for NumLock contains */ +#define RDP_SCANCODE_NUMLOCK_EXTENDED \ + MAKE_RDP_SCANCODE(0x45, TRUE) /* should be RDP_SCANCODE_NUMLOCK */ +#define RDP_SCANCODE_RSHIFT_EXTENDED \ + MAKE_RDP_SCANCODE(0x36, TRUE) /* should be RDP_SCANCODE_RSHIFT */ + +/* Audio */ +#define RDP_SCANCODE_VOLUME_MUTE MAKE_RDP_SCANCODE(0x20, TRUE) /* VK_VOLUME_MUTE */ +#define RDP_SCANCODE_VOLUME_DOWN MAKE_RDP_SCANCODE(0x2E, TRUE) /* VK_VOLUME_DOWN */ +#define RDP_SCANCODE_VOLUME_UP MAKE_RDP_SCANCODE(0x30, TRUE) /* VK_VOLUME_UP */ + +/* Media */ +#define RDP_SCANCODE_MEDIA_NEXT_TRACK MAKE_RDP_SCANCODE(0x19, TRUE) /* VK_MEDIA_NEXT_TRACK */ +#define RDP_SCANCODE_MEDIA_PREV_TRACK MAKE_RDP_SCANCODE(0x10, TRUE) /* VK_MEDIA_PREV_TRACK */ +#define RDP_SCANCODE_MEDIA_STOP MAKE_RDP_SCANCODE(0x24, TRUE) /* VK_MEDIA_MEDIA_STOP */ +#define RDP_SCANCODE_MEDIA_PLAY_PAUSE \ + MAKE_RDP_SCANCODE(0x22, TRUE) /* VK_MEDIA_MEDIA_PLAY_PAUSE \ + */ + +/* Browser functions */ +#define RDP_SCANCODE_BROWSER_BACK MAKE_RDP_SCANCODE(0x6A, TRUE) /* VK_BROWSER_BACK */ +#define RDP_SCANCODE_BROWSER_FORWARD MAKE_RDP_SCANCODE(0x69, TRUE) /* VK_BROWSER_FORWARD */ +#define RDP_SCANCODE_BROWSER_REFRESH MAKE_RDP_SCANCODE(0x67, TRUE) /* VK_BROWSER_REFRESH */ +#define RDP_SCANCODE_BROWSER_STOP MAKE_RDP_SCANCODE(0x68, TRUE) /* VK_BROWSER_STOP */ +#define RDP_SCANCODE_BROWSER_SEARCH MAKE_RDP_SCANCODE(0x65, TRUE) /* VK_BROWSER_SEARCH */ +#define RDP_SCANCODE_BROWSER_FAVORITES MAKE_RDP_SCANCODE(0x66, TRUE) /* VK_BROWSER_FAVORITES */ +#define RDP_SCANCODE_BROWSER_HOME MAKE_RDP_SCANCODE(0x32, TRUE) /* VK_BROWSER_HOME */ + +/* Misc. */ +#define RDP_SCANCODE_LAUNCH_MAIL MAKE_RDP_SCANCODE(0x6C, TRUE) /* VK_LAUNCH_MAIL */ + +#define RDP_SCANCODE_LAUNCH_MEDIA_SELECT \ + MAKE_RDP_SCANCODE(0x6D, TRUE) /* VK_LAUNCH_MEDIA_SELECT \ + */ +#define RDP_SCANCODE_LAUNCH_APP1 MAKE_RDP_SCANCODE(0x6E, TRUE) /* VK_LAUNCH_APP1 */ +#define RDP_SCANCODE_LAUNCH_APP2 MAKE_RDP_SCANCODE(0x6F, TRUE) /* VK_LAUNCH_APP2 */ + +#endif /* FREERDP_LOCALE_KEYBOARD_RDP_SCANCODE_H */ diff --git a/include/freerdp/secondary.h b/include/freerdp/secondary.h new file mode 100644 index 0000000..76ff13d --- /dev/null +++ b/include/freerdp/secondary.h @@ -0,0 +1,197 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Secondary Drawing Orders Interface API + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UPDATE_SECONDARY_H +#define FREERDP_UPDATE_SECONDARY_H + +#include <freerdp/types.h> +#include <freerdp/primary.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define GLYPH_FRAGMENT_NOP 0x00 +#define GLYPH_FRAGMENT_USE 0xFE +#define GLYPH_FRAGMENT_ADD 0xFF + +#define CBR2_HEIGHT_SAME_AS_WIDTH 0x01 +#define CBR2_PERSISTENT_KEY_PRESENT 0x02 +#define CBR2_NO_BITMAP_COMPRESSION_HDR 0x08 +#define CBR2_DO_NOT_CACHE 0x10 + +#define SCREEN_BITMAP_SURFACE 0xFFFF +#define BITMAP_CACHE_WAITING_LIST_INDEX 0x7FFF + +#define CACHED_BRUSH 0x80 + +#define BMF_1BPP 0x1 +#define BMF_8BPP 0x3 +#define BMF_16BPP 0x4 +#define BMF_24BPP 0x5 +#define BMF_32BPP 0x6 + +#ifndef _WIN32 +#define BS_SOLID 0x00 +#define BS_NULL 0x01 +#define BS_HATCHED 0x02 +#define BS_PATTERN 0x03 +#endif + +#ifndef _WIN32 +#define HS_HORIZONTAL 0x00 +#define HS_VERTICAL 0x01 +#define HS_FDIAGONAL 0x02 +#define HS_BDIAGONAL 0x03 +#define HS_CROSS 0x04 +#define HS_DIAGCROSS 0x05 +#endif + +#define SO_FLAG_DEFAULT_PLACEMENT 0x01 +#define SO_HORIZONTAL 0x02 +#define SO_VERTICAL 0x04 +#define SO_REVERSED 0x08 +#define SO_ZERO_BEARINGS 0x10 +#define SO_CHAR_INC_EQUAL_BM_BASE 0x20 +#define SO_MAXEXT_EQUAL_BM_SIDE 0x40 + +typedef struct +{ + UINT32 cacheId; + UINT32 bitmapBpp; + UINT32 bitmapWidth; + UINT32 bitmapHeight; + UINT32 bitmapLength; + UINT32 cacheIndex; + BOOL compressed; + BYTE bitmapComprHdr[8]; + BYTE* bitmapDataStream; +} CACHE_BITMAP_ORDER; + +typedef struct +{ + UINT32 cacheId; + UINT32 flags; + UINT32 key1; + UINT32 key2; + UINT32 bitmapBpp; + UINT32 bitmapWidth; + UINT32 bitmapHeight; + UINT32 bitmapLength; + UINT32 cacheIndex; + BOOL compressed; + UINT32 cbCompFirstRowSize; + UINT32 cbCompMainBodySize; + UINT32 cbScanWidth; + UINT32 cbUncompressedSize; + BYTE* bitmapDataStream; +} CACHE_BITMAP_V2_ORDER; + +typedef struct +{ + UINT32 bpp; + UINT32 codecID; + UINT32 width; + UINT32 height; + UINT32 length; + BYTE* data; +} BITMAP_DATA_EX; + +typedef struct +{ + UINT32 cacheId; + UINT32 bpp; + UINT32 flags; + UINT32 cacheIndex; + UINT32 key1; + UINT32 key2; + BITMAP_DATA_EX bitmapData; +} CACHE_BITMAP_V3_ORDER; + +typedef struct +{ + UINT32 cacheIndex; + UINT32 numberColors; + UINT32 colorTable[256]; +} CACHE_COLOR_TABLE_ORDER; + +typedef struct +{ + UINT32 cacheId; + UINT32 cGlyphs; + GLYPH_DATA glyphData[256]; + WCHAR* unicodeCharacters; +} CACHE_GLYPH_ORDER; + +typedef struct +{ + UINT32 cacheId; + UINT32 flags; + UINT32 cGlyphs; + GLYPH_DATA_V2 glyphData[256]; + WCHAR* unicodeCharacters; +} CACHE_GLYPH_V2_ORDER; + +typedef struct +{ + UINT32 index; + UINT32 bpp; + UINT32 cx; + UINT32 cy; + UINT32 style; + UINT32 length; + BYTE data[256]; +} CACHE_BRUSH_ORDER; + +typedef BOOL (*pCacheBitmap)(rdpContext* context, const CACHE_BITMAP_ORDER* cache_bitmap_order); +typedef BOOL (*pCacheBitmapV2)(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order); +typedef BOOL (*pCacheBitmapV3)(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3_order); +typedef BOOL (*pCacheColorTable)(rdpContext* context, + const CACHE_COLOR_TABLE_ORDER* cache_color_table_order); +typedef BOOL (*pCacheGlyph)(rdpContext* context, const CACHE_GLYPH_ORDER* cache_glyph_order); +typedef BOOL (*pCacheGlyphV2)(rdpContext* context, + const CACHE_GLYPH_V2_ORDER* cache_glyph_v2_order); +typedef BOOL (*pCacheBrush)(rdpContext* context, const CACHE_BRUSH_ORDER* cache_brush_order); +typedef BOOL (*pCacheOrderInfo)(rdpContext* context, INT16 orderLength, UINT16 extraFlags, + UINT8 orderType, const char* orderName); + +struct rdp_secondary_update +{ + rdpContext* context; /* 0 */ + UINT32 paddingA[16 - 1]; /* 1 */ + + pCacheBitmap CacheBitmap; /* 16 */ + pCacheBitmapV2 CacheBitmapV2; /* 17 */ + pCacheBitmapV3 CacheBitmapV3; /* 18 */ + pCacheColorTable CacheColorTable; /* 19 */ + pCacheGlyph CacheGlyph; /* 20 */ + pCacheGlyphV2 CacheGlyphV2; /* 21 */ + pCacheBrush CacheBrush; /* 22 */ + /* Statistics callback */ + pCacheOrderInfo CacheOrderInfo; /* 23 */ + UINT32 paddingE[32 - 24]; /* 24 */ +}; +typedef struct rdp_secondary_update rdpSecondaryUpdate; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UPDATE_SECONDARY_H */ diff --git a/include/freerdp/server/ainput.h b/include/freerdp/server/ainput.h new file mode 100644 index 0000000..21c47d6 --- /dev/null +++ b/include/freerdp/server/ainput.h @@ -0,0 +1,124 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * AInput Virtual Channel Extension + * + * Copyright 2022 Armin Novak <anovak@thincast.com> + * Copyright 2022 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_AINPUT_SERVER_H +#define FREERDP_CHANNEL_AINPUT_SERVER_H + +#include <freerdp/channels/wtsvc.h> +#include <freerdp/channels/ainput.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum AINPUT_SERVER_OPEN_RESULT + { + AINPUT_SERVER_OPEN_RESULT_OK = 0, + AINPUT_SERVER_OPEN_RESULT_CLOSED = 1, + AINPUT_SERVER_OPEN_RESULT_NOTSUPPORTED = 2, + AINPUT_SERVER_OPEN_RESULT_ERROR = 3 + } AINPUT_SERVER_OPEN_RESULT; + + typedef struct s_ainput_server_context ainput_server_context; + + typedef BOOL (*psAInputChannelIdAssigned)(ainput_server_context* context, UINT32 channelId); + + typedef UINT (*psAInputServerInitialize)(ainput_server_context* context, BOOL externalThread); + typedef UINT (*psAInputServerPoll)(ainput_server_context* context); + typedef BOOL (*psAInputServerChannelHandle)(ainput_server_context* context, HANDLE* handle); + + typedef UINT (*psAInputServerOpen)(ainput_server_context* context); + typedef UINT (*psAInputServerClose)(ainput_server_context* context); + typedef BOOL (*psAInputServerIsOpen)(ainput_server_context* context); + + typedef UINT (*psAInputServerOpenResult)(ainput_server_context* context, + AINPUT_SERVER_OPEN_RESULT result); + typedef UINT (*psAInputServerMouseEvent)(ainput_server_context* context, UINT64 timestamp, + UINT64 flags, INT32 x, INT32 y); + + struct s_ainput_server_context + { + HANDLE vcm; + + /* Server self-defined pointer. */ + void* data; + + /*** APIs called by the server. ***/ + /** + * Open the ainput channel. + */ + psAInputServerOpen Open; + + /** + * Optional: Set thread handling. + * When externalThread=TRUE the application is responsible to call + * ainput_server_context_poll periodically to process input events. + * + * Defaults to externalThread=FALSE + */ + psAInputServerInitialize Initialize; + + /** + * @brief Poll When externalThread=TRUE call periodically from your main loop. + * if externalThread=FALSE do not call. + */ + psAInputServerPoll Poll; + + /** + * @brief Poll When externalThread=TRUE call to get a handle to wait for events. + * Will return FALSE until the handle is available. + */ + psAInputServerChannelHandle ChannelHandle; + + /** + * Close the ainput channel. + */ + psAInputServerClose Close; + /** + * Status of the ainput channel. + */ + psAInputServerIsOpen IsOpen; + + /*** Callbacks registered by the server. ***/ + + /** + * Receive ainput mouse event PDU. + */ + psAInputServerMouseEvent MouseEvent; + + rdpContext* rdpcontext; + + /** + * Callback, when the channel got its id assigned. + */ + psAInputChannelIdAssigned ChannelIdAssigned; + }; + + FREERDP_API void ainput_server_context_free(ainput_server_context* context); + + WINPR_ATTR_MALLOC(ainput_server_context_free, 1) + FREERDP_API ainput_server_context* ainput_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_AINPUT_SERVER_H */ diff --git a/include/freerdp/server/audin.h b/include/freerdp/server/audin.h new file mode 100644 index 0000000..51d83fe --- /dev/null +++ b/include/freerdp/server/audin.h @@ -0,0 +1,179 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Server Audio Input Virtual Channel + * + * Copyright 2012 Vic Lee + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * Copyright 2023 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_AUDIN_SERVER_H +#define FREERDP_CHANNEL_AUDIN_SERVER_H + +#include <freerdp/config.h> + +#include <freerdp/channels/audin.h> +#include <freerdp/channels/wtsvc.h> + +#if !defined(CHANNEL_AUDIN_SERVER) +#error "This header must not be included if CHANNEL_AUDIN_SERVER is not defined" +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_audin_server_context audin_server_context; + + typedef BOOL (*psAudinServerChannelOpen)(audin_server_context* context); + typedef BOOL (*psAudinServerChannelIsOpen)(audin_server_context* context); + typedef BOOL (*psAudinServerChannelClose)(audin_server_context* context); + + typedef BOOL (*psAudinServerChannelIdAssigned)(audin_server_context* context, UINT32 channelId); + + typedef UINT (*psAudinServerVersion)(audin_server_context* context, + const SNDIN_VERSION* version); + typedef UINT (*psAudinServerFormats)(audin_server_context* context, + const SNDIN_FORMATS* formats); + typedef UINT (*psAudinServerOpen)(audin_server_context* context, const SNDIN_OPEN* open); + typedef UINT (*psAudinServerOpenReply)(audin_server_context* context, + const SNDIN_OPEN_REPLY* open_reply); + typedef UINT (*psAudinServerIncomingData)(audin_server_context* context, + const SNDIN_DATA_INCOMING* data_incoming); + typedef UINT (*psAudinServerData)(audin_server_context* context, const SNDIN_DATA* data); + typedef UINT (*psAudinServerFormatChange)(audin_server_context* context, + const SNDIN_FORMATCHANGE* format_change); + + struct s_audin_server_context + { + HANDLE vcm; + + /* Server self-defined pointer. */ + void* userdata; + + /** + * Server version to send to the client, when the DVC was successfully + * opened. + **/ + SNDIN_VERSION_Version serverVersion; + + /*** APIs called by the server. ***/ + + /** + * Open the audio input channel. + */ + psAudinServerChannelOpen Open; + + /** + * Check, whether the audio input channel thread was created + */ + psAudinServerChannelIsOpen IsOpen; + + /** + * Close the audio input channel. + */ + psAudinServerChannelClose Close; + + /** + * For the following server to client PDUs, + * the message header does not have to be set. + */ + + /** + * Send a Version PDU. + */ + psAudinServerVersion SendVersion; + + /** + * Send a Sound Formats PDU. + */ + psAudinServerFormats SendFormats; + + /** + * Send an Open PDU. + */ + psAudinServerOpen SendOpen; + + /** + * Send a Format Change PDU. + */ + psAudinServerFormatChange SendFormatChange; + + /*** Callbacks registered by the server. ***/ + + /** + * Callback, when the channel got its id assigned. + */ + psAudinServerChannelIdAssigned ChannelIdAssigned; + + /* + * Callback for the Version PDU. + */ + psAudinServerVersion ReceiveVersion; + + /* + * Callback for the Sound Formats PDU. + */ + psAudinServerFormats ReceiveFormats; + + /* + * Callback for the Open Reply PDU. + */ + psAudinServerOpenReply OpenReply; + + /* + * Callback for the Incoming Data PDU. + */ + psAudinServerIncomingData IncomingData; + + /* + * Callback for the Data PDU. + */ + psAudinServerData Data; + + /* + * Callback for the Format Change PDU. + */ + psAudinServerFormatChange ReceiveFormatChange; + + rdpContext* rdpcontext; + }; + + FREERDP_API void audin_server_context_free(audin_server_context* context); + + WINPR_ATTR_MALLOC(audin_server_context_free, 1) + FREERDP_API audin_server_context* audin_server_context_new(HANDLE vcm); + + /** \brief sets the supported audio formats for AUDIN server channel context. + * + * \param context The context to set the formats for + * \param count The number of formats found in \b formats. Use \b -1 to set to default formats + * supported by FreeRDP \param formats An array of \b count elements + * + * \return \b TRUE if successful and at least one format is supported, \b FALSE otherwise. + */ + FREERDP_API BOOL audin_server_set_formats(audin_server_context* context, SSIZE_T count, + const AUDIO_FORMAT* formats); + + FREERDP_API const AUDIO_FORMAT* + audin_server_get_negotiated_format(const audin_server_context* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_AUDIN_SERVER_H */ diff --git a/include/freerdp/server/channels.h b/include/freerdp/server/channels.h new file mode 100644 index 0000000..65b6b7f --- /dev/null +++ b/include/freerdp/server/channels.h @@ -0,0 +1,25 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Server Channels + * + * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNELS_SERVER_H +#define FREERDP_CHANNELS_SERVER_H + +#include <freerdp/api.h> + +#endif /* FREERDP_CHANNELS_SERVER_H */ diff --git a/include/freerdp/server/cliprdr.h b/include/freerdp/server/cliprdr.h new file mode 100644 index 0000000..77ebb00 --- /dev/null +++ b/include/freerdp/server/cliprdr.h @@ -0,0 +1,146 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Clipboard Virtual Channel Server Interface + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_CLIPRDR_SERVER_CLIPRDR_H +#define FREERDP_CHANNEL_CLIPRDR_SERVER_CLIPRDR_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/channels/wtsvc.h> + +#include <freerdp/channels/cliprdr.h> +#include <freerdp/client/cliprdr.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Server Interface + */ + + typedef struct s_cliprdr_server_context CliprdrServerContext; + + typedef UINT (*psCliprdrOpen)(CliprdrServerContext* context); + typedef UINT (*psCliprdrClose)(CliprdrServerContext* context); + typedef UINT (*psCliprdrStart)(CliprdrServerContext* context); + typedef UINT (*psCliprdrStop)(CliprdrServerContext* context); + typedef HANDLE (*psCliprdrGetEventHandle)(CliprdrServerContext* context); + typedef UINT (*psCliprdrCheckEventHandle)(CliprdrServerContext* context); + + typedef UINT (*psCliprdrServerCapabilities)(CliprdrServerContext* context, + const CLIPRDR_CAPABILITIES* capabilities); + typedef UINT (*psCliprdrClientCapabilities)(CliprdrServerContext* context, + const CLIPRDR_CAPABILITIES* capabilities); + typedef UINT (*psCliprdrMonitorReady)(CliprdrServerContext* context, + const CLIPRDR_MONITOR_READY* monitorReady); + typedef UINT (*psCliprdrTempDirectory)(CliprdrServerContext* context, + const CLIPRDR_TEMP_DIRECTORY* tempDirectory); + typedef UINT (*psCliprdrClientFormatList)(CliprdrServerContext* context, + const CLIPRDR_FORMAT_LIST* formatList); + typedef UINT (*psCliprdrServerFormatList)(CliprdrServerContext* context, + const CLIPRDR_FORMAT_LIST* formatList); + typedef UINT (*psCliprdrClientFormatListResponse)( + CliprdrServerContext* context, const CLIPRDR_FORMAT_LIST_RESPONSE* formatListResponse); + typedef UINT (*psCliprdrServerFormatListResponse)( + CliprdrServerContext* context, const CLIPRDR_FORMAT_LIST_RESPONSE* formatListResponse); + typedef UINT (*psCliprdrClientLockClipboardData)( + CliprdrServerContext* context, const CLIPRDR_LOCK_CLIPBOARD_DATA* lockClipboardData); + typedef UINT (*psCliprdrServerLockClipboardData)( + CliprdrServerContext* context, const CLIPRDR_LOCK_CLIPBOARD_DATA* lockClipboardData); + typedef UINT (*psCliprdrClientUnlockClipboardData)( + CliprdrServerContext* context, const CLIPRDR_UNLOCK_CLIPBOARD_DATA* unlockClipboardData); + typedef UINT (*psCliprdrServerUnlockClipboardData)( + CliprdrServerContext* context, const CLIPRDR_UNLOCK_CLIPBOARD_DATA* unlockClipboardData); + typedef UINT (*psCliprdrClientFormatDataRequest)( + CliprdrServerContext* context, const CLIPRDR_FORMAT_DATA_REQUEST* formatDataRequest); + typedef UINT (*psCliprdrServerFormatDataRequest)( + CliprdrServerContext* context, const CLIPRDR_FORMAT_DATA_REQUEST* formatDataRequest); + typedef UINT (*psCliprdrClientFormatDataResponse)( + CliprdrServerContext* context, const CLIPRDR_FORMAT_DATA_RESPONSE* formatDataResponse); + typedef UINT (*psCliprdrServerFormatDataResponse)( + CliprdrServerContext* context, const CLIPRDR_FORMAT_DATA_RESPONSE* formatDataResponse); + typedef UINT (*psCliprdrClientFileContentsRequest)( + CliprdrServerContext* context, const CLIPRDR_FILE_CONTENTS_REQUEST* fileContentsRequest); + typedef UINT (*psCliprdrServerFileContentsRequest)( + CliprdrServerContext* context, const CLIPRDR_FILE_CONTENTS_REQUEST* fileContentsRequest); + typedef UINT (*psCliprdrClientFileContentsResponse)( + CliprdrServerContext* context, const CLIPRDR_FILE_CONTENTS_RESPONSE* fileContentsResponse); + typedef UINT (*psCliprdrServerFileContentsResponse)( + CliprdrServerContext* context, const CLIPRDR_FILE_CONTENTS_RESPONSE* fileContentsResponse); + + struct s_cliprdr_server_context + { + void* handle; + void* custom; + + /* server clipboard capabilities - set by server - updated by the channel after client + * capability exchange */ + BOOL useLongFormatNames; + BOOL streamFileClipEnabled; + BOOL fileClipNoFilePaths; + BOOL canLockClipData; + + psCliprdrOpen Open; + psCliprdrClose Close; + psCliprdrStart Start; + psCliprdrStop Stop; + psCliprdrGetEventHandle GetEventHandle; + psCliprdrCheckEventHandle CheckEventHandle; + + psCliprdrServerCapabilities ServerCapabilities; + psCliprdrClientCapabilities ClientCapabilities; + psCliprdrMonitorReady MonitorReady; + psCliprdrTempDirectory TempDirectory; + psCliprdrClientFormatList ClientFormatList; + psCliprdrServerFormatList ServerFormatList; + psCliprdrClientFormatListResponse ClientFormatListResponse; + psCliprdrServerFormatListResponse ServerFormatListResponse; + psCliprdrClientLockClipboardData ClientLockClipboardData; + psCliprdrServerLockClipboardData ServerLockClipboardData; + psCliprdrClientUnlockClipboardData ClientUnlockClipboardData; + psCliprdrServerUnlockClipboardData ServerUnlockClipboardData; + psCliprdrClientFormatDataRequest ClientFormatDataRequest; + psCliprdrServerFormatDataRequest ServerFormatDataRequest; + psCliprdrClientFormatDataResponse ClientFormatDataResponse; + psCliprdrServerFormatDataResponse ServerFormatDataResponse; + psCliprdrClientFileContentsRequest ClientFileContentsRequest; + psCliprdrServerFileContentsRequest ServerFileContentsRequest; + psCliprdrClientFileContentsResponse ClientFileContentsResponse; + psCliprdrServerFileContentsResponse ServerFileContentsResponse; + + rdpContext* rdpcontext; + BOOL autoInitializationSequence; + UINT32 lastRequestedFormatId; + BOOL hasHugeFileSupport; + }; + + FREERDP_API void cliprdr_server_context_free(CliprdrServerContext* context); + + WINPR_ATTR_MALLOC(cliprdr_server_context_free, 1) + FREERDP_API CliprdrServerContext* cliprdr_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_CLIPRDR_SERVER_CLIPRDR_H */ diff --git a/include/freerdp/server/disp.h b/include/freerdp/server/disp.h new file mode 100644 index 0000000..d17c3c2 --- /dev/null +++ b/include/freerdp/server/disp.h @@ -0,0 +1,78 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDPEDISP Virtual Channel Extension + * + * Copyright 2019 Kobi Mizrachi <kmizrachi18@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_DISP_SERVER_DISP_H +#define FREERDP_CHANNEL_DISP_SERVER_DISP_H + +#include <freerdp/channels/disp.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_disp_server_private DispServerPrivate; + typedef struct s_disp_server_context DispServerContext; + + typedef BOOL (*psDispChannelIdAssigned)(DispServerContext* context, UINT32 channelId); + + typedef UINT (*psDispMonitorLayout)(DispServerContext* context, + const DISPLAY_CONTROL_MONITOR_LAYOUT_PDU* pdu); + typedef UINT (*psDispCaps)(DispServerContext* context); + typedef UINT (*psDispOpen)(DispServerContext* context); + typedef UINT (*psDispClose)(DispServerContext* context); + + struct s_disp_server_context + { + void* custom; + HANDLE vcm; + + /* Server capabilities */ + UINT32 MaxNumMonitors; + UINT32 MaxMonitorAreaFactorA; + UINT32 MaxMonitorAreaFactorB; + + psDispOpen Open; + psDispClose Close; + + psDispMonitorLayout DispMonitorLayout; + psDispCaps DisplayControlCaps; + + DispServerPrivate* priv; + rdpContext* rdpcontext; + + /** + * Callback, when the channel got its id assigned. + */ + psDispChannelIdAssigned ChannelIdAssigned; + }; + + FREERDP_API void disp_server_context_free(DispServerContext* context); + + WINPR_ATTR_MALLOC(disp_server_context_free, 1) + FREERDP_API DispServerContext* disp_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_DISP_SERVER_DISP_H */ diff --git a/include/freerdp/server/drdynvc.h b/include/freerdp/server/drdynvc.h new file mode 100644 index 0000000..09453f4 --- /dev/null +++ b/include/freerdp/server/drdynvc.h @@ -0,0 +1,63 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Dynamic Virtual Channel Extension + * + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_DRDYNVC_SERVER_DRDYNVC_H +#define FREERDP_CHANNEL_DRDYNVC_SERVER_DRDYNVC_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/channels/wtsvc.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Server Interface + */ + + typedef struct s_drdynvc_server_context DrdynvcServerContext; + typedef struct s_drdynvc_server_private DrdynvcServerPrivate; + + typedef UINT (*psDrdynvcStart)(DrdynvcServerContext* context); + typedef UINT (*psDrdynvcStop)(DrdynvcServerContext* context); + + struct s_drdynvc_server_context + { + HANDLE vcm; + + psDrdynvcStart Start; + psDrdynvcStop Stop; + + DrdynvcServerPrivate* priv; + }; + + FREERDP_API void drdynvc_server_context_free(DrdynvcServerContext* context); + + WINPR_ATTR_MALLOC(drdynvc_server_context_free, 1) + FREERDP_API DrdynvcServerContext* drdynvc_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_DRDYNVC_SERVER_DRDYNVC_H */ diff --git a/include/freerdp/server/echo.h b/include/freerdp/server/echo.h new file mode 100644 index 0000000..609d8c3 --- /dev/null +++ b/include/freerdp/server/echo.h @@ -0,0 +1,102 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Echo Virtual Channel Extension + * + * Copyright 2014 Vic Lee + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_ECHO_SERVER_H +#define FREERDP_CHANNEL_ECHO_SERVER_H + +#include <freerdp/channels/wtsvc.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum ECHO_SERVER_OPEN_RESULT + { + ECHO_SERVER_OPEN_RESULT_OK = 0, + ECHO_SERVER_OPEN_RESULT_CLOSED = 1, + ECHO_SERVER_OPEN_RESULT_NOTSUPPORTED = 2, + ECHO_SERVER_OPEN_RESULT_ERROR = 3 + } ECHO_SERVER_OPEN_RESULT; + + typedef struct s_echo_server_context echo_server_context; + + typedef BOOL (*psEchoServerChannelIdAssigned)(echo_server_context* context, UINT32 channelId); + + typedef UINT (*psEchoServerOpen)(echo_server_context* context); + typedef UINT (*psEchoServerClose)(echo_server_context* context); + typedef BOOL (*psEchoServerRequest)(echo_server_context* context, const BYTE* buffer, + UINT32 length); + + typedef UINT (*psEchoServerOpenResult)(echo_server_context* context, + ECHO_SERVER_OPEN_RESULT result); + typedef UINT (*psEchoServerResponse)(echo_server_context* context, const BYTE* buffer, + UINT32 length); + + struct s_echo_server_context + { + HANDLE vcm; + + /* Server self-defined pointer. */ + void* data; + + /*** APIs called by the server. ***/ + /** + * Open the echo channel. + */ + psEchoServerOpen Open; + /** + * Close the echo channel. + */ + psEchoServerClose Close; + /** + * Send echo request PDU. + */ + psEchoServerRequest Request; + + /*** Callbacks registered by the server. ***/ + /** + * Indicate whether the channel is opened successfully. + */ + psEchoServerOpenResult OpenResult; + /** + * Receive echo response PDU. + */ + psEchoServerResponse Response; + + rdpContext* rdpcontext; + + /** + * Callback, when the channel got its id assigned. + */ + psEchoServerChannelIdAssigned ChannelIdAssigned; + }; + + FREERDP_API void echo_server_context_free(echo_server_context* context); + + WINPR_ATTR_MALLOC(echo_server_context_free, 1) + FREERDP_API echo_server_context* echo_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_ECHO_SERVER_H */ diff --git a/include/freerdp/server/encomsp.h b/include/freerdp/server/encomsp.h new file mode 100644 index 0000000..534fd3e --- /dev/null +++ b/include/freerdp/server/encomsp.h @@ -0,0 +1,104 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Multiparty Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_ENCOMSP_SERVER_ENCOMSP_H +#define FREERDP_CHANNEL_ENCOMSP_SERVER_ENCOMSP_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/channels/wtsvc.h> + +#include <freerdp/channels/encomsp.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Server Interface + */ + + typedef struct s_encomsp_server_context EncomspServerContext; + typedef struct s_encomsp_server_private EncomspServerPrivate; + + typedef UINT (*psEncomspStart)(EncomspServerContext* context); + typedef UINT (*psEncomspStop)(EncomspServerContext* context); + + typedef UINT (*psEncomspFilterUpdated)(EncomspServerContext* context, + ENCOMSP_FILTER_UPDATED_PDU* filterUpdated); + typedef UINT (*psEncomspApplicationCreated)( + EncomspServerContext* context, ENCOMSP_APPLICATION_CREATED_PDU* applicationCreated); + typedef UINT (*psEncomspApplicationRemoved)( + EncomspServerContext* context, ENCOMSP_APPLICATION_REMOVED_PDU* applicationRemoved); + typedef UINT (*psEncomspWindowCreated)(EncomspServerContext* context, + ENCOMSP_WINDOW_CREATED_PDU* windowCreated); + typedef UINT (*psEncomspWindowRemoved)(EncomspServerContext* context, + ENCOMSP_WINDOW_REMOVED_PDU* windowRemoved); + typedef UINT (*psEncomspShowWindow)(EncomspServerContext* context, + ENCOMSP_SHOW_WINDOW_PDU* showWindow); + typedef UINT (*psEncomspParticipantCreated)( + EncomspServerContext* context, ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated); + typedef UINT (*psEncomspParticipantRemoved)( + EncomspServerContext* context, ENCOMSP_PARTICIPANT_REMOVED_PDU* participantRemoved); + typedef UINT (*psEncomspChangeParticipantControlLevel)( + EncomspServerContext* context, + ENCOMSP_CHANGE_PARTICIPANT_CONTROL_LEVEL_PDU* changeParticipantControlLevel); + typedef UINT (*psEncomspGraphicsStreamPaused)( + EncomspServerContext* context, ENCOMSP_GRAPHICS_STREAM_PAUSED_PDU* graphicsStreamPaused); + typedef UINT (*psEncomspGraphicsStreamResumed)( + EncomspServerContext* context, ENCOMSP_GRAPHICS_STREAM_RESUMED_PDU* graphicsStreamResumed); + + struct s_encomsp_server_context + { + HANDLE vcm; + void* custom; + + psEncomspStart Start; + psEncomspStop Stop; + + psEncomspFilterUpdated FilterUpdated; + psEncomspApplicationCreated ApplicationCreated; + psEncomspApplicationRemoved ApplicationRemoved; + psEncomspWindowCreated WindowCreated; + psEncomspWindowRemoved WindowRemoved; + psEncomspShowWindow ShowWindow; + psEncomspParticipantCreated ParticipantCreated; + psEncomspParticipantRemoved ParticipantRemoved; + psEncomspChangeParticipantControlLevel ChangeParticipantControlLevel; + psEncomspGraphicsStreamPaused GraphicsStreamPaused; + psEncomspGraphicsStreamResumed GraphicsStreamResumed; + + EncomspServerPrivate* priv; + + rdpContext* rdpcontext; + }; + + FREERDP_API void encomsp_server_context_free(EncomspServerContext* context); + + WINPR_ATTR_MALLOC(encomsp_server_context_free, 1) + FREERDP_API EncomspServerContext* encomsp_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_ENCOMSP_SERVER_ENCOMSP_H */ diff --git a/include/freerdp/server/gfxredir.h b/include/freerdp/server/gfxredir.h new file mode 100644 index 0000000..9e10cdf --- /dev/null +++ b/include/freerdp/server/gfxredir.h @@ -0,0 +1,103 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDPXXXX Remote App Graphics Redirection Virtual Channel Extension + * + * Copyright 2020 Microsoft + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_GFXREDIR_SERVER_GFXREDIR_H +#define FREERDP_CHANNEL_GFXREDIR_SERVER_GFXREDIR_H + +#include <freerdp/channels/gfxredir.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_gfxredir_server_private GfxRedirServerPrivate; + typedef struct s_gfxredir_server_context GfxRedirServerContext; + + typedef UINT (*psGfxRedirOpen)(GfxRedirServerContext* context); + typedef UINT (*psGfxRedirClose)(GfxRedirServerContext* context); + + typedef UINT (*psGfxRedirError)(GfxRedirServerContext* context, + const GFXREDIR_ERROR_PDU* error); + + typedef UINT (*psGfxRedirGraphicsRedirectionLegacyCaps)( + GfxRedirServerContext* context, const GFXREDIR_LEGACY_CAPS_PDU* graphicsCaps); + + typedef UINT (*psGfxRedirGraphicsRedirectionCapsAdvertise)( + GfxRedirServerContext* context, const GFXREDIR_CAPS_ADVERTISE_PDU* graphicsCapsAdvertise); + typedef UINT (*psGfxRedirGraphicsRedirectionCapsConfirm)( + GfxRedirServerContext* context, const GFXREDIR_CAPS_CONFIRM_PDU* graphicsCapsConfirm); + + typedef UINT (*psGfxRedirOpenPool)(GfxRedirServerContext* context, + const GFXREDIR_OPEN_POOL_PDU* openPool); + typedef UINT (*psGfxRedirClosePool)(GfxRedirServerContext* context, + const GFXREDIR_CLOSE_POOL_PDU* closePool); + + typedef UINT (*psGfxRedirCreateBuffer)(GfxRedirServerContext* context, + const GFXREDIR_CREATE_BUFFER_PDU* createBuffer); + typedef UINT (*psGfxRedirDestroyBuffer)(GfxRedirServerContext* context, + const GFXREDIR_DESTROY_BUFFER_PDU* destroyBuffer); + + typedef UINT (*psGfxRedirPresentBuffer)(GfxRedirServerContext* context, + const GFXREDIR_PRESENT_BUFFER_PDU* presentBuffer); + typedef UINT (*psGfxRedirPresentBufferAck)( + GfxRedirServerContext* context, const GFXREDIR_PRESENT_BUFFER_ACK_PDU* presentBufferAck); + + struct s_gfxredir_server_context + { + void* custom; + HANDLE vcm; + + psGfxRedirOpen Open; + psGfxRedirClose Close; + + psGfxRedirError Error; + + psGfxRedirGraphicsRedirectionLegacyCaps GraphicsRedirectionLegacyCaps; + + psGfxRedirGraphicsRedirectionCapsAdvertise GraphicsRedirectionCapsAdvertise; + psGfxRedirGraphicsRedirectionCapsConfirm GraphicsRedirectionCapsConfirm; + + psGfxRedirOpenPool OpenPool; + psGfxRedirClosePool ClosePool; + + psGfxRedirCreateBuffer CreateBuffer; + psGfxRedirDestroyBuffer DestroyBuffer; + + psGfxRedirPresentBuffer PresentBuffer; + psGfxRedirPresentBufferAck PresentBufferAck; + + GfxRedirServerPrivate* priv; + rdpContext* rdpcontext; + + UINT32 confirmedCapsVersion; + }; + + WINPR_ATTR_MALLOC(gfxredir_server_context_free, 1) + FREERDP_API GfxRedirServerContext* gfxredir_server_context_new(HANDLE vcm); + FREERDP_API void gfxredir_server_context_free(GfxRedirServerContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_GFXREDIR_SERVER_GFXREDIR_H */ diff --git a/include/freerdp/server/location.h b/include/freerdp/server/location.h new file mode 100644 index 0000000..8078878 --- /dev/null +++ b/include/freerdp/server/location.h @@ -0,0 +1,142 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Location Virtual Channel Extension + * + * Copyright 2023 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_LOCATION_SERVER_LOCATION_H +#define FREERDP_CHANNEL_LOCATION_SERVER_LOCATION_H + +#include <freerdp/channels/location.h> +#include <freerdp/channels/wtsvc.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_location_server_context LocationServerContext; + + typedef UINT (*psLocationServerOpen)(LocationServerContext* context); + typedef UINT (*psLocationServerClose)(LocationServerContext* context); + + typedef BOOL (*psLocationServerChannelIdAssigned)(LocationServerContext* context, + UINT32 channelId); + + typedef UINT (*psLocationServerInitialize)(LocationServerContext* context, BOOL externalThread); + typedef UINT (*psLocationServerPoll)(LocationServerContext* context); + typedef BOOL (*psLocationServerChannelHandle)(LocationServerContext* context, HANDLE* handle); + + typedef UINT (*psLocationServerServerReady)(LocationServerContext* context, + const RDPLOCATION_SERVER_READY_PDU* serverReady); + typedef UINT (*psLocationServerClientReady)(LocationServerContext* context, + const RDPLOCATION_CLIENT_READY_PDU* clientReady); + + typedef UINT (*psLocationServerBaseLocation3D)( + LocationServerContext* context, const RDPLOCATION_BASE_LOCATION3D_PDU* baseLocation3D); + typedef UINT (*psLocationServerLocation2DDelta)( + LocationServerContext* context, const RDPLOCATION_LOCATION2D_DELTA_PDU* location2DDelta); + typedef UINT (*psLocationServerLocation3DDelta)( + LocationServerContext* context, const RDPLOCATION_LOCATION3D_DELTA_PDU* location3DDelta); + + struct s_location_server_context + { + HANDLE vcm; + + /* Server self-defined pointer. */ + void* userdata; + + /*** APIs called by the server. ***/ + + /** + * Optional: Set thread handling. + * When externalThread=TRUE, the application is responsible to call + * Poll() periodically to process channel events. + * + * Defaults to externalThread=FALSE + */ + psLocationServerInitialize Initialize; + + /** + * Open the location channel. + */ + psLocationServerOpen Open; + + /** + * Close the location channel. + */ + psLocationServerClose Close; + + /** + * Poll + * When externalThread=TRUE, call Poll() periodically from your main loop. + * If externalThread=FALSE do not call. + */ + psLocationServerPoll Poll; + + /** + * Retrieve the channel handle for use in conjunction with Poll(). + * If externalThread=FALSE do not call. + */ + psLocationServerChannelHandle ChannelHandle; + + /* All PDUs sent by the server don't require the header to be set */ + + /* + * Send a ServerReady PDU. + */ + psLocationServerServerReady ServerReady; + + /*** Callbacks registered by the server. ***/ + + /** + * Callback, when the channel got its id assigned. + */ + psLocationServerChannelIdAssigned ChannelIdAssigned; + + /** + * Callback for the ClientReady PDU. + */ + psLocationServerClientReady ClientReady; + + /** + * Callback for the BaseLocation3D PDU. + */ + psLocationServerBaseLocation3D BaseLocation3D; + + /** + * Callback for the Location2DDelta PDU. + */ + psLocationServerLocation2DDelta Location2DDelta; + + /** + * Callback for the Location3DDelta PDU. + */ + psLocationServerLocation3DDelta Location3DDelta; + + rdpContext* rdpcontext; + }; + + FREERDP_API void location_server_context_free(LocationServerContext* context); + + WINPR_ATTR_MALLOC(location_server_context_free, 1) + FREERDP_API LocationServerContext* location_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_LOCATION_SERVER_LOCATION_H */ diff --git a/include/freerdp/server/proxy/proxy_config.h b/include/freerdp/server/proxy/proxy_config.h new file mode 100644 index 0000000..237fdf3 --- /dev/null +++ b/include/freerdp/server/proxy/proxy_config.h @@ -0,0 +1,235 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Proxy Server + * + * Copyright 2021-2023 Armin Novak <armin.novak@thincast.com> + * Copyright 2021-2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FREERDP_SERVER_PROXY_CONFIG_H +#define FREERDP_SERVER_PROXY_CONFIG_H + +#include <winpr/wtypes.h> +#include <winpr/ini.h> + +#include <freerdp/api.h> +#include <freerdp/server/proxy/proxy_modules_api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct proxy_config proxyConfig; + + struct proxy_config + { + /* server */ + char* Host; + UINT16 Port; + + /* target */ + BOOL FixedTarget; + char* TargetHost; + UINT16 TargetPort; + char* TargetUser; + char* TargetDomain; + char* TargetPassword; + + /* input */ + BOOL Keyboard; + BOOL Mouse; + BOOL Multitouch; + + /* server security */ + BOOL ServerTlsSecurity; + BOOL ServerRdpSecurity; + BOOL ServerNlaSecurity; + + /* client security */ + BOOL ClientNlaSecurity; + BOOL ClientTlsSecurity; + BOOL ClientRdpSecurity; + BOOL ClientAllowFallbackToTls; + + /* channels */ + BOOL GFX; + BOOL DisplayControl; + BOOL Clipboard; + BOOL AudioOutput; + BOOL AudioInput; + BOOL RemoteApp; + BOOL DeviceRedirection; + BOOL VideoRedirection; + BOOL CameraRedirection; + + BOOL PassthroughIsBlacklist; + char** Passthrough; + size_t PassthroughCount; + char** Intercept; + size_t InterceptCount; + + /* clipboard specific settings */ + BOOL TextOnly; + UINT32 MaxTextLength; + + /* gfx settings */ + BOOL DecodeGFX; + + /* modules */ + char** Modules; /* module file names to load */ + size_t ModulesCount; + + char** RequiredPlugins; /* required plugin names */ + size_t RequiredPluginsCount; + + char* CertificateFile; + char* CertificateContent; + + char* PrivateKeyFile; + char* PrivateKeyContent; + + /* Data extracted from CertificateContent or CertificateFile (evaluation in this order) */ + char* CertificatePEM; + size_t CertificatePEMLength; + + /* Data extracted from PrivateKeyContent or PrivateKeyFile (evaluation in this order) */ + char* PrivateKeyPEM; + size_t PrivateKeyPEMLength; + + wIniFile* ini; + + /* target continued */ + UINT32 TargetTlsSecLevel; + }; + + /** + * @brief pf_server_config_dump Dumps a default INI configuration file + * @param file The file to write to. Existing files are truncated. + * @return TRUE for success, FALSE if the file could not be written. + */ + FREERDP_API BOOL pf_server_config_dump(const char* file); + + /** + * @brief server_config_load_ini Create a proxyConfig from a already loaded + * INI file. + * + * @param ini A pointer to the parsed INI file. Must NOT be NULL. + * + * @return A proxyConfig or NULL in case of failure. + */ + FREERDP_API proxyConfig* server_config_load_ini(wIniFile* ini); + /** + * @brief pf_server_config_load_file Create a proxyConfig from a INI file found at path. + * + * @param path The path of the INI file + * + * @return A proxyConfig or NULL in case of failure. + */ + FREERDP_API proxyConfig* pf_server_config_load_file(const char* path); + + /** + * @brief pf_server_config_load_buffer Create a proxyConfig from a memory string buffer in INI + * file format + * + * @param buffer A pointer to the '\0' terminated INI string. + * + * @return A proxyConfig or NULL in case of failure. + */ + FREERDP_API proxyConfig* pf_server_config_load_buffer(const char* buffer); + + /** + * @brief pf_server_config_print Print the configuration to stdout + * + * @param config A pointer to the configuration to print. Must NOT be NULL. + */ + FREERDP_API void pf_server_config_print(const proxyConfig* config); + + /** + * @brief pf_server_config_free Releases all resources associated with proxyConfig + * + * @param config A pointer to the proxyConfig to clean up. Might be NULL. + */ + FREERDP_API void pf_server_config_free(proxyConfig* config); + + /** + * @brief pf_config_required_plugins_count + * + * @param config A pointer to the proxyConfig. Must NOT be NULL. + * + * @return The number of required plugins configured. + */ + FREERDP_API size_t pf_config_required_plugins_count(const proxyConfig* config); + + /** + * @brief pf_config_required_plugin + * @param config A pointer to the proxyConfig. Must NOT be NULL. + * @param index The index of the plugin to return + * + * @return The name of the plugin or NULL. + */ + FREERDP_API const char* pf_config_required_plugin(const proxyConfig* config, size_t index); + + /** + * @brief pf_config_modules_count + * + * @param config A pointer to the proxyConfig. Must NOT be NULL. + * + * @return The number of proxy modules configured. + */ + FREERDP_API size_t pf_config_modules_count(const proxyConfig* config); + + /** + * @brief pf_config_modules + * @param config A pointer to the proxyConfig. Must NOT be NULL. + * + * @return An array of strings of size pf_config_modules_count with the module names. + */ + FREERDP_API const char** pf_config_modules(const proxyConfig* config); + + /** + * @brief pf_config_clone Create a copy of the configuration + * @param dst A pointer that receives the newly allocated copy + * @param config The source configuration to copy + * + * @return TRUE for success, FALSE otherwise + */ + FREERDP_API BOOL pf_config_clone(proxyConfig** dst, const proxyConfig* config); + + /** + * @brief pf_config_plugin Register a proxy plugin handling event filtering + * defined in the configuration. + * + * @param plugins_manager The plugin manager + * @param userdata A proxyConfig* to use as reference + * + * @return TRUE for success, FALSE for failure + */ + FREERDP_API BOOL pf_config_plugin(proxyPluginsManager* plugins_manager, void* userdata); + + /** + * @brief pf_config_get get a value for a section/key + * @param config A pointer to the proxyConfig. Must NOT be NULL. + * @param section The name of the section the key is in, must not be \b NULL + * @param key The name of the key to look for. Must not be \b NULL + * + * @return A pointer to the value for \b section/key or \b NULL if not found + */ + FREERDP_API const char* pf_config_get(const proxyConfig* config, const char* section, + const char* key); + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_SERVER_PROXY_CONFIG_H */ diff --git a/include/freerdp/server/proxy/proxy_context.h b/include/freerdp/server/proxy/proxy_context.h new file mode 100644 index 0000000..0132c66 --- /dev/null +++ b/include/freerdp/server/proxy/proxy_context.h @@ -0,0 +1,186 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Proxy Server + * + * Copyright 2019 Mati Shabtay <matishabtay@gmail.com> + * Copyright 2019 Kobi Mizrachi <kmizrachi18@gmail.com> + * Copyright 2019 Idan Freiberg <speidy@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SERVER_PROXY_PFCONTEXT_H +#define FREERDP_SERVER_PROXY_PFCONTEXT_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/freerdp.h> +#include <freerdp/channels/wtsvc.h> + +#include <freerdp/server/proxy/proxy_config.h> +#include <freerdp/server/proxy/proxy_types.h> + +#define PROXY_SESSION_ID_LENGTH 32 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct proxy_data proxyData; + typedef struct proxy_module proxyModule; + typedef struct p_server_static_channel_context pServerStaticChannelContext; + + typedef struct s_InterceptContextMapEntry + { + void (*free)(struct s_InterceptContextMapEntry*); + } InterceptContextMapEntry; + + /* All proxy interception channels derive from this base struct + * and set their cleanup function accordingly. */ + FREERDP_API void intercept_context_entry_free(void* obj); + typedef PfChannelResult (*proxyChannelDataFn)(proxyData* pdata, + const pServerStaticChannelContext* channel, + const BYTE* xdata, size_t xsize, UINT32 flags, + size_t totalSizepServer); + typedef void (*proxyChannelContextDtor)(void* context); + + /** @brief per channel configuration */ + struct p_server_static_channel_context + { + char* channel_name; + UINT32 front_channel_id; + UINT32 back_channel_id; + pf_utils_channel_mode channelMode; + proxyChannelDataFn onFrontData; + proxyChannelDataFn onBackData; + proxyChannelContextDtor contextDtor; + void* context; + }; + + void StaticChannelContext_free(pServerStaticChannelContext* ctx); + + /** + * Wraps rdpContext and holds the state for the proxy's server. + */ + struct p_server_context + { + rdpContext context; + + proxyData* pdata; + + HANDLE vcm; + HANDLE dynvcReady; + + wHashTable* interceptContextMap; + wHashTable* channelsByFrontId; + wHashTable* channelsByBackId; + }; + typedef struct p_server_context pServerContext; + + WINPR_ATTR_MALLOC(StaticChannelContext_free, 1) + pServerStaticChannelContext* StaticChannelContext_new(pServerContext* ps, const char* name, + UINT32 id); + + /** + * Wraps rdpContext and holds the state for the proxy's client. + */ + typedef struct p_client_context pClientContext; + + struct p_client_context + { + rdpContext context; + + proxyData* pdata; + + /* + * In a case when freerdp_connect fails, + * Used for NLA fallback feature, to check if the server should close the connection. + * When it is set to TRUE, proxy's client knows it shouldn't signal the server thread to + * closed the connection when pf_client_post_disconnect is called, because it is trying to + * connect reconnect without NLA. It must be set to TRUE before the first try, and to FALSE + * after the connection fully established, to ensure graceful shutdown of the connection + * when it will be closed. + */ + BOOL allow_next_conn_failure; + + BOOL connected; /* Set after client post_connect. */ + + pReceiveChannelData client_receive_channel_data_original; + wQueue* cached_server_channel_data; + BOOL (*sendChannelData)(pClientContext* pc, const proxyChannelDataEventInfo* ev); + + /* X509 specific */ + char* remote_hostname; + wStream* remote_pem; + UINT16 remote_port; + UINT32 remote_flags; + + BOOL input_state_sync_pending; + UINT32 input_state; + + wHashTable* interceptContextMap; + UINT32 computerNameLen; + BOOL computerNameUnicode; + union + { + WCHAR* wc; + char* c; + void* v; + } computerName; + }; + + /** + * Holds data common to both sides of a proxy's session. + */ + struct proxy_data + { + proxyModule* module; + const proxyConfig* config; + + pServerContext* ps; + pClientContext* pc; + + HANDLE abort_event; + HANDLE client_thread; + HANDLE gfx_server_ready; + + char session_id[PROXY_SESSION_ID_LENGTH + 1]; + + /* used to external modules to store per-session info */ + wHashTable* modules_info; + psPeerReceiveChannelData server_receive_channel_data_original; + }; + + FREERDP_API BOOL pf_context_copy_settings(rdpSettings* dst, const rdpSettings* src); + FREERDP_API BOOL pf_context_init_server_context(freerdp_peer* client); + + WINPR_ATTR_MALLOC(freerdp_client_context_free, 1) + FREERDP_API pClientContext* pf_context_create_client_context(const rdpSettings* clientSettings); + + FREERDP_API void proxy_data_free(proxyData* pdata); + + WINPR_ATTR_MALLOC(proxy_data_free, 1) + FREERDP_API proxyData* proxy_data_new(void); + FREERDP_API void proxy_data_set_client_context(proxyData* pdata, pClientContext* context); + FREERDP_API void proxy_data_set_server_context(proxyData* pdata, pServerContext* context); + + FREERDP_API BOOL proxy_data_shall_disconnect(proxyData* pdata); + FREERDP_API void proxy_data_abort_connect(proxyData* pdata); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SERVER_PROXY_PFCONTEXT_H */ diff --git a/include/freerdp/server/proxy/proxy_log.h b/include/freerdp/server/proxy/proxy_log.h new file mode 100644 index 0000000..3f3be2c --- /dev/null +++ b/include/freerdp/server/proxy/proxy_log.h @@ -0,0 +1,53 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Proxy Server + * + * Copyright 2019 Mati Shabtay <matishabtay@gmail.com> + * Copyright 2019 Kobi Mizrachi <kmizrachi18@gmail.com> + * Copyright 2019 Idan Freiberg <speidy@gmail.com> + * Copyright 2021 Armin Novak <anovak@thincast.com> + * Copyright 2021 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SERVER_PROXY_LOG_H +#define FREERDP_SERVER_PROXY_LOG_H + +#include <winpr/wlog.h> +#include <freerdp/log.h> + +#define PROXY_TAG(tag) FREERDP_TAG("proxy." tag) + +/* + * log format in proxy is: + * "[SessionID=%s]: Log message" + * SessionID is optional, but if they should be written to the log, + * that's the format. + */ + +/* log macros that prepends session id and function name tp the log message */ +#define PROXY_LOG_INFO(_tag, _context, _format, ...) \ + WLog_INFO(TAG, "[SessionID=%s]: " _format, \ + (_context && _context->pdata) ? _context->pdata->session_id : "null", ##__VA_ARGS__) +#define PROXY_LOG_ERR(_tag, _context, _format, ...) \ + WLog_ERR(TAG, "[SessionID=%s]: " _format, \ + (_context && _context->pdata) ? _context->pdata->session_id : "null", ##__VA_ARGS__) +#define PROXY_LOG_DBG(_tag, _context, _format, ...) \ + WLog_DBG(TAG, "[SessionID=%s]: " _format, \ + (_context && _context->pdata) ? _context->pdata->session_id : "null", ##__VA_ARGS__) +#define PROXY_LOG_WARN(_tag, _context, _format, ...) \ + WLog_WARN(TAG, "[SessionID=%s]: " _format, \ + (_context && _context->pdata) ? _context->pdata->session_id : "null", ##__VA_ARGS__) + +#endif /* FREERDP_SERVER_PROXY_LOG_H */ diff --git a/include/freerdp/server/proxy/proxy_modules_api.h b/include/freerdp/server/proxy/proxy_modules_api.h new file mode 100644 index 0000000..1887f90 --- /dev/null +++ b/include/freerdp/server/proxy/proxy_modules_api.h @@ -0,0 +1,241 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Proxy Server + * + * Copyright 2019 Kobi Mizrachi <kmizrachi18@gmail.com> + * Copyright 2019 Idan Freiberg <speidy@gmail.com> + * Copyright 2021 Armin Novak <anovak@thincast.com> + * Copyright 2021 Thincast Technologies GmbH + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SERVER_PROXY_MODULES_API_H +#define FREERDP_SERVER_PROXY_MODULES_API_H + +#include <winpr/winpr.h> +#include <winpr/stream.h> +#include <winpr/sspi.h> + +#include <freerdp/server/proxy/proxy_types.h> + +#define MODULE_TAG(module) "proxy.modules." module + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct proxy_data proxyData; + typedef struct proxy_module proxyModule; + typedef struct proxy_plugin proxyPlugin; + typedef struct proxy_plugins_manager proxyPluginsManager; + + /* hook callback. should return TRUE on success or FALSE on error. */ + typedef BOOL (*proxyHookFn)(proxyPlugin*, proxyData*, void*); + + /* + * Filter callback: + * It MUST return TRUE if the related event should be proxied, + * or FALSE if it should be ignored. + */ + typedef BOOL (*proxyFilterFn)(proxyPlugin*, proxyData*, void*); + + /* describes a plugin: name, description and callbacks to execute. + * + * This is public API, so always add new fields at the end of the struct to keep + * some backward compatibility. + */ + struct proxy_plugin + { + const char* name; /* 0: unique module name */ + const char* description; /* 1: module description */ + + UINT64 reserved1[32 - 2]; /* 2-32 */ + + BOOL (*PluginUnload)(proxyPlugin* plugin); /* 33 */ + UINT64 reserved2[66 - 34]; /* 34 - 65 */ + + /* proxy hooks. a module can set these function pointers to register hooks */ + proxyHookFn ClientInitConnect; /* 66 custom=rdpContext* */ + proxyHookFn ClientUninitConnect; /* 67 custom=rdpContext* */ + proxyHookFn ClientPreConnect; /* 68 custom=rdpContext* */ + proxyHookFn ClientPostConnect; /* 69 custom=rdpContext* */ + proxyHookFn ClientPostDisconnect; /* 70 custom=rdpContext* */ + proxyHookFn ClientX509Certificate; /* 71 custom=rdpContext* */ + proxyHookFn ClientLoginFailure; /* 72 custom=rdpContext* */ + proxyHookFn ClientEndPaint; /* 73 custom=rdpContext* */ + proxyHookFn ClientRedirect; /* 74 custom=rdpContext* */ + proxyHookFn ClientLoadChannels; /* 75 custom=rdpContext* */ + UINT64 reserved3[96 - 76]; /* 76-95 */ + + proxyHookFn ServerPostConnect; /* 96 custom=freerdp_peer* */ + proxyHookFn ServerPeerActivate; /* 97 custom=freerdp_peer* */ + proxyHookFn ServerChannelsInit; /* 98 custom=freerdp_peer* */ + proxyHookFn ServerChannelsFree; /* 99 custom=freerdp_peer* */ + proxyHookFn ServerSessionEnd; /* 100 custom=freerdp_peer* */ + proxyHookFn ServerSessionInitialize; /* 101 custom=freerdp_peer* */ + proxyHookFn ServerSessionStarted; /* 102 custom=freerdp_peer* */ + + UINT64 reserved4[128 - 103]; /* 103 - 127 */ + + /* proxy filters. a module can set these function pointers to register filters */ + proxyFilterFn KeyboardEvent; /* 128 */ + proxyFilterFn MouseEvent; /* 129 */ + proxyFilterFn ClientChannelData; /* 130 passthrough channels data */ + proxyFilterFn ServerChannelData; /* 131 passthrough channels data */ + proxyFilterFn DynamicChannelCreate; /* 132 passthrough drdynvc channel create data */ + proxyFilterFn ServerFetchTargetAddr; /* 133 */ + proxyFilterFn ServerPeerLogon; /* 134 */ + proxyFilterFn ChannelCreate; /* 135 passthrough drdynvc channel create data */ + proxyFilterFn UnicodeEvent; /* 136 */ + proxyFilterFn MouseExEvent; /* 137 */ + + /* proxy dynamic channel filters: + * + * - a function that returns the list of channels to intercept + * - a function to call with the data received + */ + proxyFilterFn DynChannelToIntercept; /* 138 */ + proxyFilterFn DynChannelIntercept; /* 139 */ + proxyFilterFn StaticChannelToIntercept; /* 140 */ + UINT64 reserved5[160 - 141]; /* 141-159 */ + + /* Runtime data fields */ + proxyPluginsManager* mgr; /* 160 */ /** Set during plugin registration */ + void* userdata; /* 161 */ /** Custom data provided with RegisterPlugin, memory managed + outside of plugin. */ + void* custom; /* 162 */ /** Custom configuration data, must be allocated in RegisterPlugin + and freed in PluginUnload */ + + UINT64 reserved6[192 - 163]; /* 163-191 Add some filler data to allow for new callbacks or + * fields without breaking API */ + }; + + /* + * Main API for use by external modules. + * Supports: + * - Registering a plugin. + * - Setting/getting plugin's per-session specific data. + * - Aborting a session. + */ + struct proxy_plugins_manager + { + /* 0 used for registering a fresh new proxy plugin. */ + BOOL (*RegisterPlugin)(struct proxy_plugins_manager* mgr, const proxyPlugin* plugin); + + /* 1 used for setting plugin's per-session info. */ + BOOL (*SetPluginData)(struct proxy_plugins_manager* mgr, const char*, proxyData*, void*); + + /* 2 used for getting plugin's per-session info. */ + void* (*GetPluginData)(struct proxy_plugins_manager* mgr, const char*, proxyData*); + + /* 3 used for aborting a session. */ + void (*AbortConnect)(struct proxy_plugins_manager* mgr, proxyData*); + + UINT64 reserved[128 - 4]; /* 4-127 reserved fields */ + }; + + typedef BOOL (*proxyModuleEntryPoint)(proxyPluginsManager* plugins_manager, void* userdata); + +/* filter events parameters */ +#define WINPR_PACK_PUSH +#include <winpr/pack.h> +typedef struct proxy_keyboard_event_info +{ + UINT16 flags; + UINT16 rdp_scan_code; +} proxyKeyboardEventInfo; + +typedef struct proxy_unicode_event_info +{ + UINT16 flags; + UINT16 code; +} proxyUnicodeEventInfo; + +typedef struct proxy_mouse_event_info +{ + UINT16 flags; + UINT16 x; + UINT16 y; +} proxyMouseEventInfo; + +typedef struct proxy_mouse_ex_event_info +{ + UINT16 flags; + UINT16 x; + UINT16 y; +} proxyMouseExEventInfo; + +typedef struct +{ + /* channel metadata */ + const char* channel_name; + UINT16 channel_id; + + /* actual data */ + const BYTE* data; + size_t data_len; + size_t total_size; + UINT32 flags; +} proxyChannelDataEventInfo; + +typedef struct +{ + /* out values */ + char* target_address; + UINT16 target_port; + + /* + * If this value is set to true by a plugin, target info will be fetched from config and proxy + * will connect any client to the same remote server. + */ + ProxyFetchTargetMethod fetch_method; +} proxyFetchTargetEventInfo; + +typedef struct server_peer_logon +{ + const SEC_WINNT_AUTH_IDENTITY* identity; + BOOL automatic; +} proxyServerPeerLogon; + +typedef struct dyn_channel_intercept_data +{ + const char* name; + UINT32 channelId; + wStream* data; + BOOL isBackData; + BOOL first; + BOOL last; + BOOL rewritten; + size_t packetSize; + PfChannelResult result; +} proxyDynChannelInterceptData; + +typedef struct dyn_channel_to_intercept_data +{ + const char* name; + UINT32 channelId; + BOOL intercept; +} proxyChannelToInterceptData; + +#define WINPR_PACK_POP +#include <winpr/pack.h> + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SERVER_PROXY_MODULES_API_H */ diff --git a/include/freerdp/server/proxy/proxy_server.h b/include/freerdp/server/proxy/proxy_server.h new file mode 100644 index 0000000..39e738f --- /dev/null +++ b/include/freerdp/server/proxy/proxy_server.h @@ -0,0 +1,115 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Proxy Server + * + * Copyright 2021 Armin Novak <armin.novak@thincast.com> + * Copyright 2021 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FREERDP_SERVER_PROXY_SERVER_H +#define FREERDP_SERVER_PROXY_SERVER_H + +#include <freerdp/api.h> +#include <freerdp/server/proxy/proxy_config.h> +#include <freerdp/server/proxy/proxy_modules_api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct proxy_server proxyServer; + + /** + * @brief pf_server_free Cleans up a (stopped) proxy server instance. + * + * @param server The proxy server to clean up. Might be NULL. + */ + FREERDP_API void pf_server_free(proxyServer* server); + + /** + * @brief pf_server_new Creates a new proxy server instance + * + * @param config The proxy server configuration to use. Must NOT be NULL. + * + * @return A new proxy server instance or NULL on failure. + */ + WINPR_ATTR_MALLOC(pf_server_free, 1) + FREERDP_API proxyServer* pf_server_new(const proxyConfig* config); + + /** + * @brief pf_server_add_module Allows registering proxy modules that are + * build-in instead of shipped as separate + * module loaded at runtime. + * + * @param server A proxy instance to add the module to. Must NOT be NULL + * @param ep The proxy entry function to add. Must NOT be NULL + * @param userdata Custom data for the module. May be NULL + * + * @return TRUE for success, FALSE otherwise. + */ + FREERDP_API BOOL pf_server_add_module(proxyServer* server, proxyModuleEntryPoint ep, + void* userdata); + + /** + * @brief pf_server_start Starts the proxy, binding the configured port. + * + * @param server The server instance. Must NOT be NULL. + * + * @return TRUE for success, FALSE on error + */ + FREERDP_API BOOL pf_server_start(proxyServer* server); + + /** + * @brief pf_server_start_from_socket Starts the proxy using an existing bound socket + * + * @param server The server instance. Must NOT be NULL. + * @param socket The bound socket to wait for events on. + * + * @return TRUE for success, FALSE on error + */ + FREERDP_API BOOL pf_server_start_from_socket(proxyServer* server, int socket); + + /** + * @brief pf_server_start_with_peer_socket Use existing peer socket + * + * @param server The server instance. Must NOT be NULL. + * @param socket Ready to use peer socket + * + * @return TRUE for success, FALSE on error + */ + FREERDP_API BOOL pf_server_start_with_peer_socket(proxyServer* server, int socket); + + /** + * @brief pf_server_stop Stops a server instance asynchronously. + * Can be called from any thread to stop a running server instance. + * @param server A pointer to the server instance to stop. May be NULL. + */ + FREERDP_API void pf_server_stop(proxyServer* server); + + /** + * @brief pf_server_run This (blocking) function runs the main loop of the + * proxy. + * + * @param server The server instance. Must NOT be NULL. + * + * @return TRUE for successful termination, FALSE otherwise. + */ + FREERDP_API BOOL pf_server_run(proxyServer* server); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SERVER_PROXY_SERVER_H */ diff --git a/include/freerdp/server/proxy/proxy_types.h b/include/freerdp/server/proxy/proxy_types.h new file mode 100644 index 0000000..98ee4b1 --- /dev/null +++ b/include/freerdp/server/proxy/proxy_types.h @@ -0,0 +1,57 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Proxy enum types + * + * Copyright 2023 Armin Novak <armin.novak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SERVER_PROXY_TYPES_H +#define FREERDP_SERVER_PROXY_TYPES_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @brief how is handled a channel */ + typedef enum + { + PF_UTILS_CHANNEL_NOT_HANDLED, /*!< channel not handled */ + PF_UTILS_CHANNEL_BLOCK, /*!< block and drop traffic on this channel */ + PF_UTILS_CHANNEL_PASSTHROUGH, /*!< pass traffic from this channel */ + PF_UTILS_CHANNEL_INTERCEPT /*!< inspect traffic from this channel */ + } pf_utils_channel_mode; + + /** @brief result of a channel treatment */ + typedef enum + { + PF_CHANNEL_RESULT_PASS, /*!< pass the packet as is */ + PF_CHANNEL_RESULT_DROP, /*!< drop the packet */ + PF_CHANNEL_RESULT_ERROR /*!< error during packet treatment */ + } PfChannelResult; + typedef enum + { + PROXY_FETCH_TARGET_METHOD_DEFAULT, + PROXY_FETCH_TARGET_METHOD_CONFIG, + PROXY_FETCH_TARGET_METHOD_LOAD_BALANCE_INFO, + PROXY_FETCH_TARGET_USE_CUSTOM_ADDR + } ProxyFetchTargetMethod; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SERVER_PROXY_TYPES_H */ diff --git a/include/freerdp/server/rail.h b/include/freerdp/server/rail.h new file mode 100644 index 0000000..0fdd1a3 --- /dev/null +++ b/include/freerdp/server/rail.h @@ -0,0 +1,157 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RAIL Virtual Channel Plugin + * + * Copyright 2019 Mati Shabtay <matishabtay@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RAIL_SERVER_RAIL_H +#define FREERDP_CHANNEL_RAIL_SERVER_RAIL_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/rail.h> +#include <freerdp/channels/rail.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_rail_server_context RailServerContext; + typedef struct s_rail_server_private RailServerPrivate; + + typedef UINT (*psRailStart)(RailServerContext* context); + typedef BOOL (*psRailStop)(RailServerContext* context); + + /* Client side callback types */ + typedef UINT (*psRailClientHandshake)(RailServerContext* context, + const RAIL_HANDSHAKE_ORDER* handshake); + typedef UINT (*psRailClientClientStatus)(RailServerContext* context, + const RAIL_CLIENT_STATUS_ORDER* clientStatus); + typedef UINT (*psRailClientExec)(RailServerContext* context, const RAIL_EXEC_ORDER* exec); + typedef UINT (*psRailClientSysparam)(RailServerContext* context, + const RAIL_SYSPARAM_ORDER* sysparam); + typedef UINT (*psRailClientActivate)(RailServerContext* context, + const RAIL_ACTIVATE_ORDER* activate); + typedef UINT (*psRailClientSysmenu)(RailServerContext* context, + const RAIL_SYSMENU_ORDER* sysmenu); + typedef UINT (*psRailClientSyscommand)(RailServerContext* context, + const RAIL_SYSCOMMAND_ORDER* syscommand); + typedef UINT (*psRailClientNotifyEvent)(RailServerContext* context, + const RAIL_NOTIFY_EVENT_ORDER* notifyEvent); + typedef UINT (*psRailClientGetAppidReq)(RailServerContext* context, + const RAIL_GET_APPID_REQ_ORDER* getAppidReq); + typedef UINT (*psRailClientWindowMove)(RailServerContext* context, + const RAIL_WINDOW_MOVE_ORDER* windowMove); + typedef UINT (*psRailClientSnapArrange)(RailServerContext* context, + const RAIL_SNAP_ARRANGE* snapArrange); + typedef UINT (*psRailClientLangbarInfo)(RailServerContext* context, + const RAIL_LANGBAR_INFO_ORDER* langbarInfo); + typedef UINT (*psRailClientLanguageImeInfo)(RailServerContext* context, + const RAIL_LANGUAGEIME_INFO_ORDER* languageImeInfo); + typedef UINT (*psRailClientCompartmentInfo)(RailServerContext* context, + const RAIL_COMPARTMENT_INFO_ORDER* compartmentInfo); + typedef UINT (*psRailClientCloak)(RailServerContext* context, const RAIL_CLOAK* cloak); + typedef UINT (*psRailClientTextScale)(RailServerContext* context, UINT32 TextScale); + typedef UINT (*psRailClientCaretBlinkRate)(RailServerContext* context, UINT32 CaretBlinkRate); + + /* Server side messages sending methods */ + typedef UINT (*psRailServerHandshake)(RailServerContext* context, + const RAIL_HANDSHAKE_ORDER* handshake); + typedef UINT (*psRailServerHandshakeEx)(RailServerContext* context, + const RAIL_HANDSHAKE_EX_ORDER* handshakeEx); + typedef UINT (*psRailServerSysparam)(RailServerContext* context, + const RAIL_SYSPARAM_ORDER* sysparam); + typedef UINT (*psRailServerLocalMoveSize)(RailServerContext* context, + const RAIL_LOCALMOVESIZE_ORDER* localMoveSize); + typedef UINT (*psRailServerMinMaxInfo)(RailServerContext* context, + const RAIL_MINMAXINFO_ORDER* minMaxInfo); + typedef UINT (*psRailServerTaskbarInfo)(RailServerContext* context, + const RAIL_TASKBAR_INFO_ORDER* taskbarInfo); + typedef UINT (*psRailServerLangbarInfo)(RailServerContext* context, + const RAIL_LANGBAR_INFO_ORDER* langbarInfo); + typedef UINT (*psRailServerExecResult)(RailServerContext* context, + const RAIL_EXEC_RESULT_ORDER* execResult); + typedef UINT (*psRailServerGetAppidResp)(RailServerContext* context, + const RAIL_GET_APPID_RESP_ORDER* getAppIdResp); + typedef UINT (*psRailServerZOrderSync)(RailServerContext* context, + const RAIL_ZORDER_SYNC* zOrderSync); + typedef UINT (*psRailServerCloak)(RailServerContext* context, const RAIL_CLOAK* cloak); + typedef UINT (*psRailServerPowerDisplayRequest)( + RailServerContext* context, const RAIL_POWER_DISPLAY_REQUEST* PowerDisplayRequest); + typedef UINT (*psRailServerGetAppidRespEx)(RailServerContext* context, + const RAIL_GET_APPID_RESP_EX* GetAppidRespEx); + + struct s_rail_server_context + { + HANDLE vcm; + void* custom; + + psRailStart Start; + psRailStop Stop; + + /* Callbacks from client */ + psRailClientHandshake ClientHandshake; + psRailClientClientStatus ClientClientStatus; + psRailClientExec ClientExec; + psRailClientSysparam ClientSysparam; + psRailClientActivate ClientActivate; + psRailClientSysmenu ClientSysmenu; + psRailClientSyscommand ClientSyscommand; + psRailClientNotifyEvent ClientNotifyEvent; + psRailClientGetAppidReq ClientGetAppidReq; + psRailClientWindowMove ClientWindowMove; + psRailClientSnapArrange ClientSnapArrange; + psRailClientLangbarInfo ClientLangbarInfo; + psRailClientLanguageImeInfo ClientLanguageImeInfo; + psRailClientCompartmentInfo ClientCompartmentInfo; + psRailClientCloak ClientCloak; + psRailClientTextScale ClientTextScale; + psRailClientCaretBlinkRate ClientCaretBlinkRate; + + /* Methods for sending server side messages */ + psRailServerHandshake ServerHandshake; + psRailServerHandshakeEx ServerHandshakeEx; + psRailServerSysparam ServerSysparam; + psRailServerLocalMoveSize ServerLocalMoveSize; + psRailServerMinMaxInfo ServerMinMaxInfo; + psRailServerTaskbarInfo ServerTaskbarInfo; + psRailServerLangbarInfo ServerLangbarInfo; + psRailServerExecResult ServerExecResult; + psRailServerZOrderSync ServerZOrderSync; + psRailServerCloak ServerCloak; + psRailServerPowerDisplayRequest ServerPowerDisplayRequest; + psRailServerGetAppidResp ServerGetAppidResp; + psRailServerGetAppidRespEx ServerGetAppidRespEx; + + RailServerPrivate* priv; + rdpContext* rdpcontext; + }; + + FREERDP_API void rail_server_context_free(RailServerContext* context); + + WINPR_ATTR_MALLOC(rail_server_context_free, 1) + FREERDP_API RailServerContext* rail_server_context_new(HANDLE vcm); + + FREERDP_API UINT rail_server_handle_messages(RailServerContext* context); + FREERDP_API void rail_server_set_handshake_ex_flags(RailServerContext* context, DWORD flags); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RAIL_SERVER_RAIL_H */ diff --git a/include/freerdp/server/rdpdr.h b/include/freerdp/server/rdpdr.h new file mode 100644 index 0000000..8f01f1f --- /dev/null +++ b/include/freerdp/server/rdpdr.h @@ -0,0 +1,227 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Device Redirection Virtual Channel Server Interface + * + * Copyright 2014 Dell Software <Mike.McDonald@software.dell.com> + * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPDR_SERVER_RDPDR_H +#define FREERDP_CHANNEL_RDPDR_SERVER_RDPDR_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/channels/wtsvc.h> +#include <freerdp/channels/rdpdr.h> +#include <freerdp/utils/rdpdr_utils.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Server Interface + */ + + typedef struct s_rdpdr_server_context RdpdrServerContext; + typedef struct s_rdpdr_server_private RdpdrServerPrivate; + + typedef struct + { + UINT16 Component; + UINT16 PacketId; + } RDPDR_HEADER; + +#ifndef __MINGW32__ +typedef struct +{ + UINT32 NextEntryOffset; + UINT32 FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + UINT32 FileAttributes; + char FileName[512]; +} FILE_DIRECTORY_INFORMATION; +#endif + +typedef UINT (*psRdpdrStart)(RdpdrServerContext* context); +typedef UINT (*psRdpdrStop)(RdpdrServerContext* context); + +typedef UINT (*psRdpdrCapablityPDU)(RdpdrServerContext* context, + const RDPDR_CAPABILITY_HEADER* header, size_t size, + const BYTE* data); +typedef UINT (*psRdpdrReceivePDU)(RdpdrServerContext* context, const RDPDR_HEADER* header, + UINT error); +typedef UINT (*psRdpdrReceiveAnnounceResponse)(RdpdrServerContext* context, UINT16 VersionMajor, + UINT16 VersionMinor, UINT32 ClientId); +typedef UINT (*psRdpdrSendServerAnnounce)(RdpdrServerContext* context); +typedef UINT (*psRdpdrReceiveDeviceAnnounce)(RdpdrServerContext* context, + const RdpdrDevice* device); +typedef UINT (*psRdpdrReceiveDeviceRemove)(RdpdrServerContext* context, UINT32 deviceId, + const RdpdrDevice* device); +typedef UINT (*psRdpdrReceiveClientNameRequest)(RdpdrServerContext* context, size_t ComputerNameLen, + const char* name); + +typedef UINT (*psRdpdrDriveCreateDirectory)(RdpdrServerContext* context, void* callbackData, + UINT32 deviceId, const char* path); +typedef UINT (*psRdpdrDriveDeleteDirectory)(RdpdrServerContext* context, void* callbackData, + UINT32 deviceId, const char* path); +typedef UINT (*psRdpdrDriveQueryDirectory)(RdpdrServerContext* context, void* callbackData, + UINT32 deviceId, const char* path); +typedef UINT (*psRdpdrDriveOpenFile)(RdpdrServerContext* context, void* callbackData, + UINT32 deviceId, const char* path, UINT32 desiredAccess, + UINT32 createDisposition); +typedef UINT (*psRdpdrDriveReadFile)(RdpdrServerContext* context, void* callbackData, + UINT32 deviceId, UINT32 fileId, UINT32 length, UINT32 offset); +typedef UINT (*psRdpdrDriveWriteFile)(RdpdrServerContext* context, void* callbackData, + UINT32 deviceId, UINT32 fileId, const char* buffer, + UINT32 length, UINT32 offset); +typedef UINT (*psRdpdrDriveCloseFile)(RdpdrServerContext* context, void* callbackData, + UINT32 deviceId, UINT32 fileId); +typedef UINT (*psRdpdrDriveDeleteFile)(RdpdrServerContext* context, void* callbackData, + UINT32 deviceId, const char* path); +typedef UINT (*psRdpdrDriveRenameFile)(RdpdrServerContext* context, void* callbackData, + UINT32 deviceId, const char* oldPath, const char* newPath); + +typedef void (*psRdpdrOnDriveCreateDirectoryComplete)(RdpdrServerContext* context, + void* callbackData, UINT32 ioStatus); +typedef void (*psRdpdrOnDriveDeleteDirectoryComplete)(RdpdrServerContext* context, + void* callbackData, UINT32 ioStatus); +typedef void (*psRdpdrOnDriveQueryDirectoryComplete)(RdpdrServerContext* context, + void* callbackData, UINT32 ioStatus, + FILE_DIRECTORY_INFORMATION* fdi); +typedef void (*psRdpdrOnDriveOpenFileComplete)(RdpdrServerContext* context, void* callbackData, + UINT32 ioStatus, UINT32 deviceId, UINT32 fileId); +typedef void (*psRdpdrOnDriveReadFileComplete)(RdpdrServerContext* context, void* callbackData, + UINT32 ioStatus, const char* buffer, UINT32 length); +typedef void (*psRdpdrOnDriveWriteFileComplete)(RdpdrServerContext* context, void* callbackData, + UINT32 ioStatus, UINT32 bytesWritten); +typedef void (*psRdpdrOnDriveCloseFileComplete)(RdpdrServerContext* context, void* callbackData, + UINT32 ioStatus); +typedef void (*psRdpdrOnDriveDeleteFileComplete)(RdpdrServerContext* context, void* callbackData, + UINT32 ioStatus); +typedef void (*psRdpdrOnDriveRenameFileComplete)(RdpdrServerContext* context, void* callbackData, + UINT32 ioStatus); + +typedef UINT (*psRdpdrOnDeviceCreate)(RdpdrServerContext* context, const RdpdrDevice* device); +typedef UINT (*psRdpdrOnDeviceDelete)(RdpdrServerContext* context, UINT32 deviceId); + +struct s_rdpdr_server_context +{ + HANDLE vcm; + + psRdpdrStart Start; + psRdpdrStop Stop; + + RdpdrServerPrivate* priv; + + /* Server self-defined pointer. */ + void* data; + + /**< Server supported redirections. + * initially used to determine which redirections are supported by the + * server in the server capability, later on updated with what the client + * actually wants to have supported. + * + * Use the \b RDPDR_DTYP_* defines as a mask to check. + */ + UINT16 supported; + + /*** RDPDR message intercept callbacks */ + psRdpdrCapablityPDU ReceiveCaps; /**< Called for each received capability */ + psRdpdrCapablityPDU SendCaps; /**< Called for each capability to be sent */ + psRdpdrReceivePDU ReceivePDU; /**< Called after a RDPDR pdu was received and parsed */ + psRdpdrSendServerAnnounce + SendServerAnnounce; /**< Called before the server sends the announce message */ + psRdpdrReceiveAnnounceResponse + ReceiveAnnounceResponse; /**< Called after the client announce response is received */ + psRdpdrReceiveClientNameRequest + ReceiveClientNameRequest; /**< Called after a client name request is received */ + psRdpdrReceiveDeviceAnnounce + ReceiveDeviceAnnounce; /** < Called after a new device request was received but before the + device is added */ + psRdpdrReceiveDeviceRemove ReceiveDeviceRemove; /**< Called after a new device request was + received, but before it is removed */ + + /*** Drive APIs called by the server. ***/ + psRdpdrDriveCreateDirectory DriveCreateDirectory; + psRdpdrDriveDeleteDirectory DriveDeleteDirectory; + psRdpdrDriveQueryDirectory DriveQueryDirectory; + psRdpdrDriveOpenFile DriveOpenFile; + psRdpdrDriveReadFile DriveReadFile; + psRdpdrDriveWriteFile DriveWriteFile; + psRdpdrDriveCloseFile DriveCloseFile; + psRdpdrDriveDeleteFile DriveDeleteFile; + psRdpdrDriveRenameFile DriveRenameFile; + + /*** Drive callbacks registered by the server. ***/ + psRdpdrOnDeviceCreate OnDriveCreate; /**< Called for devices of type \b RDPDR_DTYP_FILESYSTEM + after \b ReceiveDeviceAnnounce */ + psRdpdrOnDeviceDelete OnDriveDelete; /**< Called for devices of type \b RDPDR_DTYP_FILESYSTEM + after \b ReceiveDeviceRemove */ + psRdpdrOnDriveCreateDirectoryComplete OnDriveCreateDirectoryComplete; + psRdpdrOnDriveDeleteDirectoryComplete OnDriveDeleteDirectoryComplete; + psRdpdrOnDriveQueryDirectoryComplete OnDriveQueryDirectoryComplete; + psRdpdrOnDriveOpenFileComplete OnDriveOpenFileComplete; + psRdpdrOnDriveReadFileComplete OnDriveReadFileComplete; + psRdpdrOnDriveWriteFileComplete OnDriveWriteFileComplete; + psRdpdrOnDriveCloseFileComplete OnDriveCloseFileComplete; + psRdpdrOnDriveDeleteFileComplete OnDriveDeleteFileComplete; + psRdpdrOnDriveRenameFileComplete OnDriveRenameFileComplete; + + /*** Serial Port callbacks registered by the server. ***/ + psRdpdrOnDeviceCreate OnSerialPortCreate; /**< Called for devices of type \b RDPDR_DTYP_SERIAL + after \b ReceiveDeviceAnnounce */ + psRdpdrOnDeviceDelete OnSerialPortDelete; /**< Called for devices of type \b RDPDR_DTYP_SERIAL + after \b ReceiveDeviceRemove */ + + /*** Parallel Port callbacks registered by the server. ***/ + psRdpdrOnDeviceCreate OnParallelPortCreate; /**< Called for devices of type \b + RDPDR_DTYP_PARALLEL after \b ReceiveDeviceAnnounce */ + psRdpdrOnDeviceDelete OnParallelPortDelete; /**< Called for devices of type \b + RDPDR_DTYP_PARALLEL after \b ReceiveDeviceRemove */ + + /*** Printer callbacks registered by the server. ***/ + psRdpdrOnDeviceCreate OnPrinterCreate; /**< Called for devices of type RDPDR_DTYP_PRINT after \b + ReceiveDeviceAnnounce */ + psRdpdrOnDeviceDelete OnPrinterDelete; /**< Called for devices of type RDPDR_DTYP_PRINT after \b + ReceiveDeviceRemove */ + + /*** Smartcard callbacks registered by the server. ***/ + psRdpdrOnDeviceCreate OnSmartcardCreate; /**< Called for devices of type RDPDR_DTYP_SMARTCARD + after \b ReceiveDeviceAnnounce */ + psRdpdrOnDeviceDelete OnSmartcardDelete; /**< Called for devices of type RDPDR_DTYP_SMARTCARD + after \b ReceiveDeviceRemove */ + + rdpContext* rdpcontext; +}; + +FREERDP_API void rdpdr_server_context_free(RdpdrServerContext* context); + +WINPR_ATTR_MALLOC(rdpdr_server_context_free, 1) +FREERDP_API RdpdrServerContext* rdpdr_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RDPDR_SERVER_RDPDR_H */ diff --git a/include/freerdp/server/rdpecam-enumerator.h b/include/freerdp/server/rdpecam-enumerator.h new file mode 100644 index 0000000..800caf8 --- /dev/null +++ b/include/freerdp/server/rdpecam-enumerator.h @@ -0,0 +1,137 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Video Capture Virtual Channel Extension + * + * Copyright 2022 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_CAM_DEV_ENUM_SERVER_CAM_DEV_ENUM_H +#define FREERDP_CHANNEL_CAM_DEV_ENUM_SERVER_CAM_DEV_ENUM_H + +#include <freerdp/channels/rdpecam.h> +#include <freerdp/channels/wtsvc.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_cam_dev_enum_server_context CamDevEnumServerContext; + + typedef UINT (*psCamDevEnumServerServerOpen)(CamDevEnumServerContext* context); + typedef UINT (*psCamDevEnumServerServerClose)(CamDevEnumServerContext* context); + + typedef BOOL (*psCamDevEnumServerServerChannelIdAssigned)(CamDevEnumServerContext* context, + UINT32 channelId); + + typedef UINT (*psCamDevEnumServerServerInitialize)(CamDevEnumServerContext* context, + BOOL externalThread); + typedef UINT (*psCamDevEnumServerServerPoll)(CamDevEnumServerContext* context); + typedef BOOL (*psCamDevEnumServerServerChannelHandle)(CamDevEnumServerContext* context, + HANDLE* handle); + + typedef UINT (*psCamDevEnumServerServerSelectVersionRequest)( + CamDevEnumServerContext* context, const CAM_SELECT_VERSION_REQUEST* selectVersionRequest); + typedef UINT (*psCamDevEnumServerServerSelectVersionResponse)( + CamDevEnumServerContext* context, const CAM_SELECT_VERSION_RESPONSE* selectVersionResponse); + + typedef UINT (*psCamDevEnumServerServerDeviceAddedNotification)( + CamDevEnumServerContext* context, + const CAM_DEVICE_ADDED_NOTIFICATION* deviceAddedNotification); + typedef UINT (*psCamDevEnumServerServerDeviceRemovedNotification)( + CamDevEnumServerContext* context, + const CAM_DEVICE_REMOVED_NOTIFICATION* deviceRemovedNotification); + + struct s_cam_dev_enum_server_context + { + HANDLE vcm; + + /* Server self-defined pointer. */ + void* userdata; + + /*** APIs called by the server. ***/ + + /** + * Optional: Set thread handling. + * When externalThread=TRUE, the application is responsible to call + * Poll() periodically to process channel events. + * + * Defaults to externalThread=FALSE + */ + psCamDevEnumServerServerInitialize Initialize; + + /** + * Open the camera device enumerator channel. + */ + psCamDevEnumServerServerOpen Open; + + /** + * Close the camera device enumerator channel. + */ + psCamDevEnumServerServerClose Close; + + /** + * Poll + * When externalThread=TRUE, call Poll() periodically from your main loop. + * If externalThread=FALSE do not call. + */ + psCamDevEnumServerServerPoll Poll; + + /** + * Retrieve the channel handle for use in conjunction with Poll(). + * If externalThread=FALSE do not call. + */ + psCamDevEnumServerServerChannelHandle ChannelHandle; + + /* + * Send a Select Version Response PDU. + */ + psCamDevEnumServerServerSelectVersionResponse SelectVersionResponse; + + /*** Callbacks registered by the server. ***/ + + /** + * Callback, when the channel got its id assigned. + */ + psCamDevEnumServerServerChannelIdAssigned ChannelIdAssigned; + + /** + * Callback for the Select Version Request PDU. + */ + psCamDevEnumServerServerSelectVersionRequest SelectVersionRequest; + + /** + * Callback for the Device Added Notification PDU. + */ + psCamDevEnumServerServerDeviceAddedNotification DeviceAddedNotification; + + /** + * Callback for the Device Removed Notification PDU. + */ + psCamDevEnumServerServerDeviceRemovedNotification DeviceRemovedNotification; + + rdpContext* rdpcontext; + }; + + FREERDP_API void cam_dev_enum_server_context_free(CamDevEnumServerContext* context); + + WINPR_ATTR_MALLOC(cam_dev_enum_server_context_free, 1) + FREERDP_API CamDevEnumServerContext* cam_dev_enum_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_CAM_DEV_ENUM_SERVER_CAM_DEV_ENUM_H */ diff --git a/include/freerdp/server/rdpecam.h b/include/freerdp/server/rdpecam.h new file mode 100644 index 0000000..dd18494 --- /dev/null +++ b/include/freerdp/server/rdpecam.h @@ -0,0 +1,284 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Video Capture Virtual Channel Extension + * + * Copyright 2022 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_CAMERA_DEVICE_SERVER_CAMERA_DEVICE_H +#define FREERDP_CHANNEL_CAMERA_DEVICE_SERVER_CAMERA_DEVICE_H + +#include <freerdp/channels/rdpecam.h> +#include <freerdp/channels/wtsvc.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct camera_device_server_context CameraDeviceServerContext; + + typedef UINT (*psCameraDeviceServerOpen)(CameraDeviceServerContext* context); + typedef UINT (*psCameraDeviceServerClose)(CameraDeviceServerContext* context); + + typedef BOOL (*psCameraDeviceServerChannelIdAssigned)(CameraDeviceServerContext* context, + UINT32 channelId); + + typedef UINT (*psCameraDeviceServerInitialize)(CameraDeviceServerContext* context, + BOOL externalThread); + typedef UINT (*psCameraDeviceServerPoll)(CameraDeviceServerContext* context); + typedef BOOL (*psCameraDeviceServerChannelHandle)(CameraDeviceServerContext* context, + HANDLE* handle); + + typedef UINT (*psCameraDeviceServerSuccessResponse)( + CameraDeviceServerContext* context, const CAM_SUCCESS_RESPONSE* successResponse); + typedef UINT (*psCameraDeviceServerErrorResponse)(CameraDeviceServerContext* context, + const CAM_ERROR_RESPONSE* errorResponse); + + typedef UINT (*psCameraDeviceServerActivateDeviceRequest)( + CameraDeviceServerContext* context, + const CAM_ACTIVATE_DEVICE_REQUEST* activateDeviceRequest); + typedef UINT (*psCameraDeviceServerDeactivateDeviceRequest)( + CameraDeviceServerContext* context, + const CAM_DEACTIVATE_DEVICE_REQUEST* deactivateDeviceRequest); + + typedef UINT (*psCameraDeviceServerStreamListRequest)( + CameraDeviceServerContext* context, const CAM_STREAM_LIST_REQUEST* streamListRequest); + typedef UINT (*psCameraDeviceServerStreamListResponse)( + CameraDeviceServerContext* context, const CAM_STREAM_LIST_RESPONSE* streamListResponse); + + typedef UINT (*psCameraDeviceServerMediaTypeListRequest)( + CameraDeviceServerContext* context, + const CAM_MEDIA_TYPE_LIST_REQUEST* mediaTypeListRequest); + typedef UINT (*psCameraDeviceServerMediaTypeListResponse)( + CameraDeviceServerContext* context, + const CAM_MEDIA_TYPE_LIST_RESPONSE* mediaTypeListResponse); + + typedef UINT (*psCameraDeviceServerCurrentMediaTypeRequest)( + CameraDeviceServerContext* context, + const CAM_CURRENT_MEDIA_TYPE_REQUEST* currentMediaTypeRequest); + typedef UINT (*psCameraDeviceServerCurrentMediaTypeResponse)( + CameraDeviceServerContext* context, + const CAM_CURRENT_MEDIA_TYPE_RESPONSE* currentMediaTypeResponse); + + typedef UINT (*psCameraDeviceServerStartStreamsRequest)( + CameraDeviceServerContext* context, const CAM_START_STREAMS_REQUEST* startStreamsRequest); + typedef UINT (*psCameraDeviceServerStopStreamsRequest)( + CameraDeviceServerContext* context, const CAM_STOP_STREAMS_REQUEST* stopStreamsRequest); + + typedef UINT (*psCameraDeviceServerSampleRequest)(CameraDeviceServerContext* context, + const CAM_SAMPLE_REQUEST* sampleRequest); + typedef UINT (*psCameraDeviceServerSampleResponse)(CameraDeviceServerContext* context, + const CAM_SAMPLE_RESPONSE* sampleResponse); + typedef UINT (*psCameraDeviceServerSampleErrorResponse)( + CameraDeviceServerContext* context, const CAM_SAMPLE_ERROR_RESPONSE* sampleErrorResponse); + + typedef UINT (*psCameraDeviceServerPropertyListRequest)( + CameraDeviceServerContext* context, const CAM_PROPERTY_LIST_REQUEST* propertyListRequest); + typedef UINT (*psCameraDeviceServerPropertyListResponse)( + CameraDeviceServerContext* context, const CAM_PROPERTY_LIST_RESPONSE* propertyListResponse); + + typedef UINT (*psCameraDeviceServerPropertyValueRequest)( + CameraDeviceServerContext* context, const CAM_PROPERTY_VALUE_REQUEST* propertyValueRequest); + typedef UINT (*psCameraDeviceServerPropertyValueResponse)( + CameraDeviceServerContext* context, + const CAM_PROPERTY_VALUE_RESPONSE* propertyValueResponse); + + typedef UINT (*psCameraDeviceServerSetPropertyValueRequest)( + CameraDeviceServerContext* context, + const CAM_SET_PROPERTY_VALUE_REQUEST* setPropertyValueRequest); + + struct camera_device_server_context + { + HANDLE vcm; + + /* Server self-defined pointer. */ + void* userdata; + + /** + * Name of the virtual channel. Pointer owned by the CameraDeviceServerContext, + * meaning camera_device_server_context_free() takes care of freeing the pointer. + * + * Server implementations should sanitize the virtual channel name for invalid + * names, like names for other known channels + * ("ECHO", "AUDIO_PLAYBACK_DVC", etc.) + */ + char* virtualChannelName; + + /** + * Protocol version to be used. Every sent server to client PDU has the + * version value in the Header set to the following value. + */ + BYTE protocolVersion; + + /*** APIs called by the server. ***/ + + /** + * Optional: Set thread handling. + * When externalThread=TRUE, the application is responsible to call + * Poll() periodically to process channel events. + * + * Defaults to externalThread=FALSE + */ + psCameraDeviceServerInitialize Initialize; + + /** + * Open the camera device channel. + */ + psCameraDeviceServerOpen Open; + + /** + * Close the camera device channel. + */ + psCameraDeviceServerClose Close; + + /** + * Poll + * When externalThread=TRUE, call Poll() periodically from your main loop. + * If externalThread=FALSE do not call. + */ + psCameraDeviceServerPoll Poll; + + /** + * Retrieve the channel handle for use in conjunction with Poll(). + * If externalThread=FALSE do not call. + */ + psCameraDeviceServerChannelHandle ChannelHandle; + + /** + * For the following server to client PDUs, + * the message header does not have to be set. + */ + + /** + * Send a Activate Device Request PDU. + */ + psCameraDeviceServerActivateDeviceRequest ActivateDeviceRequest; + + /** + * Send a Deactivate Device Request PDU. + */ + psCameraDeviceServerDeactivateDeviceRequest DeactivateDeviceRequest; + + /** + * Send a Stream List Request PDU. + */ + psCameraDeviceServerStreamListRequest StreamListRequest; + + /** + * Send a Media Type List Request PDU. + */ + psCameraDeviceServerMediaTypeListRequest MediaTypeListRequest; + + /** + * Send a Current Media Type Request PDU. + */ + psCameraDeviceServerCurrentMediaTypeRequest CurrentMediaTypeRequest; + + /** + * Send a Start Streams Request PDU. + */ + psCameraDeviceServerStartStreamsRequest StartStreamsRequest; + + /** + * Send a Stop Streams Request PDU. + */ + psCameraDeviceServerStopStreamsRequest StopStreamsRequest; + + /** + * Send a Sample Request PDU. + */ + psCameraDeviceServerSampleRequest SampleRequest; + + /** + * Send a Property List Request PDU. + */ + psCameraDeviceServerPropertyListRequest PropertyListRequest; + + /** + * Send a Property Value Request PDU. + */ + psCameraDeviceServerPropertyValueRequest PropertyValueRequest; + + /** + * Send a Set Property Value Request PDU. + */ + psCameraDeviceServerSetPropertyValueRequest SetPropertyValueRequest; + + /*** Callbacks registered by the server. ***/ + + /** + * Callback, when the channel got its id assigned. + */ + psCameraDeviceServerChannelIdAssigned ChannelIdAssigned; + + /** + * Callback for the Success Response PDU. + */ + psCameraDeviceServerSuccessResponse SuccessResponse; + + /** + * Callback for the Error Response PDU. + */ + psCameraDeviceServerErrorResponse ErrorResponse; + + /** + * Callback for the Stream List Response PDU. + */ + psCameraDeviceServerStreamListResponse StreamListResponse; + + /** + * Callback for the Media Type List Response PDU. + */ + psCameraDeviceServerMediaTypeListResponse MediaTypeListResponse; + + /** + * Callback for the Current Media Type Response PDU. + */ + psCameraDeviceServerCurrentMediaTypeResponse CurrentMediaTypeResponse; + + /** + * Callback for the Sample Response PDU. + */ + psCameraDeviceServerSampleResponse SampleResponse; + + /** + * Callback for the Sample Error Response PDU. + */ + psCameraDeviceServerSampleErrorResponse SampleErrorResponse; + + /** + * Callback for the Property List Response PDU. + */ + psCameraDeviceServerPropertyListResponse PropertyListResponse; + + /** + * Callback for the Property Value Response PDU. + */ + psCameraDeviceServerPropertyValueResponse PropertyValueResponse; + + rdpContext* rdpcontext; + }; + + FREERDP_API void camera_device_server_context_free(CameraDeviceServerContext* context); + + WINPR_ATTR_MALLOC(camera_device_server_context_free, 1) + FREERDP_API CameraDeviceServerContext* camera_device_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_CAMERA_DEVICE_SERVER_CAMERA_DEVICE_H */ diff --git a/include/freerdp/server/rdpei.h b/include/freerdp/server/rdpei.h new file mode 100644 index 0000000..215f7f1 --- /dev/null +++ b/include/freerdp/server/rdpei.h @@ -0,0 +1,81 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Extended Input channel server-side definitions + * + * Copyright 2014 Thincast Technologies Gmbh. + * Copyright 2014 David FORT <contact@hardening-consulting.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPEI_SERVER_H +#define FREERDP_CHANNEL_RDPEI_SERVER_H + +#include <freerdp/channels/wtsvc.h> +#include <freerdp/channels/rdpei.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_rdpei_server_context RdpeiServerContext; + typedef struct s_rdpei_server_private RdpeiServerPrivate; + + struct s_rdpei_server_context + { + HANDLE vcm; + + RdpeiServerPrivate* priv; + + UINT32 clientVersion; + UINT16 maxTouchPoints; + UINT32 protocolFlags; + + /** callbacks that can be set by the user */ + UINT (*onClientReady)(RdpeiServerContext* context); + UINT (*onTouchEvent)(RdpeiServerContext* context, const RDPINPUT_TOUCH_EVENT* touchEvent); + UINT (*onPenEvent)(RdpeiServerContext* context, const RDPINPUT_PEN_EVENT* penEvent); + UINT (*onTouchReleased)(RdpeiServerContext* context, BYTE contactId); + + void* user_data; /* user data, useful for callbacks */ + + /** + * Callback, when the channel got its id assigned. + */ + BOOL (*onChannelIdAssigned)(RdpeiServerContext* context, UINT32 channelId); + }; + + FREERDP_API void rdpei_server_context_free(RdpeiServerContext* context); + + WINPR_ATTR_MALLOC(rdpei_server_context_free, 1) + FREERDP_API RdpeiServerContext* rdpei_server_context_new(HANDLE vcm); + + FREERDP_API void rdpei_server_context_reset(RdpeiServerContext* context); + + FREERDP_API HANDLE rdpei_server_get_event_handle(RdpeiServerContext* context); + FREERDP_API UINT rdpei_server_init(RdpeiServerContext* context); + FREERDP_API UINT rdpei_server_handle_messages(RdpeiServerContext* context); + + FREERDP_API UINT rdpei_server_send_sc_ready(RdpeiServerContext* context, UINT32 version, + UINT32 features); + FREERDP_API UINT rdpei_server_suspend(RdpeiServerContext* context); + FREERDP_API UINT rdpei_server_resume(RdpeiServerContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RDPEI_SERVER_H */ diff --git a/include/freerdp/server/rdpemsc.h b/include/freerdp/server/rdpemsc.h new file mode 100644 index 0000000..f1ce98a --- /dev/null +++ b/include/freerdp/server/rdpemsc.h @@ -0,0 +1,132 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Mouse Cursor Virtual Channel Extension + * + * Copyright 2023 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPEMSC_SERVER_RDPEMSC_H +#define FREERDP_CHANNEL_RDPEMSC_SERVER_RDPEMSC_H + +#include <freerdp/channels/rdpemsc.h> +#include <freerdp/channels/wtsvc.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_mouse_cursor_server_context MouseCursorServerContext; + + typedef UINT (*psMouseCursorServerOpen)(MouseCursorServerContext* context); + typedef UINT (*psMouseCursorServerClose)(MouseCursorServerContext* context); + + typedef BOOL (*psMouseCursorServerChannelIdAssigned)(MouseCursorServerContext* context, + UINT32 channelId); + + typedef UINT (*psMouseCursorServerInitialize)(MouseCursorServerContext* context, + BOOL externalThread); + typedef UINT (*psMouseCursorServerPoll)(MouseCursorServerContext* context); + typedef BOOL (*psMouseCursorServerChannelHandle)(MouseCursorServerContext* context, + HANDLE* handle); + + typedef UINT (*psMouseCursorServerCapsAdvertise)( + MouseCursorServerContext* context, + const RDP_MOUSE_CURSOR_CAPS_ADVERTISE_PDU* capsAdvertise); + typedef UINT (*psMouseCursorServerCapsConfirm)( + MouseCursorServerContext* context, const RDP_MOUSE_CURSOR_CAPS_CONFIRM_PDU* capsConfirm); + + typedef UINT (*psMouseCursorServerMouseptrUpdate)( + MouseCursorServerContext* context, + const RDP_MOUSE_CURSOR_MOUSEPTR_UPDATE_PDU* mouseptrUpdate); + + struct s_mouse_cursor_server_context + { + HANDLE vcm; + + /* Server self-defined pointer. */ + void* userdata; + + /*** APIs called by the server. ***/ + + /** + * Optional: Set thread handling. + * When externalThread=TRUE, the application is responsible to call + * Poll() periodically to process channel events. + * + * Defaults to externalThread=FALSE + */ + psMouseCursorServerInitialize Initialize; + + /** + * Open the mouse cursor channel. + */ + psMouseCursorServerOpen Open; + + /** + * Close the mouse cursor channel. + */ + psMouseCursorServerClose Close; + + /** + * Poll + * When externalThread=TRUE, call Poll() periodically from your main loop. + * If externalThread=FALSE do not call. + */ + psMouseCursorServerPoll Poll; + + /** + * Retrieve the channel handle for use in conjunction with Poll(). + * If externalThread=FALSE do not call. + */ + psMouseCursorServerChannelHandle ChannelHandle; + + /* All PDUs sent by the server don't require the pduType to be set */ + + /* + * Send a CapsConfirm PDU. + */ + psMouseCursorServerCapsConfirm CapsConfirm; + + /* + * Send a MouseptrUpdate PDU. + */ + psMouseCursorServerMouseptrUpdate MouseptrUpdate; + + /*** Callbacks registered by the server. ***/ + + /** + * Callback, when the channel got its id assigned. + */ + psMouseCursorServerChannelIdAssigned ChannelIdAssigned; + + /** + * Callback for the CapsAdvertise PDU. + */ + psMouseCursorServerCapsAdvertise CapsAdvertise; + + rdpContext* rdpcontext; + }; + + FREERDP_API void mouse_cursor_server_context_free(MouseCursorServerContext* context); + + WINPR_ATTR_MALLOC(mouse_cursor_server_context_free, 1) + FREERDP_API MouseCursorServerContext* mouse_cursor_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RDPEMSC_SERVER_RDPEMSC_H */ diff --git a/include/freerdp/server/rdpgfx.h b/include/freerdp/server/rdpgfx.h new file mode 100644 index 0000000..262bb38 --- /dev/null +++ b/include/freerdp/server/rdpgfx.h @@ -0,0 +1,156 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Graphics Pipeline Extension + * + * Copyright 2016 Jiang Zihao <zihao.jiang@yahoo.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPGFX_SERVER_RDPGFX_H +#define FREERDP_CHANNEL_RDPGFX_SERVER_RDPGFX_H + +#include <freerdp/channels/rdpgfx.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_rdpgfx_server_context RdpgfxServerContext; + typedef struct s_rdpgfx_server_private RdpgfxServerPrivate; + + typedef BOOL (*psRdpgfxServerOpen)(RdpgfxServerContext* context); + typedef BOOL (*psRdpgfxServerClose)(RdpgfxServerContext* context); + + typedef BOOL (*psRdpgfxServerChannelIdAssigned)(RdpgfxServerContext* context, UINT32 channelId); + + typedef BOOL (*psRdpgfxServerInitialize)(RdpgfxServerContext* context, BOOL externalThread); + + typedef UINT (*psRdpgfxResetGraphics)(RdpgfxServerContext* context, + const RDPGFX_RESET_GRAPHICS_PDU* resetGraphics); + typedef UINT (*psRdpgfxStartFrame)(RdpgfxServerContext* context, + const RDPGFX_START_FRAME_PDU* startFrame); + typedef UINT (*psRdpgfxEndFrame)(RdpgfxServerContext* context, + const RDPGFX_END_FRAME_PDU* endFrame); + typedef UINT (*psRdpgfxSurfaceCommand)(RdpgfxServerContext* context, + const RDPGFX_SURFACE_COMMAND* cmd); + typedef UINT (*psRdpgfxSurfaceFrameCommand)(RdpgfxServerContext* context, + const RDPGFX_SURFACE_COMMAND* cmd, + const RDPGFX_START_FRAME_PDU* startFrame, + const RDPGFX_END_FRAME_PDU* endFrame); + typedef UINT (*psRdpgfxDeleteEncodingContext)( + RdpgfxServerContext* context, + const RDPGFX_DELETE_ENCODING_CONTEXT_PDU* deleteEncodingContext); + typedef UINT (*psRdpgfxCreateSurface)(RdpgfxServerContext* context, + const RDPGFX_CREATE_SURFACE_PDU* createSurface); + typedef UINT (*psRdpgfxDeleteSurface)(RdpgfxServerContext* context, + const RDPGFX_DELETE_SURFACE_PDU* deleteSurface); + typedef UINT (*psRdpgfxSolidFill)(RdpgfxServerContext* context, + const RDPGFX_SOLID_FILL_PDU* solidFill); + typedef UINT (*psRdpgfxSurfaceToSurface)(RdpgfxServerContext* context, + const RDPGFX_SURFACE_TO_SURFACE_PDU* surfaceToSurface); + typedef UINT (*psRdpgfxSurfaceToCache)(RdpgfxServerContext* context, + const RDPGFX_SURFACE_TO_CACHE_PDU* surfaceToCache); + typedef UINT (*psRdpgfxCacheToSurface)(RdpgfxServerContext* context, + const RDPGFX_CACHE_TO_SURFACE_PDU* cacheToSurface); + typedef UINT (*psRdpgfxCacheImportOffer)(RdpgfxServerContext* context, + const RDPGFX_CACHE_IMPORT_OFFER_PDU* cacheImportOffer); + typedef UINT (*psRdpgfxCacheImportReply)(RdpgfxServerContext* context, + const RDPGFX_CACHE_IMPORT_REPLY_PDU* cacheImportReply); + typedef UINT (*psRdpgfxEvictCacheEntry)(RdpgfxServerContext* context, + const RDPGFX_EVICT_CACHE_ENTRY_PDU* evictCacheEntry); + typedef UINT (*psRdpgfxMapSurfaceToOutput)( + RdpgfxServerContext* context, const RDPGFX_MAP_SURFACE_TO_OUTPUT_PDU* surfaceToOutput); + typedef UINT (*psRdpgfxMapSurfaceToWindow)( + RdpgfxServerContext* context, const RDPGFX_MAP_SURFACE_TO_WINDOW_PDU* surfaceToWindow); + typedef UINT (*psRdpgfxMapSurfaceToScaledOutput)( + RdpgfxServerContext* context, + const RDPGFX_MAP_SURFACE_TO_SCALED_OUTPUT_PDU* surfaceToOutput); + typedef UINT (*psRdpgfxMapSurfaceToScaledWindow)( + RdpgfxServerContext* context, + const RDPGFX_MAP_SURFACE_TO_SCALED_WINDOW_PDU* surfaceToWindow); + typedef UINT (*psRdpgfxCapsAdvertise)(RdpgfxServerContext* context, + const RDPGFX_CAPS_ADVERTISE_PDU* capsAdvertise); + typedef UINT (*psRdpgfxCapsConfirm)(RdpgfxServerContext* context, + const RDPGFX_CAPS_CONFIRM_PDU* capsConfirm); + typedef UINT (*psRdpgfxFrameAcknowledge)(RdpgfxServerContext* context, + const RDPGFX_FRAME_ACKNOWLEDGE_PDU* frameAcknowledge); + typedef UINT (*psRdpgfxQoeFrameAcknowledge)( + RdpgfxServerContext* context, const RDPGFX_QOE_FRAME_ACKNOWLEDGE_PDU* qoeFrameAcknowledge); + + struct s_rdpgfx_server_context + { + HANDLE vcm; + void* custom; + + psRdpgfxServerOpen Open; + psRdpgfxServerClose Close; + + psRdpgfxResetGraphics ResetGraphics; + psRdpgfxStartFrame StartFrame; + psRdpgfxEndFrame EndFrame; + psRdpgfxSurfaceCommand SurfaceCommand; + psRdpgfxSurfaceFrameCommand SurfaceFrameCommand; + psRdpgfxDeleteEncodingContext DeleteEncodingContext; + psRdpgfxCreateSurface CreateSurface; + psRdpgfxDeleteSurface DeleteSurface; + psRdpgfxSolidFill SolidFill; + psRdpgfxSurfaceToSurface SurfaceToSurface; + psRdpgfxSurfaceToCache SurfaceToCache; + psRdpgfxCacheToSurface CacheToSurface; + psRdpgfxCacheImportOffer CacheImportOffer; + psRdpgfxCacheImportReply CacheImportReply; + psRdpgfxEvictCacheEntry EvictCacheEntry; + psRdpgfxMapSurfaceToOutput MapSurfaceToOutput; + psRdpgfxMapSurfaceToWindow MapSurfaceToWindow; + psRdpgfxMapSurfaceToScaledOutput MapSurfaceToScaledOutput; + psRdpgfxMapSurfaceToScaledWindow MapSurfaceToScaledWindow; + psRdpgfxCapsAdvertise CapsAdvertise; + psRdpgfxCapsConfirm CapsConfirm; + psRdpgfxFrameAcknowledge FrameAcknowledge; + psRdpgfxQoeFrameAcknowledge QoeFrameAcknowledge; + + RdpgfxServerPrivate* priv; + rdpContext* rdpcontext; + + /** + * Callback, when the channel got its id assigned. + */ + psRdpgfxServerChannelIdAssigned ChannelIdAssigned; + /** + * Optional: Set thread handling. + * When externalThread=TRUE, the application is responsible to call + * Poll() periodically to process channel events. + * + * Defaults to externalThread=FALSE + */ + psRdpgfxServerInitialize Initialize; + }; + + FREERDP_API void rdpgfx_server_context_free(RdpgfxServerContext* context); + + WINPR_ATTR_MALLOC(rdpgfx_server_context_free, 1) + FREERDP_API RdpgfxServerContext* rdpgfx_server_context_new(HANDLE vcm); + + FREERDP_API BOOL rdpgfx_server_set_own_thread(RdpgfxServerContext* context, + BOOL internalThread); + FREERDP_API HANDLE rdpgfx_server_get_event_handle(RdpgfxServerContext* context); + FREERDP_API UINT rdpgfx_server_handle_messages(RdpgfxServerContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RDPGFX_SERVER_RDPGFX_H */ diff --git a/include/freerdp/server/rdpsnd.h b/include/freerdp/server/rdpsnd.h new file mode 100644 index 0000000..cbd5eab --- /dev/null +++ b/include/freerdp/server/rdpsnd.h @@ -0,0 +1,196 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Server Audio Virtual Channel + * + * Copyright 2012 Vic Lee + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPSND_SERVER_H +#define FREERDP_CHANNEL_RDPSND_SERVER_H + +#include <freerdp/channels/wtsvc.h> +#include <freerdp/channels/rdpsnd.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_rdpsnd_server_context RdpsndServerContext; + typedef struct s_rdpsnd_server_context rdpsnd_server_context; + typedef struct s_rdpsnd_server_private RdpsndServerPrivate; + + typedef UINT (*psRdpsndStart)(RdpsndServerContext* context); + typedef UINT (*psRdpsndStop)(RdpsndServerContext* context); + + typedef BOOL (*psRdpsndChannelIdAssigned)(RdpsndServerContext* context, UINT32 channelId); + + typedef UINT (*psRdpsndServerInitialize)(RdpsndServerContext* context, BOOL ownThread); + typedef UINT (*psRdpsndServerSendFormats)(RdpsndServerContext* context); + typedef UINT (*psRdpsndServerSelectFormat)(RdpsndServerContext* context, + UINT16 client_format_index); + typedef UINT (*psRdpsndServerTraining)(RdpsndServerContext* context, UINT16 timestamp, + UINT16 packsize, BYTE* data); + typedef UINT (*psRdpsndServerTrainingConfirm)(RdpsndServerContext* context, UINT16 timestamp, + UINT16 packsize); + typedef UINT (*psRdpsndServerSendSamples)(RdpsndServerContext* context, const void* buf, + size_t nframes, UINT16 wTimestamp); + typedef UINT (*psRdpsndServerSendSamples2)(RdpsndServerContext* context, UINT16 formatNo, + const void* buf, size_t size, UINT16 timestamp, + UINT32 audioTimeStamp); + typedef UINT (*psRdpsndServerConfirmBlock)(RdpsndServerContext* context, BYTE confirmBlockNum, + UINT16 wtimestamp); + typedef UINT (*psRdpsndServerSetVolume)(RdpsndServerContext* context, UINT16 left, + UINT16 right); + typedef UINT (*psRdpsndServerClose)(RdpsndServerContext* context); + + typedef void (*psRdpsndServerActivated)(RdpsndServerContext* context); + + struct s_rdpsnd_server_context + { + HANDLE vcm; + + psRdpsndStart Start; + psRdpsndStop Stop; + + RdpsndServerPrivate* priv; + + /* Server self-defined pointer. */ + void* data; + + /* Server to request to use dynamic virtual channel. */ + BOOL use_dynamic_virtual_channel; + + /* Server supported formats. Set by server. */ + AUDIO_FORMAT* server_formats; + size_t num_server_formats; + + /* Server source PCM audio format. Set by server. */ + AUDIO_FORMAT* src_format; + + /* Server audio latency, or buffer size, in milli-seconds. Set by server. */ + UINT32 latency; + + /* Client supported formats. */ + AUDIO_FORMAT* client_formats; + UINT16 num_client_formats; + UINT16 selected_client_format; + + /* Last sent audio block number. */ + UINT8 block_no; + + /*** APIs called by the server. ***/ + /** + * Initialize the channel. The caller should check the return value to see + * whether the initialization succeed. If not, the "Activated" callback + * will not be called and the server must not call any API on this context. + */ + psRdpsndServerInitialize Initialize; + + /** + * Choose the audio format to be sent. The index argument is an index into + * the client_formats array and must be smaller than num_client_formats. + */ + psRdpsndServerSelectFormat SelectFormat; + /** + * Send audio samples. Actually bytes in the buffer must be: + * nframes * src_format.nBitsPerSample * src_format.nChannels / 8 + */ + psRdpsndServerSendSamples SendSamples; + + /** + * Called when block confirm is received from the client + */ + psRdpsndServerConfirmBlock ConfirmBlock; + /** + * Set the volume level of the client. Valid range is between 0 and 0xFFFF. + */ + psRdpsndServerSetVolume SetVolume; + /** + * Close the audio stream. + */ + psRdpsndServerClose Close; + + /*** Callbacks registered by the server. ***/ + /** + * The channel has been activated. The server maybe choose audio format and + * start audio stream from this point. Note that this callback is called + * from a different thread context so the server must be careful of thread + * synchronization. + */ + psRdpsndServerActivated Activated; + + /** + * MS-RDPEA channel version the client announces + */ + UINT16 clientVersion; + + rdpContext* rdpcontext; + + /* dwFlags in CLIENT_AUDIO_VERSION_AND_FORMATS */ + UINT32 capsFlags; + /* dwVolume in CLIENT_AUDIO_VERSION_AND_FORMATS */ + UINT32 initialVolume; + /* dwPitch in CLIENT_AUDIO_VERSION_AND_FORMATS */ + UINT32 initialPitch; + + UINT16 qualityMode; + + /** + * Send server formats and version to the client. Automatically sent, when + * opening the channel. + * Also used to restart the protocol after sending the Close PDU. + */ + psRdpsndServerSendFormats SendFormats; + /** + * Send Training PDU. + */ + psRdpsndServerTraining Training; + + /** + * Send encoded audio samples using a Wave2 PDU. + * When successful, the block_no member is incremented. + */ + psRdpsndServerSendSamples2 SendSamples2; + + /** + * Called when a TrainingConfirm PDU is received from the client. + */ + psRdpsndServerTrainingConfirm TrainingConfirm; + + /** + * Callback, when the channel got its id assigned. + * Only called, when use_dynamic_virtual_channel=TRUE. + */ + psRdpsndChannelIdAssigned ChannelIdAssigned; + }; + + FREERDP_API void rdpsnd_server_context_free(RdpsndServerContext* context); + + WINPR_ATTR_MALLOC(rdpsnd_server_context_free, 1) + FREERDP_API RdpsndServerContext* rdpsnd_server_context_new(HANDLE vcm); + + FREERDP_API void rdpsnd_server_context_reset(RdpsndServerContext*); + + FREERDP_API HANDLE rdpsnd_server_get_event_handle(RdpsndServerContext* context); + FREERDP_API UINT rdpsnd_server_handle_messages(RdpsndServerContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_RDPSND_SERVER_H */ diff --git a/include/freerdp/server/remdesk.h b/include/freerdp/server/remdesk.h new file mode 100644 index 0000000..ef45032 --- /dev/null +++ b/include/freerdp/server/remdesk.h @@ -0,0 +1,67 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_REMDESK_SERVER_REMDESK_H +#define FREERDP_CHANNEL_REMDESK_SERVER_REMDESK_H + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/channels/wtsvc.h> + +#include <freerdp/client/remdesk.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * Server Interface + */ + + typedef struct s_remdesk_server_context RemdeskServerContext; + typedef struct s_remdesk_server_private RemdeskServerPrivate; + + typedef UINT (*psRemdeskStart)(RemdeskServerContext* context); + typedef UINT (*psRemdeskStop)(RemdeskServerContext* context); + + struct s_remdesk_server_context + { + HANDLE vcm; + void* custom; + + psRemdeskStart Start; + psRemdeskStop Stop; + + RemdeskServerPrivate* priv; + rdpContext* rdpcontext; + }; + + FREERDP_API void remdesk_server_context_free(RemdeskServerContext* context); + + WINPR_ATTR_MALLOC(remdesk_server_context_free, 1) + FREERDP_API RemdeskServerContext* remdesk_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_REMDESK_SERVER_REMDESK_H */ diff --git a/include/freerdp/server/server-common.h b/include/freerdp/server/server-common.h new file mode 100644 index 0000000..eba831b --- /dev/null +++ b/include/freerdp/server/server-common.h @@ -0,0 +1,44 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Server Common + * + * Copyright 2018 Armin Novak <armin.novak@thincast.com> + * Copyright 2018 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SERVER_COMMON_SERVER_H +#define FREERDP_SERVER_COMMON_SERVER_H + +#include <winpr/wtypes.h> +#include <freerdp/api.h> +#include <freerdp/codec/audio.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API size_t server_audin_get_formats(AUDIO_FORMAT** dst_formats); + FREERDP_API size_t server_rdpsnd_get_formats(AUDIO_FORMAT** dst_formats); + + FREERDP_API void freerdp_server_warn_unmaintained(int argc, char* argv[]); + FREERDP_API void freerdp_server_warn_experimental(int argc, char* argv[]); + FREERDP_API void freerdp_server_warn_deprecated(int argc, char* argv[]); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SERVER_COMMON_SERVER_H */ diff --git a/include/freerdp/server/shadow.h b/include/freerdp/server/shadow.h new file mode 100644 index 0000000..9ddb8ae --- /dev/null +++ b/include/freerdp/server/shadow.h @@ -0,0 +1,350 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Session Shadowing + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SERVER_SHADOW_H +#define FREERDP_SERVER_SHADOW_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <freerdp/freerdp.h> +#include <freerdp/settings.h> +#include <freerdp/listener.h> + +#include <freerdp/channels/wtsvc.h> +#include <freerdp/channels/channels.h> + +#include <freerdp/server/encomsp.h> +#include <freerdp/server/remdesk.h> +#include <freerdp/server/rdpsnd.h> +#if defined(CHANNEL_AUDIN_SERVER) +#include <freerdp/server/audin.h> +#endif +#include <freerdp/server/rdpgfx.h> + +#include <freerdp/codec/color.h> +#include <freerdp/codec/region.h> + +#include <winpr/crt.h> +#include <winpr/synch.h> +#include <winpr/collections.h> +#include <winpr/cmdline.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_shadow_client rdpShadowClient; + typedef struct rdp_shadow_server rdpShadowServer; + typedef struct rdp_shadow_screen rdpShadowScreen; + typedef struct rdp_shadow_surface rdpShadowSurface; + typedef struct rdp_shadow_encoder rdpShadowEncoder; + typedef struct rdp_shadow_capture rdpShadowCapture; + typedef struct rdp_shadow_subsystem rdpShadowSubsystem; + typedef struct rdp_shadow_multiclient_event rdpShadowMultiClientEvent; + + typedef struct S_RDP_SHADOW_ENTRY_POINTS RDP_SHADOW_ENTRY_POINTS; + typedef int (*pfnShadowSubsystemEntry)(RDP_SHADOW_ENTRY_POINTS* pEntryPoints); + + typedef rdpShadowSubsystem* (*pfnShadowSubsystemNew)(void); + typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem); + + typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem); + typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem); + + typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem); + typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem); + + typedef UINT32 (*pfnShadowEnumMonitors)(MONITOR_DEF* monitors, UINT32 maxMonitors); + + typedef int (*pfnShadowAuthenticate)(rdpShadowSubsystem* subsystem, rdpShadowClient* client, + const char* user, const char* domain, + const char* password); + typedef BOOL (*pfnShadowClientConnect)(rdpShadowSubsystem* subsystem, rdpShadowClient* client); + typedef void (*pfnShadowClientDisconnect)(rdpShadowSubsystem* subsystem, + rdpShadowClient* client); + typedef BOOL (*pfnShadowClientCapabilities)(rdpShadowSubsystem* subsystem, + rdpShadowClient* client); + + typedef BOOL (*pfnShadowSynchronizeEvent)(rdpShadowSubsystem* subsystem, + rdpShadowClient* client, UINT32 flags); + typedef BOOL (*pfnShadowKeyboardEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client, + UINT16 flags, UINT8 code); + typedef BOOL (*pfnShadowUnicodeKeyboardEvent)(rdpShadowSubsystem* subsystem, + rdpShadowClient* client, UINT16 flags, + UINT16 code); + typedef BOOL (*pfnShadowMouseEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client, + UINT16 flags, UINT16 x, UINT16 y); + typedef BOOL (*pfnShadowExtendedMouseEvent)(rdpShadowSubsystem* subsystem, + rdpShadowClient* client, UINT16 flags, UINT16 x, + UINT16 y); + + typedef BOOL (*pfnShadowChannelAudinServerReceiveSamples)(rdpShadowSubsystem* subsystem, + rdpShadowClient* client, + const AUDIO_FORMAT* format, + wStream* data); + + struct rdp_shadow_client + { + rdpContext context; + + HANDLE thread; + BOOL activated; + BOOL first_frame; + BOOL inLobby; + BOOL mayView; + BOOL mayInteract; + BOOL suppressOutput; + UINT16 surfaceId; + wMessageQueue* MsgQueue; + CRITICAL_SECTION lock; + REGION16 invalidRegion; + rdpShadowServer* server; + rdpShadowEncoder* encoder; + rdpShadowSubsystem* subsystem; + + UINT32 pointerX; + UINT32 pointerY; + + HANDLE vcm; + EncomspServerContext* encomsp; + RemdeskServerContext* remdesk; + RdpsndServerContext* rdpsnd; +#if defined(CHANNEL_AUDIN_SERVER) + audin_server_context* audin; +#endif + RdpgfxServerContext* rdpgfx; + + BOOL resizeRequested; + UINT32 resizeWidth; + UINT32 resizeHeight; + BOOL areGfxCapsReady; + }; + + struct rdp_shadow_server + { + void* ext; + HANDLE thread; + HANDLE StopEvent; + wArrayList* clients; + rdpSettings* settings; + rdpShadowScreen* screen; + rdpShadowSurface* surface; + rdpShadowSurface* lobby; + rdpShadowCapture* capture; + rdpShadowSubsystem* subsystem; + + DWORD port; + BOOL mayView; + BOOL mayInteract; + BOOL shareSubRect; + BOOL authentication; + UINT32 selectedMonitor; + RECTANGLE_16 subRect; + + /* Codec settings */ + RLGR_MODE rfxMode; + H264_RATECONTROL_MODE h264RateControlMode; + UINT32 h264BitRate; + UINT32 h264FrameRate; + UINT32 h264QP; + + char* ipcSocket; + char* ConfigPath; + char* CertificateFile; + char* PrivateKeyFile; + CRITICAL_SECTION lock; + freerdp_listener* listener; + + size_t maxClientsConnected; + }; + + struct rdp_shadow_surface + { + rdpShadowServer* server; + + UINT16 x; + UINT16 y; + UINT32 width; + UINT32 height; + UINT32 scanline; + DWORD format; + BYTE* data; + + CRITICAL_SECTION lock; + REGION16 invalidRegion; + }; + + struct S_RDP_SHADOW_ENTRY_POINTS + { + pfnShadowSubsystemNew New; + pfnShadowSubsystemFree Free; + + pfnShadowSubsystemInit Init; + pfnShadowSubsystemUninit Uninit; + + pfnShadowSubsystemStart Start; + pfnShadowSubsystemStop Stop; + + pfnShadowEnumMonitors EnumMonitors; + }; + + struct rdp_shadow_subsystem + { + RDP_SHADOW_ENTRY_POINTS ep; + HANDLE event; + UINT32 numMonitors; + UINT32 captureFrameRate; + UINT32 selectedMonitor; + MONITOR_DEF monitors[16]; + MONITOR_DEF virtualScreen; + + /* This event indicates that we have graphic change */ + /* such as screen update and resize. It should not be */ + /* used by subsystem implementation directly */ + rdpShadowMultiClientEvent* updateEvent; + + wMessagePipe* MsgPipe; + UINT32 pointerX; + UINT32 pointerY; + + AUDIO_FORMAT* rdpsndFormats; + size_t nRdpsndFormats; + AUDIO_FORMAT* audinFormats; + size_t nAudinFormats; + + pfnShadowSynchronizeEvent SynchronizeEvent; + pfnShadowKeyboardEvent KeyboardEvent; + pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent; + pfnShadowMouseEvent MouseEvent; + pfnShadowExtendedMouseEvent ExtendedMouseEvent; + pfnShadowChannelAudinServerReceiveSamples AudinServerReceiveSamples; + + pfnShadowAuthenticate Authenticate; + pfnShadowClientConnect ClientConnect; + pfnShadowClientDisconnect ClientDisconnect; + pfnShadowClientCapabilities ClientCapabilities; + + rdpShadowServer* server; + }; + +/* Definition of message between subsystem and clients */ +#define SHADOW_MSG_IN_REFRESH_REQUEST_ID 1001 + + typedef struct S_SHADOW_MSG_OUT SHADOW_MSG_OUT; + typedef void (*MSG_OUT_FREE_FN)(UINT32 id, + SHADOW_MSG_OUT* msg); /* function to free SHADOW_MSG_OUT */ + + struct S_SHADOW_MSG_OUT + { + int refCount; + MSG_OUT_FREE_FN Free; + }; + +#define SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID 2001 +#define SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID 2002 +#define SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID 2003 +#define SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID 2004 + + typedef struct + { + SHADOW_MSG_OUT common; + UINT32 xPos; + UINT32 yPos; + } SHADOW_MSG_OUT_POINTER_POSITION_UPDATE; + + typedef struct + { + SHADOW_MSG_OUT common; + UINT32 xHot; + UINT32 yHot; + UINT32 width; + UINT32 height; + UINT32 lengthAndMask; + UINT32 lengthXorMask; + BYTE* xorMaskData; + BYTE* andMaskData; + } SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE; + + typedef struct + { + SHADOW_MSG_OUT common; + AUDIO_FORMAT* audio_format; + void* buf; + size_t nFrames; + UINT16 wTimestamp; + } SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES; + + typedef struct + { + SHADOW_MSG_OUT common; + UINT16 left; + UINT16 right; + } SHADOW_MSG_OUT_AUDIO_OUT_VOLUME; + + FREERDP_API void shadow_subsystem_set_entry_builtin(const char* name); + FREERDP_API void shadow_subsystem_set_entry(pfnShadowSubsystemEntry pEntry); + + FREERDP_API int shadow_subsystem_pointer_convert_alpha_pointer_data( + BYTE* pixels, BOOL premultiplied, UINT32 width, UINT32 height, + SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* pointerColor); + + FREERDP_API int shadow_server_parse_command_line(rdpShadowServer* server, int argc, char** argv, + COMMAND_LINE_ARGUMENT_A* cargs); + FREERDP_API int shadow_server_command_line_status_print(rdpShadowServer* server, int argc, + char** argv, int status, + COMMAND_LINE_ARGUMENT_A* cargs); + + FREERDP_API int shadow_server_start(rdpShadowServer* server); + FREERDP_API int shadow_server_stop(rdpShadowServer* server); + + FREERDP_API int shadow_server_init(rdpShadowServer* server); + FREERDP_API int shadow_server_uninit(rdpShadowServer* server); + + FREERDP_API UINT32 shadow_enum_monitors(MONITOR_DEF* monitors, UINT32 maxMonitors); + + FREERDP_API void shadow_server_free(rdpShadowServer* server); + + WINPR_ATTR_MALLOC(shadow_server_free, 1) + FREERDP_API rdpShadowServer* shadow_server_new(void); + + FREERDP_API int shadow_capture_align_clip_rect(RECTANGLE_16* rect, RECTANGLE_16* clip); + FREERDP_API int shadow_capture_compare(BYTE* pData1, UINT32 nStep1, UINT32 nWidth, + UINT32 nHeight, BYTE* pData2, UINT32 nStep2, + RECTANGLE_16* rect); + + FREERDP_API void shadow_subsystem_frame_update(rdpShadowSubsystem* subsystem); + + FREERDP_API BOOL shadow_client_post_msg(rdpShadowClient* client, void* context, UINT32 type, + SHADOW_MSG_OUT* msg, void* lParam); + FREERDP_API int shadow_client_boardcast_msg(rdpShadowServer* server, void* context, UINT32 type, + SHADOW_MSG_OUT* msg, void* lParam); + FREERDP_API int shadow_client_boardcast_quit(rdpShadowServer* server, int nExitCode); + + FREERDP_API UINT32 shadow_encoder_preferred_fps(rdpShadowEncoder* encoder); + FREERDP_API UINT32 shadow_encoder_inflight_frames(rdpShadowEncoder* encoder); + + FREERDP_API BOOL shadow_screen_resize(rdpShadowScreen* screen); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SERVER_SHADOW_H */ diff --git a/include/freerdp/server/telemetry.h b/include/freerdp/server/telemetry.h new file mode 100644 index 0000000..0697e70 --- /dev/null +++ b/include/freerdp/server/telemetry.h @@ -0,0 +1,111 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Telemetry Virtual Channel Extension + * + * Copyright 2022 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_TELEMETRY_SERVER_TELEMETRY_H +#define FREERDP_CHANNEL_TELEMETRY_SERVER_TELEMETRY_H + +#include <freerdp/channels/telemetry.h> +#include <freerdp/channels/wtsvc.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_telemetry_server_context TelemetryServerContext; + + typedef UINT (*psTelemetryServerOpen)(TelemetryServerContext* context); + typedef UINT (*psTelemetryServerClose)(TelemetryServerContext* context); + + typedef BOOL (*psTelemetryServerChannelIdAssigned)(TelemetryServerContext* context, + UINT32 channelId); + + typedef UINT (*psTelemetryServerInitialize)(TelemetryServerContext* context, + BOOL externalThread); + typedef UINT (*psTelemetryServerPoll)(TelemetryServerContext* context); + typedef BOOL (*psTelemetryServerChannelHandle)(TelemetryServerContext* context, HANDLE* handle); + + typedef UINT (*psTelemetryServerRdpTelemetry)(TelemetryServerContext* context, + const TELEMETRY_RDP_TELEMETRY_PDU* rdpTelemetry); + + struct s_telemetry_server_context + { + HANDLE vcm; + + /* Server self-defined pointer. */ + void* userdata; + + /*** APIs called by the server. ***/ + + /** + * Optional: Set thread handling. + * When externalThread=TRUE, the application is responsible to call + * Poll() periodically to process channel events. + * + * Defaults to externalThread=FALSE + */ + psTelemetryServerInitialize Initialize; + + /** + * Open the telemetry channel. + */ + psTelemetryServerOpen Open; + + /** + * Close the telemetry channel. + */ + psTelemetryServerClose Close; + + /** + * Poll + * When externalThread=TRUE, call Poll() periodically from your main loop. + * If externalThread=FALSE do not call. + */ + psTelemetryServerPoll Poll; + + /** + * Retrieve the channel handle for use in conjunction with Poll(). + * If externalThread=FALSE do not call. + */ + psTelemetryServerChannelHandle ChannelHandle; + + /*** Callbacks registered by the server. ***/ + + /** + * Callback, when the channel got its id assigned + */ + psTelemetryServerChannelIdAssigned ChannelIdAssigned; + /** + * Callback for the RDP Telemetry PDU. + */ + psTelemetryServerRdpTelemetry RdpTelemetry; + + rdpContext* rdpcontext; + }; + + FREERDP_API void telemetry_server_context_free(TelemetryServerContext* context); + + WINPR_ATTR_MALLOC(telemetry_server_context_free, 1) + FREERDP_API TelemetryServerContext* telemetry_server_context_new(HANDLE vcm); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_TELEMETRY_SERVER_TELEMETRY_H */ diff --git a/include/freerdp/session.h b/include/freerdp/session.h new file mode 100644 index 0000000..12b8032 --- /dev/null +++ b/include/freerdp/session.h @@ -0,0 +1,59 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Client Session Info + * + * Copyright 2016 David FORT <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FREERDP_SESSION_H +#define FREERDP_SESSION_H + +#include <winpr/wtypes.h> + +/* Logon Information Types */ +#define INFO_TYPE_LOGON 0x00000000 +#define INFO_TYPE_LOGON_LONG 0x00000001 +#define INFO_TYPE_LOGON_PLAIN_NOTIFY 0x00000002 +#define INFO_TYPE_LOGON_EXTENDED_INF 0x00000003 + +#ifdef __cplusplus +extern "C" +{ +#endif + + struct rdp_logon_info + { + UINT32 sessionId; + char* username; + char* domain; + }; + typedef struct rdp_logon_info logon_info; + + struct rdp_logon_info_ex + { + BOOL haveCookie; + UINT32 LogonId; + BYTE ArcRandomBits[16]; + + BOOL haveErrorInfo; + UINT32 ErrorNotificationType; + UINT32 ErrorNotificationData; + }; + typedef struct rdp_logon_info_ex logon_info_ex; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SESSION_H */ diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h new file mode 100644 index 0000000..cd89b32 --- /dev/null +++ b/include/freerdp/settings.h @@ -0,0 +1,709 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP Settings + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2010-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2016 Armin Novak <armin.novak@gmail.com> + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SETTINGS_H +#define FREERDP_SETTINGS_H + +#include <winpr/timezone.h> +#include <winpr/wlog.h> + +#include <freerdp/api.h> +#include <freerdp/config.h> +#include <freerdp/types.h> +#include <freerdp/redirection.h> + +#if !defined(WITH_OPAQUE_SETTINGS) +#include <freerdp/settings_types_private.h> +#endif + +#include <freerdp/settings_keys.h> +#include <freerdp/settings_types.h> + +#include <freerdp/crypto/certificate.h> +#include <freerdp/crypto/privatekey.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** \file + * \brief This is the FreeRDP settings module. + * + * Settings are used to store configuration data for an RDP connection. + * There are 3 different settings for each client and server: + * + * 1. The initial connection supplied by the user + * 2. The settings sent from client or server during capability exchange + * 3. The settings merged from the capability exchange and the initial configuration. + * + * The lifetime of the settings is as follows: + * 1. Initial configuration is saved and will be valid for the whole application lifecycle + * 2. The client or server settings from the other end are valid from capability exchange until the + * connection is ended (disconnect/redirect/...) + * 3. The merged settings are created from the initial configuration and server settings and have + * the same lifetime, until the connection ends + * + * + * So, when accessing the settings always ensure to know which one you are operating on! (this is + * especially important for the proxy where you have a RDP client and RDP server in the same + * application context) + */ + +typedef struct rdp_settings rdpSettings; + +/** + * rdpSettings creation flags + */ +#define FREERDP_SETTINGS_SERVER_MODE 0x00000001 +#define FREERDP_SETTINGS_REMOTE_MODE 0x00000002 + + /** \brief creates a new setting struct + * + * \param flags Flags for creation, use \b FREERDP_SETTINGS_SERVER_MODE for server settings, 0 + * for client. + * + * \return A newly allocated settings struct or NULL + */ + FREERDP_API rdpSettings* freerdp_settings_new(DWORD flags); + + /** \brief Creates a deep copy of settings + * + * \param settings A pointer to a settings struct to copy. May be NULL (returns NULL) + * + * \return A newly allocated copy of \b settings or NULL + */ + FREERDP_API rdpSettings* freerdp_settings_clone(const rdpSettings* settings); + + /** \brief Deep copies settings from \b src to \b dst + * + * The function frees up all allocated data in \b dst before copying the data from \b src + * + * \param dst A pointer for the settings to copy data to. May be NULL (fails copy) + * \param src A pointer to the settings to copy. May be NULL (fails copy) + * + * \return \b TRUE for success, \b FALSE for failure. + */ + FREERDP_API BOOL freerdp_settings_copy(rdpSettings* dst, const rdpSettings* src); + + /** \brief copies one setting identified by \b id from \b src to \b dst + * + * The function frees up all allocated data in \b dst before copying the data from \b src + * + * \param dst A pointer for the settings to copy data to. May be NULL (fails copy) + * \param src A pointer to the settings to copy. May be NULL (fails copy) + * \param id The settings identifier to copy + * + * \return \b TRUE for success, \b FALSE for failure. + */ + + FREERDP_API BOOL freerdp_settings_copy_item(rdpSettings* dst, const rdpSettings* src, + SSIZE_T id); + + /** \brief Free a settings struct with all data in it + * + * \param settings A pointer to the settings to free, May be NULL + */ + FREERDP_API void freerdp_settings_free(rdpSettings* settings); + + /** \brief Dumps the contents of a settings struct to a WLog logger + * + * \param log The logger to write to, must not be NULL + * \param level The WLog level to use for the log entries + * \param settings A pointer to the settings to dump. May be NULL. + */ + FREERDP_API void freerdp_settings_dump(wLog* log, DWORD level, const rdpSettings* settings); + + /** \brief Dumps the difference between two settings structs to a WLog + * + * \param log The logger to write to, must not be NULL. + * \param level The WLog level to use for the log entries. + * \param src A pointer to the settings to dump. May be NULL. + * \param other A pointer to the settings to dump. May be NULL. + * + * \return \b TRUE if not equal, \b FALSE otherwise + */ + FREERDP_API BOOL freerdp_settings_print_diff(wLog* log, DWORD level, const rdpSettings* src, + const rdpSettings* other); + + FREERDP_API ADDIN_ARGV* freerdp_addin_argv_new(size_t argc, const char* argv[]); + FREERDP_API ADDIN_ARGV* freerdp_addin_argv_clone(const ADDIN_ARGV* args); + FREERDP_API void freerdp_addin_argv_free(ADDIN_ARGV* args); + + FREERDP_API BOOL freerdp_addin_argv_add_argument(ADDIN_ARGV* args, const char* argument); + FREERDP_API BOOL freerdp_addin_argv_add_argument_ex(ADDIN_ARGV* args, const char* argument, + size_t len); + FREERDP_API BOOL freerdp_addin_argv_del_argument(ADDIN_ARGV* args, const char* argument); + + FREERDP_API int freerdp_addin_set_argument(ADDIN_ARGV* args, const char* argument); + FREERDP_API int freerdp_addin_replace_argument(ADDIN_ARGV* args, const char* previous, + const char* argument); + FREERDP_API int freerdp_addin_set_argument_value(ADDIN_ARGV* args, const char* option, + const char* value); + FREERDP_API int freerdp_addin_replace_argument_value(ADDIN_ARGV* args, const char* previous, + const char* option, const char* value); + + FREERDP_API BOOL freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device); + FREERDP_API RDPDR_DEVICE* freerdp_device_collection_find(rdpSettings* settings, + const char* name); + FREERDP_API RDPDR_DEVICE* freerdp_device_collection_find_type(rdpSettings* settings, + UINT32 type); + + FREERDP_API void freerdp_device_free(RDPDR_DEVICE* device); + + WINPR_ATTR_MALLOC(freerdp_device_free, 1) + FREERDP_API RDPDR_DEVICE* freerdp_device_new(UINT32 Type, size_t count, const char* args[]); + + WINPR_ATTR_MALLOC(freerdp_device_free, 1) + FREERDP_API RDPDR_DEVICE* freerdp_device_clone(const RDPDR_DEVICE* device); + + FREERDP_API BOOL freerdp_device_equal(const RDPDR_DEVICE* one, const RDPDR_DEVICE* other); + + FREERDP_API void freerdp_device_collection_free(rdpSettings* settings); + + FREERDP_API BOOL freerdp_static_channel_collection_add(rdpSettings* settings, + ADDIN_ARGV* channel); + FREERDP_API BOOL freerdp_static_channel_collection_del(rdpSettings* settings, const char* name); + FREERDP_API ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings, + const char* name); +#if defined(WITH_FREERDP_DEPRECATED) + FREERDP_API WINPR_DEPRECATED(ADDIN_ARGV* freerdp_static_channel_clone(ADDIN_ARGV* channel)); +#endif + + FREERDP_API void freerdp_static_channel_collection_free(rdpSettings* settings); + + FREERDP_API BOOL freerdp_dynamic_channel_collection_add(rdpSettings* settings, + ADDIN_ARGV* channel); + FREERDP_API BOOL freerdp_dynamic_channel_collection_del(rdpSettings* settings, + const char* name); + FREERDP_API ADDIN_ARGV* freerdp_dynamic_channel_collection_find(const rdpSettings* settings, + const char* name); + +#if defined(WITH_FREERDP_DEPRECATED) + FREERDP_API WINPR_DEPRECATED(ADDIN_ARGV* freerdp_dynamic_channel_clone(ADDIN_ARGV* channel)); +#endif + + FREERDP_API void freerdp_dynamic_channel_collection_free(rdpSettings* settings); + FREERDP_API void freerdp_capability_buffer_free(rdpSettings* settings); + FREERDP_API BOOL freerdp_capability_buffer_copy(rdpSettings* settings, const rdpSettings* src); + + FREERDP_API void freerdp_server_license_issuers_free(rdpSettings* settings); + FREERDP_API BOOL freerdp_server_license_issuers_copy(rdpSettings* settings, char** addresses, + UINT32 count); + + FREERDP_API void freerdp_target_net_addresses_free(rdpSettings* settings); + FREERDP_API BOOL freerdp_target_net_addresses_copy(rdpSettings* settings, char** addresses, + UINT32 count); + + FREERDP_API void freerdp_performance_flags_make(rdpSettings* settings); + FREERDP_API void freerdp_performance_flags_split(rdpSettings* settings); + + FREERDP_API BOOL freerdp_set_gateway_usage_method(rdpSettings* settings, + UINT32 GatewayUsageMethod); + FREERDP_API void freerdp_update_gateway_usage_method(rdpSettings* settings, + UINT32 GatewayEnabled, + UINT32 GatewayBypassLocal); + + /* DEPRECATED: + * the functions freerdp_get_param_* and freerdp_set_param_* are deprecated. + * use freerdp_settings_get_* and freerdp_settings_set_* as a replacement! + */ +#if defined(WITH_FREERDP_DEPRECATED) + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_get_bool instead", + BOOL freerdp_get_param_bool(const rdpSettings* settings, + int id)); + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_set_bool instead", + int freerdp_set_param_bool(rdpSettings* settings, int id, + BOOL param)); + + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_get_int[16|32] instead", + int freerdp_get_param_int(const rdpSettings* settings, + int id)); + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_set_int[16|32] instead", + int freerdp_set_param_int(rdpSettings* settings, int id, + int param)); + + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_set_uint32 instead", + UINT32 freerdp_get_param_uint32(const rdpSettings* settings, + int id)); + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_set_uint32 instead", + int freerdp_set_param_uint32(rdpSettings* settings, int id, + UINT32 param)); + + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_get_uint64 instead", + UINT64 freerdp_get_param_uint64(const rdpSettings* settings, + int id)); + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_set_uint64 instead", + int freerdp_set_param_uint64(rdpSettings* settings, int id, + UINT64 param)); + + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_get_string instead", + char* freerdp_get_param_string(const rdpSettings* settings, + int id)); + FREERDP_API WINPR_DEPRECATED_VAR("Use freerdp_settings_set_string instead", + int freerdp_set_param_string(rdpSettings* settings, int id, + const char* param)); +#endif + + /** \brief Returns \b TRUE if settings are in a valid state, \b FALSE otherwise + * + * This function is meant to replace tideous return checks for \b freerdp_settings_set_* with a + * single check after these calls. + * + * \param settings the settings instance to check + * + * \return \b TRUE if valid, \b FALSE otherwise + */ + FREERDP_API BOOL freerdp_settings_are_valid(const rdpSettings* settings); + + /** \brief Returns a boolean settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the value of the boolean key + */ + FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings* settings, + FreeRDP_Settings_Keys_Bool id); + + /** \brief Sets a BOOL settings value. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings* settings, FreeRDP_Settings_Keys_Bool id, + BOOL param); + + /** \brief Returns a INT16 settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the value of the INT16 key + */ + FREERDP_API INT16 freerdp_settings_get_int16(const rdpSettings* settings, + FreeRDP_Settings_Keys_Int16 id); + + /** \brief Sets a INT16 settings value. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_int16(rdpSettings* settings, + FreeRDP_Settings_Keys_Int16 id, INT16 param); + + /** \brief Returns a UINT16 settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the value of the UINT16 key + */ + FREERDP_API UINT16 freerdp_settings_get_uint16(const rdpSettings* settings, + FreeRDP_Settings_Keys_UInt16 id); + + /** \brief Sets a UINT16 settings value. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_uint16(rdpSettings* settings, + FreeRDP_Settings_Keys_UInt16 id, UINT16 param); + + /** \brief Returns a INT32 settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the value of the INT32 key + */ + FREERDP_API INT32 freerdp_settings_get_int32(const rdpSettings* settings, + FreeRDP_Settings_Keys_Int32 id); + + /** \brief Sets a INT32 settings value. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_int32(rdpSettings* settings, + FreeRDP_Settings_Keys_Int32 id, INT32 param); + + /** \brief Returns a UINT32 settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the value of the UINT32 key + */ + FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings* settings, + FreeRDP_Settings_Keys_UInt32 id); + + /** \brief Sets a UINT32 settings value. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings* settings, + FreeRDP_Settings_Keys_UInt32 id, UINT32 param); + + /** \brief Returns a INT64 settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the value of the INT64 key + */ + FREERDP_API INT64 freerdp_settings_get_int64(const rdpSettings* settings, + FreeRDP_Settings_Keys_Int64 id); + + /** \brief Sets a INT64 settings value. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_int64(rdpSettings* settings, + FreeRDP_Settings_Keys_Int64 id, INT64 param); + + /** \brief Returns a UINT64 settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the value of the UINT64 key + */ + FREERDP_API UINT64 freerdp_settings_get_uint64(const rdpSettings* settings, + FreeRDP_Settings_Keys_UInt64 id); + + /** \brief Sets a UINT64 settings value. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_uint64(rdpSettings* settings, + FreeRDP_Settings_Keys_UInt64 id, UINT64 param); + + /** \brief Returns a immutable string settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the immutable string pointer + */ + FREERDP_API const char* freerdp_settings_get_string(const rdpSettings* settings, + FreeRDP_Settings_Keys_String id); + + /** \brief Returns a string settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the string pointer + */ + FREERDP_API char* freerdp_settings_get_string_writable(rdpSettings* settings, + FreeRDP_Settings_Keys_String id); + + /** \brief Sets a string settings value. The \b param is copied. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. If NULL allocates an empty string buffer of \b len size, + * otherwise a copy is created. \param len The length of \b param, 0 to remove the old entry. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_string_len(rdpSettings* settings, + FreeRDP_Settings_Keys_String id, + const char* param, size_t len); + + /** \brief Sets a string settings value. The \b param is copied. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. If NULL removes the old entry, otherwise a copy is created. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_string(rdpSettings* settings, + FreeRDP_Settings_Keys_String id, + const char* param); + + /** \brief appends a string to a settings value. The \b param is copied. + * If the initial value of the setting was not empty, <old value><separator><param> is created + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param separator The separator string to use. May be NULL (no separator) + * \param param The value to append + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_append_string(rdpSettings* settings, + FreeRDP_Settings_Keys_String id, + const char* separator, const char* param); + + /** \brief Sets a string settings value. The \b param is converted to UTF-8 and the copy stored. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. If NULL removes the old entry, otherwise a copy is created. + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_string_from_utf16(rdpSettings* settings, + FreeRDP_Settings_Keys_String id, + const WCHAR* param); + + /** \brief Sets a string settings value. The \b param is converted to UTF-8 and the copy stored. + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * \param param The value to set. If NULL removes the old entry, otherwise a copy is created. + * \param length The length of the WCHAR string in number of WCHAR characters + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_string_from_utf16N(rdpSettings* settings, + FreeRDP_Settings_Keys_String id, + const WCHAR* param, size_t length); + /** \brief Return an allocated UTF16 string + * + * \param settings A pointer to the settings struct to use + * \param id The settings identifier + * + * \return An allocated, '\0' terminated WCHAR string or NULL + */ + FREERDP_API WCHAR* freerdp_settings_get_string_as_utf16(const rdpSettings* settings, + FreeRDP_Settings_Keys_String id, + size_t* pCharLen); + + /** \brief Returns a immutable pointer settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the immutable pointer value + */ + FREERDP_API const void* freerdp_settings_get_pointer(const rdpSettings* settings, + FreeRDP_Settings_Keys_Pointer id); + + /** \brief Returns a mutable pointer settings value + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to query + * + * \return the mutable pointer value + */ + FREERDP_API void* freerdp_settings_get_pointer_writable(rdpSettings* settings, + FreeRDP_Settings_Keys_Pointer id); + + /** \brief Set a pointer to value \b data + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to update + * \param data The data to set (direct update, no copy created, previous value overwritten) + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_pointer(rdpSettings* settings, + FreeRDP_Settings_Keys_Pointer id, + const void* data); + + /** \brief Set a pointer to value \b data + * + * \param settings A pointer to the settings to query, must not be NULL. + * \param id The key to update + * \param data The data to set (copy created, previous value freed) + * + * \return \b TRUE for success, \b FALSE for failure + */ + FREERDP_API BOOL freerdp_settings_set_pointer_len(rdpSettings* settings, + FreeRDP_Settings_Keys_Pointer id, + const void* data, size_t len); + + FREERDP_API const void* freerdp_settings_get_pointer_array(const rdpSettings* settings, + FreeRDP_Settings_Keys_Pointer id, + size_t offset); + FREERDP_API void* freerdp_settings_get_pointer_array_writable(const rdpSettings* settings, + FreeRDP_Settings_Keys_Pointer id, + size_t offset); + FREERDP_API BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, + FreeRDP_Settings_Keys_Pointer id, + size_t offset, const void* data); + + FREERDP_API BOOL freerdp_settings_set_value_for_name(rdpSettings* settings, const char* name, + const char* value); + + /** \brief Get a key index for the name string of that key + * + * \param value A key name string like FreeRDP_ServerMode + * + * \return The key index or -1 in case of an error (e.g. name does not exist) + */ + FREERDP_API SSIZE_T freerdp_settings_get_key_for_name(const char* value); + + /** \brief Get a key type for the name string of that key + * + * \param value A key name string like FreeRDP_ServerMode + * + * \return The key type (e.g. FREERDP_SETTINGS_TYPE_BOOL) or -1 in case of an error (e.g. name + * does not exist) + */ + FREERDP_API SSIZE_T freerdp_settings_get_type_for_name(const char* value); + + /** \brief Get a key type for the key index + * + * \param key The key index like FreeRDP_ServerMode + * + * \return The key type (e.g. FREERDP_SETTINGS_TYPE_BOOL) or -1 in case of an error (e.g. name + * does not exist) + */ + FREERDP_API SSIZE_T freerdp_settings_get_type_for_key(SSIZE_T key); + + /** \brief Returns the type name for a \b key + * + * \param key the key number to stringify + * \return the type name of the key or \b FREERDP_SETTINGS_TYPE_UNKNOWN + */ + FREERDP_API const char* freerdp_settings_get_type_name_for_key(SSIZE_T key); + + /** \brief Returns the type name for a \b type + * + * \param type the type to stringify + * \return the name of the key or \b FREERDP_SETTINGS_TYPE_UNKNOWN + */ + FREERDP_API const char* freerdp_settings_get_type_name_for_type(SSIZE_T type); + + /** \brief Returns the type name for a \b key + * + * \param key the key number to stringify + * \return the name of the key or \b NULL + */ + FREERDP_API const char* freerdp_settings_get_name_for_key(SSIZE_T key); + + /** \brief helper function to get a mask of supported codec flags. + * + * This function checks various settings to create a mask of supported codecs + * \b FreeRDP_CodecFlags defines the codecs + * + * \param settings the settings to check + * + * \return a mask of supported codecs + */ + FREERDP_API UINT32 freerdp_settings_get_codecs_flags(const rdpSettings* settings); + + /** \brief Parse capability data and apply to settings + * + * The capability message is stored in raw form in the settings, the data parsed and applied to + * the settings. + * + * \param settings A pointer to the settings to use + * \param capsFlags A pointer to the capablity flags, must have capsCount fields + * \param capsData A pointer array to the RAW capability data, must have capsCount fields + * \param capsSizes A pointer to an array of RAW capability sizes, must have capsCount fields + * \param capsCount The number of capabilities contained in the RAW data + * \param serverReceivedCaps Indicates if the parser should assume to be a server or client + * instance + * + * \return \b TRUE for success, \b FALSE in case of an error + */ + FREERDP_API BOOL freerdp_settings_update_from_caps(rdpSettings* settings, const BYTE* capsFlags, + const BYTE** capsData, + const UINT32* capsSizes, UINT32 capsCount, + BOOL serverReceivedCaps); + + /** \brief A helper function to return the correct server name. + * + * The server name might be in key FreeRDP_ServerHostname or if used in + * FreeRDP_UserSpecifiedServerName. This function returns the correct name to use. + * + * \param settings The settings to query, must not be NULL. + * + * \return A string pointer or NULL in case of failure. + */ + FREERDP_API const char* freerdp_settings_get_server_name(const rdpSettings* settings); + + /** \brief Returns a stringified representation of RAIL support flags + * + * \param flags The flags to stringify + * \param buffer A pointer to the string buffer to write to + * \param length The size of the string buffer + * + * \return A pointer to \b buffer for success, NULL otherwise + */ + FREERDP_API char* freerdp_rail_support_flags_to_string(UINT32 flags, char* buffer, + size_t length); + + /** \brief Returns a stringified representation of the RDP protocol version. + * + * \param version The RDP protocol version number. + * + * \return A string representation of the protocol version as "RDP_VERSION_10_11" or + * "RDP_VERSION_UNKNOWN" for invalid/unknown versions + */ + FREERDP_API const char* freerdp_rdp_version_string(UINT32 version); + + /** \brief Returns a string representation of \b RDPDR_DTYP_* + * + * \param type The integer of the \b RDPDR_DTYP_* to stringify + * + * \return A string representation of the \b RDPDR_DTYP_* or "RDPDR_DTYP_UNKNOWN" + */ + FREERDP_API const char* freerdp_rdpdr_dtyp_string(UINT32 type); + + FREERDP_API const char* freerdp_encryption_level_string(UINT32 EncryptionLevel); + FREERDP_API const char* freerdp_encryption_methods_string(UINT32 EncryptionLevel, char* buffer, + size_t size); + + /** \brief returns a string representation of \b RNS_UD_XXBPP_SUPPORT values + * + * return A string reprenentation of the bitmask. + */ + FREERDP_API const char* freerdp_supported_color_depths_string(UINT16 mask, char* buffer, + size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SETTINGS_H */ diff --git a/include/freerdp/settings_types.h b/include/freerdp/settings_types.h new file mode 100644 index 0000000..ef489e3 --- /dev/null +++ b/include/freerdp/settings_types.h @@ -0,0 +1,514 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP Settings + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2010-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2016 Armin Novak <armin.novak@gmail.com> + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SETTINGS_TYPES_H +#define FREERDP_SETTINGS_TYPES_H + +#include <winpr/timezone.h> +#include <winpr/wlog.h> + +#include <freerdp/api.h> +#include <freerdp/config.h> +#include <freerdp/types.h> +#include <freerdp/redirection.h> + +#include <freerdp/crypto/certificate.h> +#include <freerdp/crypto/privatekey.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** \file + * \brief This is the FreeRDP settings module. + * + * Settings are used to store configuration data for an RDP connection. + * There are 3 different settings for each client and server: + * + * 1. The initial connection supplied by the user + * 2. The settings sent from client or server during capability exchange + * 3. The settings merged from the capability exchange and the initial configuration. + * + * The lifetime of the settings is as follows: + * 1. Initial configuration is saved and will be valid for the whole application lifecycle + * 2. The client or server settings from the other end are valid from capability exchange until the + * connection is ended (disconnect/redirect/...) + * 3. The merged settings are created from the initial configuration and server settings and have + * the same lifetime, until the connection ends + * + * + * So, when accessing the settings always ensure to know which one you are operating on! (this is + * especially important for the proxy where you have a RDP client and RDP server in the same + * application context) + */ + +/* RAIL Support Level */ +#define RAIL_LEVEL_SUPPORTED 0x00000001 +#define RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED 0x00000002 +#define RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED 0x00000004 +#define RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED 0x00000008 +#define RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED 0x00000010 +#define RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED 0x00000020 +#define RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED 0x00000040 +#define RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED 0x00000080 + +/* Performance Flags */ +#define PERF_FLAG_NONE 0x00000000 +#define PERF_DISABLE_WALLPAPER 0x00000001 +#define PERF_DISABLE_FULLWINDOWDRAG 0x00000002 +#define PERF_DISABLE_MENUANIMATIONS 0x00000004 +#define PERF_DISABLE_THEMING 0x00000008 +#define PERF_DISABLE_CURSOR_SHADOW 0x00000020 +#define PERF_DISABLE_CURSORSETTINGS 0x00000040 +#define PERF_ENABLE_FONT_SMOOTHING 0x00000080 +#define PERF_ENABLE_DESKTOP_COMPOSITION 0x00000100 + +/* Connection Types */ +#define CONNECTION_TYPE_MODEM 0x01 +#define CONNECTION_TYPE_BROADBAND_LOW 0x02 +#define CONNECTION_TYPE_SATELLITE 0x03 +#define CONNECTION_TYPE_BROADBAND_HIGH 0x04 +#define CONNECTION_TYPE_WAN 0x05 +#define CONNECTION_TYPE_LAN 0x06 +#define CONNECTION_TYPE_AUTODETECT 0x07 + +/* Client to Server (CS) data blocks */ +#define CS_CORE 0xC001 +#define CS_SECURITY 0xC002 +#define CS_NET 0xC003 +#define CS_CLUSTER 0xC004 +#define CS_MONITOR 0xC005 +#define CS_MCS_MSGCHANNEL 0xC006 +#define CS_MONITOR_EX 0xC008 +#define CS_UNUSED1 0xC00C +#define CS_MULTITRANSPORT 0xC00A + +/* Server to Client (SC) data blocks */ +#define SC_CORE 0x0C01 +#define SC_SECURITY 0x0C02 +#define SC_NET 0x0C03 +#define SC_MCS_MSGCHANNEL 0x0C04 +#define SC_MULTITRANSPORT 0x0C08 + + /* RDP versions, see + * [MS-RDPBCGR] 2.2.1.3.2 Client Core Data (TS_UD_CS_CORE) + * [MS-RDPBCGR] 2.2.1.4.2 Server Core Data (TS_UD_SC_CORE) + */ + typedef enum + { + RDP_VERSION_4 = 0x00080001, + RDP_VERSION_5_PLUS = 0x00080004, + RDP_VERSION_10_0 = 0x00080005, + RDP_VERSION_10_1 = 0x00080006, + RDP_VERSION_10_2 = 0x00080007, + RDP_VERSION_10_3 = 0x00080008, + RDP_VERSION_10_4 = 0x00080009, + RDP_VERSION_10_5 = 0x0008000a, + RDP_VERSION_10_6 = 0x0008000b, + RDP_VERSION_10_7 = 0x0008000C, + RDP_VERSION_10_8 = 0x0008000D, + RDP_VERSION_10_9 = 0x0008000E, + RDP_VERSION_10_10 = 0x0008000F, + RDP_VERSION_10_11 = 0x00080010, + RDP_VERSION_10_12 = 0x00080011 + } RDP_VERSION; + +/* Color depth */ +#define RNS_UD_COLOR_4BPP 0xCA00 +#define RNS_UD_COLOR_8BPP 0xCA01 +#define RNS_UD_COLOR_16BPP_555 0xCA02 +#define RNS_UD_COLOR_16BPP_565 0xCA03 +#define RNS_UD_COLOR_24BPP 0xCA04 + +/* Secure Access Sequence */ +#define RNS_UD_SAS_DEL 0xAA03 + +/* Supported Color Depths */ +#define RNS_UD_24BPP_SUPPORT 0x0001 +#define RNS_UD_16BPP_SUPPORT 0x0002 +#define RNS_UD_15BPP_SUPPORT 0x0004 +#define RNS_UD_32BPP_SUPPORT 0x0008 + +/* Audio Mode */ +#define AUDIO_MODE_REDIRECT 0 /* Bring to this computer */ +#define AUDIO_MODE_PLAY_ON_SERVER 1 /* Leave at remote computer */ +#define AUDIO_MODE_NONE 2 /* Do not play */ + +/* Early Capability Flags (Client to Server) */ +#define RNS_UD_CS_SUPPORT_ERRINFO_PDU 0x0001 +#define RNS_UD_CS_WANT_32BPP_SESSION 0x0002 +#define RNS_UD_CS_SUPPORT_STATUSINFO_PDU 0x0004 +#define RNS_UD_CS_STRONG_ASYMMETRIC_KEYS 0x0008 +#define RNS_UD_CS_RELATIVE_MOUSE_INPUT 0x0010 +#define RNS_UD_CS_VALID_CONNECTION_TYPE 0x0020 +#define RNS_UD_CS_SUPPORT_MONITOR_LAYOUT_PDU 0x0040 +#define RNS_UD_CS_SUPPORT_NETCHAR_AUTODETECT 0x0080 +#define RNS_UD_CS_SUPPORT_DYNVC_GFX_PROTOCOL 0x0100 +#define RNS_UD_CS_SUPPORT_DYNAMIC_TIME_ZONE 0x0200 +#define RNS_UD_CS_SUPPORT_HEARTBEAT_PDU 0x0400 +#define RNS_UD_CS_SUPPORT_SKIP_CHANNELJOIN 0x0800 + +/* Early Capability Flags (Server to Client) */ +#define RNS_UD_SC_EDGE_ACTIONS_SUPPORTED_V1 0x00000001 +#define RNS_UD_SC_DYNAMIC_DST_SUPPORTED 0x00000002 +#define RNS_UD_SC_EDGE_ACTIONS_SUPPORTED_V2 0x00000004 +#define RNS_UD_SC_SKIP_CHANNELJOIN_SUPPORTED 0x00000008 + +/* Cluster Information Flags */ +#define REDIRECTION_SUPPORTED 0x00000001 +#define REDIRECTED_SESSIONID_FIELD_VALID 0x00000002 +#define REDIRECTED_SMARTCARD 0x00000040 + +#define ServerSessionRedirectionVersionMask 0x0000003c +#define REDIRECTION_VERSION1 0x00 +#define REDIRECTION_VERSION2 0x01 +#define REDIRECTION_VERSION3 0x02 +#define REDIRECTION_VERSION4 0x03 +#define REDIRECTION_VERSION5 0x04 +#define REDIRECTION_VERSION6 0x05 + +#define MONITOR_PRIMARY 0x00000001 + +/* Encryption Methods */ +#define ENCRYPTION_METHOD_NONE 0x00000000 +#define ENCRYPTION_METHOD_40BIT 0x00000001 +#define ENCRYPTION_METHOD_128BIT 0x00000002 +#define ENCRYPTION_METHOD_56BIT 0x00000008 +#define ENCRYPTION_METHOD_FIPS 0x00000010 + +/* Encryption Levels */ +#define ENCRYPTION_LEVEL_NONE 0x00000000 +#define ENCRYPTION_LEVEL_LOW 0x00000001 +#define ENCRYPTION_LEVEL_CLIENT_COMPATIBLE 0x00000002 +#define ENCRYPTION_LEVEL_HIGH 0x00000003 +#define ENCRYPTION_LEVEL_FIPS 0x00000004 + +/* Multitransport Types */ +#define TRANSPORT_TYPE_UDP_FECR 0x00000001 +#define TRANSPORT_TYPE_UDP_FECL 0x00000004 +#define TRANSPORT_TYPE_UDP_PREFERRED 0x00000100 +#define SOFTSYNC_TCP_TO_UDP 0x00000200 + +/* Static Virtual Channel Options */ +#define CHANNEL_OPTION_INITIALIZED 0x80000000 +#define CHANNEL_OPTION_ENCRYPT_RDP 0x40000000 +#define CHANNEL_OPTION_ENCRYPT_SC 0x20000000 +#define CHANNEL_OPTION_ENCRYPT_CS 0x10000000 +#define CHANNEL_OPTION_PRI_HIGH 0x08000000 +#define CHANNEL_OPTION_PRI_MED 0x04000000 +#define CHANNEL_OPTION_PRI_LOW 0x02000000 +#define CHANNEL_OPTION_COMPRESS_RDP 0x00800000 +#define CHANNEL_OPTION_COMPRESS 0x00400000 +#define CHANNEL_OPTION_SHOW_PROTOCOL 0x00200000 +#define CHANNEL_REMOTE_CONTROL_PERSISTENT 0x00100000 + +/* Virtual Channel Capability Flags */ +#define VCCAPS_NO_COMPR 0x00000000 +#define VCCAPS_COMPR_SC 0x00000001 +#define VCCAPS_COMPR_CS_8K 0x00000002 + +/* Large Pointer Support Flags */ +#define LARGE_POINTER_FLAG_96x96 0x00000001 +#define LARGE_POINTER_FLAG_384x384 0x00000002 + +/* Auto Reconnect Version */ +#define AUTO_RECONNECT_VERSION_1 0x00000001 + +/* Cookie Lengths */ +#define MSTSC_COOKIE_MAX_LENGTH 9 +#define DEFAULT_COOKIE_MAX_LENGTH 0xFF + +/* Order Support */ +#define NEG_DSTBLT_INDEX 0x00 +#define NEG_PATBLT_INDEX 0x01 +#define NEG_SCRBLT_INDEX 0x02 +#define NEG_MEMBLT_INDEX 0x03 +#define NEG_MEM3BLT_INDEX 0x04 +#define NEG_ATEXTOUT_INDEX 0x05 +#define NEG_AEXTTEXTOUT_INDEX 0x06 /* Must be ignored */ +#define NEG_DRAWNINEGRID_INDEX 0x07 /* Must be ignored */ +#define NEG_LINETO_INDEX 0x08 +#define NEG_MULTI_DRAWNINEGRID_INDEX 0x09 +#define NEG_OPAQUE_RECT_INDEX 0x0A /* Must be ignored */ +#define NEG_SAVEBITMAP_INDEX 0x0B +#define NEG_WTEXTOUT_INDEX 0x0C /* Must be ignored */ +#define NEG_MEMBLT_V2_INDEX 0x0D /* Must be ignored */ +#define NEG_MEM3BLT_V2_INDEX 0x0E /* Must be ignored */ +#define NEG_MULTIDSTBLT_INDEX 0x0F +#define NEG_MULTIPATBLT_INDEX 0x10 +#define NEG_MULTISCRBLT_INDEX 0x11 +#define NEG_MULTIOPAQUERECT_INDEX 0x12 +#define NEG_FAST_INDEX_INDEX 0x13 +#define NEG_POLYGON_SC_INDEX 0x14 +#define NEG_POLYGON_CB_INDEX 0x15 +#define NEG_POLYLINE_INDEX 0x16 +#define NEG_UNUSED23_INDEX 0x17 /* Must be ignored */ +#define NEG_FAST_GLYPH_INDEX 0x18 +#define NEG_ELLIPSE_SC_INDEX 0x19 +#define NEG_ELLIPSE_CB_INDEX 0x1A +#define NEG_GLYPH_INDEX_INDEX 0x1B +#define NEG_GLYPH_WEXTTEXTOUT_INDEX 0x1C /* Must be ignored */ +#define NEG_GLYPH_WLONGTEXTOUT_INDEX 0x1D /* Must be ignored */ +#define NEG_GLYPH_WLONGEXTTEXTOUT_INDEX 0x1E /* Must be ignored */ +#define NEG_UNUSED31_INDEX 0x1F /* Must be ignored */ + +/* Glyph Support Level */ +#define GLYPH_SUPPORT_NONE 0x0000 +#define GLYPH_SUPPORT_PARTIAL 0x0001 +#define GLYPH_SUPPORT_FULL 0x0002 +#define GLYPH_SUPPORT_ENCODE 0x0003 + +/* Gateway Usage Method */ +#define TSC_PROXY_MODE_NONE_DIRECT 0x0 +#define TSC_PROXY_MODE_DIRECT 0x1 +#define TSC_PROXY_MODE_DETECT 0x2 +#define TSC_PROXY_MODE_DEFAULT 0x3 +#define TSC_PROXY_MODE_NONE_DETECT 0x4 + +/* Gateway Credentials Source */ +#define TSC_PROXY_CREDS_MODE_USERPASS 0x0 +#define TSC_PROXY_CREDS_MODE_SMARTCARD 0x1 +#define TSC_PROXY_CREDS_MODE_ANY 0x2 + +/* Keyboard Hook */ +#define KEYBOARD_HOOK_LOCAL 0 +#define KEYBOARD_HOOK_REMOTE 1 +#define KEYBOARD_HOOK_FULLSCREEN_ONLY 2 + + typedef struct + { + UINT32 Length; + LPWSTR Address; + } TARGET_NET_ADDRESS; + +/* Logon Error Info */ +#define LOGON_MSG_DISCONNECT_REFUSED 0xFFFFFFF9 +#define LOGON_MSG_NO_PERMISSION 0xFFFFFFFA +#define LOGON_MSG_BUMP_OPTIONS 0xFFFFFFFB +#define LOGON_MSG_RECONNECT_OPTIONS 0xFFFFFFFC +#define LOGON_MSG_SESSION_TERMINATE 0xFFFFFFFD +#define LOGON_MSG_SESSION_CONTINUE 0xFFFFFFFE + +#define LOGON_FAILED_BAD_PASSWORD 0x00000000 +#define LOGON_FAILED_UPDATE_PASSWORD 0x00000001 +#define LOGON_FAILED_OTHER 0x00000002 +#define LOGON_WARNING 0x00000003 + +/* Server Status Info */ +#define STATUS_FINDING_DESTINATION 0x00000401 +#define STATUS_LOADING_DESTINATION 0x00000402 +#define STATUS_BRINGING_SESSION_ONLINE 0x00000403 +#define STATUS_REDIRECTING_TO_DESTINATION 0x00000404 +#define STATUS_VM_LOADING 0x00000501 +#define STATUS_VM_WAKING 0x00000502 +#define STATUS_VM_BOOTING 0x00000503 + +/* Compression Flags */ +#define PACKET_COMPR_TYPE_8K 0x00 +#define PACKET_COMPR_TYPE_64K 0x01 +#define PACKET_COMPR_TYPE_RDP6 0x02 +#define PACKET_COMPR_TYPE_RDP61 0x03 +#define PACKET_COMPR_TYPE_RDP8 0x04 + +/* Desktop Rotation Flags */ +#define ORIENTATION_LANDSCAPE 0 +#define ORIENTATION_PORTRAIT 90 +#define ORIENTATION_LANDSCAPE_FLIPPED 180 +#define ORIENTATION_PORTRAIT_FLIPPED 270 + +/* Clipboard feature mask */ +#define CLIPRDR_FLAG_LOCAL_TO_REMOTE 0x01 +#define CLIPRDR_FLAG_LOCAL_TO_REMOTE_FILES 0x02 +#define CLIPRDR_FLAG_REMOTE_TO_LOCAL 0x10 +#define CLIPRDR_FLAG_REMOTE_TO_LOCAL_FILES 0x20 + +#define CLIPRDR_FLAG_DEFAULT_MASK \ + (CLIPRDR_FLAG_LOCAL_TO_REMOTE | CLIPRDR_FLAG_LOCAL_TO_REMOTE_FILES | \ + CLIPRDR_FLAG_REMOTE_TO_LOCAL | CLIPRDR_FLAG_REMOTE_TO_LOCAL_FILES) + + /* ARC_CS_PRIVATE_PACKET */ + typedef struct + { + UINT32 cbLen; + UINT32 version; + UINT32 logonId; + BYTE securityVerifier[16]; + } ARC_CS_PRIVATE_PACKET; + + /* ARC_SC_PRIVATE_PACKET */ + typedef struct + { + UINT32 cbLen; + UINT32 version; + UINT32 logonId; + BYTE arcRandomBits[16]; + } ARC_SC_PRIVATE_PACKET; + + /* Channels */ + + typedef struct + { + int argc; + char** argv; + } ADDIN_ARGV; + + /* Extensions */ + + struct rdp_ext_set + { + char name[256]; /* plugin name or path */ + void* data; /* plugin data */ + }; + + /* Bitmap Cache */ + + typedef struct + { + UINT16 numEntries; + UINT16 maxSize; + } BITMAP_CACHE_CELL_INFO; + + typedef struct + { + UINT32 numEntries; + BOOL persistent; + } BITMAP_CACHE_V2_CELL_INFO; + + /* Glyph Cache */ + + typedef struct + { + UINT16 cacheEntries; + UINT16 cacheMaximumCellSize; + } GLYPH_CACHE_DEFINITION; + + /* Monitors */ + + typedef struct + { + INT32 left; + INT32 top; + INT32 right; + INT32 bottom; + UINT32 flags; + } MONITOR_DEF; + + typedef struct + { + UINT32 physicalWidth; + UINT32 physicalHeight; + UINT32 orientation; + UINT32 desktopScaleFactor; + UINT32 deviceScaleFactor; + } MONITOR_ATTRIBUTES; + + typedef struct + { + INT32 x; + INT32 y; + INT32 width; + INT32 height; + UINT32 is_primary; + UINT32 orig_screen; + MONITOR_ATTRIBUTES attributes; + } rdpMonitor; + +/* Device Redirection */ +#define RDPDR_DTYP_SERIAL 0x00000001 +#define RDPDR_DTYP_PARALLEL 0x00000002 +#define RDPDR_DTYP_PRINT 0x00000004 +#define RDPDR_DTYP_FILESYSTEM 0x00000008 +#define RDPDR_DTYP_SMARTCARD 0x00000020 + + typedef struct + { + UINT32 Id; + UINT32 Type; + char* Name; + } RDPDR_DEVICE; + + typedef struct + { + RDPDR_DEVICE device; + char* Path; + BOOL automount; + } RDPDR_DRIVE; + + typedef struct + { + RDPDR_DEVICE device; + char* DriverName; + BOOL IsDefault; + } RDPDR_PRINTER; + + typedef struct + { + RDPDR_DEVICE device; + } RDPDR_SMARTCARD; + + typedef struct + { + RDPDR_DEVICE device; + char* Path; + char* Driver; + char* Permissive; + } RDPDR_SERIAL; + + typedef struct + { + RDPDR_DEVICE device; + char* Path; + } RDPDR_PARALLEL; + +#define PROXY_TYPE_NONE 0 +#define PROXY_TYPE_HTTP 1 +#define PROXY_TYPE_SOCKS 2 +#define PROXY_TYPE_IGNORE 0xFFFF + +/* ThreadingFlags */ +#define THREADING_FLAGS_DISABLE_THREADS 0x00000001 + + enum rdp_settings_type + { + RDP_SETTINGS_TYPE_BOOL, + RDP_SETTINGS_TYPE_UINT16, + RDP_SETTINGS_TYPE_INT16, + RDP_SETTINGS_TYPE_UINT32, + RDP_SETTINGS_TYPE_INT32, + RDP_SETTINGS_TYPE_UINT64, + RDP_SETTINGS_TYPE_INT64, + RDP_SETTINGS_TYPE_STRING, + RDP_SETTINGS_TYPE_POINTER + }; + +/** + * rdpSettings creation flags + */ +#define FREERDP_SETTINGS_SERVER_MODE 0x00000001 + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SETTINGS_TYPES_H */ diff --git a/include/freerdp/settings_types_private.h b/include/freerdp/settings_types_private.h new file mode 100644 index 0000000..6d23110 --- /dev/null +++ b/include/freerdp/settings_types_private.h @@ -0,0 +1,806 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Internal settings header for functions not exported + * + * Copyright 2018 Armin Novak <armin.novak@thincast.com> + * Copyright 2018 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SETTINGS_TYPES_PRIVATE_H +#define FREERDP_SETTINGS_TYPES_PRIVATE_H + +#include <winpr/string.h> +#include <winpr/sspi.h> + +#include <freerdp/config.h> + +#include <freerdp/types.h> +#include <freerdp/api.h> +#include <freerdp/settings_types.h> + +#include <string.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifndef FREERDP_SETTINGS_INTERNAL_USE +#define SETTINGS_DEPRECATED(x) WINPR_DEPRECATED(x) +#else +#define SETTINGS_DEPRECATED(x) x +#endif + +struct rdp_settings +{ + /** + * WARNING: this data structure is carefully padded for ABI stability! + * Keeping this area clean is particularly challenging, so unless you are + * a trusted developer you should NOT take the liberty of adding your own + * options straight into the ABI stable zone. Instead, append them to the + * very end of this data structure, in the zone marked as ABI unstable. + */ + + SETTINGS_DEPRECATED(ALIGN64 void* instance); /* 0 */ + UINT64 padding001[16 - 1]; /* 1 */ + + /* Core Parameters */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ServerMode); /* 16 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ShareId); /* 17 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 PduSource); /* 18 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ServerPort); /* 19 */ + SETTINGS_DEPRECATED(ALIGN64 char* ServerHostname); /* 20 */ + SETTINGS_DEPRECATED(ALIGN64 char* Username); /* 21 */ + SETTINGS_DEPRECATED(ALIGN64 char* Password); /* 22 */ + SETTINGS_DEPRECATED(ALIGN64 char* Domain); /* 23 */ + SETTINGS_DEPRECATED(ALIGN64 char* PasswordHash); /* 24 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL WaitForOutputBufferFlush); /* 25 */ + UINT64 padding26[27 - 26]; /* 26 */ + SETTINGS_DEPRECATED(ALIGN64 char* AcceptedCert); /* 27 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 AcceptedCertLength); /* 28 */ + SETTINGS_DEPRECATED(ALIGN64 char* UserSpecifiedServerName); /* 29 */ + SETTINGS_DEPRECATED(ALIGN64 char* AadServerHostname); /* 30 */ + UINT64 padding0064[64 - 31]; /* 31 */ + /* resource management related options */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ThreadingFlags); /* 64 */ + + UINT64 padding0128[128 - 65]; /* 65 */ + + /** + * GCC User Data Blocks + */ + + /* Client/Server Core Data */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RdpVersion); /* 128 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DesktopWidth); /* 129 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DesktopHeight); /* 130 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ColorDepth); /* 131 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ConnectionType); /* 132 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ClientBuild); /* 133 */ + SETTINGS_DEPRECATED(ALIGN64 char* ClientHostname); /* 134 */ + SETTINGS_DEPRECATED(ALIGN64 char* ClientProductId); /* 135 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 EarlyCapabilityFlags); /* 136 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL NetworkAutoDetect); /* 137 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportAsymetricKeys); /* 138 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportErrorInfoPdu); /* 139 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportStatusInfoPdu); /* 140 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportMonitorLayoutPdu); /* 141 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportGraphicsPipeline); /* 142 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportDynamicTimeZone); /* 143 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportHeartbeatPdu); /* 144 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DesktopPhysicalWidth); /* 145 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DesktopPhysicalHeight); /* 146 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 DesktopOrientation); /* 147 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DesktopScaleFactor); /* 148 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DeviceScaleFactor); /* 149 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportEdgeActionV1); /* 150 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportEdgeActionV2); /* 151 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportSkipChannelJoin); /* 152 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 SupportedColorDepths); /* 153 */ + UINT64 padding0192[192 - 154]; /* 154 */ + + /* Client/Server Security Data */ + SETTINGS_DEPRECATED(ALIGN64 BOOL UseRdpSecurityLayer); /* 192 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 EncryptionMethods); /* 193 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ExtEncryptionMethods); /* 194 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 EncryptionLevel); /* 195 */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* ServerRandom); /* 196 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ServerRandomLength); /* 197 */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* ServerCertificate); /* 198 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ServerCertificateLength); /* 199 */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* ClientRandom); /* 200 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ClientRandomLength); /* 201 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ServerLicenseRequired); /* 202 */ + SETTINGS_DEPRECATED(ALIGN64 char* ServerLicenseCompanyName); /* 203 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ServerLicenseProductVersion); /* 204 */ + SETTINGS_DEPRECATED(ALIGN64 char* ServerLicenseProductName); /* 205 */ + SETTINGS_DEPRECATED(ALIGN64 char** ServerLicenseProductIssuers); /* 206 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ServerLicenseProductIssuersCount); /* 207 */ + UINT64 padding0256[256 - 208]; /* 208 */ + + /* Client Network Data */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ChannelCount); /* 256 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ChannelDefArraySize); /* 257 */ + SETTINGS_DEPRECATED(ALIGN64 CHANNEL_DEF* ChannelDefArray); /* 258 */ + UINT64 padding0320[320 - 259]; /* 259 */ + + /* Client Cluster Data */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ClusterInfoFlags); /* 320 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RedirectedSessionId); /* 321 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ConsoleSession); /* 322 */ + UINT64 padding0384[384 - 323]; /* 323 */ + + /* Client Monitor Data */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 MonitorCount); /* 384 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 MonitorDefArraySize); /* 385 */ + SETTINGS_DEPRECATED(ALIGN64 rdpMonitor* MonitorDefArray); /* 386 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SpanMonitors); /* 387 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL UseMultimon); /* 388 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ForceMultimon); /* 389 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DesktopPosX); /* 390 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DesktopPosY); /* 391 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ListMonitors); /* 392 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32* MonitorIds); /* 393 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 NumMonitorIds); /* 394 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 MonitorLocalShiftX); /*395 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 MonitorLocalShiftY); /* 396 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL HasMonitorAttributes); /* 397 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 MonitorFlags); /* 398 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 MonitorAttributeFlags); /* 399 */ + UINT64 padding0448[448 - 400]; /* 400 */ + + /* Client Message Channel Data */ + UINT64 padding0512[512 - 448]; /* 448 */ + + /* Client Multitransport Channel Data */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 MultitransportFlags); /* 512 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportMultitransport); /* 513 */ + UINT64 padding0576[576 - 514]; /* 514 */ + UINT64 padding0640[640 - 576]; /* 576 */ + + /* + * Client Info + */ + + /* Client Info (Shell) */ + SETTINGS_DEPRECATED(ALIGN64 char* AlternateShell); /* 640 */ + SETTINGS_DEPRECATED(ALIGN64 char* ShellWorkingDirectory); /* 641 */ + UINT64 padding0704[704 - 642]; /* 642 */ + + /* Client Info Flags */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AutoLogonEnabled); /* 704 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL CompressionEnabled); /* 705 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DisableCtrlAltDel); /* 706 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL EnableWindowsKey); /* 707 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL MaximizeShell); /* 708 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL LogonNotify); /* 709 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL LogonErrors); /* 710 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL MouseAttached); /* 711 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL MouseHasWheel); /* 712 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemoteConsoleAudio); /* 713 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AudioPlayback); /* 714 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AudioCapture); /* 715 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL VideoDisable); /* 716 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL PasswordIsSmartcardPin); /* 717 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL UsingSavedCredentials); /* 718 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ForceEncryptedCsPdu); /* 719 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL HiDefRemoteApp); /* 720 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 CompressionLevel); /* 721 */ + UINT64 padding0768[768 - 722]; /* 722 */ + + /* Client Info (Extra) */ + SETTINGS_DEPRECATED(ALIGN64 BOOL IPv6Enabled); /* 768 */ + SETTINGS_DEPRECATED(ALIGN64 char* ClientAddress); /* 769 */ + SETTINGS_DEPRECATED(ALIGN64 char* ClientDir); /* 770 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ClientSessionId); /* 771 */ + UINT64 padding0832[832 - 772]; /* 772 */ + + /* Client Info (Auto Reconnection) */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AutoReconnectionEnabled); /* 832 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 AutoReconnectMaxRetries); /* 833 */ + SETTINGS_DEPRECATED(ALIGN64 ARC_CS_PRIVATE_PACKET* ClientAutoReconnectCookie); /* 834 */ + SETTINGS_DEPRECATED(ALIGN64 ARC_SC_PRIVATE_PACKET* ServerAutoReconnectCookie); /* 835 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL PrintReconnectCookie); /* 836 */ + UINT64 padding0896[896 - 837]; /* 837 */ + + /* Client Info (Time Zone) */ + SETTINGS_DEPRECATED(ALIGN64 TIME_ZONE_INFORMATION* ClientTimeZone); /* 896 */ + SETTINGS_DEPRECATED(ALIGN64 char* DynamicDSTTimeZoneKeyName); /* 897 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DynamicDaylightTimeDisabled); /* 898 */ + UINT64 padding0960[960 - 899]; /* 899 */ + + /* Client Info (Performance Flags) */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 PerformanceFlags); /* 960 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AllowFontSmoothing); /* 961 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DisableWallpaper); /* 962 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DisableFullWindowDrag); /* 963 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DisableMenuAnims); /* 964 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DisableThemes); /* 965 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DisableCursorShadow); /* 966 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DisableCursorBlinking); /* 967 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AllowDesktopComposition); /* 968 */ + UINT64 padding1024[1024 - 969]; /* 969 */ + + /* Remote Assistance */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemoteAssistanceMode); /* 1024 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteAssistanceSessionId); /* 1025 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteAssistancePassStub); /* 1026 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteAssistancePassword); /* 1027 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteAssistanceRCTicket); /* 1028 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL EncomspVirtualChannel); /* 1029 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemdeskVirtualChannel); /* 1030 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL LyncRdpMode); /* 1031 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemoteAssistanceRequestControl); /* 1032 */ + UINT64 padding1088[1088 - 1033]; /* 1033 */ + + /** + * X.224 Connection Request/Confirm + */ + + /* Protocol Security */ + SETTINGS_DEPRECATED(ALIGN64 BOOL TlsSecurity); /* 1088 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL NlaSecurity); /* 1089 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RdpSecurity); /* 1090 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ExtSecurity); /* 1091 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL Authentication); /* 1092 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RequestedProtocols); /* 1093 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 SelectedProtocol); /* 1094 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 NegotiationFlags); /* 1095 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL NegotiateSecurityLayer); /* 1096 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RestrictedAdminModeRequired); /* 1097 */ + SETTINGS_DEPRECATED(ALIGN64 char* AuthenticationServiceClass); /* 1098 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DisableCredentialsDelegation); /* 1099 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 AuthenticationLevel); /* 1100 */ + SETTINGS_DEPRECATED(ALIGN64 char* AllowedTlsCiphers); /* 1101 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL VmConnectMode); /* 1102 */ + SETTINGS_DEPRECATED(ALIGN64 char* NtlmSamFile); /* 1103 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL FIPSMode); /* 1104 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 TlsSecLevel); /* 1105 */ + SETTINGS_DEPRECATED(ALIGN64 char* SspiModule); /* 1106 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 TLSMinVersion); /* 1107 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 TLSMaxVersion); /* 1108 */ + SETTINGS_DEPRECATED(ALIGN64 char* TlsSecretsFile); /* 1109 */ + SETTINGS_DEPRECATED(ALIGN64 char* AuthenticationPackageList); /* 1110 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RdstlsSecurity); /* 1111 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AadSecurity); /* 1112 */ + SETTINGS_DEPRECATED(ALIGN64 char* WinSCardModule); /* 1113 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemoteCredentialGuard); /* 1114 */ + UINT64 padding1152[1152 - 1115]; /* 1115 */ + + /* Connection Cookie */ + SETTINGS_DEPRECATED(ALIGN64 BOOL MstscCookieMode); /* 1152 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 CookieMaxLength); /* 1153 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 PreconnectionId); /* 1154 */ + SETTINGS_DEPRECATED(ALIGN64 char* PreconnectionBlob); /* 1155 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SendPreconnectionPdu); /* 1156 */ + UINT64 padding1216[1216 - 1157]; /* 1157 */ + + /* Server Redirection */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RedirectionFlags); /* 1216 */ + SETTINGS_DEPRECATED(ALIGN64 char* TargetNetAddress); /* 1217 */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* LoadBalanceInfo); /* 1218 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 LoadBalanceInfoLength); /* 1219 */ + SETTINGS_DEPRECATED(ALIGN64 char* RedirectionUsername); /* 1220 */ + SETTINGS_DEPRECATED(ALIGN64 char* RedirectionDomain); /* 1221 */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* RedirectionPassword); /* 1222 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RedirectionPasswordLength); /* 1223 */ + SETTINGS_DEPRECATED(ALIGN64 char* RedirectionTargetFQDN); /* 1224 */ + SETTINGS_DEPRECATED(ALIGN64 char* RedirectionTargetNetBiosName); /* 1225 */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* RedirectionTsvUrl); /* 1226 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RedirectionTsvUrlLength); /* 1227 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 TargetNetAddressCount); /* 1228 */ + SETTINGS_DEPRECATED(ALIGN64 char** TargetNetAddresses); /* 1229 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32* TargetNetPorts); /* 1230 */ + SETTINGS_DEPRECATED(ALIGN64 char* RedirectionAcceptedCert); /* 1231 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RedirectionAcceptedCertLength); /* 1232 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RedirectionPreferType); /* 1233 */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* RedirectionGuid); /* 1234 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RedirectionGuidLength); /* 1235 */ + SETTINGS_DEPRECATED(ALIGN64 rdpCertificate* RedirectionTargetCertificate); /* 1236 */ + UINT64 padding1280[1280 - 1237]; /* 1237 */ + + /** + * Security + */ + + /* Credentials Cache */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* Password51); /* 1280 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 Password51Length); /* 1281 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SmartcardLogon); /* 1282 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL PromptForCredentials); /* 1283 */ + UINT64 padding1284[1285 - 1284]; /* 1284 */ + + /* Settings used for smartcard emulation */ + SETTINGS_DEPRECATED(ALIGN64 char* SmartcardCertificate); /* 1285 */ + SETTINGS_DEPRECATED(ALIGN64 char* SmartcardPrivateKey); /* 1286 */ + UINT64 padding1287[1288 - 1287]; /* 1287 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SmartcardEmulation); /* 1288 */ + SETTINGS_DEPRECATED(ALIGN64 char* Pkcs11Module); /* 1289 */ + SETTINGS_DEPRECATED(ALIGN64 char* PkinitAnchors); /* 1290 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 KeySpec); /* 1291 */ + SETTINGS_DEPRECATED(ALIGN64 char* CardName); /* 1292 */ + SETTINGS_DEPRECATED(ALIGN64 char* ReaderName); /* 1293 */ + SETTINGS_DEPRECATED(ALIGN64 char* ContainerName); /* 1294 */ + SETTINGS_DEPRECATED(ALIGN64 char* CspName); /* 1295 */ + UINT64 padding1344[1344 - 1296]; /* 1296 */ + + /* Kerberos Authentication */ + SETTINGS_DEPRECATED(ALIGN64 char* KerberosKdcUrl); /* 1344 */ + SETTINGS_DEPRECATED(ALIGN64 char* KerberosRealm); /* 1345 */ + SETTINGS_DEPRECATED(ALIGN64 char* KerberosStartTime); /* 1346 */ + SETTINGS_DEPRECATED(ALIGN64 char* KerberosLifeTime); /* 1347 */ + SETTINGS_DEPRECATED(ALIGN64 char* KerberosRenewableLifeTime); /* 1348 */ + SETTINGS_DEPRECATED(ALIGN64 char* KerberosCache); /* 1349 */ + SETTINGS_DEPRECATED(ALIGN64 char* KerberosArmor); /* 1350 */ + SETTINGS_DEPRECATED(ALIGN64 char* KerberosKeytab); /* 1351 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL KerberosRdgIsProxy); /* 1352 */ + UINT64 padding1408[1408 - 1353]; /* 1353 */ + + /* Server Certificate */ + SETTINGS_DEPRECATED(ALIGN64 BOOL IgnoreCertificate); /* 1408 */ + SETTINGS_DEPRECATED(ALIGN64 char* CertificateName); /* 1409 */ + UINT64 padding1410[1413 - 1410]; /* 1410 */ + SETTINGS_DEPRECATED(ALIGN64 rdpPrivateKey* RdpServerRsaKey); /* 1413 */ + SETTINGS_DEPRECATED(ALIGN64 rdpCertificate* RdpServerCertificate); /* 1414 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ExternalCertificateManagement); /* 1415 */ + UINT64 padding1416[1419 - 1416]; /* 1416 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AutoAcceptCertificate); /* 1419 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AutoDenyCertificate); /* 1420 */ + SETTINGS_DEPRECATED(ALIGN64 char* CertificateAcceptedFingerprints); /* 1421 */ + UINT64 padding1422[1423 - 1422]; /* 1422 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL CertificateCallbackPreferPEM); /* 1423 */ + UINT64 padding1472[1472 - 1424]; /* 1424 */ + UINT64 padding1536[1536 - 1472]; /* 1472 */ + + /** + * User Interface + */ + + /* Window Settings */ + SETTINGS_DEPRECATED(ALIGN64 BOOL Workarea); /* 1536 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL Fullscreen); /* 1537 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 PercentScreen); /* 1538 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GrabKeyboard); /* 1539 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL Decorations); /* 1540 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL MouseMotion); /* 1541 */ + SETTINGS_DEPRECATED(ALIGN64 char* WindowTitle); /* 1542 */ + SETTINGS_DEPRECATED(ALIGN64 UINT64 ParentWindowId); /* 1543 */ + UINT64 padding1544[1545 - 1544]; /* 1544 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AsyncUpdate); /* 1545 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AsyncChannels); /* 1546 */ + UINT64 padding1548[1548 - 1547]; /* 1547 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ToggleFullscreen); /* 1548 */ + SETTINGS_DEPRECATED(ALIGN64 char* WmClass); /* 1549 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL EmbeddedWindow); /* 1550 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SmartSizing); /* 1551 */ + SETTINGS_DEPRECATED(ALIGN64 INT32 XPan); /* 1552 */ + SETTINGS_DEPRECATED(ALIGN64 INT32 YPan); /* 1553 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 SmartSizingWidth); /* 1554 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 SmartSizingHeight); /* 1555 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL PercentScreenUseWidth); /* 1556 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL PercentScreenUseHeight); /* 1557 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DynamicResolutionUpdate); /* 1558 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GrabMouse); /* 1559 */ + UINT64 padding1601[1601 - 1560]; /* 1560 */ + + /* Miscellaneous */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SoftwareGdi); /* 1601 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL LocalConnection); /* 1602 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AuthenticationOnly); /* 1603 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL CredentialsFromStdin); /* 1604 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL UnmapButtons); /* 1605 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL OldLicenseBehaviour); /* 1606 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL MouseUseRelativeMove); /* 1607 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL UseCommonStdioCallbacks); /* 1608 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL ConnectChildSession); /* 1609 */ + UINT64 padding1664[1664 - 1610]; /* 1610 */ + + /* Names */ + SETTINGS_DEPRECATED(ALIGN64 char* ComputerName); /* 1664 */ + UINT64 padding1728[1728 - 1665]; /* 1665 */ + + /* Files */ + SETTINGS_DEPRECATED(ALIGN64 char* ConnectionFile); /* 1728 */ + SETTINGS_DEPRECATED(ALIGN64 char* AssistanceFile); /* 1729 */ + UINT64 padding1792[1792 - 1730]; /* 1730 */ + + /* Paths */ + SETTINGS_DEPRECATED(ALIGN64 char* HomePath); /* 1792 */ + SETTINGS_DEPRECATED(ALIGN64 char* ConfigPath); /* 1793 */ + SETTINGS_DEPRECATED(ALIGN64 char* CurrentPath); /* 1794 */ + UINT64 padding1856[1856 - 1795]; /* 1795 */ + + /* Recording */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DumpRemoteFx); /* 1856 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL PlayRemoteFx); /* 1857 */ + SETTINGS_DEPRECATED(ALIGN64 char* DumpRemoteFxFile); /* 1858 */ + SETTINGS_DEPRECATED(ALIGN64 char* PlayRemoteFxFile); /* 1859 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL TransportDump); /* 1860 */ + SETTINGS_DEPRECATED(ALIGN64 char* TransportDumpFile); /* 1861 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL TransportDumpReplay); /* 1862 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DeactivateClientDecoding); /* 1863 */ + UINT64 padding1920[1920 - 1864]; /* 1864 */ + UINT64 padding1984[1984 - 1920]; /* 1920 */ + + /** + * Gateway + */ + + /* Gateway */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 GatewayUsageMethod); /* 1984 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 GatewayPort); /* 1985 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayHostname); /* 1986 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayUsername); /* 1987 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayPassword); /* 1988 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayDomain); /* 1989 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 GatewayCredentialsSource); /* 1990 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayUseSameCredentials); /* 1991 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayEnabled); /* 1992 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayBypassLocal); /* 1993 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayRpcTransport); /* 1994 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayHttpTransport); /* 1995 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayUdpTransport); /* 1996 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayAccessToken); /* 1997 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayAcceptedCert); /* 1998 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 GatewayAcceptedCertLength); /* 1999 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayHttpUseWebsockets); /* 2000 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayHttpExtAuthSspiNtlm); /* 2001 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayHttpExtAuthBearer); /* 2002 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayUrl); /* 2003 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayArmTransport); /* 2004 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayAvdWvdEndpointPool); /* 2005 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayAvdGeo); /* 2006 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayAvdArmpath); /* 2007 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayAvdAadtenantid); /* 2008 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayAvdDiagnosticserviceurl); /* 2009 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayAvdHubdiscoverygeourl); /* 2010 */ + SETTINGS_DEPRECATED(ALIGN64 char* GatewayAvdActivityhint); /* 2011 */ + UINT64 padding2015[2015 - 2012]; /* 2012 */ + + /* Proxy */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ProxyType); /* 2015 */ + SETTINGS_DEPRECATED(ALIGN64 char* ProxyHostname); /* 2016 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 ProxyPort); /* 2017 */ + SETTINGS_DEPRECATED(ALIGN64 char* ProxyUsername); /* 2018 */ + SETTINGS_DEPRECATED(ALIGN64 char* ProxyPassword); /* 2019 */ + UINT64 padding2112[2112 - 2020]; /* 2020 */ + + /** + * RemoteApp + */ + + /* RemoteApp */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemoteApplicationMode); /* 2112 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteApplicationName); /* 2113 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteApplicationIcon); /* 2114 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteApplicationProgram); /* 2115 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteApplicationFile); /* 2116 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteApplicationGuid); /* 2117 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteApplicationCmdLine); /* 2118 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteApplicationExpandCmdLine); /* 2119 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteApplicationExpandWorkingDir); /* 2120 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DisableRemoteAppCapsCheck); /* 2121 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteAppNumIconCaches); /* 2122 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteAppNumIconCacheEntries); /* 2123 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemoteAppLanguageBarSupported); /* 2124 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteWndSupportLevel); /* 2125 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteApplicationSupportLevel); /* 2126 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteApplicationSupportMask); /* 2127 */ + SETTINGS_DEPRECATED(ALIGN64 char* RemoteApplicationWorkingDir); /* 2128 */ + UINT64 padding2176[2176 - 2129]; /* 2129 */ + UINT64 padding2240[2240 - 2176]; /* 2176 */ + + /** + * Mandatory Capabilities + */ + + /* Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* ReceivedCapabilities); /* 2240 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ReceivedCapabilitiesSize); /* 2241 */ + SETTINGS_DEPRECATED(ALIGN64 BYTE** ReceivedCapabilityData); /* 2242 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32* ReceivedCapabilityDataSizes); /* 2243 */ + UINT64 padding2304[2304 - 2244]; /* 2244 */ + + /* General Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 OsMajorType); /* 2304 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 OsMinorType); /* 2305 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RefreshRect); /* 2306 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SuppressOutput); /* 2307 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL FastPathOutput); /* 2308 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SaltedChecksum); /* 2309 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL LongCredentialsSupported); /* 2310 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL NoBitmapCompressionHeader); /* 2311 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL BitmapCompressionDisabled); /* 2312 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 CapsProtocolVersion); /* 2313 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 CapsGeneralCompressionTypes); /* 2314 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 CapsUpdateCapabilityFlag); /* 2315 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 CapsRemoteUnshareFlag); /* 2316 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 CapsGeneralCompressionLevel); /* 2317 */ + UINT64 padding2368[2368 - 2318]; /* 2318 */ + + /* Bitmap Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DesktopResize); /* 2368 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DrawAllowDynamicColorFidelity); /* 2369 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DrawAllowColorSubsampling); /* 2370 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DrawAllowSkipAlpha); /* 2371 */ + UINT64 padding2432[2432 - 2372]; /* 2372 */ + + /* Order Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 BYTE* OrderSupport); /* 2432 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL BitmapCacheV3Enabled); /* 2433 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AltSecFrameMarkerSupport); /* 2434 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AllowUnanouncedOrdersFromServer); /* 2435 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 OrderSupportFlags); /* 2436 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 OrderSupportFlagsEx); /* 2437 */ + SETTINGS_DEPRECATED(ALIGN64 char* TerminalDescriptor); /* 2438 */ + SETTINGS_DEPRECATED(ALIGN64 UINT16 TextANSICodePage); /* 2439 */ + UINT64 padding2497[2497 - 2440]; /* 2440 */ + + /* Bitmap Cache Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 BOOL BitmapCacheEnabled); /* 2497 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 BitmapCacheVersion); /* 2498 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL AllowCacheWaitingList); /* 2499 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL BitmapCachePersistEnabled); /* 2500 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 BitmapCacheV2NumCells); /* 2501 */ + SETTINGS_DEPRECATED(ALIGN64 BITMAP_CACHE_V2_CELL_INFO* BitmapCacheV2CellInfo); /* 2502 */ + SETTINGS_DEPRECATED(ALIGN64 char* BitmapCachePersistFile); /* 2503 */ + UINT64 padding2560[2560 - 2504]; /* 2504 */ + + /* Pointer Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ColorPointerCacheSize); /* 2560 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 PointerCacheSize); /* 2561 */ + UINT64 padding2624[2622 - 2562]; /* 2562 */ + + /* Input Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 char* KeyboardRemappingList); /* 2622 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 KeyboardCodePage); /* 2623 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 KeyboardLayout); /* 2624 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 KeyboardType); /* 2625 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 KeyboardSubType); /* 2626 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 KeyboardFunctionKey); /* 2627 */ + SETTINGS_DEPRECATED(ALIGN64 char* ImeFileName); /* 2628 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL UnicodeInput); /* 2629 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL FastPathInput); /* 2630 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL MultiTouchInput); /* 2631 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL MultiTouchGestures); /* 2632 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 KeyboardHook); /* 2633 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL HasHorizontalWheel); /* 2634 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL HasExtendedMouseEvent); /* 2635 */ + + /** SuspendInput disables processing of keyboard/mouse/multitouch input. + * If used by an implementation ensure proper state resync after reenabling + * input + */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SuspendInput); /* 2636 */ + SETTINGS_DEPRECATED(ALIGN64 char* KeyboardPipeName); /* 2637 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL HasRelativeMouseEvent); /* 2638 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL HasQoeEvent); /* 2639 */ + UINT64 padding2688[2688 - 2640]; /* 2640 */ + + /* Brush Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 BrushSupportLevel); /* 2688 */ + UINT64 padding2752[2752 - 2689]; /* 2689 */ + + /* Glyph Cache Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 GlyphSupportLevel); /* 2752 */ + SETTINGS_DEPRECATED(ALIGN64 GLYPH_CACHE_DEFINITION* GlyphCache); /* 2753 */ + SETTINGS_DEPRECATED(ALIGN64 GLYPH_CACHE_DEFINITION* FragCache); /* 2754 */ + UINT64 padding2816[2816 - 2755]; /* 2755 */ + + /* Offscreen Bitmap Cache */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 OffscreenSupportLevel); /* 2816 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 OffscreenCacheSize); /* 2817 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 OffscreenCacheEntries); /* 2818 */ + UINT64 padding2880[2880 - 2819]; /* 2819 */ + + /* Virtual Channel Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 VCFlags); /* 2880 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 VCChunkSize); /* 2881 */ + UINT64 padding2944[2944 - 2882]; /* 2882 */ + + /* Sound Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SoundBeepsEnabled); /* 2944 */ + UINT64 padding3008[3008 - 2945]; /* 2945 */ + UINT64 padding3072[3072 - 3008]; /* 3008 */ + + /** + * Optional Capabilities + */ + + /* Bitmap Cache Host Capabilities */ + UINT64 padding3136[3136 - 3072]; /* 3072 */ + + /* Control Capabilities */ + UINT64 padding3200[3200 - 3136]; /* 3136 */ + + /* Window Activation Capabilities */ + UINT64 padding3264[3264 - 3200]; /* 3200 */ + + /* Font Capabilities */ + UINT64 padding3328[3328 - 3264]; /* 3264 */ + + /* Multifragment Update Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 MultifragMaxRequestSize); /* 3328 */ + UINT64 padding3392[3392 - 3329]; /* 3329 */ + + /* Large Pointer Update Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 LargePointerFlag); /* 3392 */ + UINT64 padding3456[3456 - 3393]; /* 3393 */ + + /* Desktop Composition Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 CompDeskSupportLevel); /* 3456 */ + UINT64 padding3520[3520 - 3457]; /* 3457 */ + + /* Surface Commands Capabilities */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SurfaceCommandsEnabled); /* 3520 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL FrameMarkerCommandEnabled); /* 3521 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SurfaceFrameMarkerEnabled); /* 3522 */ + UINT64 padding3584[3584 - 3523]; /* 3523 */ + UINT64 padding3648[3648 - 3584]; /* 3584 */ + + /* + * Bitmap Codecs Capabilities + */ + + /* RemoteFX */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemoteFxOnly); /* 3648 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemoteFxCodec); /* 3649 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteFxCodecId); /* 3650 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteFxCodecMode); /* 3651 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RemoteFxImageCodec); /* 3652 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 RemoteFxCaptureFlags); /* 3653 */ + UINT64 padding3712[3712 - 3654]; /* 3654 */ + + /* NSCodec */ + SETTINGS_DEPRECATED(ALIGN64 BOOL NSCodec); /* 3712 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 NSCodecId); /* 3713 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 FrameAcknowledge); /* 3714 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 NSCodecColorLossLevel); /* 3715 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL NSCodecAllowSubsampling); /* 3716 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL NSCodecAllowDynamicColorFidelity); /* 3717 */ + UINT64 padding3776[3776 - 3718]; /* 3718 */ + + /* JPEG */ + SETTINGS_DEPRECATED(ALIGN64 BOOL JpegCodec); /* 3776 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 JpegCodecId); /* 3777 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 JpegQuality); /* 3778 */ + UINT64 padding3840[3840 - 3779]; /* 3779 */ + + SETTINGS_DEPRECATED(ALIGN64 BOOL GfxThinClient); /* 3840 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GfxSmallCache); /* 3841 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GfxProgressive); /* 3842 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GfxProgressiveV2); /* 3843 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GfxH264); /* 3844 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GfxAVC444); /* 3845 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GfxSendQoeAck); /* 3846 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GfxAVC444v2); /* 3847 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 GfxCapsFilter); /* 3848 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GfxPlanar); /* 3849 */ + UINT64 padding3904[3904 - 3850]; /* 3850 */ + + /** + * Caches + */ + + /* Bitmap Cache V3 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 BitmapCacheV3CodecId); /* 3904 */ + UINT64 padding3968[3968 - 3905]; /* 3905 */ + + /* Draw Nine Grid */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DrawNineGridEnabled); /* 3968 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DrawNineGridCacheSize); /* 3969 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DrawNineGridCacheEntries); /* 3970 */ + UINT64 padding4032[4032 - 3971]; /* 3971 */ + + /* Draw GDI+ */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DrawGdiPlusEnabled); /* 4032 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DrawGdiPlusCacheEnabled); /* 4033 */ + UINT64 padding4096[4096 - 4034]; /* 4034 */ + UINT64 padding4160[4160 - 4096]; /* 4096 */ + + /** + * Device Redirection + */ + + /* Device Redirection */ + SETTINGS_DEPRECATED(ALIGN64 BOOL DeviceRedirection); /* 4160 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DeviceCount); /* 4161 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DeviceArraySize); /* 4162 */ + SETTINGS_DEPRECATED(ALIGN64 RDPDR_DEVICE** DeviceArray); /* 4163 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL IgnoreInvalidDevices); /* 4164 */ + UINT64 padding4288[4288 - 4165]; /* 4165 */ + + /* Drive Redirection */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RedirectDrives); /* 4288 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RedirectHomeDrive); /* 4289 */ + SETTINGS_DEPRECATED(ALIGN64 char* DrivesToRedirect); /* 4290 */ + UINT64 padding4416[4416 - 4291]; /* 4291 */ + + /* Smartcard Redirection */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RedirectSmartCards); /* 4416 */ + /* WebAuthN Redirection */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RedirectWebAuthN); /* 4417 */ + UINT64 padding4544[4544 - 4418]; /* 4418 */ + + /* Printer Redirection */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RedirectPrinters); /* 4544 */ + UINT64 padding4672[4672 - 4545]; /* 4545 */ + + /* Serial and Parallel Port Redirection */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RedirectSerialPorts); /* 4672 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL RedirectParallelPorts); /* 4673 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL PreferIPv6OverIPv4); /* 4674 */ + UINT64 padding4800[4800 - 4675]; /* 4675 */ + + /** + * Other Redirection + */ + + SETTINGS_DEPRECATED(ALIGN64 BOOL RedirectClipboard); /* 4800 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 ClipboardFeatureMask); /* 4801 */ + SETTINGS_DEPRECATED(ALIGN64 char* ClipboardUseSelection); /* 4802 */ + SETTINGS_DEPRECATED(UINT64 padding4928[4928 - 4803]); /* 4803 */ + + /** + * Static Virtual Channels + */ + + SETTINGS_DEPRECATED(ALIGN64 UINT32 StaticChannelCount); /* 4928 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 StaticChannelArraySize); /* 4929 */ + SETTINGS_DEPRECATED(ALIGN64 ADDIN_ARGV** StaticChannelArray); /* 4930 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SynchronousStaticChannels); /* 4931 */ + UINT64 padding5056[5056 - 4932]; /* 4932 */ + + /** + * Dynamic Virtual Channels + */ + + SETTINGS_DEPRECATED(ALIGN64 UINT32 DynamicChannelCount); /* 5056 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 DynamicChannelArraySize); /* 5057 */ + SETTINGS_DEPRECATED(ALIGN64 ADDIN_ARGV** DynamicChannelArray); /* 5058 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportDynamicChannels); /* 5059 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SynchronousDynamicChannels); /* 5060 */ + UINT64 padding5184[5184 - 5061]; /* 5061 */ + + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportEchoChannel); /* 5184 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportDisplayControl); /* 5185 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportGeometryTracking); /* 5186 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportSSHAgentChannel); /* 5187 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL SupportVideoOptimized); /* 5188 */ + SETTINGS_DEPRECATED(ALIGN64 char* RDP2TCPArgs); /* 5189 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL TcpKeepAlive); /* 5190 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 TcpKeepAliveRetries); /* 5191 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 TcpKeepAliveDelay); /* 5192 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 TcpKeepAliveInterval); /* 5193 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 TcpAckTimeout); /* 5194 */ + SETTINGS_DEPRECATED(ALIGN64 char* ActionScript); /* 5195 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 Floatbar); /* 5196 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 TcpConnectTimeout); /* 5197 */ + SETTINGS_DEPRECATED(ALIGN64 UINT32 FakeMouseMotionInterval); /* 5198 */ + UINT64 padding5312[5312 - 5199]; /* 5199 */ + + /** + * WARNING: End of ABI stable zone! + * + * The zone below this point is ABI unstable, and + * is therefore potentially subject to ABI breakage. + */ +}; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SETTINGS_TYPES_PRIVATE_H */ diff --git a/include/freerdp/streamdump.h b/include/freerdp/streamdump.h new file mode 100644 index 0000000..14bd5fd --- /dev/null +++ b/include/freerdp/streamdump.h @@ -0,0 +1,60 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Interface to dump RDP session data to files + * + * Copyright 2021 Armin Novak + * Copyright 2021 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_STREAM_DUMP_H +#define FREERDP_STREAM_DUMP_H + +#include <winpr/stream.h> +#include <winpr/wtypes.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct stream_dump_context rdpStreamDumpContext; + + typedef enum + { + STREAM_MSG_SRV_RX = 1, + STREAM_MSG_SRV_TX = 2 + } StreamDumpDirection; + + FREERDP_API SSIZE_T stream_dump_append(const rdpContext* context, UINT32 flags, wStream* s, + size_t* offset); + FREERDP_API SSIZE_T stream_dump_get(const rdpContext* context, UINT32* flags, wStream* s, + size_t* offset, UINT64* pts); + + FREERDP_API BOOL stream_dump_register_handlers(rdpContext* context, CONNECTION_STATE state, + BOOL isServer); + + FREERDP_API void stream_dump_free(rdpStreamDumpContext* dump); + + WINPR_ATTR_MALLOC(stream_dump_free, 1) + FREERDP_API rdpStreamDumpContext* stream_dump_new(void); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_STREAM_DUMP_H */ diff --git a/include/freerdp/svc.h b/include/freerdp/svc.h new file mode 100644 index 0000000..e7154a2 --- /dev/null +++ b/include/freerdp/svc.h @@ -0,0 +1,81 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Static Virtual Channel Interface + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_SVC_H +#define FREERDP_SVC_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#include <winpr/wtsapi.h> +#include <freerdp/types.h> + +#define CHANNEL_EVENT_USER 1000 + +#define CHANNEL_EXPORT_FUNC_NAME "VirtualChannelEntry" +#define CHANNEL_EXPORT_FUNC_NAME_EX "VirtualChannelEntryEx" + +#define FREERDP_CHANNEL_MAGIC_NUMBER 0x46524450 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT32 cbSize; + UINT32 protocolVersion; + PVIRTUALCHANNELINIT pVirtualChannelInit; + PVIRTUALCHANNELOPEN pVirtualChannelOpen; + PVIRTUALCHANNELCLOSE pVirtualChannelClose; + PVIRTUALCHANNELWRITE pVirtualChannelWrite; + + /* Extended Fields */ + UINT32 MagicNumber; /* identifies FreeRDP */ + void* pExtendedData; /* extended initial data */ + void* pInterface; /* channel callback interface, use after initialization */ + rdpContext* context; + } CHANNEL_ENTRY_POINTS_FREERDP; + typedef CHANNEL_ENTRY_POINTS_FREERDP* PCHANNEL_ENTRY_POINTS_FREERDP; + + typedef struct + { + UINT32 cbSize; + UINT32 protocolVersion; + PVIRTUALCHANNELINITEX pVirtualChannelInitEx; + PVIRTUALCHANNELOPENEX pVirtualChannelOpenEx; + PVIRTUALCHANNELCLOSEEX pVirtualChannelCloseEx; + PVIRTUALCHANNELWRITEEX pVirtualChannelWriteEx; + + /* Extended Fields */ + UINT32 MagicNumber; /* identifies FreeRDP */ + void* pExtendedData; /* extended initial data */ + void* pInterface; /* channel callback interface, use after initialization */ + rdpContext* context; + } CHANNEL_ENTRY_POINTS_FREERDP_EX; + typedef CHANNEL_ENTRY_POINTS_FREERDP_EX* PCHANNEL_ENTRY_POINTS_FREERDP_EX; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_SVC_H */ diff --git a/include/freerdp/transport_io.h b/include/freerdp/transport_io.h new file mode 100644 index 0000000..ca1ad2c --- /dev/null +++ b/include/freerdp/transport_io.h @@ -0,0 +1,85 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * FreeRDP Interface + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_TRANSPORT_IO_H +#define FREERDP_TRANSPORT_IO_H + +#include <winpr/stream.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef int (*pTCPConnect)(rdpContext* context, rdpSettings* settings, const char* hostname, + int port, DWORD timeout); + typedef BOOL (*pTransportFkt)(rdpTransport* transport); + typedef BOOL (*pTransportAttach)(rdpTransport* transport, int sockfd); + typedef int (*pTransportRWFkt)(rdpTransport* transport, wStream* s); + typedef SSIZE_T (*pTransportRead)(rdpTransport* transport, BYTE* data, size_t bytes); + typedef BOOL (*pTransportGetPublicKey)(rdpTransport* transport, const BYTE** data, + DWORD* length); + typedef BOOL (*pTransportSetBlockingMode)(rdpTransport* transport, BOOL blocking); + + struct rdp_transport_io + { + pTCPConnect TCPConnect; + pTransportFkt TLSConnect; + pTransportFkt TLSAccept; + pTransportAttach TransportAttach; + pTransportFkt TransportDisconnect; + pTransportRWFkt ReadPdu; /* Reads a whole PDU from the transport */ + pTransportRWFkt WritePdu; /* Writes a whole PDU to the transport */ + pTransportRead ReadBytes; /* Reads up to a requested amount of bytes from the transport */ + pTransportGetPublicKey GetPublicKey; + pTransportSetBlockingMode SetBlockingMode; + UINT64 reserved[54]; /* Reserve some space for ABI compatibility */ + }; + typedef struct rdp_transport_io rdpTransportIo; + + FREERDP_API BOOL freerdp_io_callback_set_event(rdpContext* context, BOOL reset); + + FREERDP_API const rdpTransportIo* freerdp_get_io_callbacks(rdpContext* context); + FREERDP_API BOOL freerdp_set_io_callbacks(rdpContext* context, + const rdpTransportIo* io_callbacks); + + FREERDP_API BOOL freerdp_set_io_callback_context(rdpContext* context, void* usercontext); + FREERDP_API void* freerdp_get_io_callback_context(rdpContext* context); + + /* PDU parser. + * incomplete: FALSE if the whole PDU is available, TRUE otherwise + * Return: 0 -> PDU header incomplete + * >0 -> PDU header complete, length of PDU. + * <0 -> Abort, an error occured + */ + FREERDP_API SSIZE_T transport_parse_pdu(rdpTransport* transport, wStream* s, BOOL* incomplete); + FREERDP_API rdpContext* transport_get_context(rdpTransport* transport); + FREERDP_API rdpTransport* freerdp_get_transport(rdpContext* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_TRANSPORT_IO_H */ diff --git a/include/freerdp/types.h b/include/freerdp/types.h new file mode 100644 index 0000000..044ee5f --- /dev/null +++ b/include/freerdp/types.h @@ -0,0 +1,141 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Type Definitions + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_TYPES_H +#define FREERDP_TYPES_H + +#include <winpr/wtypes.h> +#include <winpr/wtsapi.h> + +#ifndef MIN +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#endif + +#ifndef MAX +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + CONNECTION_STATE_INITIAL, + CONNECTION_STATE_NEGO, + CONNECTION_STATE_NLA, + CONNECTION_STATE_AAD, + CONNECTION_STATE_MCS_CREATE_REQUEST, + CONNECTION_STATE_MCS_CREATE_RESPONSE, + CONNECTION_STATE_MCS_ERECT_DOMAIN, + CONNECTION_STATE_MCS_ATTACH_USER, + CONNECTION_STATE_MCS_ATTACH_USER_CONFIRM, + CONNECTION_STATE_MCS_CHANNEL_JOIN_REQUEST, + CONNECTION_STATE_MCS_CHANNEL_JOIN_RESPONSE, + CONNECTION_STATE_RDP_SECURITY_COMMENCEMENT, + CONNECTION_STATE_SECURE_SETTINGS_EXCHANGE, + CONNECTION_STATE_CONNECT_TIME_AUTO_DETECT_REQUEST, + CONNECTION_STATE_CONNECT_TIME_AUTO_DETECT_RESPONSE, + CONNECTION_STATE_LICENSING, + CONNECTION_STATE_MULTITRANSPORT_BOOTSTRAPPING_REQUEST, + CONNECTION_STATE_MULTITRANSPORT_BOOTSTRAPPING_RESPONSE, + CONNECTION_STATE_CAPABILITIES_EXCHANGE_DEMAND_ACTIVE, + CONNECTION_STATE_CAPABILITIES_EXCHANGE_MONITOR_LAYOUT, + CONNECTION_STATE_CAPABILITIES_EXCHANGE_CONFIRM_ACTIVE, + CONNECTION_STATE_FINALIZATION_SYNC, + CONNECTION_STATE_FINALIZATION_COOPERATE, + CONNECTION_STATE_FINALIZATION_REQUEST_CONTROL, + CONNECTION_STATE_FINALIZATION_PERSISTENT_KEY_LIST, + CONNECTION_STATE_FINALIZATION_FONT_LIST, + CONNECTION_STATE_FINALIZATION_CLIENT_SYNC, + CONNECTION_STATE_FINALIZATION_CLIENT_COOPERATE, + CONNECTION_STATE_FINALIZATION_CLIENT_GRANTED_CONTROL, + CONNECTION_STATE_FINALIZATION_CLIENT_FONT_MAP, + CONNECTION_STATE_ACTIVE + } CONNECTION_STATE; + + typedef struct rdp_channels rdpChannels; + typedef struct rdp_freerdp freerdp; + typedef struct rdp_context rdpContext; + typedef struct rdp_freerdp_peer freerdp_peer; + typedef struct rdp_transport rdpTransport; /* Opaque */ + + typedef struct + { + BYTE red; + BYTE green; + BYTE blue; + } PALETTE_ENTRY; + + typedef struct + { + UINT32 count; + PALETTE_ENTRY entries[256]; + } rdpPalette; + + typedef struct + { + DWORD size; + void* data[4]; + } RDP_PLUGIN_DATA; + + typedef struct + { + INT16 x; + INT16 y; + INT16 width; + INT16 height; + } RDP_RECT; + + typedef struct + { + UINT16 left; + UINT16 top; + UINT16 right; + UINT16 bottom; + } RECTANGLE_16; + + typedef struct + { + UINT32 left; + UINT32 top; + UINT32 width; + UINT32 height; + } RECTANGLE_32; + + /** @brief type of RDP transport */ + typedef enum + { + RDP_TRANSPORT_TCP = 0, + RDP_TRANSPORT_UDP_R, + RDP_TRANSPORT_UDP_L + } RDP_TRANSPORT_TYPE; + +#ifdef __cplusplus +} +#endif + +/* Plugin events */ + +#include <freerdp/message.h> +#include <winpr/collections.h> + +#endif /* __RDP_TYPES_H */ diff --git a/include/freerdp/update.h b/include/freerdp/update.h new file mode 100644 index 0000000..abfe640 --- /dev/null +++ b/include/freerdp/update.h @@ -0,0 +1,250 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Update Interface API + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UPDATE_H +#define FREERDP_UPDATE_H + +#include <winpr/crt.h> +#include <winpr/wlog.h> +#include <winpr/synch.h> +#include <winpr/thread.h> +#include <winpr/stream.h> +#include <winpr/collections.h> + +#include <freerdp/rail.h> +#include <freerdp/types.h> +#include <freerdp/settings.h> +#include <freerdp/graphics.h> +#include <freerdp/utils/pcap.h> + +#include <freerdp/primary.h> +#include <freerdp/secondary.h> +#include <freerdp/altsec.h> +#include <freerdp/window.h> +#include <freerdp/pointer.h> + +/* Bitmap Updates */ +#define EX_COMPRESSED_BITMAP_HEADER_PRESENT 0x01 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct rdp_update rdpUpdate; + + typedef struct + { + UINT32 destLeft; + UINT32 destTop; + UINT32 destRight; + UINT32 destBottom; + UINT32 width; + UINT32 height; + UINT32 bitsPerPixel; + UINT32 flags; + UINT32 bitmapLength; + UINT32 cbCompFirstRowSize; + UINT32 cbCompMainBodySize; + UINT32 cbScanWidth; + UINT32 cbUncompressedSize; + BYTE* bitmapDataStream; + BOOL compressed; + } BITMAP_DATA; + + typedef struct + { + UINT32 number; + BITMAP_DATA* rectangles; + BOOL skipCompression; + } BITMAP_UPDATE; + + /* Palette Updates */ + + typedef struct + { + UINT32 number; + PALETTE_ENTRY entries[256]; + } PALETTE_UPDATE; + + /* Play Sound (System Beep) Updates */ + + typedef struct + { + UINT32 duration; + UINT32 frequency; + } PLAY_SOUND_UPDATE; + + /* Surface Command Updates */ + typedef struct + { + UINT32 highUniqueId; + UINT32 lowUniqueId; + UINT64 tmMilliseconds; + UINT64 tmSeconds; + } TS_COMPRESSED_BITMAP_HEADER_EX; + + typedef struct + { + BYTE bpp; + BYTE flags; + UINT16 codecID; + UINT16 width; + UINT16 height; + UINT32 bitmapDataLength; + TS_COMPRESSED_BITMAP_HEADER_EX exBitmapDataHeader; + BYTE* bitmapData; + } TS_BITMAP_DATA_EX; + + enum SURFCMD_CMDTYPE + { + CMDTYPE_SET_SURFACE_BITS = 0x0001, + CMDTYPE_FRAME_MARKER = 0x0004, + CMDTYPE_STREAM_SURFACE_BITS = 0x0006 + }; + + typedef struct + { + UINT32 cmdType; + UINT32 destLeft; + UINT32 destTop; + UINT32 destRight; + UINT32 destBottom; + TS_BITMAP_DATA_EX bmp; + BOOL skipCompression; + } SURFACE_BITS_COMMAND; + + typedef struct + { + UINT32 frameAction; + UINT32 frameId; + } SURFACE_FRAME_MARKER; + + enum SURFCMD_FRAMEACTION + { + SURFACECMD_FRAMEACTION_BEGIN = 0x0000, + SURFACECMD_FRAMEACTION_END = 0x0001 + }; + + /** @brief status code as in 2.2.5.2 Server Status Info PDU */ + enum + { + TS_STATUS_FINDING_DESTINATION = 0x00000401, + TS_STATUS_LOADING_DESTINATION = 0x00000402, + TS_STATUS_BRINGING_SESSION_ONLINE = 0x00000403, + TS_STATUS_REDIRECTING_TO_DESTINATION = 0x00000404, + TS_STATUS_VM_LOADING = 0x00000501, + TS_STATUS_VM_WAKING = 0x00000502, + TS_STATUS_VM_STARTING = 0x00000503, + TS_STATUS_VM_STARTING_MONITORING = 0x00000504, + TS_STATUS_VM_RETRYING_MONITORING = 0x00000505 + }; + + typedef struct + { + UINT32 frameId; + UINT32 commandCount; + SURFACE_BITS_COMMAND* commands; + } SURFACE_FRAME; + + /* defined inside libfreerdp-core */ + typedef struct rdp_update_proxy rdpUpdateProxy; + + /* Update Interface */ + + typedef BOOL (*pBeginPaint)(rdpContext* context); + typedef BOOL (*pEndPaint)(rdpContext* context); + typedef BOOL (*pSetBounds)(rdpContext* context, const rdpBounds* bounds); + + typedef BOOL (*pSynchronize)(rdpContext* context); + typedef BOOL (*pDesktopResize)(rdpContext* context); + typedef BOOL (*pBitmapUpdate)(rdpContext* context, const BITMAP_UPDATE* bitmap); + typedef BOOL (*pPalette)(rdpContext* context, const PALETTE_UPDATE* palette); + typedef BOOL (*pPlaySound)(rdpContext* context, const PLAY_SOUND_UPDATE* play_sound); + typedef BOOL (*pSetKeyboardIndicators)(rdpContext* context, UINT16 led_flags); + + typedef BOOL (*pRefreshRect)(rdpContext* context, BYTE count, const RECTANGLE_16* areas); + typedef BOOL (*pSuppressOutput)(rdpContext* context, BYTE allow, const RECTANGLE_16* area); + typedef BOOL (*pRemoteMonitors)(rdpContext* context, UINT32 count, const MONITOR_DEF* monitors); + + typedef BOOL (*pSurfaceCommand)(rdpContext* context, wStream* s); + typedef BOOL (*pSurfaceBits)(rdpContext* context, + const SURFACE_BITS_COMMAND* surfaceBitsCommand); + typedef BOOL (*pSurfaceFrameMarker)(rdpContext* context, + const SURFACE_FRAME_MARKER* surfaceFrameMarker); + typedef BOOL (*pSurfaceFrameBits)(rdpContext* context, const SURFACE_BITS_COMMAND* cmd, + BOOL first, BOOL last, UINT32 frameId); + typedef BOOL (*pSurfaceFrameAcknowledge)(rdpContext* context, UINT32 frameId); + + typedef BOOL (*pSaveSessionInfo)(rdpContext* context, UINT32 type, void* data); + typedef BOOL (*pSetKeyboardImeStatus)(rdpContext* context, UINT16 imeId, UINT32 imeState, + UINT32 imeConvMode); + typedef BOOL (*pServerStatusInfo)(rdpContext* context, UINT32 status); + + struct rdp_update + { + rdpContext* context; /* 0 */ + UINT32 paddingA[16 - 1]; /* 1 */ + + pBeginPaint BeginPaint; /* 16 */ + pEndPaint EndPaint; /* 17 */ + pSetBounds SetBounds; /* 18 */ + pSynchronize Synchronize; /* 19 */ + pDesktopResize DesktopResize; /* 20 */ + pBitmapUpdate BitmapUpdate; /* 21 */ + pPalette Palette; /* 22 */ + pPlaySound PlaySound; /* 23 */ + pSetKeyboardIndicators SetKeyboardIndicators; /* 24 */ + pSetKeyboardImeStatus SetKeyboardImeStatus; /* 25 */ + UINT32 paddingB[32 - 26]; /* 26 */ + + rdpPointerUpdate* pointer; /* 32 */ + rdpPrimaryUpdate* primary; /* 33 */ + rdpSecondaryUpdate* secondary; /* 34 */ + rdpAltSecUpdate* altsec; /* 35 */ + rdpWindowUpdate* window; /* 36 */ + UINT32 paddingC[48 - 37]; /* 37 */ + + pRefreshRect RefreshRect; /* 48 */ + pSuppressOutput SuppressOutput; /* 49 */ + pRemoteMonitors RemoteMonitors; /* 50 */ + UINT32 paddingD[64 - 51]; /* 51 */ + + pSurfaceCommand SurfaceCommand; /* 64 */ + pSurfaceBits SurfaceBits; /* 65 */ + pSurfaceFrameMarker SurfaceFrameMarker; /* 66 */ + pSurfaceFrameBits SurfaceFrameBits; /* 67 */ + pSurfaceFrameAcknowledge SurfaceFrameAcknowledge; /* 68 */ + pSaveSessionInfo SaveSessionInfo; /* 69 */ + pServerStatusInfo ServerStatusInfo; /* 70 */ + /* if autoCalculateBitmapData is set to TRUE, the server automatically + * fills BITMAP_DATA struct members: flags, cbCompMainBodySize and cbCompFirstRowSize. + */ + BOOL autoCalculateBitmapData; /* 71 */ + UINT32 paddingE[80 - 72]; /* 72 */ + }; + + FREERDP_API void rdp_update_lock(rdpUpdate* update); + FREERDP_API void rdp_update_unlock(rdpUpdate* update); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UPDATE_H */ diff --git a/include/freerdp/utils/aad.h b/include/freerdp/utils/aad.h new file mode 100644 index 0000000..c59e83c --- /dev/null +++ b/include/freerdp/utils/aad.h @@ -0,0 +1,35 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Network Level Authentication (NLA) + * + * Copyright 2023 Armin Novak <anovak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_AAD_H +#define FREERDP_UTILS_AAD_H + +#include <winpr/wlog.h> + +#include <freerdp/api.h> +#include <freerdp/config.h> + +#ifdef WITH_AAD + +FREERDP_API char* freerdp_utils_aad_get_access_token(wLog* log, const char* data, size_t length); + +#endif + +#endif /* FREERDP_UTILS_AAD_H */ diff --git a/include/freerdp/utils/cliprdr_utils.h b/include/freerdp/utils/cliprdr_utils.h new file mode 100644 index 0000000..0b3295b --- /dev/null +++ b/include/freerdp/utils/cliprdr_utils.h @@ -0,0 +1,51 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDPDR utility functions + * + * Copyright 2022 Armin Novak <armin.novak@thincast.com> + * Copyright 2022 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_CLIPRDR_H +#define FREERDP_UTILS_CLIPRDR_H + +#include <winpr/wtypes.h> +#include <winpr/shell.h> +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API BOOL cliprdr_read_filedescriptor(wStream* s, FILEDESCRIPTORW* descriptor); + FREERDP_API BOOL cliprdr_write_filedescriptor(wStream* s, const FILEDESCRIPTORW* descriptor); + + FREERDP_API UINT cliprdr_parse_file_list(const BYTE* format_data, UINT32 format_data_length, + FILEDESCRIPTORW** file_descriptor_array, + UINT32* file_descriptor_count); + FREERDP_API UINT cliprdr_serialize_file_list(const FILEDESCRIPTORW* file_descriptor_array, + UINT32 file_descriptor_count, BYTE** format_data, + UINT32* format_data_length); + FREERDP_API UINT cliprdr_serialize_file_list_ex(UINT32 flags, + const FILEDESCRIPTORW* file_descriptor_array, + UINT32 file_descriptor_count, + BYTE** format_data, UINT32* format_data_length); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/freerdp/utils/drdynvc.h b/include/freerdp/utils/drdynvc.h new file mode 100644 index 0000000..cc96d95 --- /dev/null +++ b/include/freerdp/utils/drdynvc.h @@ -0,0 +1,39 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * GFX Utils - Helper functions converting something to string + * + * Copyright 2023 Armin Novak <armin.novak@thincast.com> + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_DRDYNVC_H +#define FREERDP_UTILS_DRDYNVC_H + +#include <winpr/wtypes.h> +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API const char* drdynvc_get_packet_type(BYTE cmd); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/freerdp/utils/encoded_types.h b/include/freerdp/utils/encoded_types.h new file mode 100644 index 0000000..b3852fe --- /dev/null +++ b/include/freerdp/utils/encoded_types.h @@ -0,0 +1,40 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * Helper functions to parse encoded types into regular ones + * + * Copyright 2023 Pascal Nowack <Pascal.Nowack@gmx.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_ENCODED_TYPES_H +#define FREERDP_UTILS_ENCODED_TYPES_H + +#include <freerdp/api.h> +#include <winpr/stream.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API BOOL freerdp_read_four_byte_signed_integer(wStream* s, INT32* value); + + FREERDP_API BOOL freerdp_read_four_byte_float(wStream* s, double* value); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UTILS_ENCODED_TYPES_H */ diff --git a/include/freerdp/utils/gfx.h b/include/freerdp/utils/gfx.h new file mode 100644 index 0000000..0f5c189 --- /dev/null +++ b/include/freerdp/utils/gfx.h @@ -0,0 +1,41 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * GFX Utils - Helper functions converting something to string + * + * Copyright 2022 Armin Novak <armin.novak@thincast.com> + * Copyright 2022 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_GFX_H +#define FREERDP_UTILS_GFX_H + +#include <winpr/wtypes.h> +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API const char* rdpgfx_get_cmd_id_string(UINT16 cmdId); + + FREERDP_API const char* rdpgfx_get_codec_id_string(UINT16 codecId); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/freerdp/utils/http.h b/include/freerdp/utils/http.h new file mode 100644 index 0000000..9719402 --- /dev/null +++ b/include/freerdp/utils/http.h @@ -0,0 +1,75 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Smartcard Device Service Virtual Channel + * + * Copyright 2023 Isaac Klein <fifthdegree@protonmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_HTTP_H +#define FREERDP_UTILS_HTTP_H + +#include <freerdp/api.h> + +typedef enum +{ + HTTP_STATUS_CONTINUE = 100, + HTTP_STATUS_SWITCH_PROTOCOLS = 101, + HTTP_STATUS_OK = 200, + HTTP_STATUS_CREATED = 201, + HTTP_STATUS_ACCEPTED = 202, + HTTP_STATUS_PARTIAL = 203, + HTTP_STATUS_NO_CONTENT = 204, + HTTP_STATUS_RESET_CONTENT = 205, + HTTP_STATUS_PARTIAL_CONTENT = 206, + HTTP_STATUS_WEBDAV_MULTI_STATUS = 207, + HTTP_STATUS_AMBIGUOUS = 300, + HTTP_STATUS_MOVED = 301, + HTTP_STATUS_REDIRECT = 302, + HTTP_STATUS_REDIRECT_METHOD = 303, + HTTP_STATUS_NOT_MODIFIED = 304, + HTTP_STATUS_USE_PROXY = 305, + HTTP_STATUS_REDIRECT_KEEP_VERB = 307, + HTTP_STATUS_BAD_REQUEST = 400, + HTTP_STATUS_DENIED = 401, + HTTP_STATUS_PAYMENT_REQ = 402, + HTTP_STATUS_FORBIDDEN = 403, + HTTP_STATUS_NOT_FOUND = 404, + HTTP_STATUS_BAD_METHOD = 405, + HTTP_STATUS_NONE_ACCEPTABLE = 406, + HTTP_STATUS_PROXY_AUTH_REQ = 407, + HTTP_STATUS_REQUEST_TIMEOUT = 408, + HTTP_STATUS_CONFLICT = 409, + HTTP_STATUS_GONE = 410, + HTTP_STATUS_LENGTH_REQUIRED = 411, + HTTP_STATUS_PRECOND_FAILED = 412, + HTTP_STATUS_REQUEST_TOO_LARGE = 413, + HTTP_STATUS_URI_TOO_LONG = 414, + HTTP_STATUS_UNSUPPORTED_MEDIA = 415, + HTTP_STATUS_RETRY_WITH = 449, + HTTP_STATUS_SERVER_ERROR = 500, + HTTP_STATUS_NOT_SUPPORTED = 501, + HTTP_STATUS_BAD_GATEWAY = 502, + HTTP_STATUS_SERVICE_UNAVAIL = 503, + HTTP_STATUS_GATEWAY_TIMEOUT = 504, + HTTP_STATUS_VERSION_NOT_SUP = 505 +} FREERDP_HTTP_STATUS; + +FREERDP_API BOOL freerdp_http_request(const char* url, const char* body, long* status_code, + BYTE** response, size_t* response_length); + +FREERDP_API const char* freerdp_http_status_string(long status); +FREERDP_API char* freerdp_http_status_string_format(long status, char* buffer, size_t size); + +#endif /* FREERDP_UTILS_HTTP_H */ diff --git a/include/freerdp/utils/passphrase.h b/include/freerdp/utils/passphrase.h new file mode 100644 index 0000000..f6a0f96 --- /dev/null +++ b/include/freerdp/utils/passphrase.h @@ -0,0 +1,44 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Passphrase Handling Utils + * + * Copyright 2011 Shea Levy <shea@shealevy.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_PASSPHRASE_H +#define FREERDP_UTILS_PASSPHRASE_H + +#include <stdlib.h> +#include <stdio.h> + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API int freerdp_interruptible_getc(rdpContext* context, FILE* file); + FREERDP_API SSIZE_T freerdp_interruptible_get_line(rdpContext* context, char** lineptr, + size_t* size, FILE* stream); + FREERDP_API char* freerdp_passphrase_read(rdpContext* context, const char* prompt, char* buf, + size_t bufsiz, int from_stdin); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UTILS_PASSPHRASE_H */ diff --git a/include/freerdp/utils/pcap.h b/include/freerdp/utils/pcap.h new file mode 100644 index 0000000..5178f38 --- /dev/null +++ b/include/freerdp/utils/pcap.h @@ -0,0 +1,80 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * pcap File Format Utils + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_PCAP_H +#define FREERDP_UTILS_PCAP_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT32 magic_number; /* magic number */ + UINT16 version_major; /* major version number */ + UINT16 version_minor; /* minor version number */ + INT32 thiszone; /* GMT to local correction */ + UINT32 sigfigs; /* accuracy of timestamps */ + UINT32 snaplen; /* max length of captured packets, in octets */ + UINT32 network; /* data link type */ + } pcap_header; + + typedef struct + { + UINT32 ts_sec; /* timestamp seconds */ + UINT32 ts_usec; /* timestamp microseconds */ + UINT32 incl_len; /* number of octets of packet saved in file */ + UINT32 orig_len; /* actual length of packet */ + } pcap_record_header; + + typedef struct s_pcap_record pcap_record; + + struct s_pcap_record + { + pcap_record_header header; + union + { + void* data; + const void* cdata; + }; + UINT32 length; + pcap_record* next; + }; + + typedef struct rdp_pcap rdpPcap; + + FREERDP_API rdpPcap* pcap_open(const char* name, BOOL write); + FREERDP_API void pcap_close(rdpPcap* pcap); + + FREERDP_API BOOL pcap_add_record(rdpPcap* pcap, const void* data, size_t length); + FREERDP_API BOOL pcap_has_next_record(const rdpPcap* pcap); + FREERDP_API BOOL pcap_get_next_record(rdpPcap* pcap, pcap_record* record); + FREERDP_API BOOL pcap_get_next_record_header(rdpPcap* pcap, pcap_record* record); + FREERDP_API BOOL pcap_get_next_record_content(rdpPcap* pcap, pcap_record* record); + FREERDP_API void pcap_flush(rdpPcap* pcap); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UTILS_PCAP_H */ diff --git a/include/freerdp/utils/pod_arrays.h b/include/freerdp/utils/pod_arrays.h new file mode 100644 index 0000000..ef8667d --- /dev/null +++ b/include/freerdp/utils/pod_arrays.h @@ -0,0 +1,138 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * POD arrays + * + * Copyright 2022 David Fort <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FREERDP_UTILS_POD_ARRAYS_H_ +#define FREERDP_UTILS_POD_ARRAYS_H_ + +#include <winpr/wtypes.h> +#include <winpr/assert.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define POD_ARRAYS_IMPL(T, TLOWER) \ + typedef struct \ + { \ + T* values; \ + size_t nvalues; \ + } Array##T; \ + typedef BOOL Array##T##Cb(T* v, void* data); \ + \ + static INLINE void array_##TLOWER##_init(Array##T* a) \ + { \ + WINPR_ASSERT(a); \ + a->values = NULL; \ + a->nvalues = 0; \ + } \ + \ + static INLINE size_t array_##TLOWER##_size(const Array##T* a) \ + { \ + WINPR_ASSERT(a); \ + return a->nvalues; \ + } \ + \ + static INLINE T* array_##TLOWER##_data(const Array##T* a) \ + { \ + WINPR_ASSERT(a); \ + return a->values; \ + } \ + \ + static INLINE const T* array_##TLOWER##_cdata(const Array##T* a) \ + { \ + WINPR_ASSERT(a); \ + return (const T*)a->values; \ + } \ + \ + static INLINE T array_##TLOWER##_get(const Array##T* a, size_t idx) \ + { \ + WINPR_ASSERT(a); \ + WINPR_ASSERT(a->nvalues > idx); \ + return a->values[idx]; \ + } \ + \ + static INLINE void array_##TLOWER##_set(Array##T* a, size_t idx, T v) \ + { \ + WINPR_ASSERT(a); \ + WINPR_ASSERT(a->nvalues > idx); \ + a->values[idx] = v; \ + } \ + \ + static INLINE BOOL array_##TLOWER##_append(Array##T* a, T v) \ + { \ + WINPR_ASSERT(a); \ + T* tmp = realloc(a->values, sizeof(T) * (a->nvalues + 1)); \ + if (!tmp) \ + return FALSE; \ + \ + tmp[a->nvalues] = v; \ + a->values = tmp; \ + a->nvalues++; \ + return TRUE; \ + } \ + \ + static INLINE BOOL array_##TLOWER##_contains(const Array##T* a, T v) \ + { \ + WINPR_ASSERT(a); \ + \ + for (UINT32 i = 0; i < a->nvalues; i++) \ + { \ + if (memcmp(&a->values[i], &v, sizeof(T)) == 0) \ + return TRUE; \ + } \ + \ + return FALSE; \ + } \ + \ + static INLINE BOOL array_##TLOWER##_foreach(Array##T* a, Array##T##Cb cb, void* data) \ + { \ + WINPR_ASSERT(a); \ + for (size_t i = 0; i < a->nvalues; i++) \ + { \ + if (!cb(&a->values[i], data)) \ + return FALSE; \ + } \ + \ + return TRUE; \ + } \ + \ + static INLINE void array_##TLOWER##_reset(Array##T* a) \ + { \ + WINPR_ASSERT(a); \ + a->nvalues = 0; \ + } \ + \ + static INLINE void array_##TLOWER##_uninit(Array##T* a) \ + { \ + WINPR_ASSERT(a); \ + free(a->values); \ + \ + a->values = NULL; \ + a->nvalues = 0; \ + } + + POD_ARRAYS_IMPL(UINT16, uint16) + POD_ARRAYS_IMPL(UINT32, uint32) + POD_ARRAYS_IMPL(UINT64, uint64) + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UTILS_POD_ARRAYS_H_ */ diff --git a/include/freerdp/utils/profiler.h b/include/freerdp/utils/profiler.h new file mode 100644 index 0000000..29b9e32 --- /dev/null +++ b/include/freerdp/utils/profiler.h @@ -0,0 +1,99 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Profiler Utils + * + * Copyright 2011 Stephen Erisman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_PROFILER_H +#define FREERDP_UTILS_PROFILER_H + +#include <freerdp/api.h> +#include <freerdp/utils/stopwatch.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct S_PROFILER PROFILER; + + FREERDP_API PROFILER* profiler_create(const char* name); + FREERDP_API void profiler_free(PROFILER* profiler); + + FREERDP_API void profiler_enter(PROFILER* profiler); + FREERDP_API void profiler_exit(PROFILER* profiler); + + FREERDP_API void profiler_print_header(void); + FREERDP_API void profiler_print(PROFILER* profiler); + FREERDP_API void profiler_print_footer(void); + +#ifdef WITH_PROFILER +#define PROFILER_RENAME(prof, name) \ + do \ + { \ + profiler_free(prof); \ + prof = profiler_create(name); \ + } while (0); +#define PROFILER_DEFINE(prof) PROFILER* prof; +#define PROFILER_CREATE(prof, name) prof = profiler_create(name); +#define PROFILER_FREE(prof) profiler_free(prof); +#define PROFILER_ENTER(prof) profiler_enter(prof); +#define PROFILER_EXIT(prof) profiler_exit(prof); +#define PROFILER_PRINT_HEADER profiler_print_header(); +#define PROFILER_PRINT(prof) profiler_print(prof); +#define PROFILER_PRINT_FOOTER profiler_print_footer(); +#else +#define PROFILER_RENAME(prof, name) \ + do \ + { \ + } while (0); + +#define PROFILER_DEFINE(prof) +#define PROFILER_CREATE(prof, name) \ + do \ + { \ + } while (0); +#define PROFILER_FREE(prof) \ + do \ + { \ + } while (0); +#define PROFILER_ENTER(prof) \ + do \ + { \ + } while (0); +#define PROFILER_EXIT(prof) \ + do \ + { \ + } while (0); +#define PROFILER_PRINT_HEADER \ + do \ + { \ + } while (0); +#define PROFILER_PRINT(prof) \ + do \ + { \ + } while (0); +#define PROFILER_PRINT_FOOTER \ + do \ + { \ + } while (0); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UTILS_PROFILER_H */ diff --git a/include/freerdp/utils/proxy_utils.h b/include/freerdp/utils/proxy_utils.h new file mode 100644 index 0000000..0bd510e --- /dev/null +++ b/include/freerdp/utils/proxy_utils.h @@ -0,0 +1,37 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP Proxy Utils + * + * Copyright 2016 Armin Novak <armin.novak@gmail.com> + * Copyright 2022 Adrian Vollmer <adrian.vollmer@syss.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_PROXY_UTILS_H +#define FREERDP_PROXY_UTILS_H + +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API BOOL proxy_parse_uri(rdpSettings* settings, const char* uri_in); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_PROXY_UTILS_H */ diff --git a/include/freerdp/utils/rdpdr_utils.h b/include/freerdp/utils/rdpdr_utils.h new file mode 100644 index 0000000..6e205d5 --- /dev/null +++ b/include/freerdp/utils/rdpdr_utils.h @@ -0,0 +1,72 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDPDR utility functions + * + * Copyright 2021 Armin Novak <armin.novak@thincast.com> + * Copyright 2021 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_RDPDR_H +#define FREERDP_UTILS_RDPDR_H + +#include <winpr/stream.h> +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT32 DeviceType; + UINT32 DeviceId; + char PreferredDosName[8]; + UINT32 DeviceDataLength; + BYTE* DeviceData; + } RdpdrDevice; + + typedef struct + { + UINT16 CapabilityType; + UINT16 CapabilityLength; + UINT32 Version; + } RDPDR_CAPABILITY_HEADER; + + FREERDP_API const char* rdpdr_component_string(UINT16 component); + FREERDP_API const char* rdpdr_packetid_string(UINT16 packetid); + FREERDP_API const char* rdpdr_irp_string(UINT32 major); + FREERDP_API const char* rdpdr_cap_type_string(UINT16 capability); + + FREERDP_API LONG scard_log_status_error(const char* tag, const char* what, LONG status); + FREERDP_API const char* scard_get_ioctl_string(UINT32 ioControlCode, BOOL funcName); + + FREERDP_API BOOL rdpdr_write_iocompletion_header(wStream* out, UINT32 DeviceId, + UINT32 CompletionId, UINT32 ioStatus); + + FREERDP_API void rdpdr_dump_received_packet(wLog* log, DWORD lvl, wStream* out, + const char* custom); + FREERDP_API void rdpdr_dump_send_packet(wLog* log, DWORD lvl, wStream* out, const char* custom); + + FREERDP_API UINT rdpdr_read_capset_header(wLog* log, wStream* s, + RDPDR_CAPABILITY_HEADER* header); + FREERDP_API UINT rdpdr_write_capset_header(wLog* log, wStream* s, + const RDPDR_CAPABILITY_HEADER* header); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/freerdp/utils/ringbuffer.h b/include/freerdp/utils/ringbuffer.h new file mode 100644 index 0000000..3de191c --- /dev/null +++ b/include/freerdp/utils/ringbuffer.h @@ -0,0 +1,131 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * Copyright 2014 Thincast Technologies GmbH + * Copyright 2014 Hardening <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_RINGBUFFER_H +#define FREERDP_UTILS_RINGBUFFER_H + +#include <winpr/wtypes.h> +#include <freerdp/api.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @brief ring buffer meta data */ + typedef struct + { + size_t initialSize; + size_t freeSize; + size_t size; + size_t readPtr; + size_t writePtr; + BYTE* buffer; + } RingBuffer; + + /** @brief a piece of data in the ring buffer, exactly like a glibc iovec */ + typedef struct + { + size_t size; + const BYTE* data; + } DataChunk; + + /** + * initialise a ringbuffer + * + * @param initialSize the initial capacity of the ringBuffer + * @return if the initialisation was successful + */ + FREERDP_API BOOL ringbuffer_init(RingBuffer* rb, size_t initialSize); + + /** + * destroys internal data used by this ringbuffer + * + * @param ringbuffer A pointer to the ringbuffer + */ + FREERDP_API void ringbuffer_destroy(RingBuffer* ringbuffer); + + /** + * computes the space used in this ringbuffer + * + * @param ringbuffer A pointer to the ringbuffer + * @return the number of bytes stored in that ringbuffer + */ + FREERDP_API size_t ringbuffer_used(const RingBuffer* ringbuffer); + + /** returns the capacity of the ring buffer + * + * @param ringbuffer A pointer to the ringbuffer + * @return the capacity of this ring buffer + */ + FREERDP_API size_t ringbuffer_capacity(const RingBuffer* ringbuffer); + + /** writes some bytes in the ringbuffer, if the data doesn't fit, the ringbuffer + * is resized automatically + * + * @param rb the ringbuffer + * @param ptr a pointer on the data to add + * @param sz the size of the data to add + * @return if the operation was successful, it could fail in case of OOM during realloc() + */ + FREERDP_API BOOL ringbuffer_write(RingBuffer* rb, const BYTE* ptr, size_t sz); + + /** ensures that we have sz bytes available at the write head, and return a pointer + * on the write head + * + * @param rb the ring buffer + * @param sz the size to ensure + * @return a pointer on the write head, or NULL in case of OOM + */ + FREERDP_API BYTE* ringbuffer_ensure_linear_write(RingBuffer* rb, size_t sz); + + /** move ahead the write head in case some byte were written directly by using + * a pointer retrieved via ringbuffer_ensure_linear_write(). This function is + * used to commit the written bytes. The provided size should not exceed the + * size ensured by ringbuffer_ensure_linear_write() + * + * @param rb the ring buffer + * @param sz the number of bytes that have been written + * @return if the operation was successful, FALSE is sz is too big + */ + FREERDP_API BOOL ringbuffer_commit_written_bytes(RingBuffer* rb, size_t sz); + + /** peeks the buffer chunks for sz bytes and returns how many chunks are filled. + * Note that the sum of the resulting chunks may be smaller than sz. + * + * @param rb the ringbuffer + * @param chunks an array of data chunks that will contain data / size of chunks + * @param sz the requested size + * @return the number of chunks used for reading sz bytes + */ + FREERDP_API int ringbuffer_peek(const RingBuffer* rb, DataChunk chunks[2], size_t sz); + + /** move ahead the read head in case some byte were read using ringbuffer_peek() + * This function is used to commit the bytes that were effectively consumed. + * + * @param rb the ring buffer + * @param sz the number of bytes to read + */ + FREERDP_API void ringbuffer_commit_read_bytes(RingBuffer* rb, size_t sz); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UTILS_RINGBUFFER_H */ diff --git a/include/freerdp/utils/signal.h b/include/freerdp/utils/signal.h new file mode 100644 index 0000000..8a74b81 --- /dev/null +++ b/include/freerdp/utils/signal.h @@ -0,0 +1,63 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Signal handling + * + * Copyright 2011 Shea Levy <shea@shealevy.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_SIGNAL_H +#define FREERDP_UTILS_SIGNAL_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef void (*freerdp_signal_handler_t)(int signum, const char* signame, void* context); + + FREERDP_API int freerdp_handle_signals(void); + + /** \brief registers a cleanup handler for non fatal signals. + * + * This allows cleaning up resources like with \b atexit but for signals. + * + * \param context a context for the clenaup handler. + * \param handler the function to call on cleanup. Must not be \b NULL + * + * \return \b TRUE if registered successfully, \b FALSE otherwise. + */ + FREERDP_API BOOL freerdp_add_signal_cleanup_handler(void* context, + freerdp_signal_handler_t handler); + + /** \brief unregisters a cleanup handler for non fatal signals. + * + * This allows removal of a cleanup handler for signals. + * + * \param context a context for the clenaup handler. + * \param handler the function to call on cleanup. Must not be \b NULL + * + * \return \b TRUE if unregistered successfully, \b FALSE otherwise. + */ + FREERDP_API BOOL freerdp_del_signal_cleanup_handler(void* context, + freerdp_signal_handler_t handler); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UTILS_SIGNAL_H */ diff --git a/include/freerdp/utils/smartcard_call.h b/include/freerdp/utils/smartcard_call.h new file mode 100644 index 0000000..5f6e026 --- /dev/null +++ b/include/freerdp/utils/smartcard_call.h @@ -0,0 +1,65 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Smartcard Device Service Virtual Channel + * + * Copyright 2011 O.S. Systems Software Ltda. + * Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_SMARTCARD_CALL_H +#define FREERDP_CHANNEL_SMARTCARD_CALL_H + +#include <winpr/crt.h> +#include <winpr/stream.h> + +#include <freerdp/api.h> +#include <freerdp/settings.h> +#include <freerdp/channels/scard.h> +#include <freerdp/utils/smartcard_operations.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct s_scard_call_context scard_call_context; + + FREERDP_API void smartcard_call_context_free(scard_call_context* ctx); + + WINPR_ATTR_MALLOC(smartcard_call_context_free, 1) + FREERDP_API scard_call_context* smartcard_call_context_new(const rdpSettings* settings); + + FREERDP_API BOOL smartcard_call_context_signal_stop(scard_call_context* ctx, BOOL reset); + FREERDP_API BOOL smartcard_call_context_add(scard_call_context* ctx, const char* name); + FREERDP_API BOOL smartcard_call_cancel_context(scard_call_context* ctx, SCARDCONTEXT context); + FREERDP_API BOOL smartcard_call_cancel_all_context(scard_call_context* ctx); + FREERDP_API BOOL smartcard_call_release_context(scard_call_context* ctx, SCARDCONTEXT context); + FREERDP_API BOOL smartcard_call_is_configured(scard_call_context* ctx); + + FREERDP_API BOOL smarcard_call_set_callbacks(scard_call_context* ctx, void* userdata, + void* (*fn_new)(void*, SCARDCONTEXT), + void (*fn_free)(void*)); + FREERDP_API void* smartcard_call_get_context(scard_call_context* ctx, SCARDCONTEXT hContext); + + FREERDP_API LONG smartcard_irp_device_control_call(scard_call_context* context, wStream* out, + UINT32* pIoStatus, + SMARTCARD_OPERATION* operation); + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_SMARTCARD_CALL_H */ diff --git a/include/freerdp/utils/smartcard_operations.h b/include/freerdp/utils/smartcard_operations.h new file mode 100644 index 0000000..cab7fac --- /dev/null +++ b/include/freerdp/utils/smartcard_operations.h @@ -0,0 +1,96 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Smartcard Device Service Virtual Channel + * + * Copyright 2011 O.S. Systems Software Ltda. + * Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_SMARTCARD_OPERATIONS_MAIN_H +#define FREERDP_CHANNEL_SMARTCARD_OPERATIONS_MAIN_H + +#include <winpr/crt.h> +#include <winpr/stream.h> +#include <winpr/smartcard.h> + +#include <freerdp/api.h> +#include <freerdp/channels/scard.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + typedef struct + { + union + { + Handles_Call handles; + Long_Call lng; + Context_Call context; + ContextAndStringA_Call contextAndStringA; + ContextAndStringW_Call contextAndStringW; + ContextAndTwoStringA_Call contextAndTwoStringA; + ContextAndTwoStringW_Call contextAndTwoStringW; + EstablishContext_Call establishContext; + ListReaderGroups_Call listReaderGroups; + ListReaders_Call listReaders; + GetStatusChangeA_Call getStatusChangeA; + LocateCardsA_Call locateCardsA; + LocateCardsW_Call locateCardsW; + LocateCards_ATRMask locateCardsATRMask; + LocateCardsByATRA_Call locateCardsByATRA; + LocateCardsByATRW_Call locateCardsByATRW; + GetStatusChangeW_Call getStatusChangeW; + GetReaderIcon_Call getReaderIcon; + GetDeviceTypeId_Call getDeviceTypeId; + Connect_Common_Call connect; + ConnectA_Call connectA; + ConnectW_Call connectW; + Reconnect_Call reconnect; + HCardAndDisposition_Call hCardAndDisposition; + State_Call state; + Status_Call status; + SCardIO_Request scardIO; + Transmit_Call transmit; + GetTransmitCount_Call getTransmitCount; + Control_Call control; + GetAttrib_Call getAttrib; + SetAttrib_Call setAttrib; + ReadCache_Common readCache; + ReadCacheA_Call readCacheA; + ReadCacheW_Call readCacheW; + WriteCache_Common writeCache; + WriteCacheA_Call writeCacheA; + WriteCacheW_Call writeCacheW; + } call; + UINT32 ioControlCode; + UINT32 completionID; + UINT32 deviceID; + SCARDCONTEXT hContext; + SCARDHANDLE hCard; + const char* ioControlCodeName; + } SMARTCARD_OPERATION; + + FREERDP_API LONG smartcard_irp_device_control_decode(wStream* s, UINT32 CompletionId, + UINT32 FileId, + SMARTCARD_OPERATION* operation); + FREERDP_API void smartcard_operation_free(SMARTCARD_OPERATION* op, BOOL allocated); + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_SMARTCARD_CLIENT_OPERATIONS_H */ diff --git a/include/freerdp/utils/smartcard_pack.h b/include/freerdp/utils/smartcard_pack.h new file mode 100644 index 0000000..42a4f02 --- /dev/null +++ b/include/freerdp/utils/smartcard_pack.h @@ -0,0 +1,186 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Smart Card Structure Packing + * + * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com> + * Copyright 2020 Armin Novak <armin.novak@thincast.com> + * Copyright 2020 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_SMARTCARD_CLIENT_PACK_H +#define FREERDP_CHANNEL_SMARTCARD_CLIENT_PACK_H + +#include <winpr/crt.h> +#include <winpr/stream.h> +#include <winpr/smartcard.h> + +#include <freerdp/api.h> +#include <freerdp/channels/scard.h> + +#define SMARTCARD_COMMON_TYPE_HEADER_LENGTH 8 +#define SMARTCARD_PRIVATE_TYPE_HEADER_LENGTH 8 + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API LONG smartcard_pack_write_size_align(wStream* s, size_t size, UINT32 alignment); + FREERDP_API LONG smartcard_unpack_read_size_align(wStream* s, size_t size, UINT32 alignment); + + FREERDP_API SCARDCONTEXT smartcard_scard_context_native_from_redir(REDIR_SCARDCONTEXT* context); + FREERDP_API void smartcard_scard_context_native_to_redir(REDIR_SCARDCONTEXT* context, + SCARDCONTEXT hContext); + + FREERDP_API SCARDHANDLE smartcard_scard_handle_native_from_redir(REDIR_SCARDHANDLE* handle); + FREERDP_API void smartcard_scard_handle_native_to_redir(REDIR_SCARDHANDLE* handle, + SCARDHANDLE hCard); + + FREERDP_API LONG smartcard_unpack_common_type_header(wStream* s); + FREERDP_API void smartcard_pack_common_type_header(wStream* s); + + FREERDP_API LONG smartcard_unpack_private_type_header(wStream* s); + FREERDP_API void smartcard_pack_private_type_header(wStream* s, UINT32 objectBufferLength); + + FREERDP_API LONG smartcard_unpack_establish_context_call(wStream* s, + EstablishContext_Call* call); + + FREERDP_API LONG smartcard_pack_establish_context_return(wStream* s, + const EstablishContext_Return* ret); + + FREERDP_API LONG smartcard_unpack_context_call(wStream* s, Context_Call* call, + const char* name); + + FREERDP_API void smartcard_trace_long_return(const Long_Return* ret, const char* name); + + FREERDP_API LONG smartcard_unpack_list_reader_groups_call(wStream* s, + ListReaderGroups_Call* call, + BOOL unicode); + + FREERDP_API LONG smartcard_pack_list_reader_groups_return(wStream* s, + const ListReaderGroups_Return* ret, + BOOL unicode); + + FREERDP_API LONG smartcard_unpack_list_readers_call(wStream* s, ListReaders_Call* call, + BOOL unicode); + + FREERDP_API LONG smartcard_pack_list_readers_return(wStream* s, const ListReaders_Return* ret, + BOOL unicode); + + FREERDP_API LONG + smartcard_unpack_context_and_two_strings_a_call(wStream* s, ContextAndTwoStringA_Call* call); + + FREERDP_API LONG + smartcard_unpack_context_and_two_strings_w_call(wStream* s, ContextAndTwoStringW_Call* call); + + FREERDP_API LONG smartcard_unpack_context_and_string_a_call(wStream* s, + ContextAndStringA_Call* call); + + FREERDP_API LONG smartcard_unpack_context_and_string_w_call(wStream* s, + ContextAndStringW_Call* call); + + FREERDP_API LONG smartcard_unpack_locate_cards_a_call(wStream* s, LocateCardsA_Call* call); + + FREERDP_API LONG smartcard_pack_locate_cards_return(wStream* s, const LocateCards_Return* ret); + + FREERDP_API LONG smartcard_unpack_locate_cards_w_call(wStream* s, LocateCardsW_Call* call); + + FREERDP_API LONG smartcard_pack_locate_cards_w_return(wStream* s, const LocateCardsW_Call* ret); + + FREERDP_API LONG smartcard_unpack_connect_a_call(wStream* s, ConnectA_Call* call); + + FREERDP_API LONG smartcard_unpack_connect_w_call(wStream* s, ConnectW_Call* call); + + FREERDP_API LONG smartcard_pack_connect_return(wStream* s, const Connect_Return* ret); + + FREERDP_API LONG smartcard_unpack_reconnect_call(wStream* s, Reconnect_Call* call); + + FREERDP_API LONG smartcard_pack_reconnect_return(wStream* s, const Reconnect_Return* ret); + + FREERDP_API LONG smartcard_unpack_hcard_and_disposition_call(wStream* s, + HCardAndDisposition_Call* call, + const char* name); + + FREERDP_API LONG smartcard_unpack_get_status_change_a_call(wStream* s, + GetStatusChangeA_Call* call); + + FREERDP_API LONG smartcard_unpack_get_status_change_w_call(wStream* s, + GetStatusChangeW_Call* call); + + FREERDP_API LONG smartcard_pack_get_status_change_return(wStream* s, + const GetStatusChange_Return* ret, + BOOL unicode); + + FREERDP_API LONG smartcard_unpack_state_call(wStream* s, State_Call* call); + FREERDP_API LONG smartcard_pack_state_return(wStream* s, const State_Return* ret); + + FREERDP_API LONG smartcard_unpack_status_call(wStream* s, Status_Call* call, BOOL unicode); + + FREERDP_API LONG smartcard_pack_status_return(wStream* s, const Status_Return* ret, + BOOL unicode); + + FREERDP_API LONG smartcard_unpack_get_attrib_call(wStream* s, GetAttrib_Call* call); + + FREERDP_API LONG smartcard_pack_get_attrib_return(wStream* s, const GetAttrib_Return* ret, + DWORD dwAttrId, DWORD cbAttrCallLen); + + FREERDP_API LONG smartcard_unpack_set_attrib_call(wStream* s, SetAttrib_Call* call); + + FREERDP_API LONG smartcard_unpack_control_call(wStream* s, Control_Call* call); + + FREERDP_API LONG smartcard_pack_control_return(wStream* s, const Control_Return* ret); + + FREERDP_API LONG smartcard_unpack_transmit_call(wStream* s, Transmit_Call* call); + + FREERDP_API LONG smartcard_pack_transmit_return(wStream* s, const Transmit_Return* ret); + + FREERDP_API LONG smartcard_unpack_locate_cards_by_atr_a_call(wStream* s, + LocateCardsByATRA_Call* call); + + FREERDP_API LONG smartcard_unpack_locate_cards_by_atr_w_call(wStream* s, + LocateCardsByATRW_Call* call); + + FREERDP_API LONG smartcard_unpack_read_cache_a_call(wStream* s, ReadCacheA_Call* call); + + FREERDP_API LONG smartcard_unpack_read_cache_w_call(wStream* s, ReadCacheW_Call* call); + + FREERDP_API LONG smartcard_pack_read_cache_return(wStream* s, const ReadCache_Return* ret); + + FREERDP_API LONG smartcard_unpack_write_cache_a_call(wStream* s, WriteCacheA_Call* call); + + FREERDP_API LONG smartcard_unpack_write_cache_w_call(wStream* s, WriteCacheW_Call* call); + + FREERDP_API LONG smartcard_unpack_get_transmit_count_call(wStream* s, + GetTransmitCount_Call* call); + FREERDP_API LONG smartcard_pack_get_transmit_count_return(wStream* s, + const GetTransmitCount_Return* call); + + FREERDP_API LONG smartcard_unpack_get_reader_icon_call(wStream* s, GetReaderIcon_Call* call); + FREERDP_API LONG smartcard_pack_get_reader_icon_return(wStream* s, + const GetReaderIcon_Return* ret); + + FREERDP_API LONG smartcard_unpack_get_device_type_id_call(wStream* s, + GetDeviceTypeId_Call* call); + + FREERDP_API LONG smartcard_pack_device_type_id_return(wStream* s, + const GetDeviceTypeId_Return* ret); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_SMARTCARD_CLIENT_PACK_H */ diff --git a/include/freerdp/utils/smartcardlogon.h b/include/freerdp/utils/smartcardlogon.h new file mode 100644 index 0000000..66e1097 --- /dev/null +++ b/include/freerdp/utils/smartcardlogon.h @@ -0,0 +1,62 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Logging in with smartcards + * + * Copyright 2022 David Fort <contact@hardening-consulting.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FREERDP_UTILS_SMARTCARDLOGON_H +#define FREERDP_UTILS_SMARTCARDLOGON_H + +#include <freerdp/types.h> +#include <freerdp/settings.h> +#include <freerdp/crypto/certificate.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct SmartcardKeyInfo_st SmartcardKeyInfo; + + typedef struct SmartcardCertInfo_st + { + LPWSTR csp; + LPWSTR reader; + rdpCertificate* certificate; + char* pkinitArgs; + UINT32 slotId; + char* keyName; + WCHAR* containerName; + char* upn; + char* userHint; + char* domainHint; + char* subject; + char* issuer; + BYTE sha1Hash[20]; + SmartcardKeyInfo* key_info; + } SmartcardCertInfo; + + FREERDP_API BOOL smartcard_enumerateCerts(const rdpSettings* settings, + SmartcardCertInfo*** scCerts, size_t* retCount, + BOOL gateway); + FREERDP_API BOOL smartcard_getCert(const rdpContext* context, SmartcardCertInfo** cert, + BOOL gateway); + FREERDP_API void smartcardCertInfo_Free(SmartcardCertInfo* pscCert); + FREERDP_API void smartcardCertList_Free(SmartcardCertInfo** pscCert, size_t count); + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_UTILS_SMARTCARDLOGON_H */ diff --git a/include/freerdp/utils/stopwatch.h b/include/freerdp/utils/stopwatch.h new file mode 100644 index 0000000..c267250 --- /dev/null +++ b/include/freerdp/utils/stopwatch.h @@ -0,0 +1,54 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Stopwatch Utils + * + * Copyright 2011 Stephen Erisman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_STOPWATCH_H +#define FREERDP_UTILS_STOPWATCH_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT64 start; + UINT64 end; + UINT64 elapsed; + UINT32 count; + } STOPWATCH; + + FREERDP_API STOPWATCH* stopwatch_create(void); + FREERDP_API void stopwatch_free(STOPWATCH* stopwatch); + + FREERDP_API void stopwatch_start(STOPWATCH* stopwatch); + FREERDP_API void stopwatch_stop(STOPWATCH* stopwatch); + FREERDP_API void stopwatch_reset(STOPWATCH* stopwatch); + + FREERDP_API double stopwatch_get_elapsed_time_in_seconds(STOPWATCH* stopwatch); + FREERDP_API void stopwatch_get_elapsed_time_in_useconds(STOPWATCH* stopwatch, UINT32* sec, + UINT32* usec); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UTILS_STOPWATCH_H */ diff --git a/include/freerdp/utils/string.h b/include/freerdp/utils/string.h new file mode 100644 index 0000000..c008368 --- /dev/null +++ b/include/freerdp/utils/string.h @@ -0,0 +1,40 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * String Utils - Helper functions converting something to string + * + * Copyright 2022 Armin Novak <armin.novak@thincast.com> + * Copyright 2022 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UTILS_STRING_H +#define FREERDP_UTILS_STRING_H + +#include <freerdp/api.h> +#include <freerdp/types.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + FREERDP_API char* rdp_redirection_flags_to_string(UINT32 flags, char* buffer, size_t size); + FREERDP_API char* rdp_cluster_info_flags_to_string(UINT32 flags, char* buffer, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UTILS_STRING_H */ diff --git a/include/freerdp/window.h b/include/freerdp/window.h new file mode 100644 index 0000000..4f62dfd --- /dev/null +++ b/include/freerdp/window.h @@ -0,0 +1,292 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Window Alternate Secondary Drawing Orders Interface API + * + * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_UPDATE_WINDOW_H +#define FREERDP_UPDATE_WINDOW_H + +#include <freerdp/types.h> +#include <freerdp/rail.h> + +/* Window Order Header Flags */ +#define WINDOW_ORDER_TYPE_WINDOW 0x01000000 +#define WINDOW_ORDER_TYPE_NOTIFY 0x02000000 +#define WINDOW_ORDER_TYPE_DESKTOP 0x04000000 + +#define WINDOW_ORDER_STATE_NEW 0x10000000 +#define WINDOW_ORDER_STATE_DELETED 0x20000000 + +/* Window Order Update */ +#define WINDOW_ORDER_FIELD_OWNER 0x00000002 +#define WINDOW_ORDER_FIELD_STYLE 0x00000008 +#define WINDOW_ORDER_FIELD_SHOW 0x00000010 +#define WINDOW_ORDER_FIELD_TITLE 0x00000004 +#define WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET 0x00004000 +#define WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE 0x00010000 +#define WINDOW_ORDER_FIELD_RESIZE_MARGIN_X 0x00000080 +#define WINDOW_ORDER_FIELD_RESIZE_MARGIN_Y 0x08000000 +#define WINDOW_ORDER_FIELD_RP_CONTENT 0x00020000 +#define WINDOW_ORDER_FIELD_ROOT_PARENT 0x00040000 +#define WINDOW_ORDER_FIELD_WND_OFFSET 0x00000800 +#define WINDOW_ORDER_FIELD_WND_CLIENT_DELTA 0x00008000 +#define WINDOW_ORDER_FIELD_WND_SIZE 0x00000400 +#define WINDOW_ORDER_FIELD_WND_RECTS 0x00000100 +#define WINDOW_ORDER_FIELD_VIS_OFFSET 0x00001000 +#define WINDOW_ORDER_FIELD_VISIBILITY 0x00000200 +#define WINDOW_ORDER_FIELD_OVERLAY_DESCRIPTION 0x00400000 +#define WINDOW_ORDER_FIELD_ICON_OVERLAY_NULL 0x00200000 +#define WINDOW_ORDER_FIELD_TASKBAR_BUTTON 0x00800000 +#define WINDOW_ORDER_FIELD_ENFORCE_SERVER_ZORDER 0x00080000 +#define WINDOW_ORDER_FIELD_APPBAR_STATE 0x00000040 +#define WINDOW_ORDER_FIELD_APPBAR_EDGE 0x00000001 + +/* Window (chached) Icon */ +#define WINDOW_ORDER_ICON 0x40000000 +#define WINDOW_ORDER_CACHED_ICON 0x80000000 +#define WINDOW_ORDER_FIELD_ICON_BIG 0x00002000 +#define WINDOW_ORDER_FIELD_ICON_OVERLAY 0x00100000 + +#define WINDOW_ORDER_FIELD_NOTIFY_VERSION 0x00000008 +#define WINDOW_ORDER_FIELD_NOTIFY_TIP 0x00000001 +#define WINDOW_ORDER_FIELD_NOTIFY_INFO_TIP 0x00000002 +#define WINDOW_ORDER_FIELD_NOTIFY_STATE 0x00000004 +#define WINDOW_ORDER_FIELD_DESKTOP_NONE 0x00000001 +#define WINDOW_ORDER_FIELD_DESKTOP_HOOKED 0x00000002 +#define WINDOW_ORDER_FIELD_DESKTOP_ARC_COMPLETED 0x00000004 +#define WINDOW_ORDER_FIELD_DESKTOP_ARC_BEGAN 0x00000008 +#define WINDOW_ORDER_FIELD_DESKTOP_ZORDER 0x00000010 +#define WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND 0x00000020 + +/* Window Show States */ +#define WINDOW_HIDE 0x00 +#define WINDOW_SHOW_MINIMIZED 0x02 +#define WINDOW_SHOW_MAXIMIZED 0x03 +#define WINDOW_SHOW 0x05 + +/* Window Styles */ +#ifndef _WIN32 +#define WS_BORDER 0x00800000 +#define WS_CAPTION 0x00C00000 +#define WS_CHILD 0x40000000 +#define WS_CLIPCHILDREN 0x02000000 +#define WS_CLIPSIBLINGS 0x04000000 +#define WS_DISABLED 0x08000000 +#define WS_DLGFRAME 0x00400000 +#define WS_GROUP 0x00020000 +#define WS_HSCROLL 0x00100000 +#define WS_ICONIC 0x20000000 +#define WS_MAXIMIZE 0x01000000 +#define WS_MAXIMIZEBOX 0x00010000 +#define WS_MINIMIZE 0x20000000 +#define WS_MINIMIZEBOX 0x00020000 +#define WS_OVERLAPPED 0x00000000 +#define WS_OVERLAPPEDWINDOW \ + (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) +#define WS_POPUP 0x80000000 +#define WS_POPUPWINDOW (WS_POPUP | WS_BORDER | WS_SYSMENU) +#define WS_SIZEBOX 0x00040000 +#define WS_SYSMENU 0x00080000 +#define WS_TABSTOP 0x00010000 +#define WS_THICKFRAME 0x00040000 +#define WS_VISIBLE 0x10000000 +#define WS_VSCROLL 0x00200000 +#endif + +/* Extended Window Styles */ +#ifndef _WIN32 +#define WS_EX_ACCEPTFILES 0x00000010 +#define WS_EX_APPWINDOW 0x00040000 +#define WS_EX_CLIENTEDGE 0x00000200 +#define WS_EX_COMPOSITED 0x02000000 +#define WS_EX_CONTEXTHELP 0x00000400 +#define WS_EX_CONTROLPARENT 0x00010000 +#define WS_EX_DLGMODALFRAME 0x00000001 +#define WS_EX_LAYERED 0x00080000 +#define WS_EX_LAYOUTRTL 0x00400000 +#define WS_EX_LEFT 0x00000000 +#define WS_EX_LEFTSCROLLBAR 0x00004000 +#define WS_EX_LTRREADING 0x00000000 +#define WS_EX_MDICHILD 0x00000040 +#define WS_EX_NOACTIVATE 0x08000000 +#define WS_EX_NOINHERITLAYOUT 0x00100000 +#define WS_EX_NOPARENTNOTIFY 0x00000004 +#define WS_EX_OVERLAPPEDWINDOW (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE) +#define WS_EX_PALETTEWINDOW (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST) +#define WS_EX_RIGHT 0x00001000 +#define WS_EX_RIGHTSCROLLBAR 0x00000000 +#define WS_EX_RTLREADING 0x00002000 +#define WS_EX_STATICEDGE 0x00020000 +#define WS_EX_TOOLWINDOW 0x00000080 +#define WS_EX_TOPMOST 0x00000008 +#define WS_EX_TRANSPARENT 0x00000020 +#define WS_EX_WINDOWEDGE 0x00000100 +#endif + +/** + * This is a custom extended window style used by XRDP + * instructing the client to use local window decorations + */ + +#define WS_EX_DECORATIONS 0x40000000 + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct + { + UINT32 windowId; + UINT32 fieldFlags; + UINT32 notifyIconId; + } WINDOW_ORDER_INFO; + + typedef struct + { + UINT32 cacheEntry; + UINT32 cacheId; + UINT32 bpp; + UINT32 width; + UINT32 height; + UINT32 cbColorTable; + UINT32 cbBitsMask; + UINT32 cbBitsColor; + BYTE* bitsMask; + BYTE* colorTable; + BYTE* bitsColor; + } ICON_INFO; + + typedef struct + { + UINT32 cacheEntry; + UINT32 cacheId; + } CACHED_ICON_INFO; + + typedef struct + { + UINT32 timeout; + UINT32 flags; + RAIL_UNICODE_STRING text; + RAIL_UNICODE_STRING title; + } NOTIFY_ICON_INFOTIP; + + typedef struct + { + UINT32 ownerWindowId; + UINT32 style; + UINT32 extendedStyle; + UINT32 showState; + RAIL_UNICODE_STRING titleInfo; + INT32 clientOffsetX; + INT32 clientOffsetY; + UINT32 clientAreaWidth; + UINT32 clientAreaHeight; + UINT32 RPContent; + UINT32 rootParentHandle; + INT32 windowOffsetX; + INT32 windowOffsetY; + INT32 windowClientDeltaX; + INT32 windowClientDeltaY; + UINT32 windowWidth; + UINT32 windowHeight; + UINT32 numWindowRects; + RECTANGLE_16* windowRects; + INT32 visibleOffsetX; + INT32 visibleOffsetY; + UINT32 resizeMarginLeft; + UINT32 resizeMarginTop; + UINT32 resizeMarginRight; + UINT32 resizeMarginBottom; + UINT32 numVisibilityRects; + RECTANGLE_16* visibilityRects; + RAIL_UNICODE_STRING OverlayDescription; + BYTE TaskbarButton; + UINT8 EnforceServerZOrder; + UINT8 AppBarState; + UINT8 AppBarEdge; + } WINDOW_STATE_ORDER; + + typedef struct + { + ICON_INFO* iconInfo; + } WINDOW_ICON_ORDER; + + typedef struct + { + CACHED_ICON_INFO cachedIcon; + } WINDOW_CACHED_ICON_ORDER; + + typedef struct + { + UINT32 version; + RAIL_UNICODE_STRING toolTip; + NOTIFY_ICON_INFOTIP infoTip; + UINT32 state; + ICON_INFO icon; + CACHED_ICON_INFO cachedIcon; + } NOTIFY_ICON_STATE_ORDER; + + typedef struct + { + UINT32 activeWindowId; + UINT32 numWindowIds; + UINT32* windowIds; + } MONITORED_DESKTOP_ORDER; + + typedef BOOL (*pWindowCreate)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo, + const WINDOW_STATE_ORDER* window_state); + typedef BOOL (*pWindowUpdate)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo, + const WINDOW_STATE_ORDER* window_state); + typedef BOOL (*pWindowIcon)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo, + const WINDOW_ICON_ORDER* window_icon); + typedef BOOL (*pWindowCachedIcon)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo, + const WINDOW_CACHED_ICON_ORDER* window_cached_icon); + typedef BOOL (*pWindowDelete)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo); + typedef BOOL (*pNotifyIconCreate)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo, + const NOTIFY_ICON_STATE_ORDER* notify_icon_state); + typedef BOOL (*pNotifyIconUpdate)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo, + const NOTIFY_ICON_STATE_ORDER* notify_icon_state); + typedef BOOL (*pNotifyIconDelete)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo); + typedef BOOL (*pMonitoredDesktop)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo, + const MONITORED_DESKTOP_ORDER* monitored_desktop); + typedef BOOL (*pNonMonitoredDesktop)(rdpContext* context, const WINDOW_ORDER_INFO* orderInfo); + + struct rdp_window_update + { + rdpContext* context; /* 0 */ + UINT32 paddingA[16 - 1]; /* 1 */ + + pWindowCreate WindowCreate; /* 16 */ + pWindowUpdate WindowUpdate; /* 17 */ + pWindowIcon WindowIcon; /* 18 */ + pWindowCachedIcon WindowCachedIcon; /* 19 */ + pWindowDelete WindowDelete; /* 20 */ + pNotifyIconCreate NotifyIconCreate; /* 21 */ + pNotifyIconUpdate NotifyIconUpdate; /* 22 */ + pNotifyIconDelete NotifyIconDelete; /* 23 */ + pMonitoredDesktop MonitoredDesktop; /* 24 */ + pNonMonitoredDesktop NonMonitoredDesktop; /* 25 */ + UINT32 paddingB[32 - 26]; /* 26 */ + }; + typedef struct rdp_window_update rdpWindowUpdate; + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_UPDATE_WINDOW_H */ |