};
typedef struct _SMARTCARD_IRP_WORKER SMARTCARD_IRP_WORKER;
-static void smartcard_process_irp_thread_func(SMARTCARD_IRP_WORKER* irpWorker)
+static void *smartcard_process_irp_thread_func(SMARTCARD_IRP_WORKER* irpWorker)
{
smartcard_process_irp(irpWorker->smartcard, irpWorker->irp);
CloseHandle(irpWorker->thread);
free(irpWorker);
+
+ ExitThread(0);
+ return NULL;
}
static void* smartcard_thread_func(void* arg)
{
char* name;
char* path;
- int i, length;
+ int i, length, ck;
RDPDR_SMARTCARD* device;
SMARTCARD_DEVICE* smartcard;
name = device->Name;
path = device->Path;
- if (name)
- {
- /* TODO: check if server supports sc redirect (version 5.1) */
-
- smartcard = (SMARTCARD_DEVICE*) malloc(sizeof(SMARTCARD_DEVICE));
- ZeroMemory(smartcard, sizeof(SMARTCARD_DEVICE));
+ /* TODO: check if server supports sc redirect (version 5.1) */
+ smartcard = (SMARTCARD_DEVICE*) malloc(sizeof(SMARTCARD_DEVICE));
+ ZeroMemory(smartcard, sizeof(SMARTCARD_DEVICE));
- smartcard->device.type = RDPDR_DTYP_SMARTCARD;
- smartcard->device.name = "SCARD";
- smartcard->device.IRPRequest = smartcard_irp_request;
- smartcard->device.Free = smartcard_free;
+ smartcard->device.type = RDPDR_DTYP_SMARTCARD;
+ smartcard->device.name = "SCARD";
+ smartcard->device.IRPRequest = smartcard_irp_request;
+ smartcard->device.Free = smartcard_free;
- length = strlen(smartcard->device.name);
- smartcard->device.data = Stream_New(NULL, length + 1);
+ length = strlen(smartcard->device.name);
+ smartcard->device.data = Stream_New(NULL, length + 1);
- for (i = 0; i <= length; i++)
- Stream_Write_UINT8(smartcard->device.data, name[i] < 0 ? '_' : name[i]);
+ Stream_Write(smartcard->device.data, "SCARD", 6);
+ smartcard->name = NULL;
+ smartcard->path = NULL;
+ if (path)
+ {
smartcard->path = path;
+ smartcard->name = name;
+ }
+ else if (name)
+ {
+ if (1 == sscanf(name, "%d", &ck))
+ smartcard->path = name;
+ else
+ smartcard->name = name;
+ }
- smartcard->pIrpList = (PSLIST_HEADER) _aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT);
- InitializeSListHead(smartcard->pIrpList);
+ smartcard->pIrpList = (PSLIST_HEADER) _aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT);
+ InitializeSListHead(smartcard->pIrpList);
- smartcard->irpEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- smartcard->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- smartcard->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) smartcard_thread_func,
- smartcard, CREATE_SUSPENDED, NULL);
+ smartcard->irpEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ smartcard->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ smartcard->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) smartcard_thread_func,
+ smartcard, CREATE_SUSPENDED, NULL);
- smartcard->CompletionIds = list_new();
- smartcard->CompletionIdsMutex = CreateMutex(NULL, FALSE, NULL);
+ smartcard->CompletionIds = list_new();
+ smartcard->CompletionIdsMutex = CreateMutex(NULL, FALSE, NULL);
- pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) smartcard);
+ pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) smartcard);
- ResumeThread(smartcard->thread);
- }
+ ResumeThread(smartcard->thread);
return 0;
}
{ "clipboard", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Redirect clipboard" },
{ "serial", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, "tty", "Redirect serial device" },
{ "parallel", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect parallel device" },
- { "smartcard", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect smartcard device" },
+ { "smartcard", COMMAND_LINE_VALUE_OPTIONAL, NULL, NULL, NULL, -1, NULL, "Redirect smartcard device" },
{ "printer", COMMAND_LINE_VALUE_OPTIONAL, NULL, NULL, NULL, -1, NULL, "Redirect printer device" },
{ "usb", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect USB device" },
{ "multitouch", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Redirect multitouch input" },
{
RDPDR_SMARTCARD* smartcard;
- if (count < 2)
+ if (count < 1)
return -1;
smartcard = (RDPDR_SMARTCARD*) malloc(sizeof(RDPDR_SMARTCARD));
ZeroMemory(smartcard, sizeof(RDPDR_SMARTCARD));
smartcard->Type = RDPDR_DTYP_SMARTCARD;
- smartcard->Name = _strdup(params[1]);
-
+ if (count > 1)
+ smartcard->Name = _strdup(params[1]);
if (count > 2)
smartcard->Path = _strdup(params[2]);
{
RDPDR_SERIAL* serial;
- if (count < 2)
+ if (count < 1)
return -1;
serial = (RDPDR_SERIAL*) malloc(sizeof(RDPDR_SERIAL));
ZeroMemory(serial, sizeof(RDPDR_SERIAL));
serial->Type = RDPDR_DTYP_SERIAL;
- serial->Name = _strdup(params[1]);
- serial->Path = _strdup(params[2]);
+ if (count > 1)
+ serial->Name = _strdup(params[1]);
+ if (count > 2)
+ serial->Path = _strdup(params[2]);
freerdp_device_collection_add(settings, (RDPDR_DEVICE*) serial);
settings->DeviceRedirection = TRUE;
{
RDPDR_PARALLEL* parallel;
- if (count < 2)
+ if (count < 1)
return -1;
parallel = (RDPDR_PARALLEL*) malloc(sizeof(RDPDR_PARALLEL));
ZeroMemory(parallel, sizeof(RDPDR_PARALLEL));
parallel->Type = RDPDR_DTYP_PARALLEL;
- parallel->Name = _strdup(params[1]);
- parallel->Path = _strdup(params[2]);
+ if (count > 1)
+ parallel->Name = _strdup(params[1]);
+ if (count > 1)
+ parallel->Path = _strdup(params[2]);
freerdp_device_collection_add(settings, (RDPDR_DEVICE*) parallel);
settings->DeviceRedirection = TRUE;
nArgs = nCommas = 0;
+ if (!list)
+ return NULL;
+
for (index = 0; list[index]; index++)
nCommas += (list[index] == ',') ? 1 : 0;
return 0;
}
+int freerdp_detect_command_line_pre_filter(void* context, int index, int argc, LPCSTR* argv)
+{
+ int length;
+
+ if (index == 1)
+ {
+ length = strlen(argv[index]);
+
+ if (length > 4)
+ {
+ if (_stricmp(&(argv[index])[length - 4], ".rdp") == 0)
+ {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
int freerdp_detect_windows_style_command_line_syntax(int argc, char** argv, int* count)
{
int status;
*count = 0;
detect_status = 0;
CommandLineClearArgumentsA(args);
- status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, NULL, NULL, NULL);
+
+ status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags,
+ NULL, freerdp_detect_command_line_pre_filter, NULL);
+
+ if (status < 0)
+ return status;
arg = args;
*count = 0;
detect_status = 0;
CommandLineClearArgumentsA(args);
- status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, NULL, NULL, NULL);
+
+ status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags,
+ NULL, freerdp_detect_command_line_pre_filter, NULL);
+
+ if (status < 0)
+ return status;
arg = args;
*flags = COMMAND_LINE_SEPARATOR_COLON;
*flags |= COMMAND_LINE_SIGIL_SLASH | COMMAND_LINE_SIGIL_PLUS_MINUS;
}
- else
+ else if (old_cli_status >= 0)
{
+ /* Ignore legacy parsing in case there is an error in the command line. */
+
if ((old_cli_status == 1) || ((old_cli_count > posix_cli_count) && (old_cli_status != -1)))
{
*flags = COMMAND_LINE_SEPARATOR_SPACE;
{
COMMAND_LINE_ARGUMENT_A* arg;
- if (status == COMMAND_LINE_STATUS_PRINT_HELP)
- {
- freerdp_client_print_command_line_help(argc, argv);
- return COMMAND_LINE_STATUS_PRINT_HELP;
- }
- else if (status == COMMAND_LINE_STATUS_PRINT_VERSION)
+ if (status == COMMAND_LINE_STATUS_PRINT_VERSION)
{
freerdp_client_print_version();
return COMMAND_LINE_STATUS_PRINT_VERSION;
return COMMAND_LINE_STATUS_PRINT;
}
+ else if (status < 0)
+ {
+ freerdp_client_print_command_line_help(argc, argv);
+ return COMMAND_LINE_STATUS_PRINT_HELP;
+ }
return 0;
}
BOOL compatibility;
COMMAND_LINE_ARGUMENT_A* arg;
- freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
-
compatibility = freerdp_client_detect_command_line(argc, argv, &flags);
if (compatibility)
else
{
CommandLineClearArgumentsA(args);
+
status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, settings,
freerdp_client_command_line_pre_filter, freerdp_client_command_line_post_filter);
+
+ if (status < 0)
+ return status;
}
settings->RemoteFxCodec = TRUE;
settings->FastPathOutput = TRUE;
settings->ColorDepth = 32;
- settings->PerformanceFlags = PERF_FLAG_NONE;
settings->LargePointerFlag = TRUE;
settings->FrameMarkerCommandEnabled = TRUE;
}
}
CommandLineSwitchDefault(arg)
{
-
}
CommandLineSwitchEnd(arg)
}
while ((arg = CommandLineFindNextArgumentA(arg)) != NULL);
- settings->PerformanceFlags = PERF_FLAG_NONE;
-
- if (settings->AllowFontSmoothing)
- settings->PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
-
- if (settings->AllowDesktopComposition)
- settings->PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
-
- if (settings->DisableWallpaper)
- settings->PerformanceFlags |= PERF_DISABLE_WALLPAPER;
-
- if (settings->DisableFullWindowDrag)
- settings->PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
-
- if (settings->DisableMenuAnims)
- settings->PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
-
- if (settings->DisableThemes)
- settings->PerformanceFlags |= PERF_DISABLE_THEMING;
+ freerdp_performance_flags_make(settings);
if (settings->GatewayEnabled)
{