Coverage Report

Created: 2024-09-08 06:20

/src/FreeRDP/libfreerdp/core/settings.c
Line
Count
Source (jump to first uncovered line)
1
/**
2
 * FreeRDP: A Remote Desktop Protocol Implementation
3
 * RDP Settings
4
 *
5
 * Copyright 2009-2011 Jay Sorg
6
 * Copyright 2023 Armin Novak <anovak@thincast.com>
7
 * Copyright 2023 Thincast Technologies GmbH
8
 *
9
 * Licensed under the Apache License, Version 2.0 (the "License");
10
 * you may not use this file except in compliance with the License.
11
 * You may obtain a copy of the License at
12
 *
13
 *     http://www.apache.org/licenses/LICENSE-2.0
14
 *
15
 * Unless required by applicable law or agreed to in writing, software
16
 * distributed under the License is distributed on an "AS IS" BASIS,
17
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
 * See the License for the specific language governing permissions and
19
 * limitations under the License.
20
 */
21
22
#include <freerdp/config.h>
23
24
#include "settings.h"
25
26
#include <freerdp/crypto/certificate.h>
27
28
#include <ctype.h>
29
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>
36
37
#include <freerdp/settings.h>
38
#include <freerdp/build-config.h>
39
40
#include "../crypto/certificate.h"
41
#include "../crypto/privatekey.h"
42
#include "capabilities.h"
43
44
#define TAG FREERDP_TAG("settings")
45
46
#ifdef _MSC_VER
47
#pragma warning(push)
48
#pragma warning(disable : 4244)
49
#endif
50
51
static const char client_dll[] = "C:\\Windows\\System32\\mstscax.dll";
52
53
13.2k
#define SERVER_KEY "Software\\" FREERDP_VENDOR_STRING "\\" FREERDP_PRODUCT_STRING "\\Server"
54
159k
#define CLIENT_KEY "Software\\" FREERDP_VENDOR_STRING "\\" FREERDP_PRODUCT_STRING "\\Client"
55
39.8k
#define BITMAP_CACHE_KEY CLIENT_KEY "\\BitmapCacheV2"
56
39.8k
#define GLYPH_CACHE_KEY CLIENT_KEY "\\GlyphCache"
57
39.8k
#define POINTER_CACHE_KEY CLIENT_KEY "\\PointerCache"
58
59
static BOOL settings_reg_query_dword_val(HKEY hKey, const TCHAR* sub, DWORD* value)
60
0
{
61
0
  DWORD dwType = 0;
62
0
  DWORD dwSize = 0;
63
64
0
  dwSize = sizeof(DWORD);
65
0
  if (RegQueryValueEx(hKey, sub, NULL, &dwType, (BYTE*)value, &dwSize) != ERROR_SUCCESS)
66
0
    return FALSE;
67
0
  if (dwType != REG_DWORD)
68
0
    return FALSE;
69
70
0
  return TRUE;
71
0
}
72
73
static BOOL settings_reg_query_word_val(HKEY hKey, const TCHAR* sub, UINT16* value)
74
0
{
75
0
  DWORD dwValue = 0;
76
77
0
  if (!settings_reg_query_dword_val(hKey, sub, &dwValue))
78
0
    return FALSE;
79
80
0
  if (dwValue > UINT16_MAX)
81
0
    return FALSE;
82
83
0
  *value = (UINT16)dwValue;
84
0
  return TRUE;
85
0
}
86
87
static BOOL settings_reg_query_bool_val(HKEY hKey, const TCHAR* sub, BOOL* value)
88
0
{
89
0
  DWORD dwValue = 0;
90
91
0
  if (!settings_reg_query_dword_val(hKey, sub, &dwValue))
92
0
    return FALSE;
93
0
  *value = dwValue != 0;
94
0
  return TRUE;
95
0
}
96
97
static BOOL settings_reg_query_dword(rdpSettings* settings, FreeRDP_Settings_Keys_UInt32 id,
98
                                     HKEY hKey, const TCHAR* sub)
99
0
{
100
0
  DWORD dwValue = 0;
101
102
0
  if (!settings_reg_query_dword_val(hKey, sub, &dwValue))
103
0
    return FALSE;
104
105
0
  return freerdp_settings_set_uint32(settings, id, dwValue);
106
0
}
107
108
static BOOL settings_reg_query_bool(rdpSettings* settings, FreeRDP_Settings_Keys_Bool id, HKEY hKey,
109
                                    const TCHAR* sub)
