summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2014-03-06 23:28:57 -0800
committerJay Sorg <jay.sorg@gmail.com>2014-03-06 23:28:57 -0800
commitcf39a90d8052856518c87bff5e9f66e4855ab004 (patch)
treebd6264dbb1d4c35c4ecfbbd0de2ec67107f67c79
parent201bec97940f0c8e063158b2f256981edff51908 (diff)
downloadxrdp-proprietary-cf39a90d8052856518c87bff5e9f66e4855ab004.tar.gz
xrdp-proprietary-cf39a90d8052856518c87bff5e9f66e4855ab004.zip
libxrdp: detect client fastpath caps
-rw-r--r--libxrdp/libxrdp.h2
-rw-r--r--libxrdp/xrdp_rdp.c38
2 files changed, 36 insertions, 4 deletions
diff --git a/libxrdp/libxrdp.h b/libxrdp/libxrdp.h
index 4e7218d6..7a4342db 100644
--- a/libxrdp/libxrdp.h
+++ b/libxrdp/libxrdp.h
@@ -346,6 +346,8 @@ xrdp_sec_delete(struct xrdp_sec* self);
int APP_CC
xrdp_sec_init(struct xrdp_sec* self, struct stream* s);
int APP_CC
+xrdp_sec_recv_fastpath(struct xrdp_sec *self, struct stream *s);
+int APP_CC
xrdp_sec_recv(struct xrdp_sec* self, struct stream* s, int* chan);
int APP_CC
xrdp_sec_send(struct xrdp_sec* self, struct stream* s, int chan);
diff --git a/libxrdp/xrdp_rdp.c b/libxrdp/xrdp_rdp.c
index a808aaa8..26e5c453 100644
--- a/libxrdp/xrdp_rdp.c
+++ b/libxrdp/xrdp_rdp.c
@@ -757,7 +757,11 @@ xrdp_rdp_send_demand_active(struct xrdp_rdp *self)
INPUT_FLAG_FASTPATH_INPUT2 0x0020 */
flags = 0x0001 | 0x0004;
if (self->client_info.use_fast_path & 2)
+ {
+ /* 0x0008 INPUT_FLAG_FASTPATH_INPUT */
+ /* 0x0020 INPUT_FLAG_FASTPATH_INPUT2 */
flags |= 0x0008 | 0x0020;
+ }
out_uint16_le(s, flags);
out_uint8s(s, 82);
@@ -810,7 +814,8 @@ static int APP_CC
xrdp_process_capset_general(struct xrdp_rdp *self, struct stream *s,
int len)
{
- int i;
+ int extraFlags;
+ int client_does_fastpath_output;
if (len < 10 + 2)
{
@@ -818,12 +823,19 @@ xrdp_process_capset_general(struct xrdp_rdp *self, struct stream *s,
return 1;
}
in_uint8s(s, 10);
- in_uint16_le(s, i);
+ in_uint16_le(s, extraFlags);
/* use_compact_packets is pretty much 'use rdp5' */
- self->client_info.use_compact_packets = (i != 0);
+ self->client_info.use_compact_packets = (extraFlags != 0);
/* op2 is a boolean to use compact bitmap headers in bitmap cache */
/* set it to same as 'use rdp5' boolean */
self->client_info.op2 = self->client_info.use_compact_packets;
+ /* FASTPATH_OUTPUT_SUPPORTED 0x0001 */
+ client_does_fastpath_output = extraFlags & FASTPATH_OUTPUT_SUPPORTED;
+ if ((self->client_info.use_fast_path & 1) && !client_does_fastpath_output)
+ {
+ /* server supports fast path output and client does not, turn it off */
+ self->client_info.use_fast_path &= ~1;
+ }
return 0;
}
@@ -1043,6 +1055,24 @@ xrdp_process_capset_pointercache(struct xrdp_rdp *self, struct stream *s,
}
/*****************************************************************************/
+static int APP_CC
+xrdp_process_capset_input(struct xrdp_rdp *self, struct stream *s,
+ int len)
+{
+ int inputFlags;
+ int client_does_fastpath_input;
+
+ in_uint16_le(s, inputFlags);
+ client_does_fastpath_input = (inputFlags & INPUT_FLAG_FASTPATH_INPUT) ||
+ (inputFlags & INPUT_FLAG_FASTPATH_INPUT2);
+ if ((self->client_info.use_fast_path & 2) && !client_does_fastpath_input)
+ {
+ self->client_info.use_fast_path &= ~2;
+ }
+ return 0;
+}
+
+/*****************************************************************************/
/* get the type of client brush cache */
static int APP_CC
xrdp_process_capset_brushcache(struct xrdp_rdp *self, struct stream *s,
@@ -1285,7 +1315,7 @@ xrdp_rdp_process_confirm_active(struct xrdp_rdp *self, struct stream *s)
DEBUG(("--12"));
break;
case 13: /* 13 */
- DEBUG(("--13"));
+ xrdp_process_capset_input(self, s, len);
break;
case 14: /* 14 */
DEBUG(("--14"));