1 /* -*- c-basic-offset: 8 -*-
2 rdesktop: A Remote Desktop Protocol client.
3 Copyright (C) Matthew Chapman 1999-2005
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 BOOL
bitmap_decompress(uint8
* output
, int width
, int height
, uint8
* input
, int size
, int Bpp
);
30 void cache_rebuild_bmpcache_linked_list(uint8 id
, sint16
* idx
, int count
);
31 void cache_bump_bitmap(uint8 id
, uint16 idx
, int bump
);
32 void cache_evict_bitmap(uint8 id
);
33 RD_HBITMAP
cache_get_bitmap(uint8 id
, uint16 idx
);
34 void cache_put_bitmap(uint8 id
, uint16 idx
, RD_HBITMAP bitmap
);
35 void cache_save_state(void);
36 FONTGLYPH
*cache_get_font(uint8 font
, uint16 character
);
37 void cache_put_font(uint8 font
, uint16 character
, uint16 offset
, uint16 baseline
, uint16 width
,
38 uint16 height
, RD_HGLYPH pixmap
);
39 DATABLOB
*cache_get_text(uint8 cache_id
);
40 void cache_put_text(uint8 cache_id
, void *data
, int length
);
41 uint8
*cache_get_desktop(uint32 offset
, int cx
, int cy
, int bytes_per_pixel
);
42 void cache_put_desktop(uint32 offset
, int cx
, int cy
, int scanline
, int bytes_per_pixel
,
44 RD_HCURSOR
cache_get_cursor(uint16 cache_idx
);
45 void cache_put_cursor(uint16 cache_idx
, RD_HCURSOR cursor
);
47 VCHANNEL
*channel_register(char *name
, uint32 flags
, void (*callback
) (STREAM
));
48 STREAM
channel_init(VCHANNEL
* channel
, uint32 length
);
49 void channel_send(STREAM s
, VCHANNEL
* channel
);
50 void channel_process(STREAM s
, uint16 mcs_channel
);
52 void cliprdr_send_simple_native_format_announce(uint32 format
);
53 void cliprdr_send_native_format_announce(uint8
* formats_data
, uint32 formats_data_length
);
54 void cliprdr_send_data_request(uint32 format
);
55 void cliprdr_send_data(uint8
* data
, uint32 length
);
56 void cliprdr_set_mode(const char *optarg
);
57 BOOL
cliprdr_init(void);
59 int disk_enum_devices(uint32
* id
, char *optarg
);
60 RD_NTSTATUS
disk_query_information(RD_NTHANDLE handle
, uint32 info_class
, STREAM out
);
61 RD_NTSTATUS
disk_set_information(RD_NTHANDLE handle
, uint32 info_class
, STREAM in
, STREAM out
);
62 RD_NTSTATUS
disk_check_notify(RD_NTHANDLE handle
);
63 RD_NTSTATUS
disk_create_notify(RD_NTHANDLE handle
, uint32 info_class
);
64 RD_NTSTATUS
disk_query_volume_information(RD_NTHANDLE handle
, uint32 info_class
, STREAM out
);
65 RD_NTSTATUS
disk_query_directory(RD_NTHANDLE handle
, uint32 info_class
, char *pattern
, STREAM out
);
67 int mppc_expand(uint8
* data
, uint32 clen
, uint8 ctype
, uint32
* roff
, uint32
* rlen
);
69 int get_current_workarea(uint32
* x
, uint32
* y
, uint32
* width
, uint32
* height
);
72 STREAM
iso_init(int length
);
73 void iso_send(STREAM s
);
74 STREAM
iso_recv(uint8
* rdpver
);
75 BOOL
iso_connect(char *server
, char *username
);
76 BOOL
iso_reconnect(char *server
);
77 void iso_disconnect(void);
78 void iso_reset_state(void);
80 void licence_process(STREAM s
);
82 STREAM
mcs_init(int length
);
83 void mcs_send_to_channel(STREAM s
, uint16 channel
);
84 void mcs_send(STREAM s
);
85 STREAM
mcs_recv(uint16
* channel
, uint8
* rdpver
);
86 BOOL
mcs_connect(char *server
, STREAM mcs_data
, char *username
);
87 BOOL
mcs_reconnect(char *server
, STREAM mcs_data
);
88 void mcs_disconnect(void);
89 void mcs_reset_state(void);
91 void process_orders(STREAM s
, uint16 num_orders
);
92 void reset_order_state(void);
94 int parallel_enum_devices(uint32
* id
, char *optarg
);
96 int printer_enum_devices(uint32
* id
, char *optarg
);
98 int printercache_load_blob(char *printer_name
, uint8
** data
);
99 void printercache_process(STREAM s
);
101 void pstcache_touch_bitmap(uint8 cache_id
, uint16 cache_idx
, uint32 stamp
);
102 BOOL
pstcache_load_bitmap(uint8 cache_id
, uint16 cache_idx
);
103 BOOL
pstcache_save_bitmap(uint8 cache_id
, uint16 cache_idx
, uint8
* key
, uint8 width
,
104 uint8 height
, uint16 length
, uint8
* data
);
105 int pstcache_enumerate(uint8 id
, HASH_KEY
* keylist
);
106 BOOL
pstcache_init(uint8 cache_id
);
108 int main(int argc
, char *argv
[]);
109 void generate_random(uint8
* random
);
110 void *xmalloc(int size
);
111 char *xstrdup(const char *s
);
112 void *xrealloc(void *oldmem
, int size
);
113 void xfree(void *mem
);
114 void error(char *format
, ...);
115 void warning(char *format
, ...);
116 void unimpl(char *format
, ...);
117 void hexdump(unsigned char *p
, unsigned int len
);
118 char *next_arg(char *src
, char needle
);
119 void toupper_str(char *p
);
120 BOOL
str_startswith(const char *s
, const char *prefix
);
121 BOOL
str_handle_lines(const char *input
, char **rest
, str_handle_lines_t linehandler
, void *data
);
122 BOOL
subprocess(char *const argv
[], str_handle_lines_t linehandler
, void *data
);
123 char *l_to_a(long N
, int base
);
124 int load_licence(unsigned char **data
);
125 void save_licence(unsigned char *data
, int length
);
126 BOOL
rd_pstcache_mkdir(void);
127 int rd_open_file(char *filename
);
128 void rd_close_file(int fd
);
129 int rd_read_file(int fd
, void *ptr
, int len
);
130 int rd_write_file(int fd
, void *ptr
, int len
);
131 int rd_lseek_file(int fd
, int offset
);
132 BOOL
rd_lock_file(int fd
, int start
, int len
);
134 void rdp5_process(STREAM s
);
136 void rdp_out_unistr(STREAM s
, char *string
, int len
);
137 int rdp_in_unistr(STREAM s
, char *string
, int uni_len
);
138 void rdp_send_input(uint32 time
, uint16 message_type
, uint16 device_flags
, uint16 param1
,
140 void rdp_send_client_window_status(int status
);
141 void process_colour_pointer_pdu(STREAM s
);
142 void process_cached_pointer_pdu(STREAM s
);
143 void process_system_pointer_pdu(STREAM s
);
144 void process_bitmap_updates(STREAM s
);
145 void process_palette(STREAM s
);
146 void process_disconnect_pdu(STREAM s
, uint32
* ext_disc_reason
);
147 void rdp_main_loop(BOOL
* deactivated
, uint32
* ext_disc_reason
);
148 BOOL
rdp_loop(BOOL
* deactivated
, uint32
* ext_disc_reason
);
149 BOOL
rdp_connect(char *server
, uint32 flags
, char *domain
, char *password
, char *command
,
151 BOOL
rdp_reconnect(char *server
, uint32 flags
, char *domain
, char *password
, char *command
,
152 char *directory
, char *cookie
);
153 void rdp_reset_state(void);
154 void rdp_disconnect(void);
156 int get_device_index(RD_NTHANDLE handle
);
157 void convert_to_unix_filename(char *filename
);
158 BOOL
rdpdr_init(void);
159 void rdpdr_add_fds(int *n
, fd_set
* rfds
, fd_set
* wfds
, struct timeval
*tv
, BOOL
* timeout
);
160 struct async_iorequest
*rdpdr_remove_iorequest(struct async_iorequest
*prev
,
161 struct async_iorequest
*iorq
);
162 void rdpdr_check_fds(fd_set
* rfds
, fd_set
* wfds
, BOOL timed_out
);
163 BOOL
rdpdr_abort_io(uint32 fd
, uint32 major
, RD_NTSTATUS status
);
165 void rdpsnd_send_completion(uint16 tick
, uint8 packet_index
);
166 BOOL
rdpsnd_init(void);
168 BOOL
wave_out_open(void);
169 void wave_out_close(void);
170 BOOL
wave_out_format_supported(WAVEFORMATEX
* pwfx
);
171 BOOL
wave_out_set_format(WAVEFORMATEX
* pwfx
);
172 void wave_out_volume(uint16 left
, uint16 right
);
173 void wave_out_write(STREAM s
, uint16 tick
, uint8 index
);
174 void wave_out_play(void);
176 void sec_hash_48(uint8
* out
, uint8
* in
, uint8
* salt1
, uint8
* salt2
, uint8 salt
);
177 void sec_hash_16(uint8
* out
, uint8
* in
, uint8
* salt1
, uint8
* salt2
);
178 void buf_out_uint32(uint8
* buffer
, uint32 value
);
179 void sec_sign(uint8
* signature
, int siglen
, uint8
* session_key
, int keylen
, uint8
* data
,
181 void sec_decrypt(uint8
* data
, int length
);
182 STREAM
sec_init(uint32 flags
, int maxlen
);
183 void sec_send_to_channel(STREAM s
, uint32 flags
, uint16 channel
);
184 void sec_send(STREAM s
, uint32 flags
);
185 void sec_process_mcs_data(STREAM s
);
186 STREAM
sec_recv(uint8
* rdpver
);
187 BOOL
sec_connect(char *server
, char *username
);
188 BOOL
sec_reconnect(char *server
);
189 void sec_disconnect(void);
190 void sec_reset_state(void);
192 int serial_enum_devices(uint32
* id
, char *optarg
);
193 BOOL
serial_get_event(RD_NTHANDLE handle
, uint32
* result
);
194 BOOL
serial_get_timeout(RD_NTHANDLE handle
, uint32 length
, uint32
* timeout
, uint32
* itv_timeout
);
196 STREAM
tcp_init(uint32 maxlen
);
197 void tcp_send(STREAM s
);
198 STREAM
tcp_recv(STREAM s
, uint32 length
);
199 BOOL
tcp_connect(char *server
);
200 void tcp_disconnect(void);
201 char *tcp_get_address(void);
202 void tcp_reset_state(void);
204 void ui_clip_format_announce(uint8
* data
, uint32 length
);
205 void ui_clip_handle_data(uint8
* data
, uint32 length
);
206 void ui_clip_request_failed(void);
207 void ui_clip_request_data(uint32 format
);
208 void ui_clip_sync(void);
209 void ui_clip_set_mode(const char *optarg
);
210 void xclip_init(void);
212 BOOL
xkeymap_from_locale(const char *locale
);
213 FILE *xkeymap_open(const char *filename
);
214 void xkeymap_init(void);
215 BOOL
handle_special_keys(uint32 keysym
, unsigned int state
, uint32 ev_time
, BOOL pressed
);
216 key_translation
xkeymap_translate_key(uint32 keysym
, unsigned int keycode
, unsigned int state
);
217 void xkeymap_send_keys(uint32 keysym
, unsigned int keycode
, unsigned int state
, uint32 ev_time
,
218 BOOL pressed
, uint8 nesting
);
219 uint16
xkeymap_translate_button(unsigned int button
);
220 char *get_ksname(uint32 keysym
);
221 void save_remote_modifiers(uint8 scancode
);
222 void restore_remote_modifiers(uint32 ev_time
, uint8 scancode
);
223 void ensure_remote_modifiers(uint32 ev_time
, key_translation tr
);
224 unsigned int read_keyboard_state(void);
225 uint16
ui_get_numlock_state(unsigned int state
);
226 void reset_modifier_keys(void);
227 void rdp_send_scancode(uint32 time
, uint16 flags
, uint8 scancode
);
229 BOOL
get_key_state(unsigned int state
, uint32 keysym
);
231 void ui_deinit(void);
232 BOOL
ui_create_window(void);
233 void ui_resize_window(void);
234 void ui_destroy_window(void);
235 void xwin_toggle_fullscreen(void);
236 int ui_select(int rdp_socket
);
237 void ui_move_pointer(int x
, int y
);
238 RD_HBITMAP
ui_create_bitmap(int width
, int height
, uint8
* data
);
239 void ui_paint_bitmap(int x
, int y
, int cx
, int cy
, int width
, int height
, uint8
* data
);
240 void ui_destroy_bitmap(RD_HBITMAP bmp
);
241 RD_HGLYPH
ui_create_glyph(int width
, int height
, uint8
* data
);
242 void ui_destroy_glyph(RD_HGLYPH glyph
);
243 RD_HCURSOR
ui_create_cursor(unsigned int x
, unsigned int y
, int width
, int height
, uint8
* andmask
,
245 void ui_set_cursor(RD_HCURSOR cursor
);
246 void ui_destroy_cursor(RD_HCURSOR cursor
);
247 void ui_set_null_cursor(void);
248 RD_HCOLOURMAP
ui_create_colourmap(COLOURMAP
* colours
);
249 void ui_destroy_colourmap(RD_HCOLOURMAP map
);
250 void ui_set_colourmap(RD_HCOLOURMAP map
);
251 void ui_set_clip(int x
, int y
, int cx
, int cy
);
252 void ui_reset_clip(void);
254 void ui_destblt(uint8 opcode
, int x
, int y
, int cx
, int cy
);
255 void ui_patblt(uint8 opcode
, int x
, int y
, int cx
, int cy
, BRUSH
* brush
, int bgcolour
,
257 void ui_screenblt(uint8 opcode
, int x
, int y
, int cx
, int cy
, int srcx
, int srcy
);
258 void ui_memblt(uint8 opcode
, int x
, int y
, int cx
, int cy
, RD_HBITMAP src
, int srcx
, int srcy
);
259 void ui_triblt(uint8 opcode
, int x
, int y
, int cx
, int cy
, RD_HBITMAP src
, int srcx
, int srcy
,
260 BRUSH
* brush
, int bgcolour
, int fgcolour
);
261 void ui_line(uint8 opcode
, int startx
, int starty
, int endx
, int endy
, PEN
* pen
);
262 void ui_rect(int x
, int y
, int cx
, int cy
, int colour
);
263 void ui_polygon(uint8 opcode
, uint8 fillmode
, POINT
* point
, int npoints
, BRUSH
* brush
,
264 int bgcolour
, int fgcolour
);
265 void ui_polyline(uint8 opcode
, POINT
* points
, int npoints
, PEN
* pen
);
266 void ui_ellipse(uint8 opcode
, uint8 fillmode
, int x
, int y
, int cx
, int cy
, BRUSH
* brush
,
267 int bgcolour
, int fgcolour
);
268 void ui_draw_glyph(int mixmode
, int x
, int y
, int cx
, int cy
, RD_HGLYPH glyph
, int srcx
, int srcy
,
269 int bgcolour
, int fgcolour
);
270 void ui_draw_text(uint8 font
, uint8 flags
, uint8 opcode
, int mixmode
, int x
, int y
, int clipx
,
271 int clipy
, int clipcx
, int clipcy
, int boxx
, int boxy
, int boxcx
, int boxcy
,
272 BRUSH
* brush
, int bgcolour
, int fgcolour
, uint8
* text
, uint8 length
);
273 void ui_desktop_save(uint32 offset
, int x
, int y
, int cx
, int cy
);
274 void ui_desktop_restore(uint32 offset
, int x
, int y
, int cx
, int cy
);
275 void ui_begin_update(void);
276 void ui_end_update(void);
277 void ui_seamless_begin(BOOL hidden
);
278 void ui_seamless_hide_desktop(void);
279 void ui_seamless_unhide_desktop(void);
280 void ui_seamless_toggle(void);
281 void ui_seamless_create_window(unsigned long id
, unsigned long group
, unsigned long parent
,
282 unsigned long flags
);
283 void ui_seamless_destroy_window(unsigned long id
, unsigned long flags
);
284 void ui_seamless_move_window(unsigned long id
, int x
, int y
, int width
, int height
,
285 unsigned long flags
);
286 void ui_seamless_restack_window(unsigned long id
, unsigned long behind
, unsigned long flags
);
287 void ui_seamless_settitle(unsigned long id
, const char *title
, unsigned long flags
);
288 void ui_seamless_setstate(unsigned long id
, unsigned int state
, unsigned long flags
);
289 void ui_seamless_syncbegin(unsigned long flags
);
290 void ui_seamless_ack(unsigned int serial
);
292 BOOL
lspci_init(void);
294 BOOL
seamless_init(void);
295 unsigned int seamless_send_sync(void);
296 unsigned int seamless_send_state(unsigned long id
, unsigned int state
, unsigned long flags
);
297 unsigned int seamless_send_position(unsigned long id
, int x
, int y
, int width
, int height
,
298 unsigned long flags
);
299 void seamless_select_timeout(struct timeval
*tv
);
300 unsigned int seamless_send_zchange(unsigned long id
, unsigned long below
, unsigned long flags
);
301 unsigned int seamless_send_focus(unsigned long id
, unsigned long flags
);