110
0
{
111
0
  DWORD dwValue = 0;
112
113
0
  if (!settings_reg_query_dword_val(hKey, sub, &dwValue))
114
0
    return FALSE;
115
116
0
  return freerdp_settings_set_bool(settings, id, dwValue != 0 ? TRUE : FALSE);
117
0
}
118
119
static void settings_client_load_hkey_local_machine(rdpSettings* settings)
120
39.8k
{
121
39.8k
  HKEY hKey = NULL;
122
39.8k
  LONG status = 0;
123
39.8k
  status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, CLIENT_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
124
125
39.8k
  if (status == ERROR_SUCCESS)
126
0
  {
127
0
    settings_reg_query_dword(settings, FreeRDP_DesktopWidth, hKey, _T("DesktopWidth"));
128
0
    settings_reg_query_dword(settings, FreeRDP_DesktopHeight, hKey, _T("DesktopHeight"));
129
0
    settings_reg_query_bool(settings, FreeRDP_Fullscreen, hKey, _T("Fullscreen"));
130
0
    settings_reg_query_dword(settings, FreeRDP_ColorDepth, hKey, _T("ColorDepth"));
131
0
    settings_reg_query_dword(settings, FreeRDP_KeyboardType, hKey, _T("KeyboardType"));
132
0
    settings_reg_query_dword(settings, FreeRDP_KeyboardSubType, hKey, _T("KeyboardSubType"));
133
0
    settings_reg_query_dword(settings, FreeRDP_KeyboardFunctionKey, hKey,
134
0
                             _T("KeyboardFunctionKeys"));
135
0
    settings_reg_query_dword(settings, FreeRDP_KeyboardLayout, hKey, _T("KeyboardLayout"));
136
0
    settings_reg_query_bool(settings, FreeRDP_ExtSecurity, hKey, _T("ExtSecurity"));
137
0
    settings_reg_query_bool(settings, FreeRDP_NlaSecurity, hKey, _T("NlaSecurity"));
138
0
    settings_reg_query_bool(settings, FreeRDP_TlsSecurity, hKey, _T("TlsSecurity"));
139
0
    settings_reg_query_bool(settings, FreeRDP_RdpSecurity, hKey, _T("RdpSecurity"));
140
0
    settings_reg_query_bool(settings, FreeRDP_MstscCookieMode, hKey, _T("MstscCookieMode"));
141
0
    settings_reg_query_dword(settings, FreeRDP_CookieMaxLength, hKey, _T("CookieMaxLength"));
142
0
    settings_reg_query_bool(settings, FreeRDP_BitmapCacheEnabled, hKey, _T("BitmapCache"));
143
0
    settings_reg_query_dword(settings, FreeRDP_OffscreenSupportLevel, hKey,
144
0
                             _T("OffscreenBitmapCache"));
145
0
    settings_reg_query_dword(settings, FreeRDP_OffscreenCacheSize, hKey,
146
0
                             _T("OffscreenBitmapCacheSize"));
147
0
    settings_reg_query_dword(settings, FreeRDP_OffscreenCacheEntries, hKey,
148
0
                             _T("OffscreenBitmapCacheEntries"));
149
0
    RegCloseKey(hKey);
150
0
  }
151
152
39.8k
  status =
153
39.8k
      RegOpenKeyExA(HKEY_LOCAL_MACHINE, BITMAP_CACHE_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
154
155
39.8k
  if (status == ERROR_SUCCESS)
156
0
  {
157
0
    settings_reg_query_dword(settings, FreeRDP_BitmapCacheV2NumCells, hKey, _T("NumCells"));
158
0
    for (unsigned x = 0; x < 5; x++)
159
0
    {
160
0
      DWORD val = 0;
161
0
      TCHAR numentries[64] = { 0 };
162
0
      TCHAR persist[64] = { 0 };
163
0
      BITMAP_CACHE_V2_CELL_INFO cache = { 0 };
164
0
      (void)_sntprintf(numentries, ARRAYSIZE(numentries), _T("Cell%uNumEntries"), x);
165
0
      (void)_sntprintf(persist, ARRAYSIZE(persist), _T("Cell%uPersistent"), x);
166
0
      if (!settings_reg_query_dword_val(hKey, numentries, &val) ||
167
0
          !settings_reg_query_bool_val(hKey, persist, &cache.persistent) ||
168
0
          !freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, x,
169
0
                                              &cache))
170
0
        WLog_WARN(TAG, "Failed to load registry keys to settings!");
171
0
      cache.numEntries = val;
172
0
    }
173
174
0
    settings_reg_query_bool(settings, FreeRDP_AllowCacheWaitingList, hKey,
175
0
                            _T("AllowCacheWaitingList"));
176
0
    RegCloseKey(hKey);
177
0
  }
178
179
39.8k
  status =
180
39.8k
      RegOpenKeyExA(HKEY_LOCAL_MACHINE, GLYPH_CACHE_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
181
182
39.8k
  if (status == ERROR_SUCCESS)
183
0
  {
184
0
    unsigned x = 0;
185
0
    UINT32 GlyphSupportLevel = 0;
186
0
    settings_reg_query_dword(settings, FreeRDP_GlyphSupportLevel, hKey, _T("SupportLevel"));
187
0
    for (; x < 10; x++)
188
0
    {
189
0
      GLYPH_CACHE_DEFINITION cache = { 0 };
190
0
      TCHAR numentries[64] = { 0 };
191
0
      TCHAR maxsize[64] = { 0 };
192
0
      (void)_sntprintf(numentries, ARRAYSIZE(numentries), _T("Cache%uNumEntries"), x);
193
0
      (void)_sntprintf(maxsize, ARRAYSIZE(maxsize), _T("Cache%uMaxCellSize"), x);
194
195
0
      settings_reg_query_word_val(hKey, numentries, &cache.cacheEntries);
196
0
      settings_reg_query_word_val(hKey, maxsize, &cache.cacheMaximumCellSize);
197
0
      if (!freerdp_settings_set_pointer_array(settings, FreeRDP_GlyphCache, x, &cache))
198
0
        WLog_WARN(TAG, "Failed to store GlyphCache %" PRIuz, x);
199
0
    }
200
0
    {
201
0
      GLYPH_CACHE_DEFINITION cache = { 0 };
202
0
      settings_reg_query_word_val(hKey, _T("FragCacheNumEntries"), &cache.cacheEntries);
203
0
      settings_reg_query_word_val(hKey, _T("FragCacheMaxCellSize"),
204
0
                                  &cache.cacheMaximumCellSize);
205
0
      if (!freerdp_settings_set_pointer_array(settings, FreeRDP_FragCache, x, &cache))
206
0
        WLog_WARN(TAG, "Failed to store FragCache");
207
0
    }
208
209
0
    RegCloseKey(hKey);
210
211
0
    if (!freerdp_settings_set_uint32(settings, FreeRDP_GlyphSupportLevel, GlyphSupportLevel))
212
0
      WLog_WARN(TAG, "Failed to load registry keys to settings!");
213
0
  }
214
215
39.8k
  status =
216
39.8k
      RegOpenKeyExA(HKEY_LOCAL_MACHINE, POINTER_CACHE_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
217
218
39.8k
  if (status == ERROR_SUCCESS)
219
0
  {
220
0
    settings_reg_query_dword(settings, FreeRDP_LargePointerFlag, hKey, _T("LargePointer"));
221
0
    settings_reg_query_dword(settings, FreeRDP_PointerCacheSize, hKey, _T("PointerCacheSize"));
222
0
    settings_reg_query_dword(settings, FreeRDP_ColorPointerCacheSize, hKey,
223
0
                             _T("ColorPointerCacheSize"));
224
0
    RegCloseKey(hKey);
225
0
  }
226
39.8k
}
227
228
static void settings_server_load_hkey_local_machine(rdpSettings* settings)
229
13.2k
{
230
13.2k
  HKEY hKey = NULL;
231
13.2k
  LONG status = 0;
232
233
13.2k
  status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, SERVER_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
234
235
13.2k
  if (status != ERROR_SUCCESS)
236
13.2k
    return;
237
238
0
  settings_reg_query_bool(settings, FreeRDP_ExtSecurity, hKey, _T("ExtSecurity"));
239
0
  settings_reg_query_bool(settings, FreeRDP_NlaSecurity, hKey, _T("NlaSecurity"));
240
0
  settings_reg_query_bool(settings, FreeRDP_TlsSecurity, hKey, _T("TlsSecurity"));
241
0
  settings_reg_query_dword(settings, FreeRDP_TlsSecLevel, hKey, _T("TlsSecLevel"));
242
0
  settings_reg_query_bool(settings, FreeRDP_RdpSecurity, hKey, _T("RdpSecurity"));
243
244
0
  RegCloseKey(hKey);
245
0
}
246
247
static void settings_load_hkey_local_machine(rdpSettings* settings)
248
53.0k
{
249
53.0k
  if (freerdp_settings_get_bool(settings, FreeRDP_ServerMode))
250
13.2k
    settings_server_load_hkey_local_machine(settings);
251
39.8k
  else
252
39.8k
    settings_client_load_hkey_local_machine(settings);
253
53.0k
}
254
255
static BOOL settings_get_computer_name(rdpSettings* settings)
256
53.0k
{
257
53.0k
  CHAR computerName[256] = { 0 };
258
53.0k
  DWORD nSize = sizeof(computerName);
259
260
53.0k
  if (!GetComputerNameExA(ComputerNameNetBIOS, computerName, &nSize))
261
0
    return FALSE;
262
263
53.0k
  if (nSize > MAX_COMPUTERNAME_LENGTH)
264
0
    computerName[MAX_COMPUTERNAME_LENGTH] = '\0';
265
266
53.0k
  return freerdp_settings_set_string(settings, FreeRDP_ComputerName, computerName);
267
53.0k
}
268
269
void freerdp_settings_print_warnings(const rdpSettings* settings)
270
0
{
271
0
  const UINT32 level = freerdp_settings_get_uint32(settings, FreeRDP_GlyphSupportLevel);
272
0
  if (level != GLYPH_SUPPORT_NONE)
273
0
  {
274
0
    char buffer[32] = { 0 };
275
0
    WLog_WARN(TAG, "[experimental] enabled GlyphSupportLevel %s, expect visual artefacts!",
276
0
              freerdp_settings_glyph_level_string(level, buffer, sizeof(buffer)));
277
0
  }
278
0
}
279
280
BOOL freerdp_settings_set_default_order_support(rdpSettings* settings)
281
53.0k
{
282
53.0k
  BYTE* OrderSupport = freerdp_settings_get_pointer_writable(settings, FreeRDP_OrderSupport);
283
53.0k
  if (!OrderSupport)
284
0
    return FALSE;
285
286
53.0k
  ZeroMemory(OrderSupport, 32);
287
53.0k
  OrderSupport[NEG_DSTBLT_INDEX] = TRUE;
288
53.0k
  OrderSupport[NEG_PATBLT_INDEX] = TRUE;
289
53.0k
  OrderSupport[NEG_SCRBLT_INDEX] = TRUE;
290
53.0k
  OrderSupport[NEG_OPAQUE_RECT_INDEX] = TRUE;
291
53.0k
  OrderSupport[NEG_DRAWNINEGRID_INDEX] = FALSE;
292
53.0k
  OrderSupport[NEG_MULTIDSTBLT_INDEX] = FALSE;
293
53.0k
  OrderSupport[NEG_MULTIPATBLT_INDEX] = FALSE;
294
53.0k
  OrderSupport[NEG_MULTISCRBLT_INDEX] = FALSE;
295
53.0k
  OrderSupport[NEG_MULTIOPAQUERECT_INDEX] = TRUE;
296
53.0k
  OrderSupport[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE;
297
53.0k
  OrderSupport[NEG_LINETO_INDEX] = TRUE;
298
53.0k
  OrderSupport[NEG_POLYLINE_INDEX] = TRUE;
299
53.0k
  OrderSupport[NEG_MEMBLT_INDEX] =
300
53.0k
      freerdp_settings_get_bool(settings, FreeRDP_BitmapCacheEnabled) ? 1 : 0;
301
53.0k
  OrderSupport[NEG_MEM3BLT_INDEX] =
302
53.0k
      freerdp_settings_get_bool(settings, FreeRDP_BitmapCacheEnabled) ? 1 : 0;
303
53.0k
  OrderSupport[NEG_MEMBLT_V2_INDEX] =
304
53.0k
      freerdp_settings_get_bool(settings, FreeRDP_BitmapCacheEnabled) ? 1 : 0;
305
53.0k
  OrderSupport[NEG_MEM3BLT_V2_INDEX] =
306
53.0k
      freerdp_settings_get_bool(settings, FreeRDP_BitmapCacheEnabled) ? 1 : 0;
307
53.0k
  OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE;
308
53.0k
  OrderSupport[NEG_GLYPH_INDEX_INDEX] =
309
53.0k
      freerdp_settings_get_uint32(settings, FreeRDP_GlyphSupportLevel) != GLYPH_SUPPORT_NONE;
310
53.0k
  OrderSupport[NEG_FAST_INDEX_INDEX] =
311
53.0k
      freerdp_settings_get_uint32(settings, FreeRDP_GlyphSupportLevel) != GLYPH_SUPPORT_NONE;
312
53.0k
  OrderSupport[NEG_FAST_GLYPH_INDEX] =
313
53.0k
      freerdp_settings_get_uint32(settings, FreeRDP_GlyphSupportLevel) != GLYPH_SUPPORT_NONE;
314
53.0k
  OrderSupport[NEG_POLYGON_SC_INDEX] = FALSE;
315
53.0k
  OrderSupport[NEG_POLYGON_CB_INDEX] = FALSE;
316
53.0k
  OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE;
317
53.0k
  OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE;
318
53.0k
  return TRUE;
319
53.0k
}
320
321
BOOL freerdp_capability_buffer_allocate(rdpSettings* settings, UINT32 count)
322
69.9k
{
323
69.9k
  WINPR_ASSERT(settings);
324
69.9k
  WINPR_ASSERT(count > 0);
325
69.9k
  WINPR_ASSERT(count == 32);
326
327
69.9k
  freerdp_capability_buffer_free(settings);
328
69.9k
  WINPR_ASSERT(settings->ReceivedCapabilitiesSize == 0);
329
330
69.9k
  settings->ReceivedCapabilitiesSize = count;
331
69.9k
  void* tmp = realloc(settings->ReceivedCapabilities, count * sizeof(BYTE));
332
69.9k
  if (!tmp)
333
0
    return FALSE;
334
69.9k
  memset(tmp, 0, count * sizeof(BYTE));
335
69.9k
  settings->ReceivedCapabilities = tmp;
336
337
69.9k
  tmp = realloc(settings->ReceivedCapabilityData, count * sizeof(BYTE*));
338
69.9k
  if (!tmp)
339
0
    return FALSE;
340
69.9k
  memset(tmp, 0, count * sizeof(BYTE*));
341
69.9k
  settings->ReceivedCapabilityData = tmp;
342
343
69.9k
  tmp = realloc(settings->ReceivedCapabilityDataSizes, count * sizeof(UINT32));
344
69.9k
  if (!tmp)
345
0
    return FALSE;
346
69.9k
  memset(tmp, 0, count * sizeof(UINT32));
347
69.9k
  settings->ReceivedCapabilityDataSizes = tmp;
348
349
69.9k
  return (settings->ReceivedCapabilities && settings->ReceivedCapabilityData &&
350
69.9k
          settings->ReceivedCapabilityDataSizes);
351
69.9k
}
352
353
#if !defined(WITH_FULL_CONFIG_PATH)
354
static char* freerdp_settings_get_legacy_config_path(void)
355
39.8k
{
356
39.8k
  char product[sizeof(FREERDP_PRODUCT_STRING)] = { 0 };
357
358
358k
  for (size_t i = 0; i < sizeof(product); i++)
359
318k
    product[i] = tolower(FREERDP_PRODUCT_STRING[i]);
360
361
39.8k
  return GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, product);
362
39.8k
}
363
#endif
364
365
char* freerdp_settings_get_config_path(void)
366
39.8k
{
367
39.8k
  char* path = NULL;
368
  /* For default FreeRDP continue using same config directory
369
   * as in old releases.
370
   * Custom builds use <Vendor>/<Product> as config folder. */
371
39.8k
#if !defined(WITH_FULL_CONFIG_PATH)
372
39.8k
  if (_stricmp(FREERDP_VENDOR_STRING, FREERDP_PRODUCT_STRING) == 0)
373
39.8k
    return freerdp_settings_get_legacy_config_path();
374
0
#endif
375
376
0
  char* base = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, FREERDP_VENDOR_STRING);
377
0
  if (base)
378
0
    path = GetCombinedPath(base, FREERDP_PRODUCT_STRING);
379
0
  free(base);
380
381
0
  return path;
382
39.8k
}
383
384
rdpSettings* freerdp_settings_new(DWORD flags)
385
53.0k
{
386
53.0k
  char* issuers[] = { "FreeRDP", "FreeRDP-licenser" };
387
53.0k
  const BOOL server = (flags & FREERDP_SETTINGS_SERVER_MODE) != 0 ? TRUE : FALSE;
388
53.0k
  const BOOL remote = (flags & FREERDP_SETTINGS_REMOTE_MODE) != 0 ? TRUE : FALSE;
389
53.0k
  rdpSettings* settings = (rdpSettings*)calloc(1, sizeof(rdpSettings));
390
391
53.0k
  if (!settings)
392
0
    return NULL;
393
394
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_SurfaceCommandsSupported,
395
53.0k
                                   SURFCMDS_SET_SURFACE_BITS | SURFCMDS_STREAM_SURFACE_BITS |
396
53.0k
                                       SURFCMDS_FRAME_MARKER))
