//----------------------------------------------------------------------------- void save_event(RDP_EVENT* event, RAIL_EVENT* rail_event) { rail_event->event_type = event->event_type; switch (event->event_type) { case RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS: printf("UI receive Get Sysparams Event\n"); break; case RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS: { RAIL_EXEC_RESULT_ORDER* exec_result = (RAIL_EXEC_RESULT_ORDER*)event->user_data; printf("UI receive Exec Results Event\n"); memcpy(&rail_event->order_info.exec_result, event->user_data, sizeof(RAIL_EXEC_RESULT_ORDER)); rail_unicode_string_alloc(&rail_event->order_info.exec_result.exeOrFile, exec_result->exeOrFile.length); memcpy(rail_event->order_info.exec_result.exeOrFile.string, exec_result->exeOrFile.string, exec_result->exeOrFile.length); } break; case RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM: printf("UI receive Server Sysparam Event\n"); memcpy(&rail_event->order_info.sysparam, event->user_data, sizeof(RAIL_SYSPARAM_ORDER)); break; case RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO: printf("UI receive Server Minmax Info Event\n"); memcpy(&rail_event->order_info.minmaxinfo, event->user_data, sizeof(RAIL_MINMAXINFO_ORDER)); break; case RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE: printf("UI receive Server Local Movesize Event\n"); memcpy(&rail_event->order_info.localmovesize, event->user_data, sizeof(RAIL_LOCALMOVESIZE_ORDER)); break; case RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP: printf("UI receive AppId Response Event\n"); memcpy(&rail_event->order_info.get_appid_resp, event->user_data, sizeof(RAIL_GET_APPID_RESP_ORDER)); rail_event->order_info.get_appid_resp.applicationId.string = &rail_event->order_info.get_appid_resp.applicationIdBuffer[0]; break; case RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO: printf("UI receive Language Info Event\n"); memcpy(&rail_event->order_info.langbar_info, event->user_data, sizeof(RAIL_LANGBAR_INFO_ORDER)); break; } }
void* rail_clone_order(UINT32 event_type, void* order) { struct { UINT32 type; UINT32 size; } ordersize_table[] = { {RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS, sizeof(RAIL_SYSPARAM_ORDER)}, {RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS, sizeof(RAIL_EXEC_RESULT_ORDER)}, {RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM, sizeof(RAIL_SYSPARAM_ORDER)}, {RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO, sizeof(RAIL_MINMAXINFO_ORDER)}, {RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE, sizeof(RAIL_LOCALMOVESIZE_ORDER)}, {RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP, sizeof(RAIL_GET_APPID_RESP_ORDER)}, {RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO, sizeof(RAIL_LANGBAR_INFO_ORDER)}, {RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS, sizeof(RAIL_SYSPARAM_ORDER)}, {RDP_EVENT_TYPE_RAIL_CLIENT_EXEC_REMOTE_APP, sizeof(RDP_PLUGIN_DATA)}, {RDP_EVENT_TYPE_RAIL_CLIENT_ACTIVATE, sizeof(RAIL_ACTIVATE_ORDER)}, {RDP_EVENT_TYPE_RAIL_CLIENT_SYSMENU, sizeof(RAIL_SYSMENU_ORDER)}, {RDP_EVENT_TYPE_RAIL_CLIENT_SYSCOMMAND, sizeof(RAIL_SYSCOMMAND_ORDER)}, {RDP_EVENT_TYPE_RAIL_CLIENT_NOTIFY_EVENT, sizeof(RAIL_NOTIFY_EVENT_ORDER)}, {RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE, sizeof(RAIL_WINDOW_MOVE_ORDER)}, {RDP_EVENT_TYPE_RAIL_CLIENT_APPID_REQ, sizeof(RAIL_GET_APPID_REQ_ORDER)}, {RDP_EVENT_TYPE_RAIL_CLIENT_LANGBARINFO, sizeof(RAIL_LANGBAR_INFO_ORDER)}, }; size_t i = 0; size_t order_size = 0; void* new_order = NULL; for (i = 0; i < ARRAYSIZE(ordersize_table); i++) { if (event_type == ordersize_table[i].type) { order_size = ordersize_table[i].size; break; } } // Event type not found. if (order_size == 0) return NULL; new_order = malloc(order_size); memcpy(new_order, order, order_size); //printf("rail_clone_order: type=%d order=%p\n", event_type, new_order); // Create copy of variable data for some orders if ((event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS) || (event_type == RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS)) { RAIL_SYSPARAM_ORDER* new_sysparam = (RAIL_SYSPARAM_ORDER*)new_order; RAIL_SYSPARAM_ORDER* old_sysparam = (RAIL_SYSPARAM_ORDER*)order; rail_unicode_string_alloc(&new_sysparam->highContrast.colorScheme, old_sysparam->highContrast.colorScheme.length); memcpy(new_sysparam->highContrast.colorScheme.string, old_sysparam->highContrast.colorScheme.string, old_sysparam->highContrast.colorScheme.length); } if (event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS) { RAIL_EXEC_RESULT_ORDER* new_exec_result = (RAIL_EXEC_RESULT_ORDER*)new_order; RAIL_EXEC_RESULT_ORDER* old_exec_result = (RAIL_EXEC_RESULT_ORDER*)order; rail_unicode_string_alloc(&new_exec_result->exeOrFile, old_exec_result->exeOrFile.length); memcpy(new_exec_result->exeOrFile.string, old_exec_result->exeOrFile.string, old_exec_result->exeOrFile.length); } if (event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP) { RAIL_GET_APPID_RESP_ORDER* new_app_resp = (RAIL_GET_APPID_RESP_ORDER*)new_order; new_app_resp->applicationId.string = &new_app_resp->applicationIdBuffer[0]; } return new_order; }
void* rail_clone_order(UINT32 event_type, void* order) { struct { UINT32 type; UINT32 size; } ordersize_table[] = { {RailChannel_GetSystemParam, sizeof(RAIL_SYSPARAM_ORDER)}, {RailChannel_ServerExecuteResult, sizeof(RAIL_EXEC_RESULT_ORDER)}, {RailChannel_ServerSystemParam, sizeof(RAIL_SYSPARAM_ORDER)}, {RailChannel_ServerMinMaxInfo, sizeof(RAIL_MINMAXINFO_ORDER)}, {RailChannel_ServerLocalMoveSize, sizeof(RAIL_LOCALMOVESIZE_ORDER)}, {RailChannel_ServerGetAppIdResponse, sizeof(RAIL_GET_APPID_RESP_ORDER)}, {RailChannel_ServerLanguageBarInfo, sizeof(RAIL_LANGBAR_INFO_ORDER)}, {RailChannel_ClientSystemParam, sizeof(RAIL_SYSPARAM_ORDER)}, {RailChannel_ClientExecute, sizeof(RDP_PLUGIN_DATA)}, {RailChannel_ClientActivate, sizeof(RAIL_ACTIVATE_ORDER)}, {RailChannel_ClientSystemMenu, sizeof(RAIL_SYSMENU_ORDER)}, {RailChannel_ClientSystemCommand, sizeof(RAIL_SYSCOMMAND_ORDER)}, {RailChannel_ClientNotifyEvent, sizeof(RAIL_NOTIFY_EVENT_ORDER)}, {RailChannel_ClientWindowMove, sizeof(RAIL_WINDOW_MOVE_ORDER)}, {RailChannel_ClientGetAppIdRequest, sizeof(RAIL_GET_APPID_REQ_ORDER)}, {RailChannel_ClientLanguageBarInfo, sizeof(RAIL_LANGBAR_INFO_ORDER)}, }; size_t i = 0; size_t order_size = 0; void* new_order = NULL; for (i = 0; i < ARRAYSIZE(ordersize_table); i++) { if (event_type == ordersize_table[i].type) { order_size = ordersize_table[i].size; break; } } // Event type not found. if (order_size == 0) return NULL; new_order = malloc(order_size); CopyMemory(new_order, order, order_size); //fprintf(stderr, "rail_clone_order: type=%d order=%p\n", event_type, new_order); // Create copy of variable data for some orders if ((event_type == RailChannel_GetSystemParam) || (event_type == RailChannel_ClientSystemParam)) { RAIL_SYSPARAM_ORDER* new_sysparam = (RAIL_SYSPARAM_ORDER*) new_order; RAIL_SYSPARAM_ORDER* old_sysparam = (RAIL_SYSPARAM_ORDER*) order; rail_unicode_string_alloc(&new_sysparam->highContrast.colorScheme, old_sysparam->highContrast.colorScheme.length); CopyMemory(new_sysparam->highContrast.colorScheme.string, old_sysparam->highContrast.colorScheme.string, old_sysparam->highContrast.colorScheme.length); } if (event_type == RailChannel_ServerExecuteResult) { RAIL_EXEC_RESULT_ORDER* new_exec_result = (RAIL_EXEC_RESULT_ORDER*) new_order; RAIL_EXEC_RESULT_ORDER* old_exec_result = (RAIL_EXEC_RESULT_ORDER*) order; rail_unicode_string_alloc(&new_exec_result->exeOrFile, old_exec_result->exeOrFile.length); CopyMemory(new_exec_result->exeOrFile.string, old_exec_result->exeOrFile.string, old_exec_result->exeOrFile.length); } if (event_type == RailChannel_ServerGetAppIdResponse) { RAIL_GET_APPID_RESP_ORDER* new_app_resp = (RAIL_GET_APPID_RESP_ORDER*)new_order; new_app_resp->applicationId.string = &new_app_resp->applicationIdBuffer[0]; } return new_order; }