diff options
author | Bernhard Miklautz <bmiklautz@users.noreply.github.com> | 2020-05-08 12:40:17 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-08 12:40:17 +0300 |
commit | 11b9b1ca6be433f1da5bbf5e152d554d3eb67ac6 (patch) | |
tree | b19505402c23ce27dffe9c996449b1a495bfadca | |
parent | 973731824bddfd52cda24344f93f9da6f79ea6d4 (diff) | |
parent | 2d5ce618bf1db4bae83fd17fbb7e4eccbd715d9c (diff) |
Merge pull request #6152 from akallabeth/stable-backports2.1.0
Stable backports
75 files changed, 3416 insertions, 2220 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 7392b351b..a4d22b31e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,7 +81,7 @@ if ($ENV{BUILD_NUMBER}) endif() set(WITH_LIBRARY_VERSIONING "ON") -set(RAW_VERSION_STRING "2.1.0-dev") +set(RAW_VERSION_STRING "2.1.0") if(EXISTS "${CMAKE_SOURCE_DIR}/.source_tag") file(READ ${CMAKE_SOURCE_DIR}/.source_tag RAW_VERSION_STRING) elseif(USE_VERSION_FROM_GIT_TAG) @@ -1,3 +1,28 @@ +# 2020-05-05 Version 2.1.0 + +Important notes: + +* fix multiple CVEs: CVE-2020-11039, CVE-2020-11038, CVE-2020-11043, CVE-2020-11040, CVE-2020-11041, + CVE-2020-11019, CVE-2020-11017, CVE-2020-11018 +* fix multiple leak and crash issues (#6129, #6128, #6127, #6110, #6081, #6077) + +Noteworthy features and improvements: +* Fixed sound issues (#6043) +* New expert command line options /tune and /tune-list to modify all client + settings in a generic way. +* Fixes for smartcard cache, this improves compatibility of smartcard devices + with newer smartcard channel. +* Shadow server can now be instructed to listen to multiple interfaces. +* Improved server certificate support (#6052) +* Various fixes for wayland client (fullscreen, mouse wheel, ...) +* Fixed large mouse pointer support, now mouse pointers > 96x96 pixel are visible. +* USB redirection command line improvements (filter options) +* Various translation improvements for android and ios clients + +For a complete and detailed change log since the last release candidate run: +git log 2.0.0..2.1.0 + + # 2020-04-09 Version 2.0.0 Important notes: diff --git a/channels/cliprdr/client/cliprdr_format.c b/channels/cliprdr/client/cliprdr_format.c index e2ab39ad8..43b967e1a 100644 --- a/channels/cliprdr/client/cliprdr_format.c +++ b/channels/cliprdr/client/cliprdr_format.c @@ -43,7 +43,7 @@ UINT cliprdr_process_format_list(cliprdrPlugin* cliprdr, wStream* s, UINT32 dataLen, UINT16 msgFlags) { - CLIPRDR_FORMAT_LIST formatList; + CLIPRDR_FORMAT_LIST formatList = { 0 }; CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr); UINT error = CHANNEL_RC_OK; @@ -82,7 +82,7 @@ error_out: UINT cliprdr_process_format_list_response(cliprdrPlugin* cliprdr, wStream* s, UINT32 dataLen, UINT16 msgFlags) { - CLIPRDR_FORMAT_LIST_RESPONSE formatListResponse; + CLIPRDR_FORMAT_LIST_RESPONSE formatListResponse = { 0 }; CliprdrClientContext* context = cliprdr_get_client_interface(cliprdr); UINT error = CHANNEL_RC_OK; diff --git a/channels/cliprdr/client/cliprdr_main.c b/channels/cliprdr/client/cliprdr_main.c index 4509591c5..8541cabcc 100644 --- a/channels/cliprdr/client/cliprdr_main.c +++ b/channels/cliprdr/client/cliprdr_main.c @@ -539,8 +539,10 @@ static UINT cliprdr_client_capabilities(CliprdrClientContext* context, const CLIPRDR_CAPABILITIES* capabilities) { wStream* s; + UINT32 flags; const CLIPRDR_GENERAL_CAPABILITY_SET* generalCapabilitySet; cliprdrPlugin* cliprdr = (cliprdrPlugin*)context->handle; + s = cliprdr_packet_new(CB_CLIP_CAPS, 0, 4 + CB_CAPSTYPE_GENERAL_LEN); if (!s) @@ -555,7 +557,27 @@ static UINT cliprdr_client_capabilities(CliprdrClientContext* context, Stream_Write_UINT16(s, generalCapabilitySet->capabilitySetType); /* capabilitySetType */ Stream_Write_UINT16(s, generalCapabilitySet->capabilitySetLength); /* lengthCapability */ Stream_Write_UINT32(s, generalCapabilitySet->version); /* version */ - Stream_Write_UINT32(s, generalCapabilitySet->generalFlags); /* generalFlags */ + flags = generalCapabilitySet->generalFlags; + + /* Client capabilities are sent in response to server capabilities. + * -> Do not request features the server does not support. + * -> Update clipboard context feature state to what was agreed upon. + */ + if (!cliprdr->useLongFormatNames) + flags &= ~CB_USE_LONG_FORMAT_NAMES; + if (!cliprdr->streamFileClipEnabled) + flags &= ~CB_STREAM_FILECLIP_ENABLED; + if (!cliprdr->fileClipNoFilePaths) + flags &= ~CB_FILECLIP_NO_FILE_PATHS; + if (!cliprdr->canLockClipData) + flags &= CB_CAN_LOCK_CLIPDATA; + + cliprdr->useLongFormatNames = flags & CB_USE_LONG_FORMAT_NAMES; + cliprdr->streamFileClipEnabled = flags & CB_STREAM_FILECLIP_ENABLED; + cliprdr->fileClipNoFilePaths = flags & CB_FILECLIP_NO_FILE_PATHS; + cliprdr->canLockClipData = flags & CB_CAN_LOCK_CLIPDATA; + + Stream_Write_UINT32(s, flags); /* generalFlags */ WLog_Print(cliprdr->log, WLOG_DEBUG, "ClientCapabilities"); return cliprdr_packet_send(cliprdr, s); } @@ -1139,10 +1161,6 @@ BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS pEntryPoints, PVOID p } cliprdr->log = WLog_Get("com.freerdp.channels.cliprdr.client"); - cliprdr->useLongFormatNames = TRUE; - cliprdr->streamFileClipEnabled = FALSE; - cliprdr->fileClipNoFilePaths = TRUE; - cliprdr->canLockClipData = FALSE; WLog_Print(cliprdr->log, WLOG_DEBUG, "VirtualChannelEntryEx"); CopyMemory(&(cliprdr->channelEntryPoints), pEntryPoints, sizeof(CHANNEL_ENTRY_POINTS_FREERDP_EX)); diff --git a/channels/cliprdr/cliprdr_common.c b/channels/cliprdr/cliprdr_common.c index ebe0d6aad..a699852b6 100644 --- a/channels/cliprdr/cliprdr_common.c +++ b/channels/cliprdr/cliprdr_common.c @@ -400,29 +400,32 @@ UINT cliprdr_read_format_list(wStream* s, CLIPRDR_FORMAT_LIST* formatList, BOOL int formatNameLength; char* szFormatName; WCHAR* wszFormatName; - UINT32 dataLen = formatList->dataLen; + wStream sub1, sub2; CLIPRDR_FORMAT* formats = NULL; - UINT error = CHANNEL_RC_OK; + UINT error = ERROR_INTERNAL_ERROR; asciiNames = (formatList->msgFlags & CB_ASCII_NAMES) ? TRUE : FALSE; index = 0; + /* empty format list */ + formatList->formats = NULL; formatList->numFormats = 0; - position = Stream_GetPosition(s); + + Stream_StaticInit(&sub1, Stream_Pointer(s), formatList->dataLen); + if (!Stream_SafeSeek(s, formatList->dataLen)) + return ERROR_INVALID_DATA; if (!formatList->dataLen) { - /* empty format list */ - formatList->formats = NULL; - formatList->numFormats = 0; } else if (!useLongFormatNames) { - formatList->numFormats = (dataLen / 36); + const size_t cap = Stream_Capacity(&sub1); + formatList->numFormats = (cap / 36); - if ((formatList->numFormats * 36) != dataLen) + if ((formatList->numFormats * 36) != cap) { - WLog_ERR(TAG, "Invalid short format list length: %" PRIu32 "", dataLen); + WLog_ERR(TAG, "Invalid short format list length: %" PRIuz "", cap); return ERROR_INTERNAL_ERROR; } @@ -437,10 +440,9 @@ UINT cliprdr_read_format_list(wStream* s, CLIPRDR_FORMAT_LIST* formatList, BOOL formatList->formats = formats; - while (dataLen) + while (Stream_GetRemainingLength(&sub1) >= 4) { - Stream_Read_UINT32(s, formats[index].formatId); /* formatId (4 bytes) */ - dataLen -= 4; + Stream_Read_UINT32(&sub1, formats[index].formatId); /* formatId (4 bytes) */ formats[index].formatName = NULL; @@ -452,10 +454,12 @@ UINT cliprdr_read_format_list(wStream* s, CLIPRDR_FORMAT_LIST* formatList, BOOL * These are 16 unicode charaters - *without* terminating null ! */ + szFormatName = (char*)Stream_Pointer(&sub1); + wszFormatName = (WCHAR*)Stream_Pointer(&sub1); + if (!Stream_SafeSeek(&sub1, 32)) + goto error_out; if (asciiNames) { - szFormatName = (char*)Stream_Pointer(s); - if (szFormatName[0]) { /* ensure null termination */ @@ -472,8 +476,6 @@ UINT cliprdr_read_format_list(wStream* s, CLIPRDR_FORMAT_LIST* formatList, BOOL } else { - wszFormatName = (WCHAR*)Stream_Pointer(s); - if (wszFormatName[0]) { /* ConvertFromUnicode always returns a null-terminated @@ -489,34 +491,27 @@ UINT cliprdr_read_format_list(wStream* s, CLIPRDR_FORMAT_LIST* formatList, BOOL } } - Stream_Seek(s, 32); - dataLen -= 32; index++; } } else { - while (dataLen) + sub2 = sub1; + while (Stream_GetRemainingLength(&sub1) > 0) { - Stream_Seek(s, 4); /* formatId (4 bytes) */ - dataLen -= 4; - - wszFormatName = (WCHAR*)Stream_Pointer(s); - - if (!wszFormatName[0]) - formatNameLength = 0; - else - formatNameLength = _wcslen(wszFormatName); + size_t rest; + if (!Stream_SafeSeek(&sub1, 4)) /* formatId (4 bytes) */ + goto error_out; - Stream_Seek(s, (formatNameLength + 1) * 2); - dataLen -= ((formatNameLength + 1) * 2); + wszFormatName = (WCHAR*)Stream_Pointer(&sub1); + rest = Stream_GetRemainingLength(&sub1); + formatNameLength = _wcsnlen(wszFormatName, rest / sizeof(WCHAR)); + if (!Stream_SafeSeek(&sub1, (formatNameLength + 1) * sizeof(WCHAR))) + goto error_out; formatList->numFormats++; } - dataLen = formatList->dataLen; - Stream_SetPosition(s, position); - if (formatList->numFormats) formats = (CLIPRDR_FORMAT*)calloc(formatList->numFormats, sizeof(CLIPRDR_FORMAT)); @@ -528,24 +523,23 @@ UINT cliprdr_read_format_list(wStream* s, CLIPRDR_FORMAT_LIST* formatList, BOOL formatList->formats = formats; - while (dataLen) + while (Stream_GetRemainingLength(&sub2) >= 4) { - Stream_Read_UINT32(s, formats[index].formatId); /* formatId (4 bytes) */ - dataLen -= 4; + size_t rest; + Stream_Read_UINT32(&sub2, formats[index].formatId); /* formatId (4 bytes) */ formats[index].formatName = NULL; - wszFormatName = (WCHAR*)Stream_Pointer(s); - - if (!wszFormatName[0]) - formatNameLength = 0; - else - formatNameLength = _wcslen(wszFormatName); + wszFormatName = (WCHAR*)Stream_Pointer(&sub2); + rest = Stream_GetRemainingLength(&sub2); + formatNameLength = _wcsnlen(wszFormatName, rest / sizeof(WCHAR)); + if (!Stream_SafeSeek(&sub2, (formatNameLength + 1) * sizeof(WCHAR))) + goto error_out; if (formatNameLength) { - if (ConvertFromUnicode(CP_UTF8, 0, wszFormatName, -1, &(formats[index].formatName), - 0, NULL, NULL) < 1) + if (ConvertFromUnicode(CP_UTF8, 0, wszFormatName, formatNameLength, + &(formats[index].formatName), 0, NULL, NULL) < 1) { WLog_ERR(TAG, "failed to convert long clipboard format name"); error = ERROR_INTERNAL_ERROR; @@ -553,14 +547,11 @@ UINT cliprdr_read_format_list(wStream* s, CLIPRDR_FORMAT_LIST* formatList, BOOL } } - Stream_Seek(s, (formatNameLength + 1) * 2); - dataLen -= ((formatNameLength + 1) * 2); - index++; } } - return error; + return CHANNEL_RC_OK; error_out: cliprdr_free_format_list(formatList); @@ -582,5 +573,7 @@ void cliprdr_free_format_list(CLIPRDR_FORMAT_LIST* formatList) } free(formatList->formats); + formatList->formats = NULL; + formatList->numFormats = 0; } } diff --git a/channels/cliprdr/server/cliprdr_main.c b/channels/cliprdr/server/cliprdr_main.c index 34ff4d74d..8854a0fb7 100644 --- a/channels/cliprdr/server/cliprdr_main.c +++ b/channels/cliprdr/server/cliprdr_main.c @@ -432,6 +432,9 @@ cliprdr_server_file_contents_response(CliprdrServerContext* context, static UINT cliprdr_server_receive_general_capability(CliprdrServerContext* context, wStream* s, CLIPRDR_GENERAL_CAPABILITY_SET* cap_set) { + if (Stream_GetRemainingLength(s) < 8) + return ERROR_INVALID_DATA; + Stream_Read_UINT32(s, cap_set->version); /* version (4 bytes) */ Stream_Read_UINT32(s, cap_set->generalFlags); /* generalFlags (4 bytes) */ @@ -464,29 +467,33 @@ static UINT cliprdr_server_receive_capabilities(CliprdrServerContext* context, w UINT16 index; UINT16 capabilitySetType; UINT16 capabilitySetLength; - UINT error = CHANNEL_RC_OK; + UINT error = ERROR_INVALID_DATA; size_t cap_sets_size = 0; - CLIPRDR_CAPABILITIES capabilities; + CLIPRDR_CAPABILITIES capabilities = { 0 }; CLIPRDR_CAPABILITY_SET* capSet; - void* tmp; WINPR_UNUSED(header); - /* set `capabilitySets` to NULL so `realloc` will know to alloc the first block */ - capabilities.capabilitySets = NULL; WLog_DBG(TAG, "CliprdrClientCapabilities"); + if (Stream_GetRemainingLength(s) < 4) + return ERROR_INVALID_DATA; + Stream_Read_UINT16(s, capabilities.cCapabilitiesSets); /* cCapabilitiesSets (2 bytes) */ Stream_Seek_UINT16(s); /* pad1 (2 bytes) */ for (index = 0; index < capabilities.cCapabilitiesSets; index++) { + void* tmp = NULL; + if (Stream_GetRemainingLength(s) < 4) + goto out; Stream_Read_UINT16(s, capabilitySetType); /* capabilitySetType (2 bytes) */ Stream_Read_UINT16(s, capabilitySetLength); /* capabilitySetLength (2 bytes) */ cap_sets_size += capabilitySetLength; - tmp = realloc(capabilities.capabilitySets, cap_sets_size); + if (cap_sets_size > 0) + tmp = realloc(capabilities.capabilitySets, cap_sets_size); if (tmp == NULL) { WLog_ERR(TAG, "capabilities.capabilitySets realloc failed!"); @@ -504,8 +511,9 @@ static UINT cliprdr_server_receive_capabilities(CliprdrServerContext* context, w switch (capSet->capabilitySetType) { case CB_CAPSTYPE_GENERAL: - if ((error = cliprdr_server_receive_general_capability( - context, s, (CLIPRDR_GENERAL_CAPABILITY_SET*)capSet))) + error = cliprdr_server_receive_general_capability( + context, s, (CLIPRDR_GENERAL_CAPABILITY_SET*)capSet); + if (error) { WLog_ERR(TAG, "cliprdr_server_receive_general_capability failed with error %" PRIu32 @@ -518,11 +526,11 @@ static UINT cliprdr_server_receive_capabilities(CliprdrServerContext* context, w default: WLog_ERR(TAG, "unknown cliprdr capability set: %" PRIu16 "", capSet->capabilitySetType); - error = ERROR_INVALID_DATA; goto out; } } + error = CHANNEL_RC_OK; IFCALLRET(context->ClientCapabilities, error, context, &capabilities); out: free(capabilities.capabilitySets); diff --git a/channels/drdynvc/client/drdynvc_main.c b/channels/drdynvc/client/drdynvc_main.c index f19ac6fd7..fa09cd08f 100644 --- a/channels/drdynvc/client/drdynvc_main.c +++ b/channels/drdynvc/client/drdynvc_main.c @@ -815,7 +815,7 @@ static UINT drdynvc_write_data(drdynvcPlugin* drdynvc, UINT32 ChannelId, const B if (dataSize == 0) { - dvcman_close_channel(drdynvc->channel_mgr, ChannelId, TRUE); + status = dvcman_close_channel(drdynvc->channel_mgr, ChannelId, TRUE); } else if (dataSize <= CHANNEL_CHUNK_LENGTH - pos) { diff --git a/channels/drive/client/drive_main.c b/channels/drive/client/drive_main.c index 861fad507..1b5422522 100644 --- a/channels/drive/client/drive_main.c +++ b/channels/drive/client/drive_main.c @@ -331,6 +331,7 @@ static UINT drive_process_irp_write(DRIVE_DEVICE* drive, IRP* irp) DRIVE_FILE* file; UINT32 Length; UINT64 Offset; + void* ptr; if (!drive || !irp || !irp->input || !irp->output || !irp->Complete) return ERROR_INVALID_PARAMETER; @@ -341,6 +342,9 @@ static UINT drive_process_irp_write(DRIVE_DEVICE* drive, IRP* irp) Stream_Read_UINT32(irp->input, Length); Stream_Read_UINT64(irp->input, Offset); Stream_Seek(irp->input, 20); /* Padding */ + ptr = Stream_Pointer(irp->input); + if (!Stream_SafeSeek(irp->input, Length)) + return ERROR_INVALID_DATA; file = drive_get_file_by_id(drive, irp->FileId); if (!file) @@ -353,7 +357,7 @@ static UINT drive_process_irp_write(DRIVE_DEVICE* drive, IRP* irp) irp->IoStatus = drive_map_windows_err(GetLastError()); Length = 0; } - else if (!drive_file_write(file, Stream_Pointer(irp->input), Length)) + else if (!drive_file_write(file, ptr, Length)) { irp->IoStatus = drive_map_windows_err(GetLastError()); Length = 0; diff --git a/channels/parallel/client/parallel_main.c b/channels/parallel/client/parallel_main.c index 3fc6c4158..af3e82703 100644 --- a/channels/parallel/client/parallel_main.c +++ b/channels/parallel/client/parallel_main.c @@ -83,13 +83,19 @@ static UINT parallel_process_irp_create(PARALLEL_DEVICE* parallel, IRP* irp) { char* path = NULL; int status; + WCHAR* ptr; UINT32 PathLength; - Stream_Seek(irp->input, 28); + if (!Stream_SafeSeek(irp->input, 28)) + return ERROR_INVALID_DATA; /* DesiredAccess(4) AllocationSize(8), FileAttributes(4) */ /* SharedAccess(4) CreateDisposition(4), CreateOptions(4) */ + if (Stream_GetRemainingLength(irp->input) < 4) + return ERROR_INVALID_DATA; Stream_Read_UINT32(irp->input, PathLength); - status = ConvertFromUnicode(CP_UTF8, 0, (WCHAR*)Stream_Pointer(irp->input), PathLength / 2, - &path, 0, NULL, NULL); + ptr = (WCHAR*)Stream_Pointer(irp->input); + if (!Stream_SafeSeek(irp->input, PathLength)) + return ERROR_INVALID_DATA; + status = ConvertFromUnicode(CP_UTF8, 0, ptr, PathLength / 2, &path, 0, NULL, NULL); if (status < 1) if (!(path = (char*)calloc(1, 1))) @@ -149,6 +155,8 @@ static UINT parallel_process_irp_read(PARALLEL_DEVICE* parallel, IRP* irp) UINT64 Offset; ssize_t status; BYTE* buffer = NULL; + if (Stream_GetRemainingLength(irp->input) < 12) + return ERROR_INVALID_DATA; Stream_Read_UINT32(irp->input, Length); Stream_Read_UINT64(irp->input, Offset); buffer = (BYTE*)malloc(Length); @@ -201,14 +209,22 @@ static UINT parallel_process_irp_write(PARALLEL_DEVICE* parallel, IRP* irp) UINT32 Length; UINT64 Offset; ssize_t status; + void* ptr; + if (Stream_GetRemainingLength(irp->input) > 12) + return ERROR_INVALID_DATA; + Stream_Read_UINT32(irp->input, Length); Stream_Read_UINT64(irp->input, Offset); - Stream_Seek(irp->input, 20); /* Padding */ + if (!Stream_SafeSeek(irp->input, 20)) /* Padding */ + return ERROR_INVALID_DATA; + ptr = Stream_Pointer(irp->input); + if (!Stream_SafeSeek(irp->input, Length)) + return ERROR_INVALID_DATA; len = Length; while (len > 0) { - status = write(parallel->file, Stream_Pointer(irp->input), len); + status = write(parallel->file, ptr, len); if (status < 0) { diff --git a/channels/printer/client/printer_main.c b/channels/printer/client/printer_main.c index 42bcd3fbf..dbcc07dc5 100644 --- a/channels/printer/client/printer_main.c +++ b/channels/printer/client/printer_main.c @@ -107,7 +107,7 @@ static BOOL printer_write_setting(const char* path, prn_conf_t type, const void* const char* name = filemap[type]; char* abs = GetCombinedPath(path, name); - if (!abs) + if (!abs || (length > INT32_MAX)) return FALSE; file = CreateFileA(abs, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); @@ -478,10 +478,16 @@ static UINT printer_process_irp_write(PRINTER_DEVICE* printer_dev, IRP* irp) UINT64 Offset; rdpPrintJob* printjob = NULL; UINT error = CHANNEL_RC_OK; + void* ptr; + + if (Stream_GetRemainingLength(irp->input) < 32) + return ERROR_INVALID_DATA; Stream_Read_UINT32(irp->input, Length); Stream_Read_UINT64(irp->input, Offset); Stream_Seek(irp->input, 20); /* Padding */ - + ptr = Stream_Pointer(irp->input); + if (!Stream_SafeSeek(irp->input, Length)) + return ERROR_INVALID_DATA; if (printer_dev->printer) printjob = printer_dev->printer->FindPrintJob(printer_dev->printer, irp->FileId); @@ -492,7 +498,7 @@ static UINT printer_process_irp_write(PRINTER_DEVICE* printer_dev, IRP* irp) } else { - error = printjob->Write(printjob, Stream_Pointer(irp->input), Length); + error = printjob->Write(printjob, ptr, Length); } if (error) diff --git a/channels/rdpdr/client/rdpdr_main.c b/channels/rdpdr/client/rdpdr_main.c index 8f7eda847..7f6dc9451 100644 --- a/channels/rdpdr/client/rdpdr_main.c +++ b/channels/rdpdr/client/rdpdr_main.c @@ -670,7 +670,7 @@ static UINT handle_hotplug(rdpdrPlugin* rdpdr) if (!path) continue; /* copy hotpluged device mount point to the dev_array */ - if (isAutomountLocation(path) && (size <= MAX_USB_DEVICES)) + if (isAutomountLocation(path) && (size < MAX_USB_DEVICES)) { dev_array[size].path = _strdup(path); dev_array[size++].to_add = TRUE; diff --git a/channels/rdpei/client/rdpei_main.c b/channels/rdpei/client/rdpei_main.c index 2e72bd449..7dd65211d 100644 --- a/channels/rdpei/client/rdpei_main.c +++ b/channels/rdpei/client/rdpei_main.c @@ -445,6 +445,9 @@ static UINT rdpei_recv_pdu(RDPEI_CHANNEL_CALLBACK* callback, wStream* s) UINT16 eventId; UINT32 pduLength; UINT error; + if (Stream_GetRemainingLength(s) < 6) + return ERROR_INVALID_DATA; + Stream_Read_UINT16(s, eventId); /* eventId (2 bytes) */ Stream_Read_UINT32(s, pduLength); /* pduLength (4 bytes) */ #ifdef WITH_DEBUG_RDPEI diff --git a/channels/rdpsnd/client/rdpsnd_main.c b/channels/rdpsnd/client/rdpsnd_main.c index 9644afadb..2526ec55d 100644 --- a/channels/rdpsnd/client/rdpsnd_main.c +++ b/channels/rdpsnd/client/rdpsnd_main.c @@ -122,6 +122,9 @@ struct rdpsnd_plugin rdpContext* rdpcontext; FREERDP_DSP_CONTEXT* dsp_context; + + HANDLE thread; + wMessageQueue* queue; }; static const char* rdpsnd_is_dyn_str(BOOL dynamic) @@ -546,6 +549,9 @@ static UINT rdpsnd_treat_wave(rdpsndPlugin* rdpsnd, wStream* s, size_t size) if (Stream_GetRemainingLength(s) < size) return ERROR_BAD_LENGTH; + if (rdpsnd->wCurrentFormatNo >= rdpsnd->NumberOfClientFormats) + return ERROR_INTERNAL_ERROR; + data = Stream_Pointer(s); format = &rdpsnd->ClientFormats[rdpsnd->wCurrentFormatNo]; WLog_Print(rdpsnd->log, WLOG_DEBUG, @@ -621,8 +627,10 @@ static UINT rdpsnd_recv_wave2_pdu(rdpsndPlugin* rdpsnd, wStream* s, UINT16 BodyS Stream_Read_UINT8(s, rdpsnd->cBlockNo); Stream_Seek(s, 3); /* bPad */ Stream_Read_UINT32(s, dwAudioTimeStamp); - rdpsnd->waveDataSize = BodySize - 12; + if (wFormatNo >= rdpsnd->NumberOfClientFormats) + return ERROR_INVALID_DATA; format = &rdpsnd->ClientFormats[wFormatNo]; + rdpsnd->waveDataSize = BodySize - 12; rdpsnd->wArrivalTime = GetTickCount64(); WLog_Print(rdpsnd->log, WLOG_DEBUG, "%s Wave2PDU: cBlockNo: %" PRIu8 " wFormatNo: %" PRIu16 ", align=%hu", @@ -1070,14 +1078,11 @@ static UINT rdpsnd_virtual_channel_event_data_received(rdpsndPlugin* plugin, voi if (dataFlags & CHANNEL_FLAG_LAST) { - UINT error; - Stream_SealLength(plugin->data_in); Stream_SetPosition(plugin->data_in, 0); - error = rdpsnd_recv_pdu(plugin, plugin->data_in); - if (error) - return error; + if (!MessageQueue_Post(plugin->queue, NULL, 0, plugin->data_in, NULL)) + return ERROR_INTERNAL_ERROR; plugin->data_in = NULL; } @@ -1222,10 +1227,75 @@ static UINT rdpsnd_virtual_channel_event_disconnected(rdpsndPlugin* rdpsnd) return CHANNEL_RC_OK; } +static void _queue_free(void* obj) +{ + wStream* s = obj; + Stream_Release(s); +} + +static DWORD WINAPI play_thread(LPVOID arg) +{ + UINT error = CHANNEL_RC_OK; + rdpsndPlugin* rdpsnd = arg; + + if (!rdpsnd || !rdpsnd->queue) + return ERROR_INVALID_PARAMETER; + + while (TRUE) + { + int rc; + wMessage message; + wStream* s; + HANDLE handle = MessageQueue_Event(rdpsnd->queue); + WaitForSingleObject(handle, INFINITE); + + rc = MessageQueue_Peek(rdpsnd->queue, &message, TRUE); + if (rc < 1) + continue; + + if (message.id == WMQ_QUIT) + break; + + s = message.wParam; + error = rdpsnd_recv_pdu(rdpsnd, s); + + if (error) + return error; + } + + return CHANNEL_RC_OK; +} + +static UINT rdpsnd_virtual_channel_event_initialized(rdpsndPlugin* rdpsnd) +{ + wObject obj = { 0 }; + + if (!rdpsnd) + return ERROR_INVALID_PARAMETER; + + obj.fnObjectFree = _queue_free; + rdpsnd->queue = MessageQueue_New(&obj); + if (!rdpsnd->queue) + return CHANNEL_RC_NO_MEMORY; + + rdpsnd->thread = CreateThread(NULL, 0, play_thread, rdpsnd, 0, NULL); + if (!rdpsnd->thread) + return CHANNEL_RC_INITIALIZATION_ERROR; + return CHANNEL_RC_OK; +} + static void rdpsnd_virtual_channel_event_terminated(rdpsndPlugin* rdpsnd) { if (rdpsnd) { + MessageQueue_PostQuit(rdpsnd->queue, 0); + if (rdpsnd->thread) + { + WaitForSingleObject(rdpsnd->thread, INFINITE); + CloseHandle(rdpsnd->thread); + } + MessageQueue_Free(rdpsnd->queue); + audio_formats_free(rdpsnd->fixed_format, 1); free(rdpsnd->subsystem); free(rdpsnd->device_name); @@ -1254,6 +1324,7 @@ static VOID VCAPITYPE rdpsnd_virtual_channel_init_event_ex(LPVOID lpUserParam, L switch (event) { case CHANNEL_EVENT_INITIALIZED: + error = rdpsnd_virtual_channel_event_initialized(plugin); break; case CHANNEL_EVENT_CONNECTED: @@ -1373,7 +1444,28 @@ fail: static UINT rdpsnd_on_data_received(IWTSVirtualChannelCallback* pChannelCallback, wStream* data) { RDPSND_CHANNEL_CALLBACK* callback = (RDPSND_CHANNEL_CALLBACK*)pChannelCallback; - return rdpsnd_recv_pdu((rdpsndPlugin*)callback->plugin, data); + rdpsndPlugin* plugin; + wStream* copy; + size_t len = Stream_GetRemainingLength(data); + + if (!callback || !callback->plugin) + return ERROR_INVALID_PARAMETER; + plugin = (rdpsndPlugin*)callback->plugin; + + copy = StreamPool_Take(plugin->pool, len); + if (!copy) + return ERROR_OUTOFMEMORY; + Stream_Copy(data, copy, len); + Stream_SealLength(copy); + Stream_SetPosition(copy, 0); + + if (!MessageQueue_Post(plugin->queue, NULL, 0, copy, NULL)) + { + Stream_Release(copy); + return ERROR_INTERNAL_ERROR; + } + + return CHANNEL_RC_OK; } static UINT rdpsnd_on_close(IWTSVirtualChannelCallback* pChannelCallback) @@ -1452,7 +1544,7 @@ static UINT rdpsnd_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMana (IWTSListenerCallback*)rdpsnd->listener_callback, &(rdpsnd->listener)); rdpsnd->listener->pInterface = rdpsnd->iface.pInterface; - return status; + return rdpsnd_virtual_channel_event_initialized(rdpsnd); } /** @@ -1463,8 +1555,11 @@ static UINT rdpsnd_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMana static UINT rdpsnd_plugin_terminated(IWTSPlugin* pPlugin) { rdpsndPlugin* rdpsnd = (rdpsndPlugin*)pPlugin; - free(rdpsnd->listener_callback); - free(rdpsnd->iface.pInterface); + if (rdpsnd) + { + free(rdpsnd->listener_callback); + free(rdpsnd->iface.pInterface); + } rdpsnd_virtual_channel_event_terminated(rdpsnd); return CHANNEL_RC_OK; } @@ -1496,10 +1591,8 @@ UINT rdpsnd_DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) rdpsnd->dynamic = TRUE; rdpsnd->fixed_format = audio_format_new(); if (!rdpsnd->fixed_format) - { - free(rdpsnd); - return FALSE; - } + goto fail; + rdpsnd->log = WLog_Get("com.freerdp.channels.rdpsnd.client"); rdpsnd->channelEntryPoints.pExtendedData = pEntryPoints->GetPluginData(pEntryPoints); @@ -1507,9 +1600,12 @@ UINT rdpsnd_DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) } else { - WLog_ERR(TAG, "%s could not get disp Plugin.", rdpsnd_is_dyn_str(TRUE)); + WLog_ERR(TAG, "%s could not get rdpsnd Plugin.", rdpsnd_is_dyn_str(TRUE)); return CHANNEL_RC_BAD_CHANNEL; } return error; +fail: + rdpsnd_plugin_terminated(&rdpsnd->iface); + return error; } diff --git a/channels/serial/client/serial_main.c b/channels/serial/client/serial_main.c index cac534c8d..afe67b4d3 100644 --- a/channels/serial/client/serial_main.c +++ b/channels/serial/client/serial_main.c @@ -142,10 +142,9 @@ static UINT serial_process_irp_create(SERIAL_DEVICE* serial, IRP* irp) Stream_Seek_UINT32(irp->input); /* CreateOptions (4 bytes) */ Stream_Read_UINT32(irp->input, PathLength); /* PathLength (4 bytes) */ - if (Stream_GetRemainingLength(irp->input) < PathLength) + if (!Stream_SafeSeek(irp->input, PathLength)) /* Path (variable) */ return ERROR_INVALID_DATA; - Stream_Seek(irp->input, PathLength); /* Path (variable) */ assert(PathLength == 0); /* MS-RDPESP 2.2.2.2 */ #ifndef _WIN32 /* Windows 2012 server sends on a first call : @@ -300,6 +299,7 @@ static UINT serial_process_irp_write(SERIAL_DEVICE* serial, IRP* irp) { UINT32 Length; UINT64 Offset; + void* ptr; DWORD nbWritten = 0; if (Stream_GetRemainingLength(irp->input) < 32) @@ -307,7 +307,9 @@ static UINT serial_process_irp_write(SERIAL_DEVICE* serial, IRP* irp) Stream_Read_UINT32(irp->input, Length); /* Length (4 bytes) */ Stream_Read_UINT64(irp->input, Offset); /* Offset (8 bytes) */ - Stream_Seek(irp->input, 20); /* Padding (20 bytes) */ + if (!Stream_SafeSeek(irp->input, 20)) /* Padding (20 bytes) */ + return ERROR_INVALID_DATA; + /* MS-RDPESP 3.2.5.1.5: The Offset field is ignored * assert(Offset == 0); * @@ -317,8 +319,11 @@ static UINT serial_process_irp_write(SERIAL_DEVICE* serial, IRP* irp) WLog_Print(serial->log, WLOG_DEBUG, "writing %" PRIu32 " bytes to %s", Length, serial->device.name); + ptr = Stream_Pointer(irp->input); + if (!Stream_SafeSeek(irp->input, Length)) + return ERROR_INVALID_DATA; /* FIXME: CommWriteFile to be replaced by WriteFile */ - if (CommWriteFile(serial->hComm, Stream_Pointer(irp->input), Length, &nbWritten, NULL)) + if (CommWriteFile(serial->hComm, ptr, Length, &nbWritten, NULL)) { irp->IoStatus = STATUS_SUCCESS; } diff --git a/channels/smartcard/client/smartcard_operations.c b/channels/smartcard/client/smartcard_operations.c index d1562b91e..b20f2e4df 100644 --- a/channels/smartcard/client/smartcard_operations.c +++ b/channels/smartcard/client/smartcard_operations.c @@ -42,8 +42,22 @@ static LONG log_status_error(const char* tag, const char* what, LONG status) { if (status != SCARD_S_SUCCESS) - WLog_ERR(tag, "%s failed with error %s [%" PRId32 "]", what, SCardGetErrorString(status), - status); + { + DWORD level = WLOG_ERROR; + switch (status) + { + case SCARD_E_TIMEOUT: + level = WLOG_DEBUG; + break; + case SCARD_E_NO_READERS_AVAILABLE: + level = WLOG_INFO; + break; + default: + break; + } + WLog_Print(WLog_Get(tag), level, "%s failed with error %s [%" PRId32 "]", what, + SCardGetErrorString(status), status); + } return status; } diff --git a/channels/smartcard/client/smartcard_pack.c b/channels/smartcard/client/smartcard_pack.c index 64a0c946e..de0e1cec5 100644 --- a/channels/smartcard/client/smartcard_pack.c +++ b/channels/smartcard/client/smartcard_pack.c @@ -101,7 +101,7 @@ static BOOL smartcard_ndr_pointer_read_(wStream* s, UINT32* index, UINT32* ptr, static LONG smartcard_ndr_read(wStream* s, BYTE** data, size_t min, size_t elementSize, ndr_ptr_t type) { - UINT32 len, offset, len2; + size_t len, offset, len2; void* r; size_t required; @@ -163,9 +163,11 @@ static LONG smartcard_ndr_read(wStream* s, BYTE** data, size_t min, size_t eleme min, len); return STATUS_DATA_ERROR; } - len *= elementSize; - if (Stream_GetRemainingLength(s) < len) + if (len > SIZE_MAX / 2) + return STATUS_BUFFER_TOO_SMALL; + + if (Stream_GetRemainingLength(s) / elementSize < len) { WLog_ERR(TAG, "Short data while trying to read data from NDR pointer, expected %" PRIu32 @@ -173,6 +175,7 @@ static LONG smartcard_ndr_read(wStream* s, BYTE** data, size_t min, size_t eleme len, Stream_GetRemainingLength(s)); return STATUS_BUFFER_TOO_SMALL; } + len *= elementSize; r = calloc(len + 1, sizeof(CHAR)); if (!r) diff --git a/channels/urbdrc/client/data_transfer.c b/channels/urbdrc/client/data_transfer.c index 25918b8a6..30def2298 100644 --- a/channels/urbdrc/client/data_transfer.c +++ b/channels/urbdrc/client/data_transfer.c @@ -234,10 +234,11 @@ static UINT urbdrc_process_io_control(IUDEVICE* pdev, URBDRC_CHANNEL_CALLBACK* c Stream_Read_UINT32(s, IoControlCode); Stream_Read_UINT32(s, InputBufferSize); - if (Stream_GetRemainingLength(s) < InputBufferSize + 8) + if (!Stream_SafeSeek(s, InputBufferSize)) + return ERROR_INVALID_DATA; + if (Stream_GetRemainingLength(s) < 8ULL) return ERROR_INVALID_DATA; - Stream_Seek(s, InputBufferSize); Stream_Read_UINT32(s, OutputBufferSize); Stream_Read_UINT32(s, RequestId); InterfaceId = ((STREAM_ID_PROXY << 30) | pdev->get_ReqCompletion(pdev)); @@ -315,10 +316,10 @@ static UINT urbdrc_process_internal_io_control(IUDEVICE* pdev, URBDRC_CHANNEL_CA Stream_Read_UINT32(s, IoControlCode); Stream_Read_UINT32(s, InputBufferSize); - if (Stream_GetRemainingLength(s) < InputBufferSize + 8) + if (!Stream_SafeSeek(s, InputBufferSize)) + return ERROR_INVALID_DATA; + if (Stream_GetRemainingLength(s) < 8ULL) return ERROR_INVALID_DATA; - - Stream_Seek(s, InputBufferSize); Stream_Read_UINT32(s, OutputBufferSize); Stream_Read_UINT32(s, RequestId); InterfaceId = ((STREAM_ID_PROXY << 30) | pdev->get_ReqCompletion(pdev)); @@ -398,7 +399,8 @@ static UINT urb_select_configuration(IUDEVICE* pdev, URBDRC_CHANNEL_CALLBACK* ca int transferDir) { MSUSB_CONFIG_DESCRIPTOR* MsConfig = NULL; - UINT32 out_size, InterfaceId, NumInterfaces, usbd_status = 0; + size_t out_size; + UINT32 InterfaceId, NumInterfaces, usbd_status = 0; BYTE ConfigurationDescriptorIsValid; wStream* out; int MsOutSize = 0; @@ -452,6 +454,9 @@ static UINT urb_select_configuration(IUDEVICE* pdev, URBDRC_CHANNEL_CALLBACK* ca if (MsConfig) MsOutSize = MsConfig->MsOutSize; + if (MsOutSize > SIZE_MAX - 36) + return ERROR_INVALID_DATA; + if (MsOutSize > 0) out_size = 36 + MsOutSize; else @@ -807,7 +812,8 @@ static UINT urb_control_descriptor_request(IUDEVICE* pdev, URBDRC_CHANNEL_CALLBA wStream* s, UINT32 RequestField, UINT32 MessageId, IUDEVMAN* udevman, BYTE func_recipient, int transferDir) { - UINT32 out_size, InterfaceId, OutputBufferSize, usbd_status; + size_t out_size; + UINT32 InterfaceId, OutputBufferSize, usbd_status; BYTE bmRequestType, desc_index, desc_type; UINT16 langId; wStream* out; @@ -831,14 +837,15 @@ static UINT urb_control_descriptor_request(IUDEVICE* pdev, URBDRC_CHANNEL_CALLBA Stream_Read_UINT8(s, desc_type); Stream_Read_UINT16(s, langId); Stream_Read_UINT32(s, OutputBufferSize); - + if (OutputBufferSize > UINT32_MAX - 36) + return ERROR_INVALID_DATA; if (transferDir == USBD_TRANSFER_DIRECTION_OUT) { if (Stream_GetRemainingLength(s) < OutputBufferSize) return ERROR_INVALID_DATA; } - out_size = 36 + OutputBufferSize; + out_size = 36ULL + OutputBufferSize; out = Stream_New(NULL, out_size); if (!out) @@ -885,7 +892,8 @@ static UINT urb_control_get_status_request(IUDEVICE* pdev, URBDRC_CHANNEL_CALLBA wStream* s, UINT32 RequestField, UINT32 MessageId, IUDEVMAN* udevman, BYTE func_recipient, int transferDir) { - UINT32 out_size, InterfaceId, OutputBufferSize, usbd_status; + size_t out_size; + UINT32 InterfaceId, OutputBufferSize, usbd_status; UINT16 Index; BYTE bmRequestType; wStream* out; @@ -915,7 +923,9 @@ static UINT urb_control_get_status_request(IUDEVICE* pdev, URBDRC_CHANNEL_CALLBA Stream_Read_UINT16(s, Index); /** Index */ Stream_Seek(s, 2); Stream_Read_UINT32(s, OutputBufferSize); - out_size = 36 + OutputBufferSize; + if (OutputBufferSize > UINT32_MAX - 36) + return ERROR_INVALID_DATA; + out_size = 36ULL + OutputBufferSize; out = Stream_New(NULL, out_size); if (!out) @@ -970,6 +980,8 @@ static UINT urb_control_vendor_or_class_request(IUDEVICE* pdev, URBDRC_CHANNEL_C Stream_Read_UINT16(s, Index); /** index */ Stream_Read_UINT16(s, Padding); /** Padding */ Stream_Read_UINT32(s, OutputBufferSize); + if (OutputBufferSize > UINT32_MAX - 36) + return ERROR_INVALID_DATA; if (transferDir == USBD_TRANSFER_DIRECTION_OUT) { @@ -977,7 +989,7 @@ static UINT urb_control_vendor_or_class_request(IUDEVICE* pdev, URBDRC_CHANNEL_C return ERROR_INVALID_DATA; } - out_size = 36 + OutputBufferSize; + out_size = 36ULL + OutputBufferSize; out = Stream_New(NULL, out_size); if (!out) @@ -1022,7 +1034,8 @@ static UINT urb_os_feature_descriptor_request(IUDEVICE* pdev, URBDRC_CHANNEL_CAL wStream* s, UINT32 RequestField, UINT32 MessageId, IUDEVMAN* udevman, int transferDir) { - UINT32 out_size, InterfaceId, OutputBufferSize, usbd_status; + size_t out_size; + UINT32 InterfaceId, OutputBufferSize, usbd_status; BYTE Recipient, InterfaceNumber, Ms_PageIndex; UINT16 Ms_featureDescIndex; wStream* out; @@ -1050,6 +1063,8 @@ static UINT urb_os_feature_descriptor_request(IUDEVICE* pdev, URBDRC_CHANNEL_CAL Stream_Read_UINT16(s, Ms_featureDescIndex); /** Ms_featureDescIndex */ Stream_Seek(s, 3); /* Padding 2 */ Stream_Read_UINT32(s, OutputBufferSize); + if (OutputBufferSize > UINT32_MAX - 36) + return ERROR_INVALID_DATA; switch (transferDir) { @@ -1064,7 +1079,7 @@ static UINT urb_os_feature_descriptor_request(IUDEVICE* pdev, URBDRC_CHANNEL_CAL } InterfaceId = ((STREAM_ID_PROXY << 30) | pdev->get_ReqCompletion(pdev)); - out_size = 36 + OutputBufferSize; + out_size = 36ULL + OutputBufferSize; out = Stream_New(NULL, out_size); if (!out) @@ -1245,7 +1260,8 @@ static UINT urb_control_get_configuration_request(IUDEVICE* pdev, URBDRC_CHANNEL wStream* s, UINT32 RequestField, UINT32 MessageId, IUDEVMAN* udevman, int transferDir) { - UINT32 out_size, InterfaceId, OutputBufferSize, usbd_status; + size_t out_size; + UINT32 InterfaceId, OutputBufferSize, usbd_status; wStream* out; URBDRC_PLUGIN* urbdrc; const BOOL noAck = (RequestField & 0x80000000U) != 0; @@ -1271,7 +1287,9 @@ static UINT urb_control_get_configuration_request(IUDEVICE* pdev, URBDRC_CHANNEL return ERROR_INVALID_DATA; Stream_Read_UINT32(s, OutputBufferSize); - out_size = 36 + OutputBufferSize; + if (OutputBufferSize > UINT32_MAX - 36) + return ERROR_INVALID_DATA; + out_size = 36ULL + OutputBufferSize; out = Stream_New(NULL, out_size); if (!out) @@ -1298,7 +1316,8 @@ static UINT urb_control_get_interface_request(IUDEVICE* pdev, URBDRC_CHANNEL_CAL wStream* s, UINT32 RequestField, UINT32 MessageId, IUDEVMAN* udevman, int transferDir) { - UINT32 out_size, InterfaceId, OutputBufferSize, usbd_status; + size_t out_size; + UINT32 InterfaceId, OutputBufferSize, usbd_status; UINT16 interface; wStream* out; URBDRC_PLUGIN* urbdrc; @@ -1327,7 +1346,9 @@ static UINT urb_control_get_interface_request(IUDEVICE* pdev, URBDRC_CHANNEL_CAL Stream_Read_UINT16(s, interface); Stream_Seek(s, 2); Stream_Read_UINT32(s, OutputBufferSize); - out_size = 36 + OutputBufferSize; + if (OutputBufferSize > UINT32_MAX - 36) + return ERROR_INVALID_DATA; + out_size = 36ULL + OutputBufferSize; out = Stream_New(NULL, out_size); if (!out) @@ -1376,7 +1397,8 @@ static UINT urb_control_feature_request(IUDEVICE* pdev, URBDRC_CHANNEL_CALLBACK* Stream_Read_UINT16(s, FeatureSelector); Stream_Read_UINT16(s, Index); Stream_Read_UINT32(s, OutputBufferSize); - + if (OutputBufferSize > UINT32_MAX - 36) + return ERROR_INVALID_DATA; switch (transferDir) { case USBD_TRANSFER_DIRECTION_OUT: @@ -1389,7 +1411,7 @@ static UINT urb_control_feature_request(IUDEVICE* pdev, URBDRC_CHANNEL_CALLBACK* break; } - out = Stream_New(NULL, 36 + OutputBufferSize); + out = Stream_New(NULL, 36ULL + OutputBufferSize); if (!out) return ERROR_OUTOFMEMORY; diff --git a/channels/urbdrc/client/libusb/libusb_udevman.c b/channels/urbdrc/client/libusb/libusb_udevman.c index 01eda4a31..973d9c193 100644 --- a/channels/urbdrc/client/libusb/libusb_udevman.c +++ b/channels/urbdrc/client/libusb/libusb_udevman.c @@ -25,6 +25,7 @@ #include <winpr/crt.h> #include <winpr/cmdline.h> +#include <winpr/collections.h> #include <freerdp/addin.h> @@ -55,6 +56,14 @@ _man->iface.get_##_arg = udevman_get_##_arg; \ _man->iface.set_##_arg = udevman_set_##_arg +typedef struct _VID_PID_PAIR VID_PID_PAIR; + +struct _VID_PID_PAIR +{ + UINT16 vid; + UINT16 pid; +}; + typedef struct _UDEVMAN UDEVMAN; struct _UDEVMAN @@ -65,6 +74,9 @@ struct _UDEVMAN IUDEVICE* head; /* head device in linked list */ IUDEVICE* tail; /* tail device in linked list */ + LPSTR devices_vid_pid; + LPSTR devices_addr; + wArrayList* hotplug_vid_pids; UINT16 flags; UINT32 device_num; UINT32 next_device_id; @@ -301,6 +313,9 @@ static BOOL udevman_unregister_all_udevices(IUDEVMAN* idevman) if (!idevman) return FALSE; + if (!udevman->head) + return TRUE; + idevman->loading_lock(idevman); idevman->rewind(idevman); @@ -418,13 +433,20 @@ static void udevman_free(IUDEVMAN* idevman) return; udevman->running = FALSE; - WaitForSingleObject(udevman->thread, INFINITE); + if (udevman->thread) + { + WaitForSingleObject(udevman->thread, INFINITE); + CloseHandle(udevman->thread); + } udevman_unregister_all_udevices(idevman); - CloseHandle(udevman->devman_loading); - CloseHandle(udevman->thread); + + if (udevman->devman_loading) + CloseHandle(udevman->devman_loading); + libusb_exit(udevman->context); + ArrayList_Free(udevman->hotplug_vid_pids); free(udevman); } @@ -531,8 +553,9 @@ static BOOL device_is_filtered(struct libusb_device* dev, static int hotplug_callback(struct libusb_context* ctx, struct libusb_device* dev, libusb_hotplug_event event, void* user_data) { + VID_PID_PAIR pair; struct libusb_device_descriptor desc; - IUDEVMAN* idevman = (IUDEVMAN*)user_data; + UDEVMAN* udevman = (UDEVMAN*)user_data; const uint8_t bus = libusb_get_bus_number(dev); const uint8_t addr = libusb_get_device_address(dev); int rc = libusb_get_device_descriptor(dev, &desc); @@ -542,18 +565,23 @@ static int hotplug_callback(struct libusb_context* ctx, struct libusb_device* de if (rc != LIBUSB_SUCCESS) return rc; - if (device_is_filtered(dev, &desc, event)) - return 0; - switch (event) { case LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED: - if (idevman->isAutoAdd(idevman)) - add_device(idevman, DEVICE_ADD_FLAG_ALL, bus, addr, desc.idVendor, desc.idProduct); + pair.vid = desc.idVendor; + pair.pid = desc.idProduct; + if ((ArrayList_Contains(udevman->hotplug_vid_pids, &pair)) || + (udevman->iface.isAutoAdd(&udevman->iface) && + !device_is_filtered(dev, &desc, event))) + { + add_device(&udevman->iface, DEVICE_ADD_FLAG_ALL, bus, addr, desc.idVendor, + desc.idProduct); + } break; case LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: - del_device(idevman, DEVICE_ADD_FLAG_ALL, bus, addr, desc.idVendor, desc.idProduct); + del_device(&udevman->iface, DEVICE_ADD_FLAG_ALL, bus, addr, desc.idVendor, + desc.idProduct); break; default: @@ -575,27 +603,12 @@ static BOOL udevman_initialize(IUDEVMAN* idevman, UINT32 channelId) return TRUE; } -static void udevman_load_interface(UDEVMAN* udevman) +static BOOL udevman_vid_pid_pair_equals(const void* objA, const void* objB) { - /* standard */ - udevman->iface.free = udevman_free; - /* manage devices */ - udevman->iface.rewind = udevman_rewind; - udevman->iface.get_next = udevman_get_next; - udevman->iface.has_next = udevman_has_next; - udevman->iface.register_udevice = udevman_register_udevice; - udevman->iface.unregister_udevice = udevman_unregister_udevice; - udevman->iface.get_udevice_by_UsbDevice = udevman_get_udevice_by_UsbDevice; - /* Extension */ - udevman->iface.isAutoAdd = udevman_is_auto_add; - /* Basic state */ - BASIC_STATE_FUNC_REGISTER(device_num, udevman); - BASIC_STATE_FUNC_REGISTER(next_device_id, udevman); + const VID_PID_PAIR* a = objA; + const VID_PID_PAIR* b = objB; - /* control semaphore or mutex lock */ - udevman->iface.loading_lock = udevman_loading_lock; - udevman->iface.loading_unlock = udevman_loading_unlock; - udevman->iface.initialize = udevman_initialize; + return (a->vid == b->vid) && (a->pid == b->pid); } static BOOL udevman_parse_device_id_addr(const char** str, UINT16* id1, UINT16* id2, UINT16 max, @@ -606,7 +619,6 @@ static BOOL udevman_parse_device_id_addr(const char** str, UINT16* id1, UINT16* unsigned long rc; rc = strtoul(*str, &mid, 16); - /* These casts are safe, because strtoul only uses it to return a pointer */ if ((mid == *str) || (*mid != split_sign) || (rc > max)) return FALSE; @@ -631,54 +643,66 @@ static BOOL udevman_parse_device_id_addr(const char** str, UINT16* id1, UINT16* return FALSE; } -static BOOL urbdrc_udevman_register_devices(UDEVMAN* udevman, const char* devices) +static BOOL urbdrc_udevman_register_devices(UDEVMAN* udevman, const char* devices, BOOL add_by_addr) { const char* pos = devices; + VID_PID_PAIR* idpair; UINT16 id1, id2; while (*pos != '\0') { - if (udevman->flags & UDEVMAN_FLAG_ADD_BY_VID_PID) + if (!udevman_parse_device_id_addr(&pos, &id1, &id2, (add_by_addr) ? UINT8_MAX : UINT16_MAX, + ':', '#')) { - if (!udevman_parse_device_id_addr(&pos, &id1, &id2, UINT16_MAX, ':', '#')) - return FALSE; - - add_device(&udevman->iface, DEVICE_ADD_FLAG_VENDOR | DEVICE_ADD_FLAG_PRODUCT, 0, 0, id1, - id2); + WLog_ERR(TAG, "Invalid device argument: \"%s\"", devices); + return COMMAND_LINE_ERROR_UNEXPECTED_VALUE; } - else if (udevman->flags & UDEVMAN_FLAG_ADD_BY_ADDR) - { - if (!udevman_parse_device_id_addr(&pos, &id1, &id2, UINT8_MAX, ':', '#')) - return FALSE; + if (add_by_addr) + { add_device(&udevman->iface, DEVICE_ADD_FLAG_BUS | DEVICE_ADD_FLAG_DEV, (UINT8)id1, (UINT8)id2, 0, 0); } + else + { + idpair = malloc(sizeof(VID_PID_PAIR)); + if (!idpair) + return CHANNEL_RC_NO_MEMORY; + idpair->vid = id1; + idpair->pid = id2; + if (ArrayList_Add(udevman->hotplug_vid_pids, idpair) == -1) + { + free(idpair); + return CHANNEL_RC_NO_MEMORY; + } + + add_device(&udevman->iface, DEVICE_ADD_FLAG_VENDOR | DEVICE_ADD_FLAG_PRODUCT, 0, 0, id1, + id2); + } } - return TRUE; + return CHANNEL_RC_OK; } static UINT urbdrc_udevman_parse_addin_args(UDEVMAN* udevman, ADDIN_ARGV* args) { int status; - DWORD flags; LPSTR devices = NULL; - const UINT16 mask = UDEVMAN_FLAG_ADD_BY_VID_PID | UDEVMAN_FLAG_ADD_BY_ADDR; COMMAND_LINE_ARGUMENT_A* arg; COMMAND_LINE_ARGUMENT_A urbdrc_udevman_args[] = { { "dbg", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "debug" }, { "dev", COMMAND_LINE_VALUE_REQUIRED, "<devices>", NULL, NULL, -1, NULL, "device list" }, - { "id", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, + { "id", COMMAND_LINE_VALUE_OPTIONAL, "", NULL, BoolValueFalse, -1, NULL, "FLAG_ADD_BY_VID_PID" }, - { "addr", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "FLAG_ADD_BY_ADDR" }, + { "addr", COMMAND_LINE_VALUE_OPTIONAL, "", NULL, BoolValueFalse, -1, NULL, + "FLAG_ADD_BY_ADDR" }, { "auto", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "FLAG_ADD_BY_AUTO" }, { NULL, 0, NULL, NULL, NULL, -1, NULL, NULL } }; - flags = COMMAND_LINE_SIGIL_NONE | COMMAND_LINE_SEPARATOR_COLON; - status = CommandLineParseArgumentsA(args->argc, args->argv, urbdrc_udevman_args, flags, udevman, - NULL, NULL); + status = CommandLineParseArgumentsA(args->argc, args->argv, urbdrc_udevman_args, + COMMAND_LINE_SIGIL_NONE | COMMAND_LINE_SEPARATOR_COLON, + udevman, NULL, NULL); if (status != CHANNEL_RC_OK) return status; @@ -687,7 +711,7 @@ static UINT urbdrc_udevman_parse_addin_args(UDEVMAN* udevman, ADDIN_ARGV* args) do { - if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT)) + if (!(arg->Flags & COMMAND_LINE_ARGUMENT_PRESENT)) continue; CommandLineSwitchStart(arg) CommandLineSwitchCase(arg, "dbg") @@ -700,11 +724,17 @@ static UINT urbdrc_udevman_parse_addin_args(UDEVMAN* udevman, ADDIN_ARGV* args) } CommandLineSwitchCase(arg, "id") { - udevman->flags = UDEVMAN_FLAG_ADD_BY_VID_PID; + if (arg->Value) + udevman->devices_vid_pid = arg->Value; + else + udevman->flags = UDEVMAN_FLAG_ADD_BY_VID_PID; } CommandLineSwitchCase(arg, "addr") { - udevman->flags = UDEVMAN_FLAG_ADD_BY_ADDR; + if (arg->Value) + udevman->devices_addr = arg->Value; + else + udevman->flags = UDEVMAN_FLAG_ADD_BY_ADDR; } CommandLineSwitchCase(arg, "auto") { @@ -716,20 +746,59 @@ static UINT urbdrc_udevman_parse_addin_args(UDEVMAN* udevman, ADDIN_ARGV* args) CommandLineSwitchEnd(arg) } while ((arg = CommandLineFindNextArgumentA(arg)) != NULL); - /* Can not add devices by address and VID/PID */ - if ((udevman->flags & mask) == mask) - return COMMAND_LINE_ERROR_UNEXPECTED_VALUE; - - /* Add listed devices after we know the format of addressing */ if (devices) { - if (!urbdrc_udevman_register_devices(udevman, devices)) - return COMMAND_LINE_ERROR_UNEXPECTED_VALUE; + if (udevman->flags & UDEVMAN_FLAG_ADD_BY_VID_PID) + udevman->devices_vid_pid = devices; + else if (udevman->flags & UDEVMAN_FLAG_ADD_BY_ADDR) + udevman->devices_addr = devices; } return CHANNEL_RC_OK; } +static UINT udevman_listener_created_callback(IUDEVMAN* iudevman) +{ + UINT status; + UDEVMAN* udevman = (UDEVMAN*)iudevman; + + if (udevman->devices_vid_pid) + { + status = urbdrc_udevman_register_devices(udevman, udevman->devices_vid_pid, FALSE); + if (status != CHANNEL_RC_OK) + return status; + } + + if (udevman->devices_addr) + return urbdrc_udevman_register_devices(udevman, udevman->devices_addr, TRUE); + + return CHANNEL_RC_OK; +} + +static void udevman_load_interface(UDEVMAN* udevman) +{ + /* standard */ + udevman->iface.free = udevman_free; + /* manage devices */ + udevman->iface.rewind = udevman_rewind; + udevman->iface.get_next = udevman_get_next; + udevman->iface.has_next = udevman_has_next; + udevman->iface.register_udevice = udevman_register_udevice; + udevman->iface.unregister_udevice = udevman_unregister_udevice; + udevman->iface.get_udevice_by_UsbDevice = udevman_get_udevice_by_UsbDevice; + /* Extension */ + udevman->iface.isAutoAdd = udevman_is_auto_add; + /* Basic state */ + BASIC_STATE_FUNC_REGISTER(device_num, udevman); + BASIC_STATE_FUNC_REGISTER(next_device_id, udevman); + + /* control semaphore or mutex lock */ + udevman->iface.loading_lock = udevman_loading_lock; + udevman->iface.loading_unlock = udevman_loading_unlock; + udevman->iface.initialize = udevman_initialize; + udevman->iface.listener_created_callback = udevman_listener_created_callback; +} + static BOOL poll_libusb_events(UDEVMAN* udevman) { int rc = LIBUSB_SUCCESS; @@ -812,6 +881,12 @@ UINT freerdp_urbdrc_client_subsystem_entry(PFREERDP_URBDRC_SERVICE_ENTRY_POINTS if (!udevman) goto fail; + udevman->hotplug_vid_pids = ArrayList_New(TRUE); + if (!udevman->hotplug_vid_pids) + goto fail; + ArrayList_Object(udevman->hotplug_vid_pids)->fnObjectFree = free; + ArrayList_Object(udevman->hotplug_vid_pids)->fnObjectEquals = udevman_vid_pid_pair_equals; + udevman->next_device_id = BASE_USBDEVICE_NUM; udevman->iface.plugin = pEntryPoints->plugin; rc = libusb_init(&udevman->context); @@ -821,7 +896,7 @@ UINT freerdp_urbdrc_client_subsystem_entry(PFREERDP_URBDRC_SERVICE_ENTRY_POINTS #ifdef _WIN32 #if LIBUSB_API_VERSION >= 0x01000106 - /* Prefer usbDK backend on windows. Not uspported on other platforms. */ + /* Prefer usbDK backend on windows. Not supported on other platforms. */ rc = libusb_set_option(udevman->context, LIBUSB_OPTION_USE_USBDK); switch (rc) { diff --git a/channels/urbdrc/client/urbdrc_main.c b/channels/urbdrc/client/urbdrc_main.c index cf5673473..6dbdc5a41 100644 --- a/channels/urbdrc/client/urbdrc_main.c +++ b/channels/urbdrc/client/urbdrc_main.c @@ -265,7 +265,8 @@ static UINT urdbrc_send_usb_device_add(URBDRC_CHANNEL_CALLBACK* callback, IUDEVI const UINT16 bcdDevice = (UINT16)pdev->query_device_descriptor(pdev, BCD_DEVICE); sprintf_s(HardwareIds[1], DEVICE_HARDWARE_ID_SIZE, "USB\\VID_%04" PRIX16 "&PID_%04" PRIX16 "", idVendor, idProduct); - sprintf_s(HardwareIds[0], DEVICE_HARDWARE_ID_SIZE, "%s&REV_%04" PRIX16 "", HardwareIds[1], + sprintf_s(HardwareIds[0], DEVICE_HARDWARE_ID_SIZE, + "USB\\VID_%04" PRIX16 "&PID_%04" PRIX16 "&REV_%04" PRIX16 "", idVendor, idProduct, bcdDevice); } { @@ -277,18 +278,20 @@ static UINT urdbrc_send_usb_device_add(URBDRC_CHANNEL_CALLBACK* callback, IUDEVI { sprintf_s(CompatibilityIds[2], DEVICE_COMPATIBILITY_ID_SIZE, "USB\\Class_%02" PRIX8 "", bDeviceClass); - sprintf_s(CompatibilityIds[1], DEVICE_COMPATIBILITY_ID_SIZE, "%s&SubClass_%02" PRIX8 "", - CompatibilityIds[2], bDeviceSubClass); - sprintf_s(CompatibilityIds[0], DEVICE_COMPATIBILITY_ID_SIZE, "%s&Prot_%02" PRIX8 "", - CompatibilityIds[1], bDeviceProtocol); + sprintf_s(CompatibilityIds[1], DEVICE_COMPATIBILITY_ID_SIZE, + "USB\\Class_%02" PRIX8 "&SubClass_%02" PRIX8 "", bDeviceClass, + bDeviceSubClass); + sprintf_s(CompatibilityIds[0], DEVICE_COMPATIBILITY_ID_SIZE, + "USB\\Class_%02" PRIX8 "&SubClass_%02" PRIX8 "&Prot_%02" PRIX8 "", + bDeviceClass, bDeviceSubClass, bDeviceProtocol); } else { sprintf_s(CompatibilityIds[2], DEVICE_COMPATIBILITY_ID_SIZE, "USB\\DevClass_00"); - sprintf_s(CompatibilityIds[1], DEVICE_COMPATIBILITY_ID_SIZE, "%s&SubClass_00", - CompatibilityIds[2]); - sprintf_s(CompatibilityIds[0], DEVICE_COMPATIBILITY_ID_SIZE, "%s&Prot_00", - CompatibilityIds[1]); + sprintf_s(CompatibilityIds[1], DEVICE_COMPATIBILITY_ID_SIZE, + "USB\\DevClass_00&SubClass_00"); + sprintf_s(CompatibilityIds[0], DEVICE_COMPATIBILITY_ID_SIZE, + "USB\\DevClass_00&SubClass_00&Prot_00"); } } func_instance_id_generate(pdev, strInstanceId, DEVICE_INSTANCE_STR_SIZE); @@ -663,7 +666,9 @@ static UINT urbdrc_on_new_channel_connection(IWTSListenerCallback* pListenerCall */ static UINT urbdrc_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManager* pChannelMgr) { + UINT status; URBDRC_PLUGIN* urbdrc = (URBDRC_PLUGIN*)pPlugin; + IUDEVMAN* udevman = urbdrc->udevman; char channelName[sizeof(URBDRC_CHANNEL_NAME)] = { URBDRC_CHANNEL_NAME }; if (!urbdrc) @@ -681,8 +686,15 @@ static UINT urbdrc_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMana /* [MS-RDPEUSB] 2.1 Transport defines the channel name in uppercase letters */ CharUpperA(channelName); - return pChannelMgr->CreateListener(pChannelMgr, channelName, 0, - &urbdrc->listener_callback->iface, NULL); + status = pChannelMgr->CreateListener(pChannelMgr, channelName, 0, + &urbdrc->listener_callback->iface, NULL); + if (status != CHANNEL_RC_OK) + return status; + + if (udevman->listener_created_callback) + return udevman->listener_created_callback(udevman); + + return CHANNEL_RC_OK; } /** diff --git a/channels/urbdrc/client/urbdrc_main.h b/channels/urbdrc/client/urbdrc_main.h index 749aaf872..2a750d64d 100644 --- a/channels/urbdrc/client/urbdrc_main.h +++ b/channels/urbdrc/client/urbdrc_main.h @@ -216,6 +216,7 @@ struct _IUDEVMAN void (*loading_lock)(IUDEVMAN* idevman); void (*loading_unlock)(IUDEVMAN* idevman); BOOL (*initialize)(IUDEVMAN* idevman, UINT32 channelId); + UINT (*listener_created_callback)(IUDEVMAN* idevman); IWTSPlugin* plugin; UINT32 controlChannelId; diff --git a/channels/urbdrc/common/msusb.c b/channels/urbdrc/common/msusb.c index 45c677370..bb517ce5d 100644 --- a/channels/urbdrc/common/msusb.c +++ b/channels/urbdrc/common/msusb.c @@ -64,7 +64,7 @@ static MSUSB_PIPE_DESCRIPTOR** msusb_mspipes_read(wStream* s, UINT32 NumberOfPip UINT32 pnum; MSUSB_PIPE_DESCRIPTOR** MsPipes; - if (Stream_GetRemainingCapacity(s) < 12 * NumberOfPipes) + if (Stream_GetRemainingCapacity(s) / 12 < NumberOfPipes) return NULL; MsPipes = (MSUSB_PIPE_DESCRIPTOR**)calloc(NumberOfPipes, sizeof(MSUSB_PIPE_DESCRIPTOR*)); @@ -317,7 +317,7 @@ MSUSB_CONFIG_DESCRIPTOR* msusb_msconfig_read(wStream* s, UINT32 NumInterfaces) MSUSB_CONFIG_DESCRIPTOR* MsConfig; BYTE lenConfiguration, typeConfiguration; - if (Stream_GetRemainingCapacity(s) < 6 + NumInterfaces * 2) + if (Stream_GetRemainingCapacity(s) < 6ULL + NumInterfaces * 2ULL) return NULL; MsConfig = msusb_msconfig_new(); diff --git a/channels/video/client/video_main.c b/channels/video/client/video_main.c index a161a1143..1efadb399 100644 --- a/channels/video/client/video_main.c +++ b/channels/video/client/video_main.c @@ -220,8 +220,14 @@ error_frames: static PresentationContext* PresentationContext_new(VideoClientContext* video, BYTE PresentationId, UINT32 x, UINT32 y, UINT32 width, UINT32 height) { + size_t s; VideoClientContextPriv* priv = video->priv; - PresentationContext* ret = calloc(1, sizeof(*ret)); + PresentationContext* ret; + s = width * height * 4ULL; + if (s > INT32_MAX) + return NULL; + + ret = calloc(1, sizeof(*ret)); if (!ret) return NULL; @@ -243,7 +249,7 @@ static PresentationContext* PresentationContext_new(VideoClientContext* video, B goto error_currentSample; } - ret->surfaceData = BufferPool_Take(priv->surfacePool, width * height * 4); + ret->surfaceData = BufferPool_Take(priv->surfacePool, s); if (!ret->surfaceData) { WLog_ERR(TAG, "unable to allocate surfaceData"); diff --git a/client/Android/Studio/aFreeRDP/build.gradle b/client/Android/Studio/aFreeRDP/build.gradle index f5facf9d2..fc3dba21a 100644 --- a/client/Android/Studio/aFreeRDP/build.gradle +++ b/client/Android/Studio/aFreeRDP/build.gradle @@ -9,7 +9,7 @@ android { minSdkVersion 21 targetSdkVersion 28 vectorDrawables.useSupportLibrary = true - versionCode = 15 + versionCode = rootProject.ext.versionCode versionName = rootProject.ext.versionName } diff --git a/client/Android/Studio/build.gradle b/client/Android/Studio/build.gradle index 694fa38cc..e944b11d3 100644 --- a/client/Android/Studio/build.gradle +++ b/client/Android/Studio/build.gradle @@ -29,9 +29,11 @@ def getVersionName = { -> ext { versionName = properties.get('VERSION_NAME', getVersionName()) + versionCode = properties.get('VERSION_CODE', 16) println '----------------- Project configuration -------------------' println 'VERSION_NAME: ' + versionName + println 'VERSION_CODE: ' + versionCode println 'RELEASE_STORE_FILE: '+ RELEASE_STORE_FILE println 'RELEASE_KEY_ALIAS: '+ RELEASE_KEY_ALIAS println '-----------------------------------------------------------' diff --git a/client/Android/Studio/freeRDPCore/build.gradle b/client/Android/Studio/freeRDPCore/build.gradle index 7b641a0db..c275b398c 100644 --- a/client/Android/Studio/freeRDPCore/build.gradle +++ b/client/Android/Studio/freeRDPCore/build.gradle @@ -8,7 +8,7 @@ android { minSdkVersion 21 targetSdkVersion 28 vectorDrawables.useSupportLibrary = true - versionCode = 15 + versionCode = rootProject.ext.versionCode versionName = rootProject.ext.versionName } diff --git a/client/Android/android_cliprdr.c b/client/Android/android_cliprdr.c index 5e9f79182..414a25d81 100644 --- a/client/Android/android_cliprdr.c +++ b/client/Android/android_cliprdr.c @@ -81,6 +81,7 @@ UINT android_cliprdr_send_client_format_list(CliprdrClientContext* cliprdr) formatList.msgFlags = CB_RESPONSE_OK; formatList.numFormats = numFormats; formatList.formats = formats; + formatList.msgType = CB_FORMAT_LIST; if (!afc->cliprdr->ClientFormatList) goto fail; diff --git a/client/Android/android_freerdp.c b/client/Android/android_freerdp.c index 942ead16c..7d332c731 100644 --- a/client/Android/android_freerdp.c +++ b/client/Android/android_freerdp.c @@ -56,7 +56,7 @@ #define TAG CLIENT_TAG("android") /* Defines the JNI version supported by this library. */ -#define FREERDP_JNI_VERSION "2.1.0-dev" +#define FREERDP_JNI_VERSION "2.1.0" static void android_OnChannelConnectedEventHandler(void* context, ChannelConnectedEventArgs* e) { diff --git a/client/Mac/Clipboard.m b/client/Mac/Clipboard.m index a34e5a85d..a57725f8b 100644 --- a/client/Mac/Clipboard.m +++ b/client/Mac/Clipboard.m @@ -28,7 +28,7 @@ int mac_cliprdr_send_client_format_list(CliprdrClientContext *cliprdr) UINT32 *pFormatIds; const char *formatName; CLIPRDR_FORMAT *formats; - CLIPRDR_FORMAT_LIST formatList; + CLIPRDR_FORMAT_LIST formatList = { 0 }; mfContext *mfc = (mfContext *)cliprdr->custom; ZeroMemory(&formatList, sizeof(CLIPRDR_FORMAT_LIST)); @@ -56,6 +56,7 @@ int mac_cliprdr_send_client_format_list(CliprdrClientContext *cliprdr) formatList.msgFlags = CB_RESPONSE_OK; formatList.numFormats = numFormats; formatList.formats = formats; + formatList.msgType = CB_FORMAT_LIST; mfc->cliprdr->ClientFormatList(mfc->cliprdr, &formatList); diff --git a/client/Wayland/wlf_cliprdr.c b/client/Wayland/wlf_cliprdr.c index c88b32a22..dff599844 100644 --- a/client/Wayland/wlf_cliprdr.c +++ b/client/Wayland/wlf_cliprdr.c @@ -174,6 +174,7 @@ static UINT wlf_cliprdr_send_client_format_list(wfClipboard* clipboard) formatList.msgFlags = CB_RESPONSE_OK; formatList.numFormats = (UINT32)clipboard->numClientFormats; formatList.formats = clipboard->clientFormats; + formatList.msgType = CB_FORMAT_LIST; return clipboard->context->ClientFormatList(clipboard->context, &formatList); } @@ -624,6 +625,7 @@ wlf_cliprdr_server_format_data_request(CliprdrClientContext* context, rc = ERROR_INTERNAL_ERROR; else { + cdata = NULL; cnv = ConvertToUnicode(CP_UTF8, 0, (LPCSTR)data, (int)size, &cdata, 0); free(data); data = NULL; diff --git a/client/Wayland/wlf_input.c b/client/Wayland/wlf_input.c index e2c555e7c..afa8d4b51 100644 --- a/client/Wayland/wlf_input.c +++ b/client/Wayland/wlf_input.c @@ -171,9 +171,19 @@ BOOL wlf_handle_pointer_axis(freerdp* instance, const UwacPointerAxisEvent* ev) return FALSE; } - step = (uint32_t)abs(direction); - if (step > WheelRotationMask) - step = WheelRotationMask; + /* Wheel rotation steps: + * + * positive: 0 ... 0xFF -> slow ... fast + * negative: 0 ... 0xFF -> fast ... slow + */ + step = abs(direction); + if (step > 0xFF) + step = 0xFF; + + /* Negative rotation, so count down steps from top */ + if (flags & PTR_FLAGS_WHEEL_NEGATIVE) + step = 0xFF - step; + flags |= step; return freerdp_input_send_mouse_event(input, flags, (UINT16)x, (UINT16)y); diff --git a/client/Wayland/wlfreerdp.c b/client/Wayland/wlfreerdp.c index c7d63c90e..5086220d2 100644 --- a/client/Wayland/wlfreerdp.c +++ b/client/Wayland/wlfreerdp.c @@ -191,9 +191,9 @@ static BOOL wl_pre_connect(freerdp* instance) if (settings->Fullscreen) { // Use the resolution of the first display output - output = UwacDisplayGetOutput(context->display, 1); + output = UwacDisplayGetOutput(context->display, 0); - if (output != NULL && UwacOutputGetResolution(output, &resolution) == UWAC_SUCCESS) + if ((output != NULL) && (UwacOutputGetResolution(output, &resolution) == UWAC_SUCCESS)) { settings->DesktopWidth = (UINT32)resolution.width; settings->DesktopHeight = (UINT32)resolution.height; diff --git a/client/Windows/wf_cliprdr.c b/client/Windows/wf_cliprdr.c index b930f084b..18a5cd254 100644 --- a/client/Windows/wf_cliprdr.c +++ b/client/Windows/wf_cliprdr.c @@ -1235,7 +1235,7 @@ static UINT cliprdr_send_format_list(wfClipboard* clipboard) UINT32 formatId = 0; char formatName[1024]; CLIPRDR_FORMAT* formats = NULL; - CLIPRDR_FORMAT_LIST formatList; + CLIPRDR_FORMAT_LIST formatList = { 0 }; if (!clipboard) return ERROR_INTERNAL_ERROR; @@ -1287,6 +1287,7 @@ static UINT cliprdr_send_format_list(wfClipboard* clipboard) formatList.numFormats = numFormats; formatList.formats = formats; + formatList.msgType = CB_FORMAT_LIST; rc = clipboard->context->ClientFormatList(clipboard->context, &formatList); for (index = 0; index < numFormats; index++) diff --git a/client/Windows/wf_graphics.c b/client/Windows/wf_graphics.c index da1afcf48..8a146f3f8 100644 --- a/client/Windows/wf_graphics.c +++ b/client/Windows/wf_graphics.c @@ -238,7 +238,7 @@ static BOOL wf_Pointer_New(rdpContext* context, const rdpPointer* pointer) goto fail; info.hbmColor = wf_create_dib((wfContext*)context, pointer->width, pointer->height, - srcFormat, NULL, &pdata); + gdi->dstFormat, NULL, &pdata); if (!info.hbmColor) goto fail; diff --git a/client/X11/xf_cliprdr.c b/client/X11/xf_cliprdr.c index abcae72c8..21017db00 100644 --- a/client/X11/xf_cliprdr.c +++ b/client/X11/xf_cliprdr.c @@ -533,6 +533,7 @@ static void xf_cliprdr_get_requested_targets(xfClipboard* clipboard) formatList.msgFlags = CB_RESPONSE_OK; formatList.numFormats = numFormats; formatList.formats = formats; + formatList.msgType = CB_FORMAT_LIST; clipboard->context->ClientFormatList(clipboard->context, &formatList); xf_cliprdr_free_formats(formats, numFormats); } @@ -1100,6 +1101,7 @@ static UINT xf_cliprdr_send_client_format_list(xfClipboard* clipboard) formatList.msgFlags = CB_RESPONSE_OK; formatList.numFormats = numFormats; formatList.formats = formats; + formatList.msgType = CB_FORMAT_LIST; ret = clipboard->context->ClientFormatList(clipboard->context, &formatList); free(formats); diff --git a/client/common/cmdline.c b/client/common/cmdline.c index a1d46da7f..cdea23de0 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -454,7 +454,7 @@ BOOL freerdp_client_print_command_line_help_ex(int argc, char** argv, printf("\n"); printf("Multimedia Redirection: /video\n"); #ifdef CHANNEL_URBDRC_CLIENT - printf("USB Device Redirection: /usb:id,dev:054c:0268\n"); + printf("USB Device Redirection: /usb:id:054c:0268#4669:6e6b,addr:04:0c\n"); #endif printf("\n"); printf("For Gateways, the https_proxy environment variable is respected:\n"); @@ -3186,6 +3186,89 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (!settings->SmartcardLogon) activate_smartcard_logon_rdp(settings); } + + CommandLineSwitchCase(arg, "tune") + { + size_t x, count; + char** p = CommandLineParseCommaSeparatedValuesEx("tune", arg->Value, &count); + if (!p) + return COMMAND_LINE_ERROR; + for (x = 1; x < count; x++) + { + char* cur = p[x]; + char* sep = strchr(cur, ':'); + if (!sep) + { + free(p); + return COMMAND_LINE_ERROR; + } + *sep++ = '\0'; + if (!freerdp_settings_set_value_for_name(settings, cur, sep)) + { + free(p); + return COMMAND_LINE_ERROR; + } + } + + free(p); + } + CommandLineSwitchCase(arg, "tune-list") + { + size_t x; + SSIZE_T type = 0; + + printf("%s\t%50s\t%s\t%s", "<index>", "<key>", "<type>", "<default value>\n"); + for (x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++) + { + const char* name = freerdp_settings_get_name_for_key(x); + type = freerdp_settings_get_type_for_key(x); + + switch (type) + { + case RDP_SETTINGS_TYPE_BOOL: + printf("%" PRIuz "\t%50s\tBOOL\t%s\n", x, name, + freerdp_settings_get_bool(settings, x) ? "TRUE" : "FALSE"); + break; + case RDP_SETTINGS_TYPE_UINT16: + printf("%" PRIuz "\t%50s\tUINT16\t%" PRIu16 "\n", x, name, + freerdp_settings_get_uint16(settings, x)); + break; + case RDP_SETTINGS_TYPE_INT16: + printf("%" PRIuz "\t%50s\tINT16\t%" PRId16 "\n", x, name, + freerdp_settings_get_int16(settings, x)); + break; + case RDP_SETTINGS_TYPE_UINT32: + printf("%" PRIuz "\t%50s\tUINT32\t%" PRIu32 "\n", x, name, + freerdp_settings_get_uint32(settings, x)); + break; + case RDP_SETTINGS_TYPE_INT32: + printf("%" PRIuz "\t%50s\tINT32\t%" PRId32 "\n", x, name, + freerdp_settings_get_int32(settings, x)); + break; + case RDP_SETTINGS_TYPE_UINT64: + printf("%" PRIuz "\t%50s\tUINT64\t%" PRIu64 "\n", x, name, + freerdp_settings_get_uint64(settings, x)); + break; + case RDP_SETTINGS_TYPE_INT64: + printf("%" PRIuz "\t%50s\tINT64\t%" PRId64 "\n", x, name, + freerdp_settings_get_int64(settings, x)); + break; + case RDP_SETTINGS_TYPE_STRING: + printf("%" PRIuz "\t%50s\tSTRING\t%s" + "\n", + x, name, freerdp_settings_get_string(settings, x)); + break; + case RDP_SETTINGS_TYPE_POINTER: + printf("%" PRIuz "\t%50s\tPOINTER\t%p" + "\n", + x, name, freerdp_settings_get_pointer(settings, x)); + break; + default: + break; + } + } + return COMMAND_LINE_STATUS_PRINT; + } CommandLineSwitchDefault(arg) { } diff --git a/client/common/cmdline.h b/client/common/cmdline.h index b2a6a22dc..3ae8af1f4 100644 --- a/client/common/cmdline.h +++ b/client/common/cmdline.h @@ -344,13 +344,18 @@ static const COMMAND_LINE_ARGUMENT_A args[] = { "TLS security level - defaults to 1" }, { "toggle-fullscreen", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL, "Alt+Ctrl+Enter to toggle fullscreen" }, + { "tune", COMMAND_LINE_VALUE_REQUIRED, "<setting:value>,<setting:value>", "", NULL, -1, NULL, + "[experimental] directly manipulate freerdp settings, use with extreme caution!" }, + { "tune-list", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, + "Print options allowed for /tune" }, { "u", COMMAND_LINE_VALUE_REQUIRED, "[[<domain>\\]<user>|<user>[@<domain>]]", NULL, NULL, -1, NULL, "Username" }, { "unmap-buttons", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Let server see real physical pointer button" }, #ifdef CHANNEL_URBDRC_CLIENT - { "usb", COMMAND_LINE_VALUE_REQUIRED, "[dbg,][dev:<dev>,][id|addr,][auto]", NULL, NULL, -1, - NULL, "Redirect USB device" }, + { "usb", COMMAND_LINE_VALUE_REQUIRED, + "[dbg,][id:<vid>:<pid>#...,][addr:<bus>:<addr>#...,][auto]", NULL, NULL, -1, NULL, + "Redirect USB device" }, #endif { "v", COMMAND_LINE_VALUE_REQUIRED, "<server>[:port]", NULL, NULL, -1, NULL, "Server hostname" }, diff --git a/client/common/file.c b/client/common/file.c index 401f5ac3d..7cac1acab 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -1614,12 +1614,23 @@ BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* { if (file->BandwidthAutoDetect != 0) { + if ((~file->NetworkAutoDetect) && (file->NetworkAutoDetect != 0)) + { + WLog_WARN(TAG, + "Got networkautodetect:i:%" PRIu32 " and bandwidthautodetect:i:%" PRIu32 + ". Correcting to networkautodetect:i:0", + file->NetworkAutoDetect, file->BandwidthAutoDetect); + WLog_WARN(TAG, + "Add networkautodetect:i:0 to your RDP file to eliminate this warning."); + } + if (!freerdp_set_connection_type(settings, CONNECTION_TYPE_AUTODETECT)) return FALSE; setDefaultConnectionType = FALSE; } if (!freerdp_settings_set_bool(settings, FreeRDP_NetworkAutoDetect, - file->BandwidthAutoDetect != 0)) + (file->BandwidthAutoDetect != 0) || + (file->NetworkAutoDetect == 0))) return FALSE; } @@ -1627,25 +1638,24 @@ BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* { if (file->NetworkAutoDetect == 0) { - if (file->BandwidthAutoDetect != CONNECTION_TYPE_AUTODETECT) + if ((~file->BandwidthAutoDetect) && (file->BandwidthAutoDetect == 0)) { WLog_WARN(TAG, "Got networkautodetect:i:%" PRIu32 " and bandwidthautodetect:i:%" PRIu32 - ". Correcting to bandwidthautodetect:i:%" PRIu32, - file->NetworkAutoDetect, file->BandwidthAutoDetect, - CONNECTION_TYPE_AUTODETECT); - WLog_WARN(TAG, - "Add bandwidthautodetect:i:%" PRIu32 - " to your RDP file to eliminate this warning.", - CONNECTION_TYPE_AUTODETECT); + ". Correcting to bandwidthautodetect:i:1", + file->NetworkAutoDetect, file->BandwidthAutoDetect); + WLog_WARN( + TAG, "Add bandwidthautodetect:i:1 to your RDP file to eliminate this warning."); } if (!freerdp_set_connection_type(settings, CONNECTION_TYPE_AUTODETECT)) return FALSE; + setDefaultConnectionType = FALSE; } if (!freerdp_settings_set_bool(settings, FreeRDP_NetworkAutoDetect, - file->NetworkAutoDetect == 0)) + (file->BandwidthAutoDetect != 0) || + (file->NetworkAutoDetect == 0))) return FALSE; } diff --git a/client/iOS/Resources/en.lproj/Localizable.strings b/client/iOS/Resources/en.lproj/Localizable.strings Binary files differindex 3c0f66365..b4951facc 100644 --- a/client/iOS/Resources/en.lproj/Localizable.strings +++ b/client/iOS/Resources/en.lproj/Localizable.strings diff --git a/include/freerdp/api.h b/include/freerdp/api.h index c6cecf875..65cf98c6e 100644 --- a/include/freerdp/api.h +++ b/include/freerdp/api.h @@ -20,6 +20,7 @@ #ifndef FREERDP_API_H #define FREERDP_API_H +#include <winpr/winpr.h> #include <winpr/platform.h> #ifdef _WIN32 @@ -29,12 +30,6 @@ #endif #ifdef _WIN32 -#define INLINE __inline -#else -#define INLINE inline -#endif - -#ifdef _WIN32 #define __func__ __FUNCTION__ #endif diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index b913f7bfc..99bc0d2dd 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -894,6 +894,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; * FreeRDP Settings Data Structure */ +#define FreeRDP_Settings_StableAPI_MAX 5312 struct rdp_settings { /** @@ -1561,6 +1562,19 @@ struct rdp_settings }; typedef struct rdp_settings rdpSettings; +enum rdp_settings_type +{ + RDP_SETTINGS_TYPE_BOOL, + RDP_SETTINGS_TYPE_UINT16, + RDP_SETTINGS_TYPE_INT16, + RDP_SETTINGS_TYPE_UINT32, + RDP_SETTINGS_TYPE_INT32, + RDP_SETTINGS_TYPE_UINT64, + RDP_SETTINGS_TYPE_INT64, + RDP_SETTINGS_TYPE_STRING, + RDP_SETTINGS_TYPE_POINTER +}; + #ifdef __cplusplus extern "C" { @@ -1670,6 +1684,14 @@ extern "C" FREERDP_API const void* freerdp_settings_get_pointer(const rdpSettings* settings, size_t id); + FREERDP_API BOOL freerdp_settings_set_value_for_name(rdpSettings* settings, const char* name, + const char* value); + + FREERDP_API SSIZE_T freerdp_settings_get_key_for_name(const char* value); + FREERDP_API SSIZE_T freerdp_settings_get_type_for_name(const char* value); + FREERDP_API SSIZE_T freerdp_settings_get_type_for_key(size_t key); + FREERDP_API const char* freerdp_settings_get_name_for_key(size_t key); + #ifdef __cplusplus } #endif diff --git a/libfreerdp/cache/glyph.c b/libfreerdp/cache/glyph.c index 1c17f7eb6..9f5e4a301 100644 --- a/libfreerdp/cache/glyph.c +++ b/libfreerdp/cache/glyph.c @@ -42,7 +42,7 @@ static const void* glyph_cache_fragment_get(rdpGlyphCache* glyph, UINT32 index, static BOOL glyph_cache_fragment_put(rdpGlyphCache* glyph, UINT32 index, UINT32 count, const void* entry); -static UINT32 update_glyph_offset(const BYTE* data, UINT32 index, INT32* x, INT32* y, +static UINT32 update_glyph_offset(const BYTE* data, size_t length, UINT32 index, INT32* x, INT32* y, UINT32 ulCharInc, UINT32 flAccel) { if ((ulCharInc == 0) && (!(flAccel & SO_CHAR_INC_EQUAL_BM_BASE))) @@ -51,8 +51,15 @@ static UINT32 update_glyph_offset(const BYTE* data, UINT32 index, INT32* x, INT3 if (offset & 0x80) { - offset = data[index++]; - offset |= ((UINT32)data[index++]) << 8; + + if (index + 1 < length) + { + offset = data[index++]; + offset |= ((UINT32)data[index++]) << 8; + } + else + WLog_WARN(TAG, "[%s] glyph index out of bound %" PRIu32 " [max %" PRIuz "]", index, + length); } if (flAccel & SO_VERTICAL) @@ -234,7 +241,7 @@ static BOOL update_process_glyph_fragments(rdpContext* context, const BYTE* data switch (op) { case GLYPH_FRAGMENT_USE: - if (index + 1 > length) + if (index + 1 >= length) return FALSE; id = data[index++]; @@ -246,7 +253,7 @@ static BOOL update_process_glyph_fragments(rdpContext* context, const BYTE* data for (n = 0; n < size;) { const UINT32 fop = fragments[n++]; - n = update_glyph_offset(fragments, n, &x, &y, ulCharInc, flAccel); + n = update_glyph_offset(fragments, size, n, &x, &y, ulCharInc, flAccel); if (!update_process_glyph(context, fragments, fop, &x, &y, cacheId, flAccel, fOpRedundant, &bound)) @@ -265,7 +272,7 @@ static BOOL update_process_glyph_fragments(rdpContext* context, const BYTE* data break; default: - index = update_glyph_offset(data, index, &x, &y, ulCharInc, flAccel); + index = update_glyph_offset(data, length, index, &x, &y, ulCharInc, flAccel); if (!update_process_glyph(context, data, op, &x, &y, cacheId, flAccel, fOpRedundant, &bound)) @@ -378,7 +385,7 @@ static BOOL update_gdi_fast_index(rdpContext* context, const FAST_INDEX_ORDER* f static BOOL update_gdi_fast_glyph(rdpContext* context, const FAST_GLYPH_ORDER* fastGlyph) { INT32 x, y; - BYTE text_data[2]; + BYTE text_data[4] = { 0 }; INT32 opLeft, opTop; INT32 opRight, opBottom; INT32 opWidth = 0, opHeight = 0; @@ -464,9 +471,9 @@ static BOOL update_gdi_fast_glyph(rdpContext* context, const FAST_GLYPH_ORDER* f opHeight = opBottom - opTop + 1; return update_process_glyph_fragments( - context, text_data, 1, fastGlyph->cacheId, fastGlyph->ulCharInc, fastGlyph->flAccel, - fastGlyph->backColor, fastGlyph->foreColor, x, y, fastGlyph->bkLeft, fastGlyph->bkTop, - bkWidth, bkHeight, opLeft, opTop, opWidth, opHeight, FALSE); + context, text_data, sizeof(text_data), fastGlyph->cacheId, fastGlyph->ulCharInc, + fastGlyph->flAccel, fastGlyph->backColor, fastGlyph->foreColor, x, y, fastGlyph->bkLeft, + fastGlyph->bkTop, bkWidth, bkHeight, opLeft, opTop, opWidth, opHeight, FALSE); } static BOOL update_gdi_cache_glyph(rdpContext* context, const CACHE_GLYPH_ORDER* cacheGlyph) diff --git a/libfreerdp/codec/clear.c b/libfreerdp/codec/clear.c index 5be6cb12f..118e09b35 100644 --- a/libfreerdp/codec/clear.c +++ b/libfreerdp/codec/clear.c @@ -130,7 +130,7 @@ static BOOL clear_decompress_subcode_rlex(wStream* s, UINT32 bitmapDataByteCount UINT32 i; UINT32 pixelCount; UINT32 bitmapDataOffset; - UINT32 pixelIndex; + size_t pixelIndex; UINT32 numBits; BYTE startIndex; BYTE stopIndex; @@ -146,6 +146,8 @@ static BOOL clear_decompress_subcode_rlex(wStream* s, UINT32 bitmapDataByteCount return FALSE; } + if (Stream_GetRemainingLength(s) < 1) + return FALSE; Stream_Read_UINT8(s, paletteCount); bitmapDataOffset = 1 + (paletteCount * 3); @@ -155,6 +157,9 @@ static BOOL clear_decompress_subcode_rlex(wStream* s, UINT32 bitmapDataByteCount return FALSE; } + if (Stream_GetRemainingLength(s) < 3ULL * paletteCount) + return FALSE; + for (i = 0; i < paletteCount; i++) { BYTE r, g, b; @@ -299,7 +304,7 @@ static BOOL clear_decompress_subcode_rlex(wStream* s, UINT32 bitmapDataByteCount if (pixelIndex != pixelCount) { - WLog_ERR(TAG, "pixelIndex %" PRIu32 " != pixelCount %" PRIu32 "", pixelIndex, pixelCount); + WLog_ERR(TAG, "pixelIndex %" PRIdz " != pixelCount %" PRIu32 "", pixelIndex, pixelCount); return FALSE; } diff --git a/libfreerdp/codec/dsp_ffmpeg.c b/libfreerdp/codec/dsp_ffmpeg.c index 222ffa717..4e4a07c7a 100644 --- a/libfreerdp/codec/dsp_ffmpeg.c +++ b/libfreerdp/codec/dsp_ffmpeg.c @@ -79,6 +79,14 @@ static BOOL ffmpeg_codec_is_filtered(enum AVCodecID id, BOOL encoder) case AV_CODEC_ID_NONE: return TRUE; + case AV_CODEC_ID_AAC: + case AV_CODEC_ID_AAC_LATM: +#if !defined(WITH_DSP_EXPERIMENTAL) + if (encoder) + return TRUE; +#endif + return FALSE; + default: return FALSE; } diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c index bb58ed1a8..bfa2dc5da 100644 --- a/libfreerdp/codec/progressive.c +++ b/libfreerdp/codec/progressive.c @@ -1920,7 +1920,7 @@ static INLINE INT32 progressive_wb_read_region_header(PROGRESSIVE_CONTEXT* progr UINT16 blockType, UINT32 blockLen, PROGRESSIVE_BLOCK_REGION* region) { - size_t offset, len; + size_t len; memset(region, 0, sizeof(PROGRESSIVE_BLOCK_REGION)); if (Stream_GetRemainingLength(s) < 12) @@ -1965,35 +1965,37 @@ static INLINE INT32 progressive_wb_read_region_header(PROGRESSIVE_CONTEXT* progr } len = Stream_GetRemainingLength(s); - offset = (region->numRects * 8); - if (len < offset) + if (len / 8 < region->numRects) { WLog_Print(progressive->log, WLOG_ERROR, "ProgressiveRegion data short for region->rects"); return -1015; } + len -= region->numRects * 8ULL; - offset += (region->numQuant * 5); - if (len < offset) + if (len / 5 < region->numQuant) { WLog_Print(progressive->log, WLOG_ERROR, "ProgressiveRegion data short for region->cQuant"); return -1018; } + len -= region->numQuant * 5ULL; - offset += (region->numProgQuant * 16); - if (len < offset) + if (len / 16 < region->numProgQuant) { WLog_Print(progressive->log, WLOG_ERROR, "ProgressiveRegion data short for region->cProgQuant"); return -1021; } + len -= region->numProgQuant * 16ULL; - offset += region->tileDataSize; - if (len < offset) + if (len < region->tileDataSize) { WLog_Print(progressive->log, WLOG_ERROR, "ProgressiveRegion data short for region->tiles"); return -1024; } - + len -= region->tileDataSize; + if (len > 0) + WLog_Print(progressive->log, WLOG_DEBUG, + "Unused byes detected, %" PRIuz " bytes not processed", len); return 0; } diff --git a/libfreerdp/codec/rfx.c b/libfreerdp/codec/rfx.c index 77d295fd6..b7db992ee 100644 --- a/libfreerdp/codec/rfx.c +++ b/libfreerdp/codec/rfx.c @@ -752,7 +752,6 @@ static BOOL rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa { BOOL rc; int i, close_cnt; - size_t pos; BYTE quant; RFX_TILE* tile; RFX_TILE** tmpTiles; @@ -885,6 +884,7 @@ static BOOL rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa for (i = 0; i < message->numTiles; i++) { + wStream sub; if (!(tile = (RFX_TILE*)ObjectPool_Take(context->priv->TilePool))) { WLog_ERR(TAG, "RfxMessageTileSet failed to get tile from object pool"); @@ -903,11 +903,17 @@ static BOOL rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa break; } - Stream_Read_UINT16(s, - blockType); /* blockType (2 bytes), must be set to CBT_TILE (0xCAC3) */ - Stream_Read_UINT32(s, blockLen); /* blockLen (4 bytes) */ + Stream_StaticInit(&sub, Stream_Pointer(s), Stream_GetRemainingLength(s)); + Stream_Read_UINT16(&sub, + blockType); /* blockType (2 bytes), must be set to CBT_TILE (0xCAC3) */ + Stream_Read_UINT32(&sub, blockLen); /* blockLen (4 bytes) */ - if (Stream_GetRemainingLength(s) < blockLen - 6) + if (!Stream_SafeSeek(s, blockLen)) + { + rc = FALSE; + break; + } + if ((blockLen < 6 + 13) || (Stream_GetRemainingLength(&sub) < blockLen - 6)) { WLog_ERR(TAG, "RfxMessageTileSet not enough bytes to read tile %d/%" PRIu16 @@ -917,8 +923,6 @@ static BOOL rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa break; } - pos = Stream_GetPosition(s) - 6 + blockLen; - if (blockType != CBT_TILE) { WLog_ERR(TAG, "unknown block type 0x%" PRIX32 ", expected CBT_TILE (0xCAC3).", @@ -927,20 +931,32 @@ static BOOL rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa break; } - Stream_Read_UINT8(s, tile->quantIdxY); /* quantIdxY (1 byte) */ - Stream_Read_UINT8(s, tile->quantIdxCb); /* quantIdxCb (1 byte) */ - Stream_Read_UINT8(s, tile->quantIdxCr); /* quantIdxCr (1 byte) */ - Stream_Read_UINT16(s, tile->xIdx); /* xIdx (2 bytes) */ - Stream_Read_UINT16(s, tile->yIdx); /* yIdx (2 bytes) */ - Stream_Read_UINT16(s, tile->YLen); /* YLen (2 bytes) */ - Stream_Read_UINT16(s, tile->CbLen); /* CbLen (2 bytes) */ - Stream_Read_UINT16(s, tile->CrLen); /* CrLen (2 bytes) */ - Stream_GetPointer(s, tile->YData); - Stream_Seek(s, tile->YLen); - Stream_GetPointer(s, tile->CbData); - Stream_Seek(s, tile->CbLen); - Stream_GetPointer(s, tile->CrData); - Stream_Seek(s, tile->CrLen); + Stream_Read_UINT8(&sub, tile->quantIdxY); /* quantIdxY (1 byte) */ + Stream_Read_UINT8(&sub, tile->quantIdxCb); /* quantIdxCb (1 byte) */ + Stream_Read_UINT8(&sub, tile->quantIdxCr); /* quantIdxCr (1 byte) */ + Stream_Read_UINT16(&sub, tile->xIdx); /* xIdx (2 bytes) */ + Stream_Read_UINT16(&sub, tile->yIdx); /* yIdx (2 bytes) */ + Stream_Read_UINT16(&sub, tile->YLen); /* YLen (2 bytes) */ + Stream_Read_UINT16(&sub, tile->CbLen); /* CbLen (2 bytes) */ + Stream_Read_UINT16(&sub, tile->CrLen); /* CrLen (2 bytes) */ + Stream_GetPointer(&sub, tile->YData); + if (!Stream_SafeSeek(&sub, tile->YLen)) + { + rc = FALSE; + break; + } + Stream_GetPointer(&sub, tile->CbData); + if (!Stream_SafeSeek(&sub, tile->CbLen)) + { + rc = FALSE; + break; + } + Stream_GetPointer(&sub, tile->CrData); + if (!Stream_SafeSeek(&sub, tile->CrLen)) + { + rc = FALSE; + break; + } tile->x = tile->xIdx * 64; tile->y = tile->yIdx * 64; @@ -971,8 +987,6 @@ static BOOL rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa { rfx_decode_rgb(context, tile, tile->data, 64 * 4); } - - Stream_SetPosition(s, pos); } if (context->priv->UseThreads) diff --git a/libfreerdp/codec/xcrush.c b/libfreerdp/codec/xcrush.c index 87a74a2a4..350801df3 100644 --- a/libfreerdp/codec/xcrush.c +++ b/libfreerdp/codec/xcrush.c @@ -732,13 +732,27 @@ static int xcrush_generate_output(XCRUSH_CONTEXT* xcrush, BYTE* OutputBuffer, UI return 1; } -static size_t xcrush_copy_bytes(BYTE* dst, const BYTE* src, size_t num) +static INLINE size_t xcrush_copy_bytes(BYTE* dst, const BYTE* src, size_t num) { - size_t index; - - for (index = 0; index < num; index++) + size_t diff, rest, end, a; + if (src + num < dst || src > dst + num) + { + memcpy(dst, src, num); + } + else { - dst[index] = src[index]; + // src and dst overlaps + // we should copy the area that doesn't overlap repeatly + diff = (dst > src) ? dst - src : src - dst; + rest = num % diff; + end = num - rest; + for (a = 0; a < end; a += diff) + { + memcpy(&dst[a], &src[a], diff); + } + + if (rest != 0) + memcpy(&dst[end], &src[end], rest); } return num; diff --git a/libfreerdp/common/CMakeLists.txt b/libfreerdp/common/CMakeLists.txt index fa8b81773..c0274bfe0 100644 --- a/libfreerdp/common/CMakeLists.txt +++ b/libfreerdp/common/CMakeLists.txt @@ -22,6 +22,7 @@ set(${MODULE_PREFIX}_SRCS addin.c settings.c settings_getters.c + settings_str.c assistance.c) freerdp_module_add(${${MODULE_PREFIX}_SRCS}) diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index 6ca65f28e..b639778b0 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -25,6 +25,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <errno.h> #include <winpr/crt.h> @@ -804,3 +805,123 @@ int freerdp_set_param_string(rdpSettings* settings, int id, const char* param) { return freerdp_settings_set_string(settings, (size_t)id, param) ? 0 : -1; } + +static BOOL value_to_uint(const char* value, ULONGLONG* result, ULONGLONG min, ULONGLONG max) +{ + unsigned long long rc; + + if (!value || !result) + return FALSE; + + errno = 0; + rc = _strtoui64(value, NULL, 0); + + if (errno != 0) + return FALSE; + + if ((rc < min) || (rc > max)) + return FALSE; + + *result = rc; + return TRUE; +} + +static BOOL value_to_int(const char* value, LONGLONG* result, LONGLONG min, LONGLONG max) +{ + long long rc; + + if (!value || !result) + return FALSE; + + errno = 0; + rc = _strtoi64(value, NULL, 0); + + if (errno != 0) + return FALSE; + + if ((rc < min) || (rc > max)) + return FALSE; + + *result = rc; + return TRUE; +} + +static BOOL parsing_fail(const char* key, const char* type, const char* value) +{ + WLog_ERR(TAG, "Failed to parse key [%s] of type [%s]: value [%s]", key, type, value); + return FALSE; +} + +BOOL freerdp_settings_set_value_for_name(rdpSettings* settings, const char* name, const char* value) +{ + ULONGLONG uval; + LONGLONG ival; + SSIZE_T index, type; + if (!settings || !name) + return FALSE; + + index = freerdp_settings_get_key_for_name(name); + if (index < 0) + { + WLog_ERR(TAG, "Invalid settings key [%s]", name); + return FALSE; + } + + type = freerdp_settings_get_type_for_key((size_t)index); + switch (type) + { + + case RDP_SETTINGS_TYPE_BOOL: + { + BOOL val = _strnicmp(value, "TRUE", 5) == 0; + if (!val && _strnicmp(value, "FALSE", 5) != 0) + return parsing_fail(name, "BOOL", value); + return freerdp_settings_set_bool(settings, index, val); + } + case RDP_SETTINGS_TYPE_UINT16: + if (!value_to_uint(value, &uval, 0, UINT16_MAX)) + return parsing_fail(name, "UINT16", value); + if (!freerdp_settings_set_uint16(settings, index, uval)) + return parsing_fail(name, "UINT16", value); + return TRUE; + + case RDP_SETTINGS_TYPE_INT16: + if (!value_to_int(value, &ival, INT16_MIN, INT16_MAX)) + return parsing_fail(name, "INT16", value); + if (!freerdp_settings_set_int16(settings, index, ival)) + return parsing_fail(name, "INT16", value); + return TRUE; + case RDP_SETTINGS_TYPE_UINT32: + if (!value_to_uint(value, &uval, 0, UINT32_MAX)) + return parsing_fail(name, "UINT32", value); + if (!freerdp_settings_set_uint32(settings, index, uval)) + return parsing_fail(name, "UINT32", value); + return TRUE; + case RDP_SETTINGS_TYPE_INT32: + if (!value_to_int(value, &ival, INT32_MIN, INT32_MAX)) + return parsing_fail(name, "INT32", value); + if (!freerdp_settings_set_int32(settings, index, ival)) + return parsing_fail(name, "INT32", value); + return TRUE; + case RDP_SETTINGS_TYPE_UINT64: + if (!value_to_uint(value, &uval, 0, UINT64_MAX)) + return parsing_fail(name, "UINT64", value); + if (!freerdp_settings_set_uint64(settings, index, uval)) + return parsing_fail(name, "UINT64", value); + return TRUE; + case RDP_SETTINGS_TYPE_INT64: + if (!value_to_int(value, &ival, INT64_MIN, INT64_MAX)) + return parsing_fail(name, "INT64", value); + if (!freerdp_settings_set_int64(settings, index, ival)) + return parsing_fail(name, "INT64", value); + return TRUE; + + case RDP_SETTINGS_TYPE_STRING: + return freerdp_settings_set_string(settings, index, value); + case RDP_SETTINGS_TYPE_POINTER: + return parsing_fail(name, "POINTER", value); + default: + return FALSE; + } + return FALSE; +} diff --git a/libfreerdp/common/settings_getters.c b/libfreerdp/common/settings_getters.c index 2938ef126..9ea65070b 100644 --- a/libfreerdp/common/settings_getters.c +++ b/libfreerdp/common/settings_getters.c @@ -12,128 +12,98 @@ BOOL freerdp_settings_get_bool(const rdpSettings* settings, size_t id) switch (id) { - case FreeRDP_ServerMode: - return settings->ServerMode; - - case FreeRDP_WaitForOutputBufferFlush: - return settings->WaitForOutputBufferFlush; - - case FreeRDP_NetworkAutoDetect: - return settings->NetworkAutoDetect; - - case FreeRDP_SupportAsymetricKeys: - return settings->SupportAsymetricKeys; - - case FreeRDP_SupportErrorInfoPdu: - return settings->SupportErrorInfoPdu; + case FreeRDP_AllowCacheWaitingList: + return settings->AllowCacheWaitingList; - case FreeRDP_SupportStatusInfoPdu: - return settings->SupportStatusInfoPdu; + case FreeRDP_AllowDesktopComposition: + return settings->AllowDesktopComposition; - case FreeRDP_SupportMonitorLayoutPdu: - return settings->SupportMonitorLayoutPdu; + case FreeRDP_AllowFontSmoothing: + return settings->AllowFontSmoothing; - case FreeRDP_SupportGraphicsPipeline: - return settings->SupportGraphicsPipeline; + case FreeRDP_AllowUnanouncedOrdersFromServer: + return settings->AllowUnanouncedOrdersFromServer; - case FreeRDP_SupportDynamicTimeZone: - return settings->SupportDynamicTimeZone; + case FreeRDP_AltSecFrameMarkerSupport: + return settings->AltSecFrameMarkerSupport; - case FreeRDP_SupportHeartbeatPdu: - return settings->SupportHeartbeatPdu; + case FreeRDP_AsyncChannels: + return settings->AsyncChannels; - case FreeRDP_UseRdpSecurityLayer: - return settings->UseRdpSecurityLayer; + case FreeRDP_AsyncInput: + return settings->AsyncInput; - case FreeRDP_ConsoleSession: - return settings->ConsoleSession; + case FreeRDP_AsyncUpdate: + return settings->AsyncUpdate; - case FreeRDP_SpanMonitors: - return settings->SpanMonitors; + case FreeRDP_AudioCapture: + return settings->AudioCapture; - case FreeRDP_UseMultimon: - return settings->UseMultimon; + case FreeRDP_AudioPlayback: + return settings->AudioPlayback; - case FreeRDP_ForceMultimon: - return settings->ForceMultimon; + case FreeRDP_Authentication: + return settings->Authentication; - case FreeRDP_ListMonitors: - return settings->ListMonitors; + case FreeRDP_AuthenticationOnly: + return settings->AuthenticationOnly; - case FreeRDP_HasMonitorAttributes: - return settings->HasMonitorAttributes; + case FreeRDP_AutoAcceptCertificate: + return settings->AutoAcceptCertificate; - case FreeRDP_SupportMultitransport: - return settings->SupportMultitransport; + case FreeRDP_AutoDenyCertificate: + return settings->AutoDenyCertificate; case FreeRDP_AutoLogonEnabled: return settings->AutoLogonEnabled; - case FreeRDP_CompressionEnabled: - return settings->CompressionEnabled; - - case FreeRDP_DisableCtrlAltDel: - return settings->DisableCtrlAltDel; - - case FreeRDP_EnableWindowsKey: - return settings->EnableWindowsKey; - - case FreeRDP_MaximizeShell: - return settings->MaximizeShell; - - case FreeRDP_LogonNotify: - return settings->LogonNotify; - - case FreeRDP_LogonErrors: - return settings->LogonErrors; - - case FreeRDP_MouseAttached: - return settings->MouseAttached; + case FreeRDP_AutoReconnectionEnabled: + return settings->AutoReconnectionEnabled; - case FreeRDP_MouseHasWheel: - return settings->MouseHasWheel; + case FreeRDP_BitmapCacheEnabled: + return settings->BitmapCacheEnabled; - case FreeRDP_RemoteConsoleAudio: - return settings->RemoteConsoleAudio; + case FreeRDP_BitmapCachePersistEnabled: + return settings->BitmapCachePersistEnabled; - case FreeRDP_AudioPlayback: - return settings->AudioPlayback; + case FreeRDP_BitmapCacheV3Enabled: + return settings->BitmapCacheV3Enabled; - case FreeRDP_AudioCapture: - return settings->AudioCapture; + case FreeRDP_BitmapCompressionDisabled: + return settings->BitmapCompressionDisabled; - case FreeRDP_VideoDisable: - return settings->VideoDisable; + case FreeRDP_ColorPointerFlag: + return settings->ColorPointerFlag; - case FreeRDP_PasswordIsSmartcardPin: - return settings->PasswordIsSmartcardPin; + case FreeRDP_CompressionEnabled: + return settings->CompressionEnabled; - case FreeRDP_UsingSavedCredentials: - return settings->UsingSavedCredentials; + case FreeRDP_ConsoleSession: + return settings->ConsoleSession; - case FreeRDP_ForceEncryptedCsPdu: - return settings->ForceEncryptedCsPdu; + case FreeRDP_CredentialsFromStdin: + return settings->CredentialsFromStdin; - case FreeRDP_HiDefRemoteApp: - return settings->HiDefRemoteApp; + case FreeRDP_Decorations: + return settings->Decorations; - case FreeRDP_IPv6Enabled: - return settings->IPv6Enabled; + case FreeRDP_DesktopResize: + return settings->DesktopResize; - case FreeRDP_AutoReconnectionEnabled: - return settings->AutoReconnectionEnabled; + case FreeRDP_DeviceRedirection: + return settings->DeviceRedirection; - case FreeRDP_PrintReconnectCookie: - return settings->PrintReconnectCookie; + case FreeRDP_DisableCredentialsDelegation: + return settings->DisableCredentialsDelegation; - case FreeRDP_DynamicDaylightTimeDisabled: - return settings->DynamicDaylightTimeDisabled; + case FreeRDP_DisableCtrlAltDel: + return settings->DisableCtrlAltDel; - case FreeRDP_AllowFontSmoothing: - return settings->AllowFontSmoothing; + case FreeRDP_DisableCursorBlinking: + return settings->DisableCursorBlinking; - case FreeRDP_DisableWallpaper: - return settings->DisableWallpaper; + case FreeRDP_DisableCursorShadow: + return settings->DisableCursorShadow; case FreeRDP_DisableFullWindowDrag: return settings->DisableFullWindowDrag; @@ -141,266 +111,272 @@ BOOL freerdp_settings_get_bool(const rdpSettings* settings, size_t id) case FreeRDP_DisableMenuAnims: return settings->DisableMenuAnims; + case FreeRDP_DisableRemoteAppCapsCheck: + return settings->DisableRemoteAppCapsCheck; + case FreeRDP_DisableThemes: return settings->DisableThemes; - case FreeRDP_DisableCursorShadow: - return settings->DisableCursorShadow; + case FreeRDP_DisableWallpaper: + return settings->DisableWallpaper; - case FreeRDP_DisableCursorBlinking: - return settings->DisableCursorBlinking; + case FreeRDP_DrawAllowColorSubsampling: + return settings->DrawAllowColorSubsampling; - case FreeRDP_AllowDesktopComposition: - return settings->AllowDesktopComposition; + case FreeRDP_DrawAllowDynamicColorFidelity: + return settings->DrawAllowDynamicColorFidelity; - case FreeRDP_RemoteAssistanceMode: - return settings->RemoteAssistanceMode; + case FreeRDP_DrawAllowSkipAlpha: + return settings->DrawAllowSkipAlpha; - case FreeRDP_EncomspVirtualChannel: - return settings->EncomspVirtualChannel; + case FreeRDP_DrawGdiPlusCacheEnabled: + return settings->DrawGdiPlusCacheEnabled; - case FreeRDP_RemdeskVirtualChannel: - return settings->RemdeskVirtualChannel; + case FreeRDP_DrawGdiPlusEnabled: + return settings->DrawGdiPlusEnabled; - case FreeRDP_LyncRdpMode: - return settings->LyncRdpMode; + case FreeRDP_DrawNineGridEnabled: + return settings->DrawNineGridEnabled; - case FreeRDP_RemoteAssistanceRequestControl: - return settings->RemoteAssistanceRequestControl; + case FreeRDP_DumpRemoteFx: + return settings->DumpRemoteFx; - case FreeRDP_TlsSecurity: - return settings->TlsSecurity; + case FreeRDP_DynamicDaylightTimeDisabled: + return settings->DynamicDaylightTimeDisabled; - case FreeRDP_NlaSecurity: - return settings->NlaSecurity; + case FreeRDP_DynamicResolutionUpdate: + return settings->DynamicResolutionUpdate; - case FreeRDP_RdpSecurity: - return settings->RdpSecurity; + case FreeRDP_EmbeddedWindow: + return settings->EmbeddedWindow; + + case FreeRDP_EnableWindowsKey: + return settings->EnableWindowsKey; + + case FreeRDP_EncomspVirtualChannel: + return settings->EncomspVirtualChannel; case FreeRDP_ExtSecurity: return settings->ExtSecurity; - case FreeRDP_Authentication: - return settings->Authentication; - - case FreeRDP_NegotiateSecurityLayer: - return settings->NegotiateSecurityLayer; + case FreeRDP_ExternalCertificateManagement: + return settings->ExternalCertificateManagement; - case FreeRDP_RestrictedAdminModeRequired: - return settings->RestrictedAdminModeRequired; + case FreeRDP_FIPSMode: + return settings->FIPSMode; - case FreeRDP_DisableCredentialsDelegation: - return settings->DisableCredentialsDelegation; + case FreeRDP_FastPathInput: + return settings->FastPathInput; - case FreeRDP_VmConnectMode: - return settings->VmConnectMode; + case FreeRDP_FastPathOutput: + return settings->FastPathOutput; - case FreeRDP_FIPSMode: - return settings->FIPSMode; + case FreeRDP_ForceEncryptedCsPdu: + return settings->ForceEncryptedCsPdu; - case FreeRDP_MstscCookieMode: - return settings->MstscCookieMode; + case FreeRDP_ForceMultimon: + return settings->ForceMultimon; - case FreeRDP_SendPreconnectionPdu: - return settings->SendPreconnectionPdu; + case FreeRDP_FrameMarkerCommandEnabled: + return settings->FrameMarkerCommandEnabled; - case FreeRDP_SmartcardLogon: - return settings->SmartcardLogon; + case FreeRDP_Fullscreen: + return settings->Fullscreen; - case FreeRDP_PromptForCredentials: - return settings->PromptForCredentials; + case FreeRDP_GatewayBypassLocal: + return settings->GatewayBypassLocal; - case FreeRDP_IgnoreCertificate: - return settings->IgnoreCertificate; + case FreeRDP_GatewayEnabled: + return settings->GatewayEnabled; - case FreeRDP_ExternalCertificateManagement: - return settings->ExternalCertificateManagement; + case FreeRDP_GatewayHttpTransport: + return settings->GatewayHttpTransport; - case FreeRDP_AutoAcceptCertificate: - return settings->AutoAcceptCertificate; + case FreeRDP_GatewayRpcTransport: + return settings->GatewayRpcTransport; - case FreeRDP_AutoDenyCertificate: - return settings->AutoDenyCertificate; + case FreeRDP_GatewayUdpTransport: + return settings->GatewayUdpTransport; - case FreeRDP_Workarea: - return settings->Workarea; + case FreeRDP_GatewayUseSameCredentials: + return settings->GatewayUseSameCredentials; - case FreeRDP_Fullscreen: - return settings->Fullscreen; + case FreeRDP_GfxAVC444: + return settings->GfxAVC444; - case FreeRDP_GrabKeyboard: - return settings->GrabKeyboard; + case FreeRDP_GfxAVC444v2: + return settings->GfxAVC444v2; - case FreeRDP_Decorations: - return settings->Decorations; + case FreeRDP_GfxH264: + return settings->GfxH264; - case FreeRDP_MouseMotion: - return settings->MouseMotion; + case FreeRDP_GfxProgressive: + return settings->GfxProgressive; - case FreeRDP_AsyncInput: - return settings->AsyncInput; + case FreeRDP_GfxProgressiveV2: + return settings->GfxProgressiveV2; - case FreeRDP_AsyncUpdate: - return settings->AsyncUpdate; + case FreeRDP_GfxSendQoeAck: + return settings->GfxSendQoeAck; - case FreeRDP_AsyncChannels: - return settings->AsyncChannels; + case FreeRDP_GfxSmallCache: + return settings->GfxSmallCache; - case FreeRDP_ToggleFullscreen: - return settings->ToggleFullscreen; + case FreeRDP_GfxThinClient: + return settings->GfxThinClient; - case FreeRDP_EmbeddedWindow: - return settings->EmbeddedWindow; + case FreeRDP_GrabKeyboard: + return settings->GrabKeyboard; - case FreeRDP_SmartSizing: - return settings->SmartSizing; + case FreeRDP_HasExtendedMouseEvent: + return settings->HasExtendedMouseEvent; - case FreeRDP_PercentScreenUseWidth: - return settings->PercentScreenUseWidth; + case FreeRDP_HasHorizontalWheel: + return settings->HasHorizontalWheel; - case FreeRDP_PercentScreenUseHeight: - return settings->PercentScreenUseHeight; + case FreeRDP_HasMonitorAttributes: + return settings->HasMonitorAttributes; - case FreeRDP_DynamicResolutionUpdate: - return settings->DynamicResolutionUpdate; + case FreeRDP_HiDefRemoteApp: + return settings->HiDefRemoteApp; - case FreeRDP_SoftwareGdi: - return settings->SoftwareGdi; + case FreeRDP_IPv6Enabled: + return settings->IPv6Enabled; - case FreeRDP_LocalConnection: - return settings->LocalConnection; + case FreeRDP_IgnoreCertificate: + return settings->IgnoreCertificate; - case FreeRDP_AuthenticationOnly: - return settings->AuthenticationOnly; + case FreeRDP_JpegCodec: + return settings->JpegCodec; - case FreeRDP_CredentialsFromStdin: - return settings->CredentialsFromStdin; + case FreeRDP_ListMonitors: + return settings->ListMonitors; - case FreeRDP_UnmapButtons: - return settings->UnmapButtons; + case FreeRDP_LocalConnection: + return settings->LocalConnection; - case FreeRDP_OldLicenseBehaviour: - return settings->OldLicenseBehaviour; + case FreeRDP_LogonErrors: + return settings->LogonErrors; - case FreeRDP_DumpRemoteFx: - return settings->DumpRemoteFx; + case FreeRDP_LogonNotify: + return settings->LogonNotify; - case FreeRDP_PlayRemoteFx: - return settings->PlayRemoteFx; + case FreeRDP_LongCredentialsSupported: + return settings->LongCredentialsSupported; - case FreeRDP_GatewayUseSameCredentials: - return settings->GatewayUseSameCredentials; + case FreeRDP_LyncRdpMode: + return settings->LyncRdpMode; - case FreeRDP_GatewayEnabled: - return settings->GatewayEnabled; + case FreeRDP_MaximizeShell: + return settings->MaximizeShell; - case FreeRDP_GatewayBypassLocal: - return settings->GatewayBypassLocal; + case FreeRDP_MouseAttached: + return settings->MouseAttached; - case FreeRDP_GatewayRpcTransport: - return settings->GatewayRpcTransport; + case FreeRDP_MouseHasWheel: + return settings->MouseHasWheel; - case FreeRDP_GatewayHttpTransport: - return settings->GatewayHttpTransport; + case FreeRDP_MouseMotion: + return settings->MouseMotion; - case FreeRDP_GatewayUdpTransport: - return settings->GatewayUdpTransport; + case FreeRDP_MstscCookieMode: + return settings->MstscCookieMode; - case FreeRDP_RemoteApplicationMode: - return settings->RemoteApplicationMode; + case FreeRDP_MultiTouchGestures: + return settings->MultiTouchGestures; - case FreeRDP_DisableRemoteAppCapsCheck: - return settings->DisableRemoteAppCapsCheck; + case FreeRDP_MultiTouchInput: + return settings->MultiTouchInput; - case FreeRDP_RemoteAppLanguageBarSupported: - return settings->RemoteAppLanguageBarSupported; + case FreeRDP_NSCodec: + return settings->NSCodec; - case FreeRDP_RefreshRect: - return settings->RefreshRect; + case FreeRDP_NSCodecAllowDynamicColorFidelity: + return settings->NSCodecAllowDynamicColorFidelity; - case FreeRDP_SuppressOutput: - return settings->SuppressOutput; + case FreeRDP_NSCodecAllowSubsampling: + return settings->NSCodecAllowSubsampling; - case FreeRDP_FastPathOutput: - return settings->FastPathOutput; + case FreeRDP_NegotiateSecurityLayer: + return settings->NegotiateSecurityLayer; - case FreeRDP_SaltedChecksum: - return settings->SaltedChecksum; + case FreeRDP_NetworkAutoDetect: + return settings->NetworkAutoDetect; - case FreeRDP_LongCredentialsSupported: - return settings->LongCredentialsSupported; + case FreeRDP_NlaSecurity: + return settings->NlaSecurity; case FreeRDP_NoBitmapCompressionHeader: return settings->NoBitmapCompressionHeader; - case FreeRDP_BitmapCompressionDisabled: - return settings->BitmapCompressionDisabled; + case FreeRDP_OldLicenseBehaviour: + return settings->OldLicenseBehaviour; - case FreeRDP_DesktopResize: - return settings->DesktopResize; + case FreeRDP_PasswordIsSmartcardPin: + return settings->PasswordIsSmartcardPin; - case FreeRDP_DrawAllowDynamicColorFidelity: - return settings->DrawAllowDynamicColorFidelity; + case FreeRDP_PercentScreenUseHeight: + return settings->PercentScreenUseHeight; - case FreeRDP_DrawAllowColorSubsampling: - return settings->DrawAllowColorSubsampling; + case FreeRDP_PercentScreenUseWidth: + return settings->PercentScreenUseWidth; - case FreeRDP_DrawAllowSkipAlpha: - return settings->DrawAllowSkipAlpha; + case FreeRDP_PlayRemoteFx: + return settings->PlayRemoteFx; - case FreeRDP_BitmapCacheV3Enabled: - return settings->BitmapCacheV3Enabled; + case FreeRDP_PreferIPv6OverIPv4: + return settings->PreferIPv6OverIPv4; - case FreeRDP_AltSecFrameMarkerSupport: - return settings->AltSecFrameMarkerSupport; + case FreeRDP_PrintReconnectCookie: + return settings->PrintReconnectCookie; - case FreeRDP_AllowUnanouncedOrdersFromServer: - return settings->AllowUnanouncedOrdersFromServer; + case FreeRDP_PromptForCredentials: + return settings->PromptForCredentials; - case FreeRDP_BitmapCacheEnabled: - return settings->BitmapCacheEnabled; + case FreeRDP_RdpSecurity: + return settings->RdpSecurity; - case FreeRDP_AllowCacheWaitingList: - return settings->AllowCacheWaitingList; + case FreeRDP_RedirectClipboard: + return settings->RedirectClipboard; - case FreeRDP_BitmapCachePersistEnabled: - return settings->BitmapCachePersistEnabled; + case FreeRDP_RedirectDrives: + return settings->RedirectDrives; - case FreeRDP_ColorPointerFlag: - return settings->ColorPointerFlag; + case FreeRDP_RedirectHomeDrive: + return settings->RedirectHomeDrive; - case FreeRDP_UnicodeInput: - return settings->UnicodeInput; + case FreeRDP_RedirectParallelPorts: + return settings->RedirectParallelPorts; - case FreeRDP_FastPathInput: - return settings->FastPathInput; + case FreeRDP_RedirectPrinters: + return settings->RedirectPrinters; - case FreeRDP_MultiTouchInput: - return settings->MultiTouchInput; + case FreeRDP_RedirectSerialPorts: + return settings->RedirectSerialPorts; - case FreeRDP_MultiTouchGestures: - return settings->MultiTouchGestures; + case FreeRDP_RedirectSmartCards: + return settings->RedirectSmartCards; - case FreeRDP_HasHorizontalWheel: - return settings->HasHorizontalWheel; + case FreeRDP_RefreshRect: + return settings->RefreshRect; - case FreeRDP_HasExtendedMouseEvent: - return settings->HasExtendedMouseEvent; + case FreeRDP_RemdeskVirtualChannel: + return settings->RemdeskVirtualChannel; - case FreeRDP_SoundBeepsEnabled: - return settings->SoundBeepsEnabled; + case FreeRDP_RemoteAppLanguageBarSupported: + return settings->RemoteAppLanguageBarSupported; - case FreeRDP_SurfaceCommandsEnabled: - return settings->SurfaceCommandsEnabled; + case FreeRDP_RemoteApplicationMode: + return settings->RemoteApplicationMode; - case FreeRDP_FrameMarkerCommandEnabled: - return settings->FrameMarkerCommandEnabled; + case FreeRDP_RemoteAssistanceMode: + return settings->RemoteAssistanceMode; - case FreeRDP_SurfaceFrameMarkerEnabled: - return settings->SurfaceFrameMarkerEnabled; + case FreeRDP_RemoteAssistanceRequestControl: + return settings->RemoteAssistanceRequestControl; - case FreeRDP_RemoteFxOnly: - return settings->RemoteFxOnly; + case FreeRDP_RemoteConsoleAudio: + return settings->RemoteConsoleAudio; case FreeRDP_RemoteFxCodec: return settings->RemoteFxCodec; @@ -408,99 +384,123 @@ BOOL freerdp_settings_get_bool(const rdpSettings* settings, size_t id) case FreeRDP_RemoteFxImageCodec: return settings->RemoteFxImageCodec; - case FreeRDP_NSCodec: - return settings->NSCodec; - - case FreeRDP_NSCodecAllowSubsampling: - return settings->NSCodecAllowSubsampling; - - case FreeRDP_NSCodecAllowDynamicColorFidelity: - return settings->NSCodecAllowDynamicColorFidelity; - - case FreeRDP_JpegCodec: - return settings->JpegCodec; - - case FreeRDP_GfxThinClient: - return settings->GfxThinClient; - - case FreeRDP_GfxSmallCache: - return settings->GfxSmallCache; - - case FreeRDP_GfxProgressive: - return settings->GfxProgressive; - - case FreeRDP_GfxProgressiveV2: - return settings->GfxProgressiveV2; - - case FreeRDP_GfxH264: - return settings->GfxH264; - - case FreeRDP_GfxAVC444: - return settings->GfxAVC444; - - case FreeRDP_GfxSendQoeAck: - return settings->GfxSendQoeAck; - - case FreeRDP_GfxAVC444v2: - return settings->GfxAVC444v2; - - case FreeRDP_DrawNineGridEnabled: - return settings->DrawNineGridEnabled; + case FreeRDP_RemoteFxOnly: + return settings->RemoteFxOnly; - case FreeRDP_DrawGdiPlusEnabled: - return settings->DrawGdiPlusEnabled; + case FreeRDP_RestrictedAdminModeRequired: + return settings->RestrictedAdminModeRequired; - case FreeRDP_DrawGdiPlusCacheEnabled: - return settings->DrawGdiPlusCacheEnabled; + case FreeRDP_SaltedChecksum: + return settings->SaltedChecksum; - case FreeRDP_DeviceRedirection: - return settings->DeviceRedirection; + case FreeRDP_SendPreconnectionPdu: + return settings->SendPreconnectionPdu; - case FreeRDP_RedirectDrives: - return settings->RedirectDrives; + case FreeRDP_ServerMode: + return settings->ServerMode; - case FreeRDP_RedirectHomeDrive: - return settings->RedirectHomeDrive; + case FreeRDP_SmartSizing: + return settings->SmartSizing; - case FreeRDP_RedirectSmartCards: - return settings->RedirectSmartCards; + case FreeRDP_SmartcardLogon: + return settings->SmartcardLogon; - case FreeRDP_RedirectPrinters: - return settings->RedirectPrinters; + case FreeRDP_SoftwareGdi: + return settings->SoftwareGdi; - case FreeRDP_RedirectSerialPorts: - return settings->RedirectSerialPorts; + case FreeRDP_SoundBeepsEnabled: + return settings->SoundBeepsEnabled; - case FreeRDP_RedirectParallelPorts: - return settings->RedirectParallelPorts; + case FreeRDP_SpanMonitors: + return settings->SpanMonitors; - case FreeRDP_PreferIPv6OverIPv4: - return settings->PreferIPv6OverIPv4; + case FreeRDP_SupportAsymetricKeys: + return settings->SupportAsymetricKeys; - case FreeRDP_RedirectClipboard: - return settings->RedirectClipboard; + case FreeRDP_SupportDisplayControl: + return settings->SupportDisplayControl; case FreeRDP_SupportDynamicChannels: return settings->SupportDynamicChannels; + case FreeRDP_SupportDynamicTimeZone: + return settings->SupportDynamicTimeZone; + case FreeRDP_SupportEchoChannel: return settings->SupportEchoChannel; - case FreeRDP_SupportDisplayControl: - return settings->SupportDisplayControl; + case FreeRDP_SupportErrorInfoPdu: + return settings->SupportErrorInfoPdu; case FreeRDP_SupportGeometryTracking: return settings->SupportGeometryTracking; + case FreeRDP_SupportGraphicsPipeline: + return settings->SupportGraphicsPipeline; + + case FreeRDP_SupportHeartbeatPdu: + return settings->SupportHeartbeatPdu; + + case FreeRDP_SupportMonitorLayoutPdu: + return settings->SupportMonitorLayoutPdu; + + case FreeRDP_SupportMultitransport: + return settings->SupportMultitransport; + case FreeRDP_SupportSSHAgentChannel: return settings->SupportSSHAgentChannel; + case FreeRDP_SupportStatusInfoPdu: + return settings->SupportStatusInfoPdu; + case FreeRDP_SupportVideoOptimized: return settings->SupportVideoOptimized; + case FreeRDP_SuppressOutput: + return settings->SuppressOutput; + + case FreeRDP_SurfaceCommandsEnabled: + return settings->SurfaceCommandsEnabled; + + case FreeRDP_SurfaceFrameMarkerEnabled: + return settings->SurfaceFrameMarkerEnabled; + case FreeRDP_TcpKeepAlive: return settings->TcpKeepAlive; + case FreeRDP_TlsSecurity: + return settings->TlsSecurity; + + case FreeRDP_ToggleFullscreen: + return settings->ToggleFullscreen; + + case FreeRDP_UnicodeInput: + return settings->UnicodeInput; + + case FreeRDP_UnmapButtons: + return settings->UnmapButtons; + + case FreeRDP_UseMultimon: + return settings->UseMultimon; + + case FreeRDP_UseRdpSecurityLayer: + return settings->UseRdpSecurityLayer; + + case FreeRDP_UsingSavedCredentials: + return settings->UsingSavedCredentials; + + case FreeRDP_VideoDisable: + return settings->VideoDisable; + + case FreeRDP_VmConnectMode: + return settings->VmConnectMode; + + case FreeRDP_WaitForOutputBufferFlush: + return settings->WaitForOutputBufferFlush; + + case FreeRDP_Workarea: + return settings->Workarea; + default: WLog_ERR(TAG, "[%s] Invalid key index %" PRIuz, __FUNCTION__, id); return FALSE; @@ -514,656 +514,656 @@ BOOL freerdp_settings_set_bool(rdpSettings* settings, size_t id, BOOL val) switch (id) { - case FreeRDP_ServerMode: - settings->ServerMode = val; - break; - - case FreeRDP_WaitForOutputBufferFlush: - settings->WaitForOutputBufferFlush = val; + case FreeRDP_AllowCacheWaitingList: + settings->AllowCacheWaitingList = val; break; - case FreeRDP_NetworkAutoDetect: - settings->NetworkAutoDetect = val; + case FreeRDP_AllowDesktopComposition: + settings->AllowDesktopComposition = val; break; - case FreeRDP_SupportAsymetricKeys: - settings->SupportAsymetricKeys = val; + case FreeRDP_AllowFontSmoothing: + settings->AllowFontSmoothing = val; break; - case FreeRDP_SupportErrorInfoPdu: - settings->SupportErrorInfoPdu = val; + case FreeRDP_AllowUnanouncedOrdersFromServer: + settings->AllowUnanouncedOrdersFromServer = val; break; - case FreeRDP_SupportStatusInfoPdu: - settings->SupportStatusInfoPdu = val; + case FreeRDP_AltSecFrameMarkerSupport: + settings->AltSecFrameMarkerSupport = val; break; - case FreeRDP_SupportMonitorLayoutPdu: - settings->SupportMonitorLayoutPdu = val; + case FreeRDP_AsyncChannels: + settings->AsyncChannels = val; break; - case FreeRDP_SupportGraphicsPipeline: - settings->SupportGraphicsPipeline = val; + case FreeRDP_AsyncInput: + settings->AsyncInput = val; break; - case FreeRDP_SupportDynamicTimeZone: - settings->SupportDynamicTimeZone = val; + case FreeRDP_AsyncUpdate: + settings->AsyncUpdate = val; break; - case FreeRDP_SupportHeartbeatPdu: - settings->SupportHeartbeatPdu = val; + case FreeRDP_AudioCapture: + settings->AudioCapture = val; break; - case FreeRDP_UseRdpSecurityLayer: - settings->UseRdpSecurityLayer = val; + case FreeRDP_AudioPlayback: + settings->AudioPlayback = val; break; - case FreeRDP_ConsoleSession: - settings->ConsoleSession = val; + case FreeRDP_Authentication: + settings->Authentication = val; break; - case FreeRDP_SpanMonitors: - settings->SpanMonitors = val; + case FreeRDP_AuthenticationOnly: + settings->AuthenticationOnly = val; break; - case FreeRDP_UseMultimon: - settings->UseMultimon = val; + case FreeRDP_AutoAcceptCertificate: + settings->AutoAcceptCertificate = val; break; - case FreeRDP_ForceMultimon: - settings->ForceMultimon = val; + case FreeRDP_AutoDenyCertificate: + settings->AutoDenyCertificate = val; break; - case FreeRDP_ListMonitors: - settings->ListMonitors = val; + case FreeRDP_AutoLogonEnabled: + settings->AutoLogonEnabled = val; break; - case FreeRDP_HasMonitorAttributes: - settings->HasMonitorAttributes = val; + case FreeRDP_AutoReconnectionEnabled: + settings->AutoReconnectionEnabled = val; break; - case FreeRDP_SupportMultitransport: - settings->SupportMultitransport = val; + case FreeRDP_BitmapCacheEnabled: + settings->BitmapCacheEnabled = val; break; - case FreeRDP_AutoLogonEnabled: - settings->AutoLogonEnabled = val; + case FreeRDP_BitmapCachePersistEnabled: + settings->BitmapCachePersistEnabled = val; break; - case FreeRDP_CompressionEnabled: - settings->CompressionEnabled = val; + case FreeRDP_BitmapCacheV3Enabled: + settings->BitmapCacheV3Enabled = val; break; - case FreeRDP_DisableCtrlAltDel: - settings->DisableCtrlAltDel = val; + case FreeRDP_BitmapCompressionDisabled: + settings->BitmapCompressionDisabled = val; break; - case FreeRDP_EnableWindowsKey: - settings->EnableWindowsKey = val; + case FreeRDP_ColorPointerFlag: + settings->ColorPointerFlag = val; break; - case FreeRDP_MaximizeShell: - settings->MaximizeShell = val; + case FreeRDP_CompressionEnabled: + settings->CompressionEnabled = val; break; - case FreeRDP_LogonNotify: - settings->LogonNotify = val; + case FreeRDP_ConsoleSession: + settings->ConsoleSession = val; break; - case FreeRDP_LogonErrors: - settings->LogonErrors = val; + case FreeRDP_CredentialsFromStdin: + settings->CredentialsFromStdin = val; break; - case FreeRDP_MouseAttached: - settings->MouseAttached = val; + case FreeRDP_Decorations: + settings->Decorations = val; break; - case FreeRDP_MouseHasWheel: - settings->MouseHasWheel = val; + case FreeRDP_DesktopResize: + settings->DesktopResize = val; break; - case FreeRDP_RemoteConsoleAudio: - settings->RemoteConsoleAudio = val; + case FreeRDP_DeviceRedirection: + settings->DeviceRedirection = val; break; - case FreeRDP_AudioPlayback: - settings->AudioPlayback = val; + case FreeRDP_DisableCredentialsDelegation: + settings->DisableCredentialsDelegation = val; break; - case FreeRDP_AudioCapture: - settings->AudioCapture = val; + case FreeRDP_DisableCtrlAltDel: + settings->DisableCtrlAltDel = val; break; - case FreeRDP_VideoDisable: - settings->VideoDisable = val; + case FreeRDP_DisableCursorBlinking: + settings->DisableCursorBlinking = val; break; - case FreeRDP_PasswordIsSmartcardPin: - settings->PasswordIsSmartcardPin = val; + case FreeRDP_DisableCursorShadow: + settings->DisableCursorShadow = val; break; - case FreeRDP_UsingSavedCredentials: - settings->UsingSavedCredentials = val; + case FreeRDP_DisableFullWindowDrag: + settings->DisableFullWindowDrag = val; break; - case FreeRDP_ForceEncryptedCsPdu: - settings->ForceEncryptedCsPdu = val; + case FreeRDP_DisableMenuAnims: + settings->DisableMenuAnims = val; break; - case FreeRDP_HiDefRemoteApp: - settings->HiDefRemoteApp = val; + case FreeRDP_DisableRemoteAppCapsCheck: + settings->DisableRemoteAppCapsCheck = val; break; - case FreeRDP_IPv6Enabled: - settings->IPv6Enabled = val; + case FreeRDP_DisableThemes: + settings->DisableThemes = val; break; - case FreeRDP_AutoReconnectionEnabled: - settings->AutoReconnectionEnabled = val; + case FreeRDP_DisableWallpaper: + settings->DisableWallpaper = val; break; - case FreeRDP_PrintReconnectCookie: - settings->PrintReconnectCookie = val; + case FreeRDP_DrawAllowColorSubsampling: + settings->DrawAllowColorSubsampling = val; break; - case FreeRDP_DynamicDaylightTimeDisabled: - settings->DynamicDaylightTimeDisabled = val; + case FreeRDP_DrawAllowDynamicColorFidelity: + settings->DrawAllowDynamicColorFidelity = val; break; - case FreeRDP_AllowFontSmoothing: - settings->AllowFontSmoothing = val; + case FreeRDP_DrawAllowSkipAlpha: + settings->DrawAllowSkipAlpha = val; break; - case FreeRDP_DisableWallpaper: - settings->DisableWallpaper = val; + case FreeRDP_DrawGdiPlusCacheEnabled: + settings->DrawGdiPlusCacheEnabled = val; break; - case FreeRDP_DisableFullWindowDrag: - settings->DisableFullWindowDrag = val; + case FreeRDP_DrawGdiPlusEnabled: + settings->DrawGdiPlusEnabled = val; break; - case FreeRDP_DisableMenuAnims: - settings->DisableMenuAnims = val; + case FreeRDP_DrawNineGridEnabled: + settings->DrawNineGridEnabled = val; break; - case FreeRDP_DisableThemes: - settings->DisableThemes = val; + case FreeRDP_DumpRemoteFx: + settings->DumpRemoteFx = val; break; - case FreeRDP_DisableCursorShadow: - settings->DisableCursorShadow = val; + case FreeRDP_DynamicDaylightTimeDisabled: + settings->DynamicDaylightTimeDisabled = val; break; - case FreeRDP_DisableCursorBlinking: - settings->DisableCursorBlinking = val; + case FreeRDP_DynamicResolutionUpdate: + settings->DynamicResolutionUpdate = val; break; - case FreeRDP_AllowDesktopComposition: - settings->AllowDesktopComposition = val; + case FreeRDP_EmbeddedWindow: + settings->EmbeddedWindow = val; break; - case FreeRDP_RemoteAssistanceMode: - settings->RemoteAssistanceMode = val; + case FreeRDP_EnableWindowsKey: + settings->EnableWindowsKey = val; break; case FreeRDP_EncomspVirtualChannel: settings->EncomspVirtualChannel = val; break; - case FreeRDP_RemdeskVirtualChannel: - settings->RemdeskVirtualChannel = val; + case FreeRDP_ExtSecurity: + settings->ExtSecurity = val; break; - case FreeRDP_LyncRdpMode: - settings->LyncRdpMode = val; + case FreeRDP_ExternalCertificateManagement: + settings->ExternalCertificateManagement = val; break; - case FreeRDP_RemoteAssistanceRequestControl: - settings->RemoteAssistanceRequestControl = val; + case FreeRDP_FIPSMode: + settings->FIPSMode = val; break; - case FreeRDP_TlsSecurity: - settings->TlsSecurity = val; + case FreeRDP_FastPathInput: + settings->FastPathInput = val; break; - case FreeRDP_NlaSecurity: - settings->NlaSecurity = val; + case FreeRDP_FastPathOutput: + settings->FastPathOutput = val; break; - case FreeRDP_RdpSecurity: - settings->RdpSecurity = val; + case FreeRDP_ForceEncryptedCsPdu: + settings->ForceEncryptedCsPdu = val; break; - case FreeRDP_ExtSecurity: - settings->ExtSecurity = val; + case FreeRDP_ForceMultimon: + settings->ForceMultimon = val; break; - case FreeRDP_Authentication: - settings->Authentication = val; + case FreeRDP_FrameMarkerCommandEnabled: + settings->FrameMarkerCommandEnabled = val; break; - case FreeRDP_NegotiateSecurityLayer: - settings->NegotiateSecurityLayer = val; + case FreeRDP_Fullscreen: + settings->Fullscreen = val; break; - case FreeRDP_RestrictedAdminModeRequired: - settings->RestrictedAdminModeRequired = val; + case FreeRDP_GatewayBypassLocal: + settings->GatewayBypassLocal = val; break; - case FreeRDP_DisableCredentialsDelegation: - settings->DisableCredentialsDelegation = val; + case FreeRDP_GatewayEnabled: + settings->GatewayEnabled = val; break; - case FreeRDP_VmConnectMode: - settings->VmConnectMode = val; + case FreeRDP_GatewayHttpTransport: + settings->GatewayHttpTransport = val; break; - case FreeRDP_FIPSMode: - settings->FIPSMode = val; + case FreeRDP_GatewayRpcTransport: + settings->GatewayRpcTransport = val; break; - case FreeRDP_MstscCookieMode: - settings->MstscCookieMode = val; + case FreeRDP_GatewayUdpTransport: + settings->GatewayUdpTransport = val; break; - case FreeRDP_SendPreconnectionPdu: - settings->SendPreconnectionPdu = val; + case FreeRDP_GatewayUseSameCredentials: + settings->GatewayUseSameCredentials = val; break; - case FreeRDP_SmartcardLogon: - settings->SmartcardLogon = val; + case FreeRDP_GfxAVC444: + settings->GfxAVC444 = val; break; - case FreeRDP_PromptForCredentials: - settings->PromptForCredentials = val; + case FreeRDP_GfxAVC444v2: + settings->GfxAVC444v2 = val; break; - case FreeRDP_IgnoreCertificate: - settings->IgnoreCertificate = val; + case FreeRDP_GfxH264: + settings->GfxH264 = val; break; - case FreeRDP_ExternalCertificateManagement: - settings->ExternalCertificateManagement = val; + case FreeRDP_GfxProgressive: + settings->GfxProgressive = val; break; - case FreeRDP_AutoAcceptCertificate: - settings->AutoAcceptCertificate = val; + case FreeRDP_GfxProgressiveV2: + settings->GfxProgressiveV2 = val; break; - case FreeRDP_AutoDenyCertificate: - settings->AutoDenyCertificate = val; + case FreeRDP_GfxSendQoeAck: + settings->GfxSendQoeAck = val; break; - case FreeRDP_Workarea: - settings->Workarea = val; + case FreeRDP_GfxSmallCache: + settings->GfxSmallCache = val; break; - case FreeRDP_Fullscreen: - settings->Fullscreen = val; + case FreeRDP_GfxThinClient: + settings->GfxThinClient = val; break; case FreeRDP_GrabKeyboard: settings->GrabKeyboard = val; break; - case FreeRDP_Decorations: - settings->Decorations = val; + case FreeRDP_HasExtendedMouseEvent: + settings->HasExtendedMouseEvent = val; break; - case FreeRDP_MouseMotion: - settings->MouseMotion = val; + case FreeRDP_HasHorizontalWheel: + settings->HasHorizontalWheel = val; break; - case FreeRDP_AsyncInput: - settings->AsyncInput = val; + case FreeRDP_HasMonitorAttributes: + settings->HasMonitorAttributes = val; break; - case FreeRDP_AsyncUpdate: - settings->AsyncUpdate = val; + case FreeRDP_HiDefRemoteApp: + settings->HiDefRemoteApp = val; break; - case FreeRDP_AsyncChannels: - settings->AsyncChannels = val; + case FreeRDP_IPv6Enabled: + settings->IPv6Enabled = val; break; - case FreeRDP_ToggleFullscreen: - settings->ToggleFullscreen = val; + case FreeRDP_IgnoreCertificate: + settings->IgnoreCertificate = val; break; - case FreeRDP_EmbeddedWindow: - settings->EmbeddedWindow = val; + case FreeRDP_JpegCodec: + settings->JpegCodec = val; break; - case FreeRDP_SmartSizing: - settings->SmartSizing = val; + case FreeRDP_ListMonitors: + settings->ListMonitors = val; break; - case FreeRDP_PercentScreenUseWidth: - settings->PercentScreenUseWidth = val; + case FreeRDP_LocalConnection: + settings->LocalConnection = val; break; - case FreeRDP_PercentScreenUseHeight: - settings->PercentScreenUseHeight = val; + case FreeRDP_LogonErrors: + settings->LogonErrors = val; break; - case FreeRDP_DynamicResolutionUpdate: - settings->DynamicResolutionUpdate = val; + case FreeRDP_LogonNotify: + settings->LogonNotify = val; break; - case FreeRDP_SoftwareGdi: - settings->SoftwareGdi = val; + case FreeRDP_LongCredentialsSupported: + settings->LongCredentialsSupported = val; break; - case FreeRDP_LocalConnection: - settings->LocalConnection = val; + case FreeRDP_LyncRdpMode: + settings->LyncRdpMode = val; break; - case FreeRDP_AuthenticationOnly: - settings->AuthenticationOnly = val; + case FreeRDP_MaximizeShell: + settings->MaximizeShell = val; break; - case FreeRDP_CredentialsFromStdin: - settings->CredentialsFromStdin = val; + case FreeRDP_MouseAttached: + settings->MouseAttached = val; break; - case FreeRDP_UnmapButtons: - settings->UnmapButtons = val; + case FreeRDP_MouseHasWheel: + settings->MouseHasWheel = val; break; - case FreeRDP_OldLicenseBehaviour: - settings->OldLicenseBehaviour = val; + case FreeRDP_MouseMotion: + settings->MouseMotion = val; break; - case FreeRDP_DumpRemoteFx: - settings->DumpRemoteFx = val; + case FreeRDP_MstscCookieMode: + settings->MstscCookieMode = val; break; - case FreeRDP_PlayRemoteFx: - settings->PlayRemoteFx = val; + case FreeRDP_MultiTouchGestures: + settings->MultiTouchGestures = val; break; - case FreeRDP_GatewayUseSameCredentials: - settings->GatewayUseSameCredentials = val; + case FreeRDP_MultiTouchInput: + settings->MultiTouchInput = val; break; - case FreeRDP_GatewayEnabled: - settings->GatewayEnabled = val; + case FreeRDP_NSCodec: + settings->NSCodec = val; break; - case FreeRDP_GatewayBypassLocal: - settings->GatewayBypassLocal = val; + case FreeRDP_NSCodecAllowDynamicColorFidelity: + settings->NSCodecAllowDynamicColorFidelity = val; break; - case FreeRDP_GatewayRpcTransport: - settings->GatewayRpcTransport = val; + case FreeRDP_NSCodecAllowSubsampling: + settings->NSCodecAllowSubsampling = val; break; - case FreeRDP_GatewayHttpTransport: - settings->GatewayHttpTransport = val; + case FreeRDP_NegotiateSecurityLayer: + settings->NegotiateSecurityLayer = val; break; - case FreeRDP_GatewayUdpTransport: - settings->GatewayUdpTransport = val; + case FreeRDP_NetworkAutoDetect: + settings->NetworkAutoDetect = val; break; - case FreeRDP_RemoteApplicationMode: - settings->RemoteApplicationMode = val; + case FreeRDP_NlaSecurity: + settings->NlaSecurity = val; break; - case FreeRDP_DisableRemoteAppCapsCheck: - settings->DisableRemoteAppCapsCheck = val; + case FreeRDP_NoBitmapCompressionHeader: + settings->NoBitmapCompressionHeader = val; break; - case FreeRDP_RemoteAppLanguageBarSupported: - settings->RemoteAppLanguageBarSupported = val; + case FreeRDP_OldLicenseBehaviour: + settings->OldLicenseBehaviour = val; break; - case FreeRDP_RefreshRect: - settings->RefreshRect = val; + case FreeRDP_PasswordIsSmartcardPin: + settings->PasswordIsSmartcardPin = val; break; - case FreeRDP_SuppressOutput: - settings->SuppressOutput = val; + case FreeRDP_PercentScreenUseHeight: + settings->PercentScreenUseHeight = val; break; - case FreeRDP_FastPathOutput: - settings->FastPathOutput = val; + case FreeRDP_PercentScreenUseWidth: + settings->PercentScreenUseWidth = val; break; - case FreeRDP_SaltedChecksum: - settings->SaltedChecksum = val; + case FreeRDP_PlayRemoteFx: + settings->PlayRemoteFx = val; break; - case FreeRDP_LongCredentialsSupported: - settings->LongCredentialsSupported = val; + case FreeRDP_PreferIPv6OverIPv4: + settings->PreferIPv6OverIPv4 = val; break; - case FreeRDP_NoBitmapCompressionHeader: - settings->NoBitmapCompressionHeader = val; + case FreeRDP_PrintReconnectCookie: + settings->PrintReconnectCookie = val; break; - case FreeRDP_BitmapCompressionDisabled: - settings->BitmapCompressionDisabled = val; + case FreeRDP_PromptForCredentials: + settings->PromptForCredentials = val; break; - case FreeRDP_DesktopResize: - settings->DesktopResize = val; + case FreeRDP_RdpSecurity: + settings->RdpSecurity = val; break; - case FreeRDP_DrawAllowDynamicColorFidelity: - settings->DrawAllowDynamicColorFidelity = val; + case FreeRDP_RedirectClipboard: + settings->RedirectClipboard = val; break; - case FreeRDP_DrawAllowColorSubsampling: - settings->DrawAllowColorSubsampling = val; + case FreeRDP_RedirectDrives: + settings->RedirectDrives = val; break; - case FreeRDP_DrawAllowSkipAlpha: - settings->DrawAllowSkipAlpha = val; + case FreeRDP_RedirectHomeDrive: + settings->RedirectHomeDrive = val; break; - case FreeRDP_BitmapCacheV3Enabled: - settings->BitmapCacheV3Enabled = val; + case FreeRDP_RedirectParallelPorts: + settings->RedirectParallelPorts = val; break; - case FreeRDP_AltSecFrameMarkerSupport: - settings->AltSecFrameMarkerSupport = val; + case FreeRDP_RedirectPrinters: + settings->RedirectPrinters = val; break; - case FreeRDP_AllowUnanouncedOrdersFromServer: - settings->AllowUnanouncedOrdersFromServer = val; + case FreeRDP_RedirectSerialPorts: + settings->RedirectSerialPorts = val; break; - case FreeRDP_BitmapCacheEnabled: - settings->BitmapCacheEnabled = val; + case FreeRDP_RedirectSmartCards: + settings->RedirectSmartCards = val; break; - case FreeRDP_AllowCacheWaitingList: - settings->AllowCacheWaitingList = val; + case FreeRDP_RefreshRect: + settings->RefreshRect = val; break; - case FreeRDP_BitmapCachePersistEnabled: - settings->BitmapCachePersistEnabled = val; + case FreeRDP_RemdeskVirtualChannel: + settings->RemdeskVirtualChannel = val; break; - case FreeRDP_ColorPointerFlag: - settings->ColorPointerFlag = val; + case FreeRDP_RemoteAppLanguageBarSupported: + settings->RemoteAppLanguageBarSupported = val; break; - case FreeRDP_UnicodeInput: - settings->UnicodeInput = val; + case FreeRDP_RemoteApplicationMode: + settings->RemoteApplicationMode = val; break; - case FreeRDP_FastPathInput: - settings->FastPathInput = val; + case FreeRDP_RemoteAssistanceMode: + settings->RemoteAssistanceMode = val; break; - case FreeRDP_MultiTouchInput: - settings->MultiTouchInput = val; + case FreeRDP_RemoteAssistanceRequestControl: + settings->RemoteAssistanceRequestControl = val; break; - case FreeRDP_MultiTouchGestures: - settings->MultiTouchGestures = val; + case FreeRDP_RemoteConsoleAudio: + settings->RemoteConsoleAudio = val; break; - case FreeRDP_HasHorizontalWheel: - settings->HasHorizontalWheel = val; + case FreeRDP_RemoteFxCodec: + settings->RemoteFxCodec = val; break; - case FreeRDP_HasExtendedMouseEvent: - settings->HasExtendedMouseEvent = val; + case FreeRDP_RemoteFxImageCodec: + settings->RemoteFxImageCodec = val; break; - case FreeRDP_SoundBeepsEnabled: - settings->SoundBeepsEnabled = val; + case FreeRDP_RemoteFxOnly: + settings->RemoteFxOnly = val; break; - case FreeRDP_SurfaceCommandsEnabled: - settings->SurfaceCommandsEnabled = val; + case FreeRDP_RestrictedAdminModeRequired: + settings->RestrictedAdminModeRequired = val; break; - case FreeRDP_FrameMarkerCommandEnabled: - settings->FrameMarkerCommandEnabled = val; + case FreeRDP_SaltedChecksum: + settings->SaltedChecksum = val; break; - case FreeRDP_SurfaceFrameMarkerEnabled: - settings->SurfaceFrameMarkerEnabled = val; + case FreeRDP_SendPreconnectionPdu: + settings->SendPreconnectionPdu = val; break; - case FreeRDP_RemoteFxOnly: - settings->RemoteFxOnly = val; + case FreeRDP_ServerMode: + settings->ServerMode = val; break; - case FreeRDP_RemoteFxCodec: - settings->RemoteFxCodec = val; + case FreeRDP_SmartSizing: + settings->SmartSizing = val; break; - case FreeRDP_RemoteFxImageCodec: - settings->RemoteFxImageCodec = val; + case FreeRDP_SmartcardLogon: + settings->SmartcardLogon = val; break; - case FreeRDP_NSCodec: - settings->NSCodec = val; + case FreeRDP_SoftwareGdi: + settings->SoftwareGdi = val; break; - case FreeRDP_NSCodecAllowSubsampling: - settings->NSCodecAllowSubsampling = val; + case FreeRDP_SoundBeepsEnabled: + settings->SoundBeepsEnabled = val; break; - case FreeRDP_NSCodecAllowDynamicColorFidelity: - settings->NSCodecAllowDynamicColorFidelity = val; + case FreeRDP_SpanMonitors: + settings->SpanMonitors = val; break; - case FreeRDP_JpegCodec: - settings->JpegCodec = val; + case FreeRDP_SupportAsymetricKeys: + settings->SupportAsymetricKeys = val; break; - case FreeRDP_GfxThinClient: - settings->GfxThinClient = val; + case FreeRDP_SupportDisplayControl: + settings->SupportDisplayControl = val; break; - case FreeRDP_GfxSmallCache: - settings->GfxSmallCache = val; + case FreeRDP_SupportDynamicChannels: + settings->SupportDynamicChannels = val; break; - case FreeRDP_GfxProgressive: - settings->GfxProgressive = val; + case FreeRDP_SupportDynamicTimeZone: + settings->SupportDynamicTimeZone = val; break; - case FreeRDP_GfxProgressiveV2: - settings->GfxProgressiveV2 = val; + case FreeRDP_SupportEchoChannel: + settings->SupportEchoChannel = val; break; - case FreeRDP_GfxH264: - settings->GfxH264 = val; + case FreeRDP_SupportErrorInfoPdu: + settings->SupportErrorInfoPdu = val; break; - case FreeRDP_GfxAVC444: - settings->GfxAVC444 = val; + case FreeRDP_SupportGeometryTracking: + settings->SupportGeometryTracking = val; break; - case FreeRDP_GfxSendQoeAck: - settings->GfxSendQoeAck = val; + case FreeRDP_SupportGraphicsPipeline: + settings->SupportGraphicsPipeline = val; break; - case FreeRDP_GfxAVC444v2: - settings->GfxAVC444v2 = val; + case FreeRDP_SupportHeartbeatPdu: + settings->SupportHeartbeatPdu = val; break; - case FreeRDP_DrawNineGridEnabled: - settings->DrawNineGridEnabled = val; + case FreeRDP_SupportMonitorLayoutPdu: + settings->SupportMonitorLayoutPdu = val; break; - case FreeRDP_DrawGdiPlusEnabled: - settings->DrawGdiPlusEnabled = val; + case FreeRDP_SupportMultitransport: + settings->SupportMultitransport = val; break; - case FreeRDP_DrawGdiPlusCacheEnabled: - settings->DrawGdiPlusCacheEnabled = val; + case FreeRDP_SupportSSHAgentChannel: + settings->SupportSSHAgentChannel = val; break; - case FreeRDP_DeviceRedirection: - settings->DeviceRedirection = val; + case FreeRDP_SupportStatusInfoPdu: + settings->SupportStatusInfoPdu = val; break; - case FreeRDP_RedirectDrives: - settings->RedirectDrives = val; + case FreeRDP_SupportVideoOptimized: + settings->SupportVideoOptimized = val; break; - case FreeRDP_RedirectHomeDrive: - settings->RedirectHomeDrive = val; + case FreeRDP_SuppressOutput: + settings->SuppressOutput = val; break; - case FreeRDP_RedirectSmartCards: - settings->RedirectSmartCards = val; + case FreeRDP_SurfaceCommandsEnabled: + settings->SurfaceCommandsEnabled = val; break; - case FreeRDP_RedirectPrinters: - settings->RedirectPrinters = val; + case FreeRDP_SurfaceFrameMarkerEnabled: + settings->SurfaceFrameMarkerEnabled = val; break; - case FreeRDP_RedirectSerialPorts: - settings->RedirectSerialPorts = val; + case FreeRDP_TcpKeepAlive: + settings->TcpKeepAlive = val; break; - case FreeRDP_RedirectParallelPorts: - settings->RedirectParallelPorts = val; + case FreeRDP_TlsSecurity: + settings->TlsSecurity = val; break; - case FreeRDP_PreferIPv6OverIPv4: - settings->PreferIPv6OverIPv4 = val; + case FreeRDP_ToggleFullscreen: + settings->ToggleFullscreen = val; break; - case FreeRDP_RedirectClipboard: - settings->RedirectClipboard = val; + case FreeRDP_UnicodeInput: + settings->UnicodeInput = val; break; - case FreeRDP_SupportDynamicChannels: - settings->SupportDynamicChannels = val; + case FreeRDP_UnmapButtons: + settings->UnmapButtons = val; break; - case FreeRDP_SupportEchoChannel: - settings->SupportEchoChannel = val; + case FreeRDP_UseMultimon: + settings->UseMultimon = val; break; - case FreeRDP_SupportDisplayControl: - settings->SupportDisplayControl = val; + case FreeRDP_UseRdpSecurityLayer: + settings->UseRdpSecurityLayer = val; break; - case FreeRDP_SupportGeometryTracking: - settings->SupportGeometryTracking = val; + case FreeRDP_UsingSavedCredentials: + settings->UsingSavedCredentials = val; break; - case FreeRDP_SupportSSHAgentChannel: - settings->SupportSSHAgentChannel = val; + case FreeRDP_VideoDisable: + settings->VideoDisable = val; break; - case FreeRDP_SupportVideoOptimized: - settings->SupportVideoOptimized = val; + case FreeRDP_VmConnectMode: + settings->VmConnectMode = val; break; - case FreeRDP_TcpKeepAlive: - settings->TcpKeepAlive = val; + case FreeRDP_WaitForOutputBufferFlush: + settings->WaitForOutputBufferFlush = val; + break; + + case FreeRDP_Workarea: + settings->Workarea = val; break; default: @@ -1248,209 +1248,203 @@ UINT32 freerdp_settings_get_uint32(const rdpSettings* settings, size_t id) switch (id) { - case FreeRDP_ShareId: - return settings->ShareId; - - case FreeRDP_PduSource: - return settings->PduSource; + case FreeRDP_AcceptedCertLength: + return settings->AcceptedCertLength; - case FreeRDP_ServerPort: - return settings->ServerPort; + case FreeRDP_AuthenticationLevel: + return settings->AuthenticationLevel; - case FreeRDP_MaxTimeInCheckLoop: - return settings->MaxTimeInCheckLoop; + case FreeRDP_AutoReconnectMaxRetries: + return settings->AutoReconnectMaxRetries; - case FreeRDP_AcceptedCertLength: - return settings->AcceptedCertLength; + case FreeRDP_BitmapCacheV2NumCells: + return settings->BitmapCacheV2NumCells; - case FreeRDP_RdpVersion: - return settings->RdpVersion; + case FreeRDP_BitmapCacheV3CodecId: + return settings->BitmapCacheV3CodecId; - case FreeRDP_DesktopWidth: - return settings->DesktopWidth; + case FreeRDP_BitmapCacheVersion: + return settings->BitmapCacheVersion; - case FreeRDP_DesktopHeight: - return settings->DesktopHeight; + case FreeRDP_BrushSupportLevel: + return settings->BrushSupportLevel; - case FreeRDP_ColorDepth: - return settings->ColorDepth; + case FreeRDP_ChannelCount: + return settings->ChannelCount; - case FreeRDP_ConnectionType: - return settings->ConnectionType; + case FreeRDP_ChannelDefArraySize: + return settings->ChannelDefArraySize; case FreeRDP_ClientBuild: return settings->ClientBuild; - case FreeRDP_EarlyCapabilityFlags: - return settings->EarlyCapabilityFlags; - - case FreeRDP_DesktopPhysicalWidth: - return settings->DesktopPhysicalWidth; + case FreeRDP_ClientRandomLength: + return settings->ClientRandomLength; - case FreeRDP_DesktopPhysicalHeight: - return settings->DesktopPhysicalHeight; + case FreeRDP_ClusterInfoFlags: + return settings->ClusterInfoFlags; - case FreeRDP_DesktopScaleFactor: - return settings->DesktopScaleFactor; + case FreeRDP_ColorDepth: + return settings->ColorDepth; - case FreeRDP_DeviceScaleFactor: - return settings->DeviceScaleFactor; + case FreeRDP_CompDeskSupportLevel: + return settings->CompDeskSupportLevel; - case FreeRDP_EncryptionMethods: - return settings->EncryptionMethods; + case FreeRDP_CompressionLevel: + return settings->CompressionLevel; - case FreeRDP_ExtEncryptionMethods: - return settings->ExtEncryptionMethods; + case FreeRDP_ConnectionType: + return settings->ConnectionType; - case FreeRDP_EncryptionLevel: - return settings->EncryptionLevel; + case FreeRDP_CookieMaxLength: + return settings->CookieMaxLength; - case FreeRDP_ServerRandomLength: - return settings->ServerRandomLength; + case FreeRDP_DesktopHeight: + return settings->DesktopHeight; - case FreeRDP_ServerCertificateLength: - return settings->ServerCertificateLength; + case FreeRDP_DesktopPhysicalHeight: + return settings->DesktopPhysicalHeight; - case FreeRDP_ClientRandomLength: - return settings->ClientRandomLength; + case FreeRDP_DesktopPhysicalWidth: + return settings->DesktopPhysicalWidth; - case FreeRDP_ChannelCount: - return settings->ChannelCount; + case FreeRDP_DesktopPosX: + return settings->DesktopPosX; - case FreeRDP_ChannelDefArraySize: - return settings->ChannelDefArraySize; + case FreeRDP_DesktopPosY: + return settings->DesktopPosY; - case FreeRDP_ClusterInfoFlags: - return settings->ClusterInfoFlags; + case FreeRDP_DesktopScaleFactor: + return settings->DesktopScaleFactor; - case FreeRDP_RedirectedSessionId: - return settings->RedirectedSessionId; + case FreeRDP_DesktopWidth: + return settings->DesktopWidth; - case FreeRDP_MonitorCount: - return settings->MonitorCount; + case FreeRDP_DeviceArraySize: + return settings->DeviceArraySize; - case FreeRDP_MonitorDefArraySize: - return settings->MonitorDefArraySize; + case FreeRDP_DeviceCount: + return settings->DeviceCount; - case FreeRDP_DesktopPosX: - return settings->DesktopPosX; + case FreeRDP_DeviceScaleFactor: + return settings->DeviceScaleFactor; - case FreeRDP_DesktopPosY: - return settings->DesktopPosY; + case FreeRDP_DrawNineGridCacheEntries: + return settings->DrawNineGridCacheEntries; - case FreeRDP_NumMonitorIds: - return settings->NumMonitorIds; + case FreeRDP_DrawNineGridCacheSize: + return settings->DrawNineGridCacheSize; - case FreeRDP_MonitorLocalShiftX: - return settings->MonitorLocalShiftX; + case FreeRDP_DynamicChannelArraySize: + return settings->DynamicChannelArraySize; - case FreeRDP_MonitorLocalShiftY: - return settings->MonitorLocalShiftY; + case FreeRDP_DynamicChannelCount: + return settings->DynamicChannelCount; - case FreeRDP_MultitransportFlags: - return settings->MultitransportFlags; + case FreeRDP_EarlyCapabilityFlags: + return settings->EarlyCapabilityFlags; - case FreeRDP_CompressionLevel: - return settings->CompressionLevel; + case FreeRDP_EncryptionLevel: + return settings->EncryptionLevel; - case FreeRDP_AutoReconnectMaxRetries: - return settings->AutoReconnectMaxRetries; + case FreeRDP_EncryptionMethods: + return settings->EncryptionMethods; - case FreeRDP_PerformanceFlags: - return settings->PerformanceFlags; + case FreeRDP_ExtEncryptionMethods: + return settings->ExtEncryptionMethods; - case FreeRDP_RequestedProtocols: - return settings->RequestedProtocols; + case FreeRDP_FrameAcknowledge: + return settings->FrameAcknowledge; - case FreeRDP_SelectedProtocol: - return settings->SelectedProtocol; + case FreeRDP_GatewayAcceptedCertLength: + return settings->GatewayAcceptedCertLength; - case FreeRDP_NegotiationFlags: - return settings->NegotiationFlags; + case FreeRDP_GatewayCredentialsSource: + return settings->GatewayCredentialsSource; - case FreeRDP_AuthenticationLevel: - return settings->AuthenticationLevel; + case FreeRDP_GatewayPort: + return settings->GatewayPort; - case FreeRDP_TlsSecLevel: - return settings->TlsSecLevel; + case FreeRDP_GatewayUsageMethod: + return settings->GatewayUsageMethod; - case FreeRDP_CookieMaxLength: - return settings->CookieMaxLength; + case FreeRDP_GfxCapsFilter: + return settings->GfxCapsFilter; - case FreeRDP_PreconnectionId: - return settings->PreconnectionId; + case FreeRDP_GlyphSupportLevel: + return settings->GlyphSupportLevel; - case FreeRDP_RedirectionFlags: - return settings->RedirectionFlags; + case FreeRDP_JpegCodecId: + return settings->JpegCodecId; - case FreeRDP_LoadBalanceInfoLength: - return settings->LoadBalanceInfoLength; + case FreeRDP_JpegQuality: + return settings->JpegQuality; - case FreeRDP_RedirectionPasswordLength: - return settings->RedirectionPasswordLength; + case FreeRDP_KeyboardCodePage: + return settings->KeyboardCodePage; - case FreeRDP_RedirectionTsvUrlLength: - return settings->RedirectionTsvUrlLength; + case FreeRDP_KeyboardFunctionKey: + return settings->KeyboardFunctionKey; - case FreeRDP_TargetNetAddressCount: - return settings->TargetNetAddressCount; + case FreeRDP_KeyboardHook: + return settings->KeyboardHook; - case FreeRDP_RedirectionAcceptedCertLength: - return settings->RedirectionAcceptedCertLength; + case FreeRDP_KeyboardLayout: + return settings->KeyboardLayout; - case FreeRDP_RedirectionPreferType: - return settings->RedirectionPreferType; + case FreeRDP_KeyboardSubType: + return settings->KeyboardSubType; - case FreeRDP_Password51Length: - return settings->Password51Length; + case FreeRDP_KeyboardType: + return settings->KeyboardType; - case FreeRDP_PercentScreen: - return settings->PercentScreen; + case FreeRDP_LargePointerFlag: + return settings->LargePointerFlag; - case FreeRDP_SmartSizingWidth: - return settings->SmartSizingWidth; + case FreeRDP_LoadBalanceInfoLength: + return settings->LoadBalanceInfoLength; - case FreeRDP_SmartSizingHeight: - return settings->SmartSizingHeight; + case FreeRDP_MaxTimeInCheckLoop: + return settings->MaxTimeInCheckLoop; - case FreeRDP_GatewayUsageMethod: - return settings->GatewayUsageMethod; + case FreeRDP_MonitorCount: + return settings->MonitorCount; - case FreeRDP_GatewayPort: - return settings->GatewayPort; + case FreeRDP_MonitorDefArraySize: + return settings->MonitorDefArraySize; - case FreeRDP_GatewayCredentialsSource: - return settings->GatewayCredentialsSource; + case FreeRDP_MonitorLocalShiftX: + return settings->MonitorLocalShiftX; - case FreeRDP_GatewayAcceptedCertLength: - return settings->GatewayAcceptedCertLength; + case FreeRDP_MonitorLocalShiftY: + return settings->MonitorLocalShiftY; - case FreeRDP_ProxyType: - return settings->ProxyType; + case FreeRDP_MultifragMaxRequestSize: + return settings->MultifragMaxRequestSize; - case FreeRDP_RemoteApplicationExpandCmdLine: - return settings->RemoteApplicationExpandCmdLine; + case FreeRDP_MultitransportFlags: + return settings->MultitransportFlags; - case FreeRDP_RemoteApplicationExpandWorkingDir: - return settings->RemoteApplicationExpandWorkingDir; + case FreeRDP_NSCodecColorLossLevel: + return settings->NSCodecColorLossLevel; - case FreeRDP_RemoteAppNumIconCaches: - return settings->RemoteAppNumIconCaches; + case FreeRDP_NSCodecId: + return settings->NSCodecId; - case FreeRDP_RemoteAppNumIconCacheEntries: - return settings->RemoteAppNumIconCacheEntries; + case FreeRDP_NegotiationFlags: + return settings->NegotiationFlags; - case FreeRDP_RemoteWndSupportLevel: - return settings->RemoteWndSupportLevel; + case FreeRDP_NumMonitorIds: + return settings->NumMonitorIds; - case FreeRDP_RemoteApplicationSupportLevel: - return settings->RemoteApplicationSupportLevel; + case FreeRDP_OffscreenCacheEntries: + return settings->OffscreenCacheEntries; - case FreeRDP_RemoteApplicationSupportMask: - return settings->RemoteApplicationSupportMask; + case FreeRDP_OffscreenCacheSize: + return settings->OffscreenCacheSize; - case FreeRDP_ReceivedCapabilitiesSize: - return settings->ReceivedCapabilitiesSize; + case FreeRDP_OffscreenSupportLevel: + return settings->OffscreenSupportLevel; case FreeRDP_OsMajorType: return settings->OsMajorType; @@ -1458,62 +1452,71 @@ UINT32 freerdp_settings_get_uint32(const rdpSettings* settings, size_t id) case FreeRDP_OsMinorType: return settings->OsMinorType; - case FreeRDP_BitmapCacheVersion: - return settings->BitmapCacheVersion; + case FreeRDP_Password51Length: + return settings->Password51Length; - case FreeRDP_BitmapCacheV2NumCells: - return settings->BitmapCacheV2NumCells; + case FreeRDP_PduSource: + return settings->PduSource; + + case FreeRDP_PercentScreen: + return settings->PercentScreen; + + case FreeRDP_PerformanceFlags: + return settings->PerformanceFlags; case FreeRDP_PointerCacheSize: return settings->PointerCacheSize; - case FreeRDP_KeyboardCodePage: - return settings->KeyboardCodePage; + case FreeRDP_PreconnectionId: + return settings->PreconnectionId; - case FreeRDP_KeyboardLayout: - return settings->KeyboardLayout; + case FreeRDP_ProxyType: + return settings->ProxyType; - case FreeRDP_KeyboardType: - return settings->KeyboardType; + case FreeRDP_RdpVersion: + return settings->RdpVersion; - case FreeRDP_KeyboardSubType: - return settings->KeyboardSubType; + case FreeRDP_ReceivedCapabilitiesSize: + return settings->ReceivedCapabilitiesSize; - case FreeRDP_KeyboardFunctionKey: - return settings->KeyboardFunctionKey; + case FreeRDP_RedirectedSessionId: + return settings->RedirectedSessionId; - case FreeRDP_KeyboardHook: - return settings->KeyboardHook; + case FreeRDP_RedirectionAcceptedCertLength: + return settings->RedirectionAcceptedCertLength; - case FreeRDP_BrushSupportLevel: - return settings->BrushSupportLevel; + case FreeRDP_RedirectionFlags: + return settings->RedirectionFlags; - case FreeRDP_GlyphSupportLevel: - return settings->GlyphSupportLevel; + case FreeRDP_RedirectionPasswordLength: + return settings->RedirectionPasswordLength; - case FreeRDP_OffscreenSupportLevel: - return settings->OffscreenSupportLevel; + case FreeRDP_RedirectionPreferType: + return settings->RedirectionPreferType; - case FreeRDP_OffscreenCacheSize: - return settings->OffscreenCacheSize; + case FreeRDP_RedirectionTsvUrlLength: + return settings->RedirectionTsvUrlLength; - case FreeRDP_OffscreenCacheEntries: - return settings->OffscreenCacheEntries; + case FreeRDP_RemoteAppNumIconCacheEntries: + return settings->RemoteAppNumIconCacheEntries; - case FreeRDP_VirtualChannelCompressionFlags: - return settings->VirtualChannelCompressionFlags; + case FreeRDP_RemoteAppNumIconCaches: + return settings->RemoteAppNumIconCaches; - case FreeRDP_VirtualChannelChunkSize: - return settings->VirtualChannelChunkSize; + case FreeRDP_RemoteApplicationExpandCmdLine: + return settings->RemoteApplicationExpandCmdLine; - case FreeRDP_MultifragMaxRequestSize: - return settings->MultifragMaxRequestSize; + case FreeRDP_RemoteApplicationExpandWorkingDir: + return settings->RemoteApplicationExpandWorkingDir; - case FreeRDP_LargePointerFlag: - return settings->LargePointerFlag; + case FreeRDP_RemoteApplicationSupportLevel: + return settings->RemoteApplicationSupportLevel; - case FreeRDP_CompDeskSupportLevel: - return settings->CompDeskSupportLevel; + case FreeRDP_RemoteApplicationSupportMask: + return settings->RemoteApplicationSupportMask; + + case FreeRDP_RemoteFxCaptureFlags: + return settings->RemoteFxCaptureFlags; case FreeRDP_RemoteFxCodecId: return settings->RemoteFxCodecId; @@ -1521,56 +1524,44 @@ UINT32 freerdp_settings_get_uint32(const rdpSettings* settings, size_t id) case FreeRDP_RemoteFxCodecMode: return settings->RemoteFxCodecMode; - case FreeRDP_RemoteFxCaptureFlags: - return settings->RemoteFxCaptureFlags; - - case FreeRDP_NSCodecId: - return settings->NSCodecId; - - case FreeRDP_FrameAcknowledge: - return settings->FrameAcknowledge; - - case FreeRDP_NSCodecColorLossLevel: - return settings->NSCodecColorLossLevel; - - case FreeRDP_JpegCodecId: - return settings->JpegCodecId; + case FreeRDP_RemoteWndSupportLevel: + return settings->RemoteWndSupportLevel; - case FreeRDP_JpegQuality: - return settings->JpegQuality; + case FreeRDP_RequestedProtocols: + return settings->RequestedProtocols; - case FreeRDP_GfxCapsFilter: - return settings->GfxCapsFilter; + case FreeRDP_SelectedProtocol: + return settings->SelectedProtocol; - case FreeRDP_BitmapCacheV3CodecId: - return settings->BitmapCacheV3CodecId; + case FreeRDP_ServerCertificateLength: + return settings->ServerCertificateLength; - case FreeRDP_DrawNineGridCacheSize: - return settings->DrawNineGridCacheSize; + case FreeRDP_ServerPort: + return settings->ServerPort; - case FreeRDP_DrawNineGridCacheEntries: - return settings->DrawNineGridCacheEntries; + case FreeRDP_ServerRandomLength: + return settings->ServerRandomLength; - case FreeRDP_DeviceCount: - return settings->DeviceCount; + case FreeRDP_ShareId: + return settings->ShareId; - case FreeRDP_DeviceArraySize: - return settings->DeviceArraySize; + case FreeRDP_SmartSizingHeight: + return settings->SmartSizingHeight; - case FreeRDP_StaticChannelCount: - return settings->StaticChannelCount; + case FreeRDP_SmartSizingWidth: + return settings->SmartSizingWidth; case FreeRDP_StaticChannelArraySize: return settings->StaticChannelArraySize; - case FreeRDP_DynamicChannelCount: - return settings->DynamicChannelCount; + case FreeRDP_StaticChannelCount: + return settings->StaticChannelCount; - case FreeRDP_DynamicChannelArraySize: - return settings->DynamicChannelArraySize; + case FreeRDP_TargetNetAddressCount: + return settings->TargetNetAddressCount; - case FreeRDP_TcpKeepAliveRetries: - return settings->TcpKeepAliveRetries; + case FreeRDP_TcpAckTimeout: + return settings->TcpAckTimeout; case FreeRDP_TcpKeepAliveDelay: return settings->TcpKeepAliveDelay; @@ -1578,8 +1569,17 @@ UINT32 freerdp_settings_get_uint32(const rdpSettings* settings, size_t id) case FreeRDP_TcpKeepAliveInterval: return settings->TcpKeepAliveInterval; - case FreeRDP_TcpAckTimeout: - return settings->TcpAckTimeout; + case FreeRDP_TcpKeepAliveRetries: + return settings->TcpKeepAliveRetries; + + case FreeRDP_TlsSecLevel: + return settings->TlsSecLevel; + + case FreeRDP_VirtualChannelChunkSize: + return settings->VirtualChannelChunkSize; + + case FreeRDP_VirtualChannelCompressionFlags: + return settings->VirtualChannelCompressionFlags; default: WLog_ERR(TAG, "[%s] Invalid key index %" PRIuz, __FUNCTION__, id); @@ -1594,276 +1594,268 @@ BOOL freerdp_settings_set_uint32(rdpSettings* settings, size_t id, UINT32 val) switch (id) { - case FreeRDP_ShareId: - settings->ShareId = val; - break; - - case FreeRDP_PduSource: - settings->PduSource = val; + case FreeRDP_AcceptedCertLength: + settings->AcceptedCertLength = val; break; - case FreeRDP_ServerPort: - settings->ServerPort = val; + case FreeRDP_AuthenticationLevel: + settings->AuthenticationLevel = val; break; - case FreeRDP_MaxTimeInCheckLoop: - settings->MaxTimeInCheckLoop = val; + case FreeRDP_AutoReconnectMaxRetries: + settings->AutoReconnectMaxRetries = val; break; - case FreeRDP_AcceptedCertLength: - settings->AcceptedCertLength = val; + case FreeRDP_BitmapCacheV2NumCells: + settings->BitmapCacheV2NumCells = val; break; - case FreeRDP_RdpVersion: - settings->RdpVersion = val; + case FreeRDP_BitmapCacheV3CodecId: + settings->BitmapCacheV3CodecId = val; break; - case FreeRDP_DesktopWidth: - settings->DesktopWidth = val; + case FreeRDP_BitmapCacheVersion: + settings->BitmapCacheVersion = val; break; - case FreeRDP_DesktopHeight: - settings->DesktopHeight = val; + case FreeRDP_BrushSupportLevel: + settings->BrushSupportLevel = val; break; - case FreeRDP_ColorDepth: - settings->ColorDepth = val; + case FreeRDP_ChannelCount: + settings->ChannelCount = val; break; - case FreeRDP_ConnectionType: - settings->ConnectionType = val; + case FreeRDP_ChannelDefArraySize: + settings->ChannelDefArraySize = val; break; case FreeRDP_ClientBuild: settings->ClientBuild = val; break; - case FreeRDP_EarlyCapabilityFlags: - settings->EarlyCapabilityFlags = val; - break; - - case FreeRDP_DesktopPhysicalWidth: - settings->DesktopPhysicalWidth = val; + case FreeRDP_ClientRandomLength: + settings->ClientRandomLength = val; break; - case FreeRDP_DesktopPhysicalHeight: - settings->DesktopPhysicalHeight = val; + case FreeRDP_ClusterInfoFlags: + settings->ClusterInfoFlags = val; break; - case FreeRDP_DesktopScaleFactor: - settings->DesktopScaleFactor = val; + case FreeRDP_ColorDepth: + settings->ColorDepth = val; break; - case FreeRDP_DeviceScaleFactor: - settings->DeviceScaleFactor = val; + case FreeRDP_CompDeskSupportLevel: + settings->CompDeskSupportLevel = val; break; - case FreeRDP_EncryptionMethods: - settings->EncryptionMethods = val; + case FreeRDP_CompressionLevel: + settings->CompressionLevel = val; break; - case FreeRDP_ExtEncryptionMethods: - settings->ExtEncryptionMethods = val; + case FreeRDP_ConnectionType: + settings->ConnectionType = val; break; - case FreeRDP_EncryptionLevel: - settings->EncryptionLevel = val; + case FreeRDP_CookieMaxLength: + settings->CookieMaxLength = val; break; - case FreeRDP_ServerRandomLength: - settings->ServerRandomLength = val; + case FreeRDP_DesktopHeight: + settings->DesktopHeight = val; break; - case FreeRDP_ServerCertificateLength: - settings->ServerCertificateLength = val; + case FreeRDP_DesktopPhysicalHeight: + settings->DesktopPhysicalHeight = val; break; - case FreeRDP_ClientRandomLength: - settings->ClientRandomLength = val; + case FreeRDP_DesktopPhysicalWidth: + settings->DesktopPhysicalWidth = val; break; - case FreeRDP_ChannelCount: - settings->ChannelCount = val; + case FreeRDP_DesktopPosX: + settings->DesktopPosX = val; break; - case FreeRDP_ChannelDefArraySize: - settings->ChannelDefArraySize = val; + case FreeRDP_DesktopPosY: + settings->DesktopPosY = val; break; - case FreeRDP_ClusterInfoFlags: - settings->ClusterInfoFlags = val; + case FreeRDP_DesktopScaleFactor: + settings->DesktopScaleFactor = val; break; - case FreeRDP_RedirectedSessionId: - settings->RedirectedSessionId = val; + case FreeRDP_DesktopWidth: + settings->DesktopWidth = val; break; - case FreeRDP_MonitorCount: - settings->MonitorCount = val; + case FreeRDP_DeviceArraySize: + settings->DeviceArraySize = val; break; - case FreeRDP_MonitorDefArraySize: - settings->MonitorDefArraySize = val; + case FreeRDP_DeviceCount: + settings->DeviceCount = val; break; - case FreeRDP_DesktopPosX: - settings->DesktopPosX = val; + case FreeRDP_DeviceScaleFactor: + settings->DeviceScaleFactor = val; break; - case FreeRDP_DesktopPosY: - settings->DesktopPosY = val; + case FreeRDP_DrawNineGridCacheEntries: + settings->DrawNineGridCacheEntries = val; break; - case FreeRDP_NumMonitorIds: - settings->NumMonitorIds = val; + case FreeRDP_DrawNineGridCacheSize: + settings->DrawNineGridCacheSize = val; break; - case FreeRDP_MonitorLocalShiftX: - settings->MonitorLocalShiftX = val; + case FreeRDP_DynamicChannelArraySize: + settings->DynamicChannelArraySize = val; break; - case FreeRDP_MonitorLocalShiftY: - settings->MonitorLocalShiftY = val; + case FreeRDP_DynamicChannelCount: + settings->DynamicChannelCount = val; break; - case FreeRDP_MultitransportFlags: - settings->MultitransportFlags = val; + case FreeRDP_EarlyCapabilityFlags: + settings->EarlyCapabilityFlags = val; break; - case FreeRDP_CompressionLevel: - settings->CompressionLevel = val; + case FreeRDP_EncryptionLevel: + settings->EncryptionLevel = val; break; - case FreeRDP_AutoReconnectMaxRetries: - settings->AutoReconnectMaxRetries = val; + case FreeRDP_EncryptionMethods: + settings->EncryptionMethods = val; break; - case FreeRDP_PerformanceFlags: - settings->PerformanceFlags = val; + case FreeRDP_ExtEncryptionMethods: + settings->ExtEncryptionMethods = val; break; - case FreeRDP_RequestedProtocols: - settings->RequestedProtocols = val; + case FreeRDP_FrameAcknowledge: + settings->FrameAcknowledge = val; break; - case FreeRDP_SelectedProtocol: - settings->SelectedProtocol = val; + case FreeRDP_GatewayAcceptedCertLength: + settings->GatewayAcceptedCertLength = val; break; - case FreeRDP_NegotiationFlags: - settings->NegotiationFlags = val; + case FreeRDP_GatewayCredentialsSource: + settings->GatewayCredentialsSource = val; break; - case FreeRDP_AuthenticationLevel: - settings->AuthenticationLevel = val; + case FreeRDP_GatewayPort: + settings->GatewayPort = val; break; - case FreeRDP_TlsSecLevel: - settings->TlsSecLevel = val; + case FreeRDP_GatewayUsageMethod: + settings->GatewayUsageMethod = val; break; - case FreeRDP_CookieMaxLength: - settings->CookieMaxLength = val; + case FreeRDP_GfxCapsFilter: + settings->GfxCapsFilter = val; break; - case FreeRDP_PreconnectionId: - settings->PreconnectionId = val; + case FreeRDP_GlyphSupportLevel: + settings->GlyphSupportLevel = val; break; - case FreeRDP_RedirectionFlags: - settings->RedirectionFlags = val; + case FreeRDP_JpegCodecId: + settings->JpegCodecId = val; break; - case FreeRDP_LoadBalanceInfoLength: - settings->LoadBalanceInfoLength = val; + case FreeRDP_JpegQuality: + settings->JpegQuality = val; break; - case FreeRDP_RedirectionPasswordLength: - settings->RedirectionPasswordLength = val; + case FreeRDP_KeyboardCodePage: + settings->KeyboardCodePage = val; break; - case FreeRDP_RedirectionTsvUrlLength: - settings->RedirectionTsvUrlLength = val; + case FreeRDP_KeyboardFunctionKey: + settings->KeyboardFunctionKey = val; break; - case FreeRDP_TargetNetAddressCount: - settings->TargetNetAddressCount = val; + case FreeRDP_KeyboardHook: + settings->KeyboardHook = val; break; - case FreeRDP_RedirectionAcceptedCertLength: - settings->RedirectionAcceptedCertLength = val; + case FreeRDP_KeyboardLayout: + settings->KeyboardLayout = val; break; - case FreeRDP_RedirectionPreferType: - settings->RedirectionPreferType = val; + case FreeRDP_KeyboardSubType: + settings->KeyboardSubType = val; break; - case FreeRDP_Password51Length: - settings->Password51Length = val; + case FreeRDP_KeyboardType: + settings->KeyboardType = val; break; - case FreeRDP_PercentScreen: - settings->PercentScreen = val; + case FreeRDP_LargePointerFlag: + settings->LargePointerFlag = val; break; - case FreeRDP_SmartSizingWidth: - settings->SmartSizingWidth = val; + case FreeRDP_LoadBalanceInfoLength: + settings->LoadBalanceInfoLength = val; break; - case FreeRDP_SmartSizingHeight: - settings->SmartSizingHeight = val; + case FreeRDP_MaxTimeInCheckLoop: + settings->MaxTimeInCheckLoop = val; break; - case FreeRDP_GatewayUsageMethod: - settings->GatewayUsageMethod = val; + case FreeRDP_MonitorCount: + settings->MonitorCount = val; break; - case FreeRDP_GatewayPort: - settings->GatewayPort = val; + case FreeRDP_MonitorDefArraySize: + settings->MonitorDefArraySize = val; break; - case FreeRDP_GatewayCredentialsSource: - settings->GatewayCredentialsSource = val; + case FreeRDP_MonitorLocalShiftX: + settings->MonitorLocalShiftX = val; break; - case FreeRDP_GatewayAcceptedCertLength: - settings->GatewayAcceptedCertLength = val; + case FreeRDP_MonitorLocalShiftY: + settings->MonitorLocalShiftY = val; break; - case FreeRDP_ProxyType: - settings->ProxyType = val; + case FreeRDP_MultifragMaxRequestSize: + settings->MultifragMaxRequestSize = val; break; - case FreeRDP_RemoteApplicationExpandCmdLine: - settings->RemoteApplicationExpandCmdLine = val; + case FreeRDP_MultitransportFlags: + settings->MultitransportFlags = val; break; - case FreeRDP_RemoteApplicationExpandWorkingDir: - settings->RemoteApplicationExpandWorkingDir = val; + case FreeRDP_NSCodecColorLossLevel: + settings->NSCodecColorLossLevel = val; break; - case FreeRDP_RemoteAppNumIconCaches: - settings->RemoteAppNumIconCaches = val; + case FreeRDP_NSCodecId: + settings->NSCodecId = val; break; - case FreeRDP_RemoteAppNumIconCacheEntries: - settings->RemoteAppNumIconCacheEntries = val; + case FreeRDP_NegotiationFlags: + settings->NegotiationFlags = val; break; - case FreeRDP_RemoteWndSupportLevel: - settings->RemoteWndSupportLevel = val; + case FreeRDP_NumMonitorIds: + settings->NumMonitorIds = val; break; - case FreeRDP_RemoteApplicationSupportLevel: - settings->RemoteApplicationSupportLevel = val; + case FreeRDP_OffscreenCacheEntries: + settings->OffscreenCacheEntries = val; break; - case FreeRDP_RemoteApplicationSupportMask: - settings->RemoteApplicationSupportMask = val; + case FreeRDP_OffscreenCacheSize: + settings->OffscreenCacheSize = val; break; - case FreeRDP_ReceivedCapabilitiesSize: - settings->ReceivedCapabilitiesSize = val; + case FreeRDP_OffscreenSupportLevel: + settings->OffscreenSupportLevel = val; break; case FreeRDP_OsMajorType: @@ -1874,156 +1866,152 @@ BOOL freerdp_settings_set_uint32(rdpSettings* settings, size_t id, UINT32 val) settings->OsMinorType = val; break; - case FreeRDP_BitmapCacheVersion: - settings->BitmapCacheVersion = val; + case FreeRDP_Password51Length: + settings->Password51Length = val; break; - case FreeRDP_BitmapCacheV2NumCells: - settings->BitmapCacheV2NumCells = val; + case FreeRDP_PduSource: + settings->PduSource = val; break; - case FreeRDP_PointerCacheSize: - settings->PointerCacheSize = val; + case FreeRDP_PercentScreen: + settings->PercentScreen = val; break; - case FreeRDP_KeyboardCodePage: - settings->KeyboardCodePage = val; + case FreeRDP_PerformanceFlags: + settings->PerformanceFlags = val; break; - case FreeRDP_KeyboardLayout: - settings->KeyboardLayout = val; + case FreeRDP_PointerCacheSize: + settings->PointerCacheSize = val; break; - case FreeRDP_KeyboardType: - settings->KeyboardType = val; + case FreeRDP_PreconnectionId: + settings->PreconnectionId = val; break; - case FreeRDP_KeyboardSubType: - settings->KeyboardSubType = val; + case FreeRDP_ProxyType: + settings->ProxyType = val; break; - case FreeRDP_KeyboardFunctionKey: - settings->KeyboardFunctionKey = val; + case FreeRDP_RdpVersion: + settings->RdpVersion = val; break; - case FreeRDP_KeyboardHook: - settings->KeyboardHook = val; + case FreeRDP_ReceivedCapabilitiesSize: + settings->ReceivedCapabilitiesSize = val; break; - case FreeRDP_BrushSupportLevel: - settings->BrushSupportLevel = val; + case FreeRDP_RedirectedSessionId: + settings->RedirectedSessionId = val; break; - case FreeRDP_GlyphSupportLevel: - settings->GlyphSupportLevel = val; + case FreeRDP_RedirectionAcceptedCertLength: + settings->RedirectionAcceptedCertLength = val; break; - case FreeRDP_OffscreenSupportLevel: - settings->OffscreenSupportLevel = val; + case FreeRDP_RedirectionFlags: + settings->RedirectionFlags = val; break; - case FreeRDP_OffscreenCacheSize: - settings->OffscreenCacheSize = val; + case FreeRDP_RedirectionPasswordLength: + settings->RedirectionPasswordLength = val; break; - case FreeRDP_OffscreenCacheEntries: - settings->OffscreenCacheEntries = val; + case FreeRDP_RedirectionPreferType: + settings->RedirectionPreferType = val; break; - case FreeRDP_VirtualChannelCompressionFlags: - settings->VirtualChannelCompressionFlags = val; + case FreeRDP_RedirectionTsvUrlLength: + settings->RedirectionTsvUrlLength = val; break; - case FreeRDP_VirtualChannelChunkSize: - settings->VirtualChannelChunkSize = val; + case FreeRDP_RemoteAppNumIconCacheEntries: + settings->RemoteAppNumIconCacheEntries = val; break; - case FreeRDP_MultifragMaxRequestSize: - settings->MultifragMaxRequestSize = val; + case FreeRDP_RemoteAppNumIconCaches: + settings->RemoteAppNumIconCaches = val; break; - case FreeRDP_LargePointerFlag: - settings->LargePointerFlag = val; + case FreeRDP_RemoteApplicationExpandCmdLine: + settings->RemoteApplicationExpandCmdLine = val; break; - case FreeRDP_CompDeskSupportLevel: - settings->CompDeskSupportLevel = val; + case FreeRDP_RemoteApplicationExpandWorkingDir: + settings->RemoteApplicationExpandWorkingDir = val; break; - case FreeRDP_RemoteFxCodecId: - settings->RemoteFxCodecId = val; + case FreeRDP_RemoteApplicationSupportLevel: + settings->RemoteApplicationSupportLevel = val; break; - case FreeRDP_RemoteFxCodecMode: - settings->RemoteFxCodecMode = val; + case FreeRDP_RemoteApplicationSupportMask: + settings->RemoteApplicationSupportMask = val; break; case FreeRDP_RemoteFxCaptureFlags: settings->RemoteFxCaptureFlags = val; break; - case FreeRDP_NSCodecId: - settings->NSCodecId = val; - break; - - case FreeRDP_FrameAcknowledge: - settings->FrameAcknowledge = val; + case FreeRDP_RemoteFxCodecId: + settings->RemoteFxCodecId = val; break; - case FreeRDP_NSCodecColorLossLevel: - settings->NSCodecColorLossLevel = val; + case FreeRDP_RemoteFxCodecMode: + settings->RemoteFxCodecMode = val; break; - case FreeRDP_JpegCodecId: - settings->JpegCodecId = val; + case FreeRDP_RemoteWndSupportLevel: + settings->RemoteWndSupportLevel = val; break; - case FreeRDP_JpegQuality: - settings->JpegQuality = val; + case FreeRDP_RequestedProtocols: + settings->RequestedProtocols = val; break; - case FreeRDP_GfxCapsFilter: - settings->GfxCapsFilter = val; + case FreeRDP_SelectedProtocol: + settings->SelectedProtocol = val; break; - case FreeRDP_BitmapCacheV3CodecId: - settings->BitmapCacheV3CodecId = val; + case FreeRDP_ServerCertificateLength: + settings->ServerCertificateLength = val; break; - case FreeRDP_DrawNineGridCacheSize: - settings->DrawNineGridCacheSize = val; + case FreeRDP_ServerPort: + settings->ServerPort = val; break; - case FreeRDP_DrawNineGridCacheEntries: - settings->DrawNineGridCacheEntries = val; + case FreeRDP_ServerRandomLength: + settings->ServerRandomLength = val; break; - case FreeRDP_DeviceCount: - settings->DeviceCount = val; + case FreeRDP_ShareId: + settings->ShareId = val; break; - case FreeRDP_DeviceArraySize: - settings->DeviceArraySize = val; + case FreeRDP_SmartSizingHeight: + settings->SmartSizingHeight = val; break; - case FreeRDP_StaticChannelCount: - settings->StaticChannelCount = val; + case FreeRDP_SmartSizingWidth: + settings->SmartSizingWidth = val; break; case FreeRDP_StaticChannelArraySize: settings->StaticChannelArraySize = val; break; - case FreeRDP_DynamicChannelCount: - settings->DynamicChannelCount = val; + case FreeRDP_StaticChannelCount: + settings->StaticChannelCount = val; break; - case FreeRDP_DynamicChannelArraySize: - settings->DynamicChannelArraySize = val; + case FreeRDP_TargetNetAddressCount: + settings->TargetNetAddressCount = val; break; - case FreeRDP_TcpKeepAliveRetries: - settings->TcpKeepAliveRetries = val; + case FreeRDP_TcpAckTimeout: + settings->TcpAckTimeout = val; break; case FreeRDP_TcpKeepAliveDelay: @@ -2034,8 +2022,20 @@ BOOL freerdp_settings_set_uint32(rdpSettings* settings, size_t id, UINT32 val) settings->TcpKeepAliveInterval = val; break; - case FreeRDP_TcpAckTimeout: - settings->TcpAckTimeout = val; + case FreeRDP_TcpKeepAliveRetries: + settings->TcpKeepAliveRetries = val; + break; + + case FreeRDP_TlsSecLevel: + settings->TlsSecLevel = val; + break; + + case FreeRDP_VirtualChannelChunkSize: + settings->VirtualChannelChunkSize = val; + break; + + case FreeRDP_VirtualChannelCompressionFlags: + settings->VirtualChannelCompressionFlags = val; break; default: @@ -2154,35 +2154,32 @@ const char* freerdp_settings_get_string(const rdpSettings* settings, size_t id) switch (id) { - case FreeRDP_ServerHostname: - return settings->ServerHostname; - - case FreeRDP_Username: - return settings->Username; + case FreeRDP_AcceptedCert: + return settings->AcceptedCert; - case FreeRDP_Password: - return settings->Password; + case FreeRDP_AllowedTlsCiphers: + return settings->AllowedTlsCiphers; - case FreeRDP_Domain: - return settings->Domain; + case FreeRDP_AlternateShell: + return settings->AlternateShell; - case FreeRDP_PasswordHash: - return settings->PasswordHash; + case FreeRDP_AssistanceFile: + return settings->AssistanceFile; - case FreeRDP_AcceptedCert: - return settings->AcceptedCert; + case FreeRDP_AuthenticationServiceClass: + return settings->AuthenticationServiceClass; - case FreeRDP_ClientHostname: - return settings->ClientHostname; + case FreeRDP_CertificateAcceptedFingerprints: + return settings->CertificateAcceptedFingerprints; - case FreeRDP_ClientProductId: - return settings->ClientProductId; + case FreeRDP_CertificateContent: + return settings->CertificateContent; - case FreeRDP_AlternateShell: - return settings->AlternateShell; + case FreeRDP_CertificateFile: + return settings->CertificateFile; - case FreeRDP_ShellWorkingDirectory: - return settings->ShellWorkingDirectory; + case FreeRDP_CertificateName: + return settings->CertificateName; case FreeRDP_ClientAddress: return settings->ClientAddress; @@ -2190,50 +2187,59 @@ const char* freerdp_settings_get_string(const rdpSettings* settings, size_t id) case FreeRDP_ClientDir: return settings->ClientDir; - case FreeRDP_DynamicDSTTimeZoneKeyName: - return settings->DynamicDSTTimeZoneKeyName; + case FreeRDP_ClientHostname: + return settings->ClientHostname; - case FreeRDP_RemoteAssistanceSessionId: - return settings->RemoteAssistanceSessionId; + case FreeRDP_ClientProductId: + return settings->ClientProductId; - case FreeRDP_RemoteAssistancePassStub: - return settings->RemoteAssistancePassStub; + case FreeRDP_ComputerName: + return settings->ComputerName; - case FreeRDP_RemoteAssistancePassword: - return settings->RemoteAssistancePassword; + case FreeRDP_ConfigPath: + return settings->ConfigPath; - case FreeRDP_RemoteAssistanceRCTicket: - return settings->RemoteAssistanceRCTicket; + case FreeRDP_ConnectionFile: + return settings->ConnectionFile; - case FreeRDP_AuthenticationServiceClass: - return settings->AuthenticationServiceClass; + case FreeRDP_CurrentPath: + return settings->CurrentPath; - case FreeRDP_AllowedTlsCiphers: - return settings->AllowedTlsCiphers; + case FreeRDP_Domain: + return settings->Domain; - case FreeRDP_NtlmSamFile: - return settings->NtlmSamFile; + case FreeRDP_DrivesToRedirect: + return settings->DrivesToRedirect; - case FreeRDP_PreconnectionBlob: - return settings->PreconnectionBlob; + case FreeRDP_DumpRemoteFxFile: + return settings->DumpRemoteFxFile; - case FreeRDP_TargetNetAddress: - return settings->TargetNetAddress; + case FreeRDP_DynamicDSTTimeZoneKeyName: + return settings->DynamicDSTTimeZoneKeyName; - case FreeRDP_RedirectionUsername: - return settings->RedirectionUsername; + case FreeRDP_GatewayAcceptedCert: + return settings->GatewayAcceptedCert; - case FreeRDP_RedirectionDomain: - return settings->RedirectionDomain; + case FreeRDP_GatewayAccessToken: + return settings->GatewayAccessToken; - case FreeRDP_RedirectionTargetFQDN: - return settings->RedirectionTargetFQDN; + case FreeRDP_GatewayDomain: + return settings->GatewayDomain; - case FreeRDP_RedirectionTargetNetBiosName: - return settings->RedirectionTargetNetBiosName; + case FreeRDP_GatewayHostname: + return settings->GatewayHostname; - case FreeRDP_RedirectionAcceptedCert: - return settings->RedirectionAcceptedCert; + case FreeRDP_GatewayPassword: + return settings->GatewayPassword; + + case FreeRDP_GatewayUsername: + return settings->GatewayUsername; + + case FreeRDP_HomePath: + return settings->HomePath; + + case FreeRDP_ImeFileName: + return settings->ImeFileName; case FreeRDP_KerberosKdc: return settings->KerberosKdc; @@ -2241,116 +2247,110 @@ const char* freerdp_settings_get_string(const rdpSettings* settings, size_t id) case FreeRDP_KerberosRealm: return settings->KerberosRealm; - case FreeRDP_CertificateName: - return settings->CertificateName; + case FreeRDP_NtlmSamFile: + return settings->NtlmSamFile; - case FreeRDP_CertificateFile: - return settings->CertificateFile; + case FreeRDP_Password: + return settings->Password; - case FreeRDP_PrivateKeyFile: - return settings->PrivateKeyFile; + case FreeRDP_PasswordHash: + return settings->PasswordHash; - case FreeRDP_RdpKeyFile: - return settings->RdpKeyFile; + case FreeRDP_PlayRemoteFxFile: + return settings->PlayRemoteFxFile; - case FreeRDP_CertificateContent: - return settings->CertificateContent; + case FreeRDP_PreconnectionBlob: + return settings->PreconnectionBlob; case FreeRDP_PrivateKeyContent: return settings->PrivateKeyContent; - case FreeRDP_RdpKeyContent: - return settings->RdpKeyContent; - - case FreeRDP_CertificateAcceptedFingerprints: - return settings->CertificateAcceptedFingerprints; - - case FreeRDP_WindowTitle: - return settings->WindowTitle; - - case FreeRDP_WmClass: - return settings->WmClass; - - case FreeRDP_ComputerName: - return settings->ComputerName; - - case FreeRDP_ConnectionFile: - return settings->ConnectionFile; + case FreeRDP_PrivateKeyFile: + return settings->PrivateKeyFile; - case FreeRDP_AssistanceFile: - return settings->AssistanceFile; + case FreeRDP_ProxyHostname: + return settings->ProxyHostname; - case FreeRDP_HomePath: - return settings->HomePath; + case FreeRDP_ProxyPassword: + return settings->ProxyPassword; - case FreeRDP_ConfigPath: - return settings->ConfigPath; + case FreeRDP_ProxyUsername: + return settings->ProxyUsername; - case FreeRDP_CurrentPath: - return settings->CurrentPath; + case FreeRDP_RDP2TCPArgs: + return settings->RDP2TCPArgs; - case FreeRDP_DumpRemoteFxFile: - return settings->DumpRemoteFxFile; + case FreeRDP_RdpKeyContent: + return settings->RdpKeyContent; - case FreeRDP_PlayRemoteFxFile: - return settings->PlayRemoteFxFile; + case FreeRDP_RdpKeyFile: + return settings->RdpKeyFile; - case FreeRDP_GatewayHostname: - return settings->GatewayHostname; + case FreeRDP_RedirectionAcceptedCert: + return settings->RedirectionAcceptedCert; - case FreeRDP_GatewayUsername: - return settings->GatewayUsername; + case FreeRDP_RedirectionDomain: + return settings->RedirectionDomain; - case FreeRDP_GatewayPassword: - return settings->GatewayPassword; + case FreeRDP_RedirectionTargetFQDN: + return settings->RedirectionTargetFQDN; - case FreeRDP_GatewayDomain: - return settings->GatewayDomain; + case FreeRDP_RedirectionTargetNetBiosName: + return settings->RedirectionTargetNetBiosName; - case FreeRDP_GatewayAccessToken: - return settings->GatewayAccessToken; + case FreeRDP_RedirectionUsername: + return settings->RedirectionUsername; - case FreeRDP_GatewayAcceptedCert: - return settings->GatewayAcceptedCert; + case FreeRDP_RemoteApplicationCmdLine: + return settings->RemoteApplicationCmdLine; - case FreeRDP_ProxyHostname: - return settings->ProxyHostname; + case FreeRDP_RemoteApplicationFile: + return settings->RemoteApplicationFile; - case FreeRDP_ProxyUsername: - return settings->ProxyUsername; + case FreeRDP_RemoteApplicationGuid: + return settings->RemoteApplicationGuid; - case FreeRDP_ProxyPassword: - return settings->ProxyPassword; + case FreeRDP_RemoteApplicationIcon: + return settings->RemoteApplicationIcon; case FreeRDP_RemoteApplicationName: return settings->RemoteApplicationName; - case FreeRDP_RemoteApplicationIcon: - return settings->RemoteApplicationIcon; - case FreeRDP_RemoteApplicationProgram: return settings->RemoteApplicationProgram; - case FreeRDP_RemoteApplicationFile: - return settings->RemoteApplicationFile; + case FreeRDP_RemoteApplicationWorkingDir: + return settings->RemoteApplicationWorkingDir; - case FreeRDP_RemoteApplicationGuid: - return settings->RemoteApplicationGuid; + case FreeRDP_RemoteAssistancePassStub: + return settings->RemoteAssistancePassStub; - case FreeRDP_RemoteApplicationCmdLine: - return settings->RemoteApplicationCmdLine; + case FreeRDP_RemoteAssistancePassword: + return settings->RemoteAssistancePassword; - case FreeRDP_RemoteApplicationWorkingDir: - return settings->RemoteApplicationWorkingDir; + case FreeRDP_RemoteAssistanceRCTicket: + return settings->RemoteAssistanceRCTicket; - case FreeRDP_ImeFileName: - return settings->ImeFileName; + case FreeRDP_RemoteAssistanceSessionId: + return settings->RemoteAssistanceSessionId; - case FreeRDP_DrivesToRedirect: - return settings->DrivesToRedirect; + case FreeRDP_ServerHostname: + return settings->ServerHostname; - case FreeRDP_RDP2TCPArgs: - return settings->RDP2TCPArgs; + case FreeRDP_ShellWorkingDirectory: + return settings->ShellWorkingDirectory; + + case FreeRDP_TargetNetAddress: + return settings->TargetNetAddress; + + case FreeRDP_Username: + return settings->Username; + + case FreeRDP_WindowTitle: + return settings->WindowTitle; + + case FreeRDP_WmClass: + return settings->WmClass; default: WLog_ERR(TAG, "[%s] Invalid key index %" PRIuz, __FUNCTION__, id); @@ -2365,300 +2365,255 @@ BOOL freerdp_settings_set_string(rdpSettings* settings, size_t id, const char* v switch (id) { - case FreeRDP_ServerHostname: - free(settings->ServerHostname); - settings->ServerHostname = (val ? _strdup(val) : NULL); - return (!val || settings->ServerHostname != NULL); - - case FreeRDP_Username: - free(settings->Username); - settings->Username = (val ? _strdup(val) : NULL); - return (!val || settings->Username != NULL); - - case FreeRDP_Password: - free(settings->Password); - settings->Password = (val ? _strdup(val) : NULL); - return (!val || settings->Password != NULL); - - case FreeRDP_Domain: - free(settings->Domain); - settings->Domain = (val ? _strdup(val) : NULL); - return (!val || settings->Domain != NULL); - - case FreeRDP_PasswordHash: - free(settings->PasswordHash); - settings->PasswordHash = (val ? _strdup(val) : NULL); - return (!val || settings->PasswordHash != NULL); - case FreeRDP_AcceptedCert: free(settings->AcceptedCert); settings->AcceptedCert = (val ? _strdup(val) : NULL); return (!val || settings->AcceptedCert != NULL); - case FreeRDP_ClientHostname: - free(settings->ClientHostname); - settings->ClientHostname = (val ? _strdup(val) : NULL); - return (!val || settings->ClientHostname != NULL); - - case FreeRDP_ClientProductId: - free(settings->ClientProductId); - settings->ClientProductId = (val ? _strdup(val) : NULL); - return (!val || settings->ClientProductId != NULL); + case FreeRDP_AllowedTlsCiphers: + free(settings->AllowedTlsCiphers); + settings->AllowedTlsCiphers = (val ? _strdup(val) : NULL); + return (!val || settings->AllowedTlsCiphers != NULL); case FreeRDP_AlternateShell: free(settings->AlternateShell); settings->AlternateShell = (val ? _strdup(val) : NULL); return (!val || settings->AlternateShell != NULL); - case FreeRDP_ShellWorkingDirectory: - free(settings->ShellWorkingDirectory); - settings->ShellWorkingDirectory = (val ? _strdup(val) : NULL); - return (!val || settings->ShellWorkingDirectory != NULL); - - case FreeRDP_ClientAddress: - free(settings->ClientAddress); - settings->ClientAddress = (val ? _strdup(val) : NULL); - return (!val || settings->ClientAddress != NULL); - - case FreeRDP_ClientDir: - free(settings->ClientDir); - settings->ClientDir = (val ? _strdup(val) : NULL); - return (!val || settings->ClientDir != NULL); - - case FreeRDP_DynamicDSTTimeZoneKeyName: - free(settings->DynamicDSTTimeZoneKeyName); - settings->DynamicDSTTimeZoneKeyName = (val ? _strdup(val) : NULL); - return (!val || settings->DynamicDSTTimeZoneKeyName != NULL); - - case FreeRDP_RemoteAssistanceSessionId: - free(settings->RemoteAssistanceSessionId); - settings->RemoteAssistanceSessionId = (val ? _strdup(val) : NULL); - return (!val || settings->RemoteAssistanceSessionId != NULL); - - case FreeRDP_RemoteAssistancePassStub: - free(settings->RemoteAssistancePassStub); - settings->RemoteAssistancePassStub = (val ? _strdup(val) : NULL); - return (!val || settings->RemoteAssistancePassStub != NULL); - - case FreeRDP_RemoteAssistancePassword: - free(settings->RemoteAssistancePassword); - settings->RemoteAssistancePassword = (val ? _strdup(val) : NULL); - return (!val || settings->RemoteAssistancePassword != NULL); - - case FreeRDP_RemoteAssistanceRCTicket: - free(settings->RemoteAssistanceRCTicket); - settings->RemoteAssistanceRCTicket = (val ? _strdup(val) : NULL); - return (!val || settings->RemoteAssistanceRCTicket != NULL); + case FreeRDP_AssistanceFile: + free(settings->AssistanceFile); + settings->AssistanceFile = (val ? _strdup(val) : NULL); + return (!val || settings->AssistanceFile != NULL); case FreeRDP_AuthenticationServiceClass: free(settings->AuthenticationServiceClass); settings->AuthenticationServiceClass = (val ? _strdup(val) : NULL); return (!val || settings->AuthenticationServiceClass != NULL); - case FreeRDP_AllowedTlsCiphers: - free(settings->AllowedTlsCiphers); - settings->AllowedTlsCiphers = (val ? _strdup(val) : NULL); - return (!val || settings->AllowedTlsCiphers != NULL); - - case FreeRDP_NtlmSamFile: - free(settings->NtlmSamFile); - settings->NtlmSamFile = (val ? _strdup(val) : NULL); - return (!val || settings->NtlmSamFile != NULL); - - case FreeRDP_PreconnectionBlob: - free(settings->PreconnectionBlob); - settings->PreconnectionBlob = (val ? _strdup(val) : NULL); - return (!val || settings->PreconnectionBlob != NULL); - - case FreeRDP_TargetNetAddress: - free(settings->TargetNetAddress); - settings->TargetNetAddress = (val ? _strdup(val) : NULL); - return (!val || settings->TargetNetAddress != NULL); - - case FreeRDP_RedirectionUsername: - free(settings->RedirectionUsername); - settings->RedirectionUsername = (val ? _strdup(val) : NULL); - return (!val || settings->RedirectionUsername != NULL); - - case FreeRDP_RedirectionDomain: - free(settings->RedirectionDomain); - settings->RedirectionDomain = (val ? _strdup(val) : NULL); - return (!val || settings->RedirectionDomain != NULL); - - case FreeRDP_RedirectionTargetFQDN: - free(settings->RedirectionTargetFQDN); - settings->RedirectionTargetFQDN = (val ? _strdup(val) : NULL); - return (!val || settings->RedirectionTargetFQDN != NULL); - - case FreeRDP_RedirectionTargetNetBiosName: - free(settings->RedirectionTargetNetBiosName); - settings->RedirectionTargetNetBiosName = (val ? _strdup(val) : NULL); - return (!val || settings->RedirectionTargetNetBiosName != NULL); - - case FreeRDP_RedirectionAcceptedCert: - free(settings->RedirectionAcceptedCert); - settings->RedirectionAcceptedCert = (val ? _strdup(val) : NULL); - return (!val || settings->RedirectionAcceptedCert != NULL); - - case FreeRDP_KerberosKdc: - free(settings->KerberosKdc); - settings->KerberosKdc = (val ? _strdup(val) : NULL); - return (!val || settings->KerberosKdc != NULL); - - case FreeRDP_KerberosRealm: - free(settings->KerberosRealm); - settings->KerberosRealm = (val ? _strdup(val) : NULL); - return (!val || settings->KerberosRealm != NULL); + case FreeRDP_CertificateAcceptedFingerprints: + free(settings->CertificateAcceptedFingerprints); + settings->CertificateAcceptedFingerprints = (val ? _strdup(val) : NULL); + return (!val || settings->CertificateAcceptedFingerprints != NULL); - case FreeRDP_CertificateName: - free(settings->CertificateName); - settings->CertificateName = (val ? _strdup(val) : NULL); - return (!val || settings->CertificateName != NULL); + case FreeRDP_CertificateContent: + free(settings->CertificateContent); + settings->CertificateContent = (val ? _strdup(val) : NULL); + return (!val || settings->CertificateContent != NULL); case FreeRDP_CertificateFile: free(settings->CertificateFile); settings->CertificateFile = (val ? _strdup(val) : NULL); return (!val || settings->CertificateFile != NULL); - case FreeRDP_PrivateKeyFile: - free(settings->PrivateKeyFile); - settings->PrivateKeyFile = (val ? _strdup(val) : NULL); - return (!val || settings->PrivateKeyFile != NULL); - - case FreeRDP_RdpKeyFile: - free(settings->RdpKeyFile); - settings->RdpKeyFile = (val ? _strdup(val) : NULL); - return (!val || settings->RdpKeyFile != NULL); - - case FreeRDP_CertificateContent: - free(settings->CertificateContent); - settings->CertificateContent = (val ? _strdup(val) : NULL); - return (!val || settings->CertificateContent != NULL); - - case FreeRDP_PrivateKeyContent: - free(settings->PrivateKeyContent); - settings->PrivateKeyContent = (val ? _strdup(val) : NULL); - return (!val || settings->PrivateKeyContent != NULL); + case FreeRDP_CertificateName: + free(settings->CertificateName); + settings->CertificateName = (val ? _strdup(val) : NULL); + return (!val || settings->CertificateName != NULL); - case FreeRDP_RdpKeyContent: - free(settings->RdpKeyContent); - settings->RdpKeyContent = (val ? _strdup(val) : NULL); - return (!val || settings->RdpKeyContent != NULL); + case FreeRDP_ClientAddress: + free(settings->ClientAddress); + settings->ClientAddress = (val ? _strdup(val) : NULL); + return (!val || settings->ClientAddress != NULL); - case FreeRDP_CertificateAcceptedFingerprints: - free(settings->CertificateAcceptedFingerprints); - settings->CertificateAcceptedFingerprints = (val ? _strdup(val) : NULL); - return (!val || settings->CertificateAcceptedFingerprints != NULL); + case FreeRDP_ClientDir: + free(settings->ClientDir); + settings->ClientDir = (val ? _strdup(val) : NULL); + return (!val || settings->ClientDir != NULL); - case FreeRDP_WindowTitle: - free(settings->WindowTitle); - settings->WindowTitle = (val ? _strdup(val) : NULL); - return (!val || settings->WindowTitle != NULL); + case FreeRDP_ClientHostname: + free(settings->ClientHostname); + settings->ClientHostname = (val ? _strdup(val) : NULL); + return (!val || settings->ClientHostname != NULL); - case FreeRDP_WmClass: - free(settings->WmClass); - settings->WmClass = (val ? _strdup(val) : NULL); - return (!val || settings->WmClass != NULL); + case FreeRDP_ClientProductId: + free(settings->ClientProductId); + settings->ClientProductId = (val ? _strdup(val) : NULL); + return (!val || settings->ClientProductId != NULL); case FreeRDP_ComputerName: free(settings->ComputerName); settings->ComputerName = (val ? _strdup(val) : NULL); return (!val || settings->ComputerName != NULL); - case FreeRDP_ConnectionFile: - free(settings->ConnectionFile); - settings->ConnectionFile = (val ? _strdup(val) : NULL); - return (!val || settings->ConnectionFile != NULL); - - case FreeRDP_AssistanceFile: - free(settings->AssistanceFile); - settings->AssistanceFile = (val ? _strdup(val) : NULL); - return (!val || settings->AssistanceFile != NULL); - - case FreeRDP_HomePath: - free(settings->HomePath); - settings->HomePath = (val ? _strdup(val) : NULL); - return (!val || settings->HomePath != NULL); - case FreeRDP_ConfigPath: free(settings->ConfigPath); settings->ConfigPath = (val ? _strdup(val) : NULL); return (!val || settings->ConfigPath != NULL); + case FreeRDP_ConnectionFile: + free(settings->ConnectionFile); + settings->ConnectionFile = (val ? _strdup(val) : NULL); + return (!val || settings->ConnectionFile != NULL); + case FreeRDP_CurrentPath: free(settings->CurrentPath); settings->CurrentPath = (val ? _strdup(val) : NULL); return (!val || settings->CurrentPath != NULL); + case FreeRDP_Domain: + free(settings->Domain); + settings->Domain = (val ? _strdup(val) : NULL); + return (!val || settings->Domain != NULL); + + case FreeRDP_DrivesToRedirect: + free(settings->DrivesToRedirect); + settings->DrivesToRedirect = (val ? _strdup(val) : NULL); + return (!val || settings->DrivesToRedirect != NULL); + case FreeRDP_DumpRemoteFxFile: free(settings->DumpRemoteFxFile); settings->DumpRemoteFxFile = (val ? _strdup(val) : NULL); return (!val || settings->DumpRemoteFxFile != NULL); - case FreeRDP_PlayRemoteFxFile: - free(settings->PlayRemoteFxFile); - settings->PlayRemoteFxFile = (val ? _strdup(val) : NULL); - return (!val || settings->PlayRemoteFxFile != NULL); + case FreeRDP_DynamicDSTTimeZoneKeyName: + free(settings->DynamicDSTTimeZoneKeyName); + settings->DynamicDSTTimeZoneKeyName = (val ? _strdup(val) : NULL); + return (!val || settings->DynamicDSTTimeZoneKeyName != NULL); + + case FreeRDP_GatewayAcceptedCert: + free(settings->GatewayAcceptedCert); + settings->GatewayAcceptedCert = (val ? _strdup(val) : NULL); + return (!val || settings->GatewayAcceptedCert != NULL); + + case FreeRDP_GatewayAccessToken: + free(settings->GatewayAccessToken); + settings->GatewayAccessToken = (val ? _strdup(val) : NULL); + return (!val || settings->GatewayAccessToken != NULL); + + case FreeRDP_GatewayDomain: + free(settings->GatewayDomain); + settings->GatewayDomain = (val ? _strdup(val) : NULL); + return (!val || settings->GatewayDomain != NULL); case FreeRDP_GatewayHostname: free(settings->GatewayHostname); settings->GatewayHostname = (val ? _strdup(val) : NULL); return (!val || settings->GatewayHostname != NULL); + case FreeRDP_GatewayPassword: + free(settings->GatewayPassword); + settings->GatewayPassword = (val ? _strdup(val) : NULL); + return (!val || settings->GatewayPassword != NULL); + case FreeRDP_GatewayUsername: free(settings->GatewayUsername); settings->GatewayUsername = (val ? _strdup(val) : NULL); return (!val || settings->GatewayUsername != NULL); - case FreeRDP_GatewayPassword: - free(settings->GatewayPassword); - settings->GatewayPassword = (val ? _strdup(val) : NULL); - return (!val || settings->GatewayPassword != NULL); + case FreeRDP_HomePath: + free(settings->HomePath); + settings->HomePath = (val ? _strdup(val) : NULL); + return (!val || settings->HomePath != NULL); - case FreeRDP_GatewayDomain: - free(settings->GatewayDomain); - settings->GatewayDomain = (val ? _strdup(val) : NULL); - return (!val || settings->GatewayDomain != NULL); + case FreeRDP_ImeFileName: + free(settings->ImeFileName); + settings->ImeFileName = (val ? _strdup(val) : NULL); + return (!val || settings->ImeFileName != NULL); - case FreeRDP_GatewayAccessToken: - free(settings->GatewayAccessToken); - settings->GatewayAccessToken = (val ? _strdup(val) : NULL); - return (!val || settings->GatewayAccessToken != NULL); + case FreeRDP_KerberosKdc: + free(settings->KerberosKdc); + settings->KerberosKdc = (val ? _strdup(val) : NULL); + return (!val || settings->KerberosKdc != NULL); - case FreeRDP_GatewayAcceptedCert: - free(settings->GatewayAcceptedCert); - settings->GatewayAcceptedCert = (val ? _strdup(val) : NULL); - return (!val || settings->GatewayAcceptedCert != NULL); + case FreeRDP_KerberosRealm: + free(settings->KerberosRealm); + settings->KerberosRealm = (val ? _strdup(val) : NULL); + return (!val || settings->KerberosRealm != NULL); + + case FreeRDP_NtlmSamFile: + free(settings->NtlmSamFile); + settings->NtlmSamFile = (val ? _strdup(val) : NULL); + return (!val || settings->NtlmSamFile != NULL); + + case FreeRDP_Password: + free(settings->Password); + settings->Password = (val ? _strdup(val) : NULL); + return (!val || settings->Password != NULL); + + case FreeRDP_PasswordHash: + free(settings->PasswordHash); + settings->PasswordHash = (val ? _strdup(val) : NULL); + return (!val || settings->PasswordHash != NULL); + + case FreeRDP_PlayRemoteFxFile: + free(settings->PlayRemoteFxFile); + settings->PlayRemoteFxFile = (val ? _strdup(val) : NULL); + return (!val || settings->PlayRemoteFxFile != NULL); + + case FreeRDP_PreconnectionBlob: + free(settings->PreconnectionBlob); + settings->PreconnectionBlob = (val ? _strdup(val) : NULL); + return (!val || settings->PreconnectionBlob != NULL); + + case FreeRDP_PrivateKeyContent: + free(settings->PrivateKeyContent); + settings->PrivateKeyContent = (val ? _strdup(val) : NULL); + return (!val || settings->PrivateKeyContent != NULL); + + case FreeRDP_PrivateKeyFile: + free(settings->PrivateKeyFile); + settings->PrivateKeyFile = (val ? _strdup(val) : NULL); + return (!val || settings->PrivateKeyFile != NULL); case FreeRDP_ProxyHostname: free(settings->ProxyHostname); settings->ProxyHostname = (val ? _strdup(val) : NULL); return (!val || settings->ProxyHostname != NULL); + case FreeRDP_ProxyPassword: + free(settings->ProxyPassword); + settings->ProxyPassword = (val ? _strdup(val) : NULL); + return (!val || settings->ProxyPassword != NULL); + case FreeRDP_ProxyUsername: free(settings->ProxyUsername); settings->ProxyUsername = (val ? _strdup(val) : NULL); return (!val || settings->ProxyUsername != NULL); - case FreeRDP_ProxyPassword: - free(settings->ProxyPassword); - settings->ProxyPassword = (val ? _strdup(val) : NULL); - return (!val || settings->ProxyPassword != NULL); + case FreeRDP_RDP2TCPArgs: + free(settings->RDP2TCPArgs); + settings->RDP2TCPArgs = (val ? _strdup(val) : NULL); + return (!val || settings->RDP2TCPArgs != NULL); - case FreeRDP_RemoteApplicationName: - free(settings->RemoteApplicationName); - settings->RemoteApplicationName = (val ? _strdup(val) : NULL); - return (!val || settings->RemoteApplicationName != NULL); + case FreeRDP_RdpKeyContent: + free(settings->RdpKeyContent); + settings->RdpKeyContent = (val ? _strdup(val) : NULL); + return (!val || settings->RdpKeyContent != NULL); - case FreeRDP_RemoteApplicationIcon: - free(settings->RemoteApplicationIcon); - settings->RemoteApplicationIcon = (val ? _strdup(val) : NULL); - return (!val || settings->RemoteApplicationIcon != NULL); + case FreeRDP_RdpKeyFile: + free(settings->RdpKeyFile); + settings->RdpKeyFile = (val ? _strdup(val) : NULL); + return (!val || settings->RdpKeyFile != NULL); - case FreeRDP_RemoteApplicationProgram: - free(settings->RemoteApplicationProgram); - settings->RemoteApplicationProgram = (val ? _strdup(val) : NULL); - return (!val || settings->RemoteApplicationProgram != NULL); + case FreeRDP_RedirectionAcceptedCert: + free(settings->RedirectionAcceptedCert); + settings->RedirectionAcceptedCert = (val ? _strdup(val) : NULL); + return (!val || settings->RedirectionAcceptedCert != NULL); + + case FreeRDP_RedirectionDomain: + free(settings->RedirectionDomain); + settings->RedirectionDomain = (val ? _strdup(val) : NULL); + return (!val || settings->RedirectionDomain != NULL); + + case FreeRDP_RedirectionTargetFQDN: + free(settings->RedirectionTargetFQDN); + settings->RedirectionTargetFQDN = (val ? _strdup(val) : NULL); + return (!val || settings->RedirectionTargetFQDN != NULL); + + case FreeRDP_RedirectionTargetNetBiosName: + free(settings->RedirectionTargetNetBiosName); + settings->RedirectionTargetNetBiosName = (val ? _strdup(val) : NULL); + return (!val || settings->RedirectionTargetNetBiosName != NULL); + + case FreeRDP_RedirectionUsername: + free(settings->RedirectionUsername); + settings->RedirectionUsername = (val ? _strdup(val) : NULL); + return (!val || settings->RedirectionUsername != NULL); + + case FreeRDP_RemoteApplicationCmdLine: + free(settings->RemoteApplicationCmdLine); + settings->RemoteApplicationCmdLine = (val ? _strdup(val) : NULL); + return (!val || settings->RemoteApplicationCmdLine != NULL); case FreeRDP_RemoteApplicationFile: free(settings->RemoteApplicationFile); @@ -2670,30 +2625,75 @@ BOOL freerdp_settings_set_string(rdpSettings* settings, size_t id, const char* v settings->RemoteApplicationGuid = (val ? _strdup(val) : NULL); return (!val || settings->RemoteApplicationGuid != NULL); - case FreeRDP_RemoteApplicationCmdLine: - free(settings->RemoteApplicationCmdLine); - settings->RemoteApplicationCmdLine = (val ? _strdup(val) : NULL); - return (!val || settings->RemoteApplicationCmdLine != NULL); + case FreeRDP_RemoteApplicationIcon: + free(settings->RemoteApplicationIcon); + settings->RemoteApplicationIcon = (val ? _strdup(val) : NULL); + return (!val || settings->RemoteApplicationIcon != NULL); + + case FreeRDP_RemoteApplicationName: + free(settings->RemoteApplicationName); + settings->RemoteApplicationName = (val ? _strdup(val) : NULL); + return (!val || settings->RemoteApplicationName != NULL); + + case FreeRDP_RemoteApplicationProgram: + free(settings->RemoteApplicationProgram); + settings->RemoteApplicationProgram = (val ? _strdup(val) : NULL); + return (!val || settings->RemoteApplicationProgram != NULL); case FreeRDP_RemoteApplicationWorkingDir: free(settings->RemoteApplicationWorkingDir); settings->RemoteApplicationWorkingDir = (val ? _strdup(val) : NULL); return (!val || settings->RemoteApplicationWorkingDir != NULL); - case FreeRDP_ImeFileName: - free(settings->ImeFileName); - settings->ImeFileName = (val ? _strdup(val) : NULL); - return (!val || settings->ImeFileName != NULL); + case FreeRDP_RemoteAssistancePassStub: + free(settings->RemoteAssistancePassStub); + settings->RemoteAssistancePassStub = (val ? _strdup(val) : NULL); + return (!val || settings->RemoteAssistancePassStub != NULL); - case FreeRDP_DrivesToRedirect: - free(settings->DrivesToRedirect); - settings->DrivesToRedirect = (val ? _strdup(val) : NULL); - return (!val || settings->DrivesToRedirect != NULL); + case FreeRDP_RemoteAssistancePassword: + free(settings->RemoteAssistancePassword); + settings->RemoteAssistancePassword = (val ? _strdup(val) : NULL); + return (!val || settings->RemoteAssistancePassword != NULL); - case FreeRDP_RDP2TCPArgs: - free(settings->RDP2TCPArgs); - settings->RDP2TCPArgs = (val ? _strdup(val) : NULL); - return (!val || settings->RDP2TCPArgs != NULL); + case FreeRDP_RemoteAssistanceRCTicket: + free(settings->RemoteAssistanceRCTicket); + settings->RemoteAssistanceRCTicket = (val ? _strdup(val) : NULL); + return (!val || settings->RemoteAssistanceRCTicket != NULL); + + case FreeRDP_RemoteAssistanceSessionId: + free(settings->RemoteAssistanceSessionId); + settings->RemoteAssistanceSessionId = (val ? _strdup(val) : NULL); + return (!val || settings->RemoteAssistanceSessionId != NULL); + + case FreeRDP_ServerHostname: + free(settings->ServerHostname); + settings->ServerHostname = (val ? _strdup(val) : NULL); + return (!val || settings->ServerHostname != NULL); + + case FreeRDP_ShellWorkingDirectory: + free(settings->ShellWorkingDirectory); + settings->ShellWorkingDirectory = (val ? _strdup(val) : NULL); + return (!val || settings->ShellWorkingDirectory != NULL); + + case FreeRDP_TargetNetAddress: + free(settings->TargetNetAddress); + settings->TargetNetAddress = (val ? _strdup(val) : NULL); + return (!val || settings->TargetNetAddress != NULL); + + case FreeRDP_Username: + free(settings->Username); + settings->Username = (val ? _strdup(val) : NULL); + return (!val || settings->Username != NULL); + + case FreeRDP_WindowTitle: + free(settings->WindowTitle); + settings->WindowTitle = (val ? _strdup(val) : NULL); + return (!val || settings->WindowTitle != NULL); + + case FreeRDP_WmClass: + free(settings->WmClass); + settings->WmClass = (val ? _strdup(val) : NULL); + return (!val || settings->WmClass != NULL); default: WLog_ERR(TAG, "[%s] Invalid key index %" PRIuz, __FUNCTION__, id); @@ -2709,68 +2709,56 @@ const void* freerdp_settings_get_pointer(const rdpSettings* settings, size_t id) switch (id) { - case FreeRDP_instance: - return settings->instance; - - case FreeRDP_RdpServerCertificate: - return settings->RdpServerCertificate; - - case FreeRDP_ServerAutoReconnectCookie: - return settings->ServerAutoReconnectCookie; - case FreeRDP_BitmapCacheV2CellInfo: return settings->BitmapCacheV2CellInfo; - case FreeRDP_RdpServerRsaKey: - return settings->RdpServerRsaKey; - - case FreeRDP_MonitorIds: - return settings->MonitorIds; - - case FreeRDP_TargetNetPorts: - return settings->TargetNetPorts; - - case FreeRDP_MonitorDefArray: - return settings->MonitorDefArray; - case FreeRDP_ChannelDefArray: return settings->ChannelDefArray; case FreeRDP_ClientAutoReconnectCookie: return settings->ClientAutoReconnectCookie; - case FreeRDP_TargetNetAddresses: - return settings->TargetNetAddresses; + case FreeRDP_ClientRandom: + return settings->ClientRandom; - case FreeRDP_StaticChannelArray: - return settings->StaticChannelArray; + case FreeRDP_ClientTimeZone: + return settings->ClientTimeZone; + + case FreeRDP_DeviceArray: + return settings->DeviceArray; case FreeRDP_DynamicChannelArray: return settings->DynamicChannelArray; - case FreeRDP_DeviceArray: - return settings->DeviceArray; + case FreeRDP_FragCache: + return settings->FragCache; case FreeRDP_GlyphCache: return settings->GlyphCache; - case FreeRDP_FragCache: - return settings->FragCache; + case FreeRDP_LoadBalanceInfo: + return settings->LoadBalanceInfo; - case FreeRDP_ClientTimeZone: - return settings->ClientTimeZone; + case FreeRDP_MonitorDefArray: + return settings->MonitorDefArray; - case FreeRDP_ServerRandom: - return settings->ServerRandom; + case FreeRDP_MonitorIds: + return settings->MonitorIds; - case FreeRDP_ServerCertificate: - return settings->ServerCertificate; + case FreeRDP_OrderSupport: + return settings->OrderSupport; - case FreeRDP_ClientRandom: - return settings->ClientRandom; + case FreeRDP_Password51: + return settings->Password51; - case FreeRDP_LoadBalanceInfo: - return settings->LoadBalanceInfo; + case FreeRDP_RdpServerCertificate: + return settings->RdpServerCertificate; + + case FreeRDP_RdpServerRsaKey: + return settings->RdpServerRsaKey; + + case FreeRDP_ReceivedCapabilities: + return settings->ReceivedCapabilities; case FreeRDP_RedirectionPassword: return settings->RedirectionPassword; @@ -2778,14 +2766,26 @@ const void* freerdp_settings_get_pointer(const rdpSettings* settings, size_t id) case FreeRDP_RedirectionTsvUrl: return settings->RedirectionTsvUrl; - case FreeRDP_Password51: - return settings->Password51; + case FreeRDP_ServerAutoReconnectCookie: + return settings->ServerAutoReconnectCookie; - case FreeRDP_ReceivedCapabilities: - return settings->ReceivedCapabilities; + case FreeRDP_ServerCertificate: + return settings->ServerCertificate; - case FreeRDP_OrderSupport: - return settings->OrderSupport; + case FreeRDP_ServerRandom: + return settings->ServerRandom; + + case FreeRDP_StaticChannelArray: + return settings->StaticChannelArray; + + case FreeRDP_TargetNetAddresses: + return settings->TargetNetAddresses; + + case FreeRDP_TargetNetPorts: + return settings->TargetNetPorts; + + case FreeRDP_instance: + return settings->instance; default: WLog_ERR(TAG, "[%s] Invalid key index %" PRIuz, __FUNCTION__, id); diff --git a/libfreerdp/common/settings_str.c b/libfreerdp/common/settings_str.c new file mode 100644 index 000000000..8ba0b38ae --- /dev/null +++ b/libfreerdp/common/settings_str.c @@ -0,0 +1,434 @@ +/* Generated by */ + +#include <freerdp/settings.h> +#include <freerdp/log.h> + +#define TAG FREERDP_TAG("common.settings") + +struct settings_str_entry +{ + size_t id; + size_t type; + const char* str; +}; +static const struct settings_str_entry settings_map[] = { + { FreeRDP_AllowCacheWaitingList, 0, "FreeRDP_AllowCacheWaitingList" }, + { FreeRDP_AllowDesktopComposition, 0, "FreeRDP_AllowDesktopComposition" }, + { FreeRDP_AllowFontSmoothing, 0, "FreeRDP_AllowFontSmoothing" }, + { FreeRDP_AllowUnanouncedOrdersFromServer, 0, "FreeRDP_AllowUnanouncedOrdersFromServer" }, + { FreeRDP_AltSecFrameMarkerSupport, 0, "FreeRDP_AltSecFrameMarkerSupport" }, + { FreeRDP_AsyncChannels, 0, "FreeRDP_AsyncChannels" }, + { FreeRDP_AsyncInput, 0, "FreeRDP_AsyncInput" }, + { FreeRDP_AsyncUpdate, 0, "FreeRDP_AsyncUpdate" }, + { FreeRDP_AudioCapture, 0, "FreeRDP_AudioCapture" }, + { FreeRDP_AudioPlayback, 0, "FreeRDP_AudioPlayback" }, + { FreeRDP_Authentication, 0, "FreeRDP_Authentication" }, + { FreeRDP_AuthenticationOnly, 0, "FreeRDP_AuthenticationOnly" }, + { FreeRDP_AutoAcceptCertificate, 0, "FreeRDP_AutoAcceptCertificate" }, + { FreeRDP_AutoDenyCertificate, 0, "FreeRDP_AutoDenyCertificate" }, + { FreeRDP_AutoLogonEnabled, 0, "FreeRDP_AutoLogonEnabled" }, + { FreeRDP_AutoReconnectionEnabled, 0, "FreeRDP_AutoReconnectionEnabled" }, + { FreeRDP_BitmapCacheEnabled, 0, "FreeRDP_BitmapCacheEnabled" }, + { FreeRDP_BitmapCachePersistEnabled, 0, "FreeRDP_BitmapCachePersistEnabled" }, + { FreeRDP_BitmapCacheV3Enabled, 0, "FreeRDP_BitmapCacheV3Enabled" }, + { FreeRDP_BitmapCompressionDisabled, 0, "FreeRDP_BitmapCompressionDisabled" }, + { FreeRDP_ColorPointerFlag, 0, "FreeRDP_ColorPointerFlag" }, + { FreeRDP_CompressionEnabled, 0, "FreeRDP_CompressionEnabled" }, + { FreeRDP_ConsoleSession, 0, "FreeRDP_ConsoleSession" }, + { FreeRDP_CredentialsFromStdin, 0, "FreeRDP_CredentialsFromStdin" }, + { FreeRDP_Decorations, 0, "FreeRDP_Decorations" }, + { FreeRDP_DesktopResize, 0, "FreeRDP_DesktopResize" }, + { FreeRDP_DeviceRedirection, 0, "FreeRDP_DeviceRedirection" }, + { FreeRDP_DisableCredentialsDelegation, 0, "FreeRDP_DisableCredentialsDelegation" }, + { FreeRDP_DisableCtrlAltDel, 0, "FreeRDP_DisableCtrlAltDel" }, + { FreeRDP_DisableCursorBlinking, 0, "FreeRDP_DisableCursorBlinking" }, + { FreeRDP_DisableCursorShadow, 0, "FreeRDP_DisableCursorShadow" }, + { FreeRDP_DisableFullWindowDrag, 0, "FreeRDP_DisableFullWindowDrag" }, + { FreeRDP_DisableMenuAnims, 0, "FreeRDP_DisableMenuAnims" }, + { FreeRDP_DisableRemoteAppCapsCheck, 0, "FreeRDP_DisableRemoteAppCapsCheck" }, + { FreeRDP_DisableThemes, 0, "FreeRDP_DisableThemes" }, + { FreeRDP_DisableWallpaper, 0, "FreeRDP_DisableWallpaper" }, + { FreeRDP_DrawAllowColorSubsampling, 0, "FreeRDP_DrawAllowColorSubsampling" }, + { FreeRDP_DrawAllowDynamicColorFidelity, 0, "FreeRDP_DrawAllowDynamicColorFidelity" }, + { FreeRDP_DrawAllowSkipAlpha, 0, "FreeRDP_DrawAllowSkipAlpha" }, + { FreeRDP_DrawGdiPlusCacheEnabled, 0, "FreeRDP_DrawGdiPlusCacheEnabled" }, + { FreeRDP_DrawGdiPlusEnabled, 0, "FreeRDP_DrawGdiPlusEnabled" }, + { FreeRDP_DrawNineGridEnabled, 0, "FreeRDP_DrawNineGridEnabled" }, + { FreeRDP_DumpRemoteFx, 0, "FreeRDP_DumpRemoteFx" }, + { FreeRDP_DynamicDaylightTimeDisabled, 0, "FreeRDP_DynamicDaylightTimeDisabled" }, + { FreeRDP_DynamicResolutionUpdate, 0, "FreeRDP_DynamicResolutionUpdate" }, + { FreeRDP_EmbeddedWindow, 0, "FreeRDP_EmbeddedWindow" }, + { FreeRDP_EnableWindowsKey, 0, "FreeRDP_EnableWindowsKey" }, + { FreeRDP_EncomspVirtualChannel, 0, "FreeRDP_EncomspVirtualChannel" }, + { FreeRDP_ExtSecurity, 0, "FreeRDP_ExtSecurity" }, + { FreeRDP_ExternalCertificateManagement, 0, "FreeRDP_ExternalCertificateManagement" }, + { FreeRDP_FIPSMode, 0, "FreeRDP_FIPSMode" }, + { FreeRDP_FastPathInput, 0, "FreeRDP_FastPathInput" }, + { FreeRDP_FastPathOutput, 0, "FreeRDP_FastPathOutput" }, + { FreeRDP_ForceEncryptedCsPdu, 0, "FreeRDP_ForceEncryptedCsPdu" }, + { FreeRDP_ForceMultimon, 0, "FreeRDP_ForceMultimon" }, + { FreeRDP_FrameMarkerCommandEnabled, 0, "FreeRDP_FrameMarkerCommandEnabled" }, + { FreeRDP_Fullscreen, 0, "FreeRDP_Fullscreen" }, + { FreeRDP_GatewayBypassLocal, 0, "FreeRDP_GatewayBypassLocal" }, + { FreeRDP_GatewayEnabled, 0, "FreeRDP_GatewayEnabled" }, + { FreeRDP_GatewayHttpTransport, 0, "FreeRDP_GatewayHttpTransport" }, + { FreeRDP_GatewayRpcTransport, 0, "FreeRDP_GatewayRpcTransport" }, + { FreeRDP_GatewayUdpTransport, 0, "FreeRDP_GatewayUdpTransport" }, + { FreeRDP_GatewayUseSameCredentials, 0, "FreeRDP_GatewayUseSameCredentials" }, + { FreeRDP_GfxAVC444, 0, "FreeRDP_GfxAVC444" }, + { FreeRDP_GfxAVC444v2, 0, "FreeRDP_GfxAVC444v2" }, + { FreeRDP_GfxH264, 0, "FreeRDP_GfxH264" }, + { FreeRDP_GfxProgressive, 0, "FreeRDP_GfxProgressive" }, + { FreeRDP_GfxProgressiveV2, 0, "FreeRDP_GfxProgressiveV2" }, + { FreeRDP_GfxSendQoeAck, 0, "FreeRDP_GfxSendQoeAck" }, + { FreeRDP_GfxSmallCache, 0, "FreeRDP_GfxSmallCache" }, + { FreeRDP_GfxThinClient, 0, "FreeRDP_GfxThinClient" }, + { FreeRDP_GrabKeyboard, 0, "FreeRDP_GrabKeyboard" }, + { FreeRDP_HasExtendedMouseEvent, 0, "FreeRDP_HasExtendedMouseEvent" }, + { FreeRDP_HasHorizontalWheel, 0, "FreeRDP_HasHorizontalWheel" }, + { FreeRDP_HasMonitorAttributes, 0, "FreeRDP_HasMonitorAttributes" }, + { FreeRDP_HiDefRemoteApp, 0, "FreeRDP_HiDefRemoteApp" }, + { FreeRDP_IPv6Enabled, 0, "FreeRDP_IPv6Enabled" }, + { FreeRDP_IgnoreCertificate, 0, "FreeRDP_IgnoreCertificate" }, + { FreeRDP_JpegCodec, 0, "FreeRDP_JpegCodec" }, + { FreeRDP_ListMonitors, 0, "FreeRDP_ListMonitors" }, + { FreeRDP_LocalConnection, 0, "FreeRDP_LocalConnection" }, + { FreeRDP_LogonErrors, 0, "FreeRDP_LogonErrors" }, + { FreeRDP_LogonNotify, 0, "FreeRDP_LogonNotify" }, + { FreeRDP_LongCredentialsSupported, 0, "FreeRDP_LongCredentialsSupported" }, + { FreeRDP_LyncRdpMode, 0, "FreeRDP_LyncRdpMode" }, + { FreeRDP_MaximizeShell, 0, "FreeRDP_MaximizeShell" }, + { FreeRDP_MouseAttached, 0, "FreeRDP_MouseAttached" }, + { FreeRDP_MouseHasWheel, 0, "FreeRDP_MouseHasWheel" }, + { FreeRDP_MouseMotion, 0, "FreeRDP_MouseMotion" }, + { FreeRDP_MstscCookieMode, 0, "FreeRDP_MstscCookieMode" }, + { FreeRDP_MultiTouchGestures, 0, "FreeRDP_MultiTouchGestures" }, + { FreeRDP_MultiTouchInput, 0, "FreeRDP_MultiTouchInput" }, + { FreeRDP_NSCodec, 0, "FreeRDP_NSCodec" }, + { FreeRDP_NSCodecAllowDynamicColorFidelity, 0, "FreeRDP_NSCodecAllowDynamicColorFidelity" }, + { FreeRDP_NSCodecAllowSubsampling, 0, "FreeRDP_NSCodecAllowSubsampling" }, + { FreeRDP_NegotiateSecurityLayer, 0, "FreeRDP_NegotiateSecurityLayer" }, + { FreeRDP_NetworkAutoDetect, 0, "FreeRDP_NetworkAutoDetect" }, + { FreeRDP_NlaSecurity, 0, "FreeRDP_NlaSecurity" }, + { FreeRDP_NoBitmapCompressionHeader, 0, "FreeRDP_NoBitmapCompressionHeader" }, + { FreeRDP_OldLicenseBehaviour, 0, "FreeRDP_OldLicenseBehaviour" }, + { FreeRDP_PasswordIsSmartcardPin, 0, "FreeRDP_PasswordIsSmartcardPin" }, + { FreeRDP_PercentScreenUseHeight, 0, "FreeRDP_PercentScreenUseHeight" }, + { FreeRDP_PercentScreenUseWidth, 0, "FreeRDP_PercentScreenUseWidth" }, + { FreeRDP_PlayRemoteFx, 0, "FreeRDP_PlayRemoteFx" }, + { FreeRDP_PreferIPv6OverIPv4, 0, "FreeRDP_PreferIPv6OverIPv4" }, + { FreeRDP_PrintReconnectCookie, 0, "FreeRDP_PrintReconnectCookie" }, + { FreeRDP_PromptForCredentials, 0, "FreeRDP_PromptForCredentials" }, + { FreeRDP_RdpSecurity, 0, "FreeRDP_RdpSecurity" }, + { FreeRDP_RedirectClipboard, 0, "FreeRDP_RedirectClipboard" }, + { FreeRDP_RedirectDrives, 0, "FreeRDP_RedirectDrives" }, + { FreeRDP_RedirectHomeDrive, 0, "FreeRDP_RedirectHomeDrive" }, + { FreeRDP_RedirectParallelPorts, 0, "FreeRDP_RedirectParallelPorts" }, + { FreeRDP_RedirectPrinters, 0, "FreeRDP_RedirectPrinters" }, + { FreeRDP_RedirectSerialPorts, 0, "FreeRDP_RedirectSerialPorts" }, + { FreeRDP_RedirectSmartCards, 0, "FreeRDP_RedirectSmartCards" }, + { FreeRDP_RefreshRect, 0, "FreeRDP_RefreshRect" }, + { FreeRDP_RemdeskVirtualChannel, 0, "FreeRDP_RemdeskVirtualChannel" }, + { FreeRDP_RemoteAppLanguageBarSupported, 0, "FreeRDP_RemoteAppLanguageBarSupported" }, + { FreeRDP_RemoteApplicationMode, 0, "FreeRDP_RemoteApplicationMode" }, + { FreeRDP_RemoteAssistanceMode, 0, "FreeRDP_RemoteAssistanceMode" }, + { FreeRDP_RemoteAssistanceRequestControl, 0, "FreeRDP_RemoteAssistanceRequestControl" }, + { FreeRDP_RemoteConsoleAudio, 0, "FreeRDP_RemoteConsoleAudio" }, + { FreeRDP_RemoteFxCodec, 0, "FreeRDP_RemoteFxCodec" }, + { FreeRDP_RemoteFxImageCodec, 0, "FreeRDP_RemoteFxImageCodec" }, + { FreeRDP_RemoteFxOnly, 0, "FreeRDP_RemoteFxOnly" }, + { FreeRDP_RestrictedAdminModeRequired, 0, "FreeRDP_RestrictedAdminModeRequired" }, + { FreeRDP_SaltedChecksum, 0, "FreeRDP_SaltedChecksum" }, + { FreeRDP_SendPreconnectionPdu, 0, "FreeRDP_SendPreconnectionPdu" }, + { FreeRDP_ServerMode, 0, "FreeRDP_ServerMode" }, + { FreeRDP_SmartSizing, 0, "FreeRDP_SmartSizing" }, + { FreeRDP_SmartcardLogon, 0, "FreeRDP_SmartcardLogon" }, + { FreeRDP_SoftwareGdi, 0, "FreeRDP_SoftwareGdi" }, + { FreeRDP_SoundBeepsEnabled, 0, "FreeRDP_SoundBeepsEnabled" }, + { FreeRDP_SpanMonitors, 0, "FreeRDP_SpanMonitors" }, + { FreeRDP_SupportAsymetricKeys, 0, "FreeRDP_SupportAsymetricKeys" }, + { FreeRDP_SupportDisplayControl, 0, "FreeRDP_SupportDisplayControl" }, + { FreeRDP_SupportDynamicChannels, 0, "FreeRDP_SupportDynamicChannels" }, + { FreeRDP_SupportDynamicTimeZone, 0, "FreeRDP_SupportDynamicTimeZone" }, + { FreeRDP_SupportEchoChannel, 0, "FreeRDP_SupportEchoChannel" }, + { FreeRDP_SupportErrorInfoPdu, 0, "FreeRDP_SupportErrorInfoPdu" }, + { FreeRDP_SupportGeometryTracking, 0, "FreeRDP_SupportGeometryTracking" }, + { FreeRDP_SupportGraphicsPipeline, 0, "FreeRDP_SupportGraphicsPipeline" }, + { FreeRDP_SupportHeartbeatPdu, 0, "FreeRDP_SupportHeartbeatPdu" }, + { FreeRDP_SupportMonitorLayoutPdu, 0, "FreeRDP_SupportMonitorLayoutPdu" }, + { FreeRDP_SupportMultitransport, 0, "FreeRDP_SupportMultitransport" }, + { FreeRDP_SupportSSHAgentChannel, 0, "FreeRDP_SupportSSHAgentChannel" }, + { FreeRDP_SupportStatusInfoPdu, 0, "FreeRDP_SupportStatusInfoPdu" }, + { FreeRDP_SupportVideoOptimized, 0, "FreeRDP_SupportVideoOptimized" }, + { FreeRDP_SuppressOutput, 0, "FreeRDP_SuppressOutput" }, + { FreeRDP_SurfaceCommandsEnabled, 0, "FreeRDP_SurfaceCommandsEnabled" }, + { FreeRDP_SurfaceFrameMarkerEnabled, 0, "FreeRDP_SurfaceFrameMarkerEnabled" }, + { FreeRDP_TcpKeepAlive, 0, "FreeRDP_TcpKeepAlive" }, + { FreeRDP_TlsSecurity, 0, "FreeRDP_TlsSecurity" }, + { FreeRDP_ToggleFullscreen, 0, "FreeRDP_ToggleFullscreen" }, + { FreeRDP_UnicodeInput, 0, "FreeRDP_UnicodeInput" }, + { FreeRDP_UnmapButtons, 0, "FreeRDP_UnmapButtons" }, + { FreeRDP_UseMultimon, 0, "FreeRDP_UseMultimon" }, + { FreeRDP_UseRdpSecurityLayer, 0, "FreeRDP_UseRdpSecurityLayer" }, + { FreeRDP_UsingSavedCredentials, 0, "FreeRDP_UsingSavedCredentials" }, + { FreeRDP_VideoDisable, 0, "FreeRDP_VideoDisable" }, + { FreeRDP_VmConnectMode, 0, "FreeRDP_VmConnectMode" }, + { FreeRDP_WaitForOutputBufferFlush, 0, "FreeRDP_WaitForOutputBufferFlush" }, + { FreeRDP_Workarea, 0, "FreeRDP_Workarea" }, + { FreeRDP_DesktopOrientation, 1, "FreeRDP_DesktopOrientation" }, + { FreeRDP_ProxyPort, 1, "FreeRDP_ProxyPort" }, + { FreeRDP_AcceptedCertLength, 3, "FreeRDP_AcceptedCertLength" }, + { FreeRDP_AuthenticationLevel, 3, "FreeRDP_AuthenticationLevel" }, + { FreeRDP_AutoReconnectMaxRetries, 3, "FreeRDP_AutoReconnectMaxRetries" }, + { FreeRDP_BitmapCacheV2NumCells, 3, "FreeRDP_BitmapCacheV2NumCells" }, + { FreeRDP_BitmapCacheV3CodecId, 3, "FreeRDP_BitmapCacheV3CodecId" }, + { FreeRDP_BitmapCacheVersion, 3, "FreeRDP_BitmapCacheVersion" }, + { FreeRDP_BrushSupportLevel, 3, "FreeRDP_BrushSupportLevel" }, + { FreeRDP_ChannelCount, 3, "FreeRDP_ChannelCount" }, + { FreeRDP_ChannelDefArraySize, 3, "FreeRDP_ChannelDefArraySize" }, + { FreeRDP_ClientBuild, 3, "FreeRDP_ClientBuild" }, + { FreeRDP_ClientRandomLength, 3, "FreeRDP_ClientRandomLength" }, + { FreeRDP_ClusterInfoFlags, 3, "FreeRDP_ClusterInfoFlags" }, + { FreeRDP_ColorDepth, 3, "FreeRDP_ColorDepth" }, + { FreeRDP_CompDeskSupportLevel, 3, "FreeRDP_CompDeskSupportLevel" }, + { FreeRDP_CompressionLevel, 3, "FreeRDP_CompressionLevel" }, + { FreeRDP_ConnectionType, 3, "FreeRDP_ConnectionType" }, + { FreeRDP_CookieMaxLength, 3, "FreeRDP_CookieMaxLength" }, + { FreeRDP_DesktopHeight, 3, "FreeRDP_DesktopHeight" }, + { FreeRDP_DesktopPhysicalHeight, 3, "FreeRDP_DesktopPhysicalHeight" }, + { FreeRDP_DesktopPhysicalWidth, 3, "FreeRDP_DesktopPhysicalWidth" }, + { FreeRDP_DesktopPosX, 3, "FreeRDP_DesktopPosX" }, + { FreeRDP_DesktopPosY, 3, "FreeRDP_DesktopPosY" }, + { FreeRDP_DesktopScaleFactor, 3, "FreeRDP_DesktopScaleFactor" }, + { FreeRDP_DesktopWidth, 3, "FreeRDP_DesktopWidth" }, + { FreeRDP_DeviceArraySize, 3, "FreeRDP_DeviceArraySize" }, + { FreeRDP_DeviceCount, 3, "FreeRDP_DeviceCount" }, + { FreeRDP_DeviceScaleFactor, 3, "FreeRDP_DeviceScaleFactor" }, + { FreeRDP_DrawNineGridCacheEntries, 3, "FreeRDP_DrawNineGridCacheEntries" }, + { FreeRDP_DrawNineGridCacheSize, 3, "FreeRDP_DrawNineGridCacheSize" }, + { FreeRDP_DynamicChannelArraySize, 3, "FreeRDP_DynamicChannelArraySize" }, + { FreeRDP_DynamicChannelCount, 3, "FreeRDP_DynamicChannelCount" }, + { FreeRDP_EarlyCapabilityFlags, 3, "FreeRDP_EarlyCapabilityFlags" }, + { FreeRDP_EncryptionLevel, 3, "FreeRDP_EncryptionLevel" }, + { FreeRDP_EncryptionMethods, 3, "FreeRDP_EncryptionMethods" }, + { FreeRDP_ExtEncryptionMethods, 3, "FreeRDP_ExtEncryptionMethods" }, + { FreeRDP_FrameAcknowledge, 3, "FreeRDP_FrameAcknowledge" }, + { FreeRDP_GatewayAcceptedCertLength, 3, "FreeRDP_GatewayAcceptedCertLength" }, + { FreeRDP_GatewayCredentialsSource, 3, "FreeRDP_GatewayCredentialsSource" }, + { FreeRDP_GatewayPort, 3, "FreeRDP_GatewayPort" }, + { FreeRDP_GatewayUsageMethod, 3, "FreeRDP_GatewayUsageMethod" }, + { FreeRDP_GfxCapsFilter, 3, "FreeRDP_GfxCapsFilter" }, + { FreeRDP_GlyphSupportLevel, 3, "FreeRDP_GlyphSupportLevel" }, + { FreeRDP_JpegCodecId, 3, "FreeRDP_JpegCodecId" }, + { FreeRDP_JpegQuality, 3, "FreeRDP_JpegQuality" }, + { FreeRDP_KeyboardCodePage, 3, "FreeRDP_KeyboardCodePage" }, + { FreeRDP_KeyboardFunctionKey, 3, "FreeRDP_KeyboardFunctionKey" }, + { FreeRDP_KeyboardHook, 3, "FreeRDP_KeyboardHook" }, + { FreeRDP_KeyboardLayout, 3, "FreeRDP_KeyboardLayout" }, + { FreeRDP_KeyboardSubType, 3, "FreeRDP_KeyboardSubType" }, + { FreeRDP_KeyboardType, 3, "FreeRDP_KeyboardType" }, + { FreeRDP_LargePointerFlag, 3, "FreeRDP_LargePointerFlag" }, + { FreeRDP_LoadBalanceInfoLength, 3, "FreeRDP_LoadBalanceInfoLength" }, + { FreeRDP_MaxTimeInCheckLoop, 3, "FreeRDP_MaxTimeInCheckLoop" }, + { FreeRDP_MonitorCount, 3, "FreeRDP_MonitorCount" }, + { FreeRDP_MonitorDefArraySize, 3, "FreeRDP_MonitorDefArraySize" }, + { FreeRDP_MonitorLocalShiftX, 3, "FreeRDP_MonitorLocalShiftX" }, + { FreeRDP_MonitorLocalShiftY, 3, "FreeRDP_MonitorLocalShiftY" }, + { FreeRDP_MultifragMaxRequestSize, 3, "FreeRDP_MultifragMaxRequestSize" }, + { FreeRDP_MultitransportFlags, 3, "FreeRDP_MultitransportFlags" }, + { FreeRDP_NSCodecColorLossLevel, 3, "FreeRDP_NSCodecColorLossLevel" }, + { FreeRDP_NSCodecId, 3, "FreeRDP_NSCodecId" }, + { FreeRDP_NegotiationFlags, 3, "FreeRDP_NegotiationFlags" }, + { FreeRDP_NumMonitorIds, 3, "FreeRDP_NumMonitorIds" }, + { FreeRDP_OffscreenCacheEntries, 3, "FreeRDP_OffscreenCacheEntries" }, + { FreeRDP_OffscreenCacheSize, 3, "FreeRDP_OffscreenCacheSize" }, + { FreeRDP_OffscreenSupportLevel, 3, "FreeRDP_OffscreenSupportLevel" }, + { FreeRDP_OsMajorType, 3, "FreeRDP_OsMajorType" }, + { FreeRDP_OsMinorType, 3, "FreeRDP_OsMinorType" }, + { FreeRDP_Password51Length, 3, "FreeRDP_Password51Length" }, + { FreeRDP_PduSource, 3, "FreeRDP_PduSource" }, + { FreeRDP_PercentScreen, 3, "FreeRDP_PercentScreen" }, + { FreeRDP_PerformanceFlags, 3, "FreeRDP_PerformanceFlags" }, + { FreeRDP_PointerCacheSize, 3, "FreeRDP_PointerCacheSize" }, + { FreeRDP_PreconnectionId, 3, "FreeRDP_PreconnectionId" }, + { FreeRDP_ProxyType, 3, "FreeRDP_ProxyType" }, + { FreeRDP_RdpVersion, 3, "FreeRDP_RdpVersion" }, + { FreeRDP_ReceivedCapabilitiesSize, 3, "FreeRDP_ReceivedCapabilitiesSize" }, + { FreeRDP_RedirectedSessionId, 3, "FreeRDP_RedirectedSessionId" }, + { FreeRDP_RedirectionAcceptedCertLength, 3, "FreeRDP_RedirectionAcceptedCertLength" }, + { FreeRDP_RedirectionFlags, 3, "FreeRDP_RedirectionFlags" }, + { FreeRDP_RedirectionPasswordLength, 3, "FreeRDP_RedirectionPasswordLength" }, + { FreeRDP_RedirectionPreferType, 3, "FreeRDP_RedirectionPreferType" }, + { FreeRDP_RedirectionTsvUrlLength, 3, "FreeRDP_RedirectionTsvUrlLength" }, + { FreeRDP_RemoteAppNumIconCacheEntries, 3, "FreeRDP_RemoteAppNumIconCacheEntries" }, + { FreeRDP_RemoteAppNumIconCaches, 3, "FreeRDP_RemoteAppNumIconCaches" }, + { FreeRDP_RemoteApplicationExpandCmdLine, 3, "FreeRDP_RemoteApplicationExpandCmdLine" }, + { FreeRDP_RemoteApplicationExpandWorkingDir, 3, "FreeRDP_RemoteApplicationExpandWorkingDir" }, + { FreeRDP_RemoteApplicationSupportLevel, 3, "FreeRDP_RemoteApplicationSupportLevel" }, + { FreeRDP_RemoteApplicationSupportMask, 3, "FreeRDP_RemoteApplicationSupportMask" }, + { FreeRDP_RemoteFxCaptureFlags, 3, "FreeRDP_RemoteFxCaptureFlags" }, + { FreeRDP_RemoteFxCodecId, 3, "FreeRDP_RemoteFxCodecId" }, + { FreeRDP_RemoteFxCodecMode, 3, "FreeRDP_RemoteFxCodecMode" }, + { FreeRDP_RemoteWndSupportLevel, 3, "FreeRDP_RemoteWndSupportLevel" }, + { FreeRDP_RequestedProtocols, 3, "FreeRDP_RequestedProtocols" }, + { FreeRDP_SelectedProtocol, 3, "FreeRDP_SelectedProtocol" }, + { FreeRDP_ServerCertificateLength, 3, "FreeRDP_ServerCertificateLength" }, + { FreeRDP_ServerPort, 3, "FreeRDP_ServerPort" }, + { FreeRDP_ServerRandomLength, 3, "FreeRDP_ServerRandomLength" }, + { FreeRDP_ShareId, 3, "FreeRDP_ShareId" }, + { FreeRDP_SmartSizingHeight, 3, "FreeRDP_SmartSizingHeight" }, + { FreeRDP_SmartSizingWidth, 3, "FreeRDP_SmartSizingWidth" }, + { FreeRDP_StaticChannelArraySize, 3, "FreeRDP_StaticChannelArraySize" }, + { FreeRDP_StaticChannelCount, 3, "FreeRDP_StaticChannelCount" }, + { FreeRDP_TargetNetAddressCount, 3, "FreeRDP_TargetNetAddressCount" }, + { FreeRDP_TcpAckTimeout, 3, "FreeRDP_TcpAckTimeout" }, + { FreeRDP_TcpKeepAliveDelay, 3, "FreeRDP_TcpKeepAliveDelay" }, + { FreeRDP_TcpKeepAliveInterval, 3, "FreeRDP_TcpKeepAliveInterval" }, + { FreeRDP_TcpKeepAliveRetries, 3, "FreeRDP_TcpKeepAliveRetries" }, + { FreeRDP_TlsSecLevel, 3, "FreeRDP_TlsSecLevel" }, + { FreeRDP_VirtualChannelChunkSize, 3, "FreeRDP_VirtualChannelChunkSize" }, + { FreeRDP_VirtualChannelCompressionFlags, 3, "FreeRDP_VirtualChannelCompressionFlags" }, + { FreeRDP_XPan, 4, "FreeRDP_XPan" }, + { FreeRDP_YPan, 4, "FreeRDP_YPan" }, + { FreeRDP_ParentWindowId, 5, "FreeRDP_ParentWindowId" }, + { FreeRDP_AcceptedCert, 7, "FreeRDP_AcceptedCert" }, + { FreeRDP_AllowedTlsCiphers, 7, "FreeRDP_AllowedTlsCiphers" }, + { FreeRDP_AlternateShell, 7, "FreeRDP_AlternateShell" }, + { FreeRDP_AssistanceFile, 7, "FreeRDP_AssistanceFile" }, + { FreeRDP_AuthenticationServiceClass, 7, "FreeRDP_AuthenticationServiceClass" }, + { FreeRDP_CertificateAcceptedFingerprints, 7, "FreeRDP_CertificateAcceptedFingerprints" }, + { FreeRDP_CertificateContent, 7, "FreeRDP_CertificateContent" }, + { FreeRDP_CertificateFile, 7, "FreeRDP_CertificateFile" }, + { FreeRDP_CertificateName, 7, "FreeRDP_CertificateName" }, + { FreeRDP_ClientAddress, 7, "FreeRDP_ClientAddress" }, + { FreeRDP_ClientDir, 7, "FreeRDP_ClientDir" }, + { FreeRDP_ClientHostname, 7, "FreeRDP_ClientHostname" }, + { FreeRDP_ClientProductId, 7, "FreeRDP_ClientProductId" }, + { FreeRDP_ComputerName, 7, "FreeRDP_ComputerName" }, + { FreeRDP_ConfigPath, 7, "FreeRDP_ConfigPath" }, + { FreeRDP_ConnectionFile, 7, "FreeRDP_ConnectionFile" }, + { FreeRDP_CurrentPath, 7, "FreeRDP_CurrentPath" }, + { FreeRDP_Domain, 7, "FreeRDP_Domain" }, + { FreeRDP_DrivesToRedirect, 7, "FreeRDP_DrivesToRedirect" }, + { FreeRDP_DumpRemoteFxFile, 7, "FreeRDP_DumpRemoteFxFile" }, + { FreeRDP_DynamicDSTTimeZoneKeyName, 7, "FreeRDP_DynamicDSTTimeZoneKeyName" }, + { FreeRDP_GatewayAcceptedCert, 7, "FreeRDP_GatewayAcceptedCert" }, + { FreeRDP_GatewayAccessToken, 7, "FreeRDP_GatewayAccessToken" }, + { FreeRDP_GatewayDomain, 7, "FreeRDP_GatewayDomain" }, + { FreeRDP_GatewayHostname, 7, "FreeRDP_GatewayHostname" }, + { FreeRDP_GatewayPassword, 7, "FreeRDP_GatewayPassword" }, + { FreeRDP_GatewayUsername, 7, "FreeRDP_GatewayUsername" }, + { FreeRDP_HomePath, 7, "FreeRDP_HomePath" }, + { FreeRDP_ImeFileName, 7, "FreeRDP_ImeFileName" }, + { FreeRDP_KerberosKdc, 7, "FreeRDP_KerberosKdc" }, + { FreeRDP_KerberosRealm, 7, "FreeRDP_KerberosRealm" }, + { FreeRDP_NtlmSamFile, 7, "FreeRDP_NtlmSamFile" }, + { FreeRDP_Password, 7, "FreeRDP_Password" }, + { FreeRDP_PasswordHash, 7, "FreeRDP_PasswordHash" }, + { FreeRDP_PlayRemoteFxFile, 7, "FreeRDP_PlayRemoteFxFile" }, + { FreeRDP_PreconnectionBlob, 7, "FreeRDP_PreconnectionBlob" }, + { FreeRDP_PrivateKeyContent, 7, "FreeRDP_PrivateKeyContent" }, + { FreeRDP_PrivateKeyFile, 7, "FreeRDP_PrivateKeyFile" }, + { FreeRDP_ProxyHostname, 7, "FreeRDP_ProxyHostname" }, + { FreeRDP_ProxyPassword, 7, "FreeRDP_ProxyPassword" }, + { FreeRDP_ProxyUsername, 7, "FreeRDP_ProxyUsername" }, + { FreeRDP_RDP2TCPArgs, 7, "FreeRDP_RDP2TCPArgs" }, + { FreeRDP_RdpKeyContent, 7, "FreeRDP_RdpKeyContent" }, + { FreeRDP_RdpKeyFile, 7, "FreeRDP_RdpKeyFile" }, + { FreeRDP_RedirectionAcceptedCert, 7, "FreeRDP_RedirectionAcceptedCert" }, + { FreeRDP_RedirectionDomain, 7, "FreeRDP_RedirectionDomain" }, + { FreeRDP_RedirectionTargetFQDN, 7, "FreeRDP_RedirectionTargetFQDN" }, + { FreeRDP_RedirectionTargetNetBiosName, 7, "FreeRDP_RedirectionTargetNetBiosName" }, + { FreeRDP_RedirectionUsername, 7, "FreeRDP_RedirectionUsername" }, + { FreeRDP_RemoteApplicationCmdLine, 7, "FreeRDP_RemoteApplicationCmdLine" }, + { FreeRDP_RemoteApplicationFile, 7, "FreeRDP_RemoteApplicationFile" }, + { FreeRDP_RemoteApplicationGuid, 7, "FreeRDP_RemoteApplicationGuid" }, + { FreeRDP_RemoteApplicationIcon, 7, "FreeRDP_RemoteApplicationIcon" }, + { FreeRDP_RemoteApplicationName, 7, "FreeRDP_RemoteApplicationName" }, + { FreeRDP_RemoteApplicationProgram, 7, "FreeRDP_RemoteApplicationProgram" }, + { FreeRDP_RemoteApplicationWorkingDir, 7, "FreeRDP_RemoteApplicationWorkingDir" }, + { FreeRDP_RemoteAssistancePassStub, 7, "FreeRDP_RemoteAssistancePassStub" }, + { FreeRDP_RemoteAssistancePassword, 7, "FreeRDP_RemoteAssistancePassword" }, + { FreeRDP_RemoteAssistanceRCTicket, 7, "FreeRDP_RemoteAssistanceRCTicket" }, + { FreeRDP_RemoteAssistanceSessionId, 7, "FreeRDP_RemoteAssistanceSessionId" }, + { FreeRDP_ServerHostname, 7, "FreeRDP_ServerHostname" }, + { FreeRDP_ShellWorkingDirectory, 7, "FreeRDP_ShellWorkingDirectory" }, + { FreeRDP_TargetNetAddress, 7, "FreeRDP_TargetNetAddress" }, + { FreeRDP_Username, 7, "FreeRDP_Username" }, + { FreeRDP_WindowTitle, 7, "FreeRDP_WindowTitle" }, + { FreeRDP_WmClass, 7, "FreeRDP_WmClass" }, + { FreeRDP_BitmapCacheV2CellInfo, 8, "FreeRDP_BitmapCacheV2CellInfo" }, + { FreeRDP_ChannelDefArray, 8, "FreeRDP_ChannelDefArray" }, + { FreeRDP_ClientAutoReconnectCookie, 8, "FreeRDP_ClientAutoReconnectCookie" }, + { FreeRDP_ClientRandom, 8, "FreeRDP_ClientRandom" }, + { FreeRDP_ClientTimeZone, 8, "FreeRDP_ClientTimeZone" }, + { FreeRDP_DeviceArray, 8, "FreeRDP_DeviceArray" }, + { FreeRDP_DynamicChannelArray, 8, "FreeRDP_DynamicChannelArray" }, + { FreeRDP_FragCache, 8, "FreeRDP_FragCache" }, + { FreeRDP_GlyphCache, 8, "FreeRDP_GlyphCache" }, + { FreeRDP_LoadBalanceInfo, 8, "FreeRDP_LoadBalanceInfo" }, + { FreeRDP_MonitorDefArray, 8, "FreeRDP_MonitorDefArray" }, + { FreeRDP_MonitorIds, 8, "FreeRDP_MonitorIds" }, + { FreeRDP_OrderSupport, 8, "FreeRDP_OrderSupport" }, + { FreeRDP_Password51, 8, "FreeRDP_Password51" }, + { FreeRDP_RdpServerCertificate, 8, "FreeRDP_RdpServerCertificate" }, + { FreeRDP_RdpServerRsaKey, 8, "FreeRDP_RdpServerRsaKey" }, + { FreeRDP_ReceivedCapabilities, 8, "FreeRDP_ReceivedCapabilities" }, + { FreeRDP_RedirectionPassword, 8, "FreeRDP_RedirectionPassword" }, + { FreeRDP_RedirectionTsvUrl, 8, "FreeRDP_RedirectionTsvUrl" }, + { FreeRDP_ServerAutoReconnectCookie, 8, "FreeRDP_ServerAutoReconnectCookie" }, + { FreeRDP_ServerCertificate, 8, "FreeRDP_ServerCertificate" }, + { FreeRDP_ServerRandom, 8, "FreeRDP_ServerRandom" }, + { FreeRDP_StaticChannelArray, 8, "FreeRDP_StaticChannelArray" }, + { FreeRDP_TargetNetAddresses, 8, "FreeRDP_TargetNetAddresses" }, + { FreeRDP_TargetNetPorts, 8, "FreeRDP_TargetNetPorts" }, + { FreeRDP_instance, 8, "FreeRDP_instance" }, +}; + +SSIZE_T freerdp_settings_get_key_for_name(const char* value) +{ + size_t x; + for (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) +{ + size_t x; + for (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; +} + +SSIZE_T freerdp_settings_get_type_for_key(size_t key) +{ + size_t x; + for (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(size_t key) +{ + size_t x; + for (x = 0; x < ARRAYSIZE(settings_map); x++) + { + const struct settings_str_entry* cur = &settings_map[x]; + if (cur->id == key) + return cur->str; + } + return NULL; +} diff --git a/libfreerdp/core/gateway/rdg.c b/libfreerdp/core/gateway/rdg.c index d8f17c20b..6ea9e4f06 100644 --- a/libfreerdp/core/gateway/rdg.c +++ b/libfreerdp/core/gateway/rdg.c @@ -304,7 +304,8 @@ static wStream* rdg_receive_packet(rdpRdg* rdg) Stream_Seek(s, 4); Stream_Read_UINT32(s, packetLength); - if ((packetLength > INT_MAX) || !Stream_EnsureCapacity(s, packetLength)) + if ((packetLength > INT_MAX) || !Stream_EnsureCapacity(s, packetLength) || + (packetLength < header)) { Stream_Free(s, TRUE); return NULL; diff --git a/libfreerdp/core/listener.c b/libfreerdp/core/listener.c index 68b0c0217..3d0a1b164 100644 --- a/libfreerdp/core/listener.c +++ b/libfreerdp/core/listener.c @@ -138,7 +138,7 @@ static BOOL freerdp_listener_open(freerdp_listener* instance, const char* bind_a WSAEventSelect(sockfd, listener->events[listener->num_sockfds], FD_READ | FD_ACCEPT | FD_CLOSE); listener->num_sockfds++; - WLog_INFO(TAG, "Listening on %s:%d", addr, port); + WLog_INFO(TAG, "Listening on [%s]:%d", addr, port); } freeaddrinfo(res); diff --git a/libfreerdp/core/nego.c b/libfreerdp/core/nego.c index 543c2e54f..7cb509464 100644 --- a/libfreerdp/core/nego.c +++ b/libfreerdp/core/nego.c @@ -91,9 +91,9 @@ static BOOL nego_security_connect(rdpNego* nego); static BOOL nego_send_preconnection_pdu(rdpNego* nego); static BOOL nego_recv_response(rdpNego* nego); static void nego_send(rdpNego* nego); -static void nego_process_negotiation_request(rdpNego* nego, wStream* s); -static void nego_process_negotiation_response(rdpNego* nego, wStream* s); -static void nego_process_negotiation_failure(rdpNego* nego, wStream* s); +static BOOL nego_process_negotiation_request(rdpNego* nego, wStream* s); +static BOOL nego_process_negotiation_response(rdpNego* nego, wStream* s); +static BOOL nego_process_negotiation_failure(rdpNego* nego, wStream* s); /** * Negotiate protocol security and connect. @@ -618,7 +618,8 @@ int nego_recv(rdpTransport* transport, wStream* s, void* extra) switch (type) { case TYPE_RDP_NEG_RSP: - nego_process_negotiation_response(nego, s); + if (!nego_process_negotiation_response(nego, s)) + return -1; WLog_DBG(TAG, "selected_protocol: %" PRIu32 "", nego->SelectedProtocol); /* enhanced security selected ? */ @@ -645,7 +646,8 @@ int nego_recv(rdpTransport* transport, wStream* s, void* extra) break; case TYPE_RDP_NEG_FAILURE: - nego_process_negotiation_failure(nego, s); + if (!nego_process_negotiation_failure(nego, s)) + return -1; break; } } @@ -795,7 +797,8 @@ BOOL nego_read_request(rdpNego* nego, wStream* s) return FALSE; } - nego_process_negotiation_request(nego, s); + if (!nego_process_negotiation_request(nego, s)) + return FALSE; } return tpkt_ensure_stream_consumed(s, length); @@ -918,15 +921,19 @@ fail: * @param s */ -void nego_process_negotiation_request(rdpNego* nego, wStream* s) +BOOL nego_process_negotiation_request(rdpNego* nego, wStream* s) { BYTE flags; UINT16 length; + + if (Stream_GetRemainingLength(s) < 7) + return FALSE; Stream_Read_UINT8(s, flags); Stream_Read_UINT16(s, length); Stream_Read_UINT32(s, nego->RequestedProtocols); WLog_DBG(TAG, "RDP_NEG_REQ: RequestedProtocol: 0x%08" PRIX32 "", nego->RequestedProtocols); nego->state = NEGO_STATE_FINAL; + return TRUE; } /** @@ -935,7 +942,7 @@ void nego_process_negotiation_request(rdpNego* nego, wStream* s) * @param s */ -void nego_process_negotiation_response(rdpNego* nego, wStream* s) +BOOL nego_process_negotiation_response(rdpNego* nego, wStream* s) { UINT16 length; WLog_DBG(TAG, "RDP_NEG_RSP"); @@ -944,13 +951,14 @@ void nego_process_negotiation_response(rdpNego* nego, wStream* s) { WLog_ERR(TAG, "Invalid RDP_NEG_RSP"); nego->state = NEGO_STATE_FAIL; - return; + return FALSE; } Stream_Read_UINT8(s, nego->flags); Stream_Read_UINT16(s, length); Stream_Read_UINT32(s, nego->SelectedProtocol); nego->state = NEGO_STATE_FINAL; + return TRUE; } /** @@ -959,12 +967,14 @@ void nego_process_negotiation_response(rdpNego* nego, wStream* s) * @param s */ -void nego_process_negotiation_failure(rdpNego* nego, wStream* s) +BOOL nego_process_negotiation_failure(rdpNego* nego, wStream* s) { BYTE flags; UINT16 length; UINT32 failureCode; WLog_DBG(TAG, "RDP_NEG_FAILURE"); + if (Stream_GetRemainingLength(s) < 7) + return FALSE; Stream_Read_UINT8(s, flags); Stream_Read_UINT16(s, length); Stream_Read_UINT32(s, failureCode); @@ -999,6 +1009,7 @@ void nego_process_negotiation_failure(rdpNego* nego, wStream* s) } nego->state = NEGO_STATE_FAIL; + return TRUE; } /** diff --git a/libfreerdp/core/orders.c b/libfreerdp/core/orders.c index 4bf362899..bac9dc113 100644 --- a/libfreerdp/core/orders.c +++ b/libfreerdp/core/orders.c @@ -2495,23 +2495,21 @@ BOOL update_write_cache_glyph_v2_order(wStream* s, const CACHE_GLYPH_V2_ORDER* c return TRUE; } -static BOOL update_decompress_brush(wStream* s, BYTE* output, BYTE bpp) +static BOOL update_decompress_brush(wStream* s, BYTE* output, size_t outSize, BYTE bpp) { - UINT32 index; - UINT32 x, y, k; + INT32 x, y, k; BYTE byte = 0; - BYTE* palette; - UINT32 bytesPerPixel; - palette = Stream_Pointer(s) + 16; - bytesPerPixel = ((bpp + 1) / 8); + const BYTE* palette = Stream_Pointer(s) + 16; + const INT32 bytesPerPixel = ((bpp + 1) / 8); - if (Stream_GetRemainingLength(s) < 16 + 7 * bytesPerPixel) // 64 / 4 + if (!Stream_SafeSeek(s, 16ULL + 7ULL * bytesPerPixel)) // 64 / 4 return FALSE; for (y = 7; y >= 0; y--) { for (x = 0; x < 8; x++) { + UINT32 index; if ((x % 4) == 0) Stream_Read_UINT8(s, byte); @@ -2519,14 +2517,15 @@ static BOOL update_decompress_brush(wStream* s, BYTE* output, BYTE bpp) for (k = 0; k < bytesPerPixel; k++) { - output[((y * 8 + x) * bytesPerPixel) + k] = palette[(index * bytesPerPixel) + k]; + const size_t dstIndex = ((y * 8 + x) * bytesPerPixel) + k; + const size_t srcIndex = (index * bytesPerPixel) + k; + if (dstIndex >= outSize) + return FALSE; + output[dstIndex] = palette[srcIndex]; } } } - /* Skip the palette */ - Stream_Seek(s, 7 * bytesPerPixel); - return TRUE; } static BOOL update_compress_brush(wStream* s, const BYTE* input, BYTE bpp) @@ -2590,7 +2589,8 @@ static CACHE_BRUSH_ORDER* update_read_cache_brush_order(rdpUpdate* update, wStre if (compressed != FALSE) { /* compressed brush */ - if (!update_decompress_brush(s, cache_brush->data, cache_brush->bpp)) + if (!update_decompress_brush(s, cache_brush->data, sizeof(cache_brush->data), + cache_brush->bpp)) goto fail; } else diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index 341d15d44..b9c60c74e 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -385,6 +385,7 @@ BOOL rdp_read_header(rdpRdp* rdp, wStream* s, UINT16* length, UINT16* channelId) MCSPDU = (rdp->settings->ServerMode) ? DomainMCSPDU_SendDataRequest : DomainMCSPDU_SendDataIndication; + *channelId = 0; /* Initialize in case of early abort */ if (!tpkt_read_header(s, length)) return FALSE; diff --git a/libfreerdp/core/server.c b/libfreerdp/core/server.c index 4dd99035e..484ed8b96 100644 --- a/libfreerdp/core/server.c +++ b/libfreerdp/core/server.c @@ -195,7 +195,7 @@ static BOOL wts_read_drdynvc_data_first(rdpPeerChannel* channel, wStream* s, int Stream_SetPosition(channel->receiveData, 0); - if (!Stream_EnsureRemainingCapacity(channel->receiveData, (int)channel->dvc_total_length)) + if (!Stream_EnsureRemainingCapacity(channel->receiveData, channel->dvc_total_length)) return FALSE; Stream_Write(channel->receiveData, Stream_Pointer(s), length); diff --git a/libfreerdp/core/test/settings_property_lists.h b/libfreerdp/core/test/settings_property_lists.h index 85760e25a..c44018e47 100644 --- a/libfreerdp/core/test/settings_property_lists.h +++ b/libfreerdp/core/test/settings_property_lists.h @@ -3,169 +3,169 @@ #define have_bool_list_indices static const size_t bool_list_indices[] = { - FreeRDP_ServerMode, - FreeRDP_WaitForOutputBufferFlush, - FreeRDP_NetworkAutoDetect, - FreeRDP_SupportAsymetricKeys, - FreeRDP_SupportErrorInfoPdu, - FreeRDP_SupportStatusInfoPdu, - FreeRDP_SupportMonitorLayoutPdu, - FreeRDP_SupportGraphicsPipeline, - FreeRDP_SupportDynamicTimeZone, - FreeRDP_SupportHeartbeatPdu, - FreeRDP_UseRdpSecurityLayer, - FreeRDP_ConsoleSession, - FreeRDP_SpanMonitors, - FreeRDP_UseMultimon, - FreeRDP_ForceMultimon, - FreeRDP_ListMonitors, - FreeRDP_HasMonitorAttributes, - FreeRDP_SupportMultitransport, + FreeRDP_AllowCacheWaitingList, + FreeRDP_AllowDesktopComposition, + FreeRDP_AllowFontSmoothing, + FreeRDP_AllowUnanouncedOrdersFromServer, + FreeRDP_AltSecFrameMarkerSupport, + FreeRDP_AsyncChannels, + FreeRDP_AsyncInput, + FreeRDP_AsyncUpdate, + FreeRDP_AudioCapture, + FreeRDP_AudioPlayback, + FreeRDP_Authentication, + FreeRDP_AuthenticationOnly, + FreeRDP_AutoAcceptCertificate, + FreeRDP_AutoDenyCertificate, FreeRDP_AutoLogonEnabled, + FreeRDP_AutoReconnectionEnabled, + FreeRDP_BitmapCacheEnabled, + FreeRDP_BitmapCachePersistEnabled, + FreeRDP_BitmapCacheV3Enabled, + FreeRDP_BitmapCompressionDisabled, + FreeRDP_ColorPointerFlag, FreeRDP_CompressionEnabled, + FreeRDP_ConsoleSession, + FreeRDP_CredentialsFromStdin, + FreeRDP_Decorations, + FreeRDP_DesktopResize, + FreeRDP_DeviceRedirection, + FreeRDP_DisableCredentialsDelegation, FreeRDP_DisableCtrlAltDel, - FreeRDP_EnableWindowsKey, - FreeRDP_MaximizeShell, - FreeRDP_LogonNotify, - FreeRDP_LogonErrors, - FreeRDP_MouseAttached, - FreeRDP_MouseHasWheel, - FreeRDP_RemoteConsoleAudio, - FreeRDP_AudioPlayback, - FreeRDP_AudioCapture, - FreeRDP_VideoDisable, - FreeRDP_PasswordIsSmartcardPin, - FreeRDP_UsingSavedCredentials, - FreeRDP_ForceEncryptedCsPdu, - FreeRDP_HiDefRemoteApp, - FreeRDP_IPv6Enabled, - FreeRDP_AutoReconnectionEnabled, - FreeRDP_PrintReconnectCookie, - FreeRDP_DynamicDaylightTimeDisabled, - FreeRDP_AllowFontSmoothing, - FreeRDP_DisableWallpaper, + FreeRDP_DisableCursorBlinking, + FreeRDP_DisableCursorShadow, FreeRDP_DisableFullWindowDrag, FreeRDP_DisableMenuAnims, + FreeRDP_DisableRemoteAppCapsCheck, FreeRDP_DisableThemes, - FreeRDP_DisableCursorShadow, - FreeRDP_DisableCursorBlinking, - FreeRDP_AllowDesktopComposition, - FreeRDP_RemoteAssistanceMode, + FreeRDP_DisableWallpaper, + FreeRDP_DrawAllowColorSubsampling, + FreeRDP_DrawAllowDynamicColorFidelity, + FreeRDP_DrawAllowSkipAlpha, + FreeRDP_DrawGdiPlusCacheEnabled, + FreeRDP_DrawGdiPlusEnabled, + FreeRDP_DrawNineGridEnabled, + FreeRDP_DumpRemoteFx, + FreeRDP_DynamicDaylightTimeDisabled, + FreeRDP_DynamicResolutionUpdate, + FreeRDP_EmbeddedWindow, + FreeRDP_EnableWindowsKey, FreeRDP_EncomspVirtualChannel, - FreeRDP_RemdeskVirtualChannel, - FreeRDP_LyncRdpMode, - FreeRDP_RemoteAssistanceRequestControl, - FreeRDP_TlsSecurity, - FreeRDP_NlaSecurity, - FreeRDP_RdpSecurity, FreeRDP_ExtSecurity, - FreeRDP_Authentication, - FreeRDP_NegotiateSecurityLayer, - FreeRDP_RestrictedAdminModeRequired, - FreeRDP_DisableCredentialsDelegation, - FreeRDP_VmConnectMode, - FreeRDP_FIPSMode, - FreeRDP_MstscCookieMode, - FreeRDP_SendPreconnectionPdu, - FreeRDP_SmartcardLogon, - FreeRDP_PromptForCredentials, - FreeRDP_IgnoreCertificate, FreeRDP_ExternalCertificateManagement, - FreeRDP_AutoAcceptCertificate, - FreeRDP_AutoDenyCertificate, - FreeRDP_Workarea, + FreeRDP_FIPSMode, + FreeRDP_FastPathInput, + FreeRDP_FastPathOutput, + FreeRDP_ForceEncryptedCsPdu, + FreeRDP_ForceMultimon, + FreeRDP_FrameMarkerCommandEnabled, FreeRDP_Fullscreen, - FreeRDP_GrabKeyboard, - FreeRDP_Decorations, - FreeRDP_MouseMotion, - FreeRDP_AsyncInput, - FreeRDP_AsyncUpdate, - FreeRDP_AsyncChannels, - FreeRDP_ToggleFullscreen, - FreeRDP_EmbeddedWindow, - FreeRDP_SmartSizing, - FreeRDP_PercentScreenUseWidth, - FreeRDP_PercentScreenUseHeight, - FreeRDP_DynamicResolutionUpdate, - FreeRDP_SoftwareGdi, - FreeRDP_LocalConnection, - FreeRDP_AuthenticationOnly, - FreeRDP_CredentialsFromStdin, - FreeRDP_UnmapButtons, - FreeRDP_OldLicenseBehaviour, - FreeRDP_DumpRemoteFx, - FreeRDP_PlayRemoteFx, - FreeRDP_GatewayUseSameCredentials, - FreeRDP_GatewayEnabled, FreeRDP_GatewayBypassLocal, - FreeRDP_GatewayRpcTransport, + FreeRDP_GatewayEnabled, FreeRDP_GatewayHttpTransport, + FreeRDP_GatewayRpcTransport, FreeRDP_GatewayUdpTransport, - FreeRDP_RemoteApplicationMode, - FreeRDP_DisableRemoteAppCapsCheck, - FreeRDP_RemoteAppLanguageBarSupported, - FreeRDP_RefreshRect, - FreeRDP_SuppressOutput, - FreeRDP_FastPathOutput, - FreeRDP_SaltedChecksum, + FreeRDP_GatewayUseSameCredentials, + FreeRDP_GfxAVC444, + FreeRDP_GfxAVC444v2, + FreeRDP_GfxH264, + FreeRDP_GfxProgressive, + FreeRDP_GfxProgressiveV2, + FreeRDP_GfxSendQoeAck, + FreeRDP_GfxSmallCache, + FreeRDP_GfxThinClient, + FreeRDP_GrabKeyboard, + FreeRDP_HasExtendedMouseEvent, + FreeRDP_HasHorizontalWheel, + FreeRDP_HasMonitorAttributes, + FreeRDP_HiDefRemoteApp, + FreeRDP_IPv6Enabled, + FreeRDP_IgnoreCertificate, + FreeRDP_JpegCodec, + FreeRDP_ListMonitors, + FreeRDP_LocalConnection, + FreeRDP_LogonErrors, + FreeRDP_LogonNotify, FreeRDP_LongCredentialsSupported, - FreeRDP_NoBitmapCompressionHeader, - FreeRDP_BitmapCompressionDisabled, - FreeRDP_DesktopResize, - FreeRDP_DrawAllowDynamicColorFidelity, - FreeRDP_DrawAllowColorSubsampling, - FreeRDP_DrawAllowSkipAlpha, - FreeRDP_BitmapCacheV3Enabled, - FreeRDP_AltSecFrameMarkerSupport, - FreeRDP_AllowUnanouncedOrdersFromServer, - FreeRDP_BitmapCacheEnabled, - FreeRDP_AllowCacheWaitingList, - FreeRDP_BitmapCachePersistEnabled, - FreeRDP_ColorPointerFlag, - FreeRDP_UnicodeInput, - FreeRDP_FastPathInput, - FreeRDP_MultiTouchInput, + FreeRDP_LyncRdpMode, + FreeRDP_MaximizeShell, + FreeRDP_MouseAttached, + FreeRDP_MouseHasWheel, + FreeRDP_MouseMotion, + FreeRDP_MstscCookieMode, FreeRDP_MultiTouchGestures, - FreeRDP_HasHorizontalWheel, - FreeRDP_HasExtendedMouseEvent, - FreeRDP_SoundBeepsEnabled, - FreeRDP_SurfaceCommandsEnabled, - FreeRDP_FrameMarkerCommandEnabled, - FreeRDP_SurfaceFrameMarkerEnabled, - FreeRDP_RemoteFxOnly, - FreeRDP_RemoteFxCodec, - FreeRDP_RemoteFxImageCodec, + FreeRDP_MultiTouchInput, FreeRDP_NSCodec, - FreeRDP_NSCodecAllowSubsampling, FreeRDP_NSCodecAllowDynamicColorFidelity, - FreeRDP_JpegCodec, - FreeRDP_GfxThinClient, - FreeRDP_GfxSmallCache, - FreeRDP_GfxProgressive, - FreeRDP_GfxProgressiveV2, - FreeRDP_GfxH264, - FreeRDP_GfxAVC444, - FreeRDP_GfxSendQoeAck, - FreeRDP_GfxAVC444v2, - FreeRDP_DrawNineGridEnabled, - FreeRDP_DrawGdiPlusEnabled, - FreeRDP_DrawGdiPlusCacheEnabled, - FreeRDP_DeviceRedirection, + FreeRDP_NSCodecAllowSubsampling, + FreeRDP_NegotiateSecurityLayer, + FreeRDP_NetworkAutoDetect, + FreeRDP_NlaSecurity, + FreeRDP_NoBitmapCompressionHeader, + FreeRDP_OldLicenseBehaviour, + FreeRDP_PasswordIsSmartcardPin, + FreeRDP_PercentScreenUseHeight, + FreeRDP_PercentScreenUseWidth, + FreeRDP_PlayRemoteFx, + FreeRDP_PreferIPv6OverIPv4, + FreeRDP_PrintReconnectCookie, + FreeRDP_PromptForCredentials, + FreeRDP_RdpSecurity, + FreeRDP_RedirectClipboard, FreeRDP_RedirectDrives, FreeRDP_RedirectHomeDrive, - FreeRDP_RedirectSmartCards, + FreeRDP_RedirectParallelPorts, FreeRDP_RedirectPrinters, FreeRDP_RedirectSerialPorts, - FreeRDP_RedirectParallelPorts, - FreeRDP_PreferIPv6OverIPv4, - FreeRDP_RedirectClipboard, + FreeRDP_RedirectSmartCards, + FreeRDP_RefreshRect, + FreeRDP_RemdeskVirtualChannel, + FreeRDP_RemoteAppLanguageBarSupported, + FreeRDP_RemoteApplicationMode, + FreeRDP_RemoteAssistanceMode, + FreeRDP_RemoteAssistanceRequestControl, + FreeRDP_RemoteConsoleAudio, + FreeRDP_RemoteFxCodec, + FreeRDP_RemoteFxImageCodec, + FreeRDP_RemoteFxOnly, + FreeRDP_RestrictedAdminModeRequired, + FreeRDP_SaltedChecksum, + FreeRDP_SendPreconnectionPdu, + FreeRDP_ServerMode, + FreeRDP_SmartSizing, + FreeRDP_SmartcardLogon, + FreeRDP_SoftwareGdi, + FreeRDP_SoundBeepsEnabled, + FreeRDP_SpanMonitors, + FreeRDP_SupportAsymetricKeys, + FreeRDP_SupportDisplayControl, FreeRDP_SupportDynamicChannels, + FreeRDP_SupportDynamicTimeZone, FreeRDP_SupportEchoChannel, - FreeRDP_SupportDisplayControl, + FreeRDP_SupportErrorInfoPdu, FreeRDP_SupportGeometryTracking, + FreeRDP_SupportGraphicsPipeline, + FreeRDP_SupportHeartbeatPdu, + FreeRDP_SupportMonitorLayoutPdu, + FreeRDP_SupportMultitransport, FreeRDP_SupportSSHAgentChannel, + FreeRDP_SupportStatusInfoPdu, FreeRDP_SupportVideoOptimized, + FreeRDP_SuppressOutput, + FreeRDP_SurfaceCommandsEnabled, + FreeRDP_SurfaceFrameMarkerEnabled, FreeRDP_TcpKeepAlive, + FreeRDP_TlsSecurity, + FreeRDP_ToggleFullscreen, + FreeRDP_UnicodeInput, + FreeRDP_UnmapButtons, + FreeRDP_UseMultimon, + FreeRDP_UseRdpSecurityLayer, + FreeRDP_UsingSavedCredentials, + FreeRDP_VideoDisable, + FreeRDP_VmConnectMode, + FreeRDP_WaitForOutputBufferFlush, + FreeRDP_Workarea, }; #define have_uint16_list_indices @@ -176,117 +176,117 @@ static const size_t uint16_list_indices[] = { #define have_uint32_list_indices static const size_t uint32_list_indices[] = { - FreeRDP_ShareId, - FreeRDP_PduSource, - FreeRDP_ServerPort, - FreeRDP_MaxTimeInCheckLoop, FreeRDP_AcceptedCertLength, - FreeRDP_RdpVersion, - FreeRDP_DesktopWidth, - FreeRDP_DesktopHeight, + FreeRDP_AuthenticationLevel, + FreeRDP_AutoReconnectMaxRetries, + FreeRDP_BitmapCacheV2NumCells, + FreeRDP_BitmapCacheV3CodecId, + FreeRDP_BitmapCacheVersion, + FreeRDP_BrushSupportLevel, + FreeRDP_ChannelCount, + FreeRDP_ChannelDefArraySize, + FreeRDP_ClientBuild, + FreeRDP_ClientRandomLength, + FreeRDP_ClusterInfoFlags, FreeRDP_ColorDepth, + FreeRDP_CompDeskSupportLevel, + FreeRDP_CompressionLevel, FreeRDP_ConnectionType, - FreeRDP_ClientBuild, - FreeRDP_EarlyCapabilityFlags, - FreeRDP_DesktopPhysicalWidth, + FreeRDP_CookieMaxLength, + FreeRDP_DesktopHeight, FreeRDP_DesktopPhysicalHeight, + FreeRDP_DesktopPhysicalWidth, + FreeRDP_DesktopPosX, + FreeRDP_DesktopPosY, FreeRDP_DesktopScaleFactor, + FreeRDP_DesktopWidth, + FreeRDP_DeviceArraySize, + FreeRDP_DeviceCount, FreeRDP_DeviceScaleFactor, + FreeRDP_DrawNineGridCacheEntries, + FreeRDP_DrawNineGridCacheSize, + FreeRDP_DynamicChannelArraySize, + FreeRDP_DynamicChannelCount, + FreeRDP_EarlyCapabilityFlags, + FreeRDP_EncryptionLevel, FreeRDP_EncryptionMethods, FreeRDP_ExtEncryptionMethods, - FreeRDP_EncryptionLevel, - FreeRDP_ServerRandomLength, - FreeRDP_ServerCertificateLength, - FreeRDP_ClientRandomLength, - FreeRDP_ChannelCount, - FreeRDP_ChannelDefArraySize, - FreeRDP_ClusterInfoFlags, - FreeRDP_RedirectedSessionId, + FreeRDP_FrameAcknowledge, + FreeRDP_GatewayAcceptedCertLength, + FreeRDP_GatewayCredentialsSource, + FreeRDP_GatewayPort, + FreeRDP_GatewayUsageMethod, + FreeRDP_GfxCapsFilter, + FreeRDP_GlyphSupportLevel, + FreeRDP_JpegCodecId, + FreeRDP_JpegQuality, + FreeRDP_KeyboardCodePage, + FreeRDP_KeyboardFunctionKey, + FreeRDP_KeyboardHook, + FreeRDP_KeyboardLayout, + FreeRDP_KeyboardSubType, + FreeRDP_KeyboardType, + FreeRDP_LargePointerFlag, + FreeRDP_LoadBalanceInfoLength, + FreeRDP_MaxTimeInCheckLoop, FreeRDP_MonitorCount, FreeRDP_MonitorDefArraySize, - FreeRDP_DesktopPosX, - FreeRDP_DesktopPosY, - FreeRDP_NumMonitorIds, FreeRDP_MonitorLocalShiftX, FreeRDP_MonitorLocalShiftY, + FreeRDP_MultifragMaxRequestSize, FreeRDP_MultitransportFlags, - FreeRDP_CompressionLevel, - FreeRDP_AutoReconnectMaxRetries, - FreeRDP_PerformanceFlags, - FreeRDP_RequestedProtocols, - FreeRDP_SelectedProtocol, + FreeRDP_NSCodecColorLossLevel, + FreeRDP_NSCodecId, FreeRDP_NegotiationFlags, - FreeRDP_AuthenticationLevel, - FreeRDP_TlsSecLevel, - FreeRDP_CookieMaxLength, + FreeRDP_NumMonitorIds, + FreeRDP_OffscreenCacheEntries, + FreeRDP_OffscreenCacheSize, + FreeRDP_OffscreenSupportLevel, + FreeRDP_OsMajorType, + FreeRDP_OsMinorType, + FreeRDP_Password51Length, + FreeRDP_PduSource, + FreeRDP_PercentScreen, + FreeRDP_PerformanceFlags, + FreeRDP_PointerCacheSize, FreeRDP_PreconnectionId, + FreeRDP_ProxyType, + FreeRDP_RdpVersion, + FreeRDP_ReceivedCapabilitiesSize, + FreeRDP_RedirectedSessionId, + FreeRDP_RedirectionAcceptedCertLength, FreeRDP_RedirectionFlags, - FreeRDP_LoadBalanceInfoLength, FreeRDP_RedirectionPasswordLength, - FreeRDP_RedirectionTsvUrlLength, - FreeRDP_TargetNetAddressCount, - FreeRDP_RedirectionAcceptedCertLength, FreeRDP_RedirectionPreferType, - FreeRDP_Password51Length, - FreeRDP_PercentScreen, - FreeRDP_SmartSizingWidth, - FreeRDP_SmartSizingHeight, - FreeRDP_GatewayUsageMethod, - FreeRDP_GatewayPort, - FreeRDP_GatewayCredentialsSource, - FreeRDP_GatewayAcceptedCertLength, - FreeRDP_ProxyType, + FreeRDP_RedirectionTsvUrlLength, + FreeRDP_RemoteAppNumIconCacheEntries, + FreeRDP_RemoteAppNumIconCaches, FreeRDP_RemoteApplicationExpandCmdLine, FreeRDP_RemoteApplicationExpandWorkingDir, - FreeRDP_RemoteAppNumIconCaches, - FreeRDP_RemoteAppNumIconCacheEntries, - FreeRDP_RemoteWndSupportLevel, FreeRDP_RemoteApplicationSupportLevel, FreeRDP_RemoteApplicationSupportMask, - FreeRDP_ReceivedCapabilitiesSize, - FreeRDP_OsMajorType, - FreeRDP_OsMinorType, - FreeRDP_BitmapCacheVersion, - FreeRDP_BitmapCacheV2NumCells, - FreeRDP_PointerCacheSize, - FreeRDP_KeyboardCodePage, - FreeRDP_KeyboardLayout, - FreeRDP_KeyboardType, - FreeRDP_KeyboardSubType, - FreeRDP_KeyboardFunctionKey, - FreeRDP_KeyboardHook, - FreeRDP_BrushSupportLevel, - FreeRDP_GlyphSupportLevel, - FreeRDP_OffscreenSupportLevel, - FreeRDP_OffscreenCacheSize, - FreeRDP_OffscreenCacheEntries, - FreeRDP_VirtualChannelCompressionFlags, - FreeRDP_VirtualChannelChunkSize, - FreeRDP_MultifragMaxRequestSize, - FreeRDP_LargePointerFlag, - FreeRDP_CompDeskSupportLevel, + FreeRDP_RemoteFxCaptureFlags, FreeRDP_RemoteFxCodecId, FreeRDP_RemoteFxCodecMode, - FreeRDP_RemoteFxCaptureFlags, - FreeRDP_NSCodecId, - FreeRDP_FrameAcknowledge, - FreeRDP_NSCodecColorLossLevel, - FreeRDP_JpegCodecId, - FreeRDP_JpegQuality, - FreeRDP_GfxCapsFilter, - FreeRDP_BitmapCacheV3CodecId, - FreeRDP_DrawNineGridCacheSize, - FreeRDP_DrawNineGridCacheEntries, - FreeRDP_DeviceCount, - FreeRDP_DeviceArraySize, - FreeRDP_StaticChannelCount, + FreeRDP_RemoteWndSupportLevel, + FreeRDP_RequestedProtocols, + FreeRDP_SelectedProtocol, + FreeRDP_ServerCertificateLength, + FreeRDP_ServerPort, + FreeRDP_ServerRandomLength, + FreeRDP_ShareId, + FreeRDP_SmartSizingHeight, + FreeRDP_SmartSizingWidth, FreeRDP_StaticChannelArraySize, - FreeRDP_DynamicChannelCount, - FreeRDP_DynamicChannelArraySize, - FreeRDP_TcpKeepAliveRetries, + FreeRDP_StaticChannelCount, + FreeRDP_TargetNetAddressCount, + FreeRDP_TcpAckTimeout, FreeRDP_TcpKeepAliveDelay, FreeRDP_TcpKeepAliveInterval, - FreeRDP_TcpAckTimeout, + FreeRDP_TcpKeepAliveRetries, + FreeRDP_TlsSecLevel, + FreeRDP_VirtualChannelChunkSize, + FreeRDP_VirtualChannelCompressionFlags, }; #define have_int32_list_indices @@ -302,102 +302,102 @@ static const size_t uint64_list_indices[] = { #define have_string_list_indices static const size_t string_list_indices[] = { - FreeRDP_ServerHostname, - FreeRDP_Username, - FreeRDP_Password, - FreeRDP_Domain, - FreeRDP_PasswordHash, FreeRDP_AcceptedCert, - FreeRDP_ClientHostname, - FreeRDP_ClientProductId, + FreeRDP_AllowedTlsCiphers, FreeRDP_AlternateShell, - FreeRDP_ShellWorkingDirectory, - FreeRDP_ClientAddress, - FreeRDP_ClientDir, - FreeRDP_DynamicDSTTimeZoneKeyName, - FreeRDP_RemoteAssistanceSessionId, - FreeRDP_RemoteAssistancePassStub, - FreeRDP_RemoteAssistancePassword, - FreeRDP_RemoteAssistanceRCTicket, + FreeRDP_AssistanceFile, FreeRDP_AuthenticationServiceClass, - FreeRDP_AllowedTlsCiphers, - FreeRDP_NtlmSamFile, - FreeRDP_PreconnectionBlob, - FreeRDP_TargetNetAddress, - FreeRDP_RedirectionUsername, - FreeRDP_RedirectionDomain, - FreeRDP_RedirectionTargetFQDN, - FreeRDP_RedirectionTargetNetBiosName, - FreeRDP_RedirectionAcceptedCert, - FreeRDP_KerberosKdc, - FreeRDP_KerberosRealm, - FreeRDP_CertificateName, - FreeRDP_CertificateFile, - FreeRDP_PrivateKeyFile, - FreeRDP_RdpKeyFile, - FreeRDP_CertificateContent, - FreeRDP_PrivateKeyContent, - FreeRDP_RdpKeyContent, FreeRDP_CertificateAcceptedFingerprints, - FreeRDP_WindowTitle, - FreeRDP_WmClass, + FreeRDP_CertificateContent, + FreeRDP_CertificateFile, + FreeRDP_CertificateName, + FreeRDP_ClientAddress, + FreeRDP_ClientDir, + FreeRDP_ClientHostname, + FreeRDP_ClientProductId, FreeRDP_ComputerName, - FreeRDP_ConnectionFile, - FreeRDP_AssistanceFile, - FreeRDP_HomePath, FreeRDP_ConfigPath, + FreeRDP_ConnectionFile, FreeRDP_CurrentPath, + FreeRDP_Domain, + FreeRDP_DrivesToRedirect, FreeRDP_DumpRemoteFxFile, - FreeRDP_PlayRemoteFxFile, + FreeRDP_DynamicDSTTimeZoneKeyName, + FreeRDP_GatewayAcceptedCert, + FreeRDP_GatewayAccessToken, + FreeRDP_GatewayDomain, FreeRDP_GatewayHostname, - FreeRDP_GatewayUsername, FreeRDP_GatewayPassword, - FreeRDP_GatewayDomain, - FreeRDP_GatewayAccessToken, - FreeRDP_GatewayAcceptedCert, + FreeRDP_GatewayUsername, + FreeRDP_HomePath, + FreeRDP_ImeFileName, + FreeRDP_KerberosKdc, + FreeRDP_KerberosRealm, + FreeRDP_NtlmSamFile, + FreeRDP_Password, + FreeRDP_PasswordHash, + FreeRDP_PlayRemoteFxFile, + FreeRDP_PreconnectionBlob, + FreeRDP_PrivateKeyContent, + FreeRDP_PrivateKeyFile, FreeRDP_ProxyHostname, - FreeRDP_ProxyUsername, FreeRDP_ProxyPassword, - FreeRDP_RemoteApplicationName, - FreeRDP_RemoteApplicationIcon, - FreeRDP_RemoteApplicationProgram, + FreeRDP_ProxyUsername, + FreeRDP_RDP2TCPArgs, + FreeRDP_RdpKeyContent, + FreeRDP_RdpKeyFile, + FreeRDP_RedirectionAcceptedCert, + FreeRDP_RedirectionDomain, + FreeRDP_RedirectionTargetFQDN, + FreeRDP_RedirectionTargetNetBiosName, + FreeRDP_RedirectionUsername, + FreeRDP_RemoteApplicationCmdLine, FreeRDP_RemoteApplicationFile, FreeRDP_RemoteApplicationGuid, - FreeRDP_RemoteApplicationCmdLine, + FreeRDP_RemoteApplicationIcon, + FreeRDP_RemoteApplicationName, + FreeRDP_RemoteApplicationProgram, FreeRDP_RemoteApplicationWorkingDir, - FreeRDP_ImeFileName, - FreeRDP_DrivesToRedirect, - FreeRDP_RDP2TCPArgs, + FreeRDP_RemoteAssistancePassStub, + FreeRDP_RemoteAssistancePassword, + FreeRDP_RemoteAssistanceRCTicket, + FreeRDP_RemoteAssistanceSessionId, + FreeRDP_ServerHostname, + FreeRDP_ShellWorkingDirectory, + FreeRDP_TargetNetAddress, + FreeRDP_Username, + FreeRDP_WindowTitle, + FreeRDP_WmClass, }; #define have_pointer_list_indices static const size_t pointer_list_indices[] = { - FreeRDP_StaticChannelArray, - FreeRDP_DynamicChannelArray, - FreeRDP_instance, - FreeRDP_RdpServerCertificate, - FreeRDP_MonitorIds, - FreeRDP_TargetNetPorts, - FreeRDP_DeviceArray, - FreeRDP_ClientAutoReconnectCookie, - FreeRDP_TargetNetAddresses, - FreeRDP_MonitorDefArray, FreeRDP_BitmapCacheV2CellInfo, - FreeRDP_ServerAutoReconnectCookie, - FreeRDP_ServerRandom, - FreeRDP_ServerCertificate, + FreeRDP_ChannelDefArray, + FreeRDP_ClientAutoReconnectCookie, FreeRDP_ClientRandom, + FreeRDP_ClientTimeZone, + FreeRDP_DeviceArray, + FreeRDP_DynamicChannelArray, + FreeRDP_FragCache, + FreeRDP_GlyphCache, FreeRDP_LoadBalanceInfo, - FreeRDP_RedirectionPassword, - FreeRDP_RedirectionTsvUrl, - FreeRDP_Password51, - FreeRDP_ReceivedCapabilities, + FreeRDP_MonitorDefArray, + FreeRDP_MonitorIds, FreeRDP_OrderSupport, + FreeRDP_Password51, + FreeRDP_RdpServerCertificate, FreeRDP_RdpServerRsaKey, - FreeRDP_GlyphCache, - FreeRDP_FragCache, - FreeRDP_ClientTimeZone, - FreeRDP_ChannelDefArray, + FreeRDP_ReceivedCapabilities, + FreeRDP_RedirectionPassword, + FreeRDP_RedirectionTsvUrl, + FreeRDP_ServerAutoReconnectCookie, + FreeRDP_ServerCertificate, + FreeRDP_ServerRandom, + FreeRDP_StaticChannelArray, + FreeRDP_TargetNetAddresses, + FreeRDP_TargetNetPorts, + FreeRDP_instance, }; #endif /* TEST_SETTINGS_PROPERTY_LISTS */ diff --git a/libfreerdp/core/update.c b/libfreerdp/core/update.c index 47e2a949e..aac58819f 100644 --- a/libfreerdp/core/update.c +++ b/libfreerdp/core/update.c @@ -774,7 +774,7 @@ BOOL update_recv(rdpUpdate* update, wStream* s) } Stream_Read_UINT16(s, updateType); /* updateType (2 bytes) */ - WLog_Print(update->log, WLOG_TRACE, "%s Update Data PDU", UPDATE_TYPE_STRINGS[updateType]); + WLog_Print(update->log, WLOG_TRACE, "%s Update Data PDU", update_type_to_string(updateType)); if (!update_begin_paint(update)) goto fail; diff --git a/libfreerdp/crypto/crypto.c b/libfreerdp/crypto/crypto.c index 280816698..0920e356e 100644 --- a/libfreerdp/crypto/crypto.c +++ b/libfreerdp/crypto/crypto.c @@ -841,7 +841,7 @@ BOOL x509_verify_certificate(CryptoCert cert, const char* certificate_store_path if (!X509_STORE_CTX_init(csc, cert_ctx, cert->px509, cert->px509chain)) goto end; - X509_STORE_CTX_set_purpose(csc, X509_PURPOSE_SSL_SERVER); + X509_STORE_CTX_set_purpose(csc, X509_PURPOSE_ANY); X509_STORE_CTX_set_verify_cb(csc, verify_cb); if (X509_verify_cert(csc) == 1) diff --git a/scripts/update-settings-tests b/scripts/update-settings-tests index 79368dc23..25f15714b 100755 --- a/scripts/update-settings-tests +++ b/scripts/update-settings-tests @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import os import sys @@ -12,6 +12,8 @@ def get_values(entry_dict, entry_type): elif entry_type in dict(entry_dict): values = entry_dict[entry_type] entry_dict.pop(entry_type, None) + if values: + return sorted(values) return values def write_entry(f, entry_dict, entry_type, entry_name): @@ -28,6 +30,74 @@ def write_entry(f, entry_dict, entry_type, entry_name): f.write('};\n\n') +def write_str_case(f, entry_type, val): + f.write('\t\t{FreeRDP_' + val + ', ' + str(entry_type) + ', "FreeRDP_' + val + '"},\n') + +def write_str(f, entry_dict): + f.write('struct settings_str_entry {\n') + f.write('\tsize_t id;\n') + f.write('\tsize_t type;\n') + f.write('\tconst char* str;\n') + f.write('};\n') + f.write('static const struct settings_str_entry settings_map[] =\n') + f.write('{\n') + + entry_types = ['BOOL', 'UINT16', 'INT16', 'UINT32', 'INT32', 'UINT64', 'INT64', 'char*', '*'] + for entry_type in entry_types: + values = get_values(entry_dict, entry_type) + if values: + for val in values: + write_str_case(f, entry_types.index(entry_type), val) + f.write('};\n\n') + f.write('SSIZE_T freerdp_settings_get_key_for_name(const char* value)\n') + f.write('{\n') + f.write('\tsize_t x;\n') + f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n') + f.write('\t{\n') + f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n') + f.write('\t\tif (strcmp(value, cur->str) == 0)\n') + f.write('\t\t\treturn cur->id;\n') + f.write('\t}\n') + f.write('\treturn -1;\n') + f.write('}\n') + f.write('\n') + f.write('SSIZE_T freerdp_settings_get_type_for_name(const char* value)\n') + f.write('{\n') + f.write('\tsize_t x;\n') + f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n') + f.write('\t{\n') + f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n') + f.write('\t\tif (strcmp(value, cur->str) == 0)\n') + f.write('\t\t\treturn cur->type;\n') + f.write('\t}\n') + f.write('\treturn -1;\n') + f.write('}\n') + f.write('\n') + f.write('SSIZE_T freerdp_settings_get_type_for_key(size_t key)\n') + f.write('{\n') + f.write('\tsize_t x;\n') + f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n') + f.write('\t{\n') + f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n') + f.write('\t\tif (cur->id == key)\n') + f.write('\t\t\treturn cur->type;\n') + f.write('\t}\n') + f.write('\treturn -1;\n') + f.write('}\n') + f.write('\n') + f.write('const char* freerdp_settings_get_name_for_key(size_t key)\n') + f.write('{\n') + f.write('\tsize_t x;\n') + f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n') + f.write('\t{\n') + f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n') + f.write('\t\tif (cur->id == key)\n') + f.write('\t\t\treturn cur->str;\n') + f.write('\t}\n') + f.write('\treturn NULL;\n') + f.write('}\n') + f.write('\n') + def write_getter_case(f, val): f.write('\t\tcase FreeRDP_' + val + ':\n') f.write('\t\t\treturn settings->' + val + ';\n\n') @@ -164,6 +234,17 @@ try: f.write('\n') + with open(name + '/../libfreerdp/common/settings_str.c', 'w+') as f: + f.write('/* Generated by ' + '' + ' */\n\n') + f.write('#include <freerdp/settings.h>\n') + f.write('#include <freerdp/log.h>\n\n') + f.write('#define TAG FREERDP_TAG("common.settings")\n\n') + + getter_list = dict(type_list) + write_str(f, getter_list) + f.write('\n') + + with open(name + '/../libfreerdp/core/test/settings_property_lists.h', 'w+') as f: f.write('#ifndef TEST_SETTINGS_PROPERTY_LISTS\n') f.write('#define TEST_SETTINGS_PROPERTY_LISTS\n\n') diff --git a/server/proxy/pf_cliprdr.c b/server/proxy/pf_cliprdr.c index d5954ca5e..b4904199d 100644 --- a/server/proxy/pf_cliprdr.c +++ b/server/proxy/pf_cliprdr.c @@ -294,7 +294,7 @@ static UINT pf_cliprdr_ServerFormatList(CliprdrClientContext* context, if (pdata->config->TextOnly) { - CLIPRDR_FORMAT_LIST list; + CLIPRDR_FORMAT_LIST list = { 0 }; pf_cliprdr_create_text_only_format_list(&list); return server->ServerFormatList(server, &list); } diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index 3dded0166..f32f64976 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -128,6 +128,7 @@ static INLINE void shadow_client_free_queued_message(void* obj) static BOOL shadow_client_context_new(freerdp_peer* peer, rdpShadowClient* client) { + const char bind_address[] = "bind-address,"; rdpSettings* settings; rdpShadowServer* server; const wObject cb = { NULL, NULL, NULL, shadow_client_free_queued_message, NULL }; @@ -157,7 +158,8 @@ static BOOL shadow_client_context_new(freerdp_peer* peer, rdpShadowClient* clien if (!(settings->RdpKeyFile = _strdup(settings->PrivateKeyFile))) goto fail_rdpkey_file; - if (server->ipcSocket) + if (server->ipcSocket && (strncmp(bind_address, server->ipcSocket, + strnlen(bind_address, sizeof(bind_address))) != 0)) { settings->LyncRdpMode = TRUE; settings->CompressionEnabled = FALSE; diff --git a/server/shadow/shadow_server.c b/server/shadow/shadow_server.c index d7a7536a6..30a63c9fa 100644 --- a/server/shadow/shadow_server.c +++ b/server/shadow/shadow_server.c @@ -45,10 +45,16 @@ #define TAG SERVER_TAG("shadow") +static const char bind_address[] = "bind-address,"; + static const COMMAND_LINE_ARGUMENT_A shadow_args[] = { { "port", COMMAND_LINE_VALUE_REQUIRED, "<number>", NULL, NULL, -1, NULL, "Server port" }, { "ipc-socket", COMMAND_LINE_VALUE_REQUIRED, "<ipc-socket>", NULL, NULL, -1, NULL, "Server IPC socket" }, + { "bind-address", COMMAND_LINE_VALUE_REQUIRED, "<bind-address>[,<another address>, ...]", NULL, + NULL, -1, NULL, + "An address to bind to. Use '[<ipv6>]' for IPv6 addresses, e.g. '[::1]' for " + "localhost" }, { "monitors", COMMAND_LINE_VALUE_OPTIONAL, "<0,1,2...>", NULL, NULL, -1, NULL, "Select or list monitors" }, { "rect", COMMAND_LINE_VALUE_REQUIRED, "<x,y,w,h>", NULL, NULL, -1, NULL, @@ -220,11 +226,31 @@ int shadow_server_parse_command_line(rdpShadowServer* server, int argc, char** a } CommandLineSwitchCase(arg, "ipc-socket") { + /* /bind-address is incompatible */ + if (server->ipcSocket) + return -1; + server->ipcSocket = _strdup(arg->Value); if (!server->ipcSocket) return -1; } + CommandLineSwitchCase(arg, "bind-address") + { + int rc; + size_t len = strlen(arg->Value) + sizeof(bind_address); + /* /ipc-socket is incompatible */ + if (server->ipcSocket) + return -1; + server->ipcSocket = calloc(len, sizeof(CHAR)); + + if (!server->ipcSocket) + return -1; + + rc = _snprintf(server->ipcSocket, len, "%s%s", bind_address, arg->Value); + if ((rc < 0) || ((size_t)rc != len - 1)) + return -1; + } CommandLineSwitchCase(arg, "may-view") { server->mayView = arg->Value ? TRUE : FALSE; @@ -480,8 +506,44 @@ static DWORD WINAPI shadow_server_thread(LPVOID arg) return 0; } +static BOOL open_port(rdpShadowServer* server, char* address) +{ + BOOL status; + char* modaddr = address; + + if (modaddr) + { + if (modaddr[0] == '[') + { + char* end = strchr(address, ']'); + if (!end) + { + WLog_ERR(TAG, "Could not parse bind-address %s", address); + return -1; + } + *end++ = '\0'; + if (strlen(end) > 0) + { + WLog_ERR(TAG, "Excess data after IPv6 address: '%s'", end); + return -1; + } + modaddr++; + } + } + status = server->listener->Open(server->listener, modaddr, (UINT16)server->port); + + if (!status) + { + WLog_ERR(TAG, + "Problem creating TCP listener. (Port already used or insufficient permissions?)"); + } + + return status; +} + int shadow_server_start(rdpShadowServer* server) { + BOOL ipc; BOOL status; WSADATA wsaData; @@ -510,16 +572,50 @@ int shadow_server_start(rdpShadowServer* server) return -1; } - if (!server->ipcSocket) - status = server->listener->Open(server->listener, NULL, (UINT16)server->port); - else - status = server->listener->OpenLocal(server->listener, server->ipcSocket); + /* Bind magic: + * + * emtpy ... bind TCP all + * <local path> ... bind local (IPC) + * bind-socket,<address> ... bind TCP to specified interface + */ + ipc = server->ipcSocket && (strncmp(bind_address, server->ipcSocket, + strnlen(bind_address, sizeof(bind_address))) != 0); + if (!ipc) + { + size_t x, count; + char** list = CommandLineParseCommaSeparatedValuesEx(NULL, server->ipcSocket, &count); + if (!list || (count <= 1)) + { + free(list); + if (server->ipcSocket == NULL) + { + if (!open_port(server, NULL)) + return -1; + } + else + return -1; + } - if (!status) + for (x = 1; x < count; x++) + { + BOOL success = open_port(server, list[x]); + if (!success) + { + free(list); + return -1; + } + } + free(list); + } + else { - WLog_ERR(TAG, - "Problem creating listener. (Port already used or insufficient permissions?)"); - return -1; + status = server->listener->OpenLocal(server->listener, server->ipcSocket); + if (!status) + { + WLog_ERR(TAG, "Problem creating local socket listener. (Port already used or " + "insufficient permissions?)"); + return -1; + } } if (!(server->thread = CreateThread(NULL, 0, shadow_server_thread, (void*)server, 0, NULL))) diff --git a/uwac/CMakeLists.txt b/uwac/CMakeLists.txt index c75d0448d..8ebd4952f 100644 --- a/uwac/CMakeLists.txt +++ b/uwac/CMakeLists.txt @@ -17,7 +17,7 @@ # Soname versioning set(UWAC_VERSION_MAJOR "0") -set(UWAC_VERSION_MINOR "0") +set(UWAC_VERSION_MINOR "1") set(UWAC_VERSION_REVISION "1") set(UWAC_VERSION "${UWAC_VERSION_MAJOR}.${UWAC_VERSION_MINOR}.${UWAC_VERSION_REVISION}") set(UWAC_VERSION_FULL "${UWAC_VERSION}") diff --git a/uwac/libuwac/uwac-display.c b/uwac/libuwac/uwac-display.c index 379a549e4..277f1ece7 100644 --- a/uwac/libuwac/uwac-display.c +++ b/uwac/libuwac/uwac-display.c @@ -668,12 +668,16 @@ uint32_t UwacDisplayGetNbOutputs(const UwacDisplay* display) const UwacOutput* UwacDisplayGetOutput(UwacDisplay* display, int index) { - int i; + int i, display_count; UwacOutput* ret = NULL; if (!display) return NULL; + display_count = wl_list_length(&display->outputs); + if (display_count <= index) + return NULL; + i = 0; wl_list_for_each(ret, &display->outputs, link) { @@ -694,6 +698,9 @@ const UwacOutput* UwacDisplayGetOutput(UwacDisplay* display, int index) UwacReturnCode UwacOutputGetResolution(const UwacOutput* output, UwacSize* resolution) { + if ((output->resolution.height <= 0) || (output->resolution.width <= 0)) + return UWAC_ERROR_INTERNAL; + *resolution = output->resolution; return UWAC_SUCCESS; } diff --git a/uwac/libuwac/uwac-input.c b/uwac/libuwac/uwac-input.c index c2df7aa7c..005eff862 100644 --- a/uwac/libuwac/uwac-input.c +++ b/uwac/libuwac/uwac-input.c @@ -26,6 +26,7 @@ #include <stdlib.h> #include <string.h> #include <assert.h> +#include <errno.h> #include <time.h> #include <unistd.h> #include <sys/mman.h> @@ -69,6 +70,10 @@ static struct wl_buffer* create_pointer_buffer(UwacSeat* seat, const void* src, seat->pointer_image->width * 4, WL_SHM_FORMAT_ARGB8888); wl_shm_pool_destroy(pool); + if (munmap(data, size) < 0) + fprintf(stderr, "%s: munmap(%p, %" PRIuz ") failed with [%d] %s\n", __FUNCTION__, data, + size, errno, strerror(errno)); + error_mmap: close(fd); return buffer; diff --git a/uwac/libuwac/uwac-priv.h b/uwac/libuwac/uwac-priv.h index ccf237f37..75ad6e0fe 100644 --- a/uwac/libuwac/uwac-priv.h +++ b/uwac/libuwac/uwac-priv.h @@ -218,6 +218,7 @@ struct uwac_buffer #endif struct wl_buffer* wayland_buffer; void* data; + size_t size; }; typedef struct uwac_buffer UwacBuffer; diff --git a/uwac/libuwac/uwac-window.c b/uwac/libuwac/uwac-window.c index 28c2fd4c1..f76d43bcc 100644 --- a/uwac/libuwac/uwac-window.c +++ b/uwac/libuwac/uwac-window.c @@ -65,6 +65,7 @@ static void UwacWindowDestroyBuffers(UwacWindow* w) region16_uninit(&buffer->damage); #endif wl_buffer_destroy(buffer->wayland_buffer); + munmap(buffer->data, buffer->size); } w->nbuffers = 0; @@ -306,11 +307,15 @@ int UwacWindowShmAllocBuffers(UwacWindow* w, int nbuffers, int allocSize, uint32 int i, fd; void* data; struct wl_shm_pool* pool; + size_t pagesize = sysconf(_SC_PAGESIZE); newBuffers = xrealloc(w->buffers, (w->nbuffers + nbuffers) * sizeof(UwacBuffer)); if (!newBuffers) return UWAC_ERROR_NOMEMORY; + /* round up to a multiple of PAGESIZE to page align data for each buffer */ + allocSize = (allocSize + pagesize - 1) & ~(pagesize - 1); + w->buffers = newBuffers; memset(w->buffers + w->nbuffers, 0, sizeof(UwacBuffer) * nbuffers); fd = uwac_create_anonymous_file(allocSize * nbuffers); @@ -346,6 +351,7 @@ int UwacWindowShmAllocBuffers(UwacWindow* w, int nbuffers, int allocSize, uint32 region16_init(&buffer->damage); #endif buffer->data = data + (allocSize * i); + buffer->size = allocSize; buffer->wayland_buffer = wl_shm_pool_create_buffer(pool, allocSize * i, width, height, w->stride, format); wl_buffer_add_listener(buffer->wayland_buffer, &buffer_listener, buffer); diff --git a/winpr/CMakeLists.txt b/winpr/CMakeLists.txt index ada0cde69..650c5910b 100644 --- a/winpr/CMakeLists.txt +++ b/winpr/CMakeLists.txt @@ -51,7 +51,7 @@ if (NOT WIN32) endif() # Soname versioning -set(RAW_VERSION_STRING "2.1.0-dev") +set(RAW_VERSION_STRING "2.1.0") if(EXISTS "${CMAKE_SOURCE_DIR}/.source_tag") file(READ ${CMAKE_SOURCE_DIR}/.source_tag RAW_VERSION_STRING) elseif(USE_VERSION_FROM_GIT_TAG) diff --git a/winpr/libwinpr/crt/unicode.c b/winpr/libwinpr/crt/unicode.c index e4f7ae66d..136df98c8 100644 --- a/winpr/libwinpr/crt/unicode.c +++ b/winpr/libwinpr/crt/unicode.c @@ -403,13 +403,12 @@ int ConvertToUnicode(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cb cchWideChar = MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, NULL, 0); allocate = TRUE; } + else if (!(*lpWideCharStr)) + allocate = TRUE; if (cchWideChar < 1) return 0; - if (!(*lpWideCharStr)) - allocate = TRUE; - if (allocate) { *lpWideCharStr = (LPWSTR)calloc(cchWideChar + 1, sizeof(WCHAR)); @@ -473,13 +472,12 @@ int ConvertFromUnicode(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, NULL, NULL); allocate = TRUE; } + else if (!(*lpMultiByteStr)) + allocate = TRUE; if (cbMultiByte < 1) return 0; - if (!(*lpMultiByteStr)) - allocate = TRUE; - if (allocate) { *lpMultiByteStr = (LPSTR)calloc(1, cbMultiByte + 1); diff --git a/winpr/libwinpr/sspi/NTLM/ntlm_compute.c b/winpr/libwinpr/sspi/NTLM/ntlm_compute.c index 7b76c5aae..dbd7f7fb0 100644 --- a/winpr/libwinpr/sspi/NTLM/ntlm_compute.c +++ b/winpr/libwinpr/sspi/NTLM/ntlm_compute.c @@ -124,6 +124,9 @@ void ntlm_print_version_info(NTLM_VERSION_INFO* versionInfo) static int ntlm_read_ntlm_v2_client_challenge(wStream* s, NTLMv2_CLIENT_CHALLENGE* challenge) { size_t size; + if (Stream_GetRemainingLength(s) < 28) + return -1; + Stream_Read_UINT8(s, challenge->RespType); Stream_Read_UINT8(s, challenge->HiRespType); Stream_Read_UINT16(s, challenge->Reserved1); @@ -163,6 +166,8 @@ static int ntlm_write_ntlm_v2_client_challenge(wStream* s, NTLMv2_CLIENT_CHALLEN int ntlm_read_ntlm_v2_response(wStream* s, NTLMv2_RESPONSE* response) { + if (Stream_GetRemainingLength(s) < 16) + return -1; Stream_Read(s, response->Response, 16); return ntlm_read_ntlm_v2_client_challenge(s, &(response->Challenge)); } @@ -415,20 +420,20 @@ int ntlm_compute_lm_v2_response(NTLM_CONTEXT* context) int ntlm_compute_ntlm_v2_response(NTLM_CONTEXT* context) { BYTE* blob; - SecBuffer ntlm_v2_temp; - SecBuffer ntlm_v2_temp_chal; - PSecBuffer TargetInfo; - TargetInfo = &context->ChallengeTargetInfo; + SecBuffer ntlm_v2_temp = { 0 }; + SecBuffer ntlm_v2_temp_chal = { 0 }; + PSecBuffer TargetInfo = &context->ChallengeTargetInfo; + int ret = -1; if (!sspi_SecBufferAlloc(&ntlm_v2_temp, TargetInfo->cbBuffer + 28)) - return -1; + goto exit; ZeroMemory(ntlm_v2_temp.pvBuffer, ntlm_v2_temp.cbBuffer); blob = (BYTE*)ntlm_v2_temp.pvBuffer; /* Compute the NTLMv2 hash */ if (ntlm_compute_ntlm_v2_hash(context, (BYTE*)context->NtlmV2Hash) < 0) - return -1; + goto exit; /* Construct temp */ blob[0] = 1; /* RespType (1 byte) */ @@ -447,7 +452,7 @@ int ntlm_compute_ntlm_v2_response(NTLM_CONTEXT* context) /* Concatenate server challenge with temp */ if (!sspi_SecBufferAlloc(&ntlm_v2_temp_chal, ntlm_v2_temp.cbBuffer + 8)) - return -1; + goto exit; blob = (BYTE*)ntlm_v2_temp_chal.pvBuffer; CopyMemory(blob, context->ServerChallenge, 8); @@ -459,7 +464,7 @@ int ntlm_compute_ntlm_v2_response(NTLM_CONTEXT* context) /* NtChallengeResponse, Concatenate NTProofStr with temp */ if (!sspi_SecBufferAlloc(&context->NtChallengeResponse, ntlm_v2_temp.cbBuffer + 16)) - return -1; + goto exit; blob = (BYTE*)context->NtChallengeResponse.pvBuffer; CopyMemory(blob, context->NtProofString, WINPR_MD5_DIGEST_LENGTH); @@ -468,9 +473,11 @@ int ntlm_compute_ntlm_v2_response(NTLM_CONTEXT* context) winpr_HMAC(WINPR_MD_MD5, (BYTE*)context->NtlmV2Hash, WINPR_MD5_DIGEST_LENGTH, context->NtProofString, WINPR_MD5_DIGEST_LENGTH, context->SessionBaseKey, WINPR_MD5_DIGEST_LENGTH); + ret = 1; +exit: sspi_SecBufferFree(&ntlm_v2_temp); sspi_SecBufferFree(&ntlm_v2_temp_chal); - return 1; + return ret; } /** diff --git a/winpr/libwinpr/sspi/NTLM/ntlm_message.c b/winpr/libwinpr/sspi/NTLM/ntlm_message.c index e5586c9f5..5fc6ec73b 100644 --- a/winpr/libwinpr/sspi/NTLM/ntlm_message.c +++ b/winpr/libwinpr/sspi/NTLM/ntlm_message.c @@ -219,6 +219,11 @@ SECURITY_STATUS ntlm_read_NegotiateMessage(NTLM_CONTEXT* context, PSecBuffer buf return SEC_E_INVALID_TOKEN; } + if (Stream_GetRemainingLength(s) < 4) + { + Stream_Free(s, FALSE); + return SEC_E_INVALID_TOKEN; + } Stream_Read_UINT32(s, message->NegotiateFlags); /* NegotiateFlags (4 bytes) */ if (!((message->NegotiateFlags & NTLMSSP_REQUEST_TARGET) && @@ -676,15 +681,15 @@ SECURITY_STATUS ntlm_write_ChallengeMessage(NTLM_CONTEXT* context, PSecBuffer bu SECURITY_STATUS ntlm_read_AuthenticateMessage(NTLM_CONTEXT* context, PSecBuffer buffer) { + SECURITY_STATUS status = SEC_E_INVALID_TOKEN; wStream* s; size_t length; - UINT32 flags; - NTLM_AV_PAIR* AvFlags; + UINT32 flags = 0; + NTLM_AV_PAIR* AvFlags = NULL; UINT32 PayloadBufferOffset; NTLM_AUTHENTICATE_MESSAGE* message; SSPI_CREDENTIALS* credentials = context->credentials; - flags = 0; - AvFlags = NULL; + message = &context->AUTHENTICATE_MESSAGE; ZeroMemory(message, sizeof(NTLM_AUTHENTICATE_MESSAGE)); s = Stream_New((BYTE*)buffer->pvBuffer, buffer->cbBuffer); @@ -693,130 +698,85 @@ SECURITY_STATUS ntlm_read_AuthenticateMessage(NTLM_CONTEXT* context, PSecBuffer return SEC_E_INTERNAL_ERROR; if (ntlm_read_message_header(s, (NTLM_MESSAGE_HEADER*)message) < 0) - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; if (message->MessageType != MESSAGE_TYPE_AUTHENTICATE) - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; if (ntlm_read_message_fields(s, &(message->LmChallengeResponse)) < 0) /* LmChallengeResponseFields (8 bytes) */ - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; if (ntlm_read_message_fields(s, &(message->NtChallengeResponse)) < 0) /* NtChallengeResponseFields (8 bytes) */ - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; if (ntlm_read_message_fields(s, &(message->DomainName)) < 0) /* DomainNameFields (8 bytes) */ - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; if (ntlm_read_message_fields(s, &(message->UserName)) < 0) /* UserNameFields (8 bytes) */ - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; if (ntlm_read_message_fields(s, &(message->Workstation)) < 0) /* WorkstationFields (8 bytes) */ - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; if (ntlm_read_message_fields(s, &(message->EncryptedRandomSessionKey)) < 0) /* EncryptedRandomSessionKeyFields (8 bytes) */ - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; + if (Stream_GetRemainingLength(s) < 4) + goto fail; Stream_Read_UINT32(s, message->NegotiateFlags); /* NegotiateFlags (4 bytes) */ context->NegotiateKeyExchange = (message->NegotiateFlags & NTLMSSP_NEGOTIATE_KEY_EXCH) ? TRUE : FALSE; if ((context->NegotiateKeyExchange && !message->EncryptedRandomSessionKey.Len) || (!context->NegotiateKeyExchange && message->EncryptedRandomSessionKey.Len)) - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; if (message->NegotiateFlags & NTLMSSP_NEGOTIATE_VERSION) { if (ntlm_read_version_info(s, &(message->Version)) < 0) /* Version (8 bytes) */ - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; } PayloadBufferOffset = Stream_GetPosition(s); + status = SEC_E_INTERNAL_ERROR; if (ntlm_read_message_fields_buffer(s, &(message->DomainName)) < 0) /* DomainName */ - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } + goto fail; if (ntlm_read_message_fields_buffer(s, &(message->UserName)) < 0) /* UserName */ - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } + goto fail; if (ntlm_read_message_fields_buffer(s, &(message->Workstation)) < 0) /* Workstation */ - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } + goto fail; if (ntlm_read_message_fields_buffer(s, &(message->LmChallengeResponse)) < 0) /* LmChallengeResponse */ - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } + goto fail; if (ntlm_read_message_fields_buffer(s, &(message->NtChallengeResponse)) < 0) /* NtChallengeResponse */ - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } + goto fail; if (message->NtChallengeResponse.Len > 0) { + int rc; size_t cbAvFlags; wStream* snt = Stream_New(message->NtChallengeResponse.Buffer, message->NtChallengeResponse.Len); if (!snt) - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } - - if (ntlm_read_ntlm_v2_response(snt, &(context->NTLMv2Response)) < 0) - { - Stream_Free(s, FALSE); - Stream_Free(snt, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; + status = SEC_E_INVALID_TOKEN; + rc = ntlm_read_ntlm_v2_response(snt, &(context->NTLMv2Response)); Stream_Free(snt, FALSE); + if (rc < 0) + goto fail; + status = SEC_E_INTERNAL_ERROR; + context->NtChallengeResponse.pvBuffer = message->NtChallengeResponse.Buffer; context->NtChallengeResponse.cbBuffer = message->NtChallengeResponse.Len; sspi_SecBufferFree(&(context->ChallengeTargetInfo)); @@ -833,18 +793,12 @@ SECURITY_STATUS ntlm_read_AuthenticateMessage(NTLM_CONTEXT* context, PSecBuffer if (ntlm_read_message_fields_buffer(s, &(message->EncryptedRandomSessionKey)) < 0) /* EncryptedRandomSessionKey */ - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } + goto fail; if (message->EncryptedRandomSessionKey.Len > 0) { if (message->EncryptedRandomSessionKey.Len != 16) - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; CopyMemory(context->EncryptedRandomSessionKey, message->EncryptedRandomSessionKey.Buffer, 16); @@ -853,10 +807,7 @@ SECURITY_STATUS ntlm_read_AuthenticateMessage(NTLM_CONTEXT* context, PSecBuffer length = Stream_GetPosition(s); if (!sspi_SecBufferAlloc(&context->AuthenticateMessage, length)) - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } + goto fail; CopyMemory(context->AuthenticateMessage.pvBuffer, Stream_Buffer(s), length); buffer->cbBuffer = length; @@ -866,15 +817,15 @@ SECURITY_STATUS ntlm_read_AuthenticateMessage(NTLM_CONTEXT* context, PSecBuffer { context->MessageIntegrityCheckOffset = (UINT32)Stream_GetPosition(s); + status = SEC_E_INVALID_TOKEN; if (Stream_GetRemainingLength(s) < 16) - { - Stream_Free(s, FALSE); - return SEC_E_INVALID_TOKEN; - } + goto fail; Stream_Read(s, message->MessageIntegrityCheck, 16); } + status = SEC_E_INTERNAL_ERROR; + #ifdef WITH_DEBUG_NTLM WLog_DBG(TAG, "AUTHENTICATE_MESSAGE (length = %" PRIu32 ")", context->AuthenticateMessage.cbBuffer); @@ -906,10 +857,7 @@ SECURITY_STATUS ntlm_read_AuthenticateMessage(NTLM_CONTEXT* context, PSecBuffer credentials->identity.User = (UINT16*)malloc(message->UserName.Len); if (!credentials->identity.User) - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } + goto fail; CopyMemory(credentials->identity.User, message->UserName.Buffer, message->UserName.Len); credentials->identity.UserLength = message->UserName.Len / 2; @@ -920,10 +868,7 @@ SECURITY_STATUS ntlm_read_AuthenticateMessage(NTLM_CONTEXT* context, PSecBuffer credentials->identity.Domain = (UINT16*)malloc(message->DomainName.Len); if (!credentials->identity.Domain) - { - Stream_Free(s, FALSE); - return SEC_E_INTERNAL_ERROR; - } + goto fail; CopyMemory(credentials->identity.Domain, message->DomainName.Buffer, message->DomainName.Len); @@ -934,6 +879,10 @@ SECURITY_STATUS ntlm_read_AuthenticateMessage(NTLM_CONTEXT* context, PSecBuffer /* Computations beyond this point require the NTLM hash of the password */ context->state = NTLM_STATE_COMPLETION; return SEC_I_COMPLETE_NEEDED; + +fail: + Stream_Free(s, FALSE); + return status; } /** diff --git a/winpr/libwinpr/utils/collections/MessagePipe.c b/winpr/libwinpr/utils/collections/MessagePipe.c index c593bc542..1e54d9ffd 100644 --- a/winpr/libwinpr/utils/collections/MessagePipe.c +++ b/winpr/libwinpr/utils/collections/MessagePipe.c @@ -58,7 +58,7 @@ wMessagePipe* MessagePipe_New() goto error_in; pipe->Out = MessageQueue_New(NULL); - if (!pipe->In) + if (!pipe->Out) goto error_out; return pipe; diff --git a/winpr/libwinpr/utils/image.c b/winpr/libwinpr/utils/image.c index 990b4e1c4..41b4cc5e1 100644 --- a/winpr/libwinpr/utils/image.c +++ b/winpr/libwinpr/utils/image.c @@ -339,10 +339,13 @@ static int winpr_image_bitmap_read_buffer(wImage* image, const BYTE* buffer, siz image->type = WINPR_IMAGE_BITMAP; - if (Stream_Capacity(s) < bf.bfOffBits + bi.biSizeImage) + if (Stream_GetPosition(s) > bf.bfOffBits) + goto fail; + if (!Stream_SafeSeek(s, bf.bfOffBits - Stream_GetPosition(s))) + goto fail; + if (Stream_GetRemainingCapacity(s) < bi.biSizeImage) goto fail; - Stream_SetPosition(s, bf.bfOffBits); image->width = bi.biWidth; if (bi.biHeight < 0) diff --git a/winpr/libwinpr/utils/ntlm.c b/winpr/libwinpr/utils/ntlm.c index 9baf9e536..3af38b642 100644 --- a/winpr/libwinpr/utils/ntlm.c +++ b/winpr/libwinpr/utils/ntlm.c @@ -76,9 +76,7 @@ out_fail: BOOL NTOWFv2W(LPWSTR Password, UINT32 PasswordLength, LPWSTR User, UINT32 UserLength, LPWSTR Domain, UINT32 DomainLength, BYTE* NtHash) { - BYTE* buffer; - BYTE NtHashV1[16]; - BOOL result = FALSE; + BYTE NtHashV1[WINPR_MD5_DIGEST_LENGTH]; if ((!User) || (!Password) || (!NtHash)) return FALSE; @@ -86,24 +84,7 @@ BOOL NTOWFv2W(LPWSTR Password, UINT32 PasswordLength, LPWSTR User, UINT32 UserLe if (!NTOWFv1W(Password, PasswordLength, NtHashV1)) return FALSE; - if (!(buffer = (BYTE*)malloc(UserLength + DomainLength))) - return FALSE; - - /* Concatenate(UpperCase(User), Domain) */ - CopyMemory(buffer, User, UserLength); - CharUpperBuffW((LPWSTR)buffer, UserLength / 2); - CopyMemory(&buffer[UserLength], Domain, DomainLength); - - /* Compute the HMAC-MD5 hash of the above value using the NTLMv1 hash as the key, the result is - * the NTLMv2 hash */ - if (!winpr_HMAC(WINPR_MD_MD5, NtHashV1, 16, buffer, UserLength + DomainLength, NtHash, - WINPR_MD4_DIGEST_LENGTH)) - goto out_fail; - - result = TRUE; -out_fail: - free(buffer); - return result; + return NTOWFv2FromHashW(NtHashV1, User, UserLength, Domain, DomainLength, NtHash); } BOOL NTOWFv2A(LPSTR Password, UINT32 PasswordLength, LPSTR User, UINT32 UserLength, LPSTR Domain, @@ -164,7 +145,7 @@ BOOL NTOWFv2FromHashW(BYTE* NtHashV1, LPWSTR User, UINT32 UserLength, LPWSTR Dom /* Compute the HMAC-MD5 hash of the above value using the NTLMv1 hash as the key, the result is * the NTLMv2 hash */ if (!winpr_HMAC(WINPR_MD_MD5, NtHashV1, 16, buffer, UserLength + DomainLength, NtHash, - WINPR_MD4_DIGEST_LENGTH)) + WINPR_MD5_DIGEST_LENGTH)) goto out_fail; result = TRUE; |