22 #include <freerdp/config.h>
26 #include <freerdp/crypto/certificate.h>
30 #include <winpr/crt.h>
31 #include <winpr/file.h>
32 #include <winpr/path.h>
33 #include <winpr/sysinfo.h>
34 #include <winpr/registry.h>
35 #include <winpr/wtsapi.h>
37 #include <freerdp/settings.h>
38 #include <freerdp/build-config.h>
40 #include "../crypto/certificate.h"
41 #include "../crypto/privatekey.h"
42 #include "capabilities.h"
44 #define TAG FREERDP_TAG("settings")
48 #pragma warning(disable : 4244)
51 static const char client_dll[] =
"C:\\Windows\\System32\\mstscax.dll";
53 #define SERVER_KEY "Software\\" FREERDP_VENDOR_STRING "\\" FREERDP_PRODUCT_STRING "\\Server"
54 #define CLIENT_KEY "Software\\" FREERDP_VENDOR_STRING "\\" FREERDP_PRODUCT_STRING "\\Client"
55 #define BITMAP_CACHE_KEY CLIENT_KEY "\\BitmapCacheV2"
56 #define GLYPH_CACHE_KEY CLIENT_KEY "\\GlyphCache"
57 #define POINTER_CACHE_KEY CLIENT_KEY "\\PointerCache"
59 static BOOL settings_reg_query_dword_val(HKEY hKey,
const TCHAR* sub, DWORD* value)
64 dwSize =
sizeof(DWORD);
65 if (RegQueryValueEx(hKey, sub, NULL, &dwType, (BYTE*)value, &dwSize) != ERROR_SUCCESS)
67 if (dwType != REG_DWORD)
73 static BOOL settings_reg_query_word_val(HKEY hKey,
const TCHAR* sub, UINT16* value)
77 if (!settings_reg_query_dword_val(hKey, sub, &dwValue))
80 if (dwValue > UINT16_MAX)
83 *value = (UINT16)dwValue;
87 static BOOL settings_reg_query_bool_val(HKEY hKey,
const TCHAR* sub, BOOL* value)
91 if (!settings_reg_query_dword_val(hKey, sub, &dwValue))
93 *value = dwValue != 0;
97 static BOOL settings_reg_query_dword(rdpSettings* settings, FreeRDP_Settings_Keys_UInt32
id,
98 HKEY hKey,
const TCHAR* sub)
102 if (!settings_reg_query_dword_val(hKey, sub, &dwValue))
108 static BOOL settings_reg_query_bool(rdpSettings* settings, FreeRDP_Settings_Keys_Bool
id, HKEY hKey,
113 if (!settings_reg_query_dword_val(hKey, sub, &dwValue))
119 static void settings_client_load_hkey_local_machine(rdpSettings* settings)
123 status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, CLIENT_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
125 if (status == ERROR_SUCCESS)
127 settings_reg_query_dword(settings, FreeRDP_DesktopWidth, hKey, _T(
"DesktopWidth"));
128 settings_reg_query_dword(settings, FreeRDP_DesktopHeight, hKey, _T(
"DesktopHeight"));
129 settings_reg_query_bool(settings, FreeRDP_Fullscreen, hKey, _T(
"Fullscreen"));
130 settings_reg_query_dword(settings, FreeRDP_ColorDepth, hKey, _T(
"ColorDepth"));
131 settings_reg_query_dword(settings, FreeRDP_KeyboardType, hKey, _T(
"KeyboardType"));
132 settings_reg_query_dword(settings, FreeRDP_KeyboardSubType, hKey, _T(
"KeyboardSubType"));
133 settings_reg_query_dword(settings, FreeRDP_KeyboardFunctionKey, hKey,
134 _T(
"KeyboardFunctionKeys"));
135 settings_reg_query_dword(settings, FreeRDP_KeyboardLayout, hKey, _T(
"KeyboardLayout"));
136 settings_reg_query_bool(settings, FreeRDP_ExtSecurity, hKey, _T(
"ExtSecurity"));
137 settings_reg_query_bool(settings, FreeRDP_NlaSecurity, hKey, _T(
"NlaSecurity"));
138 settings_reg_query_bool(settings, FreeRDP_TlsSecurity, hKey, _T(
"TlsSecurity"));
139 settings_reg_query_bool(settings, FreeRDP_RdpSecurity, hKey, _T(
"RdpSecurity"));
140 settings_reg_query_bool(settings, FreeRDP_MstscCookieMode, hKey, _T(
"MstscCookieMode"));
141 settings_reg_query_dword(settings, FreeRDP_CookieMaxLength, hKey, _T(
"CookieMaxLength"));
142 settings_reg_query_bool(settings, FreeRDP_BitmapCacheEnabled, hKey, _T(
"BitmapCache"));
143 settings_reg_query_dword(settings, FreeRDP_OffscreenSupportLevel, hKey,
144 _T(
"OffscreenBitmapCache"));
145 settings_reg_query_dword(settings, FreeRDP_OffscreenCacheSize, hKey,
146 _T(
"OffscreenBitmapCacheSize"));
147 settings_reg_query_dword(settings, FreeRDP_OffscreenCacheEntries, hKey,
148 _T(
"OffscreenBitmapCacheEntries"));
153 RegOpenKeyExA(HKEY_LOCAL_MACHINE, BITMAP_CACHE_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
155 if (status == ERROR_SUCCESS)
157 settings_reg_query_dword(settings, FreeRDP_BitmapCacheV2NumCells, hKey, _T(
"NumCells"));
158 for (
unsigned x = 0; x < 5; x++)
161 TCHAR numentries[64] = { 0 };
162 TCHAR persist[64] = { 0 };
164 (void)_sntprintf(numentries, ARRAYSIZE(numentries), _T(
"Cell%uNumEntries"), x);
165 (void)_sntprintf(persist, ARRAYSIZE(persist), _T(
"Cell%uPersistent"), x);
166 if (!settings_reg_query_dword_val(hKey, numentries, &val) ||
167 !settings_reg_query_bool_val(hKey, persist, &cache.persistent) ||
168 !freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, x,
170 WLog_WARN(TAG,
"Failed to load registry keys to settings!");
171 cache.numEntries = val;
174 settings_reg_query_bool(settings, FreeRDP_AllowCacheWaitingList, hKey,
175 _T(
"AllowCacheWaitingList"));
180 RegOpenKeyExA(HKEY_LOCAL_MACHINE, GLYPH_CACHE_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
182 if (status == ERROR_SUCCESS)
185 UINT32 GlyphSupportLevel = 0;
186 settings_reg_query_dword(settings, FreeRDP_GlyphSupportLevel, hKey, _T(
"SupportLevel"));
190 TCHAR numentries[64] = { 0 };
191 TCHAR maxsize[64] = { 0 };
192 (void)_sntprintf(numentries, ARRAYSIZE(numentries), _T(
"Cache%uNumEntries"), x);
193 (void)_sntprintf(maxsize, ARRAYSIZE(maxsize), _T(
"Cache%uMaxCellSize"), x);
195 settings_reg_query_word_val(hKey, numentries, &cache.cacheEntries);
196 settings_reg_query_word_val(hKey, maxsize, &cache.cacheMaximumCellSize);
197 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_GlyphCache, x, &cache))
198 WLog_WARN(TAG,
"Failed to store GlyphCache %" PRIuz, x);
202 settings_reg_query_word_val(hKey, _T(
"FragCacheNumEntries"), &cache.cacheEntries);
203 settings_reg_query_word_val(hKey, _T(
"FragCacheMaxCellSize"),
204 &cache.cacheMaximumCellSize);
205 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_FragCache, x, &cache))
206 WLog_WARN(TAG,
"Failed to store FragCache");
212 WLog_WARN(TAG,
"Failed to load registry keys to settings!");
216 RegOpenKeyExA(HKEY_LOCAL_MACHINE, POINTER_CACHE_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
218 if (status == ERROR_SUCCESS)
220 settings_reg_query_dword(settings, FreeRDP_LargePointerFlag, hKey, _T(
"LargePointer"));
221 settings_reg_query_dword(settings, FreeRDP_PointerCacheSize, hKey, _T(
"PointerCacheSize"));
222 settings_reg_query_dword(settings, FreeRDP_ColorPointerCacheSize, hKey,
223 _T(
"ColorPointerCacheSize"));
228 static void settings_server_load_hkey_local_machine(rdpSettings* settings)
233 status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, SERVER_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
235 if (status != ERROR_SUCCESS)
238 settings_reg_query_bool(settings, FreeRDP_ExtSecurity, hKey, _T(
"ExtSecurity"));
239 settings_reg_query_bool(settings, FreeRDP_NlaSecurity, hKey, _T(
"NlaSecurity"));
240 settings_reg_query_bool(settings, FreeRDP_TlsSecurity, hKey, _T(
"TlsSecurity"));
241 settings_reg_query_dword(settings, FreeRDP_TlsSecLevel, hKey, _T(
"TlsSecLevel"));
242 settings_reg_query_bool(settings, FreeRDP_RdpSecurity, hKey, _T(
"RdpSecurity"));
247 static void settings_load_hkey_local_machine(rdpSettings* settings)
250 settings_server_load_hkey_local_machine(settings);
252 settings_client_load_hkey_local_machine(settings);
255 static BOOL settings_get_computer_name(rdpSettings* settings)
257 CHAR computerName[256] = { 0 };
258 DWORD nSize =
sizeof(computerName);
260 if (!GetComputerNameExA(ComputerNameNetBIOS, computerName, &nSize))
263 if (nSize > MAX_COMPUTERNAME_LENGTH)
264 computerName[MAX_COMPUTERNAME_LENGTH] =
'\0';
269 void freerdp_settings_print_warnings(
const rdpSettings* settings)
272 if (level != GLYPH_SUPPORT_NONE)
274 char buffer[32] = { 0 };
275 WLog_WARN(TAG,
"[experimental] enabled GlyphSupportLevel %s, expect visual artefacts!",
276 freerdp_settings_glyph_level_string(level, buffer,
sizeof(buffer)));
280 BOOL freerdp_settings_set_default_order_support(rdpSettings* settings)
286 ZeroMemory(OrderSupport, 32);
287 OrderSupport[NEG_DSTBLT_INDEX] = TRUE;
288 OrderSupport[NEG_PATBLT_INDEX] = TRUE;
289 OrderSupport[NEG_SCRBLT_INDEX] = TRUE;
290 OrderSupport[NEG_OPAQUE_RECT_INDEX] = TRUE;
291 OrderSupport[NEG_DRAWNINEGRID_INDEX] = FALSE;
292 OrderSupport[NEG_MULTIDSTBLT_INDEX] = FALSE;
293 OrderSupport[NEG_MULTIPATBLT_INDEX] = FALSE;
294 OrderSupport[NEG_MULTISCRBLT_INDEX] = FALSE;
295 OrderSupport[NEG_MULTIOPAQUERECT_INDEX] = TRUE;
296 OrderSupport[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE;
297 OrderSupport[NEG_LINETO_INDEX] = TRUE;
298 OrderSupport[NEG_POLYLINE_INDEX] = TRUE;
299 OrderSupport[NEG_MEMBLT_INDEX] =
301 OrderSupport[NEG_MEM3BLT_INDEX] =
303 OrderSupport[NEG_MEMBLT_V2_INDEX] =
305 OrderSupport[NEG_MEM3BLT_V2_INDEX] =
307 OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE;
308 OrderSupport[NEG_GLYPH_INDEX_INDEX] =
310 OrderSupport[NEG_FAST_INDEX_INDEX] =
312 OrderSupport[NEG_FAST_GLYPH_INDEX] =
314 OrderSupport[NEG_POLYGON_SC_INDEX] = FALSE;
315 OrderSupport[NEG_POLYGON_CB_INDEX] = FALSE;
316 OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE;
317 OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE;
321 BOOL freerdp_capability_buffer_allocate(rdpSettings* settings, UINT32 count)
323 WINPR_ASSERT(settings);
324 WINPR_ASSERT(count > 0);
325 WINPR_ASSERT(count == 32);
327 freerdp_capability_buffer_free(settings);
328 WINPR_ASSERT(settings->ReceivedCapabilitiesSize == 0);
330 settings->ReceivedCapabilitiesSize = count;
331 void* tmp = realloc(settings->ReceivedCapabilities, count *
sizeof(BYTE));
334 memset(tmp, 0, count *
sizeof(BYTE));
335 settings->ReceivedCapabilities = tmp;
337 tmp = realloc(settings->ReceivedCapabilityData, count *
sizeof(BYTE*));
340 memset(tmp, 0, count *
sizeof(BYTE*));
341 settings->ReceivedCapabilityData = tmp;
343 tmp = realloc(settings->ReceivedCapabilityDataSizes, count *
sizeof(UINT32));
346 memset(tmp, 0, count *
sizeof(UINT32));
347 settings->ReceivedCapabilityDataSizes = tmp;
349 return (settings->ReceivedCapabilities && settings->ReceivedCapabilityData &&
350 settings->ReceivedCapabilityDataSizes);
353 #if !defined(WITH_FULL_CONFIG_PATH)
354 static char* freerdp_settings_get_legacy_config_path(
void)
356 char product[
sizeof(FREERDP_PRODUCT_STRING)] = { 0 };
358 for (
size_t i = 0; i <
sizeof(product); i++)
359 product[i] = tolower(FREERDP_PRODUCT_STRING[i]);
361 return GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, product);
371 #if !defined(WITH_FULL_CONFIG_PATH)
372 if (_stricmp(FREERDP_VENDOR_STRING, FREERDP_PRODUCT_STRING) == 0)
373 return freerdp_settings_get_legacy_config_path();
376 char* base = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, FREERDP_VENDOR_STRING);
378 path = GetCombinedPath(base, FREERDP_PRODUCT_STRING);
386 char* issuers[] = {
"FreeRDP",
"FreeRDP-licenser" };
388 const BOOL remote = (flags & FREERDP_SETTINGS_REMOTE_MODE) != 0 ? TRUE : FALSE;
389 rdpSettings* settings = (rdpSettings*)calloc(1,
sizeof(rdpSettings));
395 SURFCMDS_SET_SURFACE_BITS | SURFCMDS_STREAM_SURFACE_BITS |
396 SURFCMDS_FRAME_MARKER))
403 TS_CAPS_PROTOCOLVERSION))
407 CLIPRDR_FLAG_DEFAULT_MASK))
412 "FreeRDP-licensing-server"))
416 if (!freerdp_server_license_issuers_copy(settings, issuers, ARRAYSIZE(issuers)))
420 RNS_UD_32BPP_SUPPORT | RNS_UD_24BPP_SUPPORT |
421 RNS_UD_16BPP_SUPPORT | RNS_UD_15BPP_SUPPORT))
431 settings, FreeRDP_RemoteApplicationSupportMask,
432 RAIL_LEVEL_SUPPORTED | RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED |
433 RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED | RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED |
434 RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED |
435 RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED | RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED |
436 RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED) ||
439 NEGOTIATE_ORDER_SUPPORT | ZERO_BOUNDS_DELTA_SUPPORT |
440 COLOR_INDEX_SUPPORT) ||
463 DEFAULT_COOKIE_MAX_LENGTH) ||
471 KEYBOARD_HOOK_FULLSCREEN_ONLY) ||
490 CONNECTION_TYPE_AUTODETECT) ||
532 TRANSPORT_TYPE_UDP_FECR))
537 if (!settings_get_computer_name(settings))
543 if (!freerdp_capability_buffer_allocate(settings, 32))
547 char tmp[32] = { 0 };
553 char ClientHostname[33] = { 0 };
554 DWORD size =
sizeof(ClientHostname) - 2;
555 GetComputerNameA(ClientHostname, &size);
584 (LARGE_POINTER_FLAG_96x96 | LARGE_POINTER_FLAG_384x384)) ||
595 settings->BitmapCacheV2CellInfo =
598 if (!settings->BitmapCacheV2CellInfo)
603 cache.numEntries = 600;
604 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 0,
606 !freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 1, &cache))
608 cache.numEntries = 2048;
609 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 2,
611 !freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 4, &cache))
613 cache.numEntries = 4096;
614 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 3, &cache))
624 if (!settings->GlyphCache)
629 if (!settings->FragCache)
632 for (
size_t x = 0; x < 10; x++)
635 cache.cacheEntries = 254;
640 cache.cacheMaximumCellSize = 4;
644 cache.cacheMaximumCellSize = 8;
647 cache.cacheMaximumCellSize = 16;
650 cache.cacheMaximumCellSize = 32;
653 cache.cacheMaximumCellSize = 64;
656 cache.cacheMaximumCellSize = 128;
659 cache.cacheMaximumCellSize = 256;
662 cache.cacheMaximumCellSize = 256;
666 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_GlyphCache, x, &cache))
671 cache.cacheEntries = 256;
672 cache.cacheMaximumCellSize = 256;
673 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_FragCache, 0, &cache))
684 WINDOW_LEVEL_SUPPORTED | WINDOW_LEVEL_SUPPORTED_EX) ||
688 (server && !remote) ? CHANNEL_CHUNK_MAX_LENGTH
689 : CHANNEL_CHUNK_LENGTH) ||
693 server ? 0 : 608299) ||
736 if (!settings->ClientTimeZone)
739 if (!settings->ServerMode)
746 GetTimeZoneInformation(tz);
747 GetDynamicTimeZoneInformation(&dynamic);
750 dynamic.TimeZoneKeyName,
751 ARRAYSIZE(dynamic.TimeZoneKeyName)))
755 dynamic.DynamicDaylightTimeDisabled))
774 path = GetKnownPath(KNOWN_PATH_HOME);
785 char* action = GetCombinedPath(config,
"action.sh");
795 settings_load_hkey_local_machine(settings);
801 settings->OrderSupport = calloc(1, 32);
808 if (!settings->OrderSupport)
811 if (!freerdp_settings_set_default_order_support(settings))
817 const FreeRDP_Settings_Keys_Bool keys[] = { FreeRDP_SupportGraphicsPipeline,
818 FreeRDP_SupportStatusInfoPdu,
819 FreeRDP_SupportErrorInfoPdu,
820 FreeRDP_SupportAsymetricKeys };
822 for (
size_t x = 0; x < ARRAYSIZE(keys); x++)
840 static void freerdp_settings_free_internal(rdpSettings* settings)
842 freerdp_server_license_issuers_free(settings);
843 freerdp_target_net_addresses_free(settings);
844 freerdp_device_collection_free(settings);
845 freerdp_static_channel_collection_free(settings);
846 freerdp_dynamic_channel_collection_free(settings);
848 freerdp_capability_buffer_free(settings);
851 freerdp_settings_free_keys(settings, TRUE);
859 freerdp_settings_free_internal(settings);
863 static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings,
const rdpSettings* settings)
867 if (!_settings || !settings)
888 if (!freerdp_server_license_issuers_copy(_settings, settings->ServerLicenseProductIssuers,
889 settings->ServerLicenseProductIssuersCount))
898 if (settings->RdpServerCertificate)
900 rdpCertificate* cert = freerdp_certificate_clone(settings->RdpServerCertificate);
912 if (settings->RdpServerRsaKey)
914 rdpPrivateKey* key = freerdp_key_clone(settings->RdpServerRsaKey);
930 _settings, FreeRDP_ChannelDefArraySize,
957 _settings->OrderSupport = malloc(32);
959 if (!_settings->OrderSupport)
962 if (!freerdp_capability_buffer_copy(_settings, settings))
964 CopyMemory(_settings->OrderSupport, settings->OrderSupport, 32);
966 const UINT32 cellInfoSize =
974 const UINT32 glyphCacheCount = 10;
981 const UINT32 fragCacheCount = 1;
988 _settings, FreeRDP_ClientAutoReconnectCookie,
992 _settings, FreeRDP_ServerAutoReconnectCookie,
1002 _settings, FreeRDP_RedirectionPasswordLength,
1005 const UINT32 redirectionPasswordLength =
1009 redirectionPasswordLength))
1012 const UINT32 RedirectionTsvUrlLength =
1014 const BYTE* RedirectionTsvUrl =
1017 RedirectionTsvUrlLength))
1021 if (!freerdp_target_net_adresses_reset(_settings, nrports))
1024 for (UINT32 i = 0; i < nrports; i++)
1026 const char* address =
1027 freerdp_settings_get_pointer_array(settings, FreeRDP_TargetNetAddresses, i);
1028 const UINT32* port =
1029 freerdp_settings_get_pointer_array(settings, FreeRDP_TargetNetPorts, i);
1030 if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_TargetNetAddresses, i, address))
1032 if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_TargetNetPorts, i, port))
1047 for (
size_t index = 0; index < count; index++)
1050 freerdp_settings_get_pointer_array(settings, FreeRDP_DeviceArray, index);
1051 if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_DeviceArray, index, argv))
1066 for (
size_t index = 0; index < count; index++)
1069 freerdp_settings_get_pointer_array(settings, FreeRDP_StaticChannelArray, index);
1070 if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_StaticChannelArray, index,
1086 for (
size_t index = 0; index < count; index++)
1089 freerdp_settings_get_pointer_array(settings, FreeRDP_DynamicChannelArray, index);
1090 if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_DynamicChannelArray, index,
1107 if (!settings || !_settings)
1111 freerdp_settings_free_internal(_settings);
1114 rc = freerdp_settings_clone_keys(_settings, settings);
1116 _settings->LoadBalanceInfo = NULL;
1117 _settings->ServerRandom = NULL;
1118 _settings->ClientRandom = NULL;
1119 _settings->ServerCertificate = NULL;
1120 _settings->RdpServerCertificate = NULL;
1121 _settings->RdpServerRsaKey = NULL;
1122 _settings->ChannelDefArray = NULL;
1123 _settings->MonitorDefArray = NULL;
1124 _settings->MonitorIds = NULL;
1125 _settings->OrderSupport = NULL;
1126 _settings->BitmapCacheV2CellInfo = NULL;
1127 _settings->GlyphCache = NULL;
1128 _settings->FragCache = NULL;
1129 _settings->ClientAutoReconnectCookie = NULL;
1130 _settings->ServerAutoReconnectCookie = NULL;
1131 _settings->ClientTimeZone = NULL;
1132 _settings->RedirectionPassword = NULL;
1133 _settings->RedirectionTsvUrl = NULL;
1134 _settings->TargetNetAddresses = NULL;
1135 _settings->TargetNetPorts = NULL;
1136 _settings->DeviceArray = NULL;
1137 _settings->StaticChannelArray = NULL;
1138 _settings->DynamicChannelArray = NULL;
1139 _settings->ReceivedCapabilities = NULL;
1140 _settings->ReceivedCapabilityData = NULL;
1141 _settings->ReceivedCapabilityDataSizes = NULL;
1143 _settings->ServerLicenseProductIssuersCount = 0;
1144 _settings->ServerLicenseProductIssuers = NULL;
1150 if (!freerdp_settings_int_buffer_copy(_settings, settings))
1154 freerdp_settings_free_internal(_settings);
1160 rdpSettings* _settings = (rdpSettings*)calloc(1,
sizeof(rdpSettings));
1171 #pragma warning(pop)
1174 static void zfree(WCHAR* str,
size_t len)
1177 memset(str, 0, len *
sizeof(WCHAR));
1181 BOOL identity_set_from_settings_with_pwd(SEC_WINNT_AUTH_IDENTITY* identity,
1182 const rdpSettings* settings,
1183 FreeRDP_Settings_Keys_String UserId,
1184 FreeRDP_Settings_Keys_String DomainId,
1185 const WCHAR* Password,
size_t pwdLen)
1187 WINPR_ASSERT(identity);
1188 WINPR_ASSERT(settings);
1191 size_t DomainLen = 0;
1196 const int rc = sspi_SetAuthIdentityWithLengthW(identity, Username, UserLen, Domain, DomainLen,
1198 zfree(Username, UserLen);
1199 zfree(Domain, DomainLen);
1206 FreeRDP_Settings_Keys_String UserId,
1207 FreeRDP_Settings_Keys_String DomainId,
1208 FreeRDP_Settings_Keys_String PwdId)
1210 WINPR_ASSERT(identity);
1211 WINPR_ASSERT(settings);
1218 identity_set_from_settings_with_pwd(identity, settings, UserId, DomainId, Password, PwdLen);
1219 zfree(Password, PwdLen);
1224 const rdpSettings* settings,
1225 FreeRDP_Settings_Keys_String userId,
1226 FreeRDP_Settings_Keys_String domainId,
1227 FreeRDP_Settings_Keys_String pwdId,
const BYTE* certSha1,
1232 LPWSTR marshalledCredentials = NULL;
1234 memcpy(certInfo.rgbHashOfCert, certSha1, MIN(sha1len,
sizeof(certInfo.rgbHashOfCert)));
1236 if (!CredMarshalCredentialW(CertCredential, &certInfo, &marshalledCredentials))
1238 WLog_ERR(TAG,
"error marshalling cert credentials");
1244 const int rc = sspi_SetAuthIdentityWithLengthW(
1245 identity, marshalledCredentials, _wcslen(marshalledCredentials), NULL, 0, Password, pwdLen);
1246 zfree(Password, pwdLen);
1247 CredFree(marshalledCredentials);
1252 if (!identity_set_from_settings(identity, settings, userId, domainId, pwdId))
1258 const char* freerdp_settings_glyph_level_string(UINT32 level,
char* buffer,
size_t size)
1260 const char* str =
"GLYPH_SUPPORT_UNKNOWN";
1263 case GLYPH_SUPPORT_NONE:
1264 str =
"GLYPH_SUPPORT_NONE";
1266 case GLYPH_SUPPORT_PARTIAL:
1267 str =
"GLYPH_SUPPORT_PARTIAL";
1269 case GLYPH_SUPPORT_FULL:
1270 str =
"GLYPH_SUPPORT_FULL";
1272 case GLYPH_SUPPORT_ENCODE:
1273 str =
"GLYPH_SUPPORT_ENCODE";
1279 (void)_snprintf(buffer, size,
"%s[0x%08" PRIx32
"]", str, level);
1283 BOOL freerdp_target_net_adresses_reset(rdpSettings* settings,
size_t size)
1285 freerdp_target_net_addresses_free(settings);
1289 if (!freerdp_settings_set_pointer_len_(settings, FreeRDP_TargetNetPorts, -1, NULL, size,
1292 if (!freerdp_settings_set_pointer_len_(settings, FreeRDP_TargetNetAddresses,
1293 FreeRDP_TargetNetAddressCount, NULL, size,
FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
FREERDP_API BOOL freerdp_settings_set_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *param)
Sets a string settings value. The param is copied.
FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.
FREERDP_API const void * freerdp_settings_get_pointer(const rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a immutable pointer settings value.
FREERDP_API BOOL freerdp_settings_set_string_from_utf16N(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const WCHAR *param, size_t length)
Sets a string settings value. The param is converted to UTF-8 and the copy stored.
rdpSettings * freerdp_settings_new(DWORD flags)
creates a new setting struct
FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
FREERDP_API BOOL freerdp_settings_set_pointer_len(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *data, size_t len)
Set a pointer to value data.
char * freerdp_settings_get_config_path(void)
return the configuration directory for the library
void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.
#define FREERDP_SETTINGS_SERVER_MODE
BOOL freerdp_settings_copy(rdpSettings *_settings, const rdpSettings *settings)
Deep copies settings from src to dst.
rdpSettings * freerdp_settings_clone(const rdpSettings *settings)
Creates a deep copy of settings.
FREERDP_API WCHAR * freerdp_settings_get_string_as_utf16(const rdpSettings *settings, FreeRDP_Settings_Keys_String id, size_t *pCharLen)
Return an allocated UTF16 string.
FREERDP_API BOOL freerdp_settings_set_string_len(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *param, size_t len)
Sets a string settings value. The param is copied.
FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 param)
Sets a UINT32 settings value.
FREERDP_API BOOL freerdp_settings_set_uint16(rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id, UINT16 param)
Sets a UINT16 settings value.
FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL param)
Sets a BOOL settings value.
FREERDP_API void * freerdp_settings_get_pointer_writable(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a mutable pointer settings value.