libxrdp: user freerdp mppc compressor

This commit is contained in:
Jay Sorg 2012-04-05 15:40:46 -07:00
parent 74abdae6ad
commit 209720fe1a
4 changed files with 101 additions and 11 deletions

View File

@ -28,6 +28,8 @@ AC_ARG_ENABLE(freerdp1, AS_HELP_STRING([--enable-freerdp1],
[freerdp1=true], [freerdp1=false]) [freerdp1=true], [freerdp1=false])
AM_CONDITIONAL(XRDP_FREERDP1, [test x$freerdp1 = xtrue]) AM_CONDITIONAL(XRDP_FREERDP1, [test x$freerdp1 = xtrue])
AM_CONDITIONAL(GOT_PREFIX, test "x${prefix}" != "xNONE"])
# checking for openssl # checking for openssl
AC_CHECK_HEADER([openssl/rc4.h], [], AC_CHECK_HEADER([openssl/rc4.h], [],
[AC_MSG_ERROR([please install libssl-dev or openssl-devel])], [AC_MSG_ERROR([please install libssl-dev or openssl-devel])],

View File

@ -1,9 +1,24 @@
EXTRA_DIST = libxrdp.h libxrdpinc.h EXTRA_DIST = libxrdp.h libxrdpinc.h
EXTRA_DEFINES =
EXTRA_INCLUDES =
EXTRA_LIBS =
EXTRA_FLAGS =
if XRDP_DEBUG if XRDP_DEBUG
EXTRA_DEFINES = -DXRDP_DEBUG EXTRA_DEFINES += -DXRDP_DEBUG
else else
EXTRA_DEFINES = -DXRDP_NODEBUG EXTRA_DEFINES += -DXRDP_NODEBUG
endif
if XRDP_FREERDP1
EXTRA_DEFINES += -DXRDP_FREERDP1
EXTRA_LIBS += -lfreerdp-codec
endif
if GOT_PREFIX
EXTRA_INCLUDES += -I$(prefix)/include
EXTRA_FLAGS += -L$(prefix)/lib -Wl,-rpath -Wl,$(prefix)/lib
endif endif
AM_CFLAGS = \ AM_CFLAGS = \
@ -14,7 +29,8 @@ AM_CFLAGS = \
$(EXTRA_DEFINES) $(EXTRA_DEFINES)
INCLUDES = \ INCLUDES = \
-I$(top_srcdir)/common -I$(top_srcdir)/common \
$(EXTRA_INCLUDES)
lib_LTLIBRARIES = \ lib_LTLIBRARIES = \
libxrdp.la libxrdp.la
@ -30,5 +46,9 @@ libxrdp_la_SOURCES = \
xrdp_tcp.c \ xrdp_tcp.c \
xrdp_bitmap_compress.c xrdp_bitmap_compress.c
libxrdp_la_LDFLAGS = \
$(EXTRA_FLAGS)
libxrdp_la_LIBADD = \ libxrdp_la_LIBADD = \
$(top_srcdir)/common/libcommon.la $(top_srcdir)/common/libcommon.la \
$(EXTRA_LIBS)

View File

@ -117,6 +117,7 @@ struct xrdp_rdp
int share_id; int share_id;
int mcs_channel; int mcs_channel;
struct xrdp_client_info client_info; struct xrdp_client_info client_info;
void* mppc_enc;
}; };
/* state */ /* state */

View File

