void test_drdynvc(void) { rdpChanMan* chan_man; rdpSettings settings = { 0 }; freerdp instance = { 0 }; settings.hostname = "testhost"; instance.settings = &settings; instance.ChannelDataInput = test_rdp_channel_data; chan_man = freerdp_chanman_new(); freerdp_chanman_load_plugin(chan_man, &settings, "../channels/drdynvc/drdynvc.so", NULL); freerdp_chanman_pre_connect(chan_man, &instance); freerdp_chanman_post_connect(chan_man, &instance); /* server sends capability request PDU */ freerdp_chanman_data(&instance, 0, (char*)test_capability_request_data, sizeof(test_capability_request_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_capability_request_data) - 1); /* drdynvc sends capability response PDU to server */ data_received = 0; while (!data_received) { freerdp_chanman_check_fds(chan_man, &instance); } freerdp_chanman_close(chan_man, &instance); freerdp_chanman_free(chan_man); }
int tf_process_plugin_args(rdpSettings* settings, const char* name, RDP_PLUGIN_DATA* plugin_data, void* user_data) { rdpChanMan* chanman = (rdpChanMan*) user_data; printf("Load plugin %s\n", name); freerdp_chanman_load_plugin(chanman, settings, name, plugin_data); return 1; }
static int process_params(rdpSet * settings, rdpChanMan * chan_man, int argc, char ** argv, int * pindex) { char * p; struct passwd * pw; RD_PLUGIN_DATA plugin_data[MAX_PLUGIN_DATA + 1]; int index; int i, j; set_default_params(settings); pw = getpwuid(getuid()); if (pw != 0) { if (pw->pw_name != 0) { strncpy(settings->username, pw->pw_name, sizeof(settings->username) - 1); } } printf("process_params\n"); if (argc < *pindex + 1) { if (*pindex == 1) printf("no parameters specified\n"); return 1; } while (*pindex < argc) { if (strcmp("-a", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing server depth\n"); return 1; } settings->server_depth = atoi(argv[*pindex]); } else if (strcmp("-u", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing username\n"); return 1; } strncpy(settings->username, argv[*pindex], sizeof(settings->username) - 1); settings->username[sizeof(settings->username) - 1] = 0; } else if (strcmp("-p", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing password\n"); return 1; } strncpy(settings->password, argv[*pindex], sizeof(settings->password) - 1); settings->password[sizeof(settings->password) - 1] = 0; settings->autologin = 1; } else if (strcmp("-d", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing domain\n"); return 1; } strncpy(settings->domain, argv[*pindex], sizeof(settings->domain) - 1); settings->domain[sizeof(settings->domain) - 1] = 0; } else if (strcmp("-s", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing shell\n"); return 1; } strncpy(settings->shell, argv[*pindex], sizeof(settings->shell) - 1); settings->shell[sizeof(settings->shell) - 1] = 0; } else if (strcmp("-c", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing directory\n"); return 1; } strncpy(settings->directory, argv[*pindex], sizeof(settings->directory) - 1); settings->directory[sizeof(settings->directory) - 1] = 0; } else if (strcmp("-g", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing width\n"); return 1; } settings->width = strtol(argv[*pindex], &p, 10); if (*p == 'x') { settings->height = strtol(p + 1, &p, 10); } if ((settings->width < 16) || (settings->height < 16) || (settings->width > 4096) || (settings->height > 4096)) { printf("invalid dimensions\n"); return 1; } } else if (strcmp("-t", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing port number\n"); return 1; } settings->tcp_port_rdp = atoi(argv[*pindex]); } else if (strcmp("-n", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing hostname\n"); return 1; } strncpy(settings->hostname, argv[*pindex], sizeof(settings->hostname) - 1); settings->directory[sizeof(settings->hostname) - 1] = 0; } else if (strcmp("-o", argv[*pindex]) == 0) { settings->console_audio = 1; } else if (strcmp("-0", argv[*pindex]) == 0) { settings->console_session = 1; } else if (strcmp("-z", argv[*pindex]) == 0) { settings->bulk_compression = 1; } else if (strcmp("-x", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing performance flag\n"); return 1; } if (strncmp("m", argv[*pindex], 1) == 0) /* modem */ { settings->performanceflags = PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS | PERF_DISABLE_THEMING; } else if (strncmp("b", argv[*pindex], 1) == 0) /* broadband */ { settings->performanceflags = PERF_DISABLE_WALLPAPER; } else if (strncmp("l", argv[*pindex], 1) == 0) /* lan */ { settings->performanceflags = PERF_FLAG_NONE; } else { settings->performanceflags = strtol(argv[*pindex], 0, 16); } } else if (strcmp("-plugin", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing plugin name\n"); return 1; } index = *pindex; memset(plugin_data, 0, sizeof(plugin_data)); if (*pindex < argc - 1 && strcmp("-data", argv[*pindex + 1]) == 0) { *pindex = *pindex + 2; i = 0; while (*pindex < argc && strcmp("--", argv[*pindex]) != 0 && i < MAX_PLUGIN_DATA) { plugin_data[i].size = sizeof(RD_PLUGIN_DATA); for (j = 0, p = argv[*pindex]; j < 4 && p != NULL; j++) { plugin_data[i].data[j] = p; p = strchr(plugin_data[i].data[j], ':'); if (p != NULL) *p++ = 0; } *pindex = *pindex + 1; i++; } } freerdp_chanman_load_plugin(chan_man, settings, argv[index], plugin_data); } else { strncpy(settings->server, argv[*pindex], sizeof(settings->server) - 1); settings->server[sizeof(settings->server) - 1] = 0; p = strchr(settings->server, ':'); if (p) { *p = 0; settings->tcp_port_rdp = atoi(p + 1); } /* server is the last argument for the current session. arguments followed will be parsed for the next session. */ *pindex = *pindex + 1; return 0; } *pindex = *pindex + 1; } printf("missing server name\n"); return 1; }
static int process_params(wfInfo * wfi, int argc, char ** argv, int * pindex) { rdpSet * settings; char * p; int i; char show_console = 1; /* Early scanning of options for stdout/console handling */ for(i = 1; i < argc; i++) if (strcmp("--no-console", argv[i]) == 0) { show_console = 0; } else if (strcmp("--debug-log", argv[i]) == 0) { freopen("freerdp.log", "w", stdout); show_console = 0; } if (show_console && !GetConsoleWindow()) { create_console(); printf("(this console window can be redirected to freerdp.log with --debug-log\n" "or hidden with --no-debug)\n"); } set_default_params(wfi); settings = wfi->settings; DEBUG("process_params\n"); if (argc < *pindex + 1) { if (*pindex == 1) printf("no parameters specified\n"); return 1; } while (*pindex < argc) { if (strcmp("-a", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing server depth\n"); return 1; } settings->server_depth = atoi(argv[*pindex]); } else if (strcmp("-u", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing username\n"); return 1; } strncpy(settings->username, argv[*pindex], sizeof(settings->username) - 1); settings->username[sizeof(settings->username) - 1] = 0; } else if (strcmp("-p", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing password\n"); return 1; } strncpy(settings->password, argv[*pindex], sizeof(settings->password) - 1); settings->password[sizeof(settings->password) - 1] = 0; settings->autologin = 1; } else if (strcmp("-d", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing domain\n"); return 1; } strncpy(settings->domain, argv[*pindex], sizeof(settings->domain) - 1); settings->domain[sizeof(settings->domain) - 1] = 0; } else if (strcmp("-s", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing shell\n"); return 1; } strncpy(settings->shell, argv[*pindex], sizeof(settings->shell) - 1); settings->shell[sizeof(settings->shell) - 1] = 0; } else if (strcmp("-c", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing directory\n"); return 1; } strncpy(settings->directory, argv[*pindex], sizeof(settings->directory) - 1); settings->directory[sizeof(settings->directory) - 1] = 0; } else if (strcmp("-g", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing width\n"); return 1; } settings->width = strtol(argv[*pindex], &p, 10); if (*p == 'x') { settings->height = strtol(p + 1, &p, 10); } if (*p == '%') { wfi->percentscreen = settings->width; } } else if (strcmp("-t", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing port number\n"); return 1; } settings->tcp_port_rdp = atoi(argv[*pindex]); } else if (strcmp("-T", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing window title\n"); return 1; } strncpy(wfi->window_title, argv[*pindex], sizeof(wfi->window_title) - 1); wfi->window_title[sizeof(wfi->window_title) - 1] = 0; } else if (strcmp("-n", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing hostname\n"); return 1; } strncpy(settings->hostname, argv[*pindex], sizeof(settings->hostname) - 1); settings->hostname[sizeof(settings->hostname) - 1] = 0; } else if (strcmp("-o", argv[*pindex]) == 0) { settings->console_audio = 1; } else if (strcmp("-0", argv[*pindex]) == 0) { settings->console_session = 1; } else if (strcmp("-z", argv[*pindex]) == 0) { settings->bulk_compression = 1; } else if (strcmp("--rfx", argv[*pindex]) == 0) { settings->rfx_flags = 1; settings->ui_decode_flags = 1; settings->use_frame_ack = 0; settings->server_depth = 32; settings->performanceflags = PERF_FLAG_NONE; } else if (strcmp("--gdi", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing GDI rendering\n"); return 1; } if (strncmp("sw", argv[*pindex], 1) == 0) /* Software */ { settings->software_gdi = 1; } else if (strncmp("hw", argv[*pindex], 1) == 0) /* Hardware */ { settings->software_gdi = 0; } else { printf("unknown GDI rendering\n"); return 1; } } else if (strcmp("--no-osb", argv[*pindex]) == 0) { settings->off_screen_bitmaps = 0; } else if (strcmp("-f", argv[*pindex]) == 0) { wfi->fullscreen = wfi->fs_toggle = 1; DEBUG("full screen option\n"); } else if (strcmp("-x", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing performance flag\n"); return 1; } if (strncmp("m", argv[*pindex], 1) == 0) /* modem */ { settings->performanceflags = PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS | PERF_DISABLE_THEMING; } else if (strncmp("b", argv[*pindex], 1) == 0) /* broadband */ { settings->performanceflags = PERF_DISABLE_WALLPAPER; } else if (strncmp("l", argv[*pindex], 1) == 0) /* lan */ { settings->performanceflags = PERF_FLAG_NONE; } else { settings->performanceflags = strtol(argv[*pindex], 0, 16); } } #ifndef DISABLE_TLS else if (strcmp("--no-rdp", argv[*pindex]) == 0) { settings->rdp_security = 0; } else if (strcmp("--no-tls", argv[*pindex]) == 0) { settings->tls_security = 0; } else if (strcmp("--no-nla", argv[*pindex]) == 0) { settings->nla_security = 0; } else if (strcmp("--sec", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing protocol security\n"); return 1; } if (strncmp("rdp", argv[*pindex], 1) == 0) /* Standard RDP */ { settings->rdp_security = 1; settings->tls_security = 0; settings->nla_security = 0; } else if (strncmp("tls", argv[*pindex], 1) == 0) /* TLS */ { settings->rdp_security = 0; settings->tls_security = 1; settings->nla_security = 0; } else if (strncmp("nla", argv[*pindex], 1) == 0) /* NLA */ { settings->rdp_security = 0; settings->tls_security = 0; settings->nla_security = 1; } else { printf("unknown protocol security\n"); return 1; } } #endif else if (strcmp("--plugin", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing plugin name\n"); return 1; } /* TODO: Handle --data ... -- */ freerdp_chanman_load_plugin(wfi->chan_man, settings, argv[*pindex], NULL); } else if ((strcmp("-h", argv[*pindex]) == 0) || strcmp("--help", argv[*pindex]) == 0) { out_args(); return 1; } else if (strcmp("--version", argv[*pindex]) == 0) { printf("This is FreeRDP version %s\n", PACKAGE_VERSION); return 1; } else if (argv[*pindex][0] != '-') { settings->server[sizeof(settings->server) - 1] = 0; if (argv[*pindex][0] == '[' && (p = strchr(argv[*pindex], ']')) && (p[1] == 0 || (p[1] == ':' && !strchr(p + 2, ':')))) { /* Either "[...]" or "[...]:..." with at most one : after the brackets */ strncpy(settings->server, argv[*pindex] + 1, sizeof(settings->server) - 1); if ((p = strchr(settings->server, ']'))) { *p = 0; if (p[1] == ':') settings->tcp_port_rdp = atoi(p + 2); } } else { /* Port number is cut off and used if exactly one : in the string */ strncpy(settings->server, argv[*pindex], sizeof(settings->server) - 1); if ((p = strchr(settings->server, ':')) && !strchr(p + 1, ':')) { *p = 0; settings->tcp_port_rdp = atoi(p + 1); } } /* server is the last argument for the current session. arguments followed will be parsed for the next session. */ *pindex = *pindex + 1; return 0; } else if ((strcmp("--no-console", argv[*pindex]) == 0) || (strcmp("--debug-log", argv[*pindex]) == 0)) { /* Skip options that already has been processed */ } else { printf("invalid option: %s\n", argv[*pindex]); return 1; } *pindex = *pindex + 1; } printf("missing server name\n"); return 1; }
static int process_params(rdpSet * settings, rdpChanMan * chan_man, int argc, char ** argv, int * pindex) { int index; int i, j; char * p; struct passwd * pw; int num_extensions; RD_PLUGIN_DATA plugin_data[MAX_PLUGIN_DATA + 1]; num_extensions = 0; set_default_params(settings); p = getlogin(); i = sizeof(settings->username) - 1; if (p != 0) { strncpy(settings->username, p, i); } else { pw = getpwuid(getuid()); if (pw != 0) { if (pw->pw_name != 0) { strncpy(settings->username, pw->pw_name, i); } } } if (argc < *pindex + 1) { if (*pindex == 1) printf("no parameters specified\n"); return 1; } while (*pindex < argc) { if (strcmp("-a", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing server depth\n"); return 1; } settings->server_depth = atoi(argv[*pindex]); } else if (strcmp("-u", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing username\n"); return 1; } strncpy(settings->username, argv[*pindex], sizeof(settings->username) - 1); settings->username[sizeof(settings->username) - 1] = 0; } else if (strcmp("-p", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing password\n"); return 1; } strncpy(settings->password, argv[*pindex], sizeof(settings->password) - 1); settings->password[sizeof(settings->password) - 1] = 0; settings->autologin = 1; } else if (strcmp("-d", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing domain\n"); return 1; } strncpy(settings->domain, argv[*pindex], sizeof(settings->domain) - 1); settings->domain[sizeof(settings->domain) - 1] = 0; } else if (strcmp("-s", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing shell\n"); return 1; } strncpy(settings->shell, argv[*pindex], sizeof(settings->shell) - 1); settings->shell[sizeof(settings->shell) - 1] = 0; } else if (strcmp("-c", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing directory\n"); return 1; } strncpy(settings->directory, argv[*pindex], sizeof(settings->directory) - 1); settings->directory[sizeof(settings->directory) - 1] = 0; } else if (strcmp("-g", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing width\n"); return 1; } settings->width = strtol(argv[*pindex], &p, 10); if (*p == 'x') { settings->height = strtol(p + 1, &p, 10); } if ((settings->width < 16) || (settings->height < 16) || (settings->width > 4096) || (settings->height > 4096)) { printf("invalid dimensions\n"); return 1; } } else if (strcmp("-t", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing port number\n"); return 1; } settings->tcp_port_rdp = atoi(argv[*pindex]); } else if (strcmp("-n", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing hostname\n"); return 1; } strncpy(settings->hostname, argv[*pindex], sizeof(settings->hostname) - 1); settings->directory[sizeof(settings->hostname) - 1] = 0; } else if (strcmp("-o", argv[*pindex]) == 0) { settings->console_audio = 1; } else if (strcmp("-0", argv[*pindex]) == 0) { settings->console_session = 1; } else if (strcmp("-z", argv[*pindex]) == 0) { settings->bulk_compression = 1; } else if (strcmp("--gdi", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing GDI rendering\n"); return 1; } if (strncmp("sw", argv[*pindex], 1) == 0) /* Software */ { settings->software_gdi = 1; } else if (strncmp("hw", argv[*pindex], 1) == 0) /* Hardware */ { settings->software_gdi = 0; } else { printf("unknown GDI rendering\n"); return 1; } } else if (strcmp("--no-osb", argv[*pindex]) == 0) { settings->off_screen_bitmaps = 0; } else if (strcmp("--rfx", argv[*pindex]) == 0) { settings->rfx_flags = 1; settings->ui_decode_flags = 1; settings->use_frame_ack = 0; settings->server_depth = 32; settings->performanceflags = PERF_FLAG_NONE; } else if ((strcmp("-h", argv[*pindex]) == 0) || strcmp("--help", argv[*pindex]) == 0) { out_args(); return 1; } else if (strcmp("-x", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing performance flag\n"); return 1; } if (strncmp("m", argv[*pindex], 1) == 0) /* modem */ { settings->performanceflags = PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS | PERF_DISABLE_THEMING; } else if (strncmp("b", argv[*pindex], 1) == 0) /* broadband */ { settings->performanceflags = PERF_DISABLE_WALLPAPER; } else if (strncmp("l", argv[*pindex], 1) == 0) /* lan */ { settings->performanceflags = PERF_FLAG_NONE; } else { settings->performanceflags = strtol(argv[*pindex], 0, 16); } } #ifndef DISABLE_TLS else if (strcmp("--no-rdp", argv[*pindex]) == 0) { settings->rdp_security = 0; } else if (strcmp("--no-tls", argv[*pindex]) == 0) { settings->tls_security = 0; } else if (strcmp("--no-nla", argv[*pindex]) == 0) { settings->nla_security = 0; } else if (strcmp("--sec", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing protocol security\n"); return 1; } if (strncmp("rdp", argv[*pindex], 1) == 0) /* Standard RDP */ { settings->rdp_security = 1; settings->tls_security = 0; settings->nla_security = 0; } else if (strncmp("tls", argv[*pindex], 1) == 0) /* TLS */ { settings->rdp_security = 0; settings->tls_security = 1; settings->nla_security = 0; } else if (strncmp("nla", argv[*pindex], 1) == 0) /* NLA */ { settings->rdp_security = 0; settings->tls_security = 0; settings->nla_security = 1; } else { printf("unknown protocol security\n"); return 1; } } #endif else if (strcmp("--plugin", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing plugin name\n"); return 1; } index = *pindex; memset(plugin_data, 0, sizeof(plugin_data)); if (*pindex < argc - 1 && strcmp("--data", argv[*pindex + 1]) == 0) { *pindex = *pindex + 2; i = 0; while (*pindex < argc && strcmp("--", argv[*pindex]) != 0 && i < MAX_PLUGIN_DATA) { plugin_data[i].size = sizeof(RD_PLUGIN_DATA); for (j = 0, p = argv[*pindex]; j < 4 && p != NULL; j++) { plugin_data[i].data[j] = p; if (j < 3) { p = strchr(plugin_data[i].data[j], ':'); if (p != NULL) *p++ = 0; } } *pindex = *pindex + 1; i++; } } freerdp_chanman_load_plugin(chan_man, settings, argv[index], plugin_data); } else if (strcmp("--ext", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing extension name\n"); return 1; } if (num_extensions >= sizeof(settings->extensions) / sizeof(struct rdp_ext_set)) { printf("maximum extensions reached\n"); return 1; } index = *pindex; snprintf(settings->extensions[num_extensions].name, sizeof(settings->extensions[num_extensions].name), "%s", argv[index]); settings->extensions[num_extensions].data = NULL; if (*pindex < argc - 1 && strcmp("--data", argv[*pindex + 1]) == 0) { *pindex = *pindex + 2; settings->extensions[num_extensions].data = argv[*pindex]; i = 0; while (*pindex < argc && strcmp("--", argv[*pindex]) != 0) { *pindex = *pindex + 1; i++; } } num_extensions++; } else if ((strcmp("-h", argv[*pindex]) == 0) || strcmp("--help", argv[*pindex]) == 0) { out_args(); return 1; } else if (strcmp("--version", argv[*pindex]) == 0) { printf("This is FreeRDP version %s\n", PACKAGE_VERSION); return 1; } else if (argv[*pindex][0] != '-') { settings->server[sizeof(settings->server) - 1] = 0; if (argv[*pindex][0] == '[' && (p = strchr(argv[*pindex], ']')) && (p[1] == 0 || (p[1] == ':' && !strchr(p + 2, ':')))) { /* Either "[...]" or "[...]:..." with at most one : after the brackets */ strncpy(settings->server, argv[*pindex] + 1, sizeof(settings->server) - 1); if ((p = strchr(settings->server, ']'))) { *p = 0; if (p[1] == ':') settings->tcp_port_rdp = atoi(p + 2); } } else { /* Port number is cut off and used if exactly one : in the string */ strncpy(settings->server, argv[*pindex], sizeof(settings->server) - 1); if ((p = strchr(settings->server, ':')) && !strchr(p + 1, ':')) { *p = 0; settings->tcp_port_rdp = atoi(p + 1); } } /* server is the last argument for the current session. arguments followed will be parsed for the next session. */ *pindex = *pindex + 1; return 0; } else { printf("invalid option: %s\n", argv[*pindex]); return 1; } *pindex = *pindex + 1; } printf("missing server name\n"); return 1; }
void test_cliprdr(void) { int i; rdpChanMan* chan_man; rdpSettings settings = { 0 }; freerdp instance = { 0 }; FRDP_EVENT* event; FRDP_CB_FORMAT_LIST_EVENT* format_list_event; FRDP_CB_DATA_REQUEST_EVENT* data_request_event; FRDP_CB_DATA_RESPONSE_EVENT* data_response_event; settings.hostname = "testhost"; instance.settings = &settings; instance.SendChannelData = test_rdp_channel_data; chan_man = freerdp_chanman_new(); freerdp_chanman_load_plugin(chan_man, &settings, "../channels/cliprdr/cliprdr.so", NULL); freerdp_chanman_pre_connect(chan_man, &instance); freerdp_chanman_post_connect(chan_man, &instance); /* server sends cliprdr capabilities and monitor ready PDU */ freerdp_chanman_data(&instance, 0, (char*)test_clip_caps_data, sizeof(test_clip_caps_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_clip_caps_data) - 1); freerdp_chanman_data(&instance, 0, (char*)test_monitor_ready_data, sizeof(test_monitor_ready_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_monitor_ready_data) - 1); /* cliprdr sends clipboard_sync event to UI */ while ((event = freerdp_chanman_pop_event(chan_man)) == NULL) { freerdp_chanman_check_fds(chan_man, &instance); } printf("Got event %d\n", event->event_type); CU_ASSERT(event->event_type == FRDP_EVENT_TYPE_CB_SYNC); freerdp_event_free(event); /* UI sends format_list event to cliprdr */ event = freerdp_event_new(FRDP_EVENT_TYPE_CB_FORMAT_LIST, event_process_callback, NULL); format_list_event = (FRDP_CB_FORMAT_LIST_EVENT*)event; format_list_event->num_formats = 2; format_list_event->formats = (uint32*)xmalloc(sizeof(uint32) * 2); format_list_event->formats[0] = CB_FORMAT_TEXT; format_list_event->formats[1] = CB_FORMAT_HTML; event_processed = 0; freerdp_chanman_send_event(chan_man, "cliprdr", event); /* cliprdr sends format list PDU to server */ while (!event_processed) { freerdp_chanman_check_fds(chan_man, &instance); } /* server sends format list response PDU to cliprdr */ freerdp_chanman_data(&instance, 0, (char*)test_format_list_response_data, sizeof(test_format_list_response_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_format_list_response_data) - 1); /* server sends format list PDU to cliprdr */ freerdp_chanman_data(&instance, 0, (char*)test_format_list_data, sizeof(test_format_list_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_format_list_data) - 1); /* cliprdr sends format_list event to UI */ while ((event = freerdp_chanman_pop_event(chan_man)) == NULL) { freerdp_chanman_check_fds(chan_man, &instance); } printf("Got event %d\n", event->event_type); CU_ASSERT(event->event_type == FRDP_EVENT_TYPE_CB_FORMAT_LIST); if (event->event_type == FRDP_EVENT_TYPE_CB_FORMAT_LIST) { format_list_event = (FRDP_CB_FORMAT_LIST_EVENT*)event; for (i = 0; i < format_list_event->num_formats; i++) printf("Format: 0x%X\n", format_list_event->formats[i]); } freerdp_event_free(event); /* server sends data request PDU to cliprdr */ freerdp_chanman_data(&instance, 0, (char*)test_data_request_data, sizeof(test_data_request_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_data_request_data) - 1); /* cliprdr sends data request event to UI */ while ((event = freerdp_chanman_pop_event(chan_man)) == NULL) { freerdp_chanman_check_fds(chan_man, &instance); } printf("Got event %d\n", event->event_type); CU_ASSERT(event->event_type == FRDP_EVENT_TYPE_CB_DATA_REQUEST); if (event->event_type == FRDP_EVENT_TYPE_CB_DATA_REQUEST) { data_request_event = (FRDP_CB_DATA_REQUEST_EVENT*)event; printf("Requested format: 0x%X\n", data_request_event->format); } freerdp_event_free(event); /* UI sends data response event to cliprdr */ event = freerdp_event_new(FRDP_EVENT_TYPE_CB_DATA_RESPONSE, event_process_callback, NULL); data_response_event = (FRDP_CB_DATA_RESPONSE_EVENT*)event; data_response_event->data = (uint8*)xmalloc(6); strcpy((char*)data_response_event->data, "hello"); data_response_event->size = 6; event_processed = 0; freerdp_chanman_send_event(chan_man, "cliprdr", event); /* cliprdr sends data response PDU to server */ while (!event_processed) { freerdp_chanman_check_fds(chan_man, &instance); } /* UI sends data request event to cliprdr */ event = freerdp_event_new(FRDP_EVENT_TYPE_CB_DATA_REQUEST, event_process_callback, NULL); data_request_event = (FRDP_CB_DATA_REQUEST_EVENT*)event; data_request_event->format = CB_FORMAT_UNICODETEXT; event_processed = 0; freerdp_chanman_send_event(chan_man, "cliprdr", event); /* cliprdr sends data request PDU to server */ while (!event_processed) { freerdp_chanman_check_fds(chan_man, &instance); } /* server sends data response PDU to cliprdr */ freerdp_chanman_data(&instance, 0, (char*)test_data_response_data, sizeof(test_data_response_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_data_response_data) - 1); /* cliprdr sends data response event to UI */ while ((event = freerdp_chanman_pop_event(chan_man)) == NULL) { freerdp_chanman_check_fds(chan_man, &instance); } printf("Got event %d\n", event->event_type); CU_ASSERT(event->event_type == FRDP_EVENT_TYPE_CB_DATA_RESPONSE); if (event->event_type == FRDP_EVENT_TYPE_CB_DATA_RESPONSE) { data_response_event = (FRDP_CB_DATA_RESPONSE_EVENT*)event; printf("Data response size: %d\n", data_response_event->size); freerdp_hexdump(data_response_event->data, data_response_event->size); } freerdp_event_free(event); freerdp_chanman_close(chan_man, &instance); freerdp_chanman_free(chan_man); }
/* Returns "true" on errors or other reasons to not continue normal operation */ static int process_params(xfInfo * xfi, int argc, char ** argv, int * pindex) { rdpSet * settings; rdpKeyboardLayout * layouts; char * p; RD_PLUGIN_DATA plugin_data[MAX_PLUGIN_DATA + 1]; int index; int i, j; struct passwd * pw; int num_extensions; int rv; set_default_params(xfi); settings = xfi->settings; num_extensions = 0; p = getlogin(); i = sizeof(settings->username) - 1; if (p != 0) { strncpy(settings->username, p, i); } else { pw = getpwuid(getuid()); if (pw != 0) { if (pw->pw_name != 0) { strncpy(settings->username, pw->pw_name, i); } } } if (argc < *pindex + 1) { if (*pindex == 1) printf("no parameters specified\n"); return 1; } while (*pindex < argc) { if (strcmp("-a", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing server depth\n"); exit(XF_EXIT_WRONG_PARAM); } settings->server_depth = atoi(argv[*pindex]); } else if (strcmp("-u", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing username\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->username, argv[*pindex], sizeof(settings->username) - 1); settings->username[sizeof(settings->username) - 1] = 0; } else if (strcmp("-p", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing password\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->password, argv[*pindex], sizeof(settings->password) - 1); settings->password[sizeof(settings->password) - 1] = 0; settings->autologin = 1; /* * Overwrite original password which could be revealed by a simple "ps aux" command. * This approach won't hide the password length, but it is better than nothing. */ memset(argv[*pindex], '*', strlen(argv[*pindex])); } else if (strcmp("-d", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing domain\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->domain, argv[*pindex], sizeof(settings->domain) - 1); settings->domain[sizeof(settings->domain) - 1] = 0; } else if (strcmp("-k", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing keyboard layout ID\n"); exit(XF_EXIT_WRONG_PARAM); } sscanf(argv[*pindex], "%X", &(xfi->keyboard_layout_id)); DEBUG_X11("keyboard layout ID: %X", xfi->keyboard_layout_id); } else if (strcmp("-K", argv[*pindex]) == 0) { xfi->grab_keyboard = 0; } else if (strcmp("--kbd-list", argv[*pindex]) == 0) { layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD); printf("\nKeyboard Layouts\n"); for (i = 0; layouts[i].code; i++) printf("0x%08X\t%s\n", layouts[i].code, layouts[i].name); free(layouts); layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT); printf("\nKeyboard Layout Variants\n"); for (i = 0; layouts[i].code; i++) printf("0x%08X\t%s\n", layouts[i].code, layouts[i].name); free(layouts); layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME); printf("\nKeyboard Input Method Editors (IMEs)\n"); for (i = 0; layouts[i].code; i++) printf("0x%08X\t%s\n", layouts[i].code, layouts[i].name); free(layouts); return 1; } else if (strcmp("-s", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing shell\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->shell, argv[*pindex], sizeof(settings->shell) - 1); settings->shell[sizeof(settings->shell) - 1] = 0; } else if (strcmp("-c", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing directory\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->directory, argv[*pindex], sizeof(settings->directory) - 1); settings->directory[sizeof(settings->directory) - 1] = 0; } else if (strcmp("-g", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing width\n"); exit(XF_EXIT_WRONG_PARAM); } settings->width = strtol(argv[*pindex], &p, 10); if (*p == 'x') { settings->height = strtol(p + 1, &p, 10); } if (*p == '%') { xfi->percentscreen = settings->width; } } else if (strcmp("-t", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing port number\n"); exit(XF_EXIT_WRONG_PARAM); } settings->tcp_port_rdp = atoi(argv[*pindex]); } else if (strcmp("-T", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing window title\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(xfi->window_title, argv[*pindex], sizeof(xfi->window_title) - 1); xfi->window_title[sizeof(xfi->window_title) - 1] = 0; } else if (strcmp("-n", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing hostname\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->hostname, argv[*pindex], sizeof(settings->hostname) - 1); settings->hostname[sizeof(settings->hostname) - 1] = 0; } else if (strcmp("-o", argv[*pindex]) == 0) { settings->console_audio = 1; } else if (strcmp("-0", argv[*pindex]) == 0) { settings->console_session = 1; } else if (strcmp("-z", argv[*pindex]) == 0) { settings->bulk_compression = 1; } else if (strcmp("--gdi", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing GDI rendering\n"); return 1; } if (strncmp("sw", argv[*pindex], 1) == 0) /* Software */ { settings->software_gdi = 1; } else if (strncmp("hw", argv[*pindex], 1) == 0) /* Hardware */ { settings->software_gdi = 0; } else { printf("unknown GDI rendering\n"); return 1; } } else if (strcmp("--no-osb", argv[*pindex]) == 0) { settings->off_screen_bitmaps = 0; } else if (strcmp("--rfx", argv[*pindex]) == 0) { settings->rfx_flags = 1; settings->ui_decode_flags = 1; settings->use_frame_ack = 0; settings->server_depth = 32; settings->performanceflags = PERF_FLAG_NONE; xfi->codec = XF_CODEC_REMOTEFX; } else if (strcmp("--app", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing application name\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->app_name, argv[*pindex], sizeof(settings->app_name) - 1); settings->app_name[sizeof(settings->app_name) - 1] = 0; settings->remote_app = 1; } #ifdef HAVE_XV else if (strcmp("--xv-port", argv[*pindex]) == 0) { *pindex = *pindex + 1; xfi->xv_port = atoi(argv[*pindex]); } #endif else if (strcmp("-f", argv[*pindex]) == 0) { xfi->fullscreen = xfi->fs_toggle = 1; printf("full screen option\n"); } else if (strcmp("-D", argv[*pindex]) == 0) { xfi->decoration = 0; } else if (strcmp("-x", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing performance flag\n"); exit(XF_EXIT_WRONG_PARAM); } if (strncmp("m", argv[*pindex], 1) == 0) /* modem */ { settings->performanceflags = PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS | PERF_DISABLE_THEMING; } else if (strncmp("b", argv[*pindex], 1) == 0) /* broadband */ { settings->performanceflags = PERF_DISABLE_WALLPAPER; } else if (strncmp("l", argv[*pindex], 1) == 0) /* lan */ { settings->performanceflags = PERF_FLAG_NONE; } else { settings->performanceflags = strtol(argv[*pindex], 0, 16); } } else if (strcmp("-X", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing XID\n"); exit(XF_EXIT_WRONG_PARAM); } xfi->embed = strtoul(argv[*pindex], NULL, 16); if (!xfi->embed) { printf("bad XID\n"); exit(XF_EXIT_WRONG_PARAM); } } #ifndef DISABLE_TLS else if (strcmp("--no-rdp", argv[*pindex]) == 0) { settings->rdp_security = 0; } else if (strcmp("--no-tls", argv[*pindex]) == 0) { settings->tls_security = 0; } else if (strcmp("--no-nla", argv[*pindex]) == 0) { settings->nla_security = 0; } else if (strcmp("--sec", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing protocol security\n"); exit(XF_EXIT_WRONG_PARAM); } if (strncmp("rdp", argv[*pindex], 1) == 0) /* Standard RDP */ { settings->rdp_security = 1; settings->tls_security = 0; settings->nla_security = 0; } else if (strncmp("tls", argv[*pindex], 1) == 0) /* TLS */ { settings->rdp_security = 0; settings->tls_security = 1; settings->nla_security = 0; } else if (strncmp("nla", argv[*pindex], 1) == 0) /* NLA */ { settings->rdp_security = 0; settings->tls_security = 0; settings->nla_security = 1; } else { printf("unknown protocol security\n"); exit(XF_EXIT_WRONG_PARAM); } } #endif else if (strcmp("--plugin", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing plugin name\n"); exit(XF_EXIT_WRONG_PARAM); } index = *pindex; memset(plugin_data, 0, sizeof(plugin_data)); if (*pindex < argc - 1 && strcmp("--data", argv[*pindex + 1]) == 0) { *pindex = *pindex + 2; i = 0; while (*pindex < argc && strcmp("--", argv[*pindex]) != 0 && i < MAX_PLUGIN_DATA) { plugin_data[i].size = sizeof(RD_PLUGIN_DATA); for (j = 0, p = argv[*pindex]; j < 4 && p != NULL; j++) { plugin_data[i].data[j] = p; if (j < 3) { p = strchr(plugin_data[i].data[j], ':'); if (p != NULL) *p++ = 0; } } *pindex = *pindex + 1; i++; } } rv = freerdp_chanman_load_plugin(xfi->chan_man, settings, argv[index], plugin_data); if (rv) exit(XF_EXIT_WRONG_PARAM); } else if (strcmp("--ext", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing extension name\n"); exit(XF_EXIT_WRONG_PARAM); } if (num_extensions >= sizeof(settings->extensions) / sizeof(struct rdp_ext_set)) { printf("maximum extensions reached\n"); exit(XF_EXIT_WRONG_PARAM); } index = *pindex; snprintf(settings->extensions[num_extensions].name, sizeof(settings->extensions[num_extensions].name), "%s", argv[index]); settings->extensions[num_extensions].data = NULL; if (*pindex < argc - 1 && strcmp("--data", argv[*pindex + 1]) == 0) { *pindex = *pindex + 2; settings->extensions[num_extensions].data = argv[*pindex]; i = 0; while (*pindex < argc && strcmp("--", argv[*pindex]) != 0) { *pindex = *pindex + 1; i++; } } num_extensions++; } else if ((strcmp("-h", argv[*pindex]) == 0) || strcmp("--help", argv[*pindex]) == 0) { out_args(); return 1; } else if (strcmp("--version", argv[*pindex]) == 0) { printf("This is FreeRDP version %s\n", PACKAGE_VERSION); return 1; } else if (argv[*pindex][0] != '-') { settings->server[sizeof(settings->server) - 1] = 0; if (argv[*pindex][0] == '[' && (p = strchr(argv[*pindex], ']')) && (p[1] == 0 || (p[1] == ':' && !strchr(p + 2, ':')))) { /* Either "[...]" or "[...]:..." with at most one : after the brackets */ strncpy(settings->server, argv[*pindex] + 1, sizeof(settings->server) - 1); if ((p = strchr(settings->server, ']'))) { *p = 0; if (p[1] == ':') settings->tcp_port_rdp = atoi(p + 2); } } else { /* Port number is cut off and used if exactly one : in the string */ strncpy(settings->server, argv[*pindex], sizeof(settings->server) - 1); if ((p = strchr(settings->server, ':')) && !strchr(p + 1, ':')) { *p = 0; settings->tcp_port_rdp = atoi(p + 1); } } /* server is the last argument for the current session. arguments followed will be parsed for the next session. */ *pindex = *pindex + 1; return 0; } else { printf("invalid option: %s\n", argv[*pindex]); exit(XF_EXIT_WRONG_PARAM); } *pindex = *pindex + 1; } printf("missing server name\n"); exit(XF_EXIT_WRONG_PARAM); }
//----------------------------------------------------------------------------- void test_rail_plugin(void) { thread_param param; pthread_t thread; rdpChanMan* chan_man; rdpSettings settings = { 0 }; freerdp s_inst = { 0 }; freerdp* inst = &s_inst; int i; RAIL_UI_EVENT event; settings.hostname = "testhost"; inst->settings = &settings; inst->SendChannelData = emulate_client_send_channel_data; chan_man = freerdp_chanman_new(); freerdp_chanman_load_plugin(chan_man, &settings, "../channels/rail/rail.so", NULL); freerdp_chanman_pre_connect(chan_man, inst); freerdp_chanman_post_connect(chan_man, inst); param.chan_man = chan_man; param.instance = inst; param.th_count = 0; param.th_to_finish = 0; pthread_create(&thread, 0, thread_func, ¶m); // 1. Emulate server handshake binary EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_handshake); EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_exec_result_pdu); EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_sysparam1_pdu); EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_sysparam2_pdu); EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_localmovesize_start_pdu); EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_localmovesize_stop_pdu); EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_minmaxinfo_pdu); EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_langbar_pdu); EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_app_get_resp_pdu); // 2. Send UI events init_ui_event(&event, RAIL_UI_EVENT_UPDATE_CLIENT_SYSPARAM); event.param.sysparam_info.param = SPI_SETHIGHCONTRAST; event.param.sysparam_info.value.high_contrast_system_info.flags = 0x7e; event.param.sysparam_info.value.high_contrast_system_info.color_scheme = ""; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_UPDATE_CLIENT_SYSPARAM); event.param.sysparam_info.param = SPI_SETWORKAREA; event.param.sysparam_info.value.work_area.left = 0; event.param.sysparam_info.value.work_area.top = 0; event.param.sysparam_info.value.work_area.right = 0x0690; event.param.sysparam_info.value.work_area.bottom = 0x039a; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_UPDATE_CLIENT_SYSPARAM); event.param.sysparam_info.param = RAIL_SPI_TASKBARPOS; event.param.sysparam_info.value.taskbar_size.left = 0; event.param.sysparam_info.value.taskbar_size.top = 0x039a; event.param.sysparam_info.value.taskbar_size.right = 0x0690; event.param.sysparam_info.value.taskbar_size.bottom = 0x03c2; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_UPDATE_CLIENT_SYSPARAM); event.param.sysparam_info.param = SPI_SETMOUSEBUTTONSWAP; event.param.sysparam_info.value.left_right_mouse_buttons_swapped = False; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_UPDATE_CLIENT_SYSPARAM); event.param.sysparam_info.param = SPI_SETKEYBOARDPREF; event.param.sysparam_info.value.keyboard_for_user_prefered = False; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_UPDATE_CLIENT_SYSPARAM); event.param.sysparam_info.param = SPI_SETDRAGFULLWINDOWS; event.param.sysparam_info.value.full_window_drag_enabled = True; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_UPDATE_CLIENT_SYSPARAM); event.param.sysparam_info.param = SPI_SETKEYBOARDCUES; event.param.sysparam_info.value.full_window_drag_enabled = False; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_EXECUTE_REMOTE_APP); event.param.execute_info.exe_or_file = "||iexplore"; event.param.execute_info.working_directory = "f:\\windows\\system32"; event.param.execute_info.arguments = "www.bing.com"; event.param.execute_info.exec_or_file_is_file_path = False; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_ACTIVATE); event.param.activate_info.window_id = 0x0007008e; event.param.activate_info.enabled = True; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_SYS_COMMAND); event.param.syscommand_info.window_id = 0x00020052; event.param.syscommand_info.syscommand = 0x0f20; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_NOTIFY); event.param.notify_info.window_id = 0x000201aa; event.param.notify_info.notify_icon_id = 0x02; event.param.notify_info.message = 0x0204; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_WINDOW_MOVE); event.param.window_move_info.window_id = 0x00020020; event.param.window_move_info.new_position.left = 0x0309; event.param.window_move_info.new_position.top = 0x0100; event.param.window_move_info.new_position.right = 0x05db; event.param.window_move_info.new_position.bottom = 0x0188; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_SYSTEM_MENU); event.param.system_menu_info.window_id = 0x00090122; event.param.system_menu_info.left = 0xffa4; // TODO: WTF? event.param.system_menu_info.top = 0x024a; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_LANGBAR_INFO); event.param.langbar_info.status = 0x00000001; send_ui_event2plugin(chan_man, &event); init_ui_event(&event, RAIL_UI_EVENT_GET_APP_ID); event.param.get_app_id_info.window_id = 0x00020052; send_ui_event2plugin(chan_man, &event); // Waiting for possible events or data sleep(5); // Finishing thread and wait for it param.th_to_finish = 1; while (param.th_count > 0) { usleep(1000); } // We need to collected all events and data dumps and then to. // create CU_ASSERT series here! freerdp_chanman_close(chan_man, inst); freerdp_chanman_free(chan_man); }