Browse Source

New upstream version 0.9.9

tags/upstream/0.9.9^0
Dominik George 2 years ago
parent
commit
823b8df4b4
42 changed files with 7602 additions and 5630 deletions
  1. +26
    -0
      NEWS.md
  2. +1
    -1
      README.md
  3. +2
    -0
      common/xrdp_client_info.h
  4. +87
    -80
      common/xrdp_constants.h
  5. +397
    -350
      config.guess
  6. +836
    -838
      config.sub
  7. +10
    -10
      configure
  8. +1
    -1
      configure.ac
  9. +7
    -0
      docs/man/sesman.ini.5.in
  10. +1
    -0
      instfiles/Makefile.am
  11. +1
    -0
      instfiles/Makefile.in
  12. +1055
    -0
      instfiles/km-0000080a.ini
  13. +397
    -350
      libpainter/config.guess
  14. +836
    -838
      libpainter/config.sub
  15. +397
    -350
      librfxcodec/config.guess
  16. +836
    -838
      librfxcodec/config.sub
  17. +89
    -2
      libxrdp/libxrdp.c
  18. +33
    -1
      libxrdp/libxrdp.h
  19. +24
    -0
      libxrdp/libxrdpinc.h
  20. +116
    -86
      libxrdp/xrdp_caps.c
  21. +645
    -4
      libxrdp/xrdp_channel.c
  22. +267
    -123
      libxrdp/xrdp_orders.c
  23. +7
    -7
      libxrdp/xrdp_orders_rail.c
  24. +4
    -3
      libxrdp/xrdp_rdp.c
  25. +27
    -24
      libxrdp/xrdp_sec.c
  26. +1
    -1
      neutrinordp/xrdp-neutrinordp.c
  27. +0
    -2
      sesman/chansrv/Makefile.am
  28. +7
    -13
      sesman/chansrv/Makefile.in
  29. +781
    -582
      sesman/chansrv/chansrv.c
  30. +22
    -27
      sesman/chansrv/chansrv.h
  31. +12
    -3
      sesman/chansrv/chansrv_fuse.c
  32. +0
    -531
      sesman/chansrv/drdynvc.c
  33. +0
    -67
      sesman/chansrv/drdynvc.h
  34. +11
    -0
      sesman/chansrv/sound.c
  35. +6
    -7
      sesman/sesman.ini
  36. +4
    -0
      xrdp/xrdp.h
  37. +0
    -28
      xrdp/xrdp.ini
  38. +4
    -1
      xrdp/xrdp_keyboard.ini
  39. +407
    -332
      xrdp/xrdp_mm.c
  40. +2
    -2
      xrdp/xrdp_types.h
  41. +87
    -15
      xrdp/xrdp_wm.c
  42. +156
    -113
      xrdpapi/xrdpapi.c

+ 26
- 0
NEWS.md View File

@@ -1,3 +1,29 @@
# Release notes for xrdp v0.9.9 (2018/12/25)

# Release cycle
From the next release, release cycle will be changed from quarterly to every
4 months. xrdp will be released in April, August, December.

# New features
* Disconnection by idle timeout (requires xorgxrdp v0.2.9 or later) #1227
* Glyph cache v2 (fixes no font issue on iOS/macOS/Android client) #367 #1235

# Bug fixes
* Fix xrdp-chansrv crashes caused in drive redirection #1202 #1225
* Fix build with FDK AAC v2 #1257
* Do not enable RemoteApp if the INFO_RAIL flag is not set (RDP-RDP proxy) #1253

# Other changes
* Add Spanish Latin Amarican keyboard #1237 #1240 #1244
* Dynamic channel improvements #1222 #1224
* Remove some deprecated sesman session types #1232
* Refactoring and cleanups

# Known issues
* FreeRDP 2.0.0-rc4 or later might not able to connect to xrdp due to
xrdp's bad-mannered behaviour, add `+glyph-cache` option to FreeRDP to connect #1266
* Audio redirection by MP3 codec doesn't sound with some client, use AAC instead #965

# Release notes for xrdp v0.9.8 (2018/09/25)

## Deprecation notice


+ 1
- 1
README.md View File

@@ -2,7 +2,7 @@
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/neutrinolabs/xrdp)
![Apache-License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)

*Current Version:* 0.9.8
*Current Version:* 0.9.9

# xrdp - an open source RDP server



+ 2
- 0
common/xrdp_client_info.h View File

@@ -154,6 +154,8 @@ struct xrdp_client_info
int client_os_minor;

int no_orders_supported;
int use_cache_glyph_v2;
int rail_enable;
};

#endif

+ 87
- 80
common/xrdp_constants.h View File

@@ -201,6 +201,11 @@
#define OSMINORTYPE_PSEUDO_XSERVER 0x0008
#define OSMINORTYPE_WINDOWS_RT 0x0009

/* Window List Capability Set: WndSupportLevel (MS-RDPERP 2.2.1.1.2) */
#define TS_WINDOW_LEVEL_NOT_SUPPORTED 0x00000000
#define TS_WINDOW_LEVEL_SUPPORTED 0x00000001
#define TS_WINDOW_LEVEL_SUPPORTED_EX 0x00000002

/* Extended Info Packet: performanceFlags (MS-RDPBCGR 2.2.1.11.1.1.1) */
/* TODO: to be renamed */
#define RDP5_DISABLE_NOTHING 0x00
@@ -370,6 +375,7 @@
#define RDP_COMPRESSION 0x0080
#define RDP_LOGON_BLOB 0x0100
#define RDP_LOGON_LEAVE_AUDIO 0x2000
#define RDP_LOGON_RAIL 0x8000

/* Compression Flags (MS-RDPBCGR 3.1.8.2.1) */
/* TODO: to be renamed, not used anywhere */
@@ -379,15 +385,14 @@
#define RDP_MPPC_DICT_SIZE 8192 /* RDP 4.0 | MS-RDPBCGR 3.1.8 */

/* Drawing Order: controlFlags (MS-RDPEGDI 2.2.2.2.1, ) */
/* TODO: to be renamed */
#define RDP_ORDER_STANDARD 0x01
#define RDP_ORDER_SECONDARY 0x02
#define RDP_ORDER_BOUNDS 0x04
#define RDP_ORDER_CHANGE 0x08
#define RDP_ORDER_DELTA 0x10
#define RDP_ORDER_LASTBOUNDS 0x20
#define RDP_ORDER_SMALL 0x40
#define RDP_ORDER_TINY 0x80
#define TS_STANDARD 0x01
#define TS_SECONDARY 0x02
#define TS_BOUNDS 0x04
#define TS_TYPE_CHANGE 0x08
#define TS_DELTA_COORDINATES 0x10
#define TS_ZERO_BOUNDS_DELTAS 0x20
#define TS_ZERO_FIELD_BYTE_BIT0 0x40
#define TS_ZERO_FIELD_BYTE_BIT1 0x80

/* Drawing Order: orderType (MS-RDPEGDI 2.2.2.2.1.1.2) ? */
#define RDP_ORDER_DESTBLT 0
@@ -403,98 +408,94 @@
#define RDP_ORDER_COMPOSITE 37 /* 0x25 */

/* Secondary Drawing Order Header: orderType (MS-RDPEGDI 2.2.2.2.1.2.1.1) */
/* TODO: to be renamed */
#define RDP_ORDER_RAW_BMPCACHE 0
#define RDP_ORDER_COLCACHE 1
#define RDP_ORDER_BMPCACHE 2
#define RDP_ORDER_FONTCACHE 3
#define RDP_ORDER_RAW_BMPCACHE2 4
#define RDP_ORDER_BMPCACHE2 5
#define RDP_ORDER_BRUSHCACHE 7
#define RDP_ORDER_BMPCACHE3 8
#define TS_CACHE_BITMAP_UNCOMPRESSED 0x00
#define TS_CACHE_COLOR_TABLE 0x01
#define TS_CACHE_BITMAP_COMPRESSED 0x02
#define TS_CACHE_GLYPH 0x03
#define TS_CACHE_BITMAP_UNCOMPRESSED_REV2 0x04
#define TS_CACHE_BITMAP_COMPRESSED_REV2 0x05
#define TS_CACHE_BRUSH 0x07
#define TS_CACHE_BITMAP_COMPRESSED_REV3 0x08

/* Maps to generalCapabilitySet in T.128 page 138 */

/* Capability Set: capabilitySetType (MS-RDPBCGR 2.2.1.13.1.1.1) */
/* TODO: to be renamed */
#define RDP_CAPSET_GENERAL 0x0001
#define RDP_CAPLEN_GENERAL 0x18
#define CAPSTYPE_GENERAL 0x0001
#define CAPSTYPE_GENERAL_LEN 0x18

#define RDP_CAPSET_BITMAP 0x0002
#define RDP_CAPLEN_BITMAP 0x1C
#define CAPSTYPE_BITMAP 0x0002
#define CAPSTYPE_BITMAP_LEN 0x1C

#define RDP_CAPSET_ORDER 0x0003
#define RDP_CAPLEN_ORDER 0x58
#define ORDER_CAP_NEGOTIATE 2
#define ORDER_CAP_NOSUPPORT 4
#define CAPSTYPE_ORDER 0x0003
#define CAPSTYPE_ORDER_LEN 0x58
#define ORDER_CAP_NEGOTIATE 2 /* NEGOTIATEORDERSUPPORT? not used */
#define ORDER_CAP_NOSUPPORT 4 /* not used */