@ -22,6 +22,10 @@
#include "libxrdp.h" #include "libxrdp.h"
#if defined(XRDP_FREERDP1)
#include <freerdp/codec/mppc_enc.h>
#endif
/* some compilers need unsigned char to avoid warnings */ /* some compilers need unsigned char to avoid warnings */
static tui8 g_unknown1[172] = static tui8 g_unknown1[172] =
{ 0xff, 0x02, 0xb6, 0x00, 0x28, 0x00, 0x00, 0x00, { 0xff, 0x02, 0xb6, 0x00, 0x28, 0x00, 0x00, 0x00,
@ -150,6 +154,9 @@ xrdp_rdp_create(struct xrdp_session* session, struct trans* trans)
self->client_info.cache3_entries = 262; self->client_info.cache3_entries = 262;
self->client_info.cache3_size = 4096; self->client_info.cache3_size = 4096;
g_write_ip_address(trans->sck, self->client_info.client_ip); /* load client ip info */ g_write_ip_address(trans->sck, self->client_info.client_ip); /* load client ip info */
#if defined(XRDP_FREERDP1)
self->mppc_enc = mppc_enc_new(PROTO_RDP_50);
#endif
DEBUG(("out xrdp_rdp_create")); DEBUG(("out xrdp_rdp_create"));
return self; return self;
} }
@ -163,6 +170,9 @@ xrdp_rdp_delete(struct xrdp_rdp* self)
return; return;
} }
xrdp_sec_delete(self->sec_layer); xrdp_sec_delete(self->sec_layer);
#if defined(XRDP_FREERDP1)
mppc_enc_free((struct rdp_mppc_enc*)(self->mppc_enc));
#endif
g_free(self); g_free(self);
} }
@ -278,21 +288,78 @@ int APP_CC
xrdp_rdp_send_data(struct xrdp_rdp* self, struct stream* s, xrdp_rdp_send_data(struct xrdp_rdp* self, struct stream* s,
int data_pdu_type) int data_pdu_type)
{ {
int len = 0; int len;
int ctype;
int clen;
int dlen;
int pdulen;
int pdutype;
int tocomplen;
int iso_offset;
int mcs_offset;
int sec_offset;
int rdp_offset;
struct stream ls;
struct rdp_mppc_enc* mppc_enc;
DEBUG(("in xrdp_rdp_send_data")); DEBUG(("in xrdp_rdp_send_data"));
s_pop_layer(s, rdp_hdr); s_pop_layer(s, rdp_hdr);
len = s->end - s->p; len = (int)(s->end - s->p);
out_uint16_le(s, len); pdutype = 0x10 | RDP_PDU_DATA;
out_uint16_le(s, 0x10 | RDP_PDU_DATA); pdulen = len;
dlen = len;
ctype = 0;
clen = len;
tocomplen = pdulen - 18;
if (self->client_info.rdp_compression && self->session->up_and_running)
{
mppc_enc = (struct rdp_mppc_enc*)(self->mppc_enc);
if (compress_rdp(mppc_enc, s->p + 18, tocomplen))
{
DEBUG(("mppc_encode ok flags 0x%x bytes_in_opb %d historyOffset %d "
"tocomplen %d", mppc_enc->flags, mppc_enc->bytes_in_opb,
mppc_enc->historyOffset, tocomplen));
if (mppc_enc->flags & RDP_MPPC_COMPRESSED)
{
clen = mppc_enc->bytes_in_opb + 18;
pdulen = clen;
ctype = mppc_enc->flags;
iso_offset = (int)(s->iso_hdr - s->data);
mcs_offset = (int)(s->mcs_hdr - s->data);
sec_offset = (int)(s->sec_hdr - s->data);
rdp_offset = (int)(s->rdp_hdr - s->data);
/* outputBuffer has 64 bytes preceding it */
ls.data = mppc_enc->outputBuffer - (rdp_offset + 18);
ls.p = ls.data + rdp_offset;
ls.end = ls.p + clen;
ls.size = clen;
ls.iso_hdr = ls.data + iso_offset;
ls.mcs_hdr = ls.data + mcs_offset;
ls.sec_hdr = ls.data + sec_offset;
ls.rdp_hdr = ls.data + rdp_offset;
ls.channel_hdr = 0;
ls.next_packet = 0;
s = &ls;
}
}
else
{
g_writeln("mppc_encode not ok");
}
}
out_uint16_le(s, pdulen);
out_uint16_le(s, pdutype);
out_uint16_le(s, self->mcs_channel); out_uint16_le(s, self->mcs_channel);
out_uint32_le(s, self->share_id); out_uint32_le(s, self->share_id);
out_uint8(s, 0); out_uint8(s, 0);
out_uint8(s, 1); out_uint8(s, 1);
out_uint16_le(s, len - 14); out_uint16_le(s, dlen);
out_uint8(s, data_pdu_type); out_uint8(s, data_pdu_type);
out_uint8(s, 0); out_uint8(s, ctype);
out_uint16_le(s, 0); out_uint16_le(s, clen);
if (xrdp_sec_send(self->sec_layer, s, MCS_GLOBAL_CHANNEL) != 0) if (xrdp_sec_send(self->sec_layer, s, MCS_GLOBAL_CHANNEL) != 0)
{ {
DEBUG(("out xrdp_rdp_send_data error")); DEBUG(("out xrdp_rdp_send_data error"));