Martin Ettl <ettl DOT martin AT gmx DOT de>: Fix various resource and memory leaks
[reactos.git] / reactos / base / applications / tsclient / rdesktop / rdesktop.h
1 /*
2 rdesktop: A Remote Desktop Protocol client.
3 Master include file
4 Copyright (C) Matthew Chapman 1999-2005
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21 #ifndef WIN32_LEAN_AND_MEAN
22 #define WIN32_LEAN_AND_MEAN
23 #endif
24
25 #include <windows.h>
26 #include <winsock2.h>
27 #include <cchannel.h>
28
29 #if 0
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <string.h>
33 #include <dirent.h>
34 #include <sys/time.h>
35 #ifdef HAVE_SYS_SELECT_H
36 #include <sys/select.h>
37 #else
38 #include <sys/types.h>
39 #include <unistd.h>
40 #endif
41 #include <limits.h> /* PATH_MAX */
42
43 /* FIXME FIXME */
44 #include <windows.h>
45 #include <X11/Xlib.h>
46 #include <X11/Xatom.h>
47 /* FIXME FIXME */
48 #endif
49
50 // TODO
51 #include <openssl/rc4.h>
52 #include <openssl/md5.h>
53 #include <openssl/sha.h>
54 #include <openssl/bn.h>
55 #include <openssl/x509v3.h>
56
57 #define VERSION "1.4.1"
58
59 #ifdef WITH_DEBUG
60 #define DEBUG(args) printf args;
61 #else
62 #define DEBUG(args)
63 #endif
64
65 #ifdef WITH_DEBUG_KBD
66 #define DEBUG_KBD(args) printf args;
67 #else
68 #define DEBUG_KBD(args)
69 #endif
70
71 #ifdef WITH_DEBUG_RDP5
72 #define DEBUG_RDP5(args) printf args;
73 #else
74 #define DEBUG_RDP5(args)
75 #endif
76
77 #ifdef WITH_DEBUG_CLIPBOARD
78 #define DEBUG_CLIPBOARD(args) printf args;
79 #else
80 #define DEBUG_CLIPBOARD(args)
81 #endif
82
83 #ifdef WITH_DEBUG_CHANNEL
84 #define DEBUG_CHANNEL(args) printf args;
85 #else
86 #define DEBUG_CHANNEL(args)
87 #endif
88
89 #define STRNCPY(dst,src,n) { strncpy(dst,src,n-1); dst[n-1] = 0; }
90
91 #ifndef MIN
92 #define MIN(x,y) (((x) < (y)) ? (x) : (y))
93 #endif
94
95 #ifndef MAX
96 #define MAX(x,y) (((x) > (y)) ? (x) : (y))
97 #endif
98
99 /* timeval macros */
100 #ifndef timerisset
101 #define timerisset(tvp)\
102 ((tvp)->tv_sec || (tvp)->tv_usec)
103 #endif
104 #ifndef timercmp
105 #define timercmp(tvp, uvp, cmp)\
106 ((tvp)->tv_sec cmp (uvp)->tv_sec ||\
107 (tvp)->tv_sec == (uvp)->tv_sec &&\
108 (tvp)->tv_usec cmp (uvp)->tv_usec)
109 #endif
110 #ifndef timerclear
111 #define timerclear(tvp)\
112 ((tvp)->tv_sec = (tvp)->tv_usec = 0)
113 #endif
114
115 /* If configure does not define the endianess, try
116 to find it out */
117 #if !defined(L_ENDIAN) && !defined(B_ENDIAN)
118 #if __BYTE_ORDER == __LITTLE_ENDIAN
119 #define L_ENDIAN
120 #elif __BYTE_ORDER == __BIG_ENDIAN
121 #define B_ENDIAN
122 #else
123 #error Unknown endianness. Edit rdesktop.h.
124 #endif
125 #endif /* B_ENDIAN, L_ENDIAN from configure */
126
127 /* No need for alignment on x86 and amd64 */
128 #if !defined(NEED_ALIGN)
129 #if !(defined(__x86__) || defined(__x86_64__) || \
130 defined(__AMD64__) || defined(_M_IX86) || \
131 defined(__i386__))
132 #define NEED_ALIGN
133 #endif
134 #endif
135
136 struct rdpclient;
137 typedef struct rdpclient RDPCLIENT;
138
139 #include "parse.h"
140 #include "constants.h"
141 #include "types.h"
142 #include "orders.h"
143
144 #if 0
145 /* Used to store incoming io request, until they are ready to be completed */
146 /* using a linked list ensures that they are processed in the right order, */
147 /* if multiple ios are being done on the same fd */
148 struct async_iorequest
149 {
150 uint32 fd, major, minor, offset, device, id, length, partial_len;
151 long timeout, /* Total timeout */
152 itv_timeout; /* Interval timeout (between serial characters) */
153 uint8 *buffer;
154 DEVICE_FNS *fns;
155
156 struct async_iorequest *next; /* next element in list */
157 };
158 #endif
159
160 struct bmpcache_entry
161 {
162 HBITMAP bitmap;
163 sint16 previous;
164 sint16 next;
165 };
166
167 /* holds the whole state of the RDP client */
168 struct rdpclient
169 {
170 /* channels.c */
171 CHANNEL_DEF channel_defs[CHANNEL_MAX_COUNT];
172 unsigned int num_channels;
173
174 /* licence.c */
175 char * licence_username;
176 char licence_hostname[MAX_COMPUTERNAME_LENGTH + 1];
177 BOOL licence_issued;
178
179 /* mcs.c */
180 uint16 mcs_userid;
181
182 /* mppc.c */
183 RDPCOMP mppc_dict;
184
185 /* pstcache.c */
186 int pstcache_fd[8];
187 int pstcache_Bpp;
188 BOOL pstcache_enumerated;
189
190 /* rdesktop.c */
191 int disconnect_reason;
192 unsigned int keylayout;
193 int keyboard_type;
194 int keyboard_subtype;
195 int keyboard_functionkeys;
196
197 int width;
198 int height;
199 int server_depth;
200 BOOL bitmap_compression;
201 BOOL bitmap_cache;
202 BOOL bitmap_cache_persist_enable;
203 BOOL bitmap_cache_precache;
204 BOOL encryption;
205 BOOL packet_encryption;
206 BOOL desktop_save; /* desktop save order */
207 BOOL polygon_ellipse_orders; /* polygon / ellipse orders */
208 BOOL use_rdp5;
209 BOOL console_session;
210 uint32 rdp5_performanceflags;
211
212 /* Session Directory redirection */
213 BOOL redirect;
214 wchar_t * redirect_server;
215 wchar_t * redirect_domain;
216 wchar_t * redirect_password;
217 wchar_t * redirect_username;
218 char * redirect_cookie;
219 uint32 redirect_flags;
220
221 /* rdp.c */
222 uint8 *next_packet;
223 uint32 rdp_shareid;
224
225 /* secure.c */
226 uint16 server_rdp_version;
227
228 /* tcp.c */
229 int tcp_port_rdp;
230
231 /* cache.c */
232 struct cache_
233 {
234 struct bmpcache_entry bmpcache[3][0xa00];
235 HBITMAP volatile_bc[3];
236
237 int bmpcache_lru[3];
238 int bmpcache_mru[3];
239 int bmpcache_count[3];
240
241 FONTGLYPH fontcache[12][256];
242 DATABLOB textcache[256];
243 uint8 deskcache[0x38400 * 4];
244 HCURSOR cursorcache[0x20];
245 }
246 cache;
247
248 /* licence.c */
249 struct licence_
250 {
251 uint8 key[16];
252 uint8 sign_key[16];
253 }
254 licence;
255
256 /* orders.c */
257 struct orders_
258 {
259 RDP_ORDER_STATE order_state;
260 }
261 orders;
262
263 /* rdp.c */
264 struct rdp_
265 {
266 int current_status;
267
268 #if WITH_DEBUG
269 uint32 packetno;
270 #endif
271
272 #ifdef HAVE_ICONV
273 BOOL iconv_works;
274 #endif
275 }
276 rdp;
277
278 /* secure.c */
279 struct secure_
280 {
281 int rc4_key_len;
282 RC4_KEY rc4_decrypt_key;
283 RC4_KEY rc4_encrypt_key;
284 RSA *server_public_key;
285 uint32 server_public_key_len;
286
287 uint8 sign_key[16];
288 uint8 decrypt_key[16];
289 uint8 encrypt_key[16];
290 uint8 decrypt_update_key[16];
291 uint8 encrypt_update_key[16];
292 uint8 crypted_random[SEC_MAX_MODULUS_SIZE];
293
294 /* These values must be available to reset state - Session Directory */
295 int encrypt_use_count;
296 int decrypt_use_count;
297 }
298 secure;
299
300 /* tcp.c */
301 struct tcp_
302 {
303 SOCKET sock;
304 struct stream in;
305 struct stream out;
306 long connection_timeout;
307 }
308 tcp;
309 };
310
311 #ifndef MAKE_PROTO
312 #include "proto.h"
313 #endif