#define RDP_CAPSET_BMPCACHE 0x0004
#define RDP_CAPLEN_BMPCACHE 0x28
#define CAPSTYPE_BITMAPCACHE 0x0004
#define CAPSTYPE_BITMAPCACHE_LEN 0x28

#define RDP_CAPSET_CONTROL 0x0005
#define RDP_CAPLEN_CONTROL 0x0C
#define CAPSTYPE_CONTROL 0x0005
#define CAPSTYPE_CONTROL_LEN 0x0C

#define RDP_CAPSET_ACTIVATE 0x0007
#define RDP_CAPLEN_ACTIVATE 0x0C
#define CAPSTYPE_ACTIVATION 0x0007
#define CAPSTYPE_ACTIVATION_LEN 0x0C

#define RDP_CAPSET_POINTER 0x0008
#define RDP_CAPLEN_POINTER 0x0a
#define RDP_CAPLEN_POINTER_MONO 0x08
#define CAPSTYPE_POINTER 0x0008
#define CAPSTYPE_POINTER_LEN 0x0a
#define CAPSTYPE_POINTER_MONO_LEN 0x08

#define RDP_CAPSET_SHARE 0x0009
#define RDP_CAPLEN_SHARE 0x08
#define CAPSTYPE_SHARE 0x0009
#define CAPSTYPE_SHARE_LEN 0x08

#define RDP_CAPSET_COLCACHE 0x000A
#define RDP_CAPLEN_COLCACHE 0x08
#define CAPSTYPE_COLORCACHE 0x000A
#define CAPSTYPE_COLORCACHE_LEN 0x08

#define RDP_CAPSET_SOUND 0x000C
#define CAPSTYPE_SOUND 0x000C

#define RDP_CAPSET_INPUT 0x000D
#define RDP_CAPLEN_INPUT 0x58
#define CAPSTYPE_INPUT 0x000D
#define CAPSTYPE_INPUT_LEN 0x58

#define RDP_CAPSET_FONT 0x000E
#define RDP_CAPLEN_FONT 0x04
#define CAPSTYPE_FONT 0x000E
#define CAPSTYPE_FONT_LEN 0x04

#define RDP_CAPSET_BRUSHCACHE 0x000F
#define RDP_CAPLEN_BRUSHCACHE 0x08
#define CAPSTYPE_BRUSH 0x000F
#define CAPSTYPE_BRUSH_LEN 0x08

#define RDP_CAPSET_GLYPHCACHE 0x0010
#define RDP_CAPSET_OFFSCREENCACHE 0x0011
#define CAPSTYPE_GLYPHCACHE 0x0010
#define CAPSTYPE_OFFSCREENCACHE 0x0011

#define RDP_CAPSET_BITMAP_OFFSCREEN 0x0012
#define RDP_CAPLEN_BITMAP_OFFSCREEN 0x08
#define CAPSTYPE_BITMAPCACHE_HOSTSUPPORT 0x0012
#define CAPSTYPE_BITMAPCACHE_HOSTSUPPORT_LEN 0x08

#define RDP_CAPSET_BMPCACHE2 0x0013
#define RDP_CAPLEN_BMPCACHE2 0x28
#define BMPCACHE2_FLAG_PERSIST ((long)1<<31)
#define CAPSTYPE_BITMAPCACHE_REV2 0x0013
#define CAPSTYPE_BITMAPCACHE_REV2_LEN 0x28
#define BMPCACHE2_FLAG_PERSIST ((long)1<<31)

#define RDP_CAPSET_VIRCHAN 0x0014
#define RDP_CAPLEN_VIRCHAN 0x08
#define CAPSTYPE_VIRTUALCHANNEL 0x0014
#define CAPSTYPE_VIRTUALCHANNEL_LEN 0x08

#define RDP_CAPSET_DRAWNINEGRIDCACHE 0x0015
#define RDP_CAPSET_DRAWGDIPLUS 0x0016
#define RDP_CAPSET_RAIL 0x0017
#define RDP_CAPSET_WINDOW 0x0018
#define CAPSTYPE_DRAWNINGRIDCACHE 0x0015
#define CAPSTYPE_DRAWGDIPLUS 0x0016
#define CAPSTYPE_RAIL 0x0017
#define CAPSTYPE_WINDOW 0x0018

#define RDP_CAPSET_COMPDESK 0x0019
#define RDP_CAPLEN_COMPDESK 0x06
#define CAPSSETTYPE_COMPDESK 0x0019
#define CAPSSETTYPE_COMPDESK_LEN 0x06

#define RDP_CAPSET_MULTIFRAGMENT 0x001A
#define RDP_CAPLEN_MULTIFRAGMENT 0x08
#define CAPSSETTYPE_MULTIFRAGMENTUPDATE 0x001A
#define CAPSSETTYPE_MULTIFRAGMENTUPDATE_LEN 0x08

#define RDP_CAPSET_LPOINTER 0x001B
#define RDP_CAPLEN_LPOINTER 0x06
#define CAPSETTYPE_LARGE_POINTER 0x001B
#define CAPSETTYPE_LARGE_POINTER_LEN 0x06

#define RDP_CAPSET_FRAME_ACKNOWLEDGE 0x001E
#define RDP_CAPLEN_FRAME_ACKNOWLEDGE 0x08

#define RDP_CAPSET_SURFCMDS 0x001C
#define RDP_CAPLEN_SURFCMDS 0x0C

#define RDP_CAPSET_BMPCODECS 0x001D
#define RDP_CAPLEN_BMPCODECS 0x1C
#define CAPSETTYPE_SURFACE_COMMANDS 0x001C
#define CAPSETTYPE_SURFACE_COMMANDS_LEN 0x0C

#define CAPSSETTYPE_BITMAP_CODECS 0x001D
#define CAPSSETTYPE_BITMAP_CODECS_LEN 0x1C

#define CAPSTYPE_FRAME_ACKNOWLEDGE 0x001E
#define CAPSTYPE_FRAME_ACKNOWLEDGE_LEN 0x08

/* TS_SECURITY_HEADER: flags (MS-RDPBCGR 2.2.8.1.1.2.1) */
/* TODO: to be renamed */
@@ -588,6 +589,12 @@
#define KBD_FLAG_CAPITAL 0x0004
#define TS_SYNC_KANA_LOCK 0x0008

/* Glyph Cache Capability Set: GlyphSupportLevel (MS-RDPBCGR 2.2.7.1.8) */
#define GLYPH_SUPPORT_NONE 0x0000
#define GLYPH_SUPPORT_PARTIAL 0x0001
#define GLYPH_SUPPORT_FULL 0x0002
#define GLYPH_SUPPORT_ENCODE 0x0003

/******************************************************************************
*
* Constants come from other Microsoft products
@@ -664,12 +671,12 @@
#define LICENCE_SIGNATURE_SIZE 16


/* RDP PDU codes */
#define RDP_PDU_DEMAND_ACTIVE 1
#define RDP_PDU_CONFIRM_ACTIVE 3
#define RDP_PDU_REDIRECT 4
#define RDP_PDU_DEACTIVATE 6
#define RDP_PDU_DATA 7
/* PDU Types (MS-RDPBCGR 2.2.8.1.1.1.1) */
#define PDUTYPE_DEMANDACTIVEPDU 0x1
#define PDUTYPE_CONFIRMACTIVEPDU 0x3
#define PDUTYPE_DEACTIVATEALLPDU 0x6
#define PDUTYPE_DATAPDU 0x7
#define PDUTYPE_SERVER_REDIR_PKT 0xA

/* See T.128 */
/* not used anywhere */


+ 397
- 350
config.guess
File diff suppressed because it is too large
View File


+ 836
- 838
config.sub
File diff suppressed because it is too large
View File


+ 10
- 10
configure View File

@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for xrdp 0.9.8.
# Generated by GNU Autoconf 2.69 for xrdp 0.9.9.
#
# Report bugs to <xrdp-devel@googlegroups.com>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='xrdp'
PACKAGE_TARNAME='xrdp'
PACKAGE_VERSION='0.9.8'
PACKAGE_STRING='xrdp 0.9.8'
PACKAGE_VERSION='0.9.9'
PACKAGE_STRING='xrdp 0.9.9'
PACKAGE_BUGREPORT='xrdp-devel@googlegroups.com'
PACKAGE_URL=''