397
0
    goto out_fail;
398
399
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_RemoteFxRlgrMode, RLGR3))
400
0
    goto out_fail;
401
402
53.0k
  if (!freerdp_settings_set_uint16(settings, FreeRDP_CapsProtocolVersion,
403
53.0k
                                   TS_CAPS_PROTOCOLVERSION))
404
0
    goto out_fail;
405
406
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_ClipboardFeatureMask,
407
53.0k
                                   CLIPRDR_FLAG_DEFAULT_MASK))
408
0
    goto out_fail;
409
53.0k
  if (!freerdp_settings_set_string(settings, FreeRDP_ServerLicenseCompanyName, "FreeRDP"))
410
0
    goto out_fail;
411
53.0k
  if (!freerdp_settings_set_string(settings, FreeRDP_ServerLicenseProductName,
412
53.0k
                                   "FreeRDP-licensing-server"))
413
0
    goto out_fail;
414
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_ServerLicenseProductVersion, 1))
415
0
    goto out_fail;
416
53.0k
  if (!freerdp_server_license_issuers_copy(settings, issuers, ARRAYSIZE(issuers)))
417
0
    goto out_fail;
418
419
53.0k
  if (!freerdp_settings_set_uint16(settings, FreeRDP_SupportedColorDepths,
420
53.0k
                                   RNS_UD_32BPP_SUPPORT | RNS_UD_24BPP_SUPPORT |
421
53.0k
                                       RNS_UD_16BPP_SUPPORT | RNS_UD_15BPP_SUPPORT))
422
0
    goto out_fail;
423
424
53.0k
  if (!freerdp_settings_set_bool(settings, FreeRDP_UnicodeInput, TRUE) ||
425
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_HasHorizontalWheel, TRUE) ||
426
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_HasExtendedMouseEvent, TRUE) ||
427
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_HasQoeEvent, TRUE) ||
428
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_HasRelativeMouseEvent, TRUE) ||
429
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_HiDefRemoteApp, TRUE) ||
430
53.0k
      !freerdp_settings_set_uint32(
431
53.0k
          settings, FreeRDP_RemoteApplicationSupportMask,
432
53.0k
          RAIL_LEVEL_SUPPORTED | RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED |
433
53.0k
              RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED | RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED |
434
53.0k
              RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED |
435
53.0k
              RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED | RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED |
436
53.0k
              RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED) ||
437
53.0k
      !freerdp_settings_set_uint16(settings, FreeRDP_TextANSICodePage, CP_UTF8) ||
438
53.0k
      !freerdp_settings_set_uint16(settings, FreeRDP_OrderSupportFlags,
439
53.0k
                                   NEGOTIATE_ORDER_SUPPORT | ZERO_BOUNDS_DELTA_SUPPORT |
440
53.0k
                                       COLOR_INDEX_SUPPORT) ||
441
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_SupportHeartbeatPdu, TRUE) ||
442
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_ServerMode, server) ||
443
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_WaitForOutputBufferFlush, TRUE) ||
444
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_ClusterInfoFlags, REDIRECTION_SUPPORTED) ||
445
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_DesktopWidth, 1024) ||
446
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_DesktopHeight, 768) ||
447
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_Workarea, FALSE) ||
448
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_Fullscreen, FALSE) ||
449
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GrabKeyboard, TRUE) ||
450
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_Decorations, TRUE) ||
451
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_RdpVersion, RDP_VERSION_10_12) ||
452
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_ColorDepth, 32) ||
453
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_AadSecurity, FALSE) ||
454
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_ExtSecurity, FALSE) ||
455
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_NlaSecurity, TRUE) ||
456
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_TlsSecurity, TRUE) ||
457
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_RdpSecurity, TRUE) ||
458
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_RdstlsSecurity, FALSE) ||
459
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_NegotiateSecurityLayer, TRUE) ||
460
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_RestrictedAdminModeRequired, FALSE) ||
461
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_MstscCookieMode, FALSE) ||
462
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_CookieMaxLength,
463
53.0k
                                   DEFAULT_COOKIE_MAX_LENGTH) ||
