commit
9e42276d1b
@ -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)
|
||||
|
@ -26,25 +26,11 @@
|
||||
#include <freerdp/utils/stream.h>
|
||||
#include <freerdp/utils/svc_plugin.h>
|
||||
|
||||
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
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user