2 * Basic types definitions
4 * Copyright 1996 Alexandre Julliard
24 #ifndef __WINE_WINTYPES_H
25 #define __WINE_WINTYPES_H
36 /* Macros to map Winelib names to the correct implementation name */
37 /* depending on __WINE__ and UNICODE macros. */
38 /* Note that Winelib is purely Win32. */
41 # define WINELIB_NAME(func) this_is_a_syntax_error this_is_a_syntax_error
42 # define WINELIB_NAME_AW(func) this_is_a_syntax_error this_is_a_syntax_error
44 # define WINELIB_NAME(func) func##32
46 # define WINELIB_NAME_AW(func) func##32W
48 # define WINELIB_NAME_AW(func) func##32A
53 # define DECL_WINELIB_TYPE(type) /* nothing */
54 # define DECL_WINELIB_TYPE_AW(type) /* nothing */
56 # define DECL_WINELIB_TYPE(type) typedef WINELIB_NAME(type) type;
57 # define DECL_WINELIB_TYPE_AW(type) typedef WINELIB_NAME_AW(type) type;
61 /* Calling conventions definitions */
64 # if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)
65 # define __stdcall __attribute__((__stdcall__))
66 # define __cdecl __attribute__((__cdecl__))
67 # define __RESTORE_ES __asm__ __volatile__("pushl %ds\n\tpopl %es")
69 # error You need gcc >= 2.7 to build Wine on a 386
70 # endif /* __GNUC__ */
77 #define CALLBACK __stdcall
78 #define WINAPI __stdcall
79 #define APIPRIVATE __stdcall
80 #define PASCAL __stdcall
81 #define _pascal __stdcall
82 #define __export __stdcall
83 #define WINAPIV __cdecl
84 #define APIENTRY WINAPI
88 /* Standard data types. These are the same for emulator and library. */
92 typedef unsigned short UINT16
;
94 typedef unsigned int UINT32
;
95 typedef unsigned short WORD
;
96 typedef unsigned long DWORD
;
97 typedef unsigned long ULONG
;
98 typedef unsigned char BYTE
;
101 typedef unsigned short USHORT
;
103 typedef unsigned char UCHAR
;
104 /* Some systems might have wchar_t, but we really need 16 bit characters */
105 typedef unsigned short WCHAR
;
106 typedef unsigned short BOOL16
;
109 typedef long LONG_PTR
;
110 typedef unsigned long ULONG_PTR
;
111 typedef double DOUBLE
;
112 typedef double LONGLONG
;
113 typedef double ULONGLONG
;
115 /* Integer types. These are the same for emulator and library. */
117 typedef UINT16 HANDLE16
;
118 typedef UINT32 HANDLE32
;
119 typedef UINT16
*LPHANDLE16
;
120 typedef UINT32
*LPHANDLE32
;
121 typedef UINT16 WPARAM16
;
122 typedef UINT32 WPARAM32
;
124 typedef LONG HRESULT
;
125 typedef LONG LRESULT
;
127 typedef WORD CATCHBUF
[9];
128 typedef WORD
*LPCATCHBUF
;
129 typedef DWORD ACCESS_MASK
;
130 typedef ACCESS_MASK REGSAM
;
131 typedef HANDLE32 HHOOK
;
132 typedef HANDLE32 HKEY
;
133 typedef HANDLE32 HMONITOR
;
136 typedef DWORD LCTYPE
;
138 typedef long long __int64
;
140 /* Pointers types. These are the same for emulator and library. */
143 typedef const void *PCVOID
;
145 typedef UCHAR
*PUCHAR
;
147 typedef ULONG
*PULONG
;
149 typedef DWORD
*PDWORD
;
150 /* common win32 types */
153 typedef const CHAR
*LPCSTR
;
154 typedef const CHAR
*PCSTR
;
155 typedef WCHAR
*LPWSTR
;
156 typedef WCHAR
*PWSTR
;
157 typedef const WCHAR
*LPCWSTR
;
158 typedef const WCHAR
*PCWSTR
;
159 typedef BYTE
*LPBYTE
;
160 typedef WORD
*LPWORD
;
161 typedef DWORD
*LPDWORD
;
162 typedef LONG
*LPLONG
;
163 typedef VOID
*LPVOID
;
164 typedef const VOID
*LPCVOID
;
165 typedef INT16
*LPINT16
;
166 typedef UINT16
*LPUINT16
;
167 typedef INT32
*PINT32
;
168 typedef INT32
*LPINT32
;
169 typedef UINT32
*PUINT32
;
170 typedef UINT32
*LPUINT32
;
171 typedef HKEY
*LPHKEY
;
173 typedef FLOAT
*PFLOAT
;
174 typedef FLOAT
*LPFLOAT
;
175 typedef BOOL32
*PBOOL32
;
176 typedef BOOL32
*LPBOOL32
;
178 /* Special case: a segmented pointer is just a pointer in the user's code. */
181 typedef DWORD SEGPTR
;
183 typedef void* SEGPTR
;
184 #endif /* __WINE__ */
186 /* Handle types that exist both in Win16 and Win32. */
188 #define DECLARE_HANDLE(a) typedef HANDLE16 a##16; typedef HANDLE32 a##32
189 DECLARE_HANDLE(HACCEL
);
190 DECLARE_HANDLE(HBITMAP
);
191 DECLARE_HANDLE(HBRUSH
);
192 DECLARE_HANDLE(HCOLORSPACE
);
193 DECLARE_HANDLE(HCURSOR
);
195 DECLARE_HANDLE(HDROP
);
196 DECLARE_HANDLE(HDRVR
);
197 DECLARE_HANDLE(HDWP
);
198 DECLARE_HANDLE(HENHMETAFILE
);
199 DECLARE_HANDLE(HFILE
);
200 DECLARE_HANDLE(HFONT
);
201 DECLARE_HANDLE(HGDIOBJ
);
202 DECLARE_HANDLE(HGLOBAL
);
203 DECLARE_HANDLE(HICON
);
204 DECLARE_HANDLE(HINSTANCE
);
205 DECLARE_HANDLE(HLOCAL
);
206 DECLARE_HANDLE(HMENU
);
207 DECLARE_HANDLE(HMETAFILE
);
208 DECLARE_HANDLE(HMIDI
);
209 DECLARE_HANDLE(HMIDIIN
);
210 DECLARE_HANDLE(HMIDIOUT
);
211 DECLARE_HANDLE(HMIDISTRM
);
212 DECLARE_HANDLE(HMIXER
);
213 DECLARE_HANDLE(HMIXEROBJ
);
214 DECLARE_HANDLE(HMMIO
);
215 DECLARE_HANDLE(HMODULE
);
216 DECLARE_HANDLE(HPALETTE
);
217 DECLARE_HANDLE(HPEN
);
218 DECLARE_HANDLE(HQUEUE
);
219 DECLARE_HANDLE(HRGN
);
220 DECLARE_HANDLE(HRSRC
);
221 DECLARE_HANDLE(HTASK
);
222 DECLARE_HANDLE(HWAVE
);
223 DECLARE_HANDLE(HWAVEIN
);
224 DECLARE_HANDLE(HWAVEOUT
);
225 DECLARE_HANDLE(HWINSTA
);
226 DECLARE_HANDLE(HDESK
);
227 DECLARE_HANDLE(HWND
);
230 DECLARE_HANDLE(HRASCONN
);
231 #undef DECLARE_HANDLE
233 /* Callback function pointers types */
235 typedef BOOL32 (CALLBACK
* DATEFMT_ENUMPROC32A
)(LPSTR
);
236 typedef BOOL32 (CALLBACK
* DATEFMT_ENUMPROC32W
)(LPWSTR
);
237 DECL_WINELIB_TYPE_AW(DATEFMT_ENUMPROC
)
238 typedef BOOL16 (CALLBACK
*DLGPROC16
)(HWND16
,UINT16
,WPARAM16
,LPARAM
);
239 typedef BOOL32 (CALLBACK
*DLGPROC32
)(HWND32
,UINT32
,WPARAM32
,LPARAM
);
240 DECL_WINELIB_TYPE(DLGPROC
)
241 typedef LRESULT (CALLBACK
*DRIVERPROC16
)(DWORD
,HDRVR16
,UINT16
,LPARAM
,LPARAM
);
242 typedef LRESULT (CALLBACK
*DRIVERPROC32
)(DWORD
,HDRVR32
,UINT32
,LPARAM
,LPARAM
);
243 DECL_WINELIB_TYPE(DRIVERPROC
)
244 typedef INT16 (CALLBACK
*EDITWORDBREAKPROC16
)(LPSTR
,INT16
,INT16
,INT16
);
245 typedef INT32 (CALLBACK
*EDITWORDBREAKPROC32A
)(LPSTR
,INT32
,INT32
,INT32
);
246 typedef INT32 (CALLBACK
*EDITWORDBREAKPROC32W
)(LPWSTR
,INT32
,INT32
,INT32
);
247 DECL_WINELIB_TYPE_AW(EDITWORDBREAKPROC
)
248 typedef LRESULT (CALLBACK
*FARPROC16
)();
249 typedef LRESULT (CALLBACK
*FARPROC32
)();
250 DECL_WINELIB_TYPE(FARPROC
)
251 typedef INT16 (CALLBACK
*PROC16
)();
252 typedef INT32 (CALLBACK
*PROC32
)();
253 DECL_WINELIB_TYPE(PROC
)
254 typedef INT16 (CALLBACK
*GOBJENUMPROC16
)(SEGPTR
,LPARAM
);
255 typedef INT32 (CALLBACK
*GOBJENUMPROC32
)(LPVOID
,LPARAM
);
256 DECL_WINELIB_TYPE(GOBJENUMPROC
)
257 typedef BOOL16 (CALLBACK
*GRAYSTRINGPROC16
)(HDC16
,LPARAM
,INT16
);
258 typedef BOOL32 (CALLBACK
*GRAYSTRINGPROC32
)(HDC32
,LPARAM
,INT32
);
259 DECL_WINELIB_TYPE(GRAYSTRINGPROC
)
260 typedef LRESULT (CALLBACK
*HOOKPROC16
)(INT16
,WPARAM16
,LPARAM
);
261 typedef LRESULT (CALLBACK
*HOOKPROC32
)(INT32
,WPARAM32
,LPARAM
);
262 DECL_WINELIB_TYPE(HOOKPROC
)
263 typedef VOID (CALLBACK
*LINEDDAPROC16
)(INT16
,INT16
,LPARAM
);
264 typedef VOID (CALLBACK
*LINEDDAPROC32
)(INT32
,INT32
,LPARAM
);
265 DECL_WINELIB_TYPE(LINEDDAPROC
)
266 typedef BOOL16 (CALLBACK
*PROPENUMPROC16
)(HWND16
,SEGPTR
,HANDLE16
);
267 typedef BOOL32 (CALLBACK
*PROPENUMPROC32A
)(HWND32
,LPCSTR
,HANDLE32
);
268 typedef BOOL32 (CALLBACK
*PROPENUMPROC32W
)(HWND32
,LPCWSTR
,HANDLE32
);
269 DECL_WINELIB_TYPE_AW(PROPENUMPROC
)
270 typedef BOOL32 (CALLBACK
*PROPENUMPROCEX32A
)(HWND32
,LPCSTR
,HANDLE32
,LPARAM
);
271 typedef BOOL32 (CALLBACK
*PROPENUMPROCEX32W
)(HWND32
,LPCWSTR
,HANDLE32
,LPARAM
);
272 DECL_WINELIB_TYPE_AW(PROPENUMPROCEX
)
273 typedef BOOL32 (CALLBACK
* TIMEFMT_ENUMPROC32A
)(LPSTR
);
274 typedef BOOL32 (CALLBACK
* TIMEFMT_ENUMPROC32W
)(LPWSTR
);
275 DECL_WINELIB_TYPE_AW(TIMEFMT_ENUMPROC
)
276 typedef VOID (CALLBACK
*TIMERPROC16
)(HWND16
,UINT16
,UINT16
,DWORD
);
277 typedef VOID (CALLBACK
*TIMERPROC32
)(HWND32
,UINT32
,UINT32
,DWORD
);
278 DECL_WINELIB_TYPE(TIMERPROC
)
279 typedef LRESULT (CALLBACK
*WNDENUMPROC16
)(HWND16
,LPARAM
);
280 typedef LRESULT (CALLBACK
*WNDENUMPROC32
)(HWND32
,LPARAM
);
281 DECL_WINELIB_TYPE(WNDENUMPROC
)
282 typedef LRESULT (CALLBACK
*WNDPROC16
)(HWND16
,UINT16
,WPARAM16
,LPARAM
);
283 typedef LRESULT (CALLBACK
*WNDPROC32
)(HWND32
,UINT32
,WPARAM32
,LPARAM
);
284 DECL_WINELIB_TYPE(WNDPROC
)
286 /* TCHAR data types definitions for Winelib. */
287 /* These types are _not_ defined for the emulator, because they */
288 /* depend on the UNICODE macro that only exists in user's code. */
293 typedef LPWSTR LPTSTR
;
294 typedef LPCWSTR LPCTSTR
;
295 #define __TEXT(string) L##string /*probably wrong */
298 typedef LPSTR LPTSTR
;
299 typedef LPCSTR LPCTSTR
;
300 #define __TEXT(string) string
301 # endif /* UNICODE */
302 #endif /* __WINE__ */
303 #define TEXT(quote) __TEXT(quote)
305 /* Data types specific to the library. These do _not_ exist in the emulator. */
307 DECL_WINELIB_TYPE(INT
)
308 DECL_WINELIB_TYPE(LPINT
)
309 DECL_WINELIB_TYPE(PUINT
)
310 DECL_WINELIB_TYPE(LPUINT
)
311 DECL_WINELIB_TYPE(UINT
)
312 DECL_WINELIB_TYPE(BOOL
)
313 DECL_WINELIB_TYPE(LPBOOL
)
314 DECL_WINELIB_TYPE(WPARAM
)
316 DECL_WINELIB_TYPE(HACCEL
)
317 DECL_WINELIB_TYPE(HANDLE
)
318 DECL_WINELIB_TYPE(LPHANDLE
)
319 DECL_WINELIB_TYPE(HBITMAP
)
320 DECL_WINELIB_TYPE(HBRUSH
)
321 DECL_WINELIB_TYPE(HCOLORSPACE
)
322 DECL_WINELIB_TYPE(HCURSOR
)
323 DECL_WINELIB_TYPE(HDC
)
324 DECL_WINELIB_TYPE(HDROP
)
325 DECL_WINELIB_TYPE(HDRVR
)
326 DECL_WINELIB_TYPE(HDWP
)
327 DECL_WINELIB_TYPE(HENHMETAFILE
)
328 DECL_WINELIB_TYPE(HFILE
)
329 DECL_WINELIB_TYPE(HFONT
)
330 DECL_WINELIB_TYPE(HGDIOBJ
)
331 DECL_WINELIB_TYPE(HGLOBAL
)
332 DECL_WINELIB_TYPE(HIC
)
333 DECL_WINELIB_TYPE(HICON
)
334 DECL_WINELIB_TYPE(HINSTANCE
)
335 DECL_WINELIB_TYPE(HLOCAL
)
336 DECL_WINELIB_TYPE(HMENU
)
337 DECL_WINELIB_TYPE(HMETAFILE
)
338 DECL_WINELIB_TYPE(HMIDI
)
339 DECL_WINELIB_TYPE(HMIDIIN
)
340 DECL_WINELIB_TYPE(HMIDIOUT
)
341 DECL_WINELIB_TYPE(HMMIO
)
342 DECL_WINELIB_TYPE(HMODULE
)
343 DECL_WINELIB_TYPE(HPALETTE
)
344 DECL_WINELIB_TYPE(HPEN
)
345 DECL_WINELIB_TYPE(HQUEUE
)
346 DECL_WINELIB_TYPE(HRGN
)
347 DECL_WINELIB_TYPE(HRSRC
)
348 DECL_WINELIB_TYPE(HTASK
)
349 DECL_WINELIB_TYPE(HWAVE
)
350 DECL_WINELIB_TYPE(HWAVEIN
)
351 DECL_WINELIB_TYPE(HWAVEOUT
)
352 DECL_WINELIB_TYPE(HWND
)
354 /* Define some empty macros for compatibility with Windows code. */
364 #endif /* __WINE__ */
366 /* Macro for structure packing. */
369 #define WINE_PACKED __attribute__ ((packed))
371 #define WINE_PACKED /* nothing */
374 /* Macros to split words and longs. */
376 #define LOBYTE(w) ((BYTE)(WORD)(w))
377 #define HIBYTE(w) ((BYTE)((WORD)(w) >> 8))
379 #define LOWORD(l) ((WORD)(DWORD)(l))
380 #define HIWORD(l) ((WORD)((DWORD)(l) >> 16))
382 #define SLOWORD(l) ((INT16)(LONG)(l))
383 #define SHIWORD(l) ((INT16)((LONG)(l) >> 16))
385 #define MAKEWORD(low,high) ((WORD)(((BYTE)(low)) | ((WORD)((BYTE)(high))) << 8))
386 #define MAKELONG(low,high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
387 #define MAKELPARAM(low,high) ((LPARAM)MAKELONG(low,high))
388 #define MAKEWPARAM(low,high) ((WPARAM32)MAKELONG(low,high))
389 #define MAKELRESULT(low,high) ((LRESULT)MAKELONG(low,high))
390 #define MAKEINTATOM(atom) ((LPCSTR)MAKELONG((atom),0))
392 #define SELECTOROF(ptr) (HIWORD(ptr))
393 #define OFFSETOF(ptr) (LOWORD(ptr))
395 /* Macros to access unaligned or wrong-endian WORDs and DWORDs. */
396 /* Note: These macros are semantically broken, at least for wrc. wrc
397 spits out data in the platform's current binary format, *not* in
398 little-endian format. These macros are used throughout the resource
399 code to load and store data to the resources. Since it is unlikely
400 that we'll ever be dealing with little-endian resource data, the
401 byte-swapping nature of these macros has been disabled. Rather than
402 remove the use of these macros from the resource loading code, the
403 macros have simply been disabled. In the future, someone may want
404 to reactivate these macros for other purposes. In that case, the
405 resource code will have to be modified to use different macros. */
408 #define PUT_WORD(ptr,w) (*(WORD *)(ptr) = (w))
409 #define GET_WORD(ptr) (*(WORD *)(ptr))
410 #define PUT_DWORD(ptr,dw) (*(DWORD *)(ptr) = (dw))
411 #define GET_DWORD(ptr) (*(DWORD *)(ptr))
413 #define PUT_WORD(ptr,w) (*(BYTE *)(ptr) = LOBYTE(w), \
414 *((BYTE *)(ptr) + 1) = HIBYTE(w))
415 #define GET_WORD(ptr) ((WORD)(*(BYTE *)(ptr) | \
416 (WORD)(*((BYTE *)(ptr)+1) << 8)))
417 #define PUT_DWORD(ptr,dw) (PUT_WORD((ptr),LOWORD(dw)), \
418 PUT_WORD((WORD *)(ptr)+1,HIWORD(dw)))
419 #define GET_DWORD(ptr) ((DWORD)(GET_WORD(ptr) | \
420 ((DWORD)GET_WORD((WORD *)(ptr)+1) << 16)))
423 /* MIN and MAX macros */
428 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
433 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
435 #define __max(a,b) MAX(a,b)
436 #define __min(a,b) MIN(a,b)
437 #define max(a,b) MAX(a,b)
438 #define min(a,b) MIN(a,b)
440 #define _MAX_PATH 260
443 #define _MAX_FNAME 255
446 /* Winelib run-time flag */
449 extern int __winelib
;
450 #endif /* __WINE__ */
452 /* The SIZE structure */
458 } SIZE16
, *PSIZE16
, *LPSIZE16
;
460 typedef struct tagSIZE
464 } SIZE32
, *PSIZE32
, *LPSIZE32
;
466 DECL_WINELIB_TYPE(SIZE
)
467 DECL_WINELIB_TYPE(PSIZE
)
468 DECL_WINELIB_TYPE(LPSIZE
)
470 typedef SIZE32 SIZEL
, *PSIZEL
, *LPSIZEL
;
472 #define CONV_SIZE16TO32(s16,s32) \
473 ((s32)->cx = (INT32)(s16)->cx, (s32)->cy = (INT32)(s16)->cy)
474 #define CONV_SIZE32TO16(s32,s16) \
475 ((s16)->cx = (INT16)(s32)->cx, (s16)->cy = (INT16)(s32)->cy)
477 /* The POINT structure */
483 } POINT16
, *PPOINT16
, *LPPOINT16
;
485 typedef struct tagPOINT
489 } POINT32
, *PPOINT32
, *LPPOINT32
;
491 DECL_WINELIB_TYPE(POINT
)
492 DECL_WINELIB_TYPE(PPOINT
)
493 DECL_WINELIB_TYPE(LPPOINT
)
495 #define CONV_POINT16TO32(p16,p32) \
496 ((p32)->x = (INT32)(p16)->x, (p32)->y = (INT32)(p16)->y)
497 #define CONV_POINT32TO16(p32,p16) \
498 ((p16)->x = (INT16)(p32)->x, (p16)->y = (INT16)(p32)->y)
500 #define MAKEPOINT16(l) (*((POINT16 *)&(l)))
501 #define MAKEPOINT WINELIB_NAME(MAKEPOINT)
503 /* The POINTS structure */
505 typedef struct tagPOINTS
509 } POINTS32
, *PPOINTS32
, *LPPOINTS32
;
511 DECL_WINELIB_TYPE(POINTS
)
512 DECL_WINELIB_TYPE(PPOINTS
)
513 DECL_WINELIB_TYPE(LPPOINTS
)
515 #define MAKEPOINTS(l) (*((POINTS *)&(l)))
518 /* The RECT structure */
528 typedef struct tagRECT
534 } RECT32
, *PRECT32
, *LPRECT32
;
536 DECL_WINELIB_TYPE(RECT
)
537 DECL_WINELIB_TYPE(PRECT
)
538 DECL_WINELIB_TYPE(LPRECT
)
540 typedef struct tagRECTL
546 } RECTL
, *PRECTL
, *LPRECTL
;
548 typedef const RECTL
*LPCRECTL
;
550 #define CONV_RECT16TO32(r16,r32) \
551 ((r32)->left = (INT32)(r16)->left, (r32)->top = (INT32)(r16)->top, \
552 (r32)->right = (INT32)(r16)->right, (r32)->bottom = (INT32)(r16)->bottom)
553 #define CONV_RECT32TO16(r32,r16) \
554 ((r16)->left = (INT16)(r32)->left, (r16)->top = (INT16)(r32)->top, \
555 (r16)->right = (INT16)(r32)->right, (r16)->bottom = (INT16)(r32)->bottom)
561 #endif /* __WINE_WINTYPES_H */