464
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_ClientBuild,
465
53.0k
                                   18363) || /* Windows 10, Version 1909 */
466
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardType, 4) ||
467
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardSubType, 0) ||
468
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardFunctionKey, 12) ||
469
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardLayout, 0) ||
470
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardHook,
471
53.0k
                                   KEYBOARD_HOOK_FULLSCREEN_ONLY) ||
472
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_UseRdpSecurityLayer, FALSE) ||
473
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_SaltedChecksum, TRUE) ||
474
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_ServerPort, 3389) ||
475
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_GatewayPort, 443) ||
476
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DesktopResize, TRUE) ||
477
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_ToggleFullscreen, TRUE) ||
478
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_DesktopPosX, UINT32_MAX) ||
479
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_DesktopPosY, UINT32_MAX) ||
480
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_SoftwareGdi, TRUE) ||
481
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_UnmapButtons, FALSE) ||
482
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_PerformanceFlags, PERF_FLAG_NONE) ||
483
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE) ||
484
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, FALSE) ||
485
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE) ||
486
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE) ||
487
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE) ||
488
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE) ||
489
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_ConnectionType,
490
53.0k
                                   CONNECTION_TYPE_AUTODETECT) ||
491
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_NetworkAutoDetect, TRUE) ||
492
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_EncryptionMethods, ENCRYPTION_METHOD_NONE) ||
493
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_EncryptionLevel, ENCRYPTION_LEVEL_NONE) ||
494
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_FIPSMode, FALSE) ||
495
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_CompressionEnabled, TRUE) ||
496
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_LogonNotify, TRUE) ||
497
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_BrushSupportLevel, BRUSH_COLOR_FULL) ||
498
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_CompressionLevel, PACKET_COMPR_TYPE_RDP61) ||
499
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_Authentication, TRUE) ||
500
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_AuthenticationOnly, FALSE) ||
501
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_CredentialsFromStdin, FALSE) ||
502
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DisableCredentialsDelegation, FALSE) ||
503
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_AuthenticationLevel, 2) ||
504
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_ChannelCount, 0) ||
505
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_CertificateCallbackPreferPEM, FALSE) ||
506
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_KeySpec, AT_KEYEXCHANGE))
507
0
    goto out_fail;
508
509
53.0k
  if (!freerdp_settings_set_pointer_len(settings, FreeRDP_ChannelDefArray, NULL,
510
53.0k
                                        CHANNEL_MAX_COUNT))
511
0
    goto out_fail;
512
513
53.0k
  if (!freerdp_settings_set_bool(settings, FreeRDP_SupportMonitorLayoutPdu, FALSE))
514
0
    goto out_fail;
515
516
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_MonitorCount, 0))
517
0
    goto out_fail;
518
519
53.0k
  if (!freerdp_settings_set_pointer_len(settings, FreeRDP_MonitorDefArray, NULL, 32))
520
0
    goto out_fail;
521
522
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftX, 0))
523
0
    goto out_fail;
524
525
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftY, 0))
526
0
    goto out_fail;
527
528
53.0k
  if (!freerdp_settings_set_pointer_len(settings, FreeRDP_MonitorIds, NULL, 0))
529
0
    goto out_fail;
530
531
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_MultitransportFlags,
532
53.0k
                                   TRANSPORT_TYPE_UDP_FECR))
533
0
    goto out_fail;
534
53.0k
  if (!freerdp_settings_set_bool(settings, FreeRDP_SupportMultitransport, TRUE))
535
0
    goto out_fail;
536
537
53.0k
  if (!settings_get_computer_name(settings))
538
0
    goto out_fail;
539
540
53.0k
  if (!freerdp_settings_set_pointer_len(settings, FreeRDP_RdpServerCertificate, NULL, 1))
541
0
    goto out_fail;
542
543
53.0k
  if (!freerdp_capability_buffer_allocate(settings, 32))
544
0
    goto out_fail;
545
546
53.0k
  {
547
53.0k
    char tmp[32] = { 0 };
548
53.0k
    if (!freerdp_settings_set_string_len(settings, FreeRDP_ClientProductId, tmp, sizeof(tmp)))
549
0
      goto out_fail;
550
53.0k
  }
551
552
53.0k
  {
553
53.0k
    char ClientHostname[33] = { 0 };
554
53.0k
    DWORD size = sizeof(ClientHostname) - 2;
555
53.0k
    GetComputerNameA(ClientHostname, &size);
556
53.0k
    if (!freerdp_settings_set_string(settings, FreeRDP_ClientHostname, ClientHostname))
557
0
      goto out_fail;
558
53.0k
  }
559
560
  /* [MS-RDPBCGR] 2.2.7.1.5 Pointer Capability Set (TS_POINTER_CAPABILITYSET)
561
   *
562
   * if we are in server mode send a reasonable large cache size,
563
   * if we are in client mode just set the value to the maximum we want to
564
   * support and during capability exchange that size will be limited to the
565
   * sizes the server supports
566
   *
567
   * We have chosen 128 cursors in cache which is at worst 128 * 576kB (384x384 pixel cursor with
568
   * 32bit color depth)
569
   * */
570
53.0k
  if (freerdp_settings_get_bool(settings, FreeRDP_ServerMode))
571
13.2k
  {
572
13.2k
    if (!freerdp_settings_set_uint32(settings, FreeRDP_PointerCacheSize, 25) ||
573
13.2k
        !freerdp_settings_set_uint32(settings, FreeRDP_ColorPointerCacheSize, 25))
574
0
      goto out_fail;
575
13.2k
  }
576
39.8k
  else
577
39.8k
  {
578
39.8k
    if (!freerdp_settings_set_uint32(settings, FreeRDP_PointerCacheSize, 128) ||
579
39.8k
        !freerdp_settings_set_uint32(settings, FreeRDP_ColorPointerCacheSize, 128))
580
0
      goto out_fail;
581
39.8k
  }
582
583
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_LargePointerFlag,
584
53.0k
                                   (LARGE_POINTER_FLAG_96x96 | LARGE_POINTER_FLAG_384x384)) ||
585
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_SoundBeepsEnabled, TRUE) ||
586
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DrawGdiPlusEnabled, FALSE) ||
587
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DrawAllowSkipAlpha, TRUE) ||
588
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DrawAllowColorSubsampling, FALSE) ||
589
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_DrawAllowDynamicColorFidelity, TRUE) ||
590
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_FrameMarkerCommandEnabled, TRUE) ||
591
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_SurfaceFrameMarkerEnabled, TRUE) ||
592
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_AllowCacheWaitingList, TRUE) ||
593
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_BitmapCacheV2NumCells, 5))
594
0
    goto out_fail;
595
53.0k
  settings->BitmapCacheV2CellInfo =
596
53.0k
      (BITMAP_CACHE_V2_CELL_INFO*)calloc(6, sizeof(BITMAP_CACHE_V2_CELL_INFO));
597
598
53.0k
  if (!settings->BitmapCacheV2CellInfo)
599
0
    goto out_fail;
600
601
53.0k
  {
602
53.0k
    BITMAP_CACHE_V2_CELL_INFO cache = { 0 };
603
53.0k
    cache.numEntries = 600;
604
53.0k
    if (!freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 0,
605
53.0k
                                            &cache) ||
606
53.0k
        !freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 1, &cache))
607
0
      goto out_fail;
608
53.0k
    cache.numEntries = 2048;
609
53.0k
    if (!freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 2,
610
53.0k
                                            &cache) ||
611
53.0k
        !freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 4, &cache))
612
0
      goto out_fail;
613
53.0k
    cache.numEntries = 4096;
614
53.0k
    if (!freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 3, &cache))
615
0
      goto out_fail;
616
53.0k
  }
617
53.0k
  if (!freerdp_settings_set_bool(settings, FreeRDP_NoBitmapCompressionHeader, TRUE) ||
618
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_RefreshRect, TRUE) ||
619
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_SuppressOutput, TRUE) ||
620
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_GlyphSupportLevel, GLYPH_SUPPORT_NONE))
621
0
    goto out_fail;
622
53.0k
  settings->GlyphCache = calloc(10, sizeof(GLYPH_CACHE_DEFINITION));
