summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libxrdp/libxrdp.c11
-rw-r--r--libxrdp/libxrdp.h3
-rw-r--r--libxrdp/libxrdpinc.h3
-rw-r--r--libxrdp/xrdp_rdp.c40
-rw-r--r--neutrinordp/xrdp-neutrinordp.c27
-rw-r--r--neutrinordp/xrdp-neutrinordp.h27
-rw-r--r--xrdp/xrdp.h3
-rw-r--r--xrdp/xrdp_mm.c12
-rw-r--r--xrdp/xrdp_types.h4
9 files changed, 126 insertions, 4 deletions
diff --git a/libxrdp/libxrdp.c b/libxrdp/libxrdp.c
index 827b1247..d81a56d5 100644
--- a/libxrdp/libxrdp.c
+++ b/libxrdp/libxrdp.c
@@ -1487,6 +1487,17 @@ libxrdp_fastpath_send_frame_marker(struct xrdp_session *session,
}
free_stream(s);
return 0;
+}
+/*****************************************************************************/
+int EXPORT_CC
+libxrdp_send_session_info(struct xrdp_session *session, const char *data,
+ int data_bytes)
+{
+ struct xrdp_rdp *rdp;
+
+ LLOGLN(10, ("libxrdp_send_session_info:"));
+ rdp = (struct xrdp_rdp *) (session->rdp);
+ return xrdp_rdp_send_session_info(rdp, data, data_bytes);
}
diff --git a/libxrdp/libxrdp.h b/libxrdp/libxrdp.h
index 857abc99..9b781c5c 100644
--- a/libxrdp/libxrdp.h
+++ b/libxrdp/libxrdp.h
@@ -402,6 +402,9 @@ int APP_CC
xrdp_rdp_disconnect(struct xrdp_rdp *self);
int APP_CC
xrdp_rdp_send_deactivate(struct xrdp_rdp *self);
+int APP_CC
+xrdp_rdp_send_session_info(struct xrdp_rdp *self, const char *data,
+ int data_bytes);
/* xrdp_orders.c */
struct xrdp_orders * APP_CC
diff --git a/libxrdp/libxrdpinc.h b/libxrdp/libxrdpinc.h
index 275b674a..bd4f89dc 100644
--- a/libxrdp/libxrdpinc.h
+++ b/libxrdp/libxrdpinc.h
@@ -247,5 +247,8 @@ libxrdp_fastpath_send_surface(struct xrdp_session *session,
int EXPORT_CC
libxrdp_fastpath_send_frame_marker(struct xrdp_session *session,
int frame_action, int frame_id);
+int EXPORT_CC
+libxrdp_send_session_info(struct xrdp_session *session, const char *data,
+ int data_bytes);
#endif
diff --git a/libxrdp/xrdp_rdp.c b/libxrdp/xrdp_rdp.c
index ca82df70..5159ba5b 100644
--- a/libxrdp/xrdp_rdp.c
+++ b/libxrdp/xrdp_rdp.c
@@ -1275,3 +1275,43 @@ xrdp_rdp_send_deactivate(struct xrdp_rdp *self)
DEBUG(("out xrdp_rdp_send_deactivate"));
return 0;
}
+
+/*****************************************************************************/
+int APP_CC
+xrdp_rdp_send_session_info(struct xrdp_rdp *self, const char *data,
+ int data_bytes)
+{
+ struct stream *s;
+
+ LLOGLN(0, ("xrdp_rdp_send_session_info: data_bytes %d", data_bytes));
+ make_stream(s);
+ init_stream(s, 8192);
+
+ if (xrdp_rdp_init_data(self, s) != 0)
+ {
+ free_stream(s);
+ return 1;
+ }
+
+ if (s_check_rem_out(s, data_bytes))
+ {
+ out_uint8a(s, data, data_bytes);
+ }
+ else
+ {
+ free_stream(s);
+ return 1;
+ }
+
+ s_mark_end(s);
+
+ if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_LOGON) != 0)
+ {
+ free_stream(s);
+ return 1;
+ }
+
+ free_stream(s);
+ return 0;
+}
+
diff --git a/neutrinordp/xrdp-neutrinordp.c b/neutrinordp/xrdp-neutrinordp.c
index 37b4eefb..b93b5fc0 100644
--- a/neutrinordp/xrdp-neutrinordp.c
+++ b/neutrinordp/xrdp-neutrinordp.c
@@ -1955,6 +1955,28 @@ lfreerdp_verify_certificate(freerdp *instance, char *subject, char *issuer,
}
/******************************************************************************/
+static int DEFAULT_CC
+lfreerdp_session_info(freerdp* instance, uint8* data, int data_bytes)
+{
+ struct mod *mod;
+ int error;
+
+ LLOGLN(10, ("lfreerdp_session_info:"));
+ error = 0;
+ mod = ((struct mod_context *)(instance->context))->modi;
+ if (mod != 0)
+ {
+ LLOGLN(10, ("lfreerdp_session_info: mod->server_session_info %p",
+ mod->server_session_info));
+ if (mod->server_session_info != 0)
+ {
+ error = mod->server_session_info(mod, (char *)data, data_bytes);
+ }
+ }
+ return error;
+}
+
+/******************************************************************************/
tintptr EXPORT_CC
mod_init(void)
{
@@ -1988,6 +2010,11 @@ mod_init(void)
mod->inst->ReceiveChannelData = lfreerdp_receive_channel_data;
mod->inst->Authenticate = lfreerdp_authenticate;
mod->inst->VerifyCertificate = lfreerdp_verify_certificate;
+#if defined(VERSION_STRUCT_RDP_FREERDP)
+#if VERSION_STRUCT_RDP_FREERDP > 0
+ mod->inst->SessionInfo = lfreerdp_session_info;
+#endif
+#endif
freerdp_context_new(mod->inst);
diff --git a/neutrinordp/xrdp-neutrinordp.h b/neutrinordp/xrdp-neutrinordp.h
index fd4560d0..f5986b8a 100644
--- a/neutrinordp/xrdp-neutrinordp.h
+++ b/neutrinordp/xrdp-neutrinordp.h
@@ -151,9 +151,30 @@ struct mod
int flags);
int (*server_set_pointer_ex)(struct mod *mod, int x, int y, char *data,
char *mask, int bpp);
-
- tintptr server_dumby[100 - 37]; /* align, 100 minus the number of server
- functions above */
+ int (*server_add_char_alpha)(struct mod* mod, int font, int character,
+ int offset, int baseline,
+ int width, int height, char* data);
+ int (*server_create_os_surface_bpp)(struct mod* v, int rdpindex,
+ int width, int height, int bpp);
+ int (*server_paint_rect_bpp)(struct mod* v, int x, int y, int cx, int cy,
+ char* data, int width, int height,
+ int srcx, int srcy, int bpp);
+ int (*server_composite)(struct mod* v, int srcidx, int srcformat,
+ int srcwidth, int srcrepeat, int* srctransform,
+ int mskflags, int mskidx, int mskformat,
+ int mskwidth, int mskrepeat, int op,
+ int srcx, int srcy, int mskx, int msky,
+ int dstx, int dsty, int width, int height,
+ int dstformat);
+ int (*server_paint_rects)(struct mod* v,
+ int num_drects, short *drects,
+ int num_crects, short *crects,
+ char *data, int width, int height,
+ int flags, int frame_id);
+ int (*server_session_info)(struct mod* v, const char *data,
+ int data_bytes);
+ tintptr server_dumby[100 - 44]; /* align, 100 minus the number of server
+ functions above */
/* common */
tintptr handle; /* pointer to self as long */
tintptr wm;
diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h
index edf88cc4..a84a4c07 100644
--- a/xrdp/xrdp.h
+++ b/xrdp/xrdp.h
@@ -514,3 +514,6 @@ int DEFAULT_CC
server_add_char_alpha(struct xrdp_mod* mod, int font, int character,
int offset, int baseline,
int width, int height, char* data);
+int DEFAULT_CC
+server_session_info(struct xrdp_mod *mod, const char *data, int data_bytes);
+
diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c
index 6cabe582..84af0063 100644
--- a/xrdp/xrdp_mm.c
+++ b/xrdp/xrdp_mm.c
@@ -472,6 +472,7 @@ xrdp_mm_setup_mod1(struct xrdp_mm *self)
self->mod->server_paint_rect_bpp = server_paint_rect_bpp;
self->mod->server_composite = server_composite;
self->mod->server_paint_rects = server_paint_rects;
+ self->mod->server_session_info = server_session_info;
self->mod->si = (tintptr) &(self->wm->session->si);
}
}
@@ -2604,6 +2605,17 @@ server_paint_rects(struct xrdp_mod* mod, int num_drects, short *drects,
/*****************************************************************************/
int DEFAULT_CC
+server_session_info(struct xrdp_mod *mod, const char *data, int data_bytes)
+{
+ struct xrdp_wm *wm;
+
+ LLOGLN(10, ("server_session_info:"));
+ wm = (struct xrdp_wm *)(mod->wm);
+ return libxrdp_send_session_info(wm->session, data, data_bytes);
+}
+
+/*****************************************************************************/
+int DEFAULT_CC
server_set_pointer(struct xrdp_mod *mod, int x, int y,
char *data, char *mask)
{
diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h
index ca59cd1b..75c70ee7 100644
--- a/xrdp/xrdp_types.h
+++ b/xrdp/xrdp_types.h
@@ -146,7 +146,9 @@ struct xrdp_mod
int num_crects, short *crects,
char *data, int width, int height,
int flags, int frame_id);
- tintptr server_dumby[100 - 43]; /* align, 100 minus the number of server
+ int (*server_session_info)(struct xrdp_mod* v, const char *data,
+ int data_bytes);
+ tintptr server_dumby[100 - 44]; /* align, 100 minus the number of server
functions above */
/* common */
tintptr handle; /* pointer to self as int */