|
|
|
/*
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
|
|
xrdp: A Remote Desktop Protocol server.
|
|
|
|
Copyright (C) Jay Sorg 2004-2010
|
|
|
|
|
|
|
|
libxrdp header
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#if !defined(LIBXRDP_H)
|
|
|
|
#define LIBXRDP_H
|
|
|
|
|
|
|
|
#if defined(HAVE_CONFIG_H)
|
|
|
|
#include "config_ac.h"
|
|
|
|
#endif
|
|
|
|
#include "arch.h"
|
|
|
|
#include "parse.h"
|
|
|
|
#include "trans.h"
|
|
|
|
#include "xrdp_constants.h"
|
|
|
|
#include "defines.h"
|
|
|
|
#include "os_calls.h"
|
|
|
|
#include "ssl_calls.h"
|
|
|
|
#include "list.h"
|
|
|
|
#include "file.h"
|
|
|
|
#include "libxrdpinc.h"
|
|
|
|
#include "file_loc.h"
|
|
|
|
#include "xrdp_client_info.h"
|
|
|
|
|
|
|
|
/* tcp */
|
|
|
|
struct xrdp_tcp
|
|
|
|
{
|
|
|
|
struct trans* trans;
|
|
|
|
struct xrdp_iso* iso_layer; /* owner */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* iso */
|
|
|
|
struct xrdp_iso
|
|
|
|
{
|
|
|
|
struct xrdp_mcs* mcs_layer; /* owner */
|
|
|
|
struct xrdp_tcp* tcp_layer;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* used in mcs */
|
|
|
|
struct mcs_channel_item
|
|
|
|
{
|
|
|
|
char name[16];
|
|
|
|
int flags;
|
|
|
|
int chanid;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* mcs */
|
|
|
|
struct xrdp_mcs
|
|
|
|
{
|
|
|
|
struct xrdp_sec* sec_layer; /* owner */
|
|
|
|
struct xrdp_iso* iso_layer;
|
|
|
|
int userid;
|
|
|
|
int chanid;
|
|
|
|
struct stream* client_mcs_data;
|
|
|
|
struct stream* server_mcs_data;
|
|
|
|
struct list* channel_list;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* sec */
|
|
|
|
struct xrdp_sec
|
|
|
|
{
|
|
|
|
struct xrdp_rdp* rdp_layer; /* owner */
|
|
|
|
struct xrdp_mcs* mcs_layer;
|
|
|
|
struct xrdp_channel* chan_layer;
|
|
|
|
char server_random[32];
|
|
|
|
char client_random[64];
|
|
|
|
char client_crypt_random[72];
|
|
|
|
struct stream client_mcs_data;
|
|
|
|
struct stream server_mcs_data;
|
|
|
|
int decrypt_use_count;
|
|
|
|
int encrypt_use_count;
|
|
|
|
char decrypt_key[16];
|
|
|
|
char encrypt_key[16];
|
|
|
|
char decrypt_update_key[16];
|
|
|
|
char encrypt_update_key[16];
|
|
|
|
int rc4_key_size; /* 1 = 40 bit, 2 = 128 bit */
|
|
|
|
int rc4_key_len; /* 8 = 40 bit, 16 = 128 bit */
|
|
|
|
int crypt_level; /* 1, 2, 3 = low, meduim, high */
|
|
|
|
char sign_key[16];
|
|
|
|
void* decrypt_rc4_info;
|
|
|
|
void* encrypt_rc4_info;
|
|
|
|
char pub_exp[4];
|
|
|
|
char pub_mod[64];
|
|
|
|
char pub_sig[64];
|
|
|
|
char pri_exp[64];
|
|
|
|
int channel_code;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* channel */
|
|
|
|
struct xrdp_channel
|
|
|
|
{
|
|
|
|
struct xrdp_sec* sec_layer;
|
|
|
|
struct xrdp_mcs* mcs_layer;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* rdp */
|
|
|
|
struct xrdp_rdp
|
|
|
|
{
|
|
|
|
struct xrdp_session* session;
|
|
|
|
struct xrdp_sec* sec_layer;
|
|
|
|
int share_id;
|
|
|
|
int mcs_channel;
|
|
|
|
struct xrdp_client_info client_info;
|
|
|
|
void* mppc_enc;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* state */
|
|
|
|
struct xrdp_orders_state
|
|
|
|
{
|
|
|
|
int last_order; /* last order sent */
|
|
|
|
|
|
|
|
int clip_left; /* RDP_ORDER_BOUNDS, RDP_ORDER_LASTBOUNDS */
|
|
|
|
int clip_top;
|
|
|
|
int clip_right;
|
|
|
|
int clip_bottom;
|
|
|
|
|
|
|
|
int rect_x; /* RDP_ORDER_RECT */
|
|
|
|
int rect_y;
|
|
|
|
int rect_cx;
|
|
|
|
int rect_cy;
|
|
|
|
int rect_color;
|
|
|
|
|
|
|
|
int scr_blt_x; /* RDP_ORDER_SCREENBLT */
|
|
|
|
int scr_blt_y;
|
|
|
|
int scr_blt_cx;
|
|
|
|
int scr_blt_cy;
|
|
|
|
int scr_blt_rop;
|
|
|
|
int scr_blt_srcx;
|
|
|
|
int scr_blt_srcy;
|
|
|
|
|
|
|
|
int pat_blt_x; /* RDP_ORDER_PATBLT */
|
|
|
|
int pat_blt_y;
|
|
|
|
int pat_blt_cx;
|
|
|
|
int pat_blt_cy;
|
|
|
|
int pat_blt_rop;
|
|
|
|
int pat_blt_bg_color;
|
|
|
|
int pat_blt_fg_color;
|
|
|
|
struct xrdp_brush pat_blt_brush;
|
|
|
|
|
|
|
|
int dest_blt_x; /* RDP_ORDER_DESTBLT */
|
|
|
|
int dest_blt_y;
|
|
|
|
int dest_blt_cx;
|
|
|
|
int dest_blt_cy;
|
|
|
|
int dest_blt_rop;
|
|
|
|
|
|
|
|
int line_mix_mode; /* RDP_ORDER_LINE */
|
|
|
|
int line_startx;
|
|
|
|
int line_starty;
|
|
|
|
int line_endx;
|
|
|
|
int line_endy;
|
|
|
|
int line_bg_color;
|
|
|
|
int line_rop;
|
|
|
|
struct xrdp_pen line_pen;
|
|
|
|
|
|
|
|
int mem_blt_color_table; /* RDP_ORDER_MEMBLT */
|
|
|
|
int mem_blt_cache_id;
|
|
|
|
int mem_blt_x;
|
|
|
|
int mem_blt_y;
|
|
|
|
int mem_blt_cx;
|
|
|
|
int mem_blt_cy;
|
|
|
|
int mem_blt_rop;
|
|
|
|
int mem_blt_srcx;
|
|
|
|
int mem_blt_srcy;
|
|
|
|
int mem_blt_cache_idx;
|
|
|
|
|
|
|
|
int text_font; /* RDP_ORDER_TEXT2 */
|
|
|
|
int text_flags;
|
|
|
|
int text_unknown;
|
|
|
|
int text_mixmode;
|
|
|
|
int text_fg_color;
|
|
|
|
int text_bg_color;
|
|
|
|
int text_clip_left;
|
|
|
|
int text_clip_top;
|
|
|
|
int text_clip_right;
|
|
|
|
int text_clip_bottom;
|
|
|
|
int text_box_left;
|
|
|
|
int text_box_top;
|
|
|
|
int text_box_right;
|
|
|
|
int text_box_bottom;
|
|
|
|
int text_x;
|
|
|
|
int text_y;
|
|
|
|
int text_len;
|
|
|
|
char* text_data;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* orders */
|
|
|
|
struct xrdp_orders
|
|
|
|
{
|
|
|
|
struct stream* out_s;
|
|
|
|
struct xrdp_rdp* rdp_layer;
|
|
|
|
struct xrdp_session* session;
|
|
|
|
struct xrdp_wm* wm;
|
|
|
|
|
|
|
|
char* order_count_ptr; /* pointer to count, set when sending */
|
|
|
|
int order_count;
|
|
|
|
int order_level; /* inc for every call to xrdp_orders_init */
|
|
|
|
struct xrdp_orders_state orders_state;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* xrdp_tcp.c */
|
|
|
|
struct xrdp_tcp* APP_CC
|
|
|
|
xrdp_tcp_create(struct xrdp_iso* owner, struct trans* trans);
|
|
|
|
void APP_CC
|
|
|
|
xrdp_tcp_delete(struct xrdp_tcp* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_tcp_init(struct xrdp_tcp* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_tcp_send(struct xrdp_tcp* self, struct stream* s);
|
|
|
|
|
|
|
|
/* xrdp_iso.c */
|
|
|
|
struct xrdp_iso* APP_CC
|
|
|
|
xrdp_iso_create(struct xrdp_mcs* owner, struct trans* trans);
|
|
|
|
void APP_CC
|
|
|
|
xrdp_iso_delete(struct xrdp_iso* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_iso_init(struct xrdp_iso* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_iso_recv(struct xrdp_iso* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_iso_send(struct xrdp_iso* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_iso_incoming(struct xrdp_iso* self);
|
|
|
|
|
|
|
|
/* xrdp_mcs.c */
|
|
|
|
struct xrdp_mcs* APP_CC
|
|
|
|
xrdp_mcs_create(struct xrdp_sec* owner, struct trans* trans,
|
|
|
|
struct stream* client_mcs_data,
|
|
|
|
struct stream* server_mcs_data);
|
|
|
|
void APP_CC
|
|
|
|
xrdp_mcs_delete(struct xrdp_mcs* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_mcs_init(struct xrdp_mcs* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_mcs_recv(struct xrdp_mcs* self, struct stream* s, int* chan);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_mcs_send(struct xrdp_mcs* self, struct stream* s, int chan);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_mcs_incoming(struct xrdp_mcs* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_mcs_disconnect(struct xrdp_mcs* self);
|
|
|
|
|
|
|
|
/* xrdp_sec.c */
|
|
|
|
struct xrdp_sec* APP_CC
|
|
|
|
xrdp_sec_create(struct xrdp_rdp* owner, struct trans* trans, int crypt_level,
|
|
|
|
int channel_code);
|
|
|
|
void APP_CC
|
|
|
|
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(struct xrdp_sec* self, struct stream* s, int* chan);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_sec_send(struct xrdp_sec* self, struct stream* s, int chan);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_sec_process_mcs_data(struct xrdp_sec* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_sec_out_mcs_data(struct xrdp_sec* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_sec_incoming(struct xrdp_sec* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_sec_disconnect(struct xrdp_sec* self);
|
|
|
|
|
|
|
|
/* xrdp_rdp.c */
|
|
|
|
struct xrdp_rdp* APP_CC
|
|
|
|
xrdp_rdp_create(struct xrdp_session* session, struct trans* trans);
|
|
|
|
void APP_CC
|
|
|
|
xrdp_rdp_delete(struct xrdp_rdp* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_init(struct xrdp_rdp* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_init_data(struct xrdp_rdp* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_send(struct xrdp_rdp* self, struct stream* s, int pdu_type);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_send_data(struct xrdp_rdp* self, struct stream* s,
|
|
|
|
int data_pdu_type);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_send_data_update_sync(struct xrdp_rdp* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_incoming(struct xrdp_rdp* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_send_demand_active(struct xrdp_rdp* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_process_data(struct xrdp_rdp* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_disconnect(struct xrdp_rdp* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_rdp_send_deactive(struct xrdp_rdp* self);
|
|
|
|
|
|
|
|
/* xrdp_orders.c */
|
|
|
|
struct xrdp_orders* APP_CC
|
|
|
|
xrdp_orders_create(struct xrdp_session* session,
|
|
|
|
struct xrdp_rdp* rdp_layer);
|
|
|
|
void APP_CC
|
|
|
|
xrdp_orders_delete(struct xrdp_orders* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_reset(struct xrdp_orders* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_init(struct xrdp_orders* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send(struct xrdp_orders* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_force_send(struct xrdp_orders* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_rect(struct xrdp_orders* self, int x, int y, int cx, int cy,
|
|
|
|
int color, struct xrdp_rect* rect);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_screen_blt(struct xrdp_orders* self, int x, int y,
|
|
|
|
int cx, int cy, int srcx, int srcy,
|
|
|
|
int rop, struct xrdp_rect* rect);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_pat_blt(struct xrdp_orders* self, int x, int y,
|
|
|
|
int cx, int cy, int rop, int bg_color,
|
|
|
|
int fg_color, struct xrdp_brush* brush,
|
|
|
|
struct xrdp_rect* rect);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_dest_blt(struct xrdp_orders* self, int x, int y,
|
|
|
|
int cx, int cy, int rop,
|
|
|
|
struct xrdp_rect* rect);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_line(struct xrdp_orders* self, int mix_mode,
|
|
|
|
int startx, int starty,
|
|
|
|
int endx, int endy, int rop, int bg_color,
|
|
|
|
struct xrdp_pen* pen,
|
|
|
|
struct xrdp_rect* rect);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_mem_blt(struct xrdp_orders* self, int cache_id,
|
|
|
|
int color_table, int x, int y, int cx, int cy,
|
|
|
|
int rop, int srcx, int srcy,
|
|
|
|
int cache_idx, struct xrdp_rect* rect);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_text(struct xrdp_orders* self,
|
|
|
|
int font, int flags, int mixmode,
|
|
|
|
int fg_color, int bg_color,
|
|
|
|
int clip_left, int clip_top,
|
|
|
|
int clip_right, int clip_bottom,
|
|
|
|
int box_left, int box_top,
|
|
|
|
int box_right, int box_bottom,
|
|
|
|
int x, int y, char* data, int data_len,
|
|
|
|
struct xrdp_rect* rect);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send_palette(struct xrdp_orders* self, int* palette,
|
|
|
|
int cache_id);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send_raw_bitmap(struct xrdp_orders* self,
|
|
|
|
int width, int height, int bpp, char* data,
|
|
|
|
int cache_id, int cache_idx);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send_bitmap(struct xrdp_orders* self,
|
|
|
|
int width, int height, int bpp, char* data,
|
|
|
|
int cache_id, int cache_idx);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send_font(struct xrdp_orders* self,
|
|
|
|
struct xrdp_font_char* font_char,
|
|
|
|
int font_index, int char_index);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send_raw_bitmap2(struct xrdp_orders* self,
|
|
|
|
int width, int height, int bpp, char* data,
|
|
|
|
int cache_id, int cache_idx);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send_bitmap2(struct xrdp_orders* self,
|
|
|
|
int width, int height, int bpp, char* data,
|
|
|
|
int cache_id, int cache_idx, int hints);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send_brush(struct xrdp_orders* self, int width, int height,
|
|
|
|
int bpp, int type, int size, char* data, int cache_id);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send_create_os_surface(struct xrdp_orders* self, int id,
|
|
|
|
int width, int height,
|
|
|
|
struct list* del_list);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_orders_send_switch_os_surface(struct xrdp_orders* self, int id);
|
|
|
|
|
|
|
|
/* xrdp_bitmap_compress.c */
|
|
|
|
int APP_CC
|
|
|
|
xrdp_bitmap_compress(char* in_data, int width, int height,
|
|
|
|
struct stream* s, int bpp, int byte_limit,
|
|
|
|
int start_line, struct stream* temp_s,
|
|
|
|
int e);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_jpeg_compress(char* in_data, int width, int height,
|
|
|
|
struct stream* s, int bpp, int byte_limit,
|
|
|
|
int start_line, struct stream* temp_s,
|
|
|
|
int e);
|
|
|
|
|
|
|
|
/* xrdp_channel.c */
|
|
|
|
struct xrdp_channel* APP_CC
|
|
|
|
xrdp_channel_create(struct xrdp_sec* owner, struct xrdp_mcs* mcs_layer);
|
|
|
|
void APP_CC
|
|
|
|
xrdp_channel_delete(struct xrdp_channel* self);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_channel_init(struct xrdp_channel* self, struct stream* s);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_channel_send(struct xrdp_channel* self, struct stream* s, int channel_id,
|
|
|
|
int total_data_len, int flags);
|
|
|
|
int APP_CC
|
|
|
|
xrdp_channel_process(struct xrdp_channel* self, struct stream* s,
|
|
|
|
int chanid);
|
|
|
|
|
|
|
|
#endif
|