libxrdp: user freerdp mppc compressor
This commit is contained in:
parent
74abdae6ad
commit
209720fe1a
@ -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])],
|
||||||
|
@ -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)
|
||||||
|
@ -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 */
|
||||||
|
@ -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"));
|
||||||
|
Loading…
Reference in New Issue
Block a user