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;