623
624
53.0k
  if (!settings->GlyphCache)
625
0
    goto out_fail;
626
627
53.0k
  settings->FragCache = calloc(1, sizeof(GLYPH_CACHE_DEFINITION));
628
629
53.0k
  if (!settings->FragCache)
630
0
    goto out_fail;
631
632
583k
  for (size_t x = 0; x < 10; x++)
633
530k
  {
634
530k
    GLYPH_CACHE_DEFINITION cache = { 0 };
635
530k
    cache.cacheEntries = 254;
636
530k
    switch (x)
637
530k
    {
638
53.0k
      case 0:
639
106k
      case 1:
640
106k
        cache.cacheMaximumCellSize = 4;
641
106k
        break;
642
53.0k
      case 2:
643
106k
      case 3:
644
106k
        cache.cacheMaximumCellSize = 8;
645
106k
        break;
646
53.0k
      case 4:
647
53.0k
        cache.cacheMaximumCellSize = 16;
648
53.0k
        break;
649
53.0k
      case 5:
650
53.0k
        cache.cacheMaximumCellSize = 32;
651
53.0k
        break;
652
53.0k
      case 6:
653
53.0k
        cache.cacheMaximumCellSize = 64;
654
53.0k
        break;
655
53.0k
      case 7:
656
53.0k
        cache.cacheMaximumCellSize = 128;
657
53.0k
        break;
658
53.0k
      case 8:
659
53.0k
        cache.cacheMaximumCellSize = 256;
660
53.0k
        break;
661
53.0k
      case 9:
662
53.0k
        cache.cacheMaximumCellSize = 256;
663
53.0k
        break;
664
530k
    }
665
666
530k
    if (!freerdp_settings_set_pointer_array(settings, FreeRDP_GlyphCache, x, &cache))
667
0
      goto out_fail;
668
530k
  }
669
53.0k
  {
670
53.0k
    GLYPH_CACHE_DEFINITION cache = { 0 };
671
53.0k
    cache.cacheEntries = 256;
672
53.0k
    cache.cacheMaximumCellSize = 256;
673
53.0k
    if (!freerdp_settings_set_pointer_array(settings, FreeRDP_FragCache, 0, &cache))
674
0
      goto out_fail;
675
53.0k
  }
676
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_OffscreenSupportLevel, 0) ||
677
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_OffscreenCacheSize, 7680) ||
678
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_OffscreenCacheEntries, 2000) ||
679
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_DrawNineGridCacheSize, 2560) ||
680
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_DrawNineGridCacheEntries, 256) ||
681
53.0k
      !freerdp_settings_set_string(settings, FreeRDP_ClientDir, client_dll) ||
682
53.0k
      !freerdp_settings_get_string(settings, FreeRDP_ClientDir) ||
683
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_RemoteWndSupportLevel,
684
53.0k
                                   WINDOW_LEVEL_SUPPORTED | WINDOW_LEVEL_SUPPORTED_EX) ||
685
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_RemoteAppNumIconCaches, 3) ||
686
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_RemoteAppNumIconCacheEntries, 12) ||
687
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_VCChunkSize,
688
53.0k
                                   (server && !remote) ? CHANNEL_CHUNK_MAX_LENGTH
689
53.0k
                                                       : CHANNEL_CHUNK_LENGTH) ||
690
      /* [MS-RDPBCGR] 2.2.7.2.7 Large Pointer Capability Set (TS_LARGE_POINTER_CAPABILITYSET)
691
         requires at least this size */
692
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_MultifragMaxRequestSize,
693
53.0k
                                   server ? 0 : 608299) ||
694
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GatewayUseSameCredentials, FALSE) ||
695
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GatewayBypassLocal, FALSE) ||
696
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GatewayRpcTransport, TRUE) ||
697
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpTransport, TRUE) ||
698
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GatewayUdpTransport, TRUE) ||
699
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpUseWebsockets, TRUE) ||
700
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpExtAuthSspiNtlm, FALSE) ||
701
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, FALSE) ||
702
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_FastPathInput, TRUE) ||
703
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_FastPathOutput, TRUE) ||
704
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_LongCredentialsSupported, TRUE) ||
705
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_FrameAcknowledge, 2) ||
706
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_MouseMotion, TRUE) ||
707
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_NSCodecColorLossLevel, 3) ||
708
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_NSCodecAllowSubsampling, TRUE) ||
709
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_NSCodecAllowDynamicColorFidelity, TRUE) ||
710
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_AutoReconnectionEnabled, FALSE) ||
711
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_AutoReconnectMaxRetries, 20) ||
712
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GfxThinClient, FALSE) ||
713
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GfxSmallCache, TRUE) ||
714
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GfxProgressive, FALSE) ||
715
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GfxProgressiveV2, FALSE) ||
716
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GfxPlanar, TRUE) ||
717
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GfxH264, FALSE) ||
718
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GfxAVC444, FALSE) ||
719
53.0k
      !freerdp_settings_set_bool(settings, FreeRDP_GfxSendQoeAck, FALSE))
720
0
    goto out_fail;
721
53.0k
  {
722
53.0k
    ARC_CS_PRIVATE_PACKET cookie = { 0 };
723
53.0k
    if (!freerdp_settings_set_pointer_len(settings, FreeRDP_ClientAutoReconnectCookie, &cookie,
724
53.0k
                                          1))
725
0
      goto out_fail;
726
53.0k
  }
727
53.0k
  {
728
53.0k
    ARC_SC_PRIVATE_PACKET cookie = { 0 };
729
53.0k
    if (!freerdp_settings_set_pointer_len(settings, FreeRDP_ServerAutoReconnectCookie, &cookie,
730
53.0k
                                          1))
731
0
      goto out_fail;
732
53.0k
  }
733
734
53.0k
  settings->ClientTimeZone = (LPTIME_ZONE_INFORMATION)calloc(1, sizeof(TIME_ZONE_INFORMATION));
735
736
53.0k
  if (!settings->ClientTimeZone)
737
0
    goto out_fail;
738
739
53.0k
  if (!settings->ServerMode)
740
39.8k
  {
741
39.8k
    DYNAMIC_TIME_ZONE_INFORMATION dynamic = { 0 };
742
39.8k
    TIME_ZONE_INFORMATION* tz =
743
39.8k
        freerdp_settings_get_pointer_writable(settings, FreeRDP_ClientTimeZone);
744
39.8k
    WINPR_ASSERT(tz);
745
746
39.8k
    GetTimeZoneInformation(tz);
747
39.8k
    GetDynamicTimeZoneInformation(&dynamic);
748
749
39.8k
    if (!freerdp_settings_set_string_from_utf16N(settings, FreeRDP_DynamicDSTTimeZoneKeyName,
750
39.8k
                                                 dynamic.TimeZoneKeyName,
751
39.8k
                                                 ARRAYSIZE(dynamic.TimeZoneKeyName)))
752
0
      goto out_fail;
753
754
39.8k
    if (!freerdp_settings_set_bool(settings, FreeRDP_DynamicDaylightTimeDisabled,
755
39.8k
                                   dynamic.DynamicDaylightTimeDisabled))
756
0
      goto out_fail;
757
39.8k
  }
758
759
53.0k
  if (!freerdp_settings_set_bool(settings, FreeRDP_TcpKeepAlive, TRUE) ||
760
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_TcpKeepAliveRetries, 3) ||
761
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_TcpKeepAliveDelay, 5) ||
762
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_TcpKeepAliveInterval, 2) ||
763
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_TcpAckTimeout, 9000) ||
764
53.0k
      !freerdp_settings_set_uint32(settings, FreeRDP_TcpConnectTimeout, 15000))
765
0
    goto out_fail;
766
767
53.0k
  if (!freerdp_settings_get_bool(settings, FreeRDP_ServerMode))
768
39.8k
  {
769
39.8k
    BOOL rc = FALSE;
770
39.8k
    char* path = NULL;
771
39.8k
    if (!freerdp_settings_set_bool(settings, FreeRDP_RedirectClipboard, TRUE))
772
0
      goto out_fail;
773
    /* these values are used only by the client part */
774
39.8k
    path = GetKnownPath(KNOWN_PATH_HOME);
775
39.8k
    rc = freerdp_settings_set_string(settings, FreeRDP_HomePath, path);
776
39.8k
    free(path);
777
778
39.8k
    if (!rc || !freerdp_settings_get_string(settings, FreeRDP_HomePath))
779
0
      goto out_fail;
780
781
39.8k
    char* config = freerdp_settings_get_config_path();
782
39.8k
    rc = freerdp_settings_set_string(settings, FreeRDP_ConfigPath, config);
783
39.8k
    if (rc)
784
39.8k
    {
785
39.8k
      char* action = GetCombinedPath(config, "action.sh");
786
39.8k
      rc = freerdp_settings_set_string(settings, FreeRDP_ActionScript, action);
787
39.8k
      free(action);
788
39.8k
    }
789
790
39.8k
    free(config);
791
39.8k
    if (!rc)
792
0
      goto out_fail;
793
39.8k
  }
