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
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef RDESKTOP_PROTO_H
21 #define RDESKTOP_PROTO_H
29 BOOL
bitmap_decompress(uint8
* output
, int width
, int height
, uint8
* input
, int size
, int Bpp
);
31 void cache_rebuild_bmpcache_linked_list(uint8 id
, sint16
* idx
, int count
);
32 void cache_bump_bitmap(uint8 id
, uint16 idx
, int bump
);
33 void cache_evict_bitmap(uint8 id
);
34 RD_HBITMAP
cache_get_bitmap(uint8 id
, uint16 idx
);
35 void cache_put_bitmap(uint8 id
, uint16 idx
, RD_HBITMAP bitmap
);
36 void cache_save_state(void);
37 FONTGLYPH
*cache_get_font(uint8 font
, uint16 character
);
38 void cache_put_font(uint8 font
, uint16 character
, uint16 offset
, uint16 baseline
, uint16 width
,
39 uint16 height
, RD_HGLYPH pixmap
);
40 DATABLOB
*cache_get_text(uint8 cache_id
);
41 void cache_put_text(uint8 cache_id
, void *data
, int length
);
42 uint8
*cache_get_desktop(uint32 offset
, int cx
, int cy
, int bytes_per_pixel
);
43 void cache_put_desktop(uint32 offset
, int cx
, int cy
, int scanline
, int bytes_per_pixel
,
45 RD_HCURSOR
cache_get_cursor(uint16 cache_idx
);
46 void cache_put_cursor(uint16 cache_idx
, RD_HCURSOR cursor
);
48 VCHANNEL
*channel_register(char *name
, uint32 flags
, void (*callback
) (STREAM
));
49 STREAM
channel_init(VCHANNEL
* channel
, uint32 length
);
50 void channel_send(STREAM s
, VCHANNEL
* channel
);
51 void channel_process(STREAM s
, uint16 mcs_channel
);
53 void cliprdr_send_simple_native_format_announce(uint32 format
);
54 void cliprdr_send_native_format_announce(uint8
* formats_data
, uint32 formats_data_length
);
55 void cliprdr_send_data_request(uint32 format
);
56 void cliprdr_send_data(uint8
* data
, uint32 length
);
57 void cliprdr_set_mode(const char *optarg
);
58 BOOL
cliprdr_init(void);
60 int disk_enum_devices(uint32
* id
, char *optarg
);
61 RD_NTSTATUS
disk_query_information(RD_NTHANDLE handle
, uint32 info_class
, STREAM out
);
62 RD_NTSTATUS
disk_set_information(RD_NTHANDLE handle
, uint32 info_class
, STREAM in
, STREAM out
);
63 RD_NTSTATUS
disk_check_notify(RD_NTHANDLE handle
);
64 RD_NTSTATUS
disk_create_notify(RD_NTHANDLE handle
, uint32 info_class
);
65 RD_NTSTATUS
disk_query_volume_information(RD_NTHANDLE handle
, uint32 info_class
, STREAM out
);
66 RD_NTSTATUS
disk_query_directory(RD_NTHANDLE handle
, uint32 info_class
, char *pattern
, STREAM out
);
68 int mppc_expand(uint8
* data
, uint32 clen
, uint8 ctype
, uint32
* roff
, uint32
* rlen
);
70 int get_current_workarea(uint32
* x
, uint32
* y
, uint32
* width
, uint32
* height
);
73 STREAM
iso_init(int length
);
74 void iso_send(STREAM s
);
75 STREAM
iso_recv(uint8
* rdpver
);
76 BOOL
iso_connect(char *server
, char *username
);
77 BOOL
iso_reconnect(char *server
);
78 void iso_disconnect(void);
79 void iso_reset_state(void);
81 void licence_process(STREAM s
);
83 STREAM
mcs_init(int length
);
84 void mcs_send_to_channel(STREAM s
, uint16 channel
);
85 void mcs_send(STREAM s
);
86 STREAM
mcs_recv(uint16
* channel
, uint8
* rdpver
);
87 BOOL
mcs_connect(char *server
, STREAM mcs_data
, char *username
);
88 BOOL
mcs_reconnect(char *server
, STREAM mcs_data
);
89 void mcs_disconnect(void);
90 void mcs_reset_state(void);
92 void process_orders(STREAM s
, uint16 num_orders
);
93 void reset_order_state(void);
95 int parallel_enum_devices(uint32
* id
, char *optarg
);
97 int printer_enum_devices(uint32
* id
, char *optarg
);
99 int printercache_load_blob(char *printer_name
, uint8
** data
);
100 void printercache_process(STREAM s
);
102 void pstcache_touch_bitmap(uint8 cache_id
, uint16 cache_idx
, uint32 stamp
);
103 BOOL
pstcache_load_bitmap(uint8 cache_id
, uint16 cache_idx
);
104 BOOL
pstcache_save_bitmap(uint8 cache_id
, uint16 cache_idx
, uint8
* key
, uint8 width
,
105 uint8 height
, uint16 length
, uint8
* data
);
106 int pstcache_enumerate(uint8 id
, HASH_KEY
* keylist
);
107 BOOL
pstcache_init(uint8 cache_id
);
109 int main(int argc
, char *argv
[]);
110 void generate_random(uint8
* random
);
111 void *xmalloc(int size
);
112 char *xstrdup(const char *s
);
113 void *xrealloc(void *oldmem
, int size
);
114 void xfree(void *mem
);
115 void error(char *format
, ...);
116 void warning(char *format
, ...);
117 void unimpl(char *format
, ...);
118 void hexdump(unsigned char *p
, unsigned int len
);
119 char *next_arg(char *src
, char needle
);
120 void toupper_str(char *p
);
121 BOOL
str_startswith(const char *s
, const char *prefix
);
122 BOOL
str_handle_lines(const char *input
, char **rest
, str_handle_lines_t linehandler
, void *data
);
123 BOOL
subprocess(char *const argv
[], str_handle_lines_t linehandler
, void *data
);
124 char *l_to_a(long N
, int base
);
125 int load_licence(unsigned char **data
);
126 void save_licence(unsigned char *data
, int length
);
127 BOOL
rd_pstcache_mkdir(void);
128 int rd_open_file(char *filename
);
129 void rd_close_file(int fd
);
130 int rd_read_file(int fd
, void *ptr
, int len
);
131 int rd_write_file(int fd
, void *ptr
, int len
);
132 int rd_lseek_file(int fd
, int offset
);
133 BOOL
rd_lock_file(int fd
, int start
, int len
);
135 void rdp5_process(STREAM s
);
137 void rdp_out_unistr(STREAM s
, char *string
, int len
);
138 int rdp_in_unistr(STREAM s
, char *string
, int uni_len
);
139 void rdp_send_input(uint32 time
, uint16 message_type
, uint16 device_flags
, uint16 param1
,
141 void rdp_send_client_window_status(int status
);
142 void process_colour_pointer_pdu(STREAM s
);
143 void process_cached_pointer_pdu(STREAM s
);
144 void process_system_pointer_pdu(STREAM s
);
145 void process_bitmap_updates(STREAM s
);
146 void process_palette(STREAM s
);
147 void process_disconnect_pdu(STREAM s
, uint32
* ext_disc_reason
);
148 void rdp_main_loop(BOOL
* deactivated
, uint32
* ext_disc_reason
);
149 BOOL
rdp_loop(BOOL
* deactivated
, uint32
* ext_disc_reason
);
150 BOOL
rdp_connect(char *server
, uint32 flags
, char *domain
, char *password
, char *command
,
152 BOOL
rdp_reconnect(char *server
, uint32 flags
, char *domain
, char *password
, char *command
,
153 char *directory
, char *cookie
);
154 void rdp_reset_state(void);
155 void rdp_disconnect(void);
157 int get_device_index(RD_NTHANDLE handle
);
158 void convert_to_unix_filename(char *filename
);
159 BOOL
rdpdr_init(void);
160 void rdpdr_add_fds(int *n
, fd_set
* rfds
, fd_set
* wfds
, struct timeval
*tv
, BOOL
* timeout
);
161 struct async_iorequest
*rdpdr_remove_iorequest(struct async_iorequest
*prev
,
162 struct async_iorequest
*iorq
);
163 void rdpdr_check_fds(fd_set
* rfds
, fd_set
* wfds
, BOOL timed_out
);
164 BOOL
rdpdr_abort_io(uint32 fd
, uint32 major
, RD_NTSTATUS status
);
166 void rdpsnd_send_completion(uint16 tick
, uint8 packet_index
);
167 BOOL
rdpsnd_init(void);
169 BOOL
wave_out_open(void);
170 void wave_out_close(void);
171 BOOL
wave_out_format_supported(WAVEFORMATEX
* pwfx
);
172 BOOL
wave_out_set_format(WAVEFORMATEX
* pwfx
);
173 void wave_out_volume(uint16 left
, uint16 right
);
174 void wave_out_write(STREAM s
, uint16 tick
, uint8 index
);
175 void wave_out_play(void);
177 void sec_hash_48(uint8
* out
, uint8
* in
, uint8
* salt1
, uint8
* salt2
, uint8 salt
);
178 void sec_hash_16(uint8
* out
, uint8
* in
, uint8
* salt1
, uint8
* salt2
);
179 void buf_out_uint32(uint8
* buffer
, uint32 value
);
180 void sec_sign(uint8
* signature
, int siglen
, uint8
* session_key
, int keylen
, uint8
* data
,
182 void sec_decrypt(uint8
* data
, int length
);
183 STREAM
sec_init(uint32 flags
, int maxlen
);
184 void sec_send_to_channel(STREAM s
, uint32 flags
, uint16 channel
);
185 void sec_send(STREAM s
, uint32 flags
);
186 void sec_process_mcs_data(STREAM s
);
187 STREAM
sec_recv(uint8
* rdpver
);
188 BOOL
sec_connect(char *server
, char *username
);
189 BOOL
sec_reconnect(char *server
);
190 void sec_disconnect(void);
191 void sec_reset_state(void);
193 int serial_enum_devices(uint32
* id
, char *optarg
);
194 BOOL
serial_get_event(RD_NTHANDLE handle
, uint32
* result
);
195 BOOL
serial_get_timeout(RD_NTHANDLE handle
, uint32 length
, uint32
* timeout
, uint32
* itv_timeout
);
197 STREAM
tcp_init(uint32 maxlen
);
198 void tcp_send(STREAM s
);
199 STREAM
tcp_recv(STREAM s
, uint32 length
);
200 BOOL
tcp_connect(char *server
);
201 void tcp_disconnect(void);
202 char *tcp_get_address(void);
203 void tcp_reset_state(void);
205 void ui_clip_format_announce(uint8
* data
, uint32 length
);
206 void ui_clip_handle_data(uint8
* data
, uint32 length
);
207 void ui_clip_request_failed(void);
208 void ui_clip_request_data(uint32 format
);
209 void ui_clip_sync(void);
210 void ui_clip_set_mode(const char *optarg
);
211 void xclip_init(void);
213 BOOL
xkeymap_from_locale(const char *locale
);
214 FILE *xkeymap_open(const char *filename
);
215 void xkeymap_init(void);
216 BOOL
handle_special_keys(uint32 keysym
, unsigned int state
, uint32 ev_time
, BOOL pressed
);
217 key_translation
xkeymap_translate_key(uint32 keysym
, unsigned int keycode
, unsigned int state
);
218 void xkeymap_send_keys(uint32 keysym
, unsigned int keycode
, unsigned int state
, uint32 ev_time
,
219 BOOL pressed
, uint8 nesting
);
220 uint16
xkeymap_translate_button(unsigned int button
);
221 char *get_ksname(uint32 keysym
);
222 void save_remote_modifiers(uint8 scancode
);
223 void restore_remote_modifiers(uint32 ev_time
, uint8 scancode
);
224 void ensure_remote_modifiers(uint32 ev_time
, key_translation tr
);
225 unsigned int read_keyboard_state(void);
226 uint16
ui_get_numlock_state(unsigned int state
);
227 void reset_modifier_keys(void);
228 void rdp_send_scancode(uint32 time
, uint16 flags
, uint8 scancode
);
230 BOOL
get_key_state(unsigned int state
, uint32 keysym
);
232 void ui_deinit(void);
233 BOOL
ui_create_window(void);
234 void ui_resize_window(void);
235 void ui_destroy_window(void);
236 void xwin_toggle_fullscreen(void);
237 int ui_select(int rdp_socket
);
238 void ui_move_pointer(int x
, int y
);
239 RD_HBITMAP
ui_create_bitmap(int width
, int height
, uint8
* data
);
240 void ui_paint_bitmap(int x
, int y
, int cx
, int cy
, int width
, int height
, uint8
* data
);
241 void ui_destroy_bitmap(RD_HBITMAP bmp
);
242 RD_HGLYPH
ui_create_glyph(int width
, int height
, uint8
* data
);
243 void ui_destroy_glyph(RD_HGLYPH glyph
);
244 RD_HCURSOR
ui_create_cursor(unsigned int x
, unsigned int y
, int width
, int height
, uint8
* andmask
,
246 void ui_set_cursor(RD_HCURSOR cursor
);
247 void ui_destroy_cursor(RD_HCURSOR cursor
);
248 void ui_set_null_cursor(void);
249 RD_HCOLOURMAP
ui_create_colourmap(COLOURMAP
* colours
);
250 void ui_destroy_colourmap(RD_HCOLOURMAP map
);
251 void ui_set_colourmap(RD_HCOLOURMAP map
);
252 void ui_set_clip(int x
, int y
, int cx
, int cy
);
253 void ui_reset_clip(void);
255 void ui_destblt(uint8 opcode
, int x
, int y
, int cx
, int cy
);
256 void ui_patblt(uint8 opcode
, int x
, int y
, int cx
, int cy
, BRUSH
* brush
, int bgcolour
,
258 void ui_screenblt(uint8 opcode
, int x
, int y
, int cx
, int cy
, int srcx
, int srcy
);
259 void ui_memblt(uint8 opcode
, int x
, int y
, int cx
, int cy
, RD_HBITMAP src
, int srcx
, int srcy
);
260 void ui_triblt(uint8 opcode
, int x
, int y
, int cx
, int cy
, RD_HBITMAP src
, int srcx
, int srcy
,
261 BRUSH
* brush
, int bgcolour
, int fgcolour
);
262 void ui_line(uint8 opcode
, int startx
, int starty
, int endx
, int endy
, PEN
* pen
);
263 void ui_rect(int x
, int y
, int cx
, int cy
, int colour
);
264 void ui_polygon(uint8 opcode
, uint8 fillmode
, POINT
* point
, int npoints
, BRUSH
* brush
,
265 int bgcolour
, int fgcolour
);
266 void ui_polyline(uint8 opcode
, POINT
* points
, int npoints
, PEN
* pen
);
267 void ui_ellipse(uint8 opcode
, uint8 fillmode
, int x
, int y
, int cx
, int cy
, BRUSH
* brush
,
268 int bgcolour
, int fgcolour
);
269 void ui_draw_glyph(int mixmode
, int x
, int y
, int cx
, int cy
, RD_HGLYPH glyph
, int srcx
, int srcy
,
270 int bgcolour
, int fgcolour
);
271 void ui_draw_text(uint8 font
, uint8 flags
, uint8 opcode
, int mixmode
, int x
, int y
, int clipx
,
272 int clipy
, int clipcx
, int clipcy
, int boxx
, int boxy
, int boxcx
, int boxcy
,
273 BRUSH
* brush
, int bgcolour
, int fgcolour
, uint8
* text
, uint8 length
);
274 void ui_desktop_save(uint32 offset
, int x
, int y
, int cx
, int cy
);
275 void ui_desktop_restore(uint32 offset
, int x
, int y
, int cx
, int cy
);
276 void ui_begin_update(void);
277 void ui_end_update(void);
278 void ui_seamless_begin(BOOL hidden
);
279 void ui_seamless_hide_desktop(void);
280 void ui_seamless_unhide_desktop(void);
281 void ui_seamless_toggle(void);
282 void ui_seamless_create_window(unsigned long id
, unsigned long group
, unsigned long parent
,
283 unsigned long flags
);
284 void ui_seamless_destroy_window(unsigned long id
, unsigned long flags
);
285 void ui_seamless_move_window(unsigned long id
, int x
, int y
, int width
, int height
,
286 unsigned long flags
);
287 void ui_seamless_restack_window(unsigned long id
, unsigned long behind
, unsigned long flags
);
288 void ui_seamless_settitle(unsigned long id
, const char *title
, unsigned long flags
);
289 void ui_seamless_setstate(unsigned long id
, unsigned int state
, unsigned long flags
);
290 void ui_seamless_syncbegin(unsigned long flags
);
291 void ui_seamless_ack(unsigned int serial
);
293 BOOL
lspci_init(void);
295 BOOL
seamless_init(void);
296 unsigned int seamless_send_sync(void);
297 unsigned int seamless_send_state(unsigned long id
, unsigned int state
, unsigned long flags
);
298 unsigned int seamless_send_position(unsigned long id
, int x
, int y
, int width
, int height
,
299 unsigned long flags
);
300 void seamless_select_timeout(struct timeval
*tv
);
301 unsigned int seamless_send_zchange(unsigned long id
, unsigned long below
, unsigned long flags
);
302 unsigned int seamless_send_focus(unsigned long id
, unsigned long flags
);