diff --git a/channels/rail/rail_main.c b/channels/rail/rail_main.c index 9cac111a4..35842c61b 100644 --- a/channels/rail/rail_main.c +++ b/channels/rail/rail_main.c @@ -31,7 +31,7 @@ #include "rail_orders.h" #include "rail_main.h" -static void rail_send_channel_data(void* rail_object, void* data, size_t length) +void rail_send_channel_data(void* rail_object, void* data, size_t length) { STREAM* s = NULL; railPlugin* plugin = (railPlugin*) rail_object; @@ -59,16 +59,9 @@ static void rail_process_connect(rdpSvcPlugin* plugin) { railPlugin* rail = (railPlugin*) plugin; - rail->rail_event_sender.event_sender_object = rail; - rail->rail_event_sender.send_rail_channel_event = rail_send_channel_event; - - rail->rail_data_sender.data_sender_object = rail; - rail->rail_data_sender.send_rail_channel_data = rail_send_channel_data; - rail->rail_order = rail_order_new(); rail->rail_order->plugin_data = (RDP_PLUGIN_DATA*)plugin->channel_entry_points.pExtendedData; - rail->rail_order->data_sender = &(rail->rail_data_sender); - rail->rail_order->event_sender = &(rail->rail_event_sender); + rail->rail_order->plugin = rail; } static void rail_process_terminate(rdpSvcPlugin* plugin) diff --git a/channels/rail/rail_main.h b/channels/rail/rail_main.h index d744a25e8..e51d97f8a 100644 --- a/channels/rail/rail_main.h +++ b/channels/rail/rail_main.h @@ -26,25 +26,11 @@ #include #include -typedef struct _RAIL_CHANNEL_DATA_SENDER RAIL_CHANNEL_DATA_SENDER; -typedef struct _RAIL_CHANNEL_EVENT_SENDER RAIL_CHANNEL_EVENT_SENDER; - -struct _RAIL_CHANNEL_DATA_SENDER -{ - void* data_sender_object; - void (*send_rail_channel_data)(void* sender_object, void* data, size_t length); -}; - -struct _RAIL_CHANNEL_EVENT_SENDER -{ - void * event_sender_object; - void (*send_rail_channel_event)(void* ui_event_sender_object, uint16 event_type, void* param); -}; - struct rdp_rail_order { UNICONV* uniconv; RDP_PLUGIN_DATA* plugin_data; + void* plugin; RAIL_HANDSHAKE_ORDER handshake; RAIL_CLIENT_STATUS_ORDER client_status; RAIL_EXEC_ORDER exec; @@ -60,21 +46,18 @@ struct rdp_rail_order RAIL_LANGBAR_INFO_ORDER langbar_info; RAIL_GET_APPID_REQ_ORDER get_appid_req; RAIL_GET_APPID_RESP_ORDER get_appid_resp; - RAIL_CHANNEL_DATA_SENDER* data_sender; - RAIL_CHANNEL_EVENT_SENDER* event_sender; }; typedef struct rdp_rail_order rdpRailOrder; struct rail_plugin { rdpSvcPlugin plugin; - RAIL_CHANNEL_DATA_SENDER rail_data_sender; - RAIL_CHANNEL_EVENT_SENDER rail_event_sender; rdpRailOrder* rail_order; }; typedef struct rail_plugin railPlugin; void rail_send_channel_event(void* rail_object, uint16 event_type, void* param); +void rail_send_channel_data(void* rail_object, void* data, size_t length); #define WITH_DEBUG_RAIL 1 diff --git a/channels/rail/rail_orders.c b/channels/rail/rail_orders.c index 17947a7c3..5e38bf4a3 100644 --- a/channels/rail/rail_orders.c +++ b/channels/rail/rail_orders.c @@ -114,7 +114,7 @@ void rail_send_pdu(rdpRailOrder* rail_order, STREAM* s, uint16 orderType) printf("Sending %s PDU, length:%d\n", RAIL_ORDER_TYPE_STRINGS[((orderType & 0xF0) >> 3) + (orderType & 0x0F)], orderLength); - rail_order->data_sender->send_rail_channel_data(rail_order->data_sender->data_sender_object, s->data, orderLength); + rail_send_channel_data(rail_order->plugin, s->data, orderLength); } void rail_write_high_contrast(STREAM* s, HIGH_CONTRAST* high_contrast) @@ -328,37 +328,38 @@ void rail_recv_handshake_order(rdpRailOrder* rail_order, STREAM* s) rail_order->sysparam.params = 0; - rail_order->sysparam.params |= SPI_SET_HIGH_CONTRAST; + rail_order->sysparam.params |= SPI_MASK_SET_HIGH_CONTRAST; rail_order->sysparam.highContrast.colorScheme.string = NULL; rail_order->sysparam.highContrast.colorScheme.length = 0; rail_order->sysparam.highContrast.flags = 0x7E; - rail_order->sysparam.params |= SPI_TASKBAR_POS; - rail_order->sysparam.taskbarPos.left = 0; - rail_order->sysparam.taskbarPos.top = 0; - rail_order->sysparam.taskbarPos.right = 1024; - rail_order->sysparam.taskbarPos.bottom = 29; - - rail_order->sysparam.params |= SPI_SET_MOUSE_BUTTON_SWAP; + rail_order->sysparam.params |= SPI_MASK_SET_MOUSE_BUTTON_SWAP; rail_order->sysparam.mouseButtonSwap = False; - rail_order->sysparam.params |= SPI_SET_KEYBOARD_PREF; + rail_order->sysparam.params |= SPI_MASK_SET_KEYBOARD_PREF; rail_order->sysparam.keyboardPref = False; - rail_order->sysparam.params |= SPI_SET_DRAG_FULL_WINDOWS; + rail_order->sysparam.params |= SPI_MASK_SET_DRAG_FULL_WINDOWS; rail_order->sysparam.dragFullWindows = True; - rail_order->sysparam.params |= SPI_SET_KEYBOARD_CUES; + rail_order->sysparam.params |= SPI_MASK_SET_KEYBOARD_CUES; rail_order->sysparam.keyboardCues = False; - rail_order->sysparam.params |= SPI_SET_WORK_AREA; + rail_order->sysparam.params |= SPI_MASK_SET_WORK_AREA; rail_order->sysparam.workArea.left = 0; rail_order->sysparam.workArea.top = 0; rail_order->sysparam.workArea.right = 1024; rail_order->sysparam.workArea.bottom = 768; - rail_send_channel_event(rail_order->event_sender->event_sender_object, - RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS, (void*) &rail_order->sysparam); + rail_send_channel_event(rail_order->plugin, + RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS, (void*) &rail_order->sysparam); +} + +void rail_recv_exec_result_order(rdpRailOrder* rail_order, STREAM* s) +{ + rail_read_server_exec_result_order(s, &rail_order->exec_result); + rail_send_channel_event(rail_order->plugin, + RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS, (void*) &rail_order->exec_result); } void rail_order_recv(rdpRailOrder* rail_order, STREAM* s) @@ -378,7 +379,7 @@ void rail_order_recv(rdpRailOrder* rail_order, STREAM* s) break; case RDP_RAIL_ORDER_EXEC_RESULT: - rail_read_server_exec_result_order(s, &rail_order->exec_result); + rail_recv_exec_result_order(rail_order, s); break; case RDP_RAIL_ORDER_SYSPARAM: @@ -471,43 +472,43 @@ void rail_send_client_sysparam_order(rdpRailOrder* rail_order) void rail_send_client_sysparams_order(rdpRailOrder* rail_order) { - if (rail_order->sysparam.params & SPI_SET_HIGH_CONTRAST) + if (rail_order->sysparam.params & SPI_MASK_SET_HIGH_CONTRAST) { rail_order->sysparam.param = SPI_SET_HIGH_CONTRAST; rail_send_client_sysparam_order(rail_order); } - if (rail_order->sysparam.params & SPI_TASKBAR_POS) + if (rail_order->sysparam.params & SPI_MASK_TASKBAR_POS) { rail_order->sysparam.param = SPI_TASKBAR_POS; rail_send_client_sysparam_order(rail_order); } - if (rail_order->sysparam.params & SPI_SET_MOUSE_BUTTON_SWAP) + if (rail_order->sysparam.params & SPI_MASK_SET_MOUSE_BUTTON_SWAP) { rail_order->sysparam.param = SPI_SET_MOUSE_BUTTON_SWAP; rail_send_client_sysparam_order(rail_order); } - if (rail_order->sysparam.params & SPI_SET_KEYBOARD_PREF) + if (rail_order->sysparam.params & SPI_MASK_SET_KEYBOARD_PREF) { rail_order->sysparam.param = SPI_SET_KEYBOARD_PREF; rail_send_client_sysparam_order(rail_order); } - if (rail_order->sysparam.params & SPI_SET_DRAG_FULL_WINDOWS) + if (rail_order->sysparam.params & SPI_MASK_SET_DRAG_FULL_WINDOWS) { rail_order->sysparam.param = SPI_SET_DRAG_FULL_WINDOWS; rail_send_client_sysparam_order(rail_order); } - if (rail_order->sysparam.params & SPI_SET_KEYBOARD_CUES) + if (rail_order->sysparam.params & SPI_MASK_SET_KEYBOARD_CUES) { rail_order->sysparam.param = SPI_SET_KEYBOARD_CUES; rail_send_client_sysparam_order(rail_order); } - if (rail_order->sysparam.params & SPI_SET_WORK_AREA) + if (rail_order->sysparam.params & SPI_MASK_SET_WORK_AREA) { rail_order->sysparam.param = SPI_SET_WORK_AREA; rail_send_client_sysparam_order(rail_order); diff --git a/client/X11/xf_rail.c b/client/X11/xf_rail.c index 877ab7625..86e60680b 100644 --- a/client/X11/xf_rail.c +++ b/client/X11/xf_rail.c @@ -120,6 +120,29 @@ void xf_process_rail_get_sysparams_event(xfInfo* xfi, rdpChanMan* chanman, RDP_E freerdp_chanman_send_event(chanman, new_event); } +void xf_process_rail_exec_result_event(xfInfo* xfi, rdpChanMan* chanman, RDP_EVENT* event) +{ + RAIL_EXEC_RESULT_ORDER * exec_result; + const char* error_code_names[] = + { + "RAIL_EXEC_S_OK", + "RAIL_EXEC_E_HOOK_NOT_LOADED", + "RAIL_EXEC_E_DECODE_FAILED", + "RAIL_EXEC_E_NOT_IN_ALLOWLIST", + "RAIL_EXEC_E_FILE_NOT_FOUND", + "RAIL_EXEC_E_FAIL", + "RAIL_EXEC_E_SESSION_LOCKED" + }; + + exec_result = (RAIL_EXEC_RESULT_ORDER *)event->user_data; + + if (exec_result->execResult != RAIL_EXEC_S_OK) + { + printf("RAIL exec error: execResult=%s NtError=0x%X\n", + error_code_names[exec_result->execResult], exec_result->rawResult); + } +} + void xf_process_rail_event(xfInfo* xfi, rdpChanMan* chanman, RDP_EVENT* event) { switch (event->event_type) @@ -128,6 +151,10 @@ void xf_process_rail_event(xfInfo* xfi, rdpChanMan* chanman, RDP_EVENT* event) xf_process_rail_get_sysparams_event(xfi, chanman, event); break; + case RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS: + xf_process_rail_exec_result_event(xfi, chanman, event); + break; + default: break; } diff --git a/include/freerdp/rail.h b/include/freerdp/rail.h index 8ce9908ee..5ea48b9bb 100644 --- a/include/freerdp/rail.h +++ b/include/freerdp/rail.h @@ -66,6 +66,22 @@ #define SPI_SET_SCREEN_SAVE_ACTIVE 0x00000011 #define SPI_SET_SCREEN_SAVE_SECURE 0x00000077 +/*Bit mask values for SPI_ parameters*/ +enum SPI_MASK +{ + SPI_MASK_SET_DRAG_FULL_WINDOWS = 0x00000001, + SPI_MASK_SET_KEYBOARD_CUES = 0x00000002, + SPI_MASK_SET_KEYBOARD_PREF = 0x00000004, + SPI_MASK_SET_MOUSE_BUTTON_SWAP = 0x00000008, + SPI_MASK_SET_WORK_AREA = 0x00000010, + SPI_MASK_DISPLAY_CHANGE = 0x00000020, + SPI_MASK_TASKBAR_POS = 0x00000040, + SPI_MASK_SET_HIGH_CONTRAST = 0x00000080, + SPI_MASK_SET_SCREEN_SAVE_ACTIVE = 0x00000100, + SPI_MASK_SET_SET_SCREEN_SAVE_SECURE = 0x00000200 +}; + + /* Client System Command PDU */ #define SC_SIZE 0xF000 #define SC_MOVE 0xF010 @@ -314,7 +330,8 @@ enum RDP_RAIL_PDU_TYPE enum RDP_EVENT_TYPE_RAIL { RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS = 1, - RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS = 2 + RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS = 2, + RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS = 3 }; #endif /* __RAIL_GLOBAL_H */