794
795
53.0k
  settings_load_hkey_local_machine(settings);
796
797
53.0k
  if (!freerdp_settings_set_bool(settings, FreeRDP_SmartcardLogon, FALSE))
798
0
    goto out_fail;
799
53.0k
  if (!freerdp_settings_set_uint32(settings, FreeRDP_TlsSecLevel, 1))
800
0
    goto out_fail;
801
53.0k
  settings->OrderSupport = calloc(1, 32);
802
803
53.0k
  freerdp_settings_set_uint16(settings, FreeRDP_TLSMinVersion, TLS1_VERSION);
804
53.0k
  freerdp_settings_set_uint16(settings, FreeRDP_TLSMaxVersion, 0);
805
806
53.0k
  if (!settings->OrderSupport)
807
0
    goto out_fail;
808
809
53.0k
  if (!freerdp_settings_set_default_order_support(settings))
810
0
    goto out_fail;
811
812
53.0k
  const BOOL enable = freerdp_settings_get_bool(settings, FreeRDP_ServerMode);
813
814
53.0k
  {
815
53.0k
    const FreeRDP_Settings_Keys_Bool keys[] = { FreeRDP_SupportGraphicsPipeline,
816
53.0k
                                              FreeRDP_SupportStatusInfoPdu,
817
53.0k
                                              FreeRDP_SupportErrorInfoPdu,
818
53.0k
                                              FreeRDP_SupportAsymetricKeys };
819
820
265k
    for (size_t x = 0; x < ARRAYSIZE(keys); x++)
821
212k
    {
822
212k
      if (!freerdp_settings_set_bool(settings, keys[x], enable))
823
0
        goto out_fail;
824
212k
    }
825
53.0k
  }
826
827
53.0k
  if (!freerdp_settings_set_bool(settings, FreeRDP_SupportDynamicTimeZone, TRUE))
828
0
    goto out_fail;
829
53.0k
  if (!freerdp_settings_set_bool(settings, FreeRDP_SupportSkipChannelJoin, TRUE))
830
0
    goto out_fail;
831
832
53.0k
  return settings;
833
0
out_fail:
834
0
  freerdp_settings_free(settings);
835
0
  return NULL;
836
53.0k
}
837
838
static void freerdp_settings_free_internal(rdpSettings* settings)
839
79.6k
{
840
79.6k
  freerdp_server_license_issuers_free(settings);
841
79.6k
  freerdp_target_net_addresses_free(settings);
842
79.6k
  freerdp_device_collection_free(settings);
843
79.6k
  freerdp_static_channel_collection_free(settings);
844
79.6k
  freerdp_dynamic_channel_collection_free(settings);
845
846
79.6k
  freerdp_capability_buffer_free(settings);
847
848
  /* Free all strings, set other pointers NULL */
849
79.6k
  freerdp_settings_free_keys(settings, TRUE);
850
79.6k
}
851
852
void freerdp_settings_free(rdpSettings* settings)
853
92.8k
{
854
92.8k
  if (!settings)
855
26.5k
    return;
856
857
66.3k
  freerdp_settings_free_internal(settings);
858
66.3k
  free(settings);
859
66.3k
}
860
861
static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSettings* settings)
862
13.2k
{
863
13.2k
  BOOL rc = FALSE;
864
865
13.2k
  if (!_settings || !settings)
866
0
    return FALSE;
867
868
13.2k
  {
869
13.2k
    const void* data = freerdp_settings_get_pointer(settings, FreeRDP_LoadBalanceInfo);
870
13.2k
    const UINT32 len = freerdp_settings_get_uint32(settings, FreeRDP_LoadBalanceInfoLength);
871
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_LoadBalanceInfo, data, len))
872
0
      return FALSE;
873
13.2k
  }
874
13.2k
  {
875
13.2k
    const void* data = freerdp_settings_get_pointer(settings, FreeRDP_ServerRandom);
876
13.2k
    const UINT32 len = freerdp_settings_get_uint32(settings, FreeRDP_ServerRandomLength);
877
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ServerRandom, data, len))
878
0
      return FALSE;
879
13.2k
  }
880
13.2k
  {
881
13.2k
    const void* data = freerdp_settings_get_pointer(settings, FreeRDP_ClientRandom);
882
13.2k
    const UINT32 len = freerdp_settings_get_uint32(settings, FreeRDP_ClientRandomLength);
883
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ClientRandom, data, len))
884
0
      return FALSE;
885
13.2k
  }
886
13.2k
  if (!freerdp_server_license_issuers_copy(_settings, settings->ServerLicenseProductIssuers,
887
13.2k
                                           settings->ServerLicenseProductIssuersCount))
888
0
    return FALSE;
889
890
13.2k
  {
891
13.2k
    const void* data = freerdp_settings_get_pointer(settings, FreeRDP_ServerCertificate);
892
13.2k
    const UINT32 len = freerdp_settings_get_uint32(settings, FreeRDP_ServerCertificateLength);
893
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ServerCertificate, data, len))
894
0
      return FALSE;
895
13.2k
  }
896
13.2k
  if (settings->RdpServerCertificate)
897
13.2k
  {
898
13.2k
    rdpCertificate* cert = freerdp_certificate_clone(settings->RdpServerCertificate);
899
13.2k
    if (!cert)
900
0
      goto out_fail;
901
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerCertificate, cert, 1))
902
0
      goto out_fail;
903
13.2k
  }
904
0
  else
905
0
  {
906
0
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerCertificate, NULL, 0))
907
0
      goto out_fail;
908
0
  }
909
910
13.2k
  if (settings->RdpServerRsaKey)
911
0
  {
912
0
    rdpPrivateKey* key = freerdp_key_clone(settings->RdpServerRsaKey);
913
0
    if (!key)
914
0
      goto out_fail;
915
0
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerRsaKey, key, 1))
916
0
      goto out_fail;
917
0
  }
918
13.2k
  else
919
13.2k
  {
920
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerRsaKey, NULL, 0))
921
0
      goto out_fail;
922
13.2k
  }
923
924
13.2k
  if (!freerdp_settings_set_uint32(_settings, FreeRDP_ChannelCount,
925
13.2k
                                   freerdp_settings_get_uint32(settings, FreeRDP_ChannelCount)))
926
0
    goto out_fail;
927
13.2k
  if (!freerdp_settings_set_uint32(
928
13.2k
          _settings, FreeRDP_ChannelDefArraySize,
929
13.2k
          freerdp_settings_get_uint32(settings, FreeRDP_ChannelDefArraySize)))
930
0
    goto out_fail;
931
932
13.2k
  const UINT32 defArraySize = freerdp_settings_get_uint32(settings, FreeRDP_ChannelDefArraySize);
933
13.2k
  const CHANNEL_DEF* defArray = freerdp_settings_get_pointer(settings, FreeRDP_ChannelDefArray);
934
13.2k
  if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ChannelDefArray, defArray,
935
13.2k
                                        defArraySize))
936
0
    goto out_fail;
937
938
13.2k
  {
939
13.2k
    const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_MonitorDefArraySize);
940
13.2k
    const rdpMonitor* monitors =
941
13.2k
        freerdp_settings_get_pointer(settings, FreeRDP_MonitorDefArray);
942
943
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_MonitorDefArray, monitors, count))
944
0
      goto out_fail;
945
13.2k
  }
946
947
13.2k
  if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_MonitorIds, NULL, 16))
948
0
    goto out_fail;
949
950
13.2k
  const UINT32 monitorIdSize = freerdp_settings_get_uint32(settings, FreeRDP_NumMonitorIds);
951
13.2k
  const UINT32* monitorIds = freerdp_settings_get_pointer(settings, FreeRDP_MonitorIds);
952
13.2k
  if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_MonitorIds, monitorIds, monitorIdSize))
953
0
    goto out_fail;
954
955
13.2k
  _settings->OrderSupport = malloc(32);
956
957
13.2k
  if (!_settings->OrderSupport)
958
0
    goto out_fail;
959
960
13.2k
  if (!freerdp_capability_buffer_copy(_settings, settings))
961
0
    goto out_fail;
962
13.2k
  CopyMemory(_settings->OrderSupport, settings->OrderSupport, 32);
