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
;
110 typedef long LONG_PTR
;
111 typedef unsigned long ULONG_PTR
;
112 typedef double DOUBLE
;
113 typedef double LONGLONG
;
114 typedef double ULONGLONG
;
116 /* Integer types. These are the same for emulator and library. */
118 typedef UINT16 HANDLE16
;
119 typedef UINT32 HANDLE32
;
120 typedef UINT16
*LPHANDLE16
;
121 typedef UINT32
*LPHANDLE32
;
122 typedef UINT16 WPARAM16
;
123 typedef UINT32 WPARAM32
;
125 typedef LONG HRESULT
;
126 typedef LONG LRESULT
;
128 typedef WORD CATCHBUF
[9];
129 typedef WORD
*LPCATCHBUF
;
130 typedef DWORD ACCESS_MASK
;
131 typedef ACCESS_MASK REGSAM
;
132 typedef HANDLE32 HHOOK
;
133 typedef HANDLE32 HKEY
;
134 typedef HANDLE32 HMONITOR
;
137 typedef DWORD LCTYPE
;
139 typedef long long __int64
;
141 /* Pointers types. These are the same for emulator and library. */
144 typedef const void *PCVOID
;
146 typedef UCHAR
*PUCHAR
;
148 typedef ULONG
*PULONG
;
150 typedef DWORD
*PDWORD
;
151 /* common win32 types */
154 typedef const CHAR
*LPCSTR
;
155 typedef const CHAR
*PCSTR
;
156 typedef WCHAR
*LPWSTR
;
157 typedef WCHAR
*PWSTR
;
158 typedef const WCHAR
*LPCWSTR
;
159 typedef const WCHAR
*PCWSTR
;
160 typedef BYTE
*LPBYTE
;
161 typedef WORD
*LPWORD
;
162 typedef DWORD
*LPDWORD
;
163 typedef LONG
*LPLONG
;
164 typedef VOID
*LPVOID
;
165 typedef const VOID
*LPCVOID
;
166 typedef INT16
*LPINT16
;
167 typedef UINT16
*LPUINT16
;
168 typedef INT32
*PINT32
;
169 typedef INT32
*LPINT32
;
170 typedef UINT32
*PUINT32
;
171 typedef UINT32
*LPUINT32
;
172 typedef HKEY
*LPHKEY
;
174 typedef FLOAT
*PFLOAT
;
175 typedef FLOAT
*LPFLOAT
;
176 typedef BOOL32
*PBOOL32
;
177 typedef BOOL32
*LPBOOL32
;
179 /* Special case: a segmented pointer is just a pointer in the user's code. */
182 typedef DWORD SEGPTR
;
184 typedef void* SEGPTR
;
185 #endif /* __WINE__ */
187 /* Handle types that exist both in Win16 and Win32. */
189 #define DECLARE_HANDLE(a) typedef HANDLE16 a##16; typedef HANDLE32 a##32
190 DECLARE_HANDLE(HACCEL
);
191 DECLARE_HANDLE(HBITMAP
);
192 DECLARE_HANDLE(HBRUSH
);
193 DECLARE_HANDLE(HCOLORSPACE
);
194 DECLARE_HANDLE(HCURSOR
);
196 DECLARE_HANDLE(HDROP
);
197 DECLARE_HANDLE(HDRVR
);
198 DECLARE_HANDLE(HDWP
);
199 DECLARE_HANDLE(HENHMETAFILE
);
200 DECLARE_HANDLE(HFILE
);
201 DECLARE_HANDLE(HFONT
);
202 DECLARE_HANDLE(HGDIOBJ
);
203 DECLARE_HANDLE(HGLOBAL
);
204 DECLARE_HANDLE(HICON
);
205 DECLARE_HANDLE(HINSTANCE
);
206 DECLARE_HANDLE(HLOCAL
);
207 DECLARE_HANDLE(HMENU
);
208 DECLARE_HANDLE(HMETAFILE
);
209 DECLARE_HANDLE(HMIDI
);
210 DECLARE_HANDLE(HMIDIIN
);
211 DECLARE_HANDLE(HMIDIOUT
);
212 DECLARE_HANDLE(HMIDISTRM
);
213 DECLARE_HANDLE(HMIXER
);
214 DECLARE_HANDLE(HMIXEROBJ
);
215 DECLARE_HANDLE(HMMIO
);
216 DECLARE_HANDLE(HMODULE
);
217 DECLARE_HANDLE(HPALETTE
);
218 DECLARE_HANDLE(HPEN
);
219 DECLARE_HANDLE(HQUEUE
);
220 DECLARE_HANDLE(HRGN
);
221 DECLARE_HANDLE(HRSRC
);
222 DECLARE_HANDLE(HTASK
);
223 DECLARE_HANDLE(HWAVE
);
224 DECLARE_HANDLE(HWAVEIN
);
225 DECLARE_HANDLE(HWAVEOUT
);
226 DECLARE_HANDLE(HWINSTA
);
227 DECLARE_HANDLE(HDESK
);
228 DECLARE_HANDLE(HWND
);
231 DECLARE_HANDLE(HRASCONN
);
232 #undef DECLARE_HANDLE
234 /* Callback function pointers types */
236 typedef BOOL32 (CALLBACK
* DATEFMT_ENUMPROC32A
)(LPSTR
);
237 typedef BOOL32 (CALLBACK
* DATEFMT_ENUMPROC32W
)(LPWSTR
);
238 DECL_WINELIB_TYPE_AW(DATEFMT_ENUMPROC
)
239 typedef BOOL16 (CALLBACK
*DLGPROC16
)(HWND16
,UINT16
,WPARAM16
,LPARAM
);
240 typedef BOOL32 (CALLBACK
*DLGPROC32
)(HWND32
,UINT32
,WPARAM32
,LPARAM
);
241 DECL_WINELIB_TYPE(DLGPROC
)
242 typedef LRESULT (CALLBACK
*DRIVERPROC16
)(DWORD
,HDRVR16
,UINT16
,LPARAM
,LPARAM
);
243 typedef LRESULT (CALLBACK
*DRIVERPROC32
)(DWORD
,HDRVR32
,UINT32
,LPARAM
,LPARAM
);
244 DECL_WINELIB_TYPE(DRIVERPROC
)
245 typedef INT16 (CALLBACK
*EDITWORDBREAKPROC16
)(LPSTR
,INT16
,INT16
,INT16
);
246 typedef INT32 (CALLBACK
*EDITWORDBREAKPROC32A
)(LPSTR
,INT32
,INT32
,INT32
);
247 typedef INT32 (CALLBACK
*EDITWORDBREAKPROC32W
)(LPWSTR
,INT32
,INT32
,INT32
);
248 DECL_WINELIB_TYPE_AW(EDITWORDBREAKPROC
)
249 typedef LRESULT (CALLBACK
*FARPROC16
)();
250 typedef LRESULT (CALLBACK
*FARPROC32
)();
251 DECL_WINELIB_TYPE(FARPROC
)
252 typedef INT16 (CALLBACK
*PROC16
)();
253 typedef INT32 (CALLBACK
*PROC32
)();
254 DECL_WINELIB_TYPE(PROC
)
255 typedef INT16 (CALLBACK
*GOBJENUMPROC16
)(SEGPTR
,LPARAM
);
256 typedef INT32 (CALLBACK
*GOBJENUMPROC32
)(LPVOID
,LPARAM
);
257 DECL_WINELIB_TYPE(GOBJENUMPROC
)
258 typedef BOOL16 (CALLBACK
*GRAYSTRINGPROC16
)(HDC16
,LPARAM
,INT16
);
259 typedef BOOL32 (CALLBACK
*GRAYSTRINGPROC32
)(HDC32
,LPARAM
,INT32
);
260 DECL_WINELIB_TYPE(GRAYSTRINGPROC
)
261 typedef LRESULT (CALLBACK
*HOOKPROC16
)(INT16
,WPARAM16
,LPARAM
);
262 typedef LRESULT (CALLBACK
*HOOKPROC32
)(INT32
,WPARAM32
,LPARAM
);
263 DECL_WINELIB_TYPE(HOOKPROC
)
264 typedef VOID (CALLBACK
*LINEDDAPROC16
)(INT16
,INT16
,LPARAM
);
265 typedef VOID (CALLBACK
*LINEDDAPROC32
)(INT32
,INT32
,LPARAM
);
266 DECL_WINELIB_TYPE(LINEDDAPROC
)
267 typedef BOOL16 (CALLBACK
*PROPENUMPROC16
)(HWND16
,SEGPTR
,HANDLE16
);
268 typedef BOOL32 (CALLBACK
*PROPENUMPROC32A
)(HWND32
,LPCSTR
,HANDLE32
);
269 typedef BOOL32 (CALLBACK
*PROPENUMPROC32W
)(HWND32
,LPCWSTR
,HANDLE32
);
270 DECL_WINELIB_TYPE_AW(PROPENUMPROC
)
271 typedef BOOL32 (CALLBACK
*PROPENUMPROCEX32A
)(HWND32
,LPCSTR
,HANDLE32
,LPARAM
);
272 typedef BOOL32 (CALLBACK
*PROPENUMPROCEX32W
)(HWND32
,LPCWSTR
,HANDLE32
,LPARAM
);
273 DECL_WINELIB_TYPE_AW(PROPENUMPROCEX
)
274 typedef BOOL32 (CALLBACK
* TIMEFMT_ENUMPROC32A
)(LPSTR
);
275 typedef BOOL32 (CALLBACK
* TIMEFMT_ENUMPROC32W
)(LPWSTR
);
276 DECL_WINELIB_TYPE_AW(TIMEFMT_ENUMPROC
)
277 typedef VOID (CALLBACK
*TIMERPROC16
)(HWND16
,UINT16
,UINT16
,DWORD
);
278 typedef VOID (CALLBACK
*TIMERPROC32
)(HWND32
,UINT32
,UINT32
,DWORD
);
279 DECL_WINELIB_TYPE(TIMERPROC
)
280 typedef LRESULT (CALLBACK
*WNDENUMPROC16
)(HWND16
,LPARAM
);
281 typedef LRESULT (CALLBACK
*WNDENUMPROC32
)(HWND32
,LPARAM
);
282 DECL_WINELIB_TYPE(WNDENUMPROC
)
283 typedef LRESULT (CALLBACK
*WNDPROC16
)(HWND16
,UINT16
,WPARAM16
,LPARAM
);
284 typedef LRESULT (CALLBACK
*WNDPROC32
)(HWND32
,UINT32
,WPARAM32
,LPARAM
);
285 DECL_WINELIB_TYPE(WNDPROC
)
287 /* TCHAR data types definitions for Winelib. */
288 /* These types are _not_ defined for the emulator, because they */
289 /* depend on the UNICODE macro that only exists in user's code. */
294 typedef LPWSTR LPTSTR
;
295 typedef LPCWSTR LPCTSTR
;
296 #define __TEXT(string) L##string /*probably wrong */
299 typedef LPSTR LPTSTR
;
300 typedef LPCSTR LPCTSTR
;
301 #define __TEXT(string) string
302 # endif /* UNICODE */
303 #endif /* __WINE__ */
304 #define TEXT(quote) __TEXT(quote)
306 /* Data types specific to the library. These do _not_ exist in the emulator. */
308 DECL_WINELIB_TYPE(INT
)
309 DECL_WINELIB_TYPE(LPINT
)
310 DECL_WINELIB_TYPE(PUINT
)
311 DECL_WINELIB_TYPE(LPUINT
)
312 DECL_WINELIB_TYPE(UINT
)
313 DECL_WINELIB_TYPE(BOOL
)
314 DECL_WINELIB_TYPE(LPBOOL
)
315 DECL_WINELIB_TYPE(WPARAM
)
317 DECL_WINELIB_TYPE(HACCEL
)
318 DECL_WINELIB_TYPE(HANDLE
)
319 DECL_WINELIB_TYPE(LPHANDLE
)
320 DECL_WINELIB_TYPE(HBITMAP
)
321 DECL_WINELIB_TYPE(HBRUSH
)
322 DECL_WINELIB_TYPE(HCOLORSPACE
)
323 DECL_WINELIB_TYPE(HCURSOR
)
324 DECL_WINELIB_TYPE(HDC
)
325 DECL_WINELIB_TYPE(HDROP
)
326 DECL_WINELIB_TYPE(HDRVR
)
327 DECL_WINELIB_TYPE(HDWP
)
328 DECL_WINELIB_TYPE(HENHMETAFILE
)
329 DECL_WINELIB_TYPE(HFILE
)
330 DECL_WINELIB_TYPE(HFONT
)
331 DECL_WINELIB_TYPE(HGDIOBJ
)
332 DECL_WINELIB_TYPE(HGLOBAL
)
333 DECL_WINELIB_TYPE(HIC
)
334 DECL_WINELIB_TYPE(HICON
)
335 DECL_WINELIB_TYPE(HINSTANCE
)
336 DECL_WINELIB_TYPE(HLOCAL
)
337 DECL_WINELIB_TYPE(HMENU
)
338 DECL_WINELIB_TYPE(HMETAFILE
)
339 DECL_WINELIB_TYPE(HMIDI
)
340 DECL_WINELIB_TYPE(HMIDIIN
)
341 DECL_WINELIB_TYPE(HMIDIOUT
)
342 DECL_WINELIB_TYPE(HMMIO
)
343 DECL_WINELIB_TYPE(HMODULE
)
344 DECL_WINELIB_TYPE(HPALETTE
)
345 DECL_WINELIB_TYPE(HPEN
)
346 DECL_WINELIB_TYPE(HQUEUE
)
347 DECL_WINELIB_TYPE(HRGN
)
348 DECL_WINELIB_TYPE(HRSRC
)
349 DECL_WINELIB_TYPE(HTASK
)
350 DECL_WINELIB_TYPE(HWAVE
)
351 DECL_WINELIB_TYPE(HWAVEIN
)
352 DECL_WINELIB_TYPE(HWAVEOUT
)
353 DECL_WINELIB_TYPE(HWND
)
355 /* Define some empty macros for compatibility with Windows code. */
365 #endif /* __WINE__ */
367 /* Macro for structure packing. */
370 #define WINE_PACKED __attribute__ ((packed))
372 #define WINE_PACKED /* nothing */
375 /* Macros to split words and longs. */
377 #define LOBYTE(w) ((BYTE)(WORD)(w))
378 #define HIBYTE(w) ((BYTE)((WORD)(w) >> 8))
380 #define LOWORD(l) ((WORD)(DWORD)(l))
381 #define HIWORD(l) ((WORD)((DWORD)(l) >> 16))
383 #define SLOWORD(l) ((INT16)(LONG)(l))
384 #define SHIWORD(l) ((INT16)((LONG)(l) >> 16))
386 #define MAKEWORD(low,high) ((WORD)(((BYTE)(low)) | ((WORD)((BYTE)(high))) << 8))
387 #define MAKELONG(low,high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
388 #define MAKELPARAM(low,high) ((LPARAM)MAKELONG(low,high))
389 #define MAKEWPARAM(low,high) ((WPARAM32)MAKELONG(low,high))
390 #define MAKELRESULT(low,high) ((LRESULT)MAKELONG(low,high))
391 #define MAKEINTATOM(atom) ((LPCSTR)MAKELONG((atom),0))
393 #define SELECTOROF(ptr) (HIWORD(ptr))
394 #define OFFSETOF(ptr) (LOWORD(ptr))
396 /* Macros to access unaligned or wrong-endian WORDs and DWORDs. */
397 /* Note: These macros are semantically broken, at least for wrc. wrc
398 spits out data in the platform's current binary format, *not* in
399 little-endian format. These macros are used throughout the resource
400 code to load and store data to the resources. Since it is unlikely
401 that we'll ever be dealing with little-endian resource data, the
402 byte-swapping nature of these macros has been disabled. Rather than
403 remove the use of these macros from the resource loading code, the
404 macros have simply been disabled. In the future, someone may want
405 to reactivate these macros for other purposes. In that case, the
406 resource code will have to be modified to use different macros. */
409 #define PUT_WORD(ptr,w) (*(WORD *)(ptr) = (w))
410 #define GET_WORD(ptr) (*(WORD *)(ptr))
411 #define PUT_DWORD(ptr,dw) (*(DWORD *)(ptr) = (dw))
412 #define GET_DWORD(ptr) (*(DWORD *)(ptr))
414 #define PUT_WORD(ptr,w) (*(BYTE *)(ptr) = LOBYTE(w), \
415 *((BYTE *)(ptr) + 1) = HIBYTE(w))
416 #define GET_WORD(ptr) ((WORD)(*(BYTE *)(ptr) | \
417 (WORD)(*((BYTE *)(ptr)+1) << 8)))
418 #define PUT_DWORD(ptr,dw) (PUT_WORD((ptr),LOWORD(dw)), \
419 PUT_WORD((WORD *)(ptr)+1,HIWORD(dw)))
420 #define GET_DWORD(ptr) ((DWORD)(GET_WORD(ptr) | \
421 ((DWORD)GET_WORD((WORD *)(ptr)+1) << 16)))
424 /* MIN and MAX macros */
429 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
434 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
436 #define __max(a,b) MAX(a,b)
437 #define __min(a,b) MIN(a,b)
438 #define max(a,b) MAX(a,b)
439 #define min(a,b) MIN(a,b)
441 #define _MAX_PATH 260
444 #define _MAX_FNAME 255
447 /* Winelib run-time flag */
450 extern int __winelib
;
451 #endif /* __WINE__ */
453 /* The SIZE structure */
459 } SIZE16
, *PSIZE16
, *LPSIZE16
;
461 typedef struct tagSIZE
465 } SIZE32
, *PSIZE32
, *LPSIZE32
;
467 DECL_WINELIB_TYPE(SIZE
)
468 DECL_WINELIB_TYPE(PSIZE
)
469 DECL_WINELIB_TYPE(LPSIZE
)
471 typedef SIZE32 SIZEL
, *PSIZEL
, *LPSIZEL
;
473 #define CONV_SIZE16TO32(s16,s32) \
474 ((s32)->cx = (INT32)(s16)->cx, (s32)->cy = (INT32)(s16)->cy)
475 #define CONV_SIZE32TO16(s32,s16) \
476 ((s16)->cx = (INT16)(s32)->cx, (s16)->cy = (INT16)(s32)->cy)
478 /* The POINT structure */
484 } POINT16
, *PPOINT16
, *LPPOINT16
;
486 typedef struct tagPOINT
490 } POINT32
, *PPOINT32
, *LPPOINT32
;
492 DECL_WINELIB_TYPE(POINT
)
493 DECL_WINELIB_TYPE(PPOINT
)
494 DECL_WINELIB_TYPE(LPPOINT
)
496 #define CONV_POINT16TO32(p16,p32) \
497 ((p32)->x = (INT32)(p16)->x, (p32)->y = (INT32)(p16)->y)
498 #define CONV_POINT32TO16(p32,p16) \
499 ((p16)->x = (INT16)(p32)->x, (p16)->y = (INT16)(p32)->y)
501 #define MAKEPOINT16(l) (*((POINT16 *)&(l)))
502 #define MAKEPOINT WINELIB_NAME(MAKEPOINT)
504 /* The POINTS structure */
506 typedef struct tagPOINTS
510 } POINTS32
, *PPOINTS32
, *LPPOINTS32
;
512 DECL_WINELIB_TYPE(POINTS
)
513 DECL_WINELIB_TYPE(PPOINTS
)
514 DECL_WINELIB_TYPE(LPPOINTS
)
516 #define MAKEPOINTS(l) (*((POINTS *)&(l)))
519 /* The RECT structure */
529 typedef struct tagRECT
535 } RECT32
, *PRECT32
, *LPRECT32
;
537 DECL_WINELIB_TYPE(RECT
)
538 DECL_WINELIB_TYPE(PRECT
)
539 DECL_WINELIB_TYPE(LPRECT
)
541 typedef struct tagRECTL
547 } RECTL
, *PRECTL
, *LPRECTL
;
549 typedef const RECTL
*LPCRECTL
;
551 #define CONV_RECT16TO32(r16,r32) \
552 ((r32)->left = (INT32)(r16)->left, (r32)->top = (INT32)(r16)->top, \
553 (r32)->right = (INT32)(r16)->right, (r32)->bottom = (INT32)(r16)->bottom)
554 #define CONV_RECT32TO16(r32,r16) \
555 ((r16)->left = (INT16)(r32)->left, (r16)->top = (INT16)(r32)->top, \
556 (r16)->right = (INT16)(r32)->right, (r16)->bottom = (INT16)(r32)->bottom)
562 #endif /* __WINE_WINTYPES_H */