Milestone 5: deliver embedded RDP sessions and lifecycle hardening

This commit is contained in:
Keith Smith
2026-03-03 18:59:26 -07:00
parent 230a401386
commit 36006bd4aa
2941 changed files with 724359 additions and 77 deletions

View File

@@ -0,0 +1,27 @@
# FreeRDP: A Remote Desktop Protocol Implementation
# libfreerdp-common cmake build script
#
# 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.
set(MODULE_NAME "freerdp-common")
set(MODULE_PREFIX "FREERDP_COMMON")
set(${MODULE_PREFIX}_SRCS addin.c settings.c settings_getters.c settings_str.c settings_str.h assistance.c)
freerdp_module_add(${${MODULE_PREFIX}_SRCS})
if(BUILD_TESTING_INTERNAL OR BUILD_TESTING)
add_subdirectory(test)
endif()

View File

@@ -0,0 +1,399 @@
/**
* 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.
*/
#include <freerdp/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winpr/crt.h>
#include <winpr/path.h>
#include <winpr/string.h>
#include <winpr/library.h>
#include <freerdp/addin.h>
#include <freerdp/build-config.h>
#include <freerdp/log.h>
#define TAG FREERDP_TAG("addin")
static inline BOOL is_path_required(LPCSTR path, size_t len)
{
if (!path || (len <= 1))
return FALSE;
if (strcmp(path, ".") == 0)
return FALSE;
return TRUE;
}
LPSTR freerdp_get_library_install_path(void)
{
LPSTR pszPath = nullptr;
size_t cchPath = 0;
size_t cchLibraryPath = 0;
size_t cchInstallPrefix = 0;
BOOL needLibPath = 0;
BOOL needInstallPath = 0;
LPCSTR pszLibraryPath = FREERDP_LIBRARY_PATH;
LPCSTR pszInstallPrefix = FREERDP_INSTALL_PREFIX;
cchLibraryPath = strlen(pszLibraryPath) + 1;
cchInstallPrefix = strlen(pszInstallPrefix) + 1;
cchPath = cchInstallPrefix + cchLibraryPath;
needInstallPath = is_path_required(pszInstallPrefix, cchInstallPrefix);
needLibPath = is_path_required(pszLibraryPath, cchLibraryPath);
if (!needInstallPath && !needLibPath)
return nullptr;
pszPath = (LPSTR)malloc(cchPath + 1);
if (!pszPath)
return nullptr;
if (needInstallPath)
{
CopyMemory(pszPath, pszInstallPrefix, cchInstallPrefix);
pszPath[cchInstallPrefix] = '\0';
}
if (needLibPath)
{
if (FAILED(NativePathCchAppendA(pszPath, cchPath + 1, pszLibraryPath)))
{
free(pszPath);
return nullptr;
}
}
return pszPath;
}
LPSTR freerdp_get_dynamic_addin_install_path(void)
{
#if defined(WITH_ADD_PLUGIN_TO_RPATH)
return nullptr;
#else
LPSTR pszPath = nullptr;
size_t cchPath = 0;
size_t cchAddinPath = 0;
size_t cchInstallPrefix = 0;
BOOL needLibPath = 0;
BOOL needInstallPath = 0;
LPCSTR pszAddinPath = FREERDP_ADDIN_PATH;
LPCSTR pszInstallPrefix = FREERDP_INSTALL_PREFIX;
cchAddinPath = strlen(pszAddinPath) + 1;
cchInstallPrefix = strlen(pszInstallPrefix) + 1;
cchPath = cchInstallPrefix + cchAddinPath;
needInstallPath = is_path_required(pszInstallPrefix, cchInstallPrefix);
needLibPath = is_path_required(pszAddinPath, cchAddinPath);
WLog_DBG(TAG,
"freerdp_get_dynamic_addin_install_path <- pszInstallPrefix: %s, pszAddinPath: %s",
pszInstallPrefix, pszAddinPath);
if (!needInstallPath && !needLibPath)
return nullptr;
pszPath = (LPSTR)calloc(cchPath + 1, sizeof(CHAR));
if (!pszPath)
return nullptr;
if (needInstallPath)
{
CopyMemory(pszPath, pszInstallPrefix, cchInstallPrefix);
pszPath[cchInstallPrefix] = '\0';
}
if (needLibPath)
{
if (FAILED(NativePathCchAppendA(pszPath, cchPath + 1, pszAddinPath)))
{
free(pszPath);
return nullptr;
}
}
WLog_DBG(TAG, "freerdp_get_dynamic_addin_install_path -> pszPath: %s", pszPath);
return pszPath;
#endif
}
PVIRTUALCHANNELENTRY freerdp_load_dynamic_addin(LPCSTR pszFileName, LPCSTR pszPath,
LPCSTR pszEntryName)
{
LPSTR pszAddinInstallPath = freerdp_get_dynamic_addin_install_path();
PVIRTUALCHANNELENTRY entry = nullptr;
BOOL bHasExt = TRUE;
PCSTR pszExt = nullptr;
size_t cchExt = 0;
HINSTANCE library = nullptr;
size_t cchFileName = 0;
size_t cchFilePath = 0;
LPSTR pszAddinFile = nullptr;
LPSTR pszFilePath = nullptr;
LPSTR pszRelativeFilePath = nullptr;
size_t cchAddinFile = 0;
size_t cchAddinInstallPath = 0;
if (!pszFileName || !pszEntryName)
goto fail;
WLog_DBG(TAG, "freerdp_load_dynamic_addin <- pszFileName: %s, pszPath: %s, pszEntryName: %s",
pszFileName, pszPath, pszEntryName);
cchFileName = strlen(pszFileName);
/* Get file name with prefix and extension */
if (FAILED(PathCchFindExtensionA(pszFileName, cchFileName + 1, &pszExt)))
{
pszExt = PathGetSharedLibraryExtensionA(PATH_SHARED_LIB_EXT_WITH_DOT);
cchExt = strlen(pszExt);
bHasExt = FALSE;
}
if (bHasExt)
{
pszAddinFile = _strdup(pszFileName);
if (!pszAddinFile)
goto fail;
}
else
{
cchAddinFile = cchFileName + cchExt + 2 + sizeof(FREERDP_SHARED_LIBRARY_PREFIX);
pszAddinFile = (LPSTR)malloc(cchAddinFile + 1);
if (!pszAddinFile)
goto fail;
(void)sprintf_s(pszAddinFile, cchAddinFile, FREERDP_SHARED_LIBRARY_PREFIX "%s%s",
pszFileName, pszExt);
}
cchAddinFile = strlen(pszAddinFile);
/* If a path is provided prefix the library name with it. */
if (pszPath)
{
size_t relPathLen = strlen(pszPath) + cchAddinFile + 1;
pszRelativeFilePath = calloc(relPathLen, sizeof(CHAR));
if (!pszRelativeFilePath)
goto fail;
(void)sprintf_s(pszRelativeFilePath, relPathLen, "%s", pszPath);
const HRESULT hr = NativePathCchAppendA(pszRelativeFilePath, relPathLen, pszAddinFile);
if (FAILED(hr))
goto fail;
}
else
pszRelativeFilePath = _strdup(pszAddinFile);
if (!pszRelativeFilePath)
goto fail;
/* If a system prefix path is provided try these locations too. */
if (pszAddinInstallPath)
{
cchAddinInstallPath = strlen(pszAddinInstallPath);
cchFilePath = cchAddinInstallPath + cchFileName + 32;
pszFilePath = (LPSTR)malloc(cchFilePath + 1);
if (!pszFilePath)
goto fail;
CopyMemory(pszFilePath, pszAddinInstallPath, cchAddinInstallPath);
pszFilePath[cchAddinInstallPath] = '\0';
const HRESULT hr = NativePathCchAppendA(pszFilePath, cchFilePath + 1, pszRelativeFilePath);
if (FAILED(hr))
goto fail;
}
else
pszFilePath = _strdup(pszRelativeFilePath);
library = LoadLibraryX(pszFilePath);
if (!library)
goto fail;
entry = GetProcAddressAs(library, pszEntryName, PVIRTUALCHANNELENTRY);
fail:
free(pszRelativeFilePath);
free(pszAddinFile);
free(pszFilePath);
free(pszAddinInstallPath);
if (!entry && library)
FreeLibrary(library);
return entry;
}
PVIRTUALCHANNELENTRY freerdp_load_dynamic_channel_addin_entry(LPCSTR pszName, LPCSTR pszSubsystem,
LPCSTR pszType, DWORD dwFlags)
{
PVIRTUALCHANNELENTRY entry = nullptr;
LPSTR pszFileName = nullptr;
const size_t cchBaseFileName = sizeof(FREERDP_SHARED_LIBRARY_PREFIX) + 32;
size_t nameLen = 0;
size_t subsystemLen = 0;
size_t typeLen = 0;
size_t cchFileName = 0;
if (pszName)
nameLen = strnlen(pszName, MAX_PATH);
if (pszSubsystem)
subsystemLen = strnlen(pszSubsystem, MAX_PATH);
if (pszType)
typeLen = strnlen(pszType, MAX_PATH);
if (pszName && pszSubsystem && pszType)
{
cchFileName = cchBaseFileName + nameLen + subsystemLen + typeLen;
pszFileName = (LPSTR)malloc(cchFileName);
if (!pszFileName)
return nullptr;
(void)sprintf_s(pszFileName, cchFileName, "%s-client-%s-%s", pszName, pszSubsystem,
pszType);
}
else if (pszName && pszSubsystem)
{
cchFileName = cchBaseFileName + nameLen + subsystemLen;
pszFileName = (LPSTR)malloc(cchFileName);
if (!pszFileName)
return nullptr;
(void)sprintf_s(pszFileName, cchFileName, "%s-client-%s", pszName, pszSubsystem);
}
else if (pszName)
{
cchFileName = cchBaseFileName + nameLen;
pszFileName = (LPSTR)malloc(cchFileName);
if (!pszFileName)
return nullptr;
(void)sprintf_s(pszFileName, cchFileName, "%s-client", pszName);
}
else
{
return nullptr;
}
{
LPCSTR pszExtension = PathGetSharedLibraryExtensionA(0);
const char pszPrefix[] = FREERDP_SHARED_LIBRARY_PREFIX;
int rc = 0;
cchFileName += strnlen(pszPrefix, ARRAYSIZE(pszPrefix));
if (pszExtension)
cchFileName += strnlen(pszExtension, MAX_PATH) + 1;
LPSTR tmp = calloc(cchFileName, sizeof(CHAR));
if (tmp)
rc = sprintf_s(tmp, cchFileName, "%s%s.%s", pszPrefix, pszFileName, pszExtension);
free(pszFileName);
pszFileName = tmp;
if (!pszFileName || (rc < 0))
{
free(pszFileName);
return nullptr;
}
}
if (pszSubsystem)
{
LPSTR pszEntryName = nullptr;
size_t cchEntryName = 0;
/* subsystem add-in */
cchEntryName = 64 + nameLen;
pszEntryName = (LPSTR)malloc(cchEntryName + 1);
if (!pszEntryName)
{
free(pszFileName);
return nullptr;
}
(void)sprintf_s(pszEntryName, cchEntryName + 1, "freerdp_%s_client_subsystem_entry",
pszName);
entry = freerdp_load_dynamic_addin(pszFileName, nullptr, pszEntryName);
free(pszEntryName);
free(pszFileName);
return entry;
}
/* channel add-in */
if (dwFlags & FREERDP_ADDIN_CHANNEL_STATIC)
{
if (dwFlags & FREERDP_ADDIN_CHANNEL_ENTRYEX)
entry = freerdp_load_dynamic_addin(pszFileName, nullptr, "VirtualChannelEntryEx");
else
entry = freerdp_load_dynamic_addin(pszFileName, nullptr, "VirtualChannelEntry");
}
else if (dwFlags & FREERDP_ADDIN_CHANNEL_DYNAMIC)
entry = freerdp_load_dynamic_addin(pszFileName, nullptr, "DVCPluginEntry");
else if (dwFlags & FREERDP_ADDIN_CHANNEL_DEVICE)
entry = freerdp_load_dynamic_addin(pszFileName, nullptr, "DeviceServiceEntry");
else
entry = freerdp_load_dynamic_addin(pszFileName, nullptr, pszType);
free(pszFileName);
return entry;
}
static FREERDP_LOAD_CHANNEL_ADDIN_ENTRY_FN freerdp_load_static_channel_addin_entry = nullptr;
int freerdp_register_addin_provider(FREERDP_LOAD_CHANNEL_ADDIN_ENTRY_FN provider,
WINPR_ATTR_UNUSED DWORD dwFlags)
{
freerdp_load_static_channel_addin_entry = provider;
return 0;
}
FREERDP_LOAD_CHANNEL_ADDIN_ENTRY_FN freerdp_get_current_addin_provider(void)
{
return freerdp_load_static_channel_addin_entry;
}
PVIRTUALCHANNELENTRY freerdp_load_channel_addin_entry(LPCSTR pszName, LPCSTR pszSubsystem,
LPCSTR pszType, DWORD dwFlags)
{
PVIRTUALCHANNELENTRY entry = nullptr;
if (freerdp_load_static_channel_addin_entry)
entry = freerdp_load_static_channel_addin_entry(pszName, pszSubsystem, pszType, dwFlags);
if (!entry)
entry = freerdp_load_dynamic_channel_addin_entry(pszName, pszSubsystem, pszType, dwFlags);
if (!entry)
WLog_WARN(TAG, "Failed to load channel %s [%s]", pszName, pszSubsystem);
return entry;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,488 @@
/* Generated by */
#include "../core/settings.h"
#include "settings_str.h"
BOOL freerdp_settings_clone_keys(rdpSettings* dst, const rdpSettings* src)
{
WINPR_ASSERT(dst);
WINPR_ASSERT(src);
for (size_t x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
switch (cur->type)
{
case FREERDP_SETTINGS_TYPE_BOOL: /* bool */
{
BOOL sval = freerdp_settings_get_bool(src, (FreeRDP_Settings_Keys_Bool)cur->id);
if (!freerdp_settings_set_bool(dst, (FreeRDP_Settings_Keys_Bool)cur->id, sval))
return FALSE;
}
break;
case FREERDP_SETTINGS_TYPE_UINT16: /* UINT16 */
{
UINT16 sval =
freerdp_settings_get_uint16(src, (FreeRDP_Settings_Keys_UInt16)cur->id);
if (!freerdp_settings_set_uint16(dst, (FreeRDP_Settings_Keys_UInt16)cur->id, sval))
return FALSE;
}
break;
case FREERDP_SETTINGS_TYPE_INT16: /* INT16 */
{
INT16 sval = freerdp_settings_get_int16(src, (FreeRDP_Settings_Keys_Int16)cur->id);
if (!freerdp_settings_set_int16(dst, (FreeRDP_Settings_Keys_Int16)cur->id, sval))
return FALSE;
}
break;
case FREERDP_SETTINGS_TYPE_UINT32: /* UINT32 */
{
UINT32 sval =
freerdp_settings_get_uint32(src, (FreeRDP_Settings_Keys_UInt32)cur->id);
if (!freerdp_settings_set_uint32(dst, (FreeRDP_Settings_Keys_UInt32)cur->id, sval))
return FALSE;
}
break;
case FREERDP_SETTINGS_TYPE_INT32: /* INT32 */
{
INT32 sval = freerdp_settings_get_int32(src, (FreeRDP_Settings_Keys_Int32)cur->id);
if (!freerdp_settings_set_int32(dst, (FreeRDP_Settings_Keys_Int32)cur->id, sval))
return FALSE;
}
break;
case FREERDP_SETTINGS_TYPE_UINT64: /* UINT64 */
{
UINT64 sval =
freerdp_settings_get_uint64(src, (FreeRDP_Settings_Keys_UInt64)cur->id);
if (!freerdp_settings_set_uint64(dst, (FreeRDP_Settings_Keys_UInt64)cur->id, sval))
return FALSE;
}
break;
case FREERDP_SETTINGS_TYPE_INT64: /* INT64 */
{
INT64 sval = freerdp_settings_get_int64(src, (FreeRDP_Settings_Keys_Int64)cur->id);
if (!freerdp_settings_set_int64(dst, (FreeRDP_Settings_Keys_Int64)cur->id, sval))
return FALSE;
}
break;
case FREERDP_SETTINGS_TYPE_STRING: /* strings */
{
const char* sval =
freerdp_settings_get_string(src, (FreeRDP_Settings_Keys_String)cur->id);
size_t len = 0;
if (sval)
len = strlen(sval);
if (!freerdp_settings_set_string_copy_(dst, (FreeRDP_Settings_Keys_String)cur->id,
sval, len, FALSE))
return FALSE;
}
break;
case FREERDP_SETTINGS_TYPE_POINTER: /* pointer */
{
if (cur->id == FreeRDP_instance)
{
const void* sval =
freerdp_settings_get_pointer(src, (FreeRDP_Settings_Keys_Pointer)cur->id);
if (!freerdp_settings_set_pointer(dst, (FreeRDP_Settings_Keys_Pointer)cur->id,
sval))
return FALSE;
}
}
break;
default:
return FALSE;
}
}
return TRUE;
}
BOOL freerdp_settings_print_diff(wLog* log, DWORD level, const rdpSettings* settings,
const rdpSettings* other)
{
BOOL rc = FALSE;
WINPR_ASSERT(log);
WINPR_ASSERT(settings);
WINPR_ASSERT(other);
for (size_t x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
switch (cur->type)
{
case FREERDP_SETTINGS_TYPE_BOOL: /* bool */
{
BOOL sval =
freerdp_settings_get_bool(settings, (FreeRDP_Settings_Keys_Bool)cur->id);
BOOL cval = freerdp_settings_get_bool(other, (FreeRDP_Settings_Keys_Bool)cur->id);
if (sval != cval)
{
rc = TRUE;
WLog_Print(log, level, "%s [BOOL]: %s -> %s", cur->str, sval ? "TRUE" : "FALSE",
cval ? "TRUE" : "FALSE");
}
}
break;
case FREERDP_SETTINGS_TYPE_UINT16: /* UINT16 */
{
UINT16 sval =
freerdp_settings_get_uint16(settings, (FreeRDP_Settings_Keys_UInt16)cur->id);
UINT16 cval =
freerdp_settings_get_uint16(other, (FreeRDP_Settings_Keys_UInt16)cur->id);
if (sval != cval)
{
rc = TRUE;
WLog_Print(log, level, "%s [UINT16]: %" PRIu16 " -> %" PRIu16, cur->str, sval,
cval);
}
}
break;
case FREERDP_SETTINGS_TYPE_INT16: /* INT16 */
{
INT16 sval =
freerdp_settings_get_int16(settings, (FreeRDP_Settings_Keys_Int16)cur->id);
INT16 cval =
freerdp_settings_get_int16(other, (FreeRDP_Settings_Keys_Int16)cur->id);
if (sval != cval)
{
rc = TRUE;
WLog_Print(log, level, "%s [INT16]: %" PRId16 " -> %" PRId16, cur->str, sval,
cval);
}
}
break;
case FREERDP_SETTINGS_TYPE_UINT32: /* UINT32 */
{
UINT32 sval =
freerdp_settings_get_uint32(settings, (FreeRDP_Settings_Keys_UInt32)cur->id);
UINT32 cval =
freerdp_settings_get_uint32(other, (FreeRDP_Settings_Keys_UInt32)cur->id);
if (sval != cval)
{
rc = TRUE;
WLog_Print(log, level, "%s [UINT32]: %" PRIu32 " -> %" PRIu32, cur->str, sval,
cval);
}
}
break;
case FREERDP_SETTINGS_TYPE_INT32: /* INT32 */
{
INT32 sval =
freerdp_settings_get_int32(settings, (FreeRDP_Settings_Keys_Int32)cur->id);
INT32 cval =
freerdp_settings_get_int32(other, (FreeRDP_Settings_Keys_Int32)cur->id);
if (sval != cval)
{
rc = TRUE;
WLog_Print(log, level, "%s [INT32]: %" PRId32 " -> %" PRId32, cur->str, sval,
cval);
}
}
break;
case FREERDP_SETTINGS_TYPE_UINT64: /* UINT64 */
{
UINT64 sval =
freerdp_settings_get_uint64(settings, (FreeRDP_Settings_Keys_UInt64)cur->id);
UINT64 cval =
freerdp_settings_get_uint64(other, (FreeRDP_Settings_Keys_UInt64)cur->id);
if (sval != cval)
{
rc = TRUE;
WLog_Print(log, level, "%s [UINT64]: %" PRIu64 " -> %" PRIu64, cur->str, sval,
cval);
}
}
break;
case FREERDP_SETTINGS_TYPE_INT64: /* INT64 */
{
INT64 sval =
freerdp_settings_get_int64(settings, (FreeRDP_Settings_Keys_Int64)cur->id);
INT64 cval =
freerdp_settings_get_int64(other, (FreeRDP_Settings_Keys_Int64)cur->id);
if (sval != cval)
{
rc = TRUE;
WLog_Print(log, level, "%s [INT64]: %" PRId64 " -> %" PRId64, cur->str, sval,
cval);
}
}
break;
case FREERDP_SETTINGS_TYPE_STRING: /* strings */
{
const char* sval =
freerdp_settings_get_string(settings, (FreeRDP_Settings_Keys_String)cur->id);
const char* cval =
freerdp_settings_get_string(other, (FreeRDP_Settings_Keys_String)cur->id);
if (sval != cval)
{
if (!sval || !cval || (strcmp(sval, cval) != 0))
{
rc = TRUE;
WLog_Print(log, level, "%s [STRING]: '%s' -> '%s'", cur->str, sval, cval);
}
}
}
break;
case FREERDP_SETTINGS_TYPE_POINTER: /* pointer */
{
const void* sval =
freerdp_settings_get_pointer(settings, (FreeRDP_Settings_Keys_Pointer)cur->id);
const void* cval =
freerdp_settings_get_pointer(other, (FreeRDP_Settings_Keys_Pointer)cur->id);
if (sval != cval)
{
if ((sval && !cval) || (!sval && cval))
{
rc = TRUE;
WLog_Print(log, level, "%s [POINTER]: '%p' -> '%p'", cur->str, sval, cval);
}
}
}
break;
default:
break;
}
}
return rc;
}
void freerdp_settings_dump(wLog* log, DWORD level, const rdpSettings* settings)
{
WINPR_ASSERT(log);
WINPR_ASSERT(settings);
for (size_t x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
switch (cur->type)
{
case FREERDP_SETTINGS_TYPE_BOOL: /* bool */
{
BOOL sval =
freerdp_settings_get_bool(settings, (FreeRDP_Settings_Keys_Bool)cur->id);
WLog_Print(log, level, "%s [BOOL]: %s", cur->str, sval ? "TRUE" : "FALSE");
}
break;
case FREERDP_SETTINGS_TYPE_UINT16: /* UINT16 */
{
UINT16 sval =
freerdp_settings_get_uint16(settings, (FreeRDP_Settings_Keys_UInt16)cur->id);
WLog_Print(log, level, "%s [UINT16]: %" PRIu16, cur->str, sval);
}
break;
case FREERDP_SETTINGS_TYPE_INT16: /* INT16 */
{
INT16 sval =
freerdp_settings_get_int16(settings, (FreeRDP_Settings_Keys_Int16)cur->id);
WLog_Print(log, level, "%s [INT16]: %" PRId16, cur->str, sval);
}
break;
case FREERDP_SETTINGS_TYPE_UINT32: /* UINT32 */
{
UINT32 sval =
freerdp_settings_get_uint32(settings, (FreeRDP_Settings_Keys_UInt32)cur->id);
WLog_Print(log, level, "%s [UINT32]: %" PRIu32, cur->str, sval);
}
break;
case FREERDP_SETTINGS_TYPE_INT32: /* INT32 */
{
INT32 sval =
freerdp_settings_get_int32(settings, (FreeRDP_Settings_Keys_Int32)cur->id);
WLog_Print(log, level, "%s [INT32]: %" PRId32, cur->str, sval);
}
break;
case FREERDP_SETTINGS_TYPE_UINT64: /* UINT64 */
{
UINT64 sval =
freerdp_settings_get_uint64(settings, (FreeRDP_Settings_Keys_UInt64)cur->id);
WLog_Print(log, level, "%s [UINT64]: %" PRIu64, cur->str, sval);
}
break;
case FREERDP_SETTINGS_TYPE_INT64: /* INT64 */
{
INT64 sval =
freerdp_settings_get_int64(settings, (FreeRDP_Settings_Keys_Int64)cur->id);
WLog_Print(log, level, "%s [INT64]: %" PRId64, cur->str, sval);
}
break;
case FREERDP_SETTINGS_TYPE_STRING: /* strings */
{
const char* sval =
freerdp_settings_get_string(settings, (FreeRDP_Settings_Keys_String)cur->id);
WLog_Print(log, level, "%s [STRING]: '%s'", cur->str, sval);
}
break;
case FREERDP_SETTINGS_TYPE_POINTER: /* pointer */
{
const void* sval =
freerdp_settings_get_pointer(settings, (FreeRDP_Settings_Keys_Pointer)cur->id);
WLog_Print(log, level, "%s [POINTER]: '%p'", cur->str, sval);
}
break;
default:
break;
}
}
}
void freerdp_settings_free_keys(rdpSettings* dst, BOOL cleanup)
{
WINPR_ASSERT(dst);
for (size_t x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
switch (cur->type)
{
case FREERDP_SETTINGS_TYPE_STRING: /* strings */
freerdp_settings_set_string_copy_(dst, (FreeRDP_Settings_Keys_String)cur->id,
nullptr, 0, cleanup);
break;
case FREERDP_SETTINGS_TYPE_POINTER: /* pointer */
freerdp_settings_set_pointer_len(dst, (FreeRDP_Settings_Keys_Pointer)cur->id,
nullptr, 0);
break;
default:
break;
}
}
}
SSIZE_T freerdp_settings_get_key_for_name(const char* value)
{
WINPR_ASSERT(value);
for (size_t x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
if (strcmp(value, cur->str) == 0)
return cur->id;
}
return -1;
}
SSIZE_T freerdp_settings_get_type_for_name(const char* value)
{
WINPR_ASSERT(value);
for (size_t x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
if (strcmp(value, cur->str) == 0)
return cur->type;
}
return -1;
}
const char* freerdp_settings_get_type_name_for_key(SSIZE_T key)
{
const SSIZE_T type = freerdp_settings_get_type_for_key(key);
return freerdp_settings_get_type_name_for_type(type);
}
const char* freerdp_settings_get_type_name_for_type(SSIZE_T type)
{
switch (type)
{
case FREERDP_SETTINGS_TYPE_BOOL:
return "FREERDP_SETTINGS_TYPE_BOOL";
case FREERDP_SETTINGS_TYPE_UINT16:
return "FREERDP_SETTINGS_TYPE_UINT16";
case FREERDP_SETTINGS_TYPE_INT16:
return "FREERDP_SETTINGS_TYPE_INT16";
case FREERDP_SETTINGS_TYPE_UINT32:
return "FREERDP_SETTINGS_TYPE_UINT32";
case FREERDP_SETTINGS_TYPE_INT32:
return "FREERDP_SETTINGS_TYPE_INT32";
case FREERDP_SETTINGS_TYPE_UINT64:
return "FREERDP_SETTINGS_TYPE_UINT64";
case FREERDP_SETTINGS_TYPE_INT64:
return "FREERDP_SETTINGS_TYPE_INT64";
case FREERDP_SETTINGS_TYPE_STRING:
return "FREERDP_SETTINGS_TYPE_STRING";
case FREERDP_SETTINGS_TYPE_POINTER:
return "FREERDP_SETTINGS_TYPE_POINTER";
default:
return "FREERDP_SETTINGS_TYPE_UNKNOWN";
}
}
SSIZE_T freerdp_settings_get_type_for_key(SSIZE_T key)
{
for (size_t x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
if (cur->id == key)
return cur->type;
}
return -1;
}
const char* freerdp_settings_get_name_for_key(SSIZE_T key)
{
for (size_t x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
if (cur->id == key)
return cur->str;
}
return nullptr;
}
BOOL freerdp_settings_copy_item(rdpSettings* dst, const rdpSettings* src, SSIZE_T id)
{
WINPR_ASSERT(dst);
WINPR_ASSERT(src);
const SSIZE_T key = freerdp_settings_get_type_for_key(id);
switch (key)
{
case FREERDP_SETTINGS_TYPE_BOOL:
{
const BOOL val = freerdp_settings_get_bool(src, (FreeRDP_Settings_Keys_Bool)id);
return freerdp_settings_set_bool(dst, (FreeRDP_Settings_Keys_Bool)id, val);
}
case FREERDP_SETTINGS_TYPE_INT16:
{
const INT16 val = freerdp_settings_get_int16(src, (FreeRDP_Settings_Keys_Int16)id);
return freerdp_settings_set_int16(dst, (FreeRDP_Settings_Keys_Int16)id, val);
}
case FREERDP_SETTINGS_TYPE_INT32:
{
const INT32 val = freerdp_settings_get_int32(src, (FreeRDP_Settings_Keys_Int32)id);
return freerdp_settings_set_int32(dst, (FreeRDP_Settings_Keys_Int32)id, val);
}
case FREERDP_SETTINGS_TYPE_INT64:
{
const INT64 val = freerdp_settings_get_int64(src, (FreeRDP_Settings_Keys_Int64)id);
return freerdp_settings_set_int64(dst, (FreeRDP_Settings_Keys_Int64)id, val);
}
case FREERDP_SETTINGS_TYPE_UINT16:
{
const UINT16 val = freerdp_settings_get_uint16(src, (FreeRDP_Settings_Keys_UInt16)id);
return freerdp_settings_set_uint16(dst, (FreeRDP_Settings_Keys_UInt16)id, val);
}
case FREERDP_SETTINGS_TYPE_UINT32:
{
const UINT32 val = freerdp_settings_get_uint32(src, (FreeRDP_Settings_Keys_UInt32)id);
return freerdp_settings_set_uint32(dst, (FreeRDP_Settings_Keys_UInt32)id, val);
}
case FREERDP_SETTINGS_TYPE_UINT64:
{
const UINT64 val = freerdp_settings_get_uint64(src, (FreeRDP_Settings_Keys_UInt64)id);
return freerdp_settings_set_uint64(dst, (FreeRDP_Settings_Keys_UInt64)id, val);
}
case FREERDP_SETTINGS_TYPE_STRING:
{
const char* val = freerdp_settings_get_string(src, (FreeRDP_Settings_Keys_String)id);
return freerdp_settings_set_string(dst, (FreeRDP_Settings_Keys_String)id, val);
}
case FREERDP_SETTINGS_TYPE_POINTER:
{
const void* val = freerdp_settings_get_pointer(src, (FreeRDP_Settings_Keys_Pointer)id);
return freerdp_settings_set_pointer(dst, (FreeRDP_Settings_Keys_Pointer)id, val);
}
default:
return FALSE;
}
}

View File

@@ -0,0 +1,639 @@
/* Generated by */
#ifndef FREERDP_CORE_SETTINGS_STR_H
#define FREERDP_CORE_SETTINGS_STR_H
#include "../core/settings.h"
#include <freerdp/settings.h>
#include <freerdp/log.h>
#define TAG FREERDP_TAG("common.settings")
typedef enum
{
FREERDP_SETTINGS_TYPE_BOOL,
FREERDP_SETTINGS_TYPE_UINT16,
FREERDP_SETTINGS_TYPE_INT16,
FREERDP_SETTINGS_TYPE_UINT32,
FREERDP_SETTINGS_TYPE_INT32,
FREERDP_SETTINGS_TYPE_UINT64,
FREERDP_SETTINGS_TYPE_INT64,
FREERDP_SETTINGS_TYPE_STRING,
FREERDP_SETTINGS_TYPE_POINTER
} FREERDP_SETTINGS_TYPE;
struct settings_str_entry
{
SSIZE_T id;
SSIZE_T type;
const char* str;
};
static const struct settings_str_entry settings_map[] = {
{ FreeRDP_AadSecurity, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AadSecurity" },
{ FreeRDP_AllowCacheWaitingList, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AllowCacheWaitingList" },
{ FreeRDP_AllowDesktopComposition, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_AllowDesktopComposition" },
{ FreeRDP_AllowFontSmoothing, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AllowFontSmoothing" },
{ FreeRDP_AllowUnanouncedOrdersFromServer, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_AllowUnanouncedOrdersFromServer" },
{ FreeRDP_AltSecFrameMarkerSupport, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_AltSecFrameMarkerSupport" },
{ FreeRDP_AsyncChannels, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AsyncChannels" },
{ FreeRDP_AsyncUpdate, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AsyncUpdate" },
{ FreeRDP_AudioCapture, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AudioCapture" },
{ FreeRDP_AudioPlayback, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AudioPlayback" },
{ FreeRDP_Authentication, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_Authentication" },
{ FreeRDP_AuthenticationOnly, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AuthenticationOnly" },
{ FreeRDP_AutoAcceptCertificate, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AutoAcceptCertificate" },
{ FreeRDP_AutoDenyCertificate, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AutoDenyCertificate" },
{ FreeRDP_AutoLogonEnabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_AutoLogonEnabled" },
{ FreeRDP_AutoReconnectionEnabled, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_AutoReconnectionEnabled" },
{ FreeRDP_AutoReconnectionPacketSupported, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_AutoReconnectionPacketSupported" },
{ FreeRDP_BitmapCacheEnabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_BitmapCacheEnabled" },
{ FreeRDP_BitmapCachePersistEnabled, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_BitmapCachePersistEnabled" },
{ FreeRDP_BitmapCacheV3Enabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_BitmapCacheV3Enabled" },
{ FreeRDP_BitmapCompressionDisabled, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_BitmapCompressionDisabled" },
{ FreeRDP_CertificateCallbackPreferPEM, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_CertificateCallbackPreferPEM" },
{ FreeRDP_CompressionEnabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_CompressionEnabled" },
{ FreeRDP_ConnectChildSession, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_ConnectChildSession" },
{ FreeRDP_ConsoleSession, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_ConsoleSession" },
{ FreeRDP_CredentialsFromStdin, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_CredentialsFromStdin" },
{ FreeRDP_DeactivateClientDecoding, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_DeactivateClientDecoding" },
{ FreeRDP_Decorations, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_Decorations" },
{ FreeRDP_DesktopResize, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DesktopResize" },
{ FreeRDP_DeviceRedirection, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DeviceRedirection" },
{ FreeRDP_DisableCredentialsDelegation, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_DisableCredentialsDelegation" },
{ FreeRDP_DisableCtrlAltDel, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DisableCtrlAltDel" },
{ FreeRDP_DisableCursorBlinking, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DisableCursorBlinking" },
{ FreeRDP_DisableCursorShadow, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DisableCursorShadow" },
{ FreeRDP_DisableFullWindowDrag, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DisableFullWindowDrag" },
{ FreeRDP_DisableMenuAnims, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DisableMenuAnims" },
{ FreeRDP_DisableRemoteAppCapsCheck, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_DisableRemoteAppCapsCheck" },
{ FreeRDP_DisableThemes, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DisableThemes" },
{ FreeRDP_DisableWallpaper, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DisableWallpaper" },
{ FreeRDP_DrawAllowColorSubsampling, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_DrawAllowColorSubsampling" },
{ FreeRDP_DrawAllowDynamicColorFidelity, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_DrawAllowDynamicColorFidelity" },
{ FreeRDP_DrawAllowSkipAlpha, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DrawAllowSkipAlpha" },
{ FreeRDP_DrawGdiPlusCacheEnabled, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_DrawGdiPlusCacheEnabled" },
{ FreeRDP_DrawGdiPlusEnabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DrawGdiPlusEnabled" },
{ FreeRDP_DrawNineGridEnabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DrawNineGridEnabled" },
{ FreeRDP_DumpRemoteFx, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_DumpRemoteFx" },
{ FreeRDP_DynamicDaylightTimeDisabled, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_DynamicDaylightTimeDisabled" },
{ FreeRDP_DynamicResolutionUpdate, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_DynamicResolutionUpdate" },
{ FreeRDP_EmbeddedWindow, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_EmbeddedWindow" },
{ FreeRDP_EnableWindowsKey, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_EnableWindowsKey" },
{ FreeRDP_EncomspVirtualChannel, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_EncomspVirtualChannel" },
{ FreeRDP_ExtSecurity, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_ExtSecurity" },
{ FreeRDP_ExternalCertificateManagement, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_ExternalCertificateManagement" },
{ FreeRDP_FIPSMode, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_FIPSMode" },
{ FreeRDP_FastPathInput, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_FastPathInput" },
{ FreeRDP_FastPathOutput, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_FastPathOutput" },
{ FreeRDP_ForceEncryptedCsPdu, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_ForceEncryptedCsPdu" },
{ FreeRDP_ForceMultimon, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_ForceMultimon" },
{ FreeRDP_FrameMarkerCommandEnabled, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_FrameMarkerCommandEnabled" },
{ FreeRDP_Fullscreen, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_Fullscreen" },
{ FreeRDP_GatewayArmTransport, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayArmTransport" },
{ FreeRDP_GatewayAvdUseTenantid, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayAvdUseTenantid" },
{ FreeRDP_GatewayBypassLocal, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayBypassLocal" },
{ FreeRDP_GatewayEnabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayEnabled" },
{ FreeRDP_GatewayHttpExtAuthSspiNtlm, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_GatewayHttpExtAuthSspiNtlm" },
{ FreeRDP_GatewayHttpTransport, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayHttpTransport" },
{ FreeRDP_GatewayHttpUseWebsockets, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_GatewayHttpUseWebsockets" },
{ FreeRDP_GatewayIgnoreRedirectionPolicy, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_GatewayIgnoreRedirectionPolicy" },
{ FreeRDP_GatewayRpcTransport, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayRpcTransport" },
{ FreeRDP_GatewayUdpTransport, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayUdpTransport" },
{ FreeRDP_GatewayUseSameCredentials, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_GatewayUseSameCredentials" },
{ FreeRDP_GfxAVC444, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxAVC444" },
{ FreeRDP_GfxAVC444v2, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxAVC444v2" },
{ FreeRDP_GfxH264, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxH264" },
{ FreeRDP_GfxPlanar, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxPlanar" },
{ FreeRDP_GfxProgressive, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxProgressive" },
{ FreeRDP_GfxProgressiveV2, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxProgressiveV2" },
{ FreeRDP_GfxSendQoeAck, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxSendQoeAck" },
{ FreeRDP_GfxSmallCache, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxSmallCache" },
{ FreeRDP_GfxSuspendFrameAck, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxSuspendFrameAck" },
{ FreeRDP_GfxThinClient, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GfxThinClient" },
{ FreeRDP_GrabKeyboard, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GrabKeyboard" },
{ FreeRDP_GrabMouse, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GrabMouse" },
{ FreeRDP_HasExtendedMouseEvent, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_HasExtendedMouseEvent" },
{ FreeRDP_HasHorizontalWheel, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_HasHorizontalWheel" },
{ FreeRDP_HasMonitorAttributes, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_HasMonitorAttributes" },
{ FreeRDP_HasQoeEvent, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_HasQoeEvent" },
{ FreeRDP_HasRelativeMouseEvent, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_HasRelativeMouseEvent" },
{ FreeRDP_HiDefRemoteApp, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_HiDefRemoteApp" },
{ FreeRDP_IPv6Enabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_IPv6Enabled" },
{ FreeRDP_IgnoreCertificate, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_IgnoreCertificate" },
{ FreeRDP_IgnoreInvalidDevices, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_IgnoreInvalidDevices" },
{ FreeRDP_JpegCodec, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_JpegCodec" },
{ FreeRDP_KerberosRdgIsProxy, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_KerberosRdgIsProxy" },
{ FreeRDP_ListMonitors, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_ListMonitors" },
{ FreeRDP_LocalConnection, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_LocalConnection" },
{ FreeRDP_LogonErrors, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_LogonErrors" },
{ FreeRDP_LogonNotify, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_LogonNotify" },
{ FreeRDP_LongCredentialsSupported, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_LongCredentialsSupported" },
{ FreeRDP_LyncRdpMode, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_LyncRdpMode" },
{ FreeRDP_MaximizeShell, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_MaximizeShell" },
{ FreeRDP_MouseAttached, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_MouseAttached" },
{ FreeRDP_MouseHasWheel, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_MouseHasWheel" },
{ FreeRDP_MouseMotion, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_MouseMotion" },
{ FreeRDP_MouseUseRelativeMove, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_MouseUseRelativeMove" },
{ FreeRDP_MstscCookieMode, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_MstscCookieMode" },
{ FreeRDP_MultiTouchGestures, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_MultiTouchGestures" },
{ FreeRDP_MultiTouchInput, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_MultiTouchInput" },
{ FreeRDP_NSCodec, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_NSCodec" },
{ FreeRDP_NSCodecAllowDynamicColorFidelity, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_NSCodecAllowDynamicColorFidelity" },
{ FreeRDP_NSCodecAllowSubsampling, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_NSCodecAllowSubsampling" },
{ FreeRDP_NegotiateSecurityLayer, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_NegotiateSecurityLayer" },
{ FreeRDP_NetworkAutoDetect, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_NetworkAutoDetect" },
{ FreeRDP_NlaSecurity, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_NlaSecurity" },
{ FreeRDP_NoBitmapCompressionHeader, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_NoBitmapCompressionHeader" },
{ FreeRDP_OldLicenseBehaviour, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_OldLicenseBehaviour" },
{ FreeRDP_PasswordIsSmartcardPin, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_PasswordIsSmartcardPin" },
{ FreeRDP_PercentScreenUseHeight, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_PercentScreenUseHeight" },
{ FreeRDP_PercentScreenUseWidth, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_PercentScreenUseWidth" },
{ FreeRDP_PlayRemoteFx, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_PlayRemoteFx" },
{ FreeRDP_PreferIPv6OverIPv4, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_PreferIPv6OverIPv4" },
{ FreeRDP_PrintReconnectCookie, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_PrintReconnectCookie" },
{ FreeRDP_PromptForCredentials, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_PromptForCredentials" },
{ FreeRDP_RdpSecurity, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RdpSecurity" },
{ FreeRDP_RdstlsSecurity, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RdstlsSecurity" },
{ FreeRDP_RedirectClipboard, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectClipboard" },
{ FreeRDP_RedirectDrives, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectDrives" },
{ FreeRDP_RedirectHomeDrive, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectHomeDrive" },
{ FreeRDP_RedirectParallelPorts, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectParallelPorts" },
{ FreeRDP_RedirectPrinters, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectPrinters" },
{ FreeRDP_RedirectSerialPorts, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectSerialPorts" },
{ FreeRDP_RedirectSmartCards, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectSmartCards" },
{ FreeRDP_RedirectWebAuthN, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectWebAuthN" },
{ FreeRDP_RefreshRect, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RefreshRect" },
{ FreeRDP_RemdeskVirtualChannel, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RemdeskVirtualChannel" },
{ FreeRDP_RemoteAppLanguageBarSupported, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_RemoteAppLanguageBarSupported" },
{ FreeRDP_RemoteApplicationMode, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RemoteApplicationMode" },
{ FreeRDP_RemoteAssistanceMode, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RemoteAssistanceMode" },
{ FreeRDP_RemoteAssistanceRequestControl, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_RemoteAssistanceRequestControl" },
{ FreeRDP_RemoteConsoleAudio, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RemoteConsoleAudio" },
{ FreeRDP_RemoteCredentialGuard, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RemoteCredentialGuard" },
{ FreeRDP_RemoteFxCodec, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RemoteFxCodec" },
{ FreeRDP_RemoteFxImageCodec, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RemoteFxImageCodec" },
{ FreeRDP_RemoteFxOnly, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RemoteFxOnly" },
{ FreeRDP_RestrictedAdminModeRequired, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_RestrictedAdminModeRequired" },
{ FreeRDP_RestrictedAdminModeSupported, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_RestrictedAdminModeSupported" },
{ FreeRDP_SaltedChecksum, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SaltedChecksum" },
{ FreeRDP_SendPreconnectionPdu, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SendPreconnectionPdu" },
{ FreeRDP_ServerLicenseRequired, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_ServerLicenseRequired" },
{ FreeRDP_ServerMode, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_ServerMode" },
{ FreeRDP_SmartSizing, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SmartSizing" },
{ FreeRDP_SmartcardEmulation, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SmartcardEmulation" },
{ FreeRDP_SmartcardLogon, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SmartcardLogon" },
{ FreeRDP_SoftwareGdi, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SoftwareGdi" },
{ FreeRDP_SoundBeepsEnabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SoundBeepsEnabled" },
{ FreeRDP_SpanMonitors, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SpanMonitors" },
{ FreeRDP_SupportAsymetricKeys, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportAsymetricKeys" },
{ FreeRDP_SupportDisplayControl, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportDisplayControl" },
{ FreeRDP_SupportDynamicChannels, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SupportDynamicChannels" },
{ FreeRDP_SupportDynamicTimeZone, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SupportDynamicTimeZone" },
{ FreeRDP_SupportEchoChannel, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportEchoChannel" },
{ FreeRDP_SupportEdgeActionV1, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportEdgeActionV1" },
{ FreeRDP_SupportEdgeActionV2, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportEdgeActionV2" },
{ FreeRDP_SupportErrorInfoPdu, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportErrorInfoPdu" },
{ FreeRDP_SupportGeometryTracking, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SupportGeometryTracking" },
{ FreeRDP_SupportGraphicsPipeline, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SupportGraphicsPipeline" },
{ FreeRDP_SupportHeartbeatPdu, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportHeartbeatPdu" },
{ FreeRDP_SupportMonitorLayoutPdu, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SupportMonitorLayoutPdu" },
{ FreeRDP_SupportMultitransport, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportMultitransport" },
{ FreeRDP_SupportSSHAgentChannel, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SupportSSHAgentChannel" },
{ FreeRDP_SupportSkipChannelJoin, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SupportSkipChannelJoin" },
{ FreeRDP_SupportStatusInfoPdu, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportStatusInfoPdu" },
{ FreeRDP_SupportVideoOptimized, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SupportVideoOptimized" },
{ FreeRDP_SuppressOutput, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SuppressOutput" },
{ FreeRDP_SurfaceCommandsEnabled, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SurfaceCommandsEnabled" },
{ FreeRDP_SurfaceFrameMarkerEnabled, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SurfaceFrameMarkerEnabled" },
{ FreeRDP_SuspendInput, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_SuspendInput" },
{ FreeRDP_SynchronousDynamicChannels, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SynchronousDynamicChannels" },
{ FreeRDP_SynchronousStaticChannels, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_SynchronousStaticChannels" },
{ FreeRDP_TcpKeepAlive, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_TcpKeepAlive" },
{ FreeRDP_TlsSecurity, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_TlsSecurity" },
{ FreeRDP_ToggleFullscreen, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_ToggleFullscreen" },
{ FreeRDP_TransportDump, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_TransportDump" },
{ FreeRDP_TransportDumpReplay, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_TransportDumpReplay" },
{ FreeRDP_TransportDumpReplayNodelay, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_TransportDumpReplayNodelay" },
{ FreeRDP_UnicodeInput, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_UnicodeInput" },
{ FreeRDP_UnmapButtons, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_UnmapButtons" },
{ FreeRDP_UseCommonStdioCallbacks, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_UseCommonStdioCallbacks" },
{ FreeRDP_UseMultimon, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_UseMultimon" },
{ FreeRDP_UseRdpSecurityLayer, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_UseRdpSecurityLayer" },
{ FreeRDP_UsingSavedCredentials, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_UsingSavedCredentials" },
{ FreeRDP_VideoDisable, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_VideoDisable" },
{ FreeRDP_VmConnectMode, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_VmConnectMode" },
{ FreeRDP_WaitForOutputBufferFlush, FREERDP_SETTINGS_TYPE_BOOL,
"FreeRDP_WaitForOutputBufferFlush" },
{ FreeRDP_Workarea, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_Workarea" },
{ FreeRDP_CapsGeneralCompressionLevel, FREERDP_SETTINGS_TYPE_UINT16,
"FreeRDP_CapsGeneralCompressionLevel" },
{ FreeRDP_CapsGeneralCompressionTypes, FREERDP_SETTINGS_TYPE_UINT16,
"FreeRDP_CapsGeneralCompressionTypes" },
{ FreeRDP_CapsProtocolVersion, FREERDP_SETTINGS_TYPE_UINT16, "FreeRDP_CapsProtocolVersion" },
{ FreeRDP_CapsRemoteUnshareFlag, FREERDP_SETTINGS_TYPE_UINT16,
"FreeRDP_CapsRemoteUnshareFlag" },
{ FreeRDP_CapsUpdateCapabilityFlag, FREERDP_SETTINGS_TYPE_UINT16,
"FreeRDP_CapsUpdateCapabilityFlag" },
{ FreeRDP_DesktopOrientation, FREERDP_SETTINGS_TYPE_UINT16, "FreeRDP_DesktopOrientation" },
{ FreeRDP_OrderSupportFlags, FREERDP_SETTINGS_TYPE_UINT16, "FreeRDP_OrderSupportFlags" },
{ FreeRDP_OrderSupportFlagsEx, FREERDP_SETTINGS_TYPE_UINT16, "FreeRDP_OrderSupportFlagsEx" },
{ FreeRDP_ProxyPort, FREERDP_SETTINGS_TYPE_UINT16, "FreeRDP_ProxyPort" },
{ FreeRDP_SupportedColorDepths, FREERDP_SETTINGS_TYPE_UINT16, "FreeRDP_SupportedColorDepths" },
{ FreeRDP_TLSMaxVersion, FREERDP_SETTINGS_TYPE_UINT16, "FreeRDP_TLSMaxVersion" },
{ FreeRDP_TLSMinVersion, FREERDP_SETTINGS_TYPE_UINT16, "FreeRDP_TLSMinVersion" },
{ FreeRDP_TextANSICodePage, FREERDP_SETTINGS_TYPE_UINT16, "FreeRDP_TextANSICodePage" },
{ FreeRDP_AcceptedCertLength, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_AcceptedCertLength" },
{ FreeRDP_AuthenticationLevel, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_AuthenticationLevel" },
{ FreeRDP_AutoReconnectMaxRetries, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_AutoReconnectMaxRetries" },
{ FreeRDP_BitmapCacheV2NumCells, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_BitmapCacheV2NumCells" },
{ FreeRDP_BitmapCacheV3CodecId, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_BitmapCacheV3CodecId" },
{ FreeRDP_BitmapCacheVersion, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_BitmapCacheVersion" },
{ FreeRDP_BrushSupportLevel, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_BrushSupportLevel" },
{ FreeRDP_ChannelCount, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ChannelCount" },
{ FreeRDP_ChannelDefArraySize, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ChannelDefArraySize" },
{ FreeRDP_ClientBuild, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ClientBuild" },
{ FreeRDP_ClientRandomLength, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ClientRandomLength" },
{ FreeRDP_ClientSessionId, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ClientSessionId" },
{ FreeRDP_ClipboardFeatureMask, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ClipboardFeatureMask" },
{ FreeRDP_ClusterInfoFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ClusterInfoFlags" },
{ FreeRDP_ColorDepth, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ColorDepth" },
{ FreeRDP_ColorPointerCacheSize, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_ColorPointerCacheSize" },
{ FreeRDP_CompDeskSupportLevel, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_CompDeskSupportLevel" },
{ FreeRDP_CompressionLevel, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_CompressionLevel" },
{ FreeRDP_ConnectionType, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ConnectionType" },
{ FreeRDP_CookieMaxLength, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_CookieMaxLength" },
{ FreeRDP_DesktopHeight, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DesktopHeight" },
{ FreeRDP_DesktopPhysicalHeight, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_DesktopPhysicalHeight" },
{ FreeRDP_DesktopPhysicalWidth, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DesktopPhysicalWidth" },
{ FreeRDP_DesktopPosX, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DesktopPosX" },
{ FreeRDP_DesktopPosY, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DesktopPosY" },
{ FreeRDP_DesktopScaleFactor, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DesktopScaleFactor" },
{ FreeRDP_DesktopWidth, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DesktopWidth" },
{ FreeRDP_DeviceArraySize, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DeviceArraySize" },
{ FreeRDP_DeviceCount, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DeviceCount" },
{ FreeRDP_DeviceScaleFactor, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DeviceScaleFactor" },
{ FreeRDP_DrawNineGridCacheEntries, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_DrawNineGridCacheEntries" },
{ FreeRDP_DrawNineGridCacheSize, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_DrawNineGridCacheSize" },
{ FreeRDP_DynamicChannelArraySize, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_DynamicChannelArraySize" },
{ FreeRDP_DynamicChannelCount, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_DynamicChannelCount" },
{ FreeRDP_EarlyCapabilityFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_EarlyCapabilityFlags" },
{ FreeRDP_EncryptionLevel, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_EncryptionLevel" },
{ FreeRDP_EncryptionMethods, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_EncryptionMethods" },
{ FreeRDP_ExtEncryptionMethods, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ExtEncryptionMethods" },
{ FreeRDP_FakeMouseMotionInterval, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_FakeMouseMotionInterval" },
{ FreeRDP_Floatbar, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_Floatbar" },
{ FreeRDP_ForceIPvX, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ForceIPvX" },
{ FreeRDP_FrameAcknowledge, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_FrameAcknowledge" },
{ FreeRDP_GatewayAcceptedCertLength, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_GatewayAcceptedCertLength" },
{ FreeRDP_GatewayCredentialsSource, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_GatewayCredentialsSource" },
{ FreeRDP_GatewayPort, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_GatewayPort" },
{ FreeRDP_GatewayUsageMethod, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_GatewayUsageMethod" },
{ FreeRDP_GfxCapsFilter, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_GfxCapsFilter" },
{ FreeRDP_GlyphSupportLevel, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_GlyphSupportLevel" },
{ FreeRDP_JpegCodecId, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_JpegCodecId" },
{ FreeRDP_JpegQuality, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_JpegQuality" },
{ FreeRDP_KeySpec, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_KeySpec" },
{ FreeRDP_KeyboardCodePage, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_KeyboardCodePage" },
{ FreeRDP_KeyboardFunctionKey, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_KeyboardFunctionKey" },
{ FreeRDP_KeyboardHook, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_KeyboardHook" },
{ FreeRDP_KeyboardLayout, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_KeyboardLayout" },
{ FreeRDP_KeyboardSubType, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_KeyboardSubType" },
{ FreeRDP_KeyboardType, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_KeyboardType" },
{ FreeRDP_LargePointerFlag, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_LargePointerFlag" },
{ FreeRDP_LoadBalanceInfoLength, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_LoadBalanceInfoLength" },
{ FreeRDP_MonitorAttributeFlags, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_MonitorAttributeFlags" },
{ FreeRDP_MonitorCount, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_MonitorCount" },
{ FreeRDP_MonitorDefArraySize, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_MonitorDefArraySize" },
{ FreeRDP_MonitorFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_MonitorFlags" },
{ FreeRDP_MultifragMaxRequestSize, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_MultifragMaxRequestSize" },
{ FreeRDP_MultitransportFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_MultitransportFlags" },
{ FreeRDP_NSCodecColorLossLevel, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_NSCodecColorLossLevel" },
{ FreeRDP_NSCodecId, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_NSCodecId" },
{ FreeRDP_NegotiationFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_NegotiationFlags" },
{ FreeRDP_NumMonitorIds, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_NumMonitorIds" },
{ FreeRDP_OffscreenCacheEntries, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_OffscreenCacheEntries" },
{ FreeRDP_OffscreenCacheSize, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_OffscreenCacheSize" },
{ FreeRDP_OffscreenSupportLevel, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_OffscreenSupportLevel" },
{ FreeRDP_OsMajorType, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_OsMajorType" },
{ FreeRDP_OsMinorType, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_OsMinorType" },
{ FreeRDP_Password51Length, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_Password51Length" },
{ FreeRDP_PduSource, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_PduSource" },
{ FreeRDP_PercentScreen, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_PercentScreen" },
{ FreeRDP_PerformanceFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_PerformanceFlags" },
{ FreeRDP_PointerCacheSize, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_PointerCacheSize" },
{ FreeRDP_PreconnectionId, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_PreconnectionId" },
{ FreeRDP_ProxyType, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ProxyType" },
{ FreeRDP_RdpVersion, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_RdpVersion" },
{ FreeRDP_ReceivedCapabilitiesSize, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_ReceivedCapabilitiesSize" },
{ FreeRDP_RedirectedSessionId, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_RedirectedSessionId" },
{ FreeRDP_RedirectionAcceptedCertLength, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RedirectionAcceptedCertLength" },
{ FreeRDP_RedirectionFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_RedirectionFlags" },
{ FreeRDP_RedirectionGuidLength, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RedirectionGuidLength" },
{ FreeRDP_RedirectionPasswordLength, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RedirectionPasswordLength" },
{ FreeRDP_RedirectionPreferType, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RedirectionPreferType" },
{ FreeRDP_RedirectionTsvUrlLength, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RedirectionTsvUrlLength" },
{ FreeRDP_RemoteAppNumIconCacheEntries, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RemoteAppNumIconCacheEntries" },
{ FreeRDP_RemoteAppNumIconCaches, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RemoteAppNumIconCaches" },
{ FreeRDP_RemoteApplicationExpandCmdLine, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RemoteApplicationExpandCmdLine" },
{ FreeRDP_RemoteApplicationExpandWorkingDir, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RemoteApplicationExpandWorkingDir" },
{ FreeRDP_RemoteApplicationSupportLevel, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RemoteApplicationSupportLevel" },
{ FreeRDP_RemoteApplicationSupportMask, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RemoteApplicationSupportMask" },
{ FreeRDP_RemoteFxCaptureFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_RemoteFxCaptureFlags" },
{ FreeRDP_RemoteFxCodecId, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_RemoteFxCodecId" },
{ FreeRDP_RemoteFxCodecMode, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_RemoteFxCodecMode" },
{ FreeRDP_RemoteFxRlgrMode, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_RemoteFxRlgrMode" },
{ FreeRDP_RemoteWndSupportLevel, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_RemoteWndSupportLevel" },
{ FreeRDP_RequestedProtocols, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_RequestedProtocols" },
{ FreeRDP_SelectedProtocol, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_SelectedProtocol" },
{ FreeRDP_ServerCertificateLength, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_ServerCertificateLength" },
{ FreeRDP_ServerLicenseProductIssuersCount, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_ServerLicenseProductIssuersCount" },
{ FreeRDP_ServerLicenseProductVersion, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_ServerLicenseProductVersion" },
{ FreeRDP_ServerPort, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ServerPort" },
{ FreeRDP_ServerRandomLength, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ServerRandomLength" },
{ FreeRDP_ShareId, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ShareId" },
{ FreeRDP_SmartSizingHeight, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_SmartSizingHeight" },
{ FreeRDP_SmartSizingWidth, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_SmartSizingWidth" },
{ FreeRDP_StaticChannelArraySize, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_StaticChannelArraySize" },
{ FreeRDP_StaticChannelCount, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_StaticChannelCount" },
{ FreeRDP_SurfaceCommandsSupported, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_SurfaceCommandsSupported" },
{ FreeRDP_TargetNetAddressCount, FREERDP_SETTINGS_TYPE_UINT32,
"FreeRDP_TargetNetAddressCount" },
{ FreeRDP_TcpAckTimeout, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_TcpAckTimeout" },
{ FreeRDP_TcpConnectTimeout, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_TcpConnectTimeout" },
{ FreeRDP_TcpKeepAliveDelay, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_TcpKeepAliveDelay" },
{ FreeRDP_TcpKeepAliveInterval, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_TcpKeepAliveInterval" },
{ FreeRDP_TcpKeepAliveRetries, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_TcpKeepAliveRetries" },
{ FreeRDP_ThreadingFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_ThreadingFlags" },
{ FreeRDP_TlsSecLevel, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_TlsSecLevel" },
{ FreeRDP_VCChunkSize, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_VCChunkSize" },
{ FreeRDP_VCFlags, FREERDP_SETTINGS_TYPE_UINT32, "FreeRDP_VCFlags" },
{ FreeRDP_MonitorLocalShiftX, FREERDP_SETTINGS_TYPE_INT32, "FreeRDP_MonitorLocalShiftX" },
{ FreeRDP_MonitorLocalShiftY, FREERDP_SETTINGS_TYPE_INT32, "FreeRDP_MonitorLocalShiftY" },
{ FreeRDP_XPan, FREERDP_SETTINGS_TYPE_INT32, "FreeRDP_XPan" },
{ FreeRDP_YPan, FREERDP_SETTINGS_TYPE_INT32, "FreeRDP_YPan" },
{ FreeRDP_MonitorOverrideFlags, FREERDP_SETTINGS_TYPE_UINT64, "FreeRDP_MonitorOverrideFlags" },
{ FreeRDP_ParentWindowId, FREERDP_SETTINGS_TYPE_UINT64, "FreeRDP_ParentWindowId" },
{ FreeRDP_AadServerHostname, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_AadServerHostname" },
{ FreeRDP_AcceptedCert, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_AcceptedCert" },
{ FreeRDP_ActionScript, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ActionScript" },
{ FreeRDP_AllowedTlsCiphers, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_AllowedTlsCiphers" },
{ FreeRDP_AlternateShell, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_AlternateShell" },
{ FreeRDP_AssistanceFile, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_AssistanceFile" },
{ FreeRDP_AuthenticationPackageList, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_AuthenticationPackageList" },
{ FreeRDP_AuthenticationServiceClass, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_AuthenticationServiceClass" },
{ FreeRDP_BitmapCachePersistFile, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_BitmapCachePersistFile" },
{ FreeRDP_CardName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_CardName" },
{ FreeRDP_CertificateAcceptedFingerprints, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_CertificateAcceptedFingerprints" },
{ FreeRDP_CertificateName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_CertificateName" },
{ FreeRDP_ClientAddress, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ClientAddress" },
{ FreeRDP_ClientDir, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ClientDir" },
{ FreeRDP_ClientHostname, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ClientHostname" },
{ FreeRDP_ClientProductId, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ClientProductId" },
{ FreeRDP_ClipboardUseSelection, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_ClipboardUseSelection" },
{ FreeRDP_ComputerName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ComputerName" },
{ FreeRDP_ConfigPath, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ConfigPath" },
{ FreeRDP_ConnectionFile, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ConnectionFile" },
{ FreeRDP_ContainerName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ContainerName" },
{ FreeRDP_CspName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_CspName" },
{ FreeRDP_CurrentPath, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_CurrentPath" },
{ FreeRDP_Domain, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_Domain" },
{ FreeRDP_DrivesToRedirect, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_DrivesToRedirect" },
{ FreeRDP_DumpRemoteFxFile, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_DumpRemoteFxFile" },
{ FreeRDP_DynamicDSTTimeZoneKeyName, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_DynamicDSTTimeZoneKeyName" },
{ FreeRDP_GatewayAcceptedCert, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayAcceptedCert" },
{ FreeRDP_GatewayAccessToken, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayAccessToken" },
{ FreeRDP_GatewayAvdAadtenantid, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayAvdAadtenantid" },
{ FreeRDP_GatewayAvdAccessAadFormat, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayAvdAccessAadFormat" },
{ FreeRDP_GatewayAvdAccessTokenFormat, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayAvdAccessTokenFormat" },
{ FreeRDP_GatewayAvdActivityhint, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayAvdActivityhint" },
{ FreeRDP_GatewayAvdArmpath, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayAvdArmpath" },
{ FreeRDP_GatewayAvdClientID, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayAvdClientID" },
{ FreeRDP_GatewayAvdDiagnosticserviceurl, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayAvdDiagnosticserviceurl" },
{ FreeRDP_GatewayAvdGeo, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayAvdGeo" },
{ FreeRDP_GatewayAvdHubdiscoverygeourl, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayAvdHubdiscoverygeourl" },
{ FreeRDP_GatewayAvdScope, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayAvdScope" },
{ FreeRDP_GatewayAvdWvdEndpointPool, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayAvdWvdEndpointPool" },
{ FreeRDP_GatewayAzureActiveDirectory, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayAzureActiveDirectory" },
{ FreeRDP_GatewayDomain, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayDomain" },
{ FreeRDP_GatewayHostname, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayHostname" },
{ FreeRDP_GatewayHttpExtAuthBearer, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayHttpExtAuthBearer" },
{ FreeRDP_GatewayHttpMsUserAgent, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_GatewayHttpMsUserAgent" },
{ FreeRDP_GatewayHttpReferer, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayHttpReferer" },
{ FreeRDP_GatewayHttpUserAgent, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayHttpUserAgent" },
{ FreeRDP_GatewayPassword, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayPassword" },
{ FreeRDP_GatewayUrl, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayUrl" },
{ FreeRDP_GatewayUsername, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_GatewayUsername" },
{ FreeRDP_HomePath, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_HomePath" },
{ FreeRDP_ImeFileName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ImeFileName" },
{ FreeRDP_KerberosArmor, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KerberosArmor" },
{ FreeRDP_KerberosCache, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KerberosCache" },
{ FreeRDP_KerberosKdcUrl, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KerberosKdcUrl" },
{ FreeRDP_KerberosKeytab, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KerberosKeytab" },
{ FreeRDP_KerberosLifeTime, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KerberosLifeTime" },
{ FreeRDP_KerberosRealm, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KerberosRealm" },
{ FreeRDP_KerberosRenewableLifeTime, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_KerberosRenewableLifeTime" },
{ FreeRDP_KerberosStartTime, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KerberosStartTime" },
{ FreeRDP_KeyboardPipeName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KeyboardPipeName" },
{ FreeRDP_KeyboardRemappingList, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_KeyboardRemappingList" },
{ FreeRDP_NtlmSamFile, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_NtlmSamFile" },
{ FreeRDP_Password, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_Password" },
{ FreeRDP_PasswordHash, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_PasswordHash" },
{ FreeRDP_Pkcs11Module, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_Pkcs11Module" },
{ FreeRDP_PkinitAnchors, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_PkinitAnchors" },
{ FreeRDP_PlayRemoteFxFile, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_PlayRemoteFxFile" },
{ FreeRDP_PreconnectionBlob, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_PreconnectionBlob" },
{ FreeRDP_ProxyHostname, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ProxyHostname" },
{ FreeRDP_ProxyPassword, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ProxyPassword" },
{ FreeRDP_ProxyUsername, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ProxyUsername" },
{ FreeRDP_RDP2TCPArgs, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_RDP2TCPArgs" },
{ FreeRDP_ReaderName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ReaderName" },
{ FreeRDP_RedirectionAcceptedCert, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RedirectionAcceptedCert" },
{ FreeRDP_RedirectionDomain, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_RedirectionDomain" },
{ FreeRDP_RedirectionTargetFQDN, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RedirectionTargetFQDN" },
{ FreeRDP_RedirectionTargetNetBiosName, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RedirectionTargetNetBiosName" },
{ FreeRDP_RedirectionUsername, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_RedirectionUsername" },
{ FreeRDP_RemoteApplicationCmdLine, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteApplicationCmdLine" },
{ FreeRDP_RemoteApplicationFile, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteApplicationFile" },
{ FreeRDP_RemoteApplicationGuid, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteApplicationGuid" },
{ FreeRDP_RemoteApplicationIcon, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteApplicationIcon" },
{ FreeRDP_RemoteApplicationName, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteApplicationName" },
{ FreeRDP_RemoteApplicationProgram, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteApplicationProgram" },
{ FreeRDP_RemoteApplicationWorkingDir, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteApplicationWorkingDir" },
{ FreeRDP_RemoteAssistancePassStub, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteAssistancePassStub" },
{ FreeRDP_RemoteAssistancePassword, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteAssistancePassword" },
{ FreeRDP_RemoteAssistanceRCTicket, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteAssistanceRCTicket" },
{ FreeRDP_RemoteAssistanceSessionId, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_RemoteAssistanceSessionId" },
{ FreeRDP_ServerHostname, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_ServerHostname" },
{ FreeRDP_ServerLicenseCompanyName, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_ServerLicenseCompanyName" },
{ FreeRDP_ServerLicenseProductName, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_ServerLicenseProductName" },
{ FreeRDP_ShellWorkingDirectory, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_ShellWorkingDirectory" },
{ FreeRDP_SmartcardCertificate, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_SmartcardCertificate" },
{ FreeRDP_SmartcardPrivateKey, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_SmartcardPrivateKey" },
{ FreeRDP_SspiModule, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_SspiModule" },
{ FreeRDP_TargetNetAddress, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_TargetNetAddress" },
{ FreeRDP_TerminalDescriptor, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_TerminalDescriptor" },
{ FreeRDP_TlsSecretsFile, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_TlsSecretsFile" },
{ FreeRDP_TransportDumpFile, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_TransportDumpFile" },
{ FreeRDP_UserSpecifiedServerName, FREERDP_SETTINGS_TYPE_STRING,
"FreeRDP_UserSpecifiedServerName" },
{ FreeRDP_Username, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_Username" },
{ FreeRDP_WinSCardModule, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_WinSCardModule" },
{ FreeRDP_WindowTitle, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_WindowTitle" },
{ FreeRDP_WmClass, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_WmClass" },
{ FreeRDP_BitmapCacheV2CellInfo, FREERDP_SETTINGS_TYPE_POINTER,
"FreeRDP_BitmapCacheV2CellInfo" },
{ FreeRDP_ChannelDefArray, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_ChannelDefArray" },
{ FreeRDP_ClientAutoReconnectCookie, FREERDP_SETTINGS_TYPE_POINTER,
"FreeRDP_ClientAutoReconnectCookie" },
{ FreeRDP_ClientRandom, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_ClientRandom" },
{ FreeRDP_ClientTimeZone, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_ClientTimeZone" },
{ FreeRDP_DeviceArray, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_DeviceArray" },
{ FreeRDP_DynamicChannelArray, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_DynamicChannelArray" },
{ FreeRDP_FragCache, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_FragCache" },
{ FreeRDP_GlyphCache, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_GlyphCache" },
{ FreeRDP_LoadBalanceInfo, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_LoadBalanceInfo" },
{ FreeRDP_MonitorDefArray, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_MonitorDefArray" },
{ FreeRDP_MonitorIds, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_MonitorIds" },
{ FreeRDP_OrderSupport, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_OrderSupport" },
{ FreeRDP_Password51, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_Password51" },
{ FreeRDP_RdpServerCertificate, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_RdpServerCertificate" },
{ FreeRDP_RdpServerRsaKey, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_RdpServerRsaKey" },
{ FreeRDP_ReceivedCapabilities, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_ReceivedCapabilities" },
{ FreeRDP_ReceivedCapabilityData, FREERDP_SETTINGS_TYPE_POINTER,
"FreeRDP_ReceivedCapabilityData" },
{ FreeRDP_ReceivedCapabilityDataSizes, FREERDP_SETTINGS_TYPE_POINTER,
"FreeRDP_ReceivedCapabilityDataSizes" },
{ FreeRDP_RedirectionGuid, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_RedirectionGuid" },
{ FreeRDP_RedirectionPassword, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_RedirectionPassword" },
{ FreeRDP_RedirectionTargetCertificate, FREERDP_SETTINGS_TYPE_POINTER,
"FreeRDP_RedirectionTargetCertificate" },
{ FreeRDP_RedirectionTsvUrl, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_RedirectionTsvUrl" },
{ FreeRDP_ServerAutoReconnectCookie, FREERDP_SETTINGS_TYPE_POINTER,
"FreeRDP_ServerAutoReconnectCookie" },
{ FreeRDP_ServerCertificate, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_ServerCertificate" },
{ FreeRDP_ServerLicenseProductIssuers, FREERDP_SETTINGS_TYPE_POINTER,
"FreeRDP_ServerLicenseProductIssuers" },
{ FreeRDP_ServerRandom, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_ServerRandom" },
{ FreeRDP_StaticChannelArray, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_StaticChannelArray" },
{ FreeRDP_TargetNetAddresses, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_TargetNetAddresses" },
{ FreeRDP_TargetNetPorts, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_TargetNetPorts" },
{ FreeRDP_instance, FREERDP_SETTINGS_TYPE_POINTER, "FreeRDP_instance" },
};
#endif

View File

@@ -0,0 +1,30 @@
set(MODULE_NAME "TestCommon")
set(MODULE_PREFIX "TEST_COMMON")
disable_warnings_for_directory(${CMAKE_CURRENT_BINARY_DIR})
set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c)
set(${MODULE_PREFIX}_TESTS TestAddinArgv.c TestCommonAssistance.c)
set(FUZZERS TestFuzzCommonAssistanceParseFileBuffer.c TestFuzzCommonAssistanceBinToHexString.c
TestFuzzCommonAssistanceHexStringToBin.c
)
create_test_sourcelist(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_DRIVER} ${${MODULE_PREFIX}_TESTS})
add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS})
target_link_libraries(${MODULE_NAME} freerdp winpr)
include(AddFuzzerTest)
add_fuzzer_test("${FUZZERS}" "freerdp winpr")
set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}")
foreach(test ${${MODULE_PREFIX}_TESTS})
get_filename_component(TestName ${test} NAME_WE)
add_test(${TestName} ${TESTING_OUTPUT_DIRECTORY}/${MODULE_NAME} ${TestName})
endforeach()
set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/Common/Test")

View File

@@ -0,0 +1,346 @@
#include <winpr/crt.h>
#include <winpr/crypto.h>
#include <freerdp/settings.h>
static BOOL test_alloc(void)
{
BOOL rc = FALSE;
int rng = 0;
const char* param[] = { "foo:", "bar", "bla", "rdp", nullptr };
ADDIN_ARGV* arg1 = nullptr;
ADDIN_ARGV* arg2 = nullptr;
ADDIN_ARGV* arg3 = nullptr;
ADDIN_ARGV* arg4 = nullptr;
/* Test empty allocation */
arg1 = freerdp_addin_argv_new(0, nullptr);
if (!arg1 || (arg1->argc != 0) || (arg1->argv))
goto fail;
/* Test allocation without initializing arguments of random size > 0 */
if (winpr_RAND(&rng, sizeof(rng)) < 0)
goto fail;
rng = abs(rng % 8192) + 1;
arg2 = freerdp_addin_argv_new(rng, nullptr);
if (!arg2 || (arg2->argc != rng) || (!arg2->argv))
goto fail;
for (int x = 0; x < arg2->argc; x++)
{
if (arg2->argv[x])
goto fail;
}
/* Test allocation with initializing arguments of size > 0 */
arg3 = freerdp_addin_argv_new(ARRAYSIZE(param) - 1, param);
if (!arg3 || (arg3->argc != ARRAYSIZE(param) - 1) || (!arg3->argv))
goto fail;
for (int x = 0; x < arg3->argc; x++)
{
if (strcmp(arg3->argv[x], param[x]) != 0)
goto fail;
}
/* Input lists with nullptr elements are not allowed */
arg4 = freerdp_addin_argv_new(ARRAYSIZE(param), param);
if (arg4)
goto fail;
rc = TRUE;
fail:
freerdp_addin_argv_free(arg1);
freerdp_addin_argv_free(arg2);
freerdp_addin_argv_free(arg3);
freerdp_addin_argv_free(arg4);
printf("%s: %d\n", __func__, rc);
return rc;
}
static BOOL test_clone(void)
{
BOOL rc = FALSE;
const char* param[] = { "foo:", "bar", "bla", "rdp" };
ADDIN_ARGV* arg = nullptr;
ADDIN_ARGV* clone = nullptr;
ADDIN_ARGV* clone2 = nullptr;
arg = freerdp_addin_argv_new(ARRAYSIZE(param), param);
if (!arg || (arg->argc != ARRAYSIZE(param)))
goto fail;
clone = freerdp_addin_argv_clone(arg);
if (!clone || (clone->argc != arg->argc))
goto fail;
for (int x = 0; x < arg->argc; x++)
{
if (strcmp(param[x], arg->argv[x]) != 0)
goto fail;
if (strcmp(param[x], clone->argv[x]) != 0)
goto fail;
}
clone2 = freerdp_addin_argv_clone(nullptr);
if (clone2)
goto fail;
rc = TRUE;
fail:
freerdp_addin_argv_free(arg);
freerdp_addin_argv_free(clone);
freerdp_addin_argv_free(clone2);
printf("%s: %d\n", __func__, rc);
return rc;
}
static BOOL test_add_remove(void)
{
const char* args[] = { "foo", "bar", "bla", "gaga" };
BOOL rc = FALSE;
ADDIN_ARGV* arg = freerdp_addin_argv_new(0, nullptr);
if (!arg || (arg->argc != 0) || arg->argv)
goto fail;
for (size_t y = 0; y < ARRAYSIZE(args); y++)
{
const char* param = args[y];
if (!freerdp_addin_argv_add_argument(arg, param))
goto fail;
if (arg->argc != (int)y + 1)
goto fail;
if (!arg->argv)
goto fail;
if (strcmp(arg->argv[y], param) != 0)
goto fail;
}
/* Try to remove non existing element, must not return TRUE */
if (freerdp_addin_argv_del_argument(arg, "foobar"))
goto fail;
/* Invalid parameters, must return FALSE */
if (freerdp_addin_argv_del_argument(nullptr, "foobar"))
goto fail;
/* Invalid parameters, must return FALSE */
if (freerdp_addin_argv_del_argument(arg, nullptr))
goto fail;
/* Remove elements one by one to test argument index move */
for (size_t y = 0; y < ARRAYSIZE(args); y++)
{
const char* param = args[y];
if (!freerdp_addin_argv_del_argument(arg, param))
goto fail;
for (size_t x = y + 1; x < ARRAYSIZE(args); x++)
{
if (strcmp(arg->argv[x - y - 1], args[x]) != 0)
goto fail;
}
}
rc = TRUE;
fail:
freerdp_addin_argv_free(arg);
printf("%s: %d\n", __func__, rc);
return rc;
}
static BOOL test_set_argument(void)
{
int ret = 0;
const char* newarg = "foobar";
const char* args[] = { "foo", "bar", "bla", "gaga" };
BOOL rc = FALSE;
ADDIN_ARGV* arg = nullptr;
arg = freerdp_addin_argv_new(ARRAYSIZE(args), args);
if (!arg || (arg->argc != ARRAYSIZE(args)) || !arg->argv)
goto fail;
/* Check invalid parameters */
ret = freerdp_addin_set_argument(nullptr, "foo");
if (ret >= 0)
goto fail;
ret = freerdp_addin_set_argument(arg, nullptr);
if (ret >= 0)
goto fail;
/* Try existing parameter */
ret = freerdp_addin_set_argument(arg, "foo");
if ((ret != 1) || (arg->argc != ARRAYSIZE(args)))
goto fail;
/* Try new parameter */
ret = freerdp_addin_set_argument(arg, newarg);
if ((ret != 0) || (arg->argc != ARRAYSIZE(args) + 1) ||
(strcmp(newarg, arg->argv[ARRAYSIZE(args)]) != 0))
goto fail;
rc = TRUE;
fail:
freerdp_addin_argv_free(arg);
printf("%s: %d\n", __func__, rc);
return rc;
}
static BOOL test_replace_argument(void)
{
int ret = 0;
const char* newarg = "foobar";
const char* args[] = { "foo", "bar", "bla", "gaga" };
BOOL rc = FALSE;
ADDIN_ARGV* arg = nullptr;
arg = freerdp_addin_argv_new(ARRAYSIZE(args), args);
if (!arg || (arg->argc != ARRAYSIZE(args)) || !arg->argv)
goto fail;
/* Check invalid parameters */
ret = freerdp_addin_replace_argument(nullptr, "foo", newarg);
if (ret >= 0)
goto fail;
ret = freerdp_addin_replace_argument(arg, nullptr, newarg);
if (ret >= 0)
goto fail;
ret = freerdp_addin_replace_argument(arg, "foo", nullptr);
if (ret >= 0)
goto fail;
/* Try existing parameter */
ret = freerdp_addin_replace_argument(arg, "foo", newarg);
if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[0], newarg) != 0))
goto fail;
/* Try new parameter */
ret = freerdp_addin_replace_argument(arg, "lalala", newarg);
if ((ret != 0) || (arg->argc != ARRAYSIZE(args) + 1) ||
(strcmp(newarg, arg->argv[ARRAYSIZE(args)]) != 0))
goto fail;
rc = TRUE;
fail:
freerdp_addin_argv_free(arg);
printf("%s: %d\n", __func__, rc);
return rc;
}
static BOOL test_set_argument_value(void)
{
int ret = 0;
const char* newarg1 = "foobar";
const char* newarg2 = "lalala";
const char* fullnewarg1 = "foo:foobar";
const char* fullnewarg2 = "foo:lalala";
const char* fullnewvalue = "lalala:foobar";
const char* args[] = { "foo", "foo:", "bar", "bla", "gaga" };
BOOL rc = FALSE;
ADDIN_ARGV* arg = nullptr;
arg = freerdp_addin_argv_new(ARRAYSIZE(args), args);
if (!arg || (arg->argc != ARRAYSIZE(args)) || !arg->argv)
goto fail;
/* Check invalid parameters */
ret = freerdp_addin_set_argument_value(nullptr, "foo", newarg1);
if (ret >= 0)
goto fail;
ret = freerdp_addin_set_argument_value(arg, nullptr, newarg1);
if (ret >= 0)
goto fail;
ret = freerdp_addin_set_argument_value(arg, "foo", nullptr);
if (ret >= 0)
goto fail;
/* Try existing parameter */
ret = freerdp_addin_set_argument_value(arg, "foo", newarg1);
if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[1], fullnewarg1) != 0))
goto fail;
ret = freerdp_addin_set_argument_value(arg, "foo", newarg2);
if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[1], fullnewarg2) != 0))
goto fail;
/* Try new parameter */
ret = freerdp_addin_set_argument_value(arg, newarg2, newarg1);
if ((ret != 0) || (arg->argc != ARRAYSIZE(args) + 1) ||
(strcmp(fullnewvalue, arg->argv[ARRAYSIZE(args)]) != 0))
goto fail;
rc = TRUE;
fail:
freerdp_addin_argv_free(arg);
printf("%s: %d\n", __func__, rc);
return rc;
}
static BOOL test_replace_argument_value(void)
{
int ret = 0;
const char* newarg1 = "foobar";
const char* newarg2 = "lalala";
const char* fullnewarg1 = "foo:foobar";
const char* fullnewarg2 = "foo:lalala";
const char* fullnewvalue = "lalala:foobar";
const char* args[] = { "foo", "foo:", "bar", "bla", "gaga" };
BOOL rc = FALSE;
ADDIN_ARGV* arg = nullptr;
arg = freerdp_addin_argv_new(ARRAYSIZE(args), args);
if (!arg || (arg->argc != ARRAYSIZE(args)) || !arg->argv)
goto fail;
/* Check invalid parameters */
ret = freerdp_addin_replace_argument_value(nullptr, "bar", "foo", newarg1);
if (ret >= 0)
goto fail;
ret = freerdp_addin_replace_argument_value(arg, nullptr, "foo", newarg1);
if (ret >= 0)
goto fail;
ret = freerdp_addin_replace_argument_value(arg, "foo", nullptr, newarg1);
if (ret >= 0)
goto fail;
ret = freerdp_addin_replace_argument_value(arg, "bar", "foo", nullptr);
if (ret >= 0)
goto fail;
/* Try existing parameter */
ret = freerdp_addin_replace_argument_value(arg, "bla", "foo", newarg1);
if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[3], fullnewarg1) != 0))
goto fail;
ret = freerdp_addin_replace_argument_value(arg, "foo", "foo", newarg2);
if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[0], fullnewarg2) != 0))
goto fail;
/* Try new parameter */
ret = freerdp_addin_replace_argument_value(arg, "hahaha", newarg2, newarg1);
if ((ret != 0) || (arg->argc != ARRAYSIZE(args) + 1) ||
(strcmp(fullnewvalue, arg->argv[ARRAYSIZE(args)]) != 0))
goto fail;
rc = TRUE;
fail:
freerdp_addin_argv_free(arg);
printf("%s: %d\n", __func__, rc);
return rc;
}
int TestAddinArgv(int argc, char* argv[])
{
WINPR_UNUSED(argc);
WINPR_UNUSED(argv);
if (!test_alloc())
return -1;
if (!test_clone())
return -1;
if (!test_add_remove())
return -1;
if (!test_set_argument())
return -1;
if (!test_replace_argument())
return -1;
if (!test_set_argument_value())
return -1;
if (!test_replace_argument_value())
return -1;
return 0;
}

View File

@@ -0,0 +1,317 @@
#include <winpr/crt.h>
#include <winpr/print.h>
#include <winpr/ssl.h>
#include <winpr/wlog.h>
#include <winpr/platform.h>
#include <freerdp/assistance.h>
static const char TEST_MSRC_INCIDENT_PASSWORD_TYPE1[] = "Password1";
static const BYTE TEST_MSRC_INCIDENT_PASSWORD_TYPE1_ENC[32] = {
0x3c, 0x9c, 0xae, 0xb, 0xce, 0x7a, 0xb1, 0x5c, 0x8a, 0xac, 0x1, 0xd6, 0x76, 0x4, 0x5e, 0xdf,
0x3f, 0xfa, 0xf0, 0x92, 0xe2, 0xde, 0x36, 0x8a, 0x20, 0x17, 0xe6, 0x8a, 0xd, 0xed, 0x7c, 0x90
};
static const char TEST_MSRC_INCIDENT_FILE_TYPE1[] =
"<?xml version=\"1.0\" encoding=\"Unicode\" ?>"
"<UPLOADINFO TYPE=\"Escalated\">"
"<UPLOADDATA "
"USERNAME=\"Administrator\" "
"RCTICKET=\"65538,1,10.0.3.105:3389;winxpsp3.contoso3.com:3389,*,"
"rb+v0oPmEISmi8N2zK/vuhgul/ABqlDt6wW0VxMyxK8=,*,*,IuaRySSbPDNna4+2mKcsKxsbJFI=\""
"RCTICKETENCRYPTED=\"1\" "
"DtStart=\"1314905741\" "
"DtLength=\"180\" "
"PassStub=\"RT=0PvIndan52*\" "
"L=\"0\" />"
"</UPLOADINFO>";
WINPR_PRAGMA_DIAG_PUSH
WINPR_PRAGMA_DIAG_IGNORED_UNUSED_CONST_VAR
static const BYTE TEST_MSRC_INCIDENT_EXPERT_BLOB_TYPE1[32] =
"\x3C\x9C\xAE\x0B\xCE\x7A\xB1\x5C\x8A\xAC\x01\xD6\x76\x04\x5E\xDF"
"\x3F\xFA\xF0\x92\xE2\xDE\x36\x8A\x20\x17\xE6\x8A\x0D\xED\x7C\x90";
WINPR_PRAGMA_DIAG_POP
static const char TEST_MSRC_INCIDENT_PASSWORD_TYPE2[] = "48BJQ853X3B4";
static const BYTE TEST_MSRC_INCIDENT_PASSWORD_TYPE2_ENC[32] = {
0x77, 0x7d, 0xfa, 0xae, 0x90, 0x28, 0x12, 0x4d, 0xd0, 0x2e, 0xde, 0x80, 0x14, 0x22, 0x1b, 0x4a,
0xd1, 0xf4, 0xec, 0x13, 0x85, 0x39, 0xd7, 0x33, 0xac, 0x76, 0x78, 0x95, 0xb2, 0xd8, 0x57, 0xd9
};
static const char TEST_MSRC_INCIDENT_FILE_TYPE2[] =
"<?xml version=\"1.0\"?>"
"<UPLOADINFO TYPE=\"Escalated\">"
"<UPLOADDATA USERNAME=\"awake\" "
"LHTICKET=\""
"20FCC407AA53E95F8505AB56D485D26835064B03AF86CDA326248FD304626AD4"
"DBDBDFFE0C473228EFFF7A1E6CEB445BBEC429294BB6616BBB600854438DDFB5"
"82FC377CF65A2060EB3221647643C9B29BF5EC320856180B34D1BE9827A528C7"
"E8F0DCD53C8D38F974160FEE317458FAC9DBDBA7B972D21DF3BC5B1AF0E01878"
"65F07A3B915618C03E6EAF843FC1185770A1208C29C836DBCA5A040CB276D3C4"
"1DDE2FA8CA9627E5E74FA750A92C0E01AD6C3D1000A5B1479DEB899BF5BCD402"
"CE3BB3BF104CE0286C3F985AA711943C88C5EEEEE86F35B63F68883A90ADBCFD"
"CBBAE3EAB993EFD9148E1A21D092CE9498695943946236D65D20B4A38D724C61"
"72319E38E19C04E98EBC03F56A4A190E971F8EAEBFE6B415A3A2D8F35F7BF785"
"26B9BFAAB48D11BDD6C905EFE503D2265678E1EAD2F2F124E570667F04103180"
"2F63587276C14E6A5AB436CE234F722CE7C9B5D244508F14C012E84A49FE6992"
"3F30320ABB3641F1EFA66205F3EA709E7E1C3E6874BB9642486FB96D2730CDF4"
"514AA738167F00FC13B2978AED1D6678413FDF62008B03DD729E36173BE02742"
"B69CAD44938512D0F56335394759338AF6ADBCF39CE829116D97435085D05BB5"
"9320A134698050DCDBE01305A6B4712FD6BD48958BD2DC497498FF35CAECC9A8"
"2C97FD1A5B5EC4BAF5FFB75A1471B765C465B35A7C950019066BB219B391C6E9"
"8AE8FD2038E774F36F226D9FB9A38BCC313785612165D1EF69D19E2B9CF6E0F7"
"FE1ECCF00AB81F9E8B626363CA82FAC719A3B7D243325C9D6042B2488EC95B80"
"A31273FF9B72FBBB86F946E6D3DF8816BE4533F0B547C8BC028309EA9784C1E6\" "
"RCTICKET=\"65538,1,192.168.1.200:49230;169.254.6.170:49231,*,"
"+ULZ6ifjoCa6cGPMLQiGHRPwkg6VyJqGwxMnO6GcelwUh9a6/FBq3It5ADSndmLL,"
"*,*,BNRjdu97DyczQSRuMRrDWoue+HA=\" "
"PassStub=\"WB^6HsrIaFmEpi\" "
"RCTICKETENCRYPTED=\"1\" "
"DtStart=\"1403972263\" "
"DtLength=\"14400\" "
"L=\"0\"/>"
"</UPLOADINFO>";
/**
* Decrypted Connection String 2:
*
* <E>
* <A KH="BNRjdu97DyczQSRuMRrDWoue+HA="
* ID="+ULZ6ifjoCa6cGPMLQiGHRPwkg6VyJqGwxMnO6GcelwUh9a6/FBq3It5ADSndmLL"/> <C> <T ID="1" SID="0"> <L
* P="49228" N="fe80::1032:53d9:5a01:909b%3"/> <L P="49229" N="fe80::3d8f:9b2d:6b4e:6aa%6"/> <L
* P="49230" N="192.168.1.200"/> <L P="49231" N="169.254.6.170"/>
* </T>
* </C>
* </E>
*/
static const char connectionstr2[] =
"<E>\n"
"<A KH=\"YiKwWUY8Ioq5NB3wAQHSbs5kwrM=\"\n"
"KH2=\"sha256:wKSAkAV3sBfa9WpuRFJcP9q1twJc6wOBuoJ9tsyXwpk=\"\n"
"ID=\"8rYm30RBW8/4dAWoUsWbFCF5jno/7jr5tNpHQc2goLbw4uuBBJvLsU02YYLlBMg5\"/>\n"
"<C>\n"
"<T ID=\"1\" SID=\"1440550163\">\n"
"<L P=\"49749\" N=\"2001:4898:1a:5:79e2:3356:9b22:3470\"/>\n"
"<L P=\"49751\" N=\"172.31.250.64\"/>\n"
"</T>\n"
"</C>\n"
"</E>";
static const char* fail_tests[] = {
"<UPLOADINFOTYPE=\"Escalated\"><UPLOADDATARCTICKET=\"65538,1, ,*,,*,*,\"/></UPLOADINFO>",
"<UPLOADINFO>(E><UPLOADDATA "
"FOTYPE=\"Escalated\"æÁATAPassStub=\"␕:&A&amp;␅RCTICKET=\"65538,1,ü,*,n,*,*,\"am␡/>␂</"
"UPLOADINFO>"
};
static const char connectionstr3[] =
"<?xml version=\"1.0\"?>\n"
"<UPLOADINFO TYPE=\"Escalated\"><UPLOADDATA USERNAME=\"fx\" "
"LHTICKET="
"\"F9BBA098D84E1B20E37CD0983D9336B1FF4929925FCE5F3A1A9B9A596A524F2E169AD26D84255C7E8C0B88304A4C"
"40E0544624AD346A6828D6F2091C36C1315BD11255FE631F3A457F862FFD9948C496BC4B705B0AD2F26D0CDF7128E4"
"8625C8C501326B33888D42C591434F7ED4BBA0CEE02C8554921E49BCF130E1961F38FD0F0B7333001E639F89471940"
"93136CA5030EC4A92D05341488B79C40E11B28E1753F38682816EDF756CF5204943FD3F60DDD16416D220CA162B6FB"
"D43CC00C4F9D3F9FCF68ADAF191470B75EA4E8B37D03D2B9D3D844F54597D75FFF0A6216811518A3D06B26CA95F733"
"CCE8A46A4B1FF8F514971A1C06A8DC9D1DD0863087707045D3FCB74BB0444AF8B822FD6605DA68D8D628A7D8556212"
"D10F5BC4B1B7905E863F51346114FFED6A46D67314F3B933DF17F8A2E5EC6DAD2904349AC710E017652171A98C8621"
"4AF3801B1441E641CDA159BE76D8F2415129773283B5A4E0E7483580E6955B54B0E1432129612CFECD6770201F4206"
"1732E748B7F8A0C015EA8B36610962AC208C26373A483E830C7E01330492C9CBAB308A5E19272CC06F0F8008068816"
"78F8FB32667D876F6060C50D1A1251DDB9B339E2F846F48C0C7751BBDFF2138152B7A048AFECB31F6DE340E81EB8A4"
"EC7F8208B81E11E13033659B885686FEDF6881355679DCD96661201E5BC59D6C6EEFA1608B9E73E75F42D51A26E236"
"3690714D58A846B48E0AA2C753CA6347BAEA59CDCA5144527F3A69B560980BCC5DB77AC0FD1A68D19F802744D723D8"
"6595A48D1F72DAD0E3E61BA4D37E24EAAB9F49F21753CD481D6744036CA49DA0E432B961F48810FE90EB49DB0FB450"
"5FB316DCCAAC51E647B333EBA1C219A68F0A08BD65C9E4ED231D40EA15C2CEB80CB161495A0CADECAF2A00B5916AA9"
"91B78C7B17F26DA880DE25DFC09D9D823E174A8401CBC846D2A8B29B6B26EE92261C71C37E3C816540F77CB6DE916B"
"FCC7ED100949503251687B860E4A5F5B51CDADD11FF5CA408FA38E4A2AD6FA09D10E9B85523236D55132CD42936150"
"51913820DAE06877AC2954651049A157730A1AB67BD9A258CCB3A71909A8686F6F742FBC55312B041342C5475F808A"
"B04B629B99A1C69200740CDA5FE1602518B3117FB9835060BEF22EBAF20676662C9E0C3ED39C01E2F9A0822A2ADA07"
"D4718A93516AA04E4527C699A00FA8AFCAC7337F8D42949B3CB9F35A19BF5AC9BBF412C9E4AE82C593897BFF81240C"
"002486DF0F14845BB12A15966E95A9B6090C6512AF8B717F720F0CE452AA602106B65B98374CBCF9F6B5300FB077E5"
"554B489F6913E3857E352C94929A69C86EB13A67B872BB69980B9B3A1E05D6B9483C26A0D6D83CCD4C1AB6C21BA625"
"A5232C25BC1B7EB8B954B52D91B1BDF4277B2DCE039F4DBE2F18AE22533C2B877AB27B157ACE5DF21BC83E72104A31"
"C253704FDB2536308280D7172313F5D19D088E4C7F4F79C4786D6C65DEAB7FC16DE107AF8C61626502FA940497987F"
"60759878E40EDFAC98DED90BEA26E3020AA36A7307F2C9A9D5B19FAA34DF3633F643425F16A3615C996691EC705617"
"97CEB08463CBD0150F6B4C01BF1337E3B8B5E5355F62AD1AF949FCB3671327EA5AABC90081117E6CE11C6C42CF6E0E"
"DCB4C63EA9433D89F1030F65EDC82D45289C6367BF1E004D338CED13B7643C8708C42FF3671377A79DBFE3E4A39E19"
"F4759B84AA9CB03D64C2DBF5D2908DE64F5534AC07C11723F3A7602E307625F86B410BC7B54D85145B9F362E181860"
"AEF3574682CE4F3C57742870ED0B228CAC0E9183BD07BFF0435989263CA7EBF21B8CF25DBC2C7915FEB1000848A52F"
"94E7B34A416A826BFB1792E64F1CEA7FA3222131C53FA6DE38A786C99C355FE9C9D55B91D11B19087F1574CFF28C4D"
"AA9DE974A0939F0C13E9C408167ABAB90BD6BB25FA37B1588AAA3687AC86818543FEFD6E46D821D7F68BE1B0793585"
"4E7A81F6C9A0965159DAFF7B0E79C89A18DA3C52D6259EA711ED6B85CCC207AA35F62CB5D48299DAD003004702716E"
"65A96390033F8006FC7E7B1A09B9D1C6C17EC20811DE09EC19EB36844E45FCA18CF657A81E5922AB1B805721A5457E"
"01EB86334877FEDA378EDE6190491015158194ED1DEE3A99770DB8B9A87BC9FAE29A0AC17C4963DF07109B05AABA73"
"1A6AACDB8A02795CBDA935D51D0A7ABB35D8D1B6E598751E45BD507EC2778E285BEBAB2B50462FED1975B5A87F9751"
"25A6F272560E756CC941CF6D22FE72F7563CB2687E56F2FA2FC07FE01F3C8E6FCF7D4ECD60C1A53B98CA57AFB5BA18"
"97D4F530FCDEBDEB015D9CB1DE0BED20B7C3221283E292C252C742C23401B2E5A85EBD63E6916C3051FEAA1DC57975"
"410487AD7EE6CA0A346FE44F901E8BA81A7B398E94707E094081AE6391696EC42DD3F4B9189AB2A5311811481A48FB"
"0FAEFC1E9858547D15AA2F6FF01191F8EEC3564C59172605DA16C94F466156BE7A3E98E8C53BE50B671DEC5A3BD8A9"
"8C2A1B3FF47D27007AB17A4A1E155E094E3EA30FF531FBF6320F23BA57B3CAF8C470E176C93FACEE829C58B2399975"
"EBC4688B2F55132D102E83E45976C6607A57B90F43A33BCB68C03671E632B0E7C17B18406161AB46A8A0992DA7046A"
"08135E04142B68312BE3D0F7F5BBAE914E8DC5AAD04D992DA18FAB5B01EA34A0E27B253E92BEFE607578B1C79D4DAC"
"07DA6F92986F12AE036C227E4495662C46762E66EA3EC71C5C04BADD9DEDCAD725C16710825394179CFD17EDE482BA"
"11C421D0B4C806A2ED963831FAB4DE14FEAA904A3C5173AB9B86FCFF81E0F60DB45182A2471BC16DA992553EAE99DD"
"716E85DB11AC0F32BC960D6E8F6BE2250D59EDCAA69C19AF04E21362331225F94BD600EE76E1719417480AB6DC62DF"
"958DCCE951EBC64B4600DF3A826B9E702C536C0DF9E2952EDA7FAE6076C6F25CF41C0F7751768EC3C3293D727F8541"
"E997DA23E2D952D782B0472B3BFBC638CBDFDA43F367E3F6A7AAC9C8B07D51459432AEBB11564A669BF2EC1658B361"
"BE29B47F905352D13705E1E7F06B68A5F247B9FFA3B917CC54F7367386502A42F32CEE474F5E4D35CB5A44C3BA2192"
"A3F61DC334CE6D91E36D1C891E65A30C1E2B8F66A01B5DA8DDFB5CD051D61BD39B2E0516C6715F9AA7FE262BBD9BA4"
"CE8B785B42CA9582AD5EE24F8C11D2DA0DC6383506DE46C5187C03A930E5E507812A505884121C8A93C2569B269AE7"
"A26FDCF0BF7FA996250FFF790C3E97565B27C8DECFE5A15E2ED1A853FBF5D12207B8D3564CDD99549E508E92CB53DB"
"F6356F6EBF03E6A6672BFDE285A3DF84105F7C7E39577838C06B50D2ABB4F1C0377D45BE016ED022804F6BD9151BCD"
"883CE5FE8358798EE4EA3C24C67815D535CBCFA36094D7418EC104F90609C7AC008D07FDF89A6B3A0B5EC505E17DEC"
"57DA6256F4B2CC7DFF4E643FE89E4934440E2A360F035FA9C91F0F657A88AC9E7210A9ABAAAEA26D6B717EEAF231FB"
"79A0838B4BB85C11C9675F2BC746230F79A88137F911809C472750A5F6BB9415298C638FC3E24FA1763ACB513A4200"
"CB0BF550BC7DE0D2DC5D45AF18FF6073D96D2E4368A637B78257D087C9A471CC88E3368E810BFC29002D86C898F75D"
"3F6AE13648841038FDD1D3E8C4D2D5A4E1044614CAF544758A68F4947E3A3E736255CF01FE7A40A6FF136E7458F13D"
"759086A544FA14B47155511F784A2144E2B139EC5B5F3B0CAB52E511AAF84E00ABB4115644D42B0A7F91DA53F5C54D"
"744C583F5E838D402512A9644772E256CACCAA90ED300AE1616FDAA8309E5FB3FD92EB09F32216446CA2E737E8C136"
"C3E773FB986060A78D87CDF7CD92B187188CA7293998F0BC33C13A2FD8C7B0A76C2DAA662F0A71965E25930294D351"
"947DDE4800A237871F6BBFA77B7440339BFAE36035A84DA6AD87AA57FD52F7CDA342EB3D7B3E46F64592DFF327194C"
"D80C83272B5159BD97A9254089C90E1AFC7C30265BA814ED485550E4E4157FEDB14D9FB6D05AEE5983C81E799DF134"
"00766571BDBC8AC719AA2228C9DD592C102DE18A3F1C4B3501C6B29424B83B71D1740B1775967CFC984BC2D22C15\""
" PassStub=\"e4=3CiFuM6h2qH\" RCTICKETENCRYPTED=\"1\" DtStart=\"1704288424\" DtLength=\"360\" "
"L=\"0\"/>"
"</UPLOADINFO>";
static const char connectionpwd3[] = "4X638PTVZTKZ";
static const BYTE connectionpwd3_enc[32] = { 0x15, 0x20, 0x04, 0x96, 0xaf, 0x33, 0xc6, 0xe0,
0x1b, 0xbf, 0x4a, 0x15, 0xc9, 0xc1, 0xb8, 0x71,
0x44, 0x3f, 0x2e, 0x93, 0xa8, 0x82, 0x35, 0x2b,
0x24, 0x08, 0x06, 0x55, 0x16, 0x4e, 0x9d, 0x3b };
static BOOL run_test_parse(wLog* log, const char* input, size_t len, const char* password,
BOOL expect)
{
rdpAssistanceFile* file = freerdp_assistance_file_new();
if (!file)
return FALSE;
const int status = freerdp_assistance_parse_file_buffer(file, input, len, password);
const BOOL success = status >= 0;
freerdp_assistance_print_file(file, log, WLOG_INFO);
freerdp_assistance_file_free(file);
return success == expect;
}
static BOOL test_file_to_settings(wLog* log, rdpAssistanceFile* file)
{
rdpSettings* settings = freerdp_settings_new(0);
if (!settings)
return FALSE;
const BOOL rc = freerdp_assistance_populate_settings_from_assistance_file(file, settings);
freerdp_settings_free(settings);
return rc;
}
static BOOL test_file_from_buffer(wLog* log, const char* data, size_t size, const char* pwd,
const BYTE* enc, size_t encsize)
{
BOOL rc = FALSE;
int status = 0;
char* pass = nullptr;
char* expertBlob = nullptr;
const char* EncryptedPassStub = nullptr;
size_t EncryptedPassStubLength = 0;
rdpAssistanceFile* file = freerdp_assistance_file_new();
if (!file)
return FALSE;
status = freerdp_assistance_parse_file_buffer(file, data, size, pwd);
WLog_Print(log, WLOG_INFO, "freerdp_assistance_parse_file_buffer: %d", status);
if (status < 0)
goto fail;
freerdp_assistance_print_file(file, WLog_Get("foo"), WLOG_INFO);
if (!freerdp_assistance_get_encrypted_pass_stub(file, &EncryptedPassStub,
&EncryptedPassStubLength))
goto fail;
if (EncryptedPassStubLength > 0)
{
pass = freerdp_assistance_bin_to_hex_string(EncryptedPassStub, EncryptedPassStubLength);
if (!pass)
goto fail;
WLog_Print(log, WLOG_INFO, "freerdp_assistance_decrypt: %d %s [%" PRIdz "]", status, pass,
EncryptedPassStubLength);
expertBlob = freerdp_assistance_construct_expert_blob("Edgar Olougouna", pass);
WLog_Print(log, WLOG_INFO, "expertBlob='%s'", expertBlob);
}
if (encsize != EncryptedPassStubLength)
goto fail;
if (encsize > 0)
{
if (memcmp(EncryptedPassStub, enc, encsize) != 0)
goto fail;
}
rc = test_file_to_settings(log, file);
fail:
freerdp_assistance_file_free(file);
free(pass);
free(expertBlob);
return rc;
}
static BOOL test_msrsc_incident_file_type1(wLog* log)
{
return test_file_from_buffer(
log, TEST_MSRC_INCIDENT_FILE_TYPE1, sizeof(TEST_MSRC_INCIDENT_FILE_TYPE1),
TEST_MSRC_INCIDENT_PASSWORD_TYPE1, TEST_MSRC_INCIDENT_PASSWORD_TYPE1_ENC,
sizeof(TEST_MSRC_INCIDENT_PASSWORD_TYPE1_ENC));
}
static BOOL test_msrsc_incident_file_type2(wLog* log)
{
if (!test_file_from_buffer(log, connectionstr2, sizeof(connectionstr2),
TEST_MSRC_INCIDENT_PASSWORD_TYPE2, nullptr, 0))
return FALSE;
if (!test_file_from_buffer(log, connectionstr3, sizeof(connectionstr3), connectionpwd3,
connectionpwd3_enc, sizeof(connectionpwd3_enc)))
return FALSE;
if (!test_file_from_buffer(
log, TEST_MSRC_INCIDENT_FILE_TYPE2, sizeof(TEST_MSRC_INCIDENT_FILE_TYPE2),
TEST_MSRC_INCIDENT_PASSWORD_TYPE2, TEST_MSRC_INCIDENT_PASSWORD_TYPE2_ENC,
sizeof(TEST_MSRC_INCIDENT_PASSWORD_TYPE2_ENC)))
return FALSE;
return TRUE;
}
int TestCommonAssistance(int argc, char* argv[])
{
wLog* log = nullptr;
WINPR_UNUSED(argc);
WINPR_UNUSED(argv);
log = WLog_Get(__func__);
winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT);
for (size_t x = 0; x < ARRAYSIZE(fail_tests); x++)
{
const char* test = fail_tests[x];
const size_t len = strlen(test);
if (!run_test_parse(log, test, len + 1, nullptr, FALSE))
return -1;
}
if (!test_msrsc_incident_file_type1(log))
{
WLog_Print(log, WLOG_ERROR, "test_msrsc_incident_file_type1 failed");
return -1;
}
if (!test_msrsc_incident_file_type2(log))
{
WLog_Print(log, WLOG_ERROR, "test_msrsc_incident_file_type2 failed");
return -1;
}
return 0;
}

View File

@@ -0,0 +1,8 @@
#include <freerdp/assistance.h>
int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size)
{
char* pass = freerdp_assistance_bin_to_hex_string((void*)Data, Size);
free(pass);
return 0;
}

View File

@@ -0,0 +1,16 @@
#include <freerdp/assistance.h>
int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size)
{
char* buf = calloc(Size + 1, sizeof(char));
if (buf == nullptr)
return 0;
memcpy(buf, Data, Size);
buf[Size] = '\0';
BYTE* pass = freerdp_assistance_hex_string_to_bin((void*)buf, &Size);
free(pass);
free(buf);
return 0;
}

View File

@@ -0,0 +1,31 @@
#include <freerdp/assistance.h>
static int parse_file_buffer(const uint8_t* Data, size_t Size)
{
static const char TEST_MSRC_INCIDENT_PASSWORD_TYPE2[] = "48BJQ853X3B4";
int status = -1;
rdpAssistanceFile* file = freerdp_assistance_file_new();
if (!file)
return -1;
char* buf = calloc(Size + 1, sizeof(char));
if (buf == nullptr)
goto err;
memcpy(buf, Data, Size);
buf[Size] = '\0';
status = freerdp_assistance_parse_file_buffer(file, buf, Size + 1,
TEST_MSRC_INCIDENT_PASSWORD_TYPE2);
err:
freerdp_assistance_file_free(file);
free(buf);
return status >= 0 ? TRUE : FALSE;
}
int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size)
{
parse_file_buffer(Data, Size);
return 0;
}