963
964
13.2k
  const UINT32 cellInfoSize =
965
13.2k
      freerdp_settings_get_uint32(settings, FreeRDP_BitmapCacheV2NumCells);
966
13.2k
  const BITMAP_CACHE_V2_CELL_INFO* cellInfo =
967
13.2k
      freerdp_settings_get_pointer(settings, FreeRDP_BitmapCacheV2CellInfo);
968
13.2k
  if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_BitmapCacheV2CellInfo, cellInfo,
969
13.2k
                                        cellInfoSize))
970
0
    goto out_fail;
971
972
13.2k
  const UINT32 glyphCacheCount = 10;
973
13.2k
  const GLYPH_CACHE_DEFINITION* glyphCache =
974
13.2k
      freerdp_settings_get_pointer(settings, FreeRDP_GlyphCache);
975
13.2k
  if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_GlyphCache, glyphCache,
976
13.2k
                                        glyphCacheCount))
977
0
    goto out_fail;
978
979
13.2k
  const UINT32 fragCacheCount = 1;
980
13.2k
  const GLYPH_CACHE_DEFINITION* fragCache =
981
13.2k
      freerdp_settings_get_pointer(settings, FreeRDP_FragCache);
982
13.2k
  if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_FragCache, fragCache, fragCacheCount))
983
0
    goto out_fail;
984
985
13.2k
  if (!freerdp_settings_set_pointer_len(
986
13.2k
          _settings, FreeRDP_ClientAutoReconnectCookie,
987
13.2k
          freerdp_settings_get_pointer(settings, FreeRDP_ClientAutoReconnectCookie), 1))
988
0
    goto out_fail;
989
13.2k
  if (!freerdp_settings_set_pointer_len(
990
13.2k
          _settings, FreeRDP_ServerAutoReconnectCookie,
991
13.2k
          freerdp_settings_get_pointer(settings, FreeRDP_ServerAutoReconnectCookie), 1))
992
0
    goto out_fail;
993
994
13.2k
  const TIME_ZONE_INFORMATION* tz =
995
13.2k
      freerdp_settings_get_pointer(settings, FreeRDP_ClientTimeZone);
996
13.2k
  if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ClientTimeZone, tz, 1))
997
0
    goto out_fail;
998
999
13.2k
  if (!freerdp_settings_set_uint32(
1000
13.2k
          _settings, FreeRDP_RedirectionPasswordLength,
1001
13.2k
          freerdp_settings_get_uint32(settings, FreeRDP_RedirectionPasswordLength)))
1002
0
    goto out_fail;
1003
13.2k
  const UINT32 redirectionPasswordLength =
1004
13.2k
      freerdp_settings_get_uint32(settings, FreeRDP_RedirectionPasswordLength);
1005
13.2k
  const BYTE* pwd = freerdp_settings_get_pointer(settings, FreeRDP_RedirectionPassword);
1006
13.2k
  if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RedirectionPassword, pwd,
1007
13.2k
                                        redirectionPasswordLength))
1008
0
    goto out_fail;
1009
1010
13.2k
  const UINT32 RedirectionTsvUrlLength =
1011
13.2k
      freerdp_settings_get_uint32(settings, FreeRDP_RedirectionTsvUrlLength);
1012
13.2k
  const BYTE* RedirectionTsvUrl =
1013
13.2k
      freerdp_settings_get_pointer(settings, FreeRDP_RedirectionTsvUrl);
1014
13.2k
  if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RedirectionTsvUrl, RedirectionTsvUrl,
1015
13.2k
                                        RedirectionTsvUrlLength))
1016
0
    goto out_fail;
1017
1018
13.2k
  const UINT32 nrports = freerdp_settings_get_uint32(settings, FreeRDP_TargetNetAddressCount);
1019
13.2k
  if (!freerdp_target_net_adresses_reset(_settings, nrports))
1020
0
    return FALSE;
1021
1022
13.2k
  for (UINT32 i = 0; i < nrports; i++)
1023
0
  {
1024
0
    const char* address =
1025
0
        freerdp_settings_get_pointer_array(settings, FreeRDP_TargetNetAddresses, i);
1026
0
    const UINT32* port =
1027
0
        freerdp_settings_get_pointer_array(settings, FreeRDP_TargetNetPorts, i);
1028
0
    if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_TargetNetAddresses, i, address))
1029
0
      return FALSE;
1030
0
    if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_TargetNetPorts, i, port))
1031
0
      return FALSE;
1032
0
  }
1033
1034
13.2k
  {
1035
13.2k
    const UINT32 len = freerdp_settings_get_uint32(_settings, FreeRDP_DeviceArraySize);
1036
13.2k
    const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_DeviceCount);
1037
1038
13.2k
    if (len < count)
1039
0
      goto out_fail;
1040
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_DeviceArray, NULL, len))
1041
0
      goto out_fail;
1042
13.2k
    if (!freerdp_settings_set_uint32(_settings, FreeRDP_DeviceCount, count))
1043
0
      goto out_fail;
1044
1045
13.2k
    for (size_t index = 0; index < count; index++)
1046
0
    {
1047
0
      const RDPDR_DEVICE* argv =
1048
0
          freerdp_settings_get_pointer_array(settings, FreeRDP_DeviceArray, index);
1049
0
      if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_DeviceArray, index, argv))
1050
0
        goto out_fail;
1051
0
    }
1052
13.2k
  }
1053
13.2k
  {
1054
13.2k
    const UINT32 len = freerdp_settings_get_uint32(_settings, FreeRDP_StaticChannelArraySize);
1055
13.2k
    const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelCount);
1056
1057
13.2k
    if (len < count)
1058
0
      goto out_fail;
1059
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_StaticChannelArray, NULL, len))
1060
0
      goto out_fail;
1061
13.2k
    if (!freerdp_settings_set_uint32(_settings, FreeRDP_StaticChannelCount, count))
1062
0
      goto out_fail;
1063
1064
13.2k
    for (size_t index = 0; index < count; index++)
1065
0
    {
1066
0
      const ADDIN_ARGV* argv =
1067
0
          freerdp_settings_get_pointer_array(settings, FreeRDP_StaticChannelArray, index);
1068
0
      if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_StaticChannelArray, index,
1069
0
                                              argv))
1070
0
        goto out_fail;
1071
0
    }
1072
13.2k
  }
1073
13.2k
  {
1074
13.2k
    const UINT32 len = freerdp_settings_get_uint32(_settings, FreeRDP_DynamicChannelArraySize);
1075
13.2k
    const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelCount);
1076
1077
13.2k
    if (len < count)
1078
0
      goto out_fail;
1079
13.2k
    if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_DynamicChannelArray, NULL, len))
1080
0
      goto out_fail;
1081
13.2k
    if (!freerdp_settings_set_uint32(_settings, FreeRDP_DynamicChannelCount, count))
1082
0
      goto out_fail;
1083
1084
13.2k
    for (size_t index = 0; index < count; index++)
1085
0
    {
1086
0
      const ADDIN_ARGV* argv =
1087
0
          freerdp_settings_get_pointer_array(settings, FreeRDP_DynamicChannelArray, index);
1088
0
      if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_DynamicChannelArray, index,
1089
0
                                              argv))
1090
0
        goto out_fail;
1091
0
    }
1092
13.2k
  }
1093
1094
13.2k
  rc = freerdp_settings_set_string(_settings, FreeRDP_ActionScript,
1095
13.2k
                                   freerdp_settings_get_string(settings, FreeRDP_ActionScript));
1096
1097
13.2k
out_fail:
1098
13.2k
  return rc;
