Moved some macros like NULL, FALSE to winnt.h
Moved the anonymous struct/unions to winnt.h
Moved calling convention macros to winnt.h
Moved some basic types like BOOL, INT, LONG, etc. to winnt.h
Moved HANDLE and DECLARE_HANDLE to winnt.h
Moved structure packing macros to winnt.h
diff --git a/include/ntdef.h b/include/ntdef.h
index edf0af8..c992bec 100644
--- a/include/ntdef.h
+++ b/include/ntdef.h
@@ -34,7 +34,6 @@
typedef short CSHORT;
typedef CSHORT *PCSHORT;
-typedef WCHAR * PWCHAR;
/* NT lowlevel Strings (handled by Rtl* functions in NTDLL)
* If they are zero terminated, Length does not include the terminating 0.
diff --git a/include/windef.h b/include/windef.h
index 3cdbe60..07a229b 100644
--- a/include/windef.h
+++ b/include/windef.h
@@ -15,26 +15,10 @@
extern "C" {
#endif
-/* Misc. constants. */
-
#define WINVER 0x0500
-#ifdef FALSE
-#undef FALSE
-#endif
-#define FALSE 0
+#include "winnt.h"
-#ifdef TRUE
-#undef TRUE
-#endif
-#define TRUE 1
-
-#undef NULL
-#ifdef __cplusplus
-#define NULL 0
-#else
-#define NULL ((void*)0)
-#endif
/* Macros to map Winelib names to the correct implementation name */
/* depending on __WINE__ and UNICODE macros. */
@@ -58,202 +42,19 @@
# define DECL_WINELIB_TYPE_AW(type) typedef WINELIB_NAME_AW(type) type;
#endif /* __WINE__ */
-#ifdef __WINE__
-# define NONAMELESSSTRUCT
-# define NONAMELESSUNION
-#else
-/* Anonymous struct support starts with gcc/g++ 2.96 */
-# if !defined(NONAMELESSSTRUCT) && defined(__GNUC__) && ((__GNUC__ < 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ < 96)))
-# define NONAMELESSSTRUCT
-# endif
-/* Anonymous unions support starts with gcc 2.96/g++ 2.95 */
-# if !defined(NONAMELESSUNION) && defined(__GNUC__) && ((__GNUC__ < 2) || ((__GNUC__ == 2) && ((__GNUC_MINOR__ < 95) || ((__GNUC_MINOR__ == 95) && !defined(__cplusplus)))))
-# define NONAMELESSUNION
-# endif
-#endif
-
-#ifndef NONAMELESSSTRUCT
-#define DUMMYSTRUCTNAME
-#define DUMMYSTRUCTNAME1
-#define DUMMYSTRUCTNAME2
-#define DUMMYSTRUCTNAME3
-#define DUMMYSTRUCTNAME4
-#define DUMMYSTRUCTNAME5
-#else /* !defined(NONAMELESSSTRUCT) */
-#define DUMMYSTRUCTNAME s
-#define DUMMYSTRUCTNAME1 s1
-#define DUMMYSTRUCTNAME2 s2
-#define DUMMYSTRUCTNAME3 s3
-#define DUMMYSTRUCTNAME4 s4
-#define DUMMYSTRUCTNAME5 s5
-#endif /* !defined(NONAMELESSSTRUCT) */
-
-#ifndef NONAMELESSUNION
-#define DUMMYUNIONNAME
-#define DUMMYUNIONNAME1
-#define DUMMYUNIONNAME2
-#define DUMMYUNIONNAME3
-#define DUMMYUNIONNAME4
-#define DUMMYUNIONNAME5
-#define DUMMYUNIONNAME6
-#define DUMMYUNIONNAME7
-#define DUMMYUNIONNAME8
-#else /* !defined(NONAMELESSUNION) */
-#define DUMMYUNIONNAME u
-#define DUMMYUNIONNAME1 u1
-#define DUMMYUNIONNAME2 u2
-#define DUMMYUNIONNAME3 u3
-#define DUMMYUNIONNAME4 u4
-#define DUMMYUNIONNAME5 u5
-#define DUMMYUNIONNAME6 u6
-#define DUMMYUNIONNAME7 u7
-#define DUMMYUNIONNAME8 u8
-#endif /* !defined(NONAMELESSUNION) */
-
-/* Calling conventions definitions */
-
-#ifdef __i386__
-# ifndef _X86_
-# define _X86_
-# endif
-# if defined(__GNUC__) && ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)))
-# define __stdcall __attribute__((__stdcall__))
-# define __cdecl __attribute__((__cdecl__))
-# else
-# error You need gcc >= 2.7 to build Wine on a 386
-# endif /* __GNUC__ */
-#else /* __i386__ */
-# define __stdcall
-# define __cdecl
-#endif /* __i386__ */
-
-#define CALLBACK __stdcall
-#define WINAPI __stdcall
-#define APIPRIVATE __stdcall
-#define PASCAL __stdcall
-#define pascal __stdcall
-#define _pascal __stdcall
-#define _stdcall __stdcall
-#define _fastcall __stdcall
-#define __fastcall __stdcall
-#define __export __stdcall
-#define CDECL __cdecl
-#define _CDECL __cdecl
-#define cdecl __cdecl
-#define _cdecl __cdecl
-#define WINAPIV __cdecl
-#define APIENTRY WINAPI
-
-#ifndef _declspec
-#define _declspec(x)
-#endif
-#ifndef __declspec
-#define __declspec(x)
-#endif
-
-#define CONST const
-
-/* Standard data types. These are the same for emulator and library. */
-
-typedef void VOID;
-typedef int INT;
-typedef unsigned int UINT;
-typedef unsigned short WORD;
-typedef unsigned long DWORD;
-typedef unsigned long ULONG;
-typedef unsigned char BYTE;
-typedef long LONG;
-typedef short SHORT;
-typedef unsigned short USHORT;
-typedef char CHAR;
-typedef unsigned char UCHAR;
-/* Some systems might have wchar_t, but we really need 16 bit characters */
-typedef unsigned short WCHAR;
-typedef int BOOL;
-typedef double DATE;
-typedef double DOUBLE;
-
-/* FIXME: Wine does not compile with strict on, therefore strict
- * handles are presently only usable on machines where sizeof(UINT) ==
- * sizeof(void*). HANDLEs are supposed to be void* but a large amount
- * of WINE code operates on HANDLES as if they are UINTs. So to WINE
- * they exist as UINTs but to the Winelib user who turns on strict,
- * they exist as void*. If there is a size difference between UINT and
- * void* then things get ugly. */
-#ifdef STRICT
-typedef VOID* HANDLE;
-#else
-typedef UINT HANDLE;
-#endif
-
-
-typedef HANDLE *LPHANDLE;
/* Integer types. These are the same for emulator and library. */
typedef UINT WPARAM;
typedef LONG LPARAM;
-typedef LONG HRESULT;
typedef LONG LRESULT;
typedef WORD ATOM;
typedef WORD CATCHBUF[9];
typedef WORD *LPCATCHBUF;
typedef HANDLE HHOOK;
typedef HANDLE HMONITOR;
-typedef DWORD LCID;
-typedef WORD LANGID;
-typedef float FLOAT;
-
-/* Pointers types. These are the same for emulator and library. */
-/* winnt types */
-typedef VOID *PVOID;
-typedef const void *PCVOID;
-typedef CHAR *PCHAR;
-typedef UCHAR *PUCHAR;
-typedef BYTE *PBYTE;
-typedef WORD *PWORD;
-typedef USHORT *PUSHORT;
-typedef SHORT *PSHORT;
-typedef ULONG *PULONG;
-typedef LONG *PLONG;
-typedef DWORD *PDWORD;
-/* common win32 types */
-typedef CHAR *LPSTR;
-typedef CHAR *PSTR;
-typedef const CHAR *LPCSTR;
-typedef const CHAR *PCSTR;
-typedef WCHAR *LPWSTR;
-typedef WCHAR *PWSTR;
-typedef const WCHAR *LPCWSTR;
-typedef const WCHAR *PCWSTR;
-typedef BYTE *LPBYTE;
-typedef WORD *LPWORD;
-typedef DWORD *LPDWORD;
-typedef LONG *LPLONG;
-typedef VOID *LPVOID;
-typedef const VOID *LPCVOID;
-typedef INT *PINT;
-typedef INT *LPINT;
-typedef UINT *PUINT;
-typedef UINT *LPUINT;
-typedef FLOAT *PFLOAT;
-typedef FLOAT *LPFLOAT;
-typedef BOOL *PBOOL;
-typedef BOOL *LPBOOL;
/* Handle types that exist both in Win16 and Win32. */
-#ifdef STRICT
-#define DECLARE_HANDLE(a) \
- typedef struct a##__ { int unused; } *a; \
- typedef a *P##a; \
- typedef a *LP##a
-#else /*STRICT*/
-#define DECLARE_HANDLE(a) \
- typedef HANDLE a; \
- typedef a *P##a; \
- typedef a *LP##a
-#endif /*STRICT*/
-
DECLARE_HANDLE(HACMDRIVERID);
DECLARE_HANDLE(HACMDRIVER);
DECLARE_HANDLE(HACMOBJ);
@@ -335,33 +136,6 @@
typedef BOOL CALLBACK (*WNDENUMPROC)(HWND,LPARAM);
typedef LRESULT CALLBACK (*WNDPROC)(HWND,UINT,WPARAM,LPARAM);
-/* Define some empty macros for compatibility with Windows code. */
-
-#ifndef __WINE__
-#define NEAR
-#define FAR
-#define near
-#define far
-#define _near
-#define _far
-#define IN
-#define OUT
-#define OPTIONAL
-#endif /* __WINE__ */
-
-#include "winnt.h"
-
-/* Macro for structure packing. */
-
-#ifdef __GNUC__
-#define WINE_PACKED __attribute__((packed))
-#define WINE_UNUSED __attribute__((unused))
-#define WINE_NORETURN __attribute__((noreturn))
-#else
-#define WINE_PACKED /* nothing */
-#define WINE_UNUSED /* nothing */
-#define WINE_NORETURN /* nothing */
-#endif
/* Macros to split words and longs. */
diff --git a/include/winnt.h b/include/winnt.h
index 4255285..3cf860c 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -8,13 +8,284 @@
#define __WINE_WINNT_H
#include "basetsd.h"
-#include "windef.h"
#ifndef RC_INVOKED
#include <ctype.h>
#include <string.h>
#endif
+
+/* On Windows winnt.h depends on a few windef.h types and macros and thus
+ * is not self-contained. Furthermore windef.h includes winnt.h so that it
+ * would be pointless to try to use winnt.h directly.
+ * But for Wine and Winelib I decided to make winnt.h self-contained by
+ * moving these definitions to winnt.h. It makes no difference to Winelib
+ * programs since they are not using winnt.h directly anyway, and it allows
+ * us to use winnt.h and get a minimal set of definitions.
+ */
+
+/**** Some Wine specific definitions *****/
+
+/* Calling conventions definitions */
+
+#ifdef __i386__
+# ifndef _X86_
+# define _X86_
+# endif
+# if defined(__GNUC__) && ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)))
+# define __stdcall __attribute__((__stdcall__))
+# define __cdecl __attribute__((__cdecl__))
+# else
+# error You need gcc >= 2.7 to build Wine on a 386
+# endif /* __GNUC__ */
+#else /* __i386__ */
+# define __stdcall
+# define __cdecl
+#endif /* __i386__ */
+
+#ifndef __WINE__
+#define pascal __stdcall
+#define _pascal __stdcall
+#define _stdcall __stdcall
+#define _fastcall __stdcall
+#define __fastcall __stdcall
+#define __export __stdcall
+#define cdecl __cdecl
+#define _cdecl __cdecl
+
+#define near
+#define far
+#define _near
+#define _far
+#define NEAR
+#define FAR
+
+#ifndef _declspec
+#define _declspec(x)
+#endif
+#ifndef __declspec
+#define __declspec(x)
+#endif
+#endif /* __WINE__ */
+
+#define CALLBACK __stdcall
+#define WINAPI __stdcall
+#define APIPRIVATE __stdcall
+#define PASCAL __stdcall
+#define CDECL __cdecl
+#define _CDECL __cdecl
+#define WINAPIV __cdecl
+#define APIENTRY WINAPI
+#define CONST const
+
+/* Macro for structure packing and more. */
+
+#ifdef __GNUC__
+#define WINE_PACKED __attribute__((packed))
+#define WINE_UNUSED __attribute__((unused))
+#define WINE_NORETURN __attribute__((noreturn))
+#else
+#define WINE_PACKED /* nothing */
+#define WINE_UNUSED /* nothing */
+#define WINE_NORETURN /* nothing */
+#endif
+
+/* Anonymous union/struct handling */
+
+#ifdef __WINE__
+# define NONAMELESSSTRUCT
+# define NONAMELESSUNION
+#else
+/* Anonymous struct support starts with gcc/g++ 2.96 */
+# if !defined(NONAMELESSSTRUCT) && defined(__GNUC__) && ((__GNUC__ < 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ < 96)))
+# define NONAMELESSSTRUCT
+# endif
+/* Anonymous unions support starts with gcc 2.96/g++ 2.95 */
+# if !defined(NONAMELESSUNION) && defined(__GNUC__) && ((__GNUC__ < 2) || ((__GNUC__ == 2) && ((__GNUC_MINOR__ < 95) || ((__GNUC_MINOR__ == 95) && !defined(__cplusplus)))))
+# define NONAMELESSUNION
+# endif
+#endif
+
+#ifndef NONAMELESSSTRUCT
+#define DUMMYSTRUCTNAME
+#define DUMMYSTRUCTNAME1
+#define DUMMYSTRUCTNAME2
+#define DUMMYSTRUCTNAME3
+#define DUMMYSTRUCTNAME4
+#define DUMMYSTRUCTNAME5
+#else /* !defined(NONAMELESSSTRUCT) */
+#define DUMMYSTRUCTNAME s
+#define DUMMYSTRUCTNAME1 s1
+#define DUMMYSTRUCTNAME2 s2
+#define DUMMYSTRUCTNAME3 s3
+#define DUMMYSTRUCTNAME4 s4
+#define DUMMYSTRUCTNAME5 s5
+#endif /* !defined(NONAMELESSSTRUCT) */
+
+#ifndef NONAMELESSUNION
+#define DUMMYUNIONNAME
+#define DUMMYUNIONNAME1
+#define DUMMYUNIONNAME2
+#define DUMMYUNIONNAME3
+#define DUMMYUNIONNAME4
+#define DUMMYUNIONNAME5
+#define DUMMYUNIONNAME6
+#define DUMMYUNIONNAME7
+#define DUMMYUNIONNAME8
+#else /* !defined(NONAMELESSUNION) */
+#define DUMMYUNIONNAME u
+#define DUMMYUNIONNAME1 u1
+#define DUMMYUNIONNAME2 u2
+#define DUMMYUNIONNAME3 u3
+#define DUMMYUNIONNAME4 u4
+#define DUMMYUNIONNAME5 u5
+#define DUMMYUNIONNAME6 u6
+#define DUMMYUNIONNAME7 u7
+#define DUMMYUNIONNAME8 u8
+#endif /* !defined(NONAMELESSUNION) */
+
+
+/**** Parts of windef.h that are needed here *****/
+
+/* Misc. constants. */
+
+#undef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void*)0)
+#endif
+
+#ifdef FALSE
+#undef FALSE
+#endif
+#define FALSE 0
+
+#ifdef TRUE
+#undef TRUE
+#endif
+#define TRUE 1
+
+#ifndef IN
+#define IN
+#endif
+
+#ifndef OUT
+#define OUT
+#endif
+
+#ifndef OPTIONAL
+#define OPTIONAL
+#endif
+
+/* Standard data types */
+typedef const void *PCVOID, *LPCVOID;
+typedef int BOOL, *PBOOL, *LPBOOL;
+typedef unsigned char BYTE, *PBYTE, *LPBYTE;
+typedef unsigned char UCHAR, *PUCHAR;
+typedef unsigned short USHORT, *PUSHORT, *LPUSHORT;
+typedef unsigned short WORD, *PWORD, *LPWORD;
+typedef int INT, *PINT, *LPINT;
+typedef unsigned int UINT, *PUINT, *LPUINT;
+typedef unsigned long DWORD, *PDWORD, *LPDWORD;
+typedef unsigned long ULONG, *PULONG, *LPULONG;
+typedef float FLOAT, *PFLOAT, *LPFLOAT;
+typedef double DOUBLE, *PDOUBLE, *LPDOUBLE;
+typedef double DATE;
+
+
+/**** winnt.h proper *****/
+
+/* Define the basic types */
+#ifndef VOID
+#define VOID void
+#endif
+typedef VOID *PVOID, *LPVOID;
+typedef BYTE BOOLEAN, *PBOOLEAN;
+typedef char CHAR, *PCHAR;
+/* Some systems might have wchar_t, but we really need 16 bit characters */
+typedef unsigned short WCHAR, *PWCHAR;
+typedef short SHORT, *PSHORT;
+typedef long LONG, *PLONG, *LPLONG;
+
+/* 'Extended/Wide' numerical types */
+#ifndef _ULONGLONG_
+#define _ULONGLONG_
+typedef __int64 LONGLONG, *PLONGLONG;
+typedef __uint64 ULONGLONG, *PULONGLONG;
+#endif
+
+#ifndef _DWORDLONG_
+#define _DWORDLONG_
+typedef ULONGLONG DWORDLONG, *PDWORDLONG;
+#endif
+
+/* ANSI string types */
+typedef CHAR *PCH, *LPCH;
+typedef const CHAR *PCCH, *LPCCH;
+typedef CHAR *PSTR, *LPSTR;
+typedef const CHAR *PCSTR, *LPCSTR;
+
+/* Unicode string types */
+typedef WCHAR *PWCH, *LPWCH;
+typedef const WCHAR *PCWCH, *LPCWCH;
+typedef WCHAR *PWSTR, *LPWSTR;
+typedef const WCHAR *PCWSTR, *LPCWSTR;
+
+/* Neutral character and string types */
+/* These are only defined for WineLib, i.e. _not_ defined for
+ * the emulator. The reason is they depend on the UNICODE
+ * macro which only exists in the user's code.
+ */
+#ifndef __WINE__
+# ifdef UNICODE
+typedef WCHAR TCHAR, *PTCHAR;
+typedef LPWSTR PTSTR, LPTSTR;
+typedef LPCWSTR PCTSTR, LPCTSTR;
+# define __TEXT(string) L##string /*probably wrong */
+# else /* UNICODE */
+typedef CHAR TCHAR, *PTCHAR;
+typedef LPSTR PTSTR, LPTSTR;
+typedef LPCSTR PCTSTR, LPCTSTR;
+# define __TEXT(string) string
+# endif /* UNICODE */
+#endif /* __WINE__ */
+#define TEXT(quote) __TEXT(quote)
+
+/* Misc common WIN32 types */
+typedef LONG HRESULT;
+typedef DWORD LCID, *PLCID;
+typedef WORD LANGID;
+
+/* Handle type */
+
+/* FIXME: Wine does not compile with strict on, therefore strict
+ * handles are presently only usable on machines where sizeof(UINT) ==
+ * sizeof(void*). HANDLEs are supposed to be void* but a large amount
+ * of WINE code operates on HANDLES as if they are UINTs. So to WINE
+ * they exist as UINTs but to the Winelib user who turns on strict,
+ * they exist as void*. If there is a size difference between UINT and
+ * void* then things get ugly. */
+#ifdef STRICT
+typedef VOID* HANDLE;
+#else
+typedef UINT HANDLE;
+#endif
+typedef HANDLE *LPHANDLE;
+
+#ifdef STRICT
+#define DECLARE_HANDLE(a) \
+ typedef struct a##__ { int unused; } *a; \
+ typedef a *P##a; \
+ typedef a *LP##a
+#else /*STRICT*/
+#define DECLARE_HANDLE(a) \
+ typedef HANDLE a; \
+ typedef a *P##a; \
+ typedef a *LP##a
+#endif /*STRICT*/
+
+
#include "pshpack1.h"
/* Defines */
@@ -120,39 +391,6 @@
/* Types */
-/* TCHAR data types definitions for Winelib. */
-/* These types are _not_ defined for the emulator, because they */
-/* depend on the UNICODE macro that only exists in user's code. */
-
-#ifndef __WINE__
-# ifdef UNICODE
-typedef WCHAR TCHAR, *PTCHAR;
-typedef LPWSTR PTSTR, LPTSTR;
-typedef LPCWSTR PCTSTR, LPCTSTR;
-#define __TEXT(string) L##string /*probably wrong */
-# else /* UNICODE */
-typedef char TCHAR, *PTCHAR;
-typedef LPSTR PTSTR, LPTSTR;
-typedef LPCSTR PCTSTR, LPCTSTR;
-#define __TEXT(string) string
-# endif /* UNICODE */
-#endif /* __WINE__ */
-#define TEXT(quote) __TEXT(quote)
-
-typedef BYTE BOOLEAN;
-typedef BOOLEAN *PBOOLEAN;
-
-#ifndef _DWORDLONG_
-#define _DWORDLONG_
-typedef __uint64 DWORDLONG, *PDWORDLONG;
-#endif
-
-#ifndef _ULONGLONG_
-#define _ULONGLONG_
-typedef __int64 LONGLONG, *PLONGLONG;
-typedef __uint64 ULONGLONG, *PULONGLONG;
-#endif
-
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;