diff options
Diffstat (limited to 'rdp/rdp.h')
-rw-r--r-- | rdp/rdp.h | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/rdp/rdp.h b/rdp/rdp.h new file mode 100644 index 00000000..bb5bbb3e --- /dev/null +++ b/rdp/rdp.h @@ -0,0 +1,436 @@ +/* + 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 2005 + + librdp main header file + +*/ + +/* include other h files */ +#include "arch.h" +#include "parse.h" +#include "os_calls.h" +#include "ssl_calls.h" +#include "xrdp_constants.h" +#include "defines.h" + +struct rdp_brush +{ + int xorigin; + int yorigin; + int style; + char pattern[8]; +}; + +struct rdp_pen +{ + int style; + int width; + int color; +}; + +struct rdp_colormap +{ + int ncolors; + int colors[256]; +}; + +struct rdp_bitmap +{ + int width; + int height; + int bpp; + char* data; +}; + +struct rdp_cursor +{ + int x; + int y; + int width; + int height; + char mask[(32 * 32) / 8]; + char data[(32 * 32) * 3]; +}; + +/* tcp */ +struct rdp_tcp +{ + int sck; + int sck_closed; + struct rdp_iso* iso_layer; /* owner */ +}; + +/* iso */ +struct rdp_iso +{ + struct rdp_mcs* mcs_layer; /* owner */ + struct rdp_tcp* tcp_layer; +}; + +/* mcs */ +struct rdp_mcs +{ + struct rdp_sec* sec_layer; /* owner */ + struct rdp_iso* iso_layer; + int userid; + struct stream* client_mcs_data; + struct stream* server_mcs_data; +}; + +/* sec */ +struct rdp_sec +{ + struct rdp_rdp* rdp_layer; /* owner */ + struct rdp_mcs* mcs_layer; + struct rdp_lic* lic_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 or 16 */ + int crypt_level; /* 1 = low, 2 = medium, 3 = high */ + char sign_key[16]; + void* decrypt_rc4_info; + void* encrypt_rc4_info; +}; + +/* licence */ +struct rdp_lic +{ + struct rdp_sec* sec_layer; /* owner */ + char licence_key[16]; + char licence_sign_key[16]; + int licence_issued; +}; + +/* rdp */ +struct rdp_rdp +{ + struct mod* mod; + struct rdp_sec* sec_layer; + struct rdp_orders* orders; + int share_id; + int use_rdp5; + int bitmap_compression; + int bitmap_cache; + int desktop_save; + int polygon_ellipse_orders; + /* cache */ + struct rdp_colormap colormap; + struct rdp_cursor cursors[32]; +}; + +struct rdp_orders_state +{ + /* order stuff */ + int order_type; + /* clip state */ + int clip_left; + int clip_top; + int clip_right; + int clip_bottom; + /* text order state */ + int text_font; + int text_flags; + int text_opcode; + int text_mixmode; + int text_fgcolor; + int text_bgcolor; + int text_clipleft; + int text_cliptop; + int text_clipright; + int text_clipbottom; + int text_boxleft; + int text_boxtop; + int text_boxright; + int text_boxbottom; + struct rdp_brush text_brush; + int text_x; + int text_y; + int text_length; + char text_text[256]; + /* destblt order state */ + int dest_x; + int dest_y; + int dest_cx; + int dest_cy; + int dest_opcode; + /* patblt order state */ + int pat_x; + int pat_y; + int pat_cx; + int pat_cy; + int pat_opcode; + int pat_bgcolor; + int pat_fgcolor; + struct rdp_brush pat_brush; + /* screenblt order state */ + int screenblt_x; + int screenblt_y; + int screenblt_cx; + int screenblt_cy; + int screenblt_opcode; + int screenblt_srcx; + int screenblt_srcy; + /* line order state */ + int line_mixmode; + int line_startx; + int line_starty; + int line_endx; + int line_endy; + int line_bgcolor; + int line_opcode; + struct rdp_pen line_pen; + /* rect order state */ + int rect_x; + int rect_y; + int rect_cx; + int rect_cy; + int rect_color; + /* desksave order state */ + int desksave_offset; + int desksave_left; + int desksave_top; + int desksave_right; + int desksave_bottom; + int desksave_action; + /* memblt order state */ + int memblt_cache_id; + int memblt_color_table; + int memblt_x; + int memblt_y; + int memblt_cx; + int memblt_cy; + int memblt_opcode; + int memblt_srcx; + int memblt_srcy; + int memblt_cache_idx; + /* polyline order state */ + int polyline_x; + int polyline_y; + int polyline_opcode; + int polyline_fgcolor; + int polyline_lines; + int polyline_datasize; + char polyline_data[256]; +}; + +/* orders */ +struct rdp_orders +{ + struct rdp_rdp* rdp_layer; + /* order state */ + struct rdp_orders_state state; + /* cache */ + struct rdp_colormap* cache_colormap[6]; + struct rdp_bitmap* cache_bitmap[3][600]; +}; + +struct mod +{ + int size; /* size of this struct */ + /* client functions */ + int (*mod_start)(struct mod* v, int w, int h, int bpp); + int (*mod_connect)(struct mod* v); + int (*mod_event)(struct mod* v, int msg, long param1, long param2, + long param3, long param4); + int (*mod_signal)(struct mod* v); + int (*mod_end)(struct mod* v); + int (*mod_set_param)(struct mod* v, char* name, char* value); + /* server functions */ + int (*server_begin_update)(struct mod* v); + int (*server_end_update)(struct mod* v); + int (*server_fill_rect)(struct mod* v, int x, int y, int cx, int cy); + int (*server_screen_blt)(struct mod* v, int x, int y, int cx, int cy, + int srcx, int srcy); + int (*server_paint_rect)(struct mod* v, int x, int y, int cx, int cy, + char* data, int width, int height, int srcx, int srcy); + int (*server_set_cursor)(struct mod* v, int x, int y, char* data, char* mask); + int (*server_palette)(struct mod* v, int* palette); + int (*server_msg)(struct mod* v, char* msg, int code); + int (*server_is_term)(struct mod* v); + int (*server_set_clip)(struct mod* v, int x, int y, int cx, int cy); + int (*server_reset_clip)(struct mod* v); + int (*server_set_fgcolor)(struct mod* v, int fgcolor); + int (*server_set_bgcolor)(struct mod* v, int bgcolor); + int (*server_set_opcode)(struct mod* v, int opcode); + int (*server_set_mixmode)(struct mod* v, int mixmode); + int (*server_set_brush)(struct mod* v, int x_orgin, int y_orgin, + int style, char* pattern); + int (*server_set_pen)(struct mod* v, int style, + int width); + int (*server_draw_line)(struct mod* v, int x1, int y1, int x2, int y2); + int (*server_add_char)(struct mod* v, int font, int charactor, + int offset, int baseline, + int width, int height, char* data); + int (*server_draw_text)(struct mod* v, int font, + int flags, int mixmode, 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); + int (*server_reset)(struct mod* v, int width, int height, int bpp); + /* common */ + long handle; /* pointer to self as long */ + long wm; + long painter; + int sck; + /* mod data */ + struct rdp_rdp* rdp_layer; + int width; + int height; + int rdp_bpp; + int xrdp_bpp; + char ip[256]; + char port[256]; + char username[256]; + char password[256]; + char hostname[256]; + char domain[256]; + char program[256]; + char directory[256]; + int keylayout; + int up_and_running; + struct stream* in_s; +}; + +/* rdp_tcp.c */ +struct rdp_tcp* APP_CC +rdp_tcp_create(struct rdp_iso* owner); +void APP_CC +rdp_tcp_delete(struct rdp_tcp* self); +int APP_CC +rdp_tcp_init(struct rdp_tcp* self, struct stream* s); +int APP_CC +rdp_tcp_recv(struct rdp_tcp* self, struct stream* s, int len); +int APP_CC +rdp_tcp_send(struct rdp_tcp* self, struct stream* s); +int APP_CC +rdp_tcp_connect(struct rdp_tcp* self, char* ip, char* port); +int APP_CC +rdp_tcp_disconnect(struct rdp_tcp* self); + +/* rdp_ico.c */ +struct rdp_iso* APP_CC +rdp_iso_create(struct rdp_mcs* owner); +void APP_CC +rdp_iso_delete(struct rdp_iso* self); +int APP_CC +rdp_iso_recv(struct rdp_iso* self, struct stream* s); +int APP_CC +rdp_iso_init(struct rdp_iso* self, struct stream* s); +int APP_CC +rdp_iso_send(struct rdp_iso* self, struct stream* s); +int APP_CC +rdp_iso_connect(struct rdp_iso* self, char* ip, char* port); +int APP_CC +rdp_iso_disconnect(struct rdp_iso* self); + +/* rdp_mcs.c */ +struct rdp_mcs* APP_CC +rdp_mcs_create(struct rdp_sec* owner, + struct stream* client_mcs_data, + struct stream* server_mcs_data); +void APP_CC +rdp_mcs_delete(struct rdp_mcs* self); +int APP_CC +rdp_mcs_init(struct rdp_mcs* self, struct stream* s); +int APP_CC +rdp_mcs_send(struct rdp_mcs* self, struct stream* s); +int APP_CC +rdp_mcs_connect(struct rdp_mcs* self, char* ip, char* port); +int APP_CC +rdp_mcs_recv(struct rdp_mcs* self, struct stream* s, int* chan); + +/* rdp_sec.c */ +struct rdp_sec* APP_CC +rdp_sec_create(struct rdp_rdp* owner); +void APP_CC +rdp_sec_delete(struct rdp_sec* self); +int APP_CC +rdp_sec_init(struct rdp_sec* self, struct stream* s, int flags); +int APP_CC +rdp_sec_send(struct rdp_sec* self, struct stream* s, int flags); +int APP_CC +rdp_sec_recv(struct rdp_sec* self, struct stream* s, int* chan); +int APP_CC +rdp_sec_connect(struct rdp_sec* self, char* ip, char* port); +void APP_CC +rdp_sec_buf_out_uint32(char* buffer, int value); +void APP_CC +rdp_sec_hash_16(char* out, char* in, char* salt1, char* salt2); +void APP_CC +rdp_sec_hash_48(char* out, char* in, char* salt1, char* salt2, int salt); +void APP_CC +rdp_sec_sign(char* signature, int siglen, char* session_key, int keylen, + char* data, int datalen); + +/* rdp_rdp.c */ +struct rdp_rdp* APP_CC +rdp_rdp_create(struct mod* owner); +void APP_CC +rdp_rdp_delete(struct rdp_rdp* self); +int APP_CC +rdp_rdp_connect(struct rdp_rdp* self, char* ip, char* port); +int APP_CC +rdp_rdp_send_input(struct rdp_rdp* self, struct stream* s, + int time, int message_type, + int device_flags, int param1, int param2); +int APP_CC +rdp_rdp_send_invalidate(struct rdp_rdp* self, struct stream* s, + int left, int top, int width, int height); +int APP_CC +rdp_rdp_recv(struct rdp_rdp* self, struct stream* s, int* type); +int APP_CC +rdp_rdp_process_data_pdu(struct rdp_rdp* self, struct stream* s); +int APP_CC +rdp_rdp_process_demand_active(struct rdp_rdp* self, struct stream* s); +void APP_CC +rdp_rdp_out_unistr(struct stream* s, char* text); + +/* rdp_bitmap.c */ +int APP_CC +rdp_bitmap_decompress(char* output, int width, int height, char* input, + int size, int Bpp); + +/* rdp_orders.c */ +struct rdp_orders* APP_CC +rdp_orders_create(struct rdp_rdp* owner); +void APP_CC +rdp_orders_delete(struct rdp_orders* self); +void APP_CC +rdp_orders_reset_state(struct rdp_orders* self); +int APP_CC +rdp_orders_process_orders(struct rdp_orders* self, struct stream* s, + int num_orders); + +/* rdp_lic.c */ +struct rdp_lic* APP_CC +rdp_lic_create(struct rdp_sec* owner); +void APP_CC +rdp_lic_delete(struct rdp_lic* self); +void APP_CC +rdp_lic_process(struct rdp_lic* self, struct stream* s); |