1099
13.2k
}
1100
1101
BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings)
1102
13.2k
{
1103
13.2k
  BOOL rc = 0;
1104
1105
13.2k
  if (!settings || !_settings)
1106
0
    return FALSE;
1107
1108
  /* This is required to free all non string buffers */
1109
13.2k
  freerdp_settings_free_internal(_settings);
1110
  /* This copies everything except allocated non string buffers. reset all allocated buffers to
1111
   * NULL to fix issues during cleanup */
1112
13.2k
  rc = freerdp_settings_clone_keys(_settings, settings);
1113
1114
13.2k
  _settings->LoadBalanceInfo = NULL;
1115
13.2k
  _settings->ServerRandom = NULL;
1116
13.2k
  _settings->ClientRandom = NULL;
1117
13.2k
  _settings->ServerCertificate = NULL;
1118
13.2k
  _settings->RdpServerCertificate = NULL;
1119
13.2k
  _settings->RdpServerRsaKey = NULL;
1120
13.2k
  _settings->ChannelDefArray = NULL;
1121
13.2k
  _settings->MonitorDefArray = NULL;
1122
13.2k
  _settings->MonitorIds = NULL;
1123
13.2k
  _settings->OrderSupport = NULL;
1124
13.2k
  _settings->BitmapCacheV2CellInfo = NULL;
1125
13.2k
  _settings->GlyphCache = NULL;
1126
13.2k
  _settings->FragCache = NULL;
1127
13.2k
  _settings->ClientAutoReconnectCookie = NULL;
1128
13.2k
  _settings->ServerAutoReconnectCookie = NULL;
1129
13.2k
  _settings->ClientTimeZone = NULL;
1130
13.2k
  _settings->RedirectionPassword = NULL;
1131
13.2k
  _settings->RedirectionTsvUrl = NULL;
1132
13.2k
  _settings->TargetNetAddresses = NULL;
1133
13.2k
  _settings->TargetNetPorts = NULL;
1134
13.2k
  _settings->DeviceArray = NULL;
1135
13.2k
  _settings->StaticChannelArray = NULL;
1136
13.2k
  _settings->DynamicChannelArray = NULL;
1137
13.2k
  _settings->ReceivedCapabilities = NULL;
1138
13.2k
  _settings->ReceivedCapabilityData = NULL;
1139
13.2k
  _settings->ReceivedCapabilityDataSizes = NULL;
1140
1141
13.2k
  _settings->ServerLicenseProductIssuersCount = 0;
1142
13.2k
  _settings->ServerLicenseProductIssuers = NULL;
1143
1144
13.2k
  if (!rc)
1145
0
    goto out_fail;
1146
1147
  /* Begin copying */
1148
13.2k
  if (!freerdp_settings_int_buffer_copy(_settings, settings))
1149
0
    goto out_fail;
1150
13.2k
  return TRUE;
1151
0
out_fail:
1152
0
  freerdp_settings_free_internal(_settings);
1153
0
  return FALSE;
1154
13.2k
}
1155
1156
rdpSettings* freerdp_settings_clone(const rdpSettings* settings)
1157
13.2k
{
1158
13.2k
  rdpSettings* _settings = (rdpSettings*)calloc(1, sizeof(rdpSettings));
1159
1160
13.2k
  if (!freerdp_settings_copy(_settings, settings))
1161
0
    goto out_fail;
1162
1163
13.2k
  return _settings;
1164
0
out_fail:
1165
0
  freerdp_settings_free(_settings);
1166
0
  return NULL;
1167
13.2k
}
1168
#ifdef _MSC_VER
1169
#pragma warning(pop)
1170
#endif
1171
1172
static void zfree(WCHAR* str, size_t len)
1173
0
{
1174
0
  if (str)
1175
0
    memset(str, 0, len * sizeof(WCHAR));
1176
0
  free(str);
1177
0
}
1178
1179
BOOL identity_set_from_settings_with_pwd(SEC_WINNT_AUTH_IDENTITY* identity,
1180
                                         const rdpSettings* settings,
1181
                                         FreeRDP_Settings_Keys_String UserId,
1182
                                         FreeRDP_Settings_Keys_String DomainId,
1183
                                         const WCHAR* Password, size_t pwdLen)
1184
0
{
1185
0
  WINPR_ASSERT(identity);
1186
0
  WINPR_ASSERT(settings);
1187
1188
0
  size_t UserLen = 0;
1189
0
  size_t DomainLen = 0;
1190
1191
0
  WCHAR* Username = freerdp_settings_get_string_as_utf16(settings, UserId, &UserLen);
1192
0
  WCHAR* Domain = freerdp_settings_get_string_as_utf16(settings, DomainId, &DomainLen);
1193
1194
0
  const int rc = sspi_SetAuthIdentityWithLengthW(identity, Username, UserLen, Domain, DomainLen,
1195
0
                                                 Password, pwdLen);
1196
0
  zfree(Username, UserLen);
1197
0
  zfree(Domain, DomainLen);
1198
0
  if (rc < 0)
1199
0
    return FALSE;
1200
0
  return TRUE;
1201
0
}
1202
1203
BOOL identity_set_from_settings(SEC_WINNT_AUTH_IDENTITY_W* identity, const rdpSettings* settings,
1204
                                FreeRDP_Settings_Keys_String UserId,
1205
                                FreeRDP_Settings_Keys_String DomainId,
1206
                                FreeRDP_Settings_Keys_String PwdId)
1207
0
{
1208
0
  WINPR_ASSERT(identity);
1209
0
  WINPR_ASSERT(settings);
1210
1211
0
  size_t PwdLen = 0;
1212
1213
0
  WCHAR* Password = freerdp_settings_get_string_as_utf16(settings, PwdId, &PwdLen);
1214
1215
0
  const BOOL rc =
1216
0
      identity_set_from_settings_with_pwd(identity, settings, UserId, DomainId, Password, PwdLen);
1217
0
  zfree(Password, PwdLen);
1218
0
  return rc;
1219
0
}
1220
1221
BOOL identity_set_from_smartcard_hash(SEC_WINNT_AUTH_IDENTITY_W* identity,
1222
                                      const rdpSettings* settings,
1223
                                      FreeRDP_Settings_Keys_String userId,
1224
                                      FreeRDP_Settings_Keys_String domainId,
1225
                                      FreeRDP_Settings_Keys_String pwdId, const BYTE* certSha1,
1226
                                      size_t sha1len)
1227
0
{
1228
#ifdef _WIN32
1229
  CERT_CREDENTIAL_INFO certInfo = { sizeof(CERT_CREDENTIAL_INFO), { 0 } };
1230
  LPWSTR marshalledCredentials = NULL;
1231
1232
  memcpy(certInfo.rgbHashOfCert, certSha1, MIN(sha1len, sizeof(certInfo.rgbHashOfCert)));
1233
1234
  if (!CredMarshalCredentialW(CertCredential, &certInfo, &marshalledCredentials))
1235
  {
1236
    WLog_ERR(TAG, "error marshalling cert credentials");
1237
    return FALSE;
1238
  }
1239
1240
  size_t pwdLen = 0;
1241
  WCHAR* Password = freerdp_settings_get_string_as_utf16(settings, pwdId, &pwdLen);
1242
  const int rc = sspi_SetAuthIdentityWithLengthW(
1243
      identity, marshalledCredentials, _wcslen(marshalledCredentials), NULL, 0, Password, pwdLen);
1244
  zfree(Password, pwdLen);
1245
  CredFree(marshalledCredentials);
1246
  if (rc < 0)
1247
    return FALSE;
1248
1249
#else
1250
0
  if (!identity_set_from_settings(identity, settings, userId, domainId, pwdId))
1251
0
    return FALSE;
1252
0
#endif /* _WIN32 */
1253
0
  return TRUE;
1254
0
}
1255
1256
const char* freerdp_settings_glyph_level_string(UINT32 level, char* buffer, size_t size)
1257
0
{
1258
0
  const char* str = "GLYPH_SUPPORT_UNKNOWN";
1259
0
  switch (level)
1260
0
  {
1261
0
    case GLYPH_SUPPORT_NONE:
1262
0
      str = "GLYPH_SUPPORT_NONE";
1263
0
      break;
1264
0
    case GLYPH_SUPPORT_PARTIAL:
1265
0
      str = "GLYPH_SUPPORT_PARTIAL";
1266
0
      break;
1267
0
    case GLYPH_SUPPORT_FULL:
1268
0
      str = "GLYPH_SUPPORT_FULL";
1269
0
      break;
1270
0
    case GLYPH_SUPPORT_ENCODE:
1271
0
      str = "GLYPH_SUPPORT_ENCODE";
1272
0
      break;
1273
0
    default:
1274
0
      break;
1275
0
  }
1276
1277
0
  (void)_snprintf(buffer, size, "%s[0x%08" PRIx32 "]", str, level);
1278
0
  return buffer;
1279
0
}
1280
1281
BOOL freerdp_target_net_adresses_reset(rdpSettings* settings, size_t size)
1282
13.2k
{
1283
13.2k
  freerdp_target_net_addresses_free(settings);
1284
1285
13.2k
  if (size > 0)
1286
0
  {
1287
0
    if (!freerdp_settings_set_pointer_len_(settings, FreeRDP_TargetNetPorts, -1, NULL, size,
1288
0
                                           sizeof(UINT32)))
1289
0
      return FALSE;
1290
0
    if (!freerdp_settings_set_pointer_len_(settings, FreeRDP_TargetNetAddresses,
1291
0
                                           FreeRDP_TargetNetAddressCount, NULL, size,
1292
0
                                           sizeof(char*)))
1293
0
      return FALSE;
1294
0
  }
1295
13.2k
  return TRUE;
1296
13.2k
}