@@ -1424,7 +1424,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures xrdp 0.9.8 to adapt to many kinds of systems.
\`configure' configures xrdp 0.9.9 to adapt to many kinds of systems.

Usage: $0 [OPTION]... [VAR=VALUE]...

@@ -1498,7 +1498,7 @@ fi

if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of xrdp 0.9.8:";;
short | recursive ) echo "Configuration of xrdp 0.9.9:";;
esac
cat <<\_ACEOF

@@ -1663,7 +1663,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
xrdp configure 0.9.8
xrdp configure 0.9.9
generated by GNU Autoconf 2.69

Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2032,7 +2032,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by xrdp $as_me 0.9.8, which was
It was created by xrdp $as_me 0.9.9, which was
generated by GNU Autoconf 2.69. Invocation command line was

$ $0 $@
@@ -2897,7 +2897,7 @@ fi

# Define the identity of the package.
PACKAGE='xrdp'
VERSION='0.9.8'
VERSION='0.9.9'


cat >>confdefs.h <<_ACEOF
@@ -15051,7 +15051,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by xrdp $as_me 0.9.8, which was
This file was extended by xrdp $as_me 0.9.9, which was
generated by GNU Autoconf 2.69. Invocation command line was

CONFIG_FILES = $CONFIG_FILES
@@ -15117,7 +15117,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
xrdp config.status 0.9.8
xrdp config.status 0.9.9
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"



+ 1
- 1
configure.ac View File

@@ -1,7 +1,7 @@
# Process this file with autoconf to produce a configure script

AC_PREREQ(2.65)
AC_INIT([xrdp], [0.9.8], [xrdp-devel@googlegroups.com])
AC_INIT([xrdp], [0.9.9], [xrdp-devel@googlegroups.com])
AC_CONFIG_HEADERS(config_ac.h:config_ac-h.in)
AM_INIT_AUTOMAKE([1.7.2 foreign])
AC_CONFIG_MACRO_DIR([m4])


+ 7
- 0
docs/man/sesman.ini.5.in View File

@@ -139,6 +139,13 @@ within 60 seconds after the user disconnects.
Sets the time limit (in seconds) before a disconnected session is killed.
If set to \fI0\fR, automatic killing is disabled.

.TP
\fBIdleTimeLimit\fR=\fInumber\fR
Sets the time limit (in seconds) before an idle session is disconnected.
Idle means no keyboard inputs and no mouse moves/clicks here.
If set to \fI0\fR, idle sessions will never be disconnected by timeout.
This works only with xorgxrdp session. Moreover, xorgxrdp must be v0.2.9 or later.

.TP
\fBPolicy\fR=\fI[Default|UBD|UBI|UBC|UBDI|UBDC]\fR
Session allocation policy. By default, a new session is created


+ 1
- 0
instfiles/Makefile.am View File

@@ -45,6 +45,7 @@ dist_startscript_DATA = \
km-0000041d.ini \
km-00000807.ini \
km-00000809.ini \
km-0000080a.ini \
km-0000080c.ini \
km-00000813.ini \
km-00000816.ini \


+ 1
- 0
instfiles/Makefile.in View File

@@ -427,6 +427,7 @@ dist_startscript_DATA = \
km-0000041d.ini \
km-00000807.ini \
km-00000809.ini \
km-0000080a.ini \
km-0000080c.ini \
km-00000813.ini \
km-00000816.ini \


+ 1055
- 0
instfiles/km-0000080a.ini
File diff suppressed because it is too large
View File


+ 397
- 350
libpainter/config.guess
File diff suppressed because it is too large
View File


+ 836
- 838
libpainter/config.sub
File diff suppressed because it is too large
View File


+ 397
- 350
librfxcodec/config.guess
File diff suppressed because it is too large
View File


+ 836
- 838
librfxcodec/config.sub
File diff suppressed because it is too large
View File


+ 89
- 2
libxrdp/libxrdp.c View File

@@ -230,10 +230,10 @@ libxrdp_process_data(struct xrdp_session *session, struct stream *s)
case 0:
dead_lock_counter++;
break;
case RDP_PDU_CONFIRM_ACTIVE: /* 3 */
case PDUTYPE_CONFIRMACTIVEPDU:
xrdp_caps_process_confirm_active(rdp, s);
break;
case RDP_PDU_DATA: /* 7 */
case PDUTYPE_DATAPDU:
if (xrdp_rdp_process_data(rdp, s) != 0)
{
DEBUG(("libxrdp_process_data returned non zero"));
@@ -1263,6 +1263,93 @@ libxrdp_send_to_channel(struct xrdp_session *session, int channel_id,
return 0;
}

/*****************************************************************************/
int
libxrdp_disable_channel(struct xrdp_session *session, int channel_id,
int is_disabled)
{
struct xrdp_rdp *rdp;
struct xrdp_mcs *mcs;
struct mcs_channel_item *channel_item;

rdp = (struct xrdp_rdp *) (session->rdp);
mcs = rdp->sec_layer->mcs_layer;
if (mcs->channel_list == NULL)
{
return 1;
}
channel_item = (struct mcs_channel_item *)
list_get_item(mcs->channel_list, channel_id);
if (channel_item == NULL)
{
return 1;
}
channel_item->disabled = is_disabled;
return 1;
}

/*****************************************************************************/
int
libxrdp_drdynvc_open(struct xrdp_session *session, const char *name,
int flags, struct xrdp_drdynvc_procs *procs,
int *chan_id)
{
struct xrdp_rdp *rdp;
struct xrdp_sec *sec;
struct xrdp_channel *chan;

rdp = (struct xrdp_rdp *) (session->rdp);
sec = rdp->sec_layer;
chan = sec->chan_layer;
return xrdp_channel_drdynvc_open(chan, name, flags, procs, chan_id);
}

/*****************************************************************************/
int
libxrdp_drdynvc_close(struct xrdp_session *session, int chan_id)
{
struct xrdp_rdp *rdp;
struct xrdp_sec *sec;
struct xrdp_channel *chan;

rdp = (struct xrdp_rdp *) (session->rdp);
sec = rdp->sec_layer;
chan = sec->chan_layer;
return xrdp_channel_drdynvc_close(chan, chan_id);
}

/*****************************************************************************/
int
libxrdp_drdynvc_data_first(struct xrdp_session *session, int chan_id,
const char *data, int data_bytes,
int total_data_bytes)
{
struct xrdp_rdp *rdp;
struct xrdp_sec *sec;
struct xrdp_channel *chan;

rdp = (struct xrdp_rdp *) (session->rdp);
sec = rdp->sec_layer;
chan = sec->chan_layer;
return xrdp_channel_drdynvc_data_first(chan, chan_id, data, data_bytes,
total_data_bytes);
}

/*****************************************************************************/
int
libxrdp_drdynvc_data(struct xrdp_session *session, int chan_id,
const char *data, int data_bytes)
{
struct xrdp_rdp *rdp;
struct xrdp_sec *sec;
struct xrdp_channel *chan;

rdp = (struct xrdp_rdp *) (session->rdp);
sec = rdp->sec_layer;
chan = sec->chan_layer;
return xrdp_channel_drdynvc_data(chan, chan_id, data, data_bytes);
}

/*****************************************************************************/
int EXPORT_CC
libxrdp_orders_send_brush(struct xrdp_session *session,


+ 33
- 1
libxrdp/libxrdp.h View File

@@ -51,6 +51,8 @@ struct mcs_channel_item
char name[16];
int flags;
int chanid;
int disabled;
int pad0;
};

/* mcs */
@@ -128,11 +130,27 @@ struct xrdp_sec
int is_security_header_present; /* boolean */
};

struct xrdp_drdynvc
{
int chan_id;
int status; /* see XRDP_DRDYNVC_STATUS_* */
int flags;
int pad0;
int (*open_response)(intptr_t id, int chan_id, int creation_status);
int (*close_response)(intptr_t id, int chan_id);
int (*data_first)(intptr_t id, int chan_id, char *data, int bytes, int total_bytes);
int (*data)(intptr_t id, int chan_id, char *data, int bytes);
};

/* channel */
struct xrdp_channel
{
struct xrdp_sec *sec_layer;
struct xrdp_mcs *mcs_layer;
int drdynvc_channel_id;
int drdynvc_state;
struct stream *s;
struct xrdp_drdynvc drdynvcs[256];
};

/* rdp */
@@ -285,7 +303,6 @@ struct xrdp_mppc_enc
tui16 *hash_table;
};


int
compress_rdp(struct xrdp_mppc_enc *enc, tui8 *srcData, int len);
struct xrdp_mppc_enc *
@@ -553,6 +570,21 @@ xrdp_channel_send(struct xrdp_channel *self, struct stream *s, int channel_id,
int
xrdp_channel_process(struct xrdp_channel *self, struct stream *s,
int chanid);
int
xrdp_channel_drdynvc_start(struct xrdp_channel *self);
int
xrdp_channel_drdynvc_open(struct xrdp_channel *self, const char *name,
int flags, struct xrdp_drdynvc_procs *procs,
int *chan_id);
int
xrdp_channel_drdynvc_close(struct xrdp_channel *self, int chan_id);
int
xrdp_channel_drdynvc_data_first(struct xrdp_channel *self, int chan_id,
const char *data, int data_bytes,
int total_data_bytes);
int
xrdp_channel_drdynvc_data(struct xrdp_channel *self, int chan_id,
const char *data, int data_bytes);

/* xrdp_fastpath.c */
struct xrdp_fastpath *


+ 24
- 0
libxrdp/libxrdpinc.h View File

@@ -76,6 +76,14 @@ struct xrdp_session
struct source_info si;
};

struct xrdp_drdynvc_procs
{
int (*open_response)(intptr_t id, int chan_id, int creation_status);
int (*close_response)(intptr_t id, int chan_id);
int (*data_first)(intptr_t id, int chan_id, char *data, int bytes, int total_bytes);
int (*data)(intptr_t id, int chan_id, char *data, int bytes);
};

struct xrdp_session *
libxrdp_init(tbus id, struct trans *trans);
int
@@ -195,6 +203,22 @@ libxrdp_send_to_channel(struct xrdp_session *session, int channel_id,
char *data, int data_len,
int total_data_len, int flags);
int
libxrdp_disable_channel(struct xrdp_session *session, int channel_id,
int is_disabled);
int
libxrdp_drdynvc_open(struct xrdp_session *session, const char *name,
int flags, struct xrdp_drdynvc_procs *procs,
int *chan_id);
int
libxrdp_drdynvc_close(struct xrdp_session *session, int chan_id);
int
libxrdp_drdynvc_data_first(struct xrdp_session *session, int chan_id,
const char *data, int data_bytes,
int total_data_bytes);
int
libxrdp_drdynvc_data(struct xrdp_session *session, int chan_id,
const char *data, int data_bytes);
int
libxrdp_orders_send_brush(struct xrdp_session *session,
int width, int height, int bpp, int type,
int size, char *data, int cache_id);


+ 116
- 86
libxrdp/xrdp_caps.c View File

@@ -360,6 +360,33 @@ xrdp_caps_process_brushcache(struct xrdp_rdp *self, struct stream *s,
return 0;
}

/*****************************************************************************/
static int
xrdp_caps_process_glyphcache(struct xrdp_rdp *self, struct stream *s,
int len)
{
int glyph_support_level;

if (len < 40 + 4 + 2 + 2) /* MS-RDPBCGR 2.2.7.1.8 */
{
g_writeln("xrdp_caps_process_glyphcache: error");
return 1;
}

in_uint8s(s, 40); /* glyph cache */
in_uint8s(s, 4); /* frag cache */
in_uint16_le(s, glyph_support_level);
in_uint8s(s, 2); /* pad */

if (glyph_support_level == GLYPH_SUPPORT_ENCODE)
{
self->client_info.use_cache_glyph_v2 = 1;
}
g_writeln("xrdp_caps_process_glyphcache: support level %d ",
glyph_support_level);
return 0;
}

/*****************************************************************************/
int
xrdp_caps_process_offscreen_bmpcache(struct xrdp_rdp *self, struct stream *s,
@@ -610,88 +637,89 @@ xrdp_caps_process_confirm_active(struct xrdp_rdp *self, struct stream *s)
len -= 4;
switch (type)
{
case RDP_CAPSET_GENERAL:
DEBUG(("RDP_CAPSET_GENERAL"));
case CAPSTYPE_GENERAL:
DEBUG(("CAPSTYPE_GENERAL"));
xrdp_caps_process_general(self, s, len);
break;
case RDP_CAPSET_BITMAP:
DEBUG(("RDP_CAPSET_BITMAP"));
case CAPSTYPE_BITMAP:
DEBUG(("CAPSTYPE_BITMAP"));
break;
case RDP_CAPSET_ORDER:
DEBUG(("RDP_CAPSET_ORDER"));
case CAPSTYPE_ORDER:
DEBUG(("CAPSTYPE_ORDER"));
xrdp_caps_process_order(self, s, len);
break;
case RDP_CAPSET_BMPCACHE:
DEBUG(("RDP_CAPSET_BMPCACHE"));
case CAPSTYPE_BITMAPCACHE:
DEBUG(("CAPSTYPE_BMPCACHE"));
xrdp_caps_process_bmpcache(self, s, len);
break;
case RDP_CAPSET_CONTROL:
DEBUG(("RDP_CAPSET_CONTROL"));
case CAPSTYPE_CONTROL:
DEBUG(("CAPSTYPE_CONTROL"));
break;
case 6:
xrdp_caps_process_cache_v3_codec_id(self, s, len);
break;
case RDP_CAPSET_ACTIVATE:
DEBUG(("RDP_CAPSET_ACTIVATE"));
case CAPSTYPE_ACTIVATION:
DEBUG(("CAPSTYPE_ACTIVAION"));
break;
case RDP_CAPSET_POINTER:
DEBUG(("RDP_CAPSET_POINTER"));
case CAPSTYPE_POINTER:
DEBUG(("CAPSTYPE_POINTER"));
xrdp_caps_process_pointer(self, s, len);
break;
case RDP_CAPSET_SHARE:
DEBUG(("RDP_CAPSET_SHARE"));
case CAPSTYPE_SHARE:
DEBUG(("CAPSTYPE_SHARE"));
break;
case RDP_CAPSET_COLCACHE:
DEBUG(("RDP_CAPSET_COLCACHE"));
case CAPSTYPE_COLORCACHE:
DEBUG(("CAPSTYPE_COLORCACHE"));
break;
case RDP_CAPSET_SOUND:
DEBUG(("--0x0C"));
case CAPSTYPE_SOUND:
DEBUG(("CAPSTYPE_SOUND"));
break;
case RDP_CAPSET_INPUT:
case CAPSTYPE_INPUT:
xrdp_caps_process_input(self, s, len);
break;
case RDP_CAPSET_FONT:
DEBUG(("--0x0D"));
case CAPSTYPE_FONT:
DEBUG(("CAPSTYPE_FONT"));
break;
case RDP_CAPSET_BRUSHCACHE:
case CAPSTYPE_BRUSH:
xrdp_caps_process_brushcache(self, s, len);
break;
case RDP_CAPSET_GLYPHCACHE:
DEBUG(("--0x11"));
case CAPSTYPE_GLYPHCACHE:
DEBUG(("CAPSTYPE_GLYPHCACHE"));
xrdp_caps_process_glyphcache(self, s, len);
break;
case RDP_CAPSET_OFFSCREENCACHE:
DEBUG(("CAPSET_TYPE_OFFSCREEN_CACHE"));
case CAPSTYPE_OFFSCREENCACHE:
DEBUG(("CAPSTYPE_OFFSCREENCACHE"));
xrdp_caps_process_offscreen_bmpcache(self, s, len);
break;
case RDP_CAPSET_BMPCACHE2:
DEBUG(("RDP_CAPSET_BMPCACHE2"));
case CAPSTYPE_BITMAPCACHE_REV2:
DEBUG(("CAPSTYPE_BITMAPCACHE_REV2"));
xrdp_caps_process_bmpcache2(self, s, len);
break;
case RDP_CAPSET_VIRCHAN:
DEBUG(("--0x14"));
case CAPSTYPE_VIRTUALCHANNEL:
DEBUG(("CAPSTYPE_VIRTUALCHANNEL"));
break;
case RDP_CAPSET_DRAWNINEGRIDCACHE:
DEBUG(("--0x15"));
case CAPSTYPE_DRAWNINGRIDCACHE:
DEBUG(("CAPSTYPE_DRAWNINGRIDCACHE"));
break;
case RDP_CAPSET_DRAWGDIPLUS:
DEBUG(("--0x16"));
case CAPSTYPE_DRAWGDIPLUS:
DEBUG(("CAPSTYPE_DRAWGDIPLUS"));
break;
case RDP_CAPSET_RAIL:
case CAPSTYPE_RAIL:
xrdp_caps_process_rail(self, s, len);
break;
case RDP_CAPSET_WINDOW:
case CAPSTYPE_WINDOW:
xrdp_caps_process_window(self, s, len);
break;
case RDP_CAPSET_MULTIFRAGMENT:
case CAPSSETTYPE_MULTIFRAGMENTUPDATE:
xrdp_caps_process_multifragmentupdate(self, s, len);
break;
case RDP_CAPSET_SURFCMDS:
case CAPSETTYPE_SURFACE_COMMANDS:
xrdp_caps_process_surface_cmds(self, s, len);
break;
case RDP_CAPSET_BMPCODECS:
case CAPSSETTYPE_BITMAP_CODECS:
xrdp_caps_process_codecs(self, s, len);
break;
case RDP_CAPSET_FRAME_ACKNOWLEDGE:
case CAPSTYPE_FRAME_ACKNOWLEDGE:
xrdp_caps_process_frame_ack(self, s, len);
break;
default:
@@ -757,29 +785,27 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)

/* Output share capability set */
caps_count++;
out_uint16_le(s, RDP_CAPSET_SHARE);
out_uint16_le(s, RDP_CAPLEN_SHARE);
out_uint16_le(s, CAPSTYPE_SHARE);
out_uint16_le(s, CAPSTYPE_SHARE_LEN);
out_uint16_le(s, self->mcs_channel);
out_uint16_be(s, 0xb5e2); /* 0x73e1 */

/* Output general capability set */
caps_count++;
out_uint16_le(s, RDP_CAPSET_GENERAL); /* 1 */
out_uint16_le(s, RDP_CAPLEN_GENERAL); /* 24(0x18) */
out_uint16_le(s, 1); /* OS major type */
out_uint16_le(s, 3); /* OS minor type */
out_uint16_le(s, CAPSTYPE_GENERAL);
out_uint16_le(s, CAPSTYPE_GENERAL_LEN);
out_uint16_le(s, OSMAJORTYPE_WINDOWS);
out_uint16_le(s, OSMINORTYPE_WINDOWS_NT);
out_uint16_le(s, 0x200); /* Protocol version */
out_uint16_le(s, 0); /* pad */
out_uint16_le(s, 0); /* Compression types */
/* NO_BITMAP_COMPRESSION_HDR 0x0400
FASTPATH_OUTPUT_SUPPORTED 0x0001 */
if (self->client_info.use_fast_path & 1)
{
out_uint16_le(s, 0x401);
out_uint16_le(s, NO_BITMAP_COMPRESSION_HDR | FASTPATH_OUTPUT_SUPPORTED);
}
else
{
out_uint16_le(s, 0x400);
out_uint16_le(s, NO_BITMAP_COMPRESSION_HDR);
}
out_uint16_le(s, 0); /* Update capability */
out_uint16_le(s, 0); /* Remote unshare capability */
@@ -788,8 +814,8 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)

/* Output bitmap capability set */
caps_count++;
out_uint16_le(s, RDP_CAPSET_BITMAP); /* 2 */
out_uint16_le(s, RDP_CAPLEN_BITMAP); /* 28(0x1c) */
out_uint16_le(s, CAPSTYPE_BITMAP);
out_uint16_le(s, CAPSTYPE_BITMAP_LEN);
out_uint16_le(s, self->client_info.bpp); /* Preferred BPP */
out_uint16_le(s, 1); /* Receive 1 BPP */
out_uint16_le(s, 1); /* Receive 4 BPP */
@@ -805,13 +831,13 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)

/* Output font capability set */
caps_count++;
out_uint16_le(s, RDP_CAPSET_FONT); /* 14 */
out_uint16_le(s, RDP_CAPLEN_FONT); /* 4 */
out_uint16_le(s, CAPSTYPE_FONT);
out_uint16_le(s, CAPSTYPE_FONT_LEN);

/* Output order capability set */
caps_count++;
out_uint16_le(s, RDP_CAPSET_ORDER); /* 3 */
out_uint16_le(s, RDP_CAPLEN_ORDER); /* 88(0x58) */
out_uint16_le(s, CAPSTYPE_ORDER);
out_uint16_le(s, CAPSTYPE_ORDER_LEN);
out_uint8s(s, 16);
out_uint32_be(s, 0x40420f00);
out_uint16_le(s, 1); /* Cache X granularity */
@@ -863,7 +889,7 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)

/* Output bmpcodecs capability set */
caps_count++;
out_uint16_le(s, RDP_CAPSET_BMPCODECS);
out_uint16_le(s, CAPSSETTYPE_BITMAP_CODECS);
codec_caps_size_ptr = s->p;
out_uint8s(s, 2); /* cap len set later */
codec_caps_count = 0;
@@ -899,30 +925,30 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)
out_uint8(s, 75); /* jpeg compression ratio */
/* calculate and set size and count */
codec_caps_size = (int)(s->p - codec_caps_size_ptr);
codec_caps_size += 2; /* 2 bytes for RDP_CAPSET_BMPCODECS above */
codec_caps_size += 2; /* 2 bytes for CAPSTYPE_BMPCODECS above */
codec_caps_size_ptr[0] = codec_caps_size;
codec_caps_size_ptr[1] = codec_caps_size >> 8;
codec_caps_count_ptr[0] = codec_caps_count;

/* Output color cache capability set */
caps_count++;
out_uint16_le(s, RDP_CAPSET_COLCACHE);
out_uint16_le(s, RDP_CAPLEN_COLCACHE);
out_uint16_le(s, CAPSTYPE_COLORCACHE);
out_uint16_le(s, CAPSTYPE_COLORCACHE_LEN);
out_uint16_le(s, 6); /* cache size */
out_uint16_le(s, 0); /* pad */

/* Output pointer capability set */
caps_count++;
out_uint16_le(s, RDP_CAPSET_POINTER);
out_uint16_le(s, RDP_CAPLEN_POINTER);
out_uint16_le(s, CAPSTYPE_POINTER);
out_uint16_le(s, CAPSTYPE_POINTER_LEN);
out_uint16_le(s, 1); /* Colour pointer */
out_uint16_le(s, 0x19); /* Cache size */
out_uint16_le(s, 0x19); /* Cache size */

/* Output input capability set */
caps_count++;
out_uint16_le(s, RDP_CAPSET_INPUT); /* 13(0xd) */
out_uint16_le(s, RDP_CAPLEN_INPUT); /* 88(0x58) */
out_uint16_le(s, CAPSTYPE_INPUT);
out_uint16_le(s, CAPSTYPE_INPUT_LEN);

flags = INPUT_FLAG_SCANCODES |
INPUT_FLAG_MOUSEX |
@@ -936,20 +962,24 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)
out_uint16_le(s, flags);
out_uint8s(s, 82);

/* Remote Programs Capability Set */
caps_count++;
out_uint16_le(s, 0x0017); /* CAPSETTYPE_RAIL */
out_uint16_le(s, 8);
out_uint32_le(s, 3); /* TS_RAIL_LEVEL_SUPPORTED
TS_RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED */
if (self->client_info.rail_enable) /* MS-RDPERP 3.3.5.1.4 */
{
/* Remote Programs Capability Set */
caps_count++;
out_uint16_le(s, CAPSTYPE_RAIL);
out_uint16_le(s, 8); /* LengthCapability: MS-RDPERP 2.2.1.1.1 */
out_uint32_le(s, 3); /* See: https://msdn.microsoft.com/en-us/library/cc242518.aspx
TS_RAIL_LEVEL_SUPPORTED
TS_RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED */

/* Window List Capability Set */
caps_count++;
out_uint16_le(s, 0x0018); /* CAPSETTYPE_WINDOW */
out_uint16_le(s, 11);
out_uint32_le(s, 2); /* TS_WINDOW_LEVEL_SUPPORTED_EX */
out_uint8(s, 3); /* NumIconCaches */
out_uint16_le(s, 12); /* NumIconCacheEntries */
/* Window List Capability Set */
caps_count++;
out_uint16_le(s, CAPSTYPE_WINDOW);
out_uint16_le(s, 11); /* LengthCapability: MS-RDPERP 2.2.1.1.2 */
out_uint32_le(s, TS_WINDOW_LEVEL_SUPPORTED_EX);
out_uint8(s, 3); /* NumIconCaches */
out_uint16_le(s, 12); /* NumIconCacheEntries */
}

/* 6 - bitmap cache v3 codecid */
caps_count++;
@@ -961,20 +991,20 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)
{
/* multifragment update */
caps_count++;
out_uint16_le(s, RDP_CAPSET_MULTIFRAGMENT); /* 26 CAPSETTYPE_MULTIFRAGMENTUPDATE */
out_uint16_le(s, RDP_CAPLEN_MULTIFRAGMENT);
out_uint16_le(s, CAPSSETTYPE_MULTIFRAGMENTUPDATE);
out_uint16_le(s, CAPSSETTYPE_MULTIFRAGMENTUPDATE_LEN);
out_uint32_le(s, 3 * 1024 * 1024); /* 3MB */

/* frame acks */
caps_count++;
out_uint16_le(s, RDP_CAPSET_FRAME_ACKNOWLEDGE); /* CAPSETTYPE_FRAME_ACKNOWLEDGE */
out_uint16_le(s, RDP_CAPLEN_FRAME_ACKNOWLEDGE);
out_uint16_le(s, CAPSTYPE_FRAME_ACKNOWLEDGE);
out_uint16_le(s, CAPSTYPE_FRAME_ACKNOWLEDGE_LEN);
out_uint32_le(s, 2); /* 2 frames in flight */

/* surface commands */
caps_count++;
out_uint16_le(s, RDP_CAPSET_SURFCMDS); /* CAPSETTYPE_SURFACE_COMMANDS */
out_uint16_le(s, RDP_CAPLEN_SURFCMDS); /* lengthCapability */
out_uint16_le(s, CAPSETTYPE_SURFACE_COMMANDS);
out_uint16_le(s, CAPSETTYPE_SURFACE_COMMANDS_LEN);
out_uint32_le(s, (SURFCMDS_SETSURFACEBITS |
SURFCMDS_FRAMEMARKER |
SURFCMDS_STREAMSUFRACEBITS)); /* cmdFlags */
@@ -994,7 +1024,7 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)
caps_count_ptr[2] = caps_count >> 16;
caps_count_ptr[3] = caps_count >> 24;

if (xrdp_rdp_send(self, s, RDP_PDU_DEMAND_ACTIVE) != 0)
if (xrdp_rdp_send(self, s, PDUTYPE_DEMANDACTIVEPDU) != 0)
{
free_stream(s);
return 1;


+ 645
- 4
libxrdp/xrdp_channel.c View File

@@ -31,6 +31,17 @@
#define CHANNEL_FLAG_LAST 0x02
#define CHANNEL_FLAG_SHOW_PROTOCOL 0x10

#define CMD_DVC_OPEN_CHANNEL 0x10
#define CMD_DVC_DATA_FIRST 0x20
#define CMD_DVC_DATA 0x30
#define CMD_DVC_CLOSE_CHANNEL 0x40
#define CMD_DVC_CAPABILITY 0x50

#define XRDP_DRDYNVC_STATUS_CLOSED 0
#define XRDP_DRDYNVC_STATUS_OPEN_SENT 1
#define XRDP_DRDYNVC_STATUS_OPEN 2
#define XRDP_DRDYNVC_STATUS_CLOSE_SENT 3

/*****************************************************************************/
/* returns pointer or nil on error */
static struct mcs_channel_item *
@@ -58,6 +69,7 @@ xrdp_channel_create(struct xrdp_sec *owner, struct xrdp_mcs *mcs_layer)
self = (struct xrdp_channel *)g_malloc(sizeof(struct xrdp_channel), 1);
self->sec_layer = owner;
self->mcs_layer = mcs_layer;
self->drdynvc_channel_id = -1;
return self;
}

@@ -70,7 +82,7 @@ xrdp_channel_delete(struct xrdp_channel *self)
{
return;
}
free_stream(self->s);
g_memset(self, 0, sizeof(struct xrdp_channel));
g_free(self);
}
@@ -106,6 +118,12 @@ xrdp_channel_send(struct xrdp_channel *self, struct stream *s, int channel_id,
return 1;
}

if (channel->disabled)
{
g_writeln("xrdp_channel_send, channel disabled");
return 0; /* not an error */
}

s_pop_layer(s, channel_hdr);
out_uint32_le(s, total_data_len);

@@ -175,6 +193,333 @@ xrdp_channel_call_callback(struct xrdp_channel *self, struct stream *s,
return rv;
}

/*****************************************************************************/
static int
drdynvc_insert_uint_124(struct stream *s, uint32_t val)
{
int ret_val;

if (val <= 0xff)
{
out_uint8(s, val);
ret_val = 0;
}
else if (val <= 0xffff)
{
out_uint16_le(s, val);
ret_val = 1;
}
else
{
out_uint32_le(s, val);
ret_val = 2;
}

return ret_val;
}

/*****************************************************************************/
static int
drdynvc_get_chan_id(struct stream *s, char cmd, uint32_t *chan_id_p)
{
int cbChId;
int chan_id;

cbChId = cmd & 0x03;
if (cbChId == 0)
{
if (!s_check_rem(s, 1))
{
return 1;
}
in_uint8(s, chan_id);
}
else if (cbChId == 1)
{
if (!s_check_rem(s, 2))
{
return 1;
}
in_uint16_le(s, chan_id);
}
else
{
if (!s_check_rem(s, 4))
{
return 1;
}
in_uint32_le(s, chan_id);
}
*chan_id_p = chan_id;
return 0;
}

/*****************************************************************************/
static int
drdynvc_process_capability_response(struct xrdp_channel *self,
int cmd, struct stream *s)
{
struct xrdp_session *session;
int cap_version;
int rv;

/* skip padding */
in_uint8s(s, 1);
/* read client's version */
in_uint16_le(s, cap_version);
if ((cap_version != 2) && (cap_version != 3))
{
g_writeln("drdynvc_process_capability_response: incompatible DVC "
"version %d detected", cap_version);
return 1;
}
g_writeln("drdynvc_process_capability_response: DVC version %d selected",
cap_version);
self->drdynvc_state = 1;
session = self->sec_layer->rdp_layer->session;
rv = session->callback(session->id, 0x5558, 0, 0, 0, 0);
return rv;
}

/*****************************************************************************/
static int
drdynvc_process_open_channel_response(struct xrdp_channel *self,
int cmd, struct stream *s)
{
struct xrdp_session *session;
int creation_status;
uint32_t chan_id;
struct xrdp_drdynvc *drdynvc;

if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0)
{
return 1;
}
if (!s_check_rem(s, 4))
{
return 1;
}
in_uint32_le(s, creation_status);
//g_writeln("drdynvc_process_open_channel_response: chan_id 0x%x "
// "creation_status %d", chan_id, creation_status);
session = self->sec_layer->rdp_layer->session;
if (chan_id > 255)
{
return 1;
}
drdynvc = self->drdynvcs + chan_id;
if (creation_status == 0)
{
drdynvc->status = XRDP_DRDYNVC_STATUS_OPEN;
}
else
{
drdynvc->status = XRDP_DRDYNVC_STATUS_CLOSED;
}
if (drdynvc->open_response != NULL)
{
return drdynvc->open_response(session->id, chan_id, creation_status);
}
return 0;
}

/*****************************************************************************/
static int
drdynvc_process_close_channel_response(struct xrdp_channel *self,
int cmd, struct stream *s)
{
struct xrdp_session *session;
uint32_t chan_id;
struct xrdp_drdynvc *drdynvc;

if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0)
{
return 1;
}
//g_writeln("drdynvc_process_close_channel_response: chan_id 0x%x", chan_id);
session = self->sec_layer->rdp_layer->session;
if (chan_id > 255)
{
return 1;
}
drdynvc = self->drdynvcs + chan_id;
drdynvc->status = XRDP_DRDYNVC_STATUS_CLOSED;
if (drdynvc->close_response != NULL)
{
return drdynvc->close_response(session->id, chan_id);
}
return 0;
}

/*****************************************************************************/
static int
drdynvc_process_data_first(struct xrdp_channel *self,
int cmd, struct stream *s)
{
struct xrdp_session *session;
uint32_t chan_id;
int len;
int bytes;
int total_bytes;
struct xrdp_drdynvc *drdynvc;

if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0)
{
return 1;
}
len = (cmd >> 2) & 0x03;
if (len == 0)
{
if (!s_check_rem(s, 1))
{
return 1;
}
in_uint8(s, total_bytes);
}
else if (len == 1)
{
if (!s_check_rem(s, 2))
{
return 1;
}
in_uint16_le(s, total_bytes);
}
else
{
if (!s_check_rem(s, 4))
{
return 1;
}
in_uint32_le(s, total_bytes);
}
bytes = (int) (s->end - s->p);
//g_writeln("drdynvc_process_data_first: bytes %d total_bytes %d", bytes, total_bytes);
session = self->sec_layer->rdp_layer->session;
if (chan_id > 255)
{
return 1;
}
drdynvc = self->drdynvcs + chan_id;
if (drdynvc->data_first != NULL)
{
return drdynvc->data_first(session->id, chan_id, s->p,
bytes, total_bytes);
}
return 0;
}

/*****************************************************************************/
static int
drdynvc_process_data(struct xrdp_channel *self,
int cmd, struct stream *s)
{
struct xrdp_session *session;
uint32_t chan_id;
int bytes;
struct xrdp_drdynvc *drdynvc;

if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0)
{
return 1;
}
bytes = (int) (s->end - s->p);
//g_writeln("drdynvc_process_data: bytes %d", bytes);
session = self->sec_layer->rdp_layer->session;
if (chan_id > 255)
{
return 1;
}
drdynvc = self->drdynvcs + chan_id;
if (drdynvc->data != NULL)
{
return drdynvc->data(session->id, chan_id, s->p, bytes);
}
return 0;
}

/*****************************************************************************/
static int
xrdp_channel_process_drdynvc(struct xrdp_channel *self,
struct mcs_channel_item *channel,
struct stream *s)
{
int total_length;
int length;
int flags;
int cmd;
int rv;
struct stream *ls;

if (!s_check_rem(s, 8))
{
return 1;
}
in_uint32_le(s, total_length);
in_uint32_le(s, flags);
//g_writeln("xrdp_channel_process_drdynvc: total_length %d flags 0x%8.8x",
// total_length, flags);
ls = NULL;
switch (flags & 3)
{
case 0:
length = (int) (s->end - s->p);
out_uint8a(self->s, s->p, length);
in_uint8s(s, length);
return 0;
case 1:
free_stream(self->s);
make_stream(self->s);
init_stream(self->s, total_length);
length = (int) (s->end - s->p);
out_uint8a(self->s, s->p, length);
in_uint8s(s, length);
return 0;
case 2:
length = (int) (s->end - s->p);
out_uint8a(self->s, s->p, length);
in_uint8s(s, length);
ls = self->s;
break;
case 3:
ls = s;
break;
default:
g_writeln("xrdp_channel_process_drdynvc: error");
return 1;
}
if (ls == NULL)
{
return 1;
}
in_uint8(ls, cmd); /* read command */
//g_writeln("xrdp_channel_process_drdynvc: cmd 0x%x", cmd);
rv = 1;
switch (cmd & 0xf0)
{
case CMD_DVC_CAPABILITY:
rv = drdynvc_process_capability_response(self, cmd, s);
break;
case CMD_DVC_OPEN_CHANNEL:
rv = drdynvc_process_open_channel_response(self, cmd, s);
break;
case CMD_DVC_CLOSE_CHANNEL:
rv = drdynvc_process_close_channel_response(self, cmd, s);
break;
case CMD_DVC_DATA_FIRST:
rv = drdynvc_process_data_first(self, cmd, s);
break;
case CMD_DVC_DATA:
rv = drdynvc_process_data(self, cmd, s);
break;
default:
g_writeln("xrdp_channel_process_drdynvc: got unknown "
"command 0x%x", cmd);
break;
}
//g_writeln("xrdp_channel_process_drdynvc: rv %d", rv);
return rv;
}

/*****************************************************************************/
/* returns error */
/* This is called from the secure layer to process an incoming non global
@@ -191,23 +536,319 @@ xrdp_channel_process(struct xrdp_channel *self, struct stream *s,
int channel_id;
struct mcs_channel_item *channel;


/* this assumes that the channels are in order of chanid(mcs channel id)
but they should be, see xrdp_sec_process_mcs_data_channels
the first channel should be MCS_GLOBAL_CHANNEL + 1, second
one should be MCS_GLOBAL_CHANNEL + 2, and so on */
channel_id = (chanid - MCS_GLOBAL_CHANNEL) - 1;
channel = xrdp_channel_get_item(self, channel_id);

if (channel == NULL)
{
g_writeln("xrdp_channel_process, channel not found");
return 1;
}

if (channel->disabled)
{
g_writeln("xrdp_channel_process, channel disabled");
return 0; /* not an error */
}
if (channel_id == self->drdynvc_channel_id)
{
return xrdp_channel_process_drdynvc(self, channel, s);
}
rv = 0;
in_uint32_le(s, length);
in_uint32_le(s, flags);
rv = xrdp_channel_call_callback(self, s, channel_id, length, flags);
return rv;
}

/*****************************************************************************/
/* drdynvc */
static int
xrdp_channel_drdynvc_send_capability_request(struct xrdp_channel *self)
{
struct stream *s;
int flags;
int total_data_len;
int channel_id;
char *phold;

/* setup stream */
make_stream(s);
init_stream(s, 8192);
if (xrdp_channel_init(self, s) != 0)
{
free_stream(s);
return 1;
}
phold = s->p;
out_uint8(s, 0x50); /* insert cmd */
out_uint8(s, 0x00); /* insert padding */
out_uint16_le(s, 2); /* insert version */
/* channel priority unused for now */
out_uint16_le(s, 0x0000); /* priority charge 0 */
out_uint16_le(s, 0x0000); /* priority charge 1 */
out_uint16_le(s, 0x0000); /* priority charge 2 */
out_uint16_le(s, 0x0000); /* priority charge 3 */
s_mark_end(s);
/* send command to client */
total_data_len = (int) (s->end - phold);
flags = CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST;
channel_id = self->drdynvc_channel_id;
if (xrdp_channel_send(self, s, channel_id, total_data_len, flags) != 0)
{
free_stream(s);
return 1;
}
free_stream(s);
return 0;
}

/*****************************************************************************/
int
xrdp_channel_drdynvc_start(struct xrdp_channel *self)
{
int index;
int count;
struct mcs_channel_item *ci;
struct mcs_channel_item *dci;

g_writeln("xrdp_channel_drdynvc_start:");
dci = NULL;
count = self->mcs_layer->channel_list->count;
for (index = 0; index < count; index++)
{
ci = (struct mcs_channel_item *)
list_get_item(self->mcs_layer->channel_list, index);
if (ci != NULL)
{
if (g_strcasecmp(ci->name, "drdynvc") == 0)
{
dci = ci;
}
}
}
if (dci != NULL)
{
self->drdynvc_channel_id = (dci->chanid - MCS_GLOBAL_CHANNEL) - 1;
xrdp_channel_drdynvc_send_capability_request(self);
}
return 0;
}

/*****************************************************************************/
int
xrdp_channel_drdynvc_open(struct xrdp_channel *self, const char *name,
int flags, struct xrdp_drdynvc_procs *procs,
int *chan_id)
{
struct stream *s;
int ChId;
int cbChId;
int chan_pri;
int static_channel_id;
int name_length;
int total_data_len;
int static_flags;
char *cmd_ptr;

make_stream(s);
init_stream(s, 8192);
if (xrdp_channel_init(self, s) != 0)
{
free_stream(s);
return 1;
}
cmd_ptr = s->p;
out_uint8(s, 0);
ChId = 1;
while (self->drdynvcs[ChId].status != XRDP_DRDYNVC_STATUS_CLOSED)
{
ChId++;
if (ChId > 255)
{
free_stream(s);
return 1;
}
}
cbChId = drdynvc_insert_uint_124(s, ChId);
name_length = g_strlen(name);
out_uint8a(s, name, name_length + 1);
chan_pri = 0;
cmd_ptr[0] = CMD_DVC_OPEN_CHANNEL | ((chan_pri << 2) & 0x0c) | cbChId;
static_channel_id = self->drdynvc_channel_id;
static_flags = CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST;
s_mark_end(s);
total_data_len = (int) (s->end - cmd_ptr);
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
static_flags) != 0)
{
free_stream(s);
return 1;
}
free_stream(s);
*chan_id = ChId;
self->drdynvcs[ChId].open_response = procs->open_response;
self->drdynvcs[ChId].close_response = procs->close_response;
self->drdynvcs[ChId].data_first = procs->data_first;
self->drdynvcs[ChId].data = procs->data;
self->drdynvcs[ChId].status = XRDP_DRDYNVC_STATUS_OPEN_SENT;
return 0;
}

/*****************************************************************************/
int
xrdp_channel_drdynvc_close(struct xrdp_channel *self, int chan_id)
{
struct stream *s;
int ChId;
int cbChId;
int static_channel_id;
int total_data_len;
int static_flags;
char *cmd_ptr;

if ((chan_id < 0) || (chan_id > 255))
{
return 1;
}
if ((self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN) &&
(self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN_SENT))
{
/* not open */
return 1;
}
make_stream(s);
init_stream(s, 8192);
if (xrdp_channel_init(self, s) != 0)
{
free_stream(s);
return 1;
}
cmd_ptr = s->p;
out_uint8(s, 0);
ChId = chan_id;
cbChId = drdynvc_insert_uint_124(s, ChId);
cmd_ptr[0] = CMD_DVC_CLOSE_CHANNEL | cbChId;
static_channel_id = self->drdynvc_channel_id;
static_flags = CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST;
s_mark_end(s);
total_data_len = (int) (s->end - cmd_ptr);
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
static_flags) != 0)
{
free_stream(s);
return 1;
}
free_stream(s);
self->drdynvcs[ChId].status = XRDP_DRDYNVC_STATUS_CLOSE_SENT;
return 0;
}

/*****************************************************************************/
int
xrdp_channel_drdynvc_data_first(struct xrdp_channel *self, int chan_id,
const char *data, int data_bytes,
int total_data_bytes)
{
struct stream *s;
int ChId;
int cbChId;
int cbTotalDataSize;
int static_channel_id;
int total_data_len;
int static_flags;
char *cmd_ptr;

if ((chan_id < 0) || (chan_id > 255))
{
return 1;
}
if (self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN)
{
return 1;
}
if (data_bytes > 1590)
{
return 1;
}
make_stream(s);
init_stream(s, 8192);
if (xrdp_channel_init(self, s) != 0)
{
free_stream(s);
return 1;
}
cmd_ptr = s->p;
out_uint8(s, 0);
ChId = chan_id;
cbChId = drdynvc_insert_uint_124(s, ChId);
cbTotalDataSize = drdynvc_insert_uint_124(s, total_data_bytes);
out_uint8p(s, data, data_bytes);
cmd_ptr[0] = CMD_DVC_DATA_FIRST | (cbTotalDataSize << 2) | cbChId;
static_channel_id = self->drdynvc_channel_id;
static_flags = CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST;
s_mark_end(s);
total_data_len = (int) (s->end - cmd_ptr);
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
static_flags) != 0)
{
free_stream(s);
return 1;
}
free_stream(s);
return 0;
}

/*****************************************************************************/
int
xrdp_channel_drdynvc_data(struct xrdp_channel *self, int chan_id,
const char *data, int data_bytes)
{
struct stream *s;
int ChId;
int cbChId;
int static_channel_id;
int total_data_len;
int static_flags;
char *cmd_ptr;

if ((chan_id < 0) || (chan_id > 255))
{
return 1;
}
if (self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN)
{
return 1;
}
if (data_bytes > 1590)
{
return 1;
}
make_stream(s);
init_stream(s, 8192);
if (xrdp_channel_init(self, s) != 0)
{
free_stream(s);
return 1;
}
cmd_ptr = s->p;
out_uint8(s, 0);
ChId = chan_id;
cbChId = drdynvc_insert_uint_124(s, ChId);
out_uint8p(s, data, data_bytes);
cmd_ptr[0] = CMD_DVC_DATA | cbChId;
static_channel_id = self->drdynvc_channel_id;
static_flags = CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST;
s_mark_end(s);
total_data_len = (int) (s->end - cmd_ptr);
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
static_flags) != 0)
{
free_stream(s);
return 1;
}
free_stream(s);
return 0;
}

+ 267
- 123
libxrdp/xrdp_orders.c
File diff suppressed because it is too large
View File


+ 7
- 7
libxrdp/xrdp_orders_rail.c View File

@@ -43,7 +43,7 @@ xrdp_orders_send_window_delete(struct xrdp_orders *self, int window_id)
return 1;
}
self->order_count++;
order_flags = RDP_ORDER_SECONDARY;
order_flags = TS_SECONDARY;
order_flags |= 0xb << 2; /* type TS_ALTSEC_WINDOW */
out_uint8(self->out_s, order_flags);
/* orderSize (2 bytes) */
@@ -76,7 +76,7 @@ xrdp_orders_send_window_cached_icon(struct xrdp_orders *self,
return 1;
}
self->order_count++;
order_flags = RDP_ORDER_SECONDARY;
order_flags = TS_SECONDARY;
order_flags |= 0xb << 2; /* type TS_ALTSEC_WINDOW */
out_uint8(self->out_s, order_flags);
/* orderSize (2 bytes) */
@@ -170,7 +170,7 @@ xrdp_orders_send_window_icon(struct xrdp_orders *self,
return 1;
}
self->order_count++;
order_flags = RDP_ORDER_SECONDARY;
order_flags = TS_SECONDARY;
order_flags |= 0xb << 2; /* type TS_ALTSEC_WINDOW */
out_uint8(self->out_s, order_flags);
/* orderSize (2 bytes) */
@@ -373,7 +373,7 @@ xrdp_orders_send_window_new_update(struct xrdp_orders *self, int window_id,
return 1;
}
self->order_count++;
order_flags = RDP_ORDER_SECONDARY;
order_flags = TS_SECONDARY;
order_flags |= 0xb << 2; /* type TS_ALTSEC_WINDOW */
out_uint8(self->out_s, order_flags);
/* orderSize (2 bytes) */
@@ -517,7 +517,7 @@ xrdp_orders_send_notify_delete(struct xrdp_orders *self, int window_id,
return 1;
}
self->order_count++;
order_flags = RDP_ORDER_SECONDARY;
order_flags = TS_SECONDARY;
order_flags |= 0xb << 2; /* type TS_ALTSEC_WINDOW */
out_uint8(self->out_s, order_flags);
/* orderSize (2 bytes) */
@@ -611,7 +611,7 @@ xrdp_orders_send_notify_new_update(struct xrdp_orders *self,
return 1;
}
self->order_count++;
order_flags = RDP_ORDER_SECONDARY;
order_flags = TS_SECONDARY;
order_flags |= 0xb << 2; /* type TS_ALTSEC_WINDOW */
out_uint8(self->out_s, order_flags);
/* orderSize (2 bytes) */
@@ -705,7 +705,7 @@ xrdp_orders_send_monitored_desktop(struct xrdp_orders *self,
return 1;
}
self->order_count++;
order_flags = RDP_ORDER_SECONDARY;
order_flags = TS_SECONDARY;
order_flags |= 0xb << 2; /* type TS_ALTSEC_WINDOW */
out_uint8(self->out_s, order_flags);
/* orderSize (2 bytes) */


+ 4
- 3
libxrdp/xrdp_rdp.c View File

@@ -269,7 +269,7 @@ xrdp_rdp_read_config(struct xrdp_client_info *client_info)
g_strncpy(client_info->key_file, value, 1023);
}

if (!g_file_readable(client_info->key_file))
if (!g_file_readable(client_info->key_file))
{
log_message(LOG_LEVEL_ERROR, "Cannot read private key file %s: %s",
client_info->key_file, g_get_strerror());
@@ -561,7 +561,7 @@ xrdp_rdp_send_data(struct xrdp_rdp *self, struct stream *s,
DEBUG(("in xrdp_rdp_send_data"));
s_pop_layer(s, rdp_hdr);
len = (int)(s->end - s->p);
pdutype = 0x10 | RDP_PDU_DATA;
pdutype = 0x10 | PDUTYPE_DATAPDU;
pdulen = len;
dlen = len;
ctype = 0;
@@ -1125,6 +1125,7 @@ xrdp_rdp_process_data_font(struct xrdp_rdp *self, struct stream *s)
g_writeln("yeah, up_and_running");
DEBUG(("up_and_running set"));
xrdp_rdp_send_data_update_sync(self);
xrdp_channel_drdynvc_start(self->sec_layer->chan_layer);
}

DEBUG(("out xrdp_rdp_process_data_font"));
@@ -1295,7 +1296,7 @@ xrdp_rdp_send_deactivate(struct xrdp_rdp *self)

s_mark_end(s);

if (xrdp_rdp_send(self, s, RDP_PDU_DEACTIVATE) != 0)
if (xrdp_rdp_send(self, s, PDUTYPE_DEACTIVATEALLPDU) != 0)
{
free_stream(s);
DEBUG(("out xrdp_rdp_send_deactivate error"));


+ 27
- 24
libxrdp/xrdp_sec.c View File

@@ -701,6 +701,12 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
DEBUG(("flag RDP_LOGON_LEAVE_AUDIO found"));
}

if (flags & RDP_LOGON_RAIL)
{
self->rdp_layer->client_info.rail_enable = 1;
DEBUG(("flag RDP_LOGON_RAIL found"));
}

if ((flags & RDP_LOGON_AUTO) && (!self->rdp_layer->client_info.is_mce))
/* todo, for now not allowing autologon and mce both */
{
@@ -1840,57 +1846,54 @@ xrdp_sec_process_mcs_data_channels(struct xrdp_sec *self, struct stream *s)
{
int num_channels;
int index;
struct xrdp_client_info *client_info = (struct xrdp_client_info *)NULL;
struct xrdp_client_info *client_info;
struct mcs_channel_item *channel_item;

client_info = &(self->rdp_layer->client_info);


DEBUG(("processing channels, channels_allowed is %d", client_info->channels_allowed));

DEBUG(("processing channels, channels_allowed is %d",
client_info->channels_allowed));
/* this is an option set in xrdp.ini */
if (client_info->channels_allowed != 1) /* are channels on? */
if (client_info->channels_allowed == 0) /* are channels on? */
{
g_writeln("xrdp_sec_process_mcs_data_channels: all channels are disabled by configuration");
log_message(LOG_LEVEL_INFO, "all channels are disabled by "
"configuration");
return 0;
}

if (!s_check_rem(s, 4))
{
return 1;
}

in_uint32_le(s, num_channels);

if (num_channels > 31)
{
return 1;
}

for (index = 0; index < num_channels; index++)
{
struct mcs_channel_item *channel_item;

channel_item = (struct mcs_channel_item *)
g_malloc(sizeof(struct mcs_channel_item), 1);
channel_item = g_new0(struct mcs_channel_item, 1);
if (!s_check_rem(s, 12))
{
g_free(channel_item);
return 1;
}
in_uint8a(s, channel_item->name, 8);
if (g_strlen(channel_item->name) == 0)
in_uint32_le(s, channel_item->flags);
if (g_strlen(channel_item->name) > 0)
{
channel_item->chanid = MCS_GLOBAL_CHANNEL + (index + 1);
log_message(LOG_LEVEL_INFO, "adding channel item name %s chan_id "
"%d flags 0x%8.8x", channel_item->name,
channel_item->chanid, channel_item->flags);
list_add_item(self->mcs_layer->channel_list,
(intptr_t) channel_item);
DEBUG(("got channel flags %8.8x name %s", channel_item->flags,
channel_item->name));
}
else
{
log_message(LOG_LEVEL_WARNING, "xrdp_sec_process_mcs_data_channels: got an empty channel name, ignoring it");
g_free(channel_item);
continue;
}
in_uint32_le(s, channel_item->flags);
channel_item->chanid = MCS_GLOBAL_CHANNEL + (index + 1);
list_add_item(self->mcs_layer->channel_list, (tintptr) channel_item);
DEBUG(("got channel flags %8.8x name %s", channel_item->flags,
channel_item->name));
}

return 0;
}



+ 1
- 1
neutrinordp/xrdp-neutrinordp.c View File

@@ -1527,7 +1527,7 @@ lfreerdp_pre_connect(freerdp *instance)
instance->settings->password = g_strdup(mod->password);
instance->settings->domain = g_strdup(mod->domain);

if (mod->client_info.rail_support_level > 0)
if (mod->client_info.rail_enable && (mod->client_info.rail_support_level > 0))
{
LLOGLN(0, ("Railsupport !!!!!!!!!!!!!!!!!!"));
instance->settings->remote_app = 1;


+ 0
- 2
sesman/chansrv/Makefile.am View File

@@ -56,8 +56,6 @@ xrdp_chansrv_SOURCES = \
clipboard_file.h \
devredir.c \
devredir.h \
drdynvc.c \
drdynvc.h \
fifo.c \
fifo.h \
irp.c \


+ 7
- 13
sesman/chansrv/Makefile.in View File

@@ -122,10 +122,9 @@ am__installdirs = "$(DESTDIR)$(sbindir)"
PROGRAMS = $(sbin_PROGRAMS)
am_xrdp_chansrv_OBJECTS = chansrv.$(OBJEXT) chansrv_common.$(OBJEXT) \
chansrv_fuse.$(OBJEXT) clipboard.$(OBJEXT) \
clipboard_file.$(OBJEXT) devredir.$(OBJEXT) drdynvc.$(OBJEXT) \
fifo.$(OBJEXT) irp.$(OBJEXT) rail.$(OBJEXT) \
smartcard.$(OBJEXT) smartcard_pcsc.$(OBJEXT) sound.$(OBJEXT) \
xcommon.$(OBJEXT)
clipboard_file.$(OBJEXT) devredir.$(OBJEXT) fifo.$(OBJEXT) \
irp.$(OBJEXT) rail.$(OBJEXT) smartcard.$(OBJEXT) \
smartcard_pcsc.$(OBJEXT) sound.$(OBJEXT) xcommon.$(OBJEXT)
xrdp_chansrv_OBJECTS = $(am_xrdp_chansrv_OBJECTS)
am__DEPENDENCIES_1 =
@XRDP_FUSE_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
@@ -160,10 +159,10 @@ am__maybe_remake_depfiles = depfiles
am__depfiles_remade = ./$(DEPDIR)/chansrv.Po \
./$(DEPDIR)/chansrv_common.Po ./$(DEPDIR)/chansrv_fuse.Po \
./$(DEPDIR)/clipboard.Po ./$(DEPDIR)/clipboard_file.Po \
./$(DEPDIR)/devredir.Po ./$(DEPDIR)/drdynvc.Po \
./$(DEPDIR)/fifo.Po ./$(DEPDIR)/irp.Po ./$(DEPDIR)/rail.Po \
./$(DEPDIR)/smartcard.Po ./$(DEPDIR)/smartcard_pcsc.Po \
./$(DEPDIR)/sound.Po ./$(DEPDIR)/xcommon.Po
./$(DEPDIR)/devredir.Po ./$(DEPDIR)/fifo.Po ./$(DEPDIR)/irp.Po \
./$(DEPDIR)/rail.Po ./$(DEPDIR)/smartcard.Po \
./$(DEPDIR)/smartcard_pcsc.Po ./$(DEPDIR)/sound.Po \
./$(DEPDIR)/xcommon.Po
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -383,8 +382,6 @@ xrdp_chansrv_SOURCES = \
clipboard_file.h \
devredir.c \
devredir.h \
drdynvc.c