Example #1
0
//-----------------------------------------------------------------------------
void test_rail_plugin(void)
{
	thread_param param;
	pthread_t thread;

	rdpChannels* chan_man;
	rdpSettings settings = { 0 };
	freerdp s_inst = { 0 };
	freerdp* inst = &s_inst;
	size_t sn = 0;
	size_t en = 0;
	STREAM* ss = NULL;
	RAIL_EVENT* ee = NULL;

	printf("\n");

	settings.hostname = "testhost";
	inst->settings = &settings;
	inst->SendChannelData = emulate_client_send_channel_data;

	chan_man = freerdp_channels_new();

	freerdp_channels_load_plugin(chan_man, &settings, "../channels/rail/rail.so", NULL);
	freerdp_channels_pre_connect(chan_man, inst);
	freerdp_channels_post_connect(chan_man, inst);

	memset(&param, 0, sizeof(param));

	param.chan_man = chan_man;
	param.instance = inst;
	param.th_count = 0;
	param.th_to_finish = 0;

	global_thread_params = &param;

	pthread_create(&thread, 0, thread_func, &param);

	// 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

	param.out_rail_orders.sysparam.params = 0;

	param.out_rail_orders.sysparam.params |= SPI_MASK_SET_HIGH_CONTRAST;
	param.out_rail_orders.sysparam.highContrast.flags = 0x7e;
	param.out_rail_orders.sysparam.highContrast.colorScheme.length = 0;
	param.out_rail_orders.sysparam.highContrast.colorScheme.string = NULL;

	param.out_rail_orders.sysparam.params |= SPI_MASK_TASKBAR_POS;
	param.out_rail_orders.sysparam.taskbarPos.left = 0;
	param.out_rail_orders.sysparam.taskbarPos.top = 0x039a;
	param.out_rail_orders.sysparam.taskbarPos.right = 0x0690;
	param.out_rail_orders.sysparam.taskbarPos.bottom = 0x03c2;

	param.out_rail_orders.sysparam.params |= SPI_MASK_SET_MOUSE_BUTTON_SWAP;
	param.out_rail_orders.sysparam.mouseButtonSwap = False;

	param.out_rail_orders.sysparam.params |= SPI_MASK_SET_KEYBOARD_PREF;
	param.out_rail_orders.sysparam.keyboardPref = False;

	param.out_rail_orders.sysparam.params |= SPI_MASK_SET_DRAG_FULL_WINDOWS;
	param.out_rail_orders.sysparam.dragFullWindows = True;

	param.out_rail_orders.sysparam.params |= SPI_MASK_SET_KEYBOARD_CUES;
	param.out_rail_orders.sysparam.keyboardCues = False;

	param.out_rail_orders.sysparam.params |= SPI_MASK_SET_WORK_AREA;
	param.out_rail_orders.sysparam.workArea.left = 0;
	param.out_rail_orders.sysparam.workArea.top = 0;
	param.out_rail_orders.sysparam.workArea.right = 0x0690;
	param.out_rail_orders.sysparam.workArea.bottom = 0x039a;

	send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS,
		&param.out_rail_orders.sysparam);

	param.plugin_data.size = sizeof(RDP_PLUGIN_DATA);
	param.plugin_data.data[0] = "||iexplore";
	param.plugin_data.data[1] = "f:\\windows\\system32";
	param.plugin_data.data[2] = "www.bing.com";
	send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_EXEC_REMOTE_APP,
		&param.plugin_data);

	param.out_rail_orders.activate.enabled = True;
	param.out_rail_orders.activate.windowId = 0x0007008e;
	send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_ACTIVATE,
		&param.out_rail_orders.activate);

	param.out_rail_orders.syscommand.windowId = 0x00020052;
	param.out_rail_orders.syscommand.command  = 0xf020;
	send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_SYSCOMMAND,
		&param.out_rail_orders.syscommand);

	param.out_rail_orders.notify_event.windowId = 0x000201aa;
	param.out_rail_orders.notify_event.notifyIconId = 0x02;
	param.out_rail_orders.notify_event.message = 0x0204;
	send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_NOTIFY_EVENT,
		&param.out_rail_orders.notify_event);


	param.out_rail_orders.window_move.windowId = 0x00020020;
	param.out_rail_orders.window_move.left = 0x0309;
	param.out_rail_orders.window_move.top = 0x0100;
	param.out_rail_orders.window_move.right = 0x05db;
	param.out_rail_orders.window_move.bottom = 0x0188;
	send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE,
		&param.out_rail_orders.window_move);

	param.out_rail_orders.sysmenu.windowId = 0x00090122;
	param.out_rail_orders.sysmenu.left = 0xffa4; // TODO: possible negative values?
	param.out_rail_orders.sysmenu.top = 0x024a;
	send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_SYSMENU,
		&param.out_rail_orders.sysmenu);

	param.out_rail_orders.langbar_info.languageBarStatus = 0x00000001;
	send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_LANGBARINFO,
		&param.out_rail_orders.langbar_info);

	param.out_rail_orders.get_appid_req.windowId = 0x00020052;
	send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_APPID_REQ,
		&param.out_rail_orders.get_appid_req);

	// Waiting for possible events or data
	sleep(1);

	// 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!
	sn = param.in_streams_number;
	en = param.in_events_number;
	ss = &param.in_streams[0];
	ee = &param.in_events[0];

	CU_ASSERT(sn > 0 && STREAM_EQUAL_TO_DUMP(&ss[ 0], client_handshake));
	CU_ASSERT(sn > 1 && STREAM_EQUAL_TO_DUMP(&ss[ 1], client_info_pdu));
	CU_ASSERT(sn > 2 && STREAM_EQUAL_TO_DUMP(&ss[ 2], client_sysparam_highcontrast_pdu));
	CU_ASSERT(sn > 3 && STREAM_EQUAL_TO_DUMP(&ss[ 3], client_sysparam_taskbarpos_pdu));
	CU_ASSERT(sn > 4 && STREAM_EQUAL_TO_DUMP(&ss[ 4], client_sysparam_mousebuttonswap_pdu));
	CU_ASSERT(sn > 5 && STREAM_EQUAL_TO_DUMP(&ss[ 5], client_sysparam_keyboardpref_pdu));
	CU_ASSERT(sn > 6 && STREAM_EQUAL_TO_DUMP(&ss[ 6], client_sysparam_dragfullwindow_pdu));
	CU_ASSERT(sn > 7 && STREAM_EQUAL_TO_DUMP(&ss[ 7], client_sysparam_keyboardcues_pdu));
	CU_ASSERT(sn > 8 && STREAM_EQUAL_TO_DUMP(&ss[ 8], client_sysparam_setworkarea_pdu));
	CU_ASSERT(sn > 9 && STREAM_EQUAL_TO_DUMP(&ss[ 9], client_execute_pdu));
	CU_ASSERT(sn >10 && STREAM_EQUAL_TO_DUMP(&ss[10], client_activate_pdu));
	CU_ASSERT(sn >11 && STREAM_EQUAL_TO_DUMP(&ss[11], client_syscommand_pdu));
	CU_ASSERT(sn >12 && STREAM_EQUAL_TO_DUMP(&ss[12], client_notify_pdu));
	CU_ASSERT(sn >13 && STREAM_EQUAL_TO_DUMP(&ss[13], client_windowmove_pdu));
	CU_ASSERT(sn >14 && STREAM_EQUAL_TO_DUMP(&ss[14], client_system_menu_pdu));
	CU_ASSERT(sn >15 && STREAM_EQUAL_TO_DUMP(&ss[15], client_langbar_pdu));
	CU_ASSERT(sn >16 && STREAM_EQUAL_TO_DUMP(&ss[16], client_get_app_id_req_pdu));

	CU_ASSERT(en >  0 && ee[ 0].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS);
	CU_ASSERT(en >  1 &&
		ee[ 1].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS &&
		ee[ 1].order_info.exec_result.flags == 0x08 &&
		ee[ 1].order_info.exec_result.execResult == 0x03 &&
		UNICODE_STRING_EQUAL_TO_DUMP(
			&ee[ 1].order_info.exec_result.exeOrFile,
			server_exec_result_exe_or_file)
		);
	CU_ASSERT(en >  2 &&
		ee[ 2].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM &&
		ee[ 2].order_info.sysparam.setScreenSaveSecure == False
		);

	CU_ASSERT(en >  3 &&
		ee[ 3].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM &&
		ee[ 3].order_info.sysparam.setScreenSaveActive == False
		);

	CU_ASSERT(en >  4 &&
		ee[ 4].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE &&
		ee[ 4].order_info.localmovesize.windowId == 0x0007008e &&
		ee[ 4].order_info.localmovesize.isMoveSizeStart == True &&
		ee[ 4].order_info.localmovesize.moveSizeType == RAIL_WMSZ_MOVE &&
		ee[ 4].order_info.localmovesize.posX == 0x017e &&
		ee[ 4].order_info.localmovesize.posY == 0x000a
		);

	CU_ASSERT(en >  5 &&
		ee[ 5].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE &&
		ee[ 5].order_info.localmovesize.windowId == 0x0007008e &&
		ee[ 5].order_info.localmovesize.isMoveSizeStart == False &&
		ee[ 5].order_info.localmovesize.moveSizeType == RAIL_WMSZ_MOVE &&
		ee[ 5].order_info.localmovesize.posX == 0x00a6 &&
		ee[ 5].order_info.localmovesize.posY == 0x0044
		);

	CU_ASSERT(en >  6 &&
		ee[ 6].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO &&
		ee[ 6].order_info.minmaxinfo.windowId == 0x0007008e &&
		ee[ 6].order_info.minmaxinfo.maxWidth == 0x0408 &&
		ee[ 6].order_info.minmaxinfo.maxHeight == 0x02d6 &&
		ee[ 6].order_info.minmaxinfo.maxPosX ==  0x0000 &&
		ee[ 6].order_info.minmaxinfo.maxPosY ==  0x0000 &&
		ee[ 6].order_info.minmaxinfo.minTrackWidth ==  0x0070 &&
		ee[ 6].order_info.minmaxinfo.minTrackHeight ==  0x001b &&
		ee[ 6].order_info.minmaxinfo.maxTrackWidth ==  0x040c &&
		ee[ 6].order_info.minmaxinfo.maxTrackHeight ==  0x030c
		);

	CU_ASSERT(en >  7 &&
		ee[ 7].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO &&
		ee[ 7].order_info.langbar_info.languageBarStatus == TF_SFT_SHOWNORMAL
		);

	CU_ASSERT(en >  8 &&
		ee[ 8].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP &&
		ee[ 8].order_info.get_appid_resp.windowId == 0x00020052 &&
		UNICODE_STRING_EQUAL_TO_DUMP(
			&ee[ 8].order_info.get_appid_resp.applicationId,
			server_app_get_resp_app_id
			)
		);

	freerdp_channels_close(chan_man, inst);
	freerdp_channels_free(chan_man);
}
Example #2
0
//-----------------------------------------------------------------------------
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, &param);


	// 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);
}