Release 951105

Fri Nov  3 20:08:17 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>

	* [configure.in]
	Attempt to check for -li386 on NetBSD. Please test this.

Mon Oct 30 12:40:32 EST 1995  Jim Peterson <jspeter@birch.ee.vt.edu>

	* [*/*]
	Eliminated various warnings with either explicit casts or more
	accurate variable/parameter declarations (e.g. INT instead of short
	or WORD).
	Changed macros 'min' and 'max' to 'MIN' and 'MAX', since they're
	macros.

	* [controls/edit.c] [windows/defdlg.c]
	Added '#ifdef SUPERFLUOUS_FUNCTIONS' wrappers around function
	definition of EDIT_KeyVScrollDoc, EDIT_TextLineNumber, and
	DEFDLG_FindDefButton to avoid warnings.

	* [controls/button.c] [controls/scroll.c] [windows/defwnd.c]
	  [windows/message.c] [windows/nonclient.c]
	Converted MAKEPOINT macro call to manual conversion.

	* [include/windows.h]
	For WINELIB32, structures POINT, SIZE, and RECT have LONG members
	instead of INT.  This also invalidates the macro MAKEPOINT(), which
	is not supported in Win32.  Also defined the POINTS structure (SHORT
	members) and the MAKEPOINTS macro.

	* [misc/commdlg.c]
	Changed a lot of 'strcpy' calls to 'strncpy' calls.  I'm desperate to
	find this memory bug, and this should be done anyway.

	* [controls/edit.c]
	Well, the alteration mentioned above didn't do it, but #ifdef'ing out
	a few lines in EDIT_ClearText did.  This leads to bugs, but for now,
	it's better than bizzare memory troubles.

	* [toolkit/miscstubs.c]
	Removed warning messages in GLOBAL_CreateBlock(), GLOBAL_FreeBlock(),
	and RELAY32_GetEntryPoint().  These are the most popular warnings, and
	their current implementation seems fine.

Sat Oct 28 09:39:18 1995  Jochen Karrer <cip307@wpax01.Physik.Uni-Wuerzburg.DE>

	* [objects/cursoricon.c]
	Fix for "broken" X servers that invert masked cursor colors.

Fri Oct 27 19:27:21 1995  Alex Korobka  <alex@phm6.pharm.sunysb.edu>

	* [windows/dialog.c] [windows/nonclient.c]
	Remove unnecessary items from the system menu.

Thu Oct 26 05:03:03 MET 1995  Philippe De Muyter <phdm@info.ucl.ac.be>

	* [objects/color.c] [objects/palette.c]
	Make GetNearestColor return a RGB value instead of a pixel value.

Wed Oct 25 23:33:39 1995    Martin von Loewis <loewis@informatik.hu-berlin.de>

	* [controls/desktop.c][controls/menu.c][include/menu.h]
	Changed WORD parameters to UINT parameters.

	* [include/wintypes.h]
	Made UINT 32bit for WINELIB.

	* [loader/main.c]
	Disabled RELAY32_Init and MODULE_Init for WINELIB.

	* [misc/main.c]
	Assume CPU386 for WINELIB.

	* [rc/winerc]
	add_popup: set MF_POPUP flag on menu item.

	* [toolkit/Makefile.in][toolkit/hello3.c][toolkit/hello3res.c]
	Add resource demo hello3 for WINELIB.
	New file README.resources.

	* [toolkit/miscstubs.c]
	Add a case for 17.

Tue Oct 17 15:13:10 IST 1995  Itai Nahshon <nahshon@vnet.ibm.com>

	* [loader/module.c]
	Do not append .exe if the file name already has an extension.

	* [misc/profile.c]
	Avoid creating a file with a junk name if a .ini file does not
	exist.

	* [if1632/gdi.spec] [if1632/user.spec] [if1632/dummy.c]
	Added a lot of dummy stubs for Windows Hebrew version.

Tue Oct 17 01:03:24 1995 William Magro <wmagro@tc.cornell.edu>

	* [controls/button.c]
	Fix for buttons with no label.

	* [controls/combo.c][controls/listbox.c]
	Fixes for scrollbar positioning.  Now disappears correctly
	for short lists.

	* [controls/edit.c]
	Handle memory allocation differently when building as library.

	* [controls/static]
	Don't destroy old icon before drawing new icon. (Fixes landscape/
	portrait toggle icon in print dialog.)

	* [if1632/gdi.spec]
	New functions SetMetaFileBits and GetMetaFileBits

	* [include/sysmetrics.h] [windows/sysmetrics.c]
	Add support for GetSystemMetrics(SM_CMETRICS) == SM_CMETRICS

	* [include/windows.h]
	META_EXTTEXTOUT, not META_SETTEXTOUT
	define GetCurrentTime as GetTickCount (for wine library)

	* [loader/main.c]
	Don't initialize built-in modules in wine library

	* [memory/local.c]
	LocalReAlloc was defined incorrectly. Swap flags and size arguments.

	* [misc/main.c]
	Always report CPUTYPE=4 to wine library.

	* [objects/dib.c]
	RLE8 images were missing top line when decompressed.

	* [objects/metafile.c]
	SetMetaFileBits and GetMetaFileBits implemented.  Works when called
	from winhelp.  More testing needed.  Various memory leaks plugged.
	Various other bug fixes.  New metafile operations added in
	PlayMetaFileRecord: CreatePalette, SetTextAlign, SelectPalette,
	SetMapperFlags, RealizePalette, ExtTextOut, Escape.  Testing needed.

	* [toolkit/heap.c]
	LocalUnLock changed to LocalUnlock

Sun Oct 15 21:55:33 1995  Anand Kumria <akumria@ozemail.com.au>
	
	* [misc/winsock.c] 
	Return the correct error number, for host lookup operations.
	Also, correct the problem with send_message.

Fri Oct 13 19:04:35 1995  Morten Welinder  <terra@diku.dk>

	* [Makefile.in]
	Using nm's built-in sorting.

	* [*/*.c]
	Use xmalloc for malloc and xrealloc for realloc in all ungarded
	cases.

	* [debugger/dbg.y]
	Handle C-like expressions.  Clean-up.

	* [debugger/debug.l]
	Lots of new tokens for expressions.

	* [debugger/info.c]
	Implement "list" command for disassembling.

	* [misc/ole2nls.c]
	Implement more Danish stuff.

Fri Oct  6 10:39:39 1995 Ram'on Garc'ia <ramon@ie3.clubs.etsit.upm.es>

	* [loader/module.c]
	Updated self-loading modules to support for new 32 bit 
	stack frames.
diff --git a/ANNOUNCE b/ANNOUNCE
index 5a10f8b..e19ef72 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,15 +1,14 @@
-This is release 951003 of Wine the MS Windows emulator.  This is still a
+This is release 951105 of Wine the MS Windows emulator.  This is still a
 developer's only release.  There are many bugs and many unimplemented API
 features.  Most applications still do not work.
 
 Patches should be submitted to "wine-new@amscons.com".  Please don't forget
 to include a ChangeLog entry.  I'll make a new release every other week.
 
-WHAT'S NEW with Wine-951003: (see ChangeLog for details)
-	- New cursor handling.
-	- French, Danish and Finnish language support.
-	- Lots of Winelib improvements.
-	- Preliminary VxD support.
+WHAT'S NEW with Wine-951105: (see ChangeLog for details)
+	- A lot of fixes for Winelib.
+	- Built-in debugger improvements.
+	- Get/SetMetafileBits implemented.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -18,11 +17,11 @@
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-    sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-951003.tar.gz
-    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-951003.tar.gz
-    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-951003.tar.gz
-    ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-951003.tar.gz
-    aris.com:/pub/linux/ALPHA/Wine/development/Wine-951003.tar.gz
+    sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-951105.tar.gz
+    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-951105.tar.gz
+    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-951105.tar.gz
+    ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-951105.tar.gz
+    aris.com:/pub/linux/ALPHA/Wine/development/Wine-951105.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/ChangeLog b/ChangeLog
index 3ddda8e..988d9a6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,180 @@
 ----------------------------------------------------------------------
+Fri Nov  3 20:08:17 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>
+
+	* [configure.in]
+	Attempt to check for -li386 on NetBSD. Please test this.
+
+Mon Oct 30 12:40:32 EST 1995  Jim Peterson <jspeter@birch.ee.vt.edu>
+
+	* [*/*]
+	Eliminated various warnings with either explicit casts or more
+	accurate variable/parameter declarations (e.g. INT instead of short
+	or WORD).
+	Changed macros 'min' and 'max' to 'MIN' and 'MAX', since they're
+	macros.
+
+	* [controls/edit.c] [windows/defdlg.c]
+	Added '#ifdef SUPERFLUOUS_FUNCTIONS' wrappers around function
+	definition of EDIT_KeyVScrollDoc, EDIT_TextLineNumber, and
+	DEFDLG_FindDefButton to avoid warnings.
+
+	* [controls/button.c] [controls/scroll.c] [windows/defwnd.c]
+	  [windows/message.c] [windows/nonclient.c]
+	Converted MAKEPOINT macro call to manual conversion.
+
+	* [include/windows.h]
+	For WINELIB32, structures POINT, SIZE, and RECT have LONG members
+	instead of INT.  This also invalidates the macro MAKEPOINT(), which
+	is not supported in Win32.  Also defined the POINTS structure (SHORT
+	members) and the MAKEPOINTS macro.
+
+	* [misc/commdlg.c]
+	Changed a lot of 'strcpy' calls to 'strncpy' calls.  I'm desperate to
+	find this memory bug, and this should be done anyway.
+
+	* [controls/edit.c]
+	Well, the alteration mentioned above didn't do it, but #ifdef'ing out
+	a few lines in EDIT_ClearText did.  This leads to bugs, but for now,
+	it's better than bizzare memory troubles.
+
+	* [toolkit/miscstubs.c]
+	Removed warning messages in GLOBAL_CreateBlock(), GLOBAL_FreeBlock(),
+	and RELAY32_GetEntryPoint().  These are the most popular warnings, and
+	their current implementation seems fine.
+
+Sat Oct 28 09:39:18 1995  Jochen Karrer <cip307@wpax01.Physik.Uni-Wuerzburg.DE>
+
+	* [objects/cursoricon.c]
+	Fix for "broken" X servers that invert masked cursor colors.
+
+Fri Oct 27 19:27:21 1995  Alex Korobka  <alex@phm6.pharm.sunysb.edu>
+
+	* [windows/dialog.c] [windows/nonclient.c]
+	Remove unnecessary items from the system menu.
+
+Thu Oct 26 05:03:03 MET 1995  Philippe De Muyter <phdm@info.ucl.ac.be>
+
+	* [objects/color.c] [objects/palette.c]
+	Make GetNearestColor return a RGB value instead of a pixel value.
+
+Wed Oct 25 23:33:39 1995    Martin von Loewis <loewis@informatik.hu-berlin.de>
+
+	* [controls/desktop.c][controls/menu.c][include/menu.h]
+	Changed WORD parameters to UINT parameters.
+
+	* [include/wintypes.h]
+	Made UINT 32bit for WINELIB.
+
+	* [loader/main.c]
+	Disabled RELAY32_Init and MODULE_Init for WINELIB.
+
+	* [misc/main.c]
+	Assume CPU386 for WINELIB.
+
+	* [rc/winerc]
+	add_popup: set MF_POPUP flag on menu item.
+
+	* [toolkit/Makefile.in][toolkit/hello3.c][toolkit/hello3res.c]
+	Add resource demo hello3 for WINELIB.
+	New file README.resources.
+
+	* [toolkit/miscstubs.c]
+	Add a case for 17.
+
+Tue Oct 17 15:13:10 IST 1995  Itai Nahshon <nahshon@vnet.ibm.com>
+
+	* [loader/module.c]
+	Do not append .exe if the file name already has an extension.
+
+	* [misc/profile.c]
+	Avoid creating a file with a junk name if a .ini file does not
+	exist.
+
+	* [if1632/gdi.spec] [if1632/user.spec] [if1632/dummy.c]
+	Added a lot of dummy stubs for Windows Hebrew version.
+
+Tue Oct 17 01:03:24 1995 William Magro <wmagro@tc.cornell.edu>
+
+	* [controls/button.c]
+	Fix for buttons with no label.
+
+	* [controls/combo.c][controls/listbox.c]
+	Fixes for scrollbar positioning.  Now disappears correctly
+	for short lists.
+
+	* [controls/edit.c]
+	Handle memory allocation differently when building as library.
+
+	* [controls/static]
+	Don't destroy old icon before drawing new icon. (Fixes landscape/
+	portrait toggle icon in print dialog.)
+
+	* [if1632/gdi.spec]
+	New functions SetMetaFileBits and GetMetaFileBits
+
+	* [include/sysmetrics.h] [windows/sysmetrics.c]
+	Add support for GetSystemMetrics(SM_CMETRICS) == SM_CMETRICS
+
+	* [include/windows.h]
+	META_EXTTEXTOUT, not META_SETTEXTOUT
+	define GetCurrentTime as GetTickCount (for wine library)
+
+	* [loader/main.c]
+	Don't initialize built-in modules in wine library
+
+	* [memory/local.c]
+	LocalReAlloc was defined incorrectly. Swap flags and size arguments.
+
+	* [misc/main.c]
+	Always report CPUTYPE=4 to wine library.
+
+	* [objects/dib.c]
+	RLE8 images were missing top line when decompressed.
+
+	* [objects/metafile.c]
+	SetMetaFileBits and GetMetaFileBits implemented.  Works when called
+	from winhelp.  More testing needed.  Various memory leaks plugged.
+	Various other bug fixes.  New metafile operations added in
+	PlayMetaFileRecord: CreatePalette, SetTextAlign, SelectPalette,
+	SetMapperFlags, RealizePalette, ExtTextOut, Escape.  Testing needed.
+
+	* [toolkit/heap.c]
+	LocalUnLock changed to LocalUnlock
+
+Sun Oct 15 21:55:33 1995  Anand Kumria <akumria@ozemail.com.au>
+	
+	* [misc/winsock.c] 
+	Return the correct error number, for host lookup operations.
+	Also, correct the problem with send_message.
+
+Fri Oct 13 19:04:35 1995  Morten Welinder  <terra@diku.dk>
+
+	* [Makefile.in]
+	Using nm's built-in sorting.
+
+	* [*/*.c]
+	Use xmalloc for malloc and xrealloc for realloc in all ungarded
+	cases.
+
+	* [debugger/dbg.y]
+	Handle C-like expressions.  Clean-up.
+
+	* [debugger/debug.l]
+	Lots of new tokens for expressions.
+
+	* [debugger/info.c]
+	Implement "list" command for disassembling.
+
+	* [misc/ole2nls.c]
+	Implement more Danish stuff.
+
+Fri Oct  6 10:39:39 1995 Ram'on Garc'ia <ramon@ie3.clubs.etsit.upm.es>
+
+	* [loader/module.c]
+	Updated self-loading modules to support for new 32 bit 
+	stack frames.
+
+----------------------------------------------------------------------
 Sun Oct  1 15:48:34 1995  Alexandre Julliard  <julliard@sunsite.unc>
 
 	* [controls/menu.c]
diff --git a/Make.rules.in b/Make.rules.in
index 7894d2b..4dd971d 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -32,7 +32,7 @@
 	mv tmp_make Makefile
 
 clean::
-	$(RM) *.o \#*\# *~ *.bak tmp_make
+	$(RM) *.o \#*\# *~ *.bak *.flc tmp_make
 
 distclean:: clean
 	$(RM) Makefile
diff --git a/Makefile.in b/Makefile.in
index 130f12f..19f8a12 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -6,6 +6,7 @@
 # langclean:		remove all files which have to be remade if
 #			a different LANGuage is selected
 # depend:		create the dependencies
+# etags:		Create a TAGS file for Emacs.
 #
 # Author: Michael Patra   <micky@marie.physik.tu-berlin.de>
 #                         <patra@itp1.physik.tu-berlin.de>
@@ -20,7 +21,7 @@
 DIVINCL   = -I$(TOPSRC)/include
 XPM_LIB	  = -lXpm
 XLIB	  = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
-LDLIBS	  = -lm
+LDLIBS	  = @LDLIBS@
 AR        = ar rc
 RANLIB    = @RANLIB@
 RM        = rm -f
@@ -59,9 +60,9 @@
 
 all: $(MAIN_TARGET)
 
-wine: $(COMMONSUBDIRS) $(EMUSUBDIRS) dummy
+wine wine.sym: $(COMMONSUBDIRS) $(EMUSUBDIRS) dummy
 	$(CC) -o wine $(COMMONOBJS) $(EMUOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
-	nm wine | grep -v _compiled | sort >wine.sym
+	nm -n wine | grep -v _compiled >wine.sym
 
 winelib.a: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy
 	$(RM) $@
@@ -79,7 +80,7 @@
 
 clean:
 	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean); done
-	$(RM) *.o \#*\# *~ *.bak wine wine.sym winelib.a TAGS
+	$(RM) *.o \#*\# *~ *.bak *.flc wine wine.sym winelib.a TAGS
 
 distclean:
 	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) distclean); done
diff --git a/configure b/configure
index 73944bc..c0df84d 100755
--- a/configure
+++ b/configure
@@ -413,6 +413,7 @@
 # We want these before the checks, so the checks can modify their values.
 test -z "$CFLAGS" && CFLAGS="-g -O2 -Wall" 
 test -z "$LDFLAGS" && LDFLAGS=-g 
+test -z "$LDLIBS" && LDLIBS=-lm 
 
 
 # Check whether --with-library or --without-library was given.
@@ -573,7 +574,7 @@
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 577 "configure"
+#line 578 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
@@ -587,7 +588,7 @@
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 591 "configure"
+#line 592 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
@@ -693,7 +694,7 @@
 test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
 test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
 cat > conftest.$ac_ext <<EOF
-#line 697 "configure"
+#line 698 "configure"
 #include "confdefs.h"
 #include <$x_direct_test_include>
 EOF
@@ -756,7 +757,7 @@
 ac_save_LIBS="$LIBS"
 LIBS="-l$x_direct_test_library $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 760 "configure"
+#line 761 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -874,7 +875,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lICE  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 878 "configure"
+#line 879 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -917,7 +918,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 921 "configure"
+#line 922 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -951,7 +952,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet_stub  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 955 "configure"
+#line 956 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -990,7 +991,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 994 "configure"
+#line 995 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -1028,7 +1029,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1032 "configure"
+#line 1033 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -1132,7 +1133,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-l$ac_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1136 "configure"
+#line 1137 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -1188,6 +1189,40 @@
   echo "$ac_t""no" 1>&6
 fi
 
+echo $ac_n "checking for -li386""... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_lib_i386'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-li386  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1200 "configure"
+#include "confdefs.h"
+
+int main() { return 0; }
+int t() {
+i386_set_ldt()
+; return 0; }
+EOF
+if eval $ac_link; then
+  rm -rf conftest*
+  eval "ac_cv_lib_i386=yes"
+else
+  rm -rf conftest*
+  eval "ac_cv_lib_i386=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'i386`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  LDLIBS="$LDLIBS -li386"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
 
 for ac_func in tcgetattr
 do
@@ -1196,7 +1231,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1200 "configure"
+#line 1235 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1248,7 +1283,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1252 "configure"
+#line 1287 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
@@ -1281,7 +1316,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1285 "configure"
+#line 1320 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -1335,7 +1370,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1339 "configure"
+#line 1374 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -1412,7 +1447,7 @@
   ac_cv_c_cross=yes
 else
 cat > conftest.$ac_ext <<EOF
-#line 1416 "configure"
+#line 1451 "configure"
 #include "confdefs.h"
 main(){return(0);}
 EOF
@@ -1433,7 +1468,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1437 "configure"
+#line 1472 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1455,7 +1490,7 @@
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1459 "configure"
+#line 1494 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1473,7 +1508,7 @@
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1477 "configure"
+#line 1512 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1494,7 +1529,7 @@
   ac_cv_header_stdc=no
 else
 cat > conftest.$ac_ext <<EOF
-#line 1498 "configure"
+#line 1533 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1528,7 +1563,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1532 "configure"
+#line 1567 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -1705,6 +1740,7 @@
 s%@exec_prefix@%$exec_prefix%g
 s%@prefix@%$prefix%g
 s%@program_transform_name@%$program_transform_name%g
+s%@LDLIBS@%$LDLIBS%g
 s%@MAIN_TARGET@%$MAIN_TARGET%g
 s%@LANG@%$LANG%g
 s%@SET_MAKE@%$SET_MAKE%g
diff --git a/configure.in b/configure.in
index 8460d1d..4bbf3fe 100644
--- a/configure.in
+++ b/configure.in
@@ -7,6 +7,7 @@
 # We want these before the checks, so the checks can modify their values.
 test -z "$CFLAGS" && CFLAGS="-g -O2 -Wall" AC_SUBST(CFLAGS)
 test -z "$LDFLAGS" && LDFLAGS=-g AC_SUBST(LDFLAGS)
+test -z "$LDLIBS" && LDLIBS=-lm AC_SUBST(LDLIBS)
 
 dnl **** Command-line arguments ****
 
@@ -29,7 +30,7 @@
 [  --with-malloc-debug     enable malloc() debugging],
 [AC_DEFINE(MALLOC_DEBUGGING)])
 
-dnl **** Check for some programs ****
+dnl **** Check for some programs and libraries ****
 
 AC_PROG_MAKE_SET
 AC_PROG_CC
@@ -37,6 +38,10 @@
 AC_PROG_YACC
 AC_PROG_LEX
 AC_PROG_RANLIB
+dnl Check for -li386 for NetBSD
+AC_CHECK_LIB(i386,i386_set_ldt,LDLIBS="$LDLIBS -li386")
+
+dnl **** Check for functions and header files ****
 
 AC_CHECK_FUNCS(tcgetattr)
 AC_CHECK_HEADERS(stdlib.h)
diff --git a/controls/button.c b/controls/button.c
index 087a7d7..9310643 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -71,6 +71,7 @@
 LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
         RECT rect;
+        POINT pt;
 	LONG lResult = 0;
 	WND *wndPtr = WIN_FindWndPtr(hWnd);
 	LONG style = wndPtr->dwStyle & 0x0000000F;
@@ -139,7 +140,9 @@
 	        if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) break;
                 SendMessage( hWnd, BM_SETSTATE, FALSE, 0 );
                 GetClientRect( hWnd, &rect );
-                if (PtInRect( &rect, MAKEPOINT(lParam) ))
+                pt.x = LOWORD(lParam);
+                pt.y = HIWORD(lParam);
+                if (PtInRect( &rect, pt ))
                 {
                     switch(style)
                     {
@@ -171,7 +174,9 @@
                 if (GetCapture() == hWnd)
                 {
                     GetClientRect( hWnd, &rect );
-                    if (PtInRect( &rect, MAKEPOINT(lParam)) )
+                    pt.x = LOWORD(lParam);
+                    pt.y = HIWORD(lParam);
+                    if (PtInRect( &rect, pt) )
                        SendMessage( hWnd, BM_SETSTATE, TRUE, 0 );
                     else SendMessage( hWnd, BM_SETSTATE, FALSE, 0 );
                 }
@@ -314,7 +319,7 @@
     
     /* draw button label, if any: */
     text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText );
-    if (text[0])
+    if (text && text[0])
     {
         SetTextColor( hDC, (wndPtr->dwStyle & WS_DISABLED) ?
                      GetSysColor(COLOR_GRAYTEXT) : GetSysColor(COLOR_BTNTEXT));
@@ -369,8 +374,6 @@
 
     GetTextMetrics(hDC, &tm);
     delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText );
-    textlen = strlen( text );
 
       /* Draw the check-box bitmap */
     x = y = 0;
@@ -383,6 +386,9 @@
                       x, y, checkBoxWidth, checkBoxHeight );
     rc.left += checkBoxWidth + tm.tmAveCharWidth / 2;
 
+    if (!(text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText ))) return;
+    textlen = strlen( text );
+
     if (action == ODA_DRAWENTIRE)
     {
         if (wndPtr->dwStyle & WS_DISABLED)
@@ -400,7 +406,7 @@
             rc.bottom -= delta + 1;
         }
         rc.left--;
-        rc.right = min( rc.left + size.cx + 2, rc.right );
+        rc.right = MIN( rc.left + size.cx + 2, rc.right );
         DrawFocusRect(hDC, &rc);
     }
 }
@@ -453,7 +459,7 @@
     LineTo( hDC, rc.left, rc.bottom-1 );
     LineTo( hDC, rc.left, rc.top+2 );
 
-    text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText );
+    if (!(text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText ))) return;
     GetTextExtentPoint(hDC, text, strlen(text), &size);
     rc.left  += 10;
     rc.right  = rc.left + size.cx + 1;
diff --git a/controls/combo.c b/controls/combo.c
index aab97f5..8284d51 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -22,6 +22,7 @@
 #include "dos_fs.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
  /*
   * Note: Combos are probably implemented in a different way by Windows.
@@ -59,7 +60,7 @@
 {
   LPHEADCOMBO lphc;
 
-  lphc = (LPHEADCOMBO)malloc(sizeof(HEADCOMBO));
+  lphc = (LPHEADCOMBO)xmalloc(sizeof(HEADCOMBO));
   SetWindowLong(hwnd,4,(LONG)lphc);
   lphc->hWndEdit = 0;
   lphc->hWndLBox = 0;
@@ -652,7 +653,11 @@
 static LONG CBLCreate( HWND hwnd, WORD wParam, LONG lParam )
 {
   CREATESTRUCT *createStruct = (CREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
+#ifdef WINELIB32
+  SetWindowLong(hwnd,0,(LONG)createStruct->lpCreateParams);
+#else
   SetWindowWord(hwnd,0,LOWORD(createStruct->lpCreateParams));
+#endif
   return 0;
 }
 
@@ -772,7 +777,7 @@
       lpls->itemRect.left   = rect.left;
       lpls->itemRect.right  = rect.right;
 
-      dprintf_listbox(stddeb,"drawing item: %d %d %d %d %d\n",rect.left,top,rect.right,top+height,lpls->itemState);
+      dprintf_listbox(stddeb,"drawing item: %ld %d %ld %d %d\n",(LONG)rect.left,top,(LONG)rect.right,top+height,lpls->itemState);
       if (lphl->OwnerDrawn) {
 	ListBoxDrawItem (combohwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, 0);
 	if (lpls->itemState)
@@ -790,6 +795,7 @@
 
     lpls = lpls->lpNext;
   }
+  SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
   SelectObject(hdc,hOldFont);
   EndPaint( hwnd, &ps );
   return 0;
diff --git a/controls/desktop.c b/controls/desktop.c
index ef9377b..b3796f4 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -118,7 +118,7 @@
  *
  * Window procedure for the desktop window.
  */
-LRESULT DesktopWndProc ( HWND hwnd, WORD message, WPARAM wParam, LPARAM lParam )
+LRESULT DesktopWndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     DESKTOPINFO *infoPtr = (DESKTOPINFO *)wndPtr->wExtra;
diff --git a/controls/edit.c b/controls/edit.c
index 957c870..31534d6 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -18,6 +18,7 @@
 #include "user.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 
 #ifdef WINELIB32
@@ -46,7 +47,7 @@
     RECT fmtrc;              /* rectangle in which to format text */
     int txtht;               /* height of text line in pixels */
     HANDLE hText;            /* handle to text buffer */
-    short *CharWidths;       /* widths of chars in font */
+    INT *CharWidths;         /* widths of chars in font */
     unsigned int *textptrs;  /* list of line offsets */
     char *BlankLine;         /* to fill blank lines quickly */
     int CurrCol;             /* current column */
@@ -106,7 +107,12 @@
 {
     HLOCAL ret;
 
+#if defined(WINELIB)
+    /* temporary fix, until Local memory is correctly implemented in WINELIB */
+    ret = LocalAlloc( flags, bytes );
+#else
     ret = LOCAL_Alloc( WIN_GetWindowInstance(hwnd), flags, bytes );
+#endif
     if (!ret)
         printf("EDIT_HeapAlloc: Out of heap-memory\n");
     return ret;
@@ -122,9 +128,13 @@
     HINSTANCE hinstance = WIN_GetWindowInstance( hwnd );
     HANDLE offs;
     
+#if defined(WINELIB)
+    return handle;
+#else
     if (handle == 0) return 0;
     offs = LOCAL_Lock( hinstance, handle );
     return PTR_SEG_OFF_TO_LIN( hinstance, offs );
+#endif
 }
 
 /*********************************************************************
@@ -132,8 +142,12 @@
  */
 static void EDIT_HeapUnlock(HWND hwnd, HANDLE handle)
 {
+#if defined(WINELIB)
+    return 0;
+#else
     if (handle == 0) return;
     LOCAL_Unlock( WIN_GetWindowInstance( hwnd ), handle );
+#endif
 }
 
 /*********************************************************************
@@ -143,8 +157,12 @@
  */
 static HLOCAL EDIT_HeapReAlloc(HWND hwnd, HANDLE handle, int bytes)
 {
+#if defined(WINELIB)
+    return LocalReAlloc( handle, bytes, LMEM_FIXED );
+#else
     return LOCAL_ReAlloc( WIN_GetWindowInstance(hwnd), handle, bytes, 
 			  LMEM_FIXED );
+#endif
 }
 
 
@@ -155,7 +173,11 @@
  */
 static void EDIT_HeapFree(HWND hwnd, HANDLE handle)
 {
+#if defined(WINELIB)
+    LocalFree( handle );
+#else
     LOCAL_Free( WIN_GetWindowInstance(hwnd), handle );
+#endif
 }
 
 
@@ -166,7 +188,11 @@
  */
 static unsigned int EDIT_HeapSize(HWND hwnd, HANDLE handle)
 {
+#if defined(WINELIB)
+    return LocalSize( handle );
+#else
     return LOCAL_Size( WIN_GetWindowInstance(hwnd), handle );
+#endif
 }
 
 /********************************************************************
@@ -239,7 +265,7 @@
     EDITSTATE *es = EDIT_GetEditState(hwnd);
     
     dprintf_edit( stddeb, "EDIT_ClerTextPointers\n" );
-    es->textptrs = realloc(es->textptrs, sizeof(int));
+    es->textptrs = xrealloc(es->textptrs, sizeof(int));
     es->textptrs[0] = 0;
 }
 
@@ -267,7 +293,7 @@
     } else es->wlines = 1;
     
     dprintf_edit( stddeb, "EDIT_BuildTextPointers: realloc\n" );
-    es->textptrs = realloc(es->textptrs, (es->wlines + 2) * sizeof(int));
+    es->textptrs = xrealloc(es->textptrs, (es->wlines + 2) * sizeof(int));
     
     cp = text;
     dprintf_edit(stddeb,"BuildTextPointers: %d lines, pointer %p\n", 
@@ -290,7 +316,7 @@
 	                                     /* width of line in pixels */
 	    cp++;
 	}
-	es->textwidth = max(es->textwidth, len);
+	es->textwidth = MAX(es->textwidth, len);
 	if (*cp)
 	    cp++;                            /* skip '\n' */
     }
@@ -345,7 +371,7 @@
     else len = cp - cp1;
     
     /* store selected line and return handle */
-    cp = malloc( len + 1 );
+    cp = xmalloc( len + 1 );
     strncpy( cp, cp1, len);
     cp[len] = 0;
     return cp;
@@ -497,8 +523,8 @@
     if (strlen(es->BlankLine) < (es->ClientWidth / es->CharWidths[32]) + 2)
     {
 	dprintf_edit( stddeb, "EDIT_WriteText: realloc\n" );
-        es->BlankLine = realloc(es->BlankLine, 
-				(es->ClientWidth / es->CharWidths[32]) + 2);
+        es->BlankLine = xrealloc(es->BlankLine, 
+				 (es->ClientWidth / es->CharWidths[32]) + 2);
         memset(es->BlankLine, ' ', (es->ClientWidth / es->CharWidths[32]) + 2);
 	es->BlankLine[(es->ClientWidth / es->CharWidths[32]) + 1] = 0;
     }
@@ -585,14 +611,14 @@
     /* make sure rectangle is within window */
     if (rc.left >= es->ClientWidth - 1)
     {
-	dprintf_edit(stddeb,"EDIT_WriteTextLine: rc.left (%d) is greater than right edge\n",
-	       rc.left);
+	dprintf_edit(stddeb,"EDIT_WriteTextLine: rc.left (%ld) is greater than right edge\n",
+	       (LONG)rc.left);
 	return;
     }
     if (rc.right <= 0)
     {
-	dprintf_edit(stddeb,"EDIT_WriteTextLine: rc.right (%d) is less than left edge\n",
-	       rc.right);
+	dprintf_edit(stddeb,"EDIT_WriteTextLine: rc.right (%ld) is less than left edge\n",
+	       (LONG)rc.right);
 	return;
     }
     if (y - es->wtop < (rc.top / es->txtht) || 
@@ -626,7 +652,7 @@
 	off += rc.left;
 	lnlen = lnlen1 - off;
     }
-    len = min(lnlen, rc.right - rc.left);
+    len = MIN(lnlen, rc.right - rc.left);
 
     if (SelMarked(es))
     {
@@ -655,7 +681,7 @@
 	    col = EDIT_StrWidth(hwnd, lp, sbc, 0);
 	    if (col > (es->wleft + rc.left))
 	    {
-		len = min(col - off, rc.right - off);
+		len = MIN(col - off, rc.right - off);
 		EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, 
 			       rc.left, &rc, FALSE, FALSE);
 		off = col;
@@ -665,24 +691,24 @@
 		col = EDIT_StrWidth(hwnd, lp, sec, 0);
 		if (col < (es->wleft + rc.right))
 		{
-		    len = min(col - off, rc.right - off);
+		    len = MIN(col - off, rc.right - off);
 		    EDIT_WriteText(hwnd, lp, off, len, y - es->wtop,
 				   off - es->wleft, &rc, FALSE, TRUE);
 		    off = col;
-		    len = min(lnlen - off, rc.right - off);
+		    len = MIN(lnlen - off, rc.right - off);
 		    EDIT_WriteText(hwnd, lp, off, len, y - es->wtop,
 				   off - es->wleft, &rc, TRUE, FALSE);
 		}
 		else
 		{
-		    len = min(lnlen - off, rc.right - off);
+		    len = MIN(lnlen - off, rc.right - off);
 		    EDIT_WriteText(hwnd, lp, off, len, y - es->wtop,
 				   off - es->wleft, &rc, TRUE, TRUE);
 		}
 	    }
 	    else
 	    {
-		len = min(lnlen - off, rc.right - off);
+		len = MIN(lnlen - off, rc.right - off);
 		if (col < (es->wleft + rc.right))
 		    EDIT_WriteText(hwnd, lp, off, len, y - es->wtop,
 				   off - es->wleft, &rc, TRUE, TRUE);
@@ -693,11 +719,11 @@
 	    col = EDIT_StrWidth(hwnd, lp, sec, 0);
 	    if (col < (es->wleft + rc.right))
 	    {
-		len = min(col - off, rc.right - off);
+		len = MIN(col - off, rc.right - off);
 		EDIT_WriteText(hwnd, lp, off, len, y - es->wtop,
 			       off - es->wleft, &rc, FALSE, TRUE);
 		off = col;
-		len = min(lnlen - off, rc.right - off);
+		len = MIN(lnlen - off, rc.right - off);
 		EDIT_WriteText(hwnd, lp, off, len, y - es->wtop,
 			       off - es->wleft, &rc, TRUE, FALSE);
 	    }
@@ -719,7 +745,7 @@
 static int EDIT_ComputeVScrollPos(HWND hwnd)
 {
     int vscrollpos;
-    short minpos, maxpos;
+    INT minpos, maxpos;
     EDITSTATE *es = EDIT_GetEditState(hwnd);
 
     GetScrollRange(hwnd, SB_VERT, &minpos, &maxpos);
@@ -742,7 +768,7 @@
 static int EDIT_ComputeHScrollPos(HWND hwnd)
 {
     int hscrollpos;
-    short minpos, maxpos;
+    INT minpos, maxpos;
     EDITSTATE *es = EDIT_GetEditState(hwnd);
 
     GetScrollRange(hwnd, SB_HORZ, &minpos, &maxpos);
@@ -913,13 +939,13 @@
     char *cp = EDIT_TextLine(hwnd, es->CurrLine);
     int currpel;
 
-    es->CurrCol = min(len, es->CurrCol);
-    es->WndCol = min(EDIT_StrWidth(hwnd, cp, len, 0) - es->wleft, es->WndCol);
+    es->CurrCol = MIN(len, es->CurrCol);
+    es->WndCol = MIN(EDIT_StrWidth(hwnd, cp, len, 0) - es->wleft, es->WndCol);
     currpel = EDIT_StrWidth(hwnd, cp, es->CurrCol, 0);
 
     if (es->wleft > currpel)
     {
-	es->wleft = max(0, currpel - 20);
+	es->wleft = MAX(0, currpel - 20);
 	es->WndCol = currpel - es->wleft;
 	UpdateWindow(hwnd);
     }
@@ -1080,6 +1106,7 @@
     }
 }
 
+#ifdef SUPERFLUOUS_FUNCTIONS
 /*********************************************************************
  *  EDIT_KeyVScrollDoc
  *
@@ -1114,6 +1141,7 @@
 	SetScrollPos(hwnd, SB_VERT, vscrollpos, TRUE);
     }
 }
+#endif
 
 /*********************************************************************
  *  EDIT_DelKey
@@ -1287,9 +1315,11 @@
     char *text;
 
     dprintf_edit(stddeb,"EDIT_ClearText %d\n",blen);
+#ifndef WINELIB
     es->hText = EDIT_HeapReAlloc(hwnd, es->hText, blen);
     text = EDIT_HeapLock(hwnd, es->hText);
     memset(text, 0, blen);
+#endif
     es->textlen = 0;
     es->wlines = 0;
     es->CurrLine = es->CurrCol = 0;
@@ -1297,7 +1327,9 @@
     es->wleft = es->wtop = 0;
     es->textwidth = 0;
     es->TextChanged = FALSE;
+#ifndef WINELIB
     EDIT_ClearTextPointers(hwnd);
+#endif
 }
 
 /*********************************************************************
@@ -1421,6 +1453,7 @@
     }
 }
 
+#ifdef SUPERFLUOUS_FUNCTIONS
 /*********************************************************************
  *  EDIT_TextLineNumber
  *
@@ -1444,6 +1477,7 @@
     }
     return lineno - 1;
 }
+#endif
 
 /*********************************************************************
  *  EDIT_SetAnchor
@@ -1529,7 +1563,7 @@
 
     bbl = es->SelEndLine;
     bbc = es->SelEndCol;
-    y = max(y,0);
+    y = MAX(y,0);
     if (IsMultiLine(hwnd))
     {
         if ((line = es->wtop + y / es->txtht) >= es->wlines)
@@ -1549,7 +1583,7 @@
     es->CurrLine = es->wtop + es->WndRow;
     es->SelEndLine = es->CurrLine;
 
-    es->WndCol = es->wleft + max(x,0);
+    es->WndCol = es->wleft + MAX(x,0);
     if (es->WndCol > EDIT_StrWidth(hwnd, cp, len, 0))
 	es->WndCol = EDIT_StrWidth(hwnd, cp, len, 0);
     es->CurrCol = EDIT_PixelToChar(hwnd, es->CurrLine, &(es->WndCol));
@@ -1764,12 +1798,12 @@
     HideCaret(hwnd);
     if (IsMultiLine(hwnd) && es->wlines > 1)
     {
-	es->textwidth = max(es->textwidth,
+	es->textwidth = MAX(es->textwidth,
 		    EDIT_StrWidth(hwnd, EDIT_TextLine(hwnd, es->CurrLine),
 		    (int)(EDIT_TextLine(hwnd, es->CurrLine + 1) -
 			  EDIT_TextLine(hwnd, es->CurrLine)), 0));
     } else {
-      es->textwidth = max(es->textwidth,
+      es->textwidth = MAX(es->textwidth,
 			  EDIT_StrWidth(hwnd, text, strlen(text), 0));
     }
 
@@ -1887,15 +1921,15 @@
     dprintf_edit( stddeb, "EDIT_SetTabStops\n" );
     es->NumTabStops = wParam;
     if (wParam == 0)
-	es->TabStops = realloc(es->TabStops, 2);
+	es->TabStops = xrealloc(es->TabStops, 2);
     else if (wParam == 1)
     {
-	es->TabStops = realloc(es->TabStops, 2);
+	es->TabStops = xrealloc(es->TabStops, 2);
 	es->TabStops[0] = LOWORD(lParam);
     }
     else
     {
-	es->TabStops = realloc(es->TabStops, wParam * sizeof(*es->TabStops));
+	es->TabStops = xrealloc(es->TabStops, wParam * sizeof(*es->TabStops));
 	memcpy(es->TabStops, (unsigned short *)PTR_SEG_TO_LIN(lParam), wParam);
     }
     return 0;
@@ -1912,7 +1946,7 @@
 
     cp = EDIT_TextLine(hwnd, wParam);
     cp1 = EDIT_TextLine(hwnd, wParam + 1);
-    len = min((int)(cp1 - cp), (WORD)(*buffer));
+    len = MIN((int)(cp1 - cp), (WORD)(*buffer));
     dprintf_edit( stddeb, "EDIT_GetLineMsg: %d %d, len %d\n", (int)(WORD)(*buffer), (int)(WORD)(*(char *)buffer), len);
     strncpy(buffer, cp, len);
 
@@ -2181,8 +2215,8 @@
     hdc = BeginPaint(hwnd, &ps);
     rc = ps.rcPaint;
 
-    dprintf_edit(stddeb,"WM_PAINT: rc=(%d,%d), (%d,%d)\n", rc.left, rc.top, 
-	   rc.right, rc.bottom);
+    dprintf_edit(stddeb,"WM_PAINT: rc=(%ld,%ld), (%ld,%ld)\n", (LONG)rc.left, 
+           (LONG)rc.top, (LONG)rc.right, (LONG)rc.bottom);
 
     if (es->PaintBkgd)
 	FillWindow(GetParent(hwnd), hwnd, hdc, (HBRUSH)CTLCOLOR_EDIT);
@@ -2210,10 +2244,10 @@
     /* EDITSTATE structure itself can be stored on local heap  */
 
     /* allocate space for state variable structure */
-    es = malloc( sizeof(EDITSTATE) );
+    es = xmalloc( sizeof(EDITSTATE) );
     SetWindowLong( hwnd, 0, (LONG)es );
-    es->textptrs = malloc(sizeof(int));
-    es->CharWidths = malloc(256 * sizeof(short));
+    es->textptrs = xmalloc(sizeof(int));
+    es->CharWidths = xmalloc(256 * sizeof(INT));
     es->ClientWidth = es->ClientHeight = 1;
     /* --- text buffer */
     es->MaxTextLen = MAXTEXTLEN + 1;
@@ -2289,7 +2323,7 @@
     /* --- char width array                                        */
     /*     only initialise chars <= 32 as X returns strange widths */
     /*     for other chars                                         */
-    memset(es->CharWidths, 0, 256 * sizeof(short));
+    memset(es->CharWidths, 0, 256 * sizeof(INT));
     GetCharWidth(hdc, 32, 254, &es->CharWidths[32]);
 
     /* --- other structure variables */
@@ -2306,11 +2340,11 @@
     es->hDeletedText = 0;
     es->DeletedLength = 0;
     es->NumTabStops = 0;
-    es->TabStops = malloc( sizeof(short) );
+    es->TabStops = xmalloc( sizeof(short) );
 
     /* allocate space for a line full of blanks to speed up */
     /* line filling */
-    es->BlankLine = malloc( (es->ClientWidth / es->CharWidths[32]) + 2);
+    es->BlankLine = xmalloc( (es->ClientWidth / es->CharWidths[32]) + 2);
     memset(es->BlankLine, ' ', (es->ClientWidth / es->CharWidths[32]) + 2);
     es->BlankLine[(es->ClientWidth / es->CharWidths[32]) + 1] = 0;
 
diff --git a/controls/listbox.c b/controls/listbox.c
index 393f497..d06760d 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -24,6 +24,7 @@
 #include "dos_fs.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 #if 0
 #define LIST_HEAP_ALLOC(lphl,f,size) ((int)HEAP_Alloc(&lphl->Heap,f,size) & 0xffff)
@@ -56,13 +57,8 @@
 {
   LPHEADLIST lphl;
 
-  lphl = (LPHEADLIST)malloc(sizeof(HEADLIST));
+  lphl = (LPHEADLIST)xmalloc(sizeof(HEADLIST));
   SetWindowLong(hwnd, 0, (LONG)lphl);
-  if (lphl == NULL) {
-    fprintf(stderr,"malloc failed in CreateListBoxStruct()\n");
-    exit(1); /* Things won't get better */
-  }
-
   ListBoxInitialize(lphl);
   lphl->DrawCtlType    = CtlType;
   lphl->CtlID          = GetWindowWord(hwnd,GWW_ID);
@@ -1147,7 +1143,7 @@
 
       if (top > rect.bottom) {
 	if (lphl->dwStyle & LBS_MULTICOLUMN) {
-	  lphl->ItemsPerColumn = max(lphl->ItemsPerColumn, ipc);
+	  lphl->ItemsPerColumn = MAX(lphl->ItemsPerColumn, ipc);
 	  ipc = 0;
 	  top = 0;
 	  rect.left += lphl->ColumnsWidth;
@@ -1182,6 +1178,7 @@
 
     lpls = lpls->lpNext;
   }
+  ListBoxUpdateWindow(hwnd,lphl,FALSE);
   SelectObject(hdc,hOldFont);
   EndPaint( hwnd, &ps );
   return 0;
diff --git a/controls/menu.c b/controls/menu.c
index 90db99c..b14d1ab 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -135,7 +135,7 @@
  * Find a menu item. Return a pointer on the item, and modifies *hmenu
  * in case the item was in a sub-menu.
  */
-static MENUITEM *MENU_FindItem( HMENU *hmenu, WORD *nPos, WORD wFlags )
+static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags )
 {
     POPUPMENU *menu;
     MENUITEM *item;
@@ -178,7 +178,7 @@
  *
  * Find the item at the specified coordinates (screen coords).
  */
-static MENUITEM *MENU_FindItemByCoords( POPUPMENU *menu, int x, int y, WORD *pos )
+static MENUITEM *MENU_FindItemByCoords( POPUPMENU *menu, int x, int y, UINT *pos )
 {
     MENUITEM *item;
     WND *wndPtr;
@@ -207,7 +207,7 @@
  * Find the menu item selected by a key press.
  * Return item id, -1 if none, -2 if we should close the menu.
  */
-static WORD MENU_FindItemByKey( HWND hwndOwner, HMENU hmenu, WORD key )
+static UINT MENU_FindItemByKey( HWND hwndOwner, HMENU hmenu, UINT key )
 {
     POPUPMENU *menu;
     LPMENUITEM lpitem;
@@ -299,7 +299,7 @@
 
     dwSize = (lpitem->item_text == NULL) ? 0 : GetTextExtent( hdc, lpitem->item_text, strlen(lpitem->item_text));
     lpitem->rect.right  += LOWORD(dwSize);
-    lpitem->rect.bottom += max( HIWORD(dwSize), SYSMETRICS_CYMENU );
+    lpitem->rect.bottom += MAX( HIWORD(dwSize), SYSMETRICS_CYMENU );
 
     if (menuBar) lpitem->rect.right += MENU_BAR_ITEMS_SPACE;
     else if ((p = strchr( lpitem->item_text, '\t' )) != NULL)
@@ -351,23 +351,23 @@
 		(lpitem->item_flags & (MF_MENUBREAK | MF_MENUBARBREAK))) break;
 	    MENU_CalcItemSize( hdc, lpitem, hwndOwner, orgX, orgY, FALSE );
             if (lpitem->item_flags & MF_MENUBARBREAK) orgX++;
-	    maxX = max( maxX, lpitem->rect.right );
+	    maxX = MAX( maxX, lpitem->rect.right );
 	    orgY = lpitem->rect.bottom;
 	    if (lpitem->xTab)
 	    {
-		maxTab = max( maxTab, lpitem->xTab );
-		maxTabWidth = max(maxTabWidth,lpitem->rect.right-lpitem->xTab);
+		maxTab = MAX( maxTab, lpitem->xTab );
+		maxTabWidth = MAX(maxTabWidth,lpitem->rect.right-lpitem->xTab);
 	    }
 	}
 
 	  /* Finish the column (set all items to the largest width found) */
-	maxX = max( maxX, maxTab + maxTabWidth );
+	maxX = MAX( maxX, maxTab + maxTabWidth );
 	for (lpitem = &items[start]; start < i; start++, lpitem++)
 	{
 	    lpitem->rect.right = maxX;
 	    if (lpitem->xTab) lpitem->xTab = maxTab;
 	}
-	lppop->Height = max( lppop->Height, orgY );
+	lppop->Height = MAX( lppop->Height, orgY );
     }
 
     lppop->Width  = maxX;
@@ -388,8 +388,8 @@
 
     if ((lprect == NULL) || (lppop == NULL)) return;
     if (lppop->nItems == 0) return;
-	dprintf_menucalc(stddeb,"MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n", 
-		lprect->left, lprect->top, lprect->right, lprect->bottom);
+	dprintf_menucalc(stddeb,"MenuBarCalcSize left=%ld top=%ld right=%ld bottom=%ld !\n", 
+		(LONG)lprect->left, (LONG)lprect->top, (LONG)lprect->right, (LONG)lprect->bottom);
     items = (MENUITEM *)USER_HEAP_LIN_ADDR( lppop->hItems );
     lppop->Width  = lprect->right - lprect->left;
     lppop->Height = 0;
@@ -414,7 +414,7 @@
 		if (i != start) break;
 		else lpitem->rect.right = lprect->right;
 	    }
-	    maxY = max( maxY, lpitem->rect.bottom );
+	    maxY = MAX( maxY, lpitem->rect.bottom );
 	    orgX = lpitem->rect.right;
 	}
 
@@ -450,7 +450,7 @@
  * Draw a single menu item.
  */
 static void MENU_DrawMenuItem( HWND hwnd, HDC hdc, LPMENUITEM lpitem,
-			       WORD height, BOOL menuBar )
+			       UINT height, BOOL menuBar )
 {
     RECT rect;
 
@@ -626,7 +626,7 @@
  *
  * Paint a menu bar. Returns the height of the menu bar.
  */
-WORD MENU_DrawMenuBar(HDC hDC, LPRECT lprect, HWND hwnd, BOOL suppress_draw)
+UINT MENU_DrawMenuBar(HDC hDC, LPRECT lprect, HWND hwnd, BOOL suppress_draw)
 {
     LPPOPUPMENU lppop;
     LPMENUITEM lpitem;
@@ -661,7 +661,7 @@
  *
  * Display a popup menu.
  */
-static BOOL MENU_ShowPopup(HWND hwndOwner, HMENU hmenu, WORD id, int x, int y)
+static BOOL MENU_ShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, int x, int y)
 {
     POPUPMENU *menu;
 
@@ -703,7 +703,7 @@
 /***********************************************************************
  *           MENU_SelectItem
  */
-static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, WORD wIndex )
+static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex )
 {
     MENUITEM *items;
     LPPOPUPMENU lppop;
@@ -741,8 +741,9 @@
         {
 	    NC_DrawSysButton( lppop->hWnd, hdc, TRUE );
 #ifdef WINELIB32
+/* FIX: LostInfo */
             SendMessage( hwndOwner, WM_MENUSELECT,
-                         MAKEWPARAM( GetSystemMenu( lppop->hWnd, FALSE ),
+                         MAKEWPARAM( (DWORD)GetSystemMenu( lppop->hWnd, FALSE ),
 				     lppop->wFlags | MF_MOUSESELECT ),
 			 (LPARAM)hmenu );
 #else
@@ -770,8 +771,9 @@
 	}
     }
 #ifdef WINELIB32
+/* FIX: Lost Info */
     else SendMessage( hwndOwner, WM_MENUSELECT, 
-		      MAKEWPARAM( hmenu, lppop->wFlags | MF_MOUSESELECT),
+		      MAKEWPARAM( (DWORD)hmenu, lppop->wFlags | MF_MOUSESELECT),
 		      (LPARAM)hmenu );
 #else
     else SendMessage( hwndOwner, WM_MENUSELECT, hmenu,
@@ -1044,7 +1046,7 @@
 {
     POPUPMENU *menu;
     MENUITEM *item;
-    WORD id;
+    UINT id;
 
     if (!hmenu) return FALSE;  /* Outside all menus */
     menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
@@ -1095,7 +1097,7 @@
     POPUPMENU *menu;
     MENUITEM *item;
     HMENU hsubmenu = 0;
-    WORD id;
+    UINT id;
 
     if (!hmenu) return FALSE;  /* Outside all menus */
     menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
@@ -1136,7 +1138,7 @@
 {
     MENUITEM *item;
     POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
-    WORD id = NO_SELECTED_ITEM;
+    UINT id = NO_SELECTED_ITEM;
 
     if (hmenu)
     {
@@ -1253,7 +1255,7 @@
  * If 'x' and 'y' are not 0, we simulate a button-down event at (x,y)
  * before beginning tracking. This is to help menu-bar tracking.
  */
-static BOOL MENU_TrackMenu( HMENU hmenu, WORD wFlags, int x, int y,
+static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
 			    HWND hwnd, LPRECT lprect )
 {
     MSG *msg;
@@ -1261,7 +1263,7 @@
     POPUPMENU *menu;
     HMENU hmenuCurrent = hmenu;
     BOOL fClosed = FALSE, fRemove;
-    WORD pos;
+    UINT pos;
 
     fEndMenuCalled = FALSE;
     if (!(menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu ))) return FALSE;
@@ -1275,7 +1277,7 @@
     msg = (MSG *)USER_HEAP_LIN_ADDR( hMsg );
     while (!fClosed)
     {
-	if (!MSG_InternalGetMessage( USER_HEAP_SEG_ADDR(hMsg), 0,
+	if (!MSG_InternalGetMessage( (SEGPTR)USER_HEAP_SEG_ADDR(hMsg), 0,
                                      hwnd, MSGF_MENU, 0, TRUE ))
 	    break;
 
@@ -1390,8 +1392,8 @@
 		      /* We will find a better way real soon... */
 		    if ((msg->wParam <= 32) || (msg->wParam >= 127)) break;
 		    pos = MENU_FindItemByKey( hwnd, hmenuCurrent, msg->wParam );
-		    if (pos == (WORD)-2) fClosed = TRUE;
-		    else if (pos == (WORD)-1) MessageBeep(0);
+		    if (pos == (UINT)-2) fClosed = TRUE;
+		    else if (pos == (UINT)-1) MessageBeep(0);
 		    else
 		    {
 			MENU_SelectItem( hwnd, hmenuCurrent, pos );
@@ -1445,7 +1447,7 @@
  *
  * Menu-bar tracking upon a keyboard event. Called from NC_HandleSysCommand().
  */
-void MENU_TrackKbdMenuBar( HWND hwnd, WORD wParam )
+void MENU_TrackKbdMenuBar( HWND hwnd, UINT wParam )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr->wIDmenu) return;
@@ -1463,7 +1465,7 @@
 /**********************************************************************
  *           TrackPopupMenu   (USER.416)
  */
-BOOL TrackPopupMenu( HMENU hMenu, WORD wFlags, short x, short y,
+BOOL TrackPopupMenu( HMENU hMenu, UINT wFlags, short x, short y,
 		     short nReserved, HWND hWnd, LPRECT lpRect )
 {
     if (!MENU_ShowPopup( hWnd, hMenu, 0, x, y )) return FALSE;
@@ -1483,7 +1485,7 @@
 	    CREATESTRUCT *createStruct = (CREATESTRUCT*)PTR_SEG_TO_LIN(lParam);
 #ifdef WINELIB32
 	    HMENU hmenu = (HMENU) (createStruct->lpCreateParams);
-	    SetWindowLong( hwnd, 0, hmenu );
+	    SetWindowLong( hwnd, 0, (LONG)hmenu );
 #else
 	    HMENU hmenu = (HMENU) ((int)createStruct->lpCreateParams & 0xffff);
 	    SetWindowWord( hwnd, 0, hmenu );
@@ -1521,7 +1523,7 @@
  *
  * Compute the size of the menu bar height. Used by NC_HandleNCCalcSize().
  */
-WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth, int orgX, int orgY )
+UINT MENU_GetMenuBarHeight( HWND hwnd, UINT menubarWidth, int orgX, int orgY )
 {
     HDC hdc;
     RECT rectBar;
@@ -1529,7 +1531,8 @@
     LPPOPUPMENU lppop;
 
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
-    if (!(lppop = (LPPOPUPMENU)USER_HEAP_LIN_ADDR(wndPtr->wIDmenu))) return 0;
+    if (!(lppop = (LPPOPUPMENU)USER_HEAP_LIN_ADDR((HMENU)wndPtr->wIDmenu)))
+      return 0;
     hdc = GetDC( hwnd );
     SetRect( &rectBar, orgX, orgY, orgX+menubarWidth, orgY+SYSMETRICS_CYMENU );
     MENU_MenuBarCalcSize( hdc, &rectBar, lppop, hwnd );
@@ -1541,8 +1544,8 @@
 /**********************************************************************
  *			ChangeMenu		[USER.153]
  */
-BOOL ChangeMenu(HMENU hMenu, WORD nPos, LPSTR lpNewItem, 
-			WORD wItemID, WORD wFlags)
+BOOL ChangeMenu(HMENU hMenu, UINT nPos, LPSTR lpNewItem, 
+			UINT wItemID, UINT wFlags)
 {
   dprintf_menu(stddeb,"ChangeMenu: menu="NPFMT" pos=%d ptr=%p item=%04x flags=%04x\n",
 	       hMenu, nPos, lpNewItem, wItemID, wFlags);
@@ -1568,7 +1571,7 @@
 /**********************************************************************
  *			CheckMenuItem		[USER.154]
  */
-BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
+BOOL CheckMenuItem(HMENU hMenu, UINT wItemID, UINT wFlags)
 {
 	LPMENUITEM 	lpitem;
 	dprintf_menu(stddeb,"CheckMenuItem ("NPFMT", %04X, %04X) !\n", 
@@ -1583,7 +1586,7 @@
 /**********************************************************************
  *			EnableMenuItem		[USER.155]
  */
-BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
+BOOL EnableMenuItem(HMENU hMenu, UINT wItemID, UINT wFlags)
 {
     LPMENUITEM 	lpitem;
     dprintf_menu(stddeb,"EnableMenuItem ("NPFMT", %04X, %04X) !\n", 
@@ -1610,8 +1613,8 @@
 /*******************************************************************
  *         GetMenuString    (USER.161)
  */
-int GetMenuString( HMENU hMenu, WORD wItemID,
-                   LPSTR str, short nMaxSiz, WORD wFlags )
+int GetMenuString( HMENU hMenu, UINT wItemID,
+                   LPSTR str, short nMaxSiz, UINT wFlags )
 {
     LPMENUITEM lpitem;
 
@@ -1621,7 +1624,7 @@
     str[0] = '\0';
     if (!(lpitem = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return 0;
     if (!lpitem->item_text || !IS_STRING_ITEM(lpitem->item_flags)) return 0;
-    nMaxSiz = min( nMaxSiz-1, strlen(lpitem->item_text) );
+    nMaxSiz = MIN( nMaxSiz-1, strlen(lpitem->item_text) );
     strncpy( str, lpitem->item_text, nMaxSiz );
     str[nMaxSiz] = '\0';
     dprintf_menu( stddeb, "GetMenuString: returning '%s'\n", str );
@@ -1632,7 +1635,7 @@
 /**********************************************************************
  *			HiliteMenuItem		[USER.162]
  */
-BOOL HiliteMenuItem(HWND hWnd, HMENU hMenu, WORD wItemID, WORD wHilite)
+BOOL HiliteMenuItem(HWND hWnd, HMENU hMenu, UINT wItemID, UINT wHilite)
 {
     LPPOPUPMENU menu;
     LPMENUITEM  lpitem;
@@ -1650,7 +1653,7 @@
 /**********************************************************************
  *			GetMenuState		[USER.250]
  */
-WORD GetMenuState(HMENU hMenu, WORD wItemID, WORD wFlags)
+UINT GetMenuState(HMENU hMenu, UINT wItemID, UINT wFlags)
 {
     LPMENUITEM lpitem;
     dprintf_menu(stddeb,"GetMenuState("NPFMT", %04X, %04X);\n", 
@@ -1658,7 +1661,7 @@
     if (!(lpitem = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return -1;
     if (lpitem->item_flags & MF_POPUP)
     {
-	POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( lpitem->item_id );
+	POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( (HMENU)lpitem->item_id );
 	if (!menu) return -1;
 	else return (menu->nItems << 8) | (menu->wFlags & 0xff);
     }
@@ -1674,7 +1677,7 @@
 	LPPOPUPMENU	menu;
 	dprintf_menu(stddeb,"GetMenuItemCount("NPFMT");\n", hMenu);
 	menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
-	if (menu == NULL) return (WORD)-1;
+	if (menu == NULL) return (UINT)-1;
 	dprintf_menu(stddeb,"GetMenuItemCount("NPFMT") return %d \n", 
 		     hMenu, menu->nItems);
 	return menu->nItems;
@@ -1684,7 +1687,7 @@
 /**********************************************************************
  *			GetMenuItemID			[USER.264]
  */
-WORD GetMenuItemID(HMENU hMenu, int nPos)
+UINT GetMenuItemID(HMENU hMenu, int nPos)
 {
     LPPOPUPMENU	menu;
     MENUITEM *item;
@@ -1701,7 +1704,7 @@
 /**********************************************************************
  *			InsertMenu		[USER.410]
  */
-BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
+BOOL InsertMenu(HMENU hMenu, UINT nPos, UINT wFlags, UINT wItemID, LPSTR lpNewItem)
 {
     HANDLE hNewItems;
     MENUITEM *lpitem, *newItems;
@@ -1721,7 +1724,7 @@
       /* Find where to insert new item */
 
     if ((wFlags & MF_BYPOSITION) && 
-        ((nPos == (WORD)-1) || (nPos == GetMenuItemCount(hMenu))))
+        ((nPos == (UINT)-1) || (nPos == GetMenuItemCount(hMenu))))
     {
           /* Special case: append to menu 
              Some programs specify the menu length to do that */
@@ -1786,11 +1789,15 @@
 	lpitem->item_text = (char *)USER_HEAP_LIN_ADDR( lpitem->hText );
 	strcpy( lpitem->item_text, lpNewItem );
     }
+#ifdef WINELIB32
+    else if (wFlags & MF_BITMAP) lpitem->hText = (HANDLE)lpNewItem;
+#else
     else if (wFlags & MF_BITMAP) lpitem->hText = LOWORD((DWORD)lpNewItem);
+#endif
     else lpitem->item_text = lpNewItem;
 
     if (wFlags & MF_POPUP)  /* Set the MF_POPUP flag on the popup-menu */
-	((POPUPMENU *)USER_HEAP_LIN_ADDR(wItemID))->wFlags |= MF_POPUP;
+	((POPUPMENU *)USER_HEAP_LIN_ADDR((HMENU)wItemID))->wFlags |= MF_POPUP;
 
     SetRectEmpty( &lpitem->rect );
     lpitem->hCheckBit   = hStdCheck;
@@ -1802,7 +1809,7 @@
 /**********************************************************************
  *			AppendMenu		[USER.411]
  */
-BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
+BOOL AppendMenu(HMENU hMenu, UINT wFlags, UINT wItemID, LPSTR lpNewItem)
 {
     return InsertMenu( hMenu, -1, wFlags | MF_BYPOSITION, wItemID, lpNewItem );
 }
@@ -1811,7 +1818,7 @@
 /**********************************************************************
  *			RemoveMenu		[USER.412]
  */
-BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags)
+BOOL RemoveMenu(HMENU hMenu, UINT nPos, UINT wFlags)
 {
     LPPOPUPMENU	menu;
     LPMENUITEM 	lpitem;
@@ -1846,7 +1853,7 @@
 /**********************************************************************
  *			DeleteMenu		[USER.413]
  */
-BOOL DeleteMenu(HMENU hMenu, WORD nPos, WORD wFlags)
+BOOL DeleteMenu(HMENU hMenu, UINT nPos, UINT wFlags)
 {
     MENUITEM *item = MENU_FindItem( &hMenu, &nPos, wFlags );
     if (!item) return FALSE;
@@ -1860,7 +1867,7 @@
 /**********************************************************************
  *			ModifyMenu		[USER.414]
  */
-BOOL ModifyMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
+BOOL ModifyMenu(HMENU hMenu, UINT nPos, UINT wFlags, UINT wItemID, LPSTR lpNewItem)
 {
     LPMENUITEM 	lpitem;
     if (IS_STRING_ITEM(wFlags))
@@ -1884,7 +1891,11 @@
 	lpitem->item_text = (char *)USER_HEAP_LIN_ADDR( lpitem->hText );
 	strcpy( lpitem->item_text, lpNewItem );
     }
+#ifdef WINELIB32
+    else if (wFlags & MF_BITMAP) lpitem->hText = (HANDLE)lpNewItem;
+#else
     else if (wFlags & MF_BITMAP) lpitem->hText = LOWORD((DWORD)lpNewItem);
+#endif
     else lpitem->item_text = lpNewItem;
     SetRectEmpty( &lpitem->rect );
     return TRUE;
@@ -1918,7 +1929,7 @@
 /**********************************************************************
  *			SetMenuItemBitmaps	[USER.418]
  */
-BOOL SetMenuItemBitmaps(HMENU hMenu, WORD nPos, WORD wFlags,
+BOOL SetMenuItemBitmaps(HMENU hMenu, UINT nPos, UINT wFlags,
 		HBITMAP hNewCheck, HBITMAP hNewUnCheck)
 {
     LPMENUITEM lpitem;
@@ -1990,7 +2001,7 @@
         for (i = lppop->nItems; i > 0; i--, item++)
         {
             if (item->item_flags & MF_POPUP)
-                DestroyMenu( item->item_id );
+                DestroyMenu( (HMENU)item->item_id );
         }
         USER_HEAP_FREE( lppop->hItems );
     }
@@ -2032,7 +2043,7 @@
 { 
 	WND * wndPtr = WIN_FindWndPtr(hWnd);
 	if (wndPtr == NULL) return 0;
-	return wndPtr->wIDmenu;
+	return (HMENU)wndPtr->wIDmenu;
 }
 
 
@@ -2050,7 +2061,7 @@
 		}
 	dprintf_menu(stddeb,"SetMenu("NPFMT", "NPFMT");\n", hWnd, hMenu);
 	if (GetCapture() == hWnd) ReleaseCapture();
-	wndPtr->wIDmenu = hMenu;
+	wndPtr->wIDmenu = (UINT)hMenu;
 	if (hMenu != 0)
 	{
 	    lpmenu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
@@ -2079,7 +2090,7 @@
     LPMENUITEM 	lpitem;
     dprintf_menu(stddeb,"GetSubMenu ("NPFMT", %04X) !\n", hMenu, nPos);
     if (!(lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return 0;
-    if ((WORD)nPos >= lppop->nItems) return 0;
+    if ((UINT)nPos >= lppop->nItems) return 0;
     lpitem = (MENUITEM *) USER_HEAP_LIN_ADDR( lppop->hItems );
     if (!(lpitem[nPos].item_flags & MF_POPUP)) return 0;
     return lpitem[nPos].item_id;
@@ -2099,7 +2110,7 @@
 		wndPtr->wIDmenu != 0) {
 		dprintf_menu(stddeb,"DrawMenuBar wIDmenu=%04X \n", 
 			     wndPtr->wIDmenu);
-		lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(wndPtr->wIDmenu);
+		lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR((HMENU)wndPtr->wIDmenu);
 		if (lppop == NULL) return;
 
 		lppop->Height = 0; /* Make sure we call MENU_MenuBarCalcSize */
@@ -2217,7 +2228,7 @@
 	    hSubMenu = CreatePopupMenu();
 	    next_item = ParseMenuResource(next_item, level, hSubMenu);
 	    AppendMenu(hMenu, popup_item->item_flags, 
-	    	hSubMenu, popup_item->item_text);
+	    	(UINT)hSubMenu, popup_item->item_text);
 	    }
 	else {
 		MENUITEMTEMPLATE *normal_item = (MENUITEMTEMPLATE *) item;
diff --git a/controls/scroll.c b/controls/scroll.c
index 507c897..3d7a67e 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -209,7 +209,7 @@
 {
     int pixels = vertical ? rect->bottom-rect->top : rect->right-rect->left;
     if ((pixels -= 3*SYSMETRICS_CXVSCROLL+1) <= 0) return infoPtr->MinVal;
-    pos = max( 0, pos - SYSMETRICS_CXVSCROLL );
+    pos = MAX( 0, pos - SYSMETRICS_CXVSCROLL );
     if (pos > pixels) pos = pixels;
     dprintf_scroll(stddeb,"GetThumbVal: pos=%d ret=%d\n", pos,
                    (infoPtr->MinVal
@@ -592,8 +592,8 @@
           return;  /* Should never happen */
     }
 
-    dprintf_scroll( stddeb, "ScrollBar Event: hwnd="NPFMT" bar=%d msg=%x pt=%d,%d hit=%d\n",
-                    hwnd, nBar, msg, pt.x, pt.y, hittest );
+    dprintf_scroll( stddeb, "ScrollBar Event: hwnd="NPFMT" bar=%d msg=%x pt=%ld,%ld hit=%d\n",
+                    hwnd, nBar, msg, (LONG)pt.x, (LONG)pt.y, hittest );
 
     switch(trackHitTest)
     {
@@ -757,7 +757,11 @@
  *           ScrollBarWndProc
  */
 LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
-{    
+{
+    POINT Pt;
+    Pt.x = LOWORD(lParam); Pt.y = HIWORD(lParam);
+    /* ^ Can't use MAKEPOINT macro in WINELIB32 */
+
     switch(message)
     {
     case WM_CREATE:
@@ -800,7 +804,7 @@
     case WM_LBUTTONUP:
     case WM_MOUSEMOVE:
     case WM_SYSTIMER:
-        SCROLL_HandleScrollEvent( hwnd, SB_CTL, message, MAKEPOINT(lParam) );
+        SCROLL_HandleScrollEvent( hwnd, SB_CTL, message, Pt );
         break;
 
     case WM_KEYDOWN:
diff --git a/controls/static.c b/controls/static.c
index b88dd2f..ce81252 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -55,7 +55,8 @@
     STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
 
     if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return;
-    if (infoPtr->hIcon) DestroyIcon( infoPtr->hIcon );
+/*  FIXME: is this OK?
+    if (infoPtr->hIcon) DestroyIcon( infoPtr->hIcon ); */
     infoPtr->hIcon = hicon;
     if (hicon)
     {
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 7eb5a58..cd3b9cf 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -1,9 +1,9 @@
-
 %{
 /*
  * Parser for command lines in the Wine debugger
  *
  * Copyright 1993 Eric Youngdale
+ * Copyright 1995 Morten Welinder
  */
 
 #include <stdio.h>
@@ -33,7 +33,7 @@
     int              integer;
 }
 
-%token CONT STEP NEXT QUIT HELP BACKTRACE INFO STACK SEGMENTS REGS
+%token CONT STEP LIST NEXT QUIT HELP BACKTRACE INFO STACK SEGMENTS REGS
 %token ENABLE DISABLE BREAK DELETE SET MODE PRINT EXAM DEFINE ABORT
 %token NO_SYMBOL
 %token SYMBOLFILE
@@ -42,82 +42,144 @@
 %token <integer> NUM FORMAT
 %token <reg> REG
 
+/* %left ',' */
+/* %left '=' OP_OR_EQUAL OP_XOR_EQUAL OP_AND_EQUAL OP_SHL_EQUAL \
+         OP_SHR_EQUAL OP_PLUS_EQUAL OP_MINUS_EQUAL \
+         OP_TIMES_EQUAL OP_DIVIDE_EQUAL OP_MODULO_EQUAL */
+/* %left OP_COND */ /* ... ? ... : ... */
+%left OP_LOR
+%left OP_LAND
+%left '|'
+%left '^'
+%left '&'
+%left OP_EQ OP_NE
+%left '<' '>' OP_LE OP_GE
+%left OP_SHL OP_SHR
+%left '+' '-'
+%left '*' '/' '%'
+%left OP_SIGN '!' '~' OP_DEREF /* OP_INC OP_DEC OP_ADDR */
+%nonassoc ':'
+
 %type <integer> expr
-%type <address> addr symbol
+%type <address> addr segaddr symbol
 
 %%
 
- input:  /* empty */
-	| input line  { issue_prompt(); }
+ input:   line			{ issue_prompt(); }
+	| input line		{ issue_prompt(); }
 
- line:		'\n'
-	| error '\n'       { yyerrok; }
-	| QUIT  '\n'       { exit(0); }
-	| HELP  '\n'       { DEBUG_Help(); }
-	| CONT '\n'        { dbg_exec_mode = EXEC_CONT; return 0; }
-	| STEP '\n'        { dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
-	| NEXT '\n'        { dbg_exec_mode = EXEC_STEP_OVER; return 0; }
-	| ABORT '\n'       { kill(getpid(), SIGABRT); }
- 	| SYMBOLFILE IDENTIFIER '\n'  { DEBUG_ReadSymbolTable( $2 ); }
-	| DEFINE IDENTIFIER addr '\n' { DEBUG_AddSymbol( $2, &$3 ); }
-	| MODE NUM '\n'         { mode_command($2); }
-	| ENABLE NUM '\n'       { DEBUG_EnableBreakpoint( $2, TRUE ); }
-	| DISABLE NUM '\n'      { DEBUG_EnableBreakpoint( $2, FALSE ); }
-	| BREAK '*' addr '\n'   { DEBUG_AddBreakpoint( &$3 ); }
-        | BREAK symbol '\n'     { DEBUG_AddBreakpoint( &$2 ); }
-        | BREAK '\n'            { DBG_ADDR addr = { CS_reg(DEBUG_context),
-                                                    EIP_reg(DEBUG_context) };
-                                  DEBUG_AddBreakpoint( &addr );
-                                }
-        | DELETE BREAK NUM '\n' { DEBUG_DelBreakpoint( $3 ); }
-	| BACKTRACE '\n'        { DEBUG_BackTrace(); }
+ line:  command '\n'
+	| '\n'
+	| error	'\n'	       { yyerrok; }
+
+ command: QUIT	               { exit(0); }
+	| HELP	               { DEBUG_Help(); }
+	| CONT	               { dbg_exec_mode = EXEC_CONT; return 0; }
+	| STEP	               { dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
+	| NEXT	               { dbg_exec_mode = EXEC_STEP_OVER; return 0; }
+	| LIST		       { DEBUG_List( NULL, 15 ); }
+	| LIST addr	       { DEBUG_List( &$2, 15 ); }
+	| ABORT	               { kill(getpid(), SIGABRT); }
+	| SYMBOLFILE IDENTIFIER { DEBUG_ReadSymbolTable( $2 ); }
+	| DEFINE IDENTIFIER addr { DEBUG_AddSymbol( $2, &$3 ); }
+	| MODE NUM	       { mode_command($2); }
+	| ENABLE NUM	       { DEBUG_EnableBreakpoint( $2, TRUE ); }
+	| DISABLE NUM	       { DEBUG_EnableBreakpoint( $2, FALSE ); }
+	| BREAK '*' addr       { DEBUG_AddBreakpoint( &$3 ); }
+	| BREAK symbol	       { DEBUG_AddBreakpoint( &$2 ); }
+	| BREAK		       { DBG_ADDR addr = { CS_reg(DEBUG_context),
+						     EIP_reg(DEBUG_context) };
+				 DEBUG_AddBreakpoint( &addr );
+			       }
+	| DELETE BREAK NUM     { DEBUG_DelBreakpoint( $3 ); }
+	| BACKTRACE	       { DEBUG_BackTrace(); }
 	| infocmd
 	| x_command
 	| print_command
 	| deposit_command
 
 deposit_command:
-	SET REG '=' expr '\n'          { DEBUG_SetRegister( $2, $4 ); }
-	| SET '*' addr '=' expr '\n'   { DEBUG_WriteMemory( &$3, $5 ); }
-	| SET IDENTIFIER '=' addr '\n' { if (!DEBUG_SetSymbolValue( $2, &$4 ))
-                                         {
-                                           fprintf( stderr, "Symbol %s not found\n", $2 );
-                                           YYERROR;
-                                         }
-                                       }
+	SET REG '=' expr	   { DEBUG_SetRegister( $2, $4 ); }
+	| SET '*' addr '=' expr	   { DEBUG_WriteMemory( &$3, $5 ); }
+	| SET IDENTIFIER '=' addr  { if (!DEBUG_SetSymbolValue( $2, &$4 ))
+				       {
+					 fprintf( stderr,
+						 "Symbol %s not found\n", $2 );
+					 YYERROR;
+				       }
+				   }
 
 
 x_command:
-	  EXAM addr '\n' { DEBUG_ExamineMemory( &$2, 1, 'x'); }
-	| EXAM FORMAT addr '\n' { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff ); }
+	  EXAM addr  { DEBUG_ExamineMemory( &$2, 1, 'x'); }
+	| EXAM FORMAT addr  { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff ); }
 
  print_command:
-	  PRINT addr '\n'        { DEBUG_Print( &$2, 1, 'x' ); }
-	| PRINT FORMAT addr '\n' { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff ); }
+	  PRINT addr	     { DEBUG_Print( &$2, 1, 'x' ); }
+	| PRINT FORMAT addr  { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff ); }
 
  symbol: IDENTIFIER   { if (!DEBUG_GetSymbolValue( $1, &$$ ))
-                        {
-                           fprintf( stderr, "Symbol %s not found\n", $1 );
-                           YYERROR;
-                        }
-                      } 
+			{
+			   fprintf( stderr, "Symbol %s not found\n", $1 );
+			   YYERROR;
+			}
+		      } 
 
- addr: expr                     { $$.seg = 0xffffffff; $$.off = $1; }
-       | expr ':' expr          { $$.seg = $1; $$.off = $3; }
-       | symbol   		{ $$ = $1; }
+ addr: expr				{ $$.seg = 0xffffffff; $$.off = $1; }
+       | segaddr			{ $$ = $1; }
 
- expr:  NUM			{ $$ = $1;	}
-	| REG			{ $$ = DEBUG_GetRegister($1); }
-	| expr '+' NUM		{ $$ = $1 + $3; }
-	| expr '-' NUM		{ $$ = $1 - $3; }
-	| '(' expr ')'		{ $$ = $2; }
-	| '*' addr		{ $$ = DEBUG_ReadMemory( &$2 ); }
+ segaddr: expr ':' expr			{ $$.seg = $1; $$.off = $3; }
+       | symbol				{ $$ = $1; }
+
+ expr:	NUM				{ $$ = $1;	}
+	| REG				{ $$ = DEBUG_GetRegister($1); }
+	| expr OP_LOR expr		{ $$ = $1 || $3; }
+	| expr OP_LAND expr		{ $$ = $1 && $3; }
+	| expr '|' expr			{ $$ = $1 | $3; }
+	| expr '&' expr			{ $$ = $1 & $3; }
+	| expr '^' expr			{ $$ = $1 ^ $3; }
+	| expr OP_EQ expr		{ $$ = $1 == $3; }
+	| expr '>' expr			{ $$ = $1 > $3; }
+	| expr '<' expr			{ $$ = $1 < $3; }
+	| expr OP_GE expr		{ $$ = $1 >= $3; }
+	| expr OP_LE expr		{ $$ = $1 <= $3; }
+	| expr OP_NE expr		{ $$ = $1 != $3; }
+	| expr OP_SHL expr		{ $$ = (unsigned)$1 << $3; }
+	| expr OP_SHR expr		{ $$ = (unsigned)$1 >> $3; }
+	| expr '+' expr			{ $$ = $1 + $3; }
+	| expr '-' expr			{ $$ = $1 - $3; }
+	| expr '*' expr			{ $$ = $1 * $3; }
+	| expr '/' expr
+	  { if ($3) 
+	      if ($3 == -1 && $1 == 0x80000000l)
+		yyerror ("Division overflow");
+	      else
+		$$ = $1 / $3;
+	    else
+	      yyerror ("Division by zero"); }
+	| expr '%' expr
+	  { if ($3) 
+	      if ($3 == -1 && $1 == 0x80000000l)
+		$$ = 0; /* A sensible result in this case.  */
+	      else
+		$$ = $1 % $3;
+	    else
+	      yyerror ("Division by zero"); }
+	| '-' expr %prec OP_SIGN	{ $$ = -$2; }
+	| '+' expr %prec OP_SIGN	{ $$ = $2; }
+	| '!' expr			{ $$ = !$2; }
+	| '~' expr			{ $$ = ~$2; }
+	| '(' expr ')'			{ $$ = $2; }
+/* For parser technical reasons we can't use "addr" here.  */
+	| '*' expr %prec OP_DEREF	{ DBG_ADDR addr = { 0xffffffff, $2 };
+					  $$ = DEBUG_ReadMemory( &addr ); }
+	| '*' segaddr %prec OP_DEREF	{ $$ = DEBUG_ReadMemory( &$2 ); }
 	
- infocmd: INFO REGS '\n'          { DEBUG_InfoRegisters(); }
-	| INFO STACK '\n'         { DEBUG_InfoStack(); }
-	| INFO BREAK '\n'         { DEBUG_InfoBreakpoints(); }
-	| INFO SEGMENTS '\n'      { LDT_Print( 0, -1 ); }
-        | INFO SEGMENTS expr '\n' { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
+ infocmd: INFO REGS	      { DEBUG_InfoRegisters(); }
+	| INFO STACK	      { DEBUG_InfoStack(); }
+	| INFO BREAK	      { DEBUG_InfoBreakpoints(); }
+	| INFO SEGMENTS	      { LDT_Print( 0, -1 ); }
+	| INFO SEGMENTS expr  { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
 
 
 %%
diff --git a/debugger/debug.l b/debugger/debug.l
index ef142ed..c46eb10 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -34,9 +34,17 @@
 
 %%
 
-\n		{ syntax_error = 0; return '\n'; } /*Indicate end of command*/
+\n		{ syntax_error = 0; return '\n'; } /*Indicates end of command*/
 
-[-+=()*:]       { return *yytext; }
+"||"		{ return OP_LOR; }
+"&&"		{ return OP_LAND; }
+"=="		{ return OP_EQ; }
+"!="		{ return OP_NE; }
+"<="		{ return OP_LE; }
+">="		{ return OP_GE; }
+"<<"		{ return OP_SHL; }
+">>"		{ return OP_SHR; }
+[-+<=>|&^()*/%:!~]	{ return *yytext; }
 
 "0x"{HEXDIGIT}+      { sscanf(yytext, "%x", &yylval.integer); return NUM; }
 {DIGIT}+             { sscanf(yytext, "%d", &yylval.integer); return NUM; }
@@ -72,25 +80,26 @@
 $cs     { yylval.reg = REG_CS;  return REG; }
 $ss     { yylval.reg = REG_SS;  return REG; }
 
-info|inf|in		      { return INFO; }
-segments|segment|segm|seg|se  { return SEGMENTS; }
-break|brea|bre|br|b           { return BREAK; }
-enable|enabl|enab|ena         { return ENABLE;}
-disable|disabl|disab|disa|dis { return DISABLE; }
-delete|delet|dele|del         { return DELETE; }
-quit|qui|qu|q                 { return QUIT; }
-x                             { return EXAM; }
+info|inf|in			{ return INFO; }
+show|sho|sh			{ return INFO; }
+list|l				{ return LIST; }
+segments|segment|segm|seg|se	{ return SEGMENTS; }
+break|brea|bre|br|b		{ return BREAK; }
+enable|enabl|enab|ena		{ return ENABLE;}
+disable|disabl|disab|disa|dis	{ return DISABLE; }
+delete|delet|dele|del		{ return DELETE; }
+quit|qui|qu|q			{ return QUIT; }
+x				{ return EXAM; }
 
-help|hel|he	{ return HELP; }
-"?"		{ return HELP; }
+help|hel|he|"?"			{ return HELP; }
 
-set|se		{ return SET; }
+set|se				{ return SET; }
 
-bt		{ return BACKTRACE; }
+bt				{ return BACKTRACE; }
 
-cont|con|co|c   { return CONT; }
-step|ste|st|s   { return STEP; }
-next|nex|ne|n   { return NEXT; }
+cont|con|co|c   		{ return CONT; }
+step|ste|st|s   		{ return STEP; }
+next|nex|ne|n   		{ return NEXT; }
 
 symbolfile|symbolfil|symbolfi|symbolf|symbol|symbo|symb { return SYMBOLFILE; }
 
@@ -100,9 +109,9 @@
 
 mode				{ return MODE; }
 
-registers|regs|reg|re	{ return REGS; }
+registers|regs|reg|re		{ return REGS; }
 
-stack|stac|sta|st     	{ return STACK; }
+stack|stac|sta|st     		{ return STACK; }
 
 {IDENTIFIER}	{ yylval.string = make_symbol(yytext); return IDENTIFIER; }
 
diff --git a/debugger/hash.c b/debugger/hash.c
index f6569c8..8a325c7 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -14,6 +14,7 @@
 #include "selectors.h"
 #include "debugger.h"
 #include "toolhelp.h"
+#include "xmalloc.h"
 
 struct name_hash
 {
@@ -48,7 +49,7 @@
     struct name_hash  * new;
     int hash;
 
-    new = (struct name_hash *) malloc(sizeof(struct name_hash));
+    new = (struct name_hash *) xmalloc(sizeof(struct name_hash));
     new->addr = *addr;
     new->name = strdup(name);
     new->next = NULL;
diff --git a/debugger/info.c b/debugger/info.c
index 4914a15..54d5140 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -125,3 +125,27 @@
 
     while(helptext[i]) fprintf(stderr,"%s\n", helptext[i++]);
 }
+
+
+
+/***********************************************************************
+ *           DEBUG_List
+ *
+ * Implementation of the 'list' command.
+ */
+void DEBUG_List( DBG_ADDR *addr, int count )
+{
+    static DBG_ADDR lasttime = { 0xffffffff, 0 };
+
+    if (addr == NULL) addr = &lasttime;
+    DBG_FIX_ADDR_SEG( addr, CS_reg(DEBUG_context) );
+    while (count-- > 0)
+    {
+        DEBUG_PrintAddress( addr, dbg_mode );
+        fprintf( stderr, ":  " );
+        if (!DBG_CHECK_READ_PTR( addr, 1 )) break;
+        DEBUG_Disasm( addr );
+        fprintf (stderr, "\n");
+    }
+    lasttime = *addr;
+}
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 52e0a18..60ac907 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -17,6 +17,7 @@
 C_SRCS = \
 	$(SPEC32_FILES) \
 	callback.c \
+	dummy.c \
 	relay.c \
 	relay32.c
 
diff --git a/if1632/dummy.c b/if1632/dummy.c
new file mode 100644
index 0000000..08c0fc6
--- /dev/null
+++ b/if1632/dummy.c
@@ -0,0 +1,42 @@
+#include <stdio.h>
+long stub_GDI_530(void) { fprintf(stderr, "Warning: GDI_530: unimplemented stub\n"); return 0; }
+long stub_GDI_531(void) { fprintf(stderr, "Warning: GDI_531: unimplemented stub\n"); return 0; }
+long stub_GDI_532(void) { fprintf(stderr, "Warning: GDI_532: unimplemented stub\n"); return 0; }
+long stub_GDI_536(void) { fprintf(stderr, "Warning: GDI_536: unimplemented stub\n"); return 0; }
+long stub_GDI_538(void) { fprintf(stderr, "Warning: GDI_538: unimplemented stub\n"); return 0; }
+long stub_GDI_540(void) { fprintf(stderr, "Warning: GDI_540: unimplemented stub\n"); return 0; }
+long stub_GDI_543(void) { fprintf(stderr, "Warning: GDI_543: unimplemented stub\n"); return 0; }
+long stub_GDI_555(void) { fprintf(stderr, "Warning: GDI_555: unimplemented stub\n"); return 0; }
+long stub_GDI_560(void) { fprintf(stderr, "Warning: GDI_560: unimplemented stub\n"); return 0; }
+long stub_GDI_561(void) { fprintf(stderr, "Warning: GDI_561: unimplemented stub\n"); return 0; }
+long stub_GDI_564(void) { fprintf(stderr, "Warning: GDI_564: unimplemented stub\n"); return 0; }
+long stub_GDI_565(void) { fprintf(stderr, "Warning: GDI_565: unimplemented stub\n"); return 0; }
+long stub_GDI_566(void) { fprintf(stderr, "Warning: GDI_566: unimplemented stub\n"); return 0; }
+long stub_GDI_571(void) { fprintf(stderr, "Warning: GDI_571: unimplemented stub\n"); return 0; }
+long stub_GDI_572(void) { fprintf(stderr, "Warning: GDI_572: unimplemented stub\n"); return 0; }
+long stub_GDI_573(void) { fprintf(stderr, "Warning: GDI_573: unimplemented stub\n"); return 0; }
+long stub_GDI_556(void) { fprintf(stderr, "Warning: GDI_556: unimplemented stub\n"); return 0; }
+long stub_GDI_558(void) { fprintf(stderr, "Warning: GDI_558: unimplemented stub\n"); return 0; }
+long stub_GDI_569(void) { fprintf(stderr, "Warning: GDI_569: unimplemented stub\n"); return 0; }
+long stub_KERNEL_450(void) { fprintf(stderr, "Warning: KERNEL_450: unimplemented stub\n"); return 0; }
+long stub_USER_489(void) { fprintf(stderr, "Warning: USER_489: unimplemented stub\n"); return 0; }
+long stub_USER_490(void) { fprintf(stderr, "Warning: USER_490: unimplemented stub\n"); return 0; }
+long stub_USER_492(void) { fprintf(stderr, "Warning: USER_492: unimplemented stub\n"); return 0; }
+long stub_USER_496(void) { fprintf(stderr, "Warning: USER_496: unimplemented stub\n"); return 0; }
+long stub_USER_902(void) { fprintf(stderr, "Warning: USER_902: unimplemented stub\n"); return 0; }
+long stub_USER_905(void) { fprintf(stderr, "Warning: USER_905: unimplemented stub\n"); return 0; }
+long stub_USER_906(void) { fprintf(stderr, "Warning: USER_906: unimplemented stub\n"); return 0; }
+long stub_USER_907(void) { fprintf(stderr, "Warning: USER_907: unimplemented stub\n"); return 0; }
+long stub_USER_909(void) { fprintf(stderr, "Warning: USER_909: unimplemented stub\n"); return 0; }
+long stub_USER_910(void) { fprintf(stderr, "Warning: USER_910: unimplemented stub\n"); return 0; }
+long stub_USER_911(void) { fprintf(stderr, "Warning: USER_911: unimplemented stub\n"); return 0; }
+long stub_USER_912(void) { fprintf(stderr, "Warning: USER_912: unimplemented stub\n"); return 0; }
+long stub_USER_913(void) { fprintf(stderr, "Warning: USER_913: unimplemented stub\n"); return 0; }
+long stub_USER_914(void) { fprintf(stderr, "Warning: USER_914: unimplemented stub\n"); return 0; }
+long stub_USER_915(void) { fprintf(stderr, "Warning: USER_915: unimplemented stub\n"); return 0; }
+long stub_USER_916(void) { fprintf(stderr, "Warning: USER_916: unimplemented stub\n"); return 0; }
+long stub_USER_918(void) { fprintf(stderr, "Warning: USER_918: unimplemented stub\n"); return 0; }
+long stub_USER_919(void) { fprintf(stderr, "Warning: USER_919: unimplemented stub\n"); return 0; }
+long stub_USER_920(void) { fprintf(stderr, "Warning: USER_920: unimplemented stub\n"); return 0; }
+long stub_USER_922(void) { fprintf(stderr, "Warning: USER_922: unimplemented stub\n"); return 0; }
+long stub_USER_923(void) { fprintf(stderr, "Warning: USER_923: unimplemented stub\n"); return 0; }
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index f960007..5dd5593 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -140,8 +140,8 @@
 154 pascal GetNearestColor(word long) GetNearestColor
 155 stub QueryAbort
 156 pascal16 CreateDiscardableBitmap(word word word) CreateDiscardableBitmap
-159 stub GetMetaFileBits
-160 stub SetMetaFileBits
+159 pascal16 GetMetaFileBits(word) GetMetaFileBits
+160 pascal16 SetMetaFileBits(word) SetMetaFileBits
 161 pascal16 PtInRegion(word s_word s_word) PtInRegion
 162 pascal GetBitmapDimension(word) GetBitmapDimension
 163 pascal SetBitmapDimension(word s_word s_word) SetBitmapDimension
@@ -375,3 +375,23 @@
 822 stub ICMTranslateRGB
 823 stub ICMTranslateRGBs
 824 stub ICMCheckCOlorsInGamut
+# Stubs for Hebrew version
+530 pascal16 GDI_530() stub_GDI_530
+531 pascal16 GDI_531() stub_GDI_531
+532 pascal16 GDI_532() stub_GDI_532
+536 pascal16 GDI_536() stub_GDI_536
+538 pascal16 GDI_538() stub_GDI_538
+540 pascal16 GDI_540() stub_GDI_540
+543 pascal16 GDI_543() stub_GDI_543
+555 pascal16 GDI_555() stub_GDI_555
+560 pascal16 GDI_560() stub_GDI_560
+561 pascal16 GDI_561() stub_GDI_561
+564 pascal16 GDI_564() stub_GDI_564
+565 pascal16 GDI_565() stub_GDI_565
+566 pascal16 GDI_566() stub_GDI_566
+571 pascal16 GDI_571() stub_GDI_571
+572 pascal16 GDI_572() stub_GDI_572
+573 pascal16 GDI_573() stub_GDI_573
+556 pascal16 GDI_556() stub_GDI_556
+558 pascal16 GDI_558() stub_GDI_558
+569 pascal16 GDI_569() stub_GDI_569
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 4cf8424..9a5b15f 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -283,6 +283,7 @@
 421 stub SetFileAttributes
 422 stub GetDiskFreeSpace
 432 stub FileTimeToLocalFileTime
+450 pascal16 KERNEL_450() stub_KERNEL_450
 491 stub RegisterServiceProcess
 513 stub LoadLibraryEx32W
 514 stub FreeLibrary32W
diff --git a/if1632/user.spec b/if1632/user.spec
index 63b7a9d..469bbc5 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -297,7 +297,7 @@
 292 pascal16 UnhookWindowsHookEx(segptr) UnhookWindowsHookEx
 293 pascal   CallNextHookEx(segptr s_word word long) CallNextHookEx
 294 stub LockWindowUpdate
-#299 MOUSE_EVENT
+299 register Mouse_Event() Mouse_Event
 300 stub UnloadInstalledDrivers
 #301 BOZOSLIVEHERE :-))
 #306 BEAR306
@@ -319,7 +319,7 @@
 334 pascal   GetQueueStatus(word) GetQueueStatus
 335 pascal16 GetInputState() GetInputState
 336 stub LoadCursorIconHandler
-337 stub GetMouseEventProc
+337 pascal   GetMouseEventProc() GetMouseEventProc
 #341 _FFFE_FARFRAME
 343 stub GetFilePortName
 356 stub LoadDIBCursorHandler
@@ -514,3 +514,25 @@
 855 stub Usr32ThkConnectionDataSL
 890 stub InstallIMT
 891 stub UninstallIMT
+# Stubs for Hebrew version
+489 pascal16 USER_489() stub_USER_489
+490 pascal16 USER_490() stub_USER_490
+492 pascal16 USER_492() stub_USER_492
+496 pascal16 USER_496() stub_USER_496
+902 pascal16 USER_902() stub_USER_902
+905 pascal16 USER_905() stub_USER_905
+906 pascal16 USER_906() stub_USER_906
+907 pascal16 USER_907() stub_USER_907
+909 pascal16 USER_909() stub_USER_909
+910 pascal16 USER_910() stub_USER_910
+911 pascal16 USER_911() stub_USER_911
+912 pascal16 USER_912() stub_USER_912
+913 pascal16 USER_913() stub_USER_913
+914 pascal16 USER_914() stub_USER_914
+915 pascal16 USER_915() stub_USER_915
+916 pascal16 USER_916() stub_USER_916
+918 pascal16 USER_918() stub_USER_918
+919 pascal16 USER_919() stub_USER_919
+920 pascal16 USER_920() stub_USER_920
+922 pascal16 USER_922() stub_USER_922
+923 pascal16 USER_923() stub_USER_923
diff --git a/include/accel.h b/include/accel.h
index 59fdbd8..b8e5690 100644
--- a/include/accel.h
+++ b/include/accel.h
@@ -5,6 +5,8 @@
  *
  */
 
+#include "windows.h"
+
 typedef struct {
 	WORD		wEvent;
 	WORD		wIDval;
diff --git a/include/bitmap.h b/include/bitmap.h
index c236cdc..fc07762 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -28,7 +28,7 @@
 { \
     int width_bytes = DIB_GetImageWidthBytes( (width), (bpp) ); \
     (image) = XCreateImage(display, DefaultVisualOfScreen(screen), \
-                           (bpp), ZPixmap, 0, malloc( (height)*width_bytes ), \
+                           (bpp), ZPixmap, 0, xmalloc( (height)*width_bytes ),\
                            (width), (height), 32, width_bytes ); \
 }
 
diff --git a/include/debugger.h b/include/debugger.h
index 9190ff1..deb92fa 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -86,6 +86,7 @@
 extern void DEBUG_Print( const DBG_ADDR *addr, int count, char format );
 extern void DEBUG_PrintAddress( const DBG_ADDR *addr, int addrlen );
 extern void DEBUG_Help(void);
+extern void DEBUG_List( DBG_ADDR *addr, int count );
 
   /* debugger/memory.c */
 extern BOOL DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size );
diff --git a/include/menu.h b/include/menu.h
index d2fae7c..59f292d 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -9,11 +9,11 @@
 #define MENU_MAGIC   0x554d  /* 'MU' */
 
 extern BOOL MENU_Init(void);
-extern WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth,
+extern UINT MENU_GetMenuBarHeight( HWND hwnd, UINT menubarWidth,
 				   int orgX, int orgY );         /* menu.c */
 extern void MENU_TrackMouseMenuBar( HWND hwnd, POINT pt );       /* menu.c */
-extern void MENU_TrackKbdMenuBar( HWND hwnd, WORD wParam );      /* menu.c */
-extern WORD MENU_DrawMenuBar( HDC hDC, LPRECT lprect,
+extern void MENU_TrackKbdMenuBar( HWND hwnd, UINT wParam );      /* menu.c */
+extern UINT MENU_DrawMenuBar( HDC hDC, LPRECT lprect,
 			      HWND hwnd, BOOL suppress_draw );   /* menu.c */
 extern HMENU CopySysMenu(); /* menu.c */
 
@@ -22,7 +22,7 @@
 typedef struct tagMENUITEM
 {
     WORD	item_flags;    /* Item flags */
-    WORD	item_id;       /* Item or popup id */
+    UINT	item_id;       /* Item or popup id */
     RECT	rect;          /* Item area (relative to menu window) */
     WORD        xTab;          /* X position of text after Tab */
     HBITMAP	hCheckBit;     /* Bitmap for checked item */
@@ -43,7 +43,7 @@
     WORD	nItems;       /* Number of items in the menu */
     HWND	hWnd;	      /* Window containing the menu */
     HANDLE      hItems;       /* Handle to the items array */
-    WORD	FocusedItem;  /* Currently focused item */
+    UINT	FocusedItem;  /* Currently focused item */
 } POPUPMENU, *LPPOPUPMENU;
 
 typedef struct
diff --git a/include/sysmetrics.h b/include/sysmetrics.h
index 11e08b4..52ffa6c 100644
--- a/include/sysmetrics.h
+++ b/include/sysmetrics.h
@@ -75,6 +75,6 @@
 #define SYSMETRICS_MENUDROPALIGNMENT   sysMetrics[SM_MENUDROPALIGNMENT]
 
 extern void SYSMETRICS_Init(void);
-extern short sysMetrics[SM_CMETRICS];
+extern short sysMetrics[SM_CMETRICS+1];
 
 #endif
diff --git a/include/win.h b/include/win.h
index f40937d..49491a2 100644
--- a/include/win.h
+++ b/include/win.h
@@ -51,7 +51,7 @@
     HANDLE       hdce;           /* Window DCE (if CS_OWNDC or CS_CLASSDC) */
     HANDLE       hVScroll;       /* Vertical scroll-bar info */
     HANDLE       hHScroll;       /* Horizontal scroll-bar info */
-    WORD         wIDmenu;        /* ID or hmenu (from CreateWindow) */
+    UINT         wIDmenu;        /* ID or hmenu (from CreateWindow) */
     HANDLE       hText;          /* Handle of window text */
     WORD         flags;          /* Misc. flags (see below) */
     Window       window;         /* X window (only for top-level windows) */
diff --git a/include/windows.h b/include/windows.h
index e151ebf..064434d 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -9,21 +9,24 @@
 #pragma pack(1)
 #endif
 
-typedef struct { 
-	INT x;
-	INT y; 
-} POINT;
+#ifdef WINELIB32
+typedef struct { LONG x,y; } POINT;
+typedef struct { SHORT x,y; } POINTS;
+typedef struct { LONG cx,cy; } SIZE, *LPSIZE;
+typedef struct { LONG left, top, right, bottom; } RECT;
+#define MAKEPOINTS(l) (*((POINTS *)&(l)))
+#else
+typedef struct { INT x,y; } POINT;
+typedef struct { INT cx,cy; } SIZE, *LPSIZE;
+typedef struct { INT left, top, right, bottom; } RECT;
+#define MAKEPOINT(l) (*((POINT *)&(l)))
+#endif
 typedef POINT *PPOINT;
 typedef POINT *NPPOINT;
 typedef POINT *LPPOINT;
-
-typedef struct 
-{
-    INT cx;
-    INT cy;
-} SIZE, *LPSIZE;
-
-#define MAKEPOINT(l) (*((POINT *)&(l)))
+typedef RECT *LPRECT;
+typedef RECT *NPRECT;
+typedef RECT *PRECT;
 
 #ifdef WINELIB32
 #define MAKEWPARAM(low, high) ((LONG)(((WORD)(low)) | \
@@ -33,11 +36,6 @@
 #define MAKELPARAM(low, high) ((LONG)(((WORD)(low)) | \
 			      (((DWORD)((WORD)(high))) << 16)))
 
-typedef struct { INT left, top, right, bottom; } RECT;
-typedef RECT *LPRECT;
-typedef RECT *NPRECT;
-typedef RECT *PRECT;
-
 typedef struct {
 	HDC hdc;
 	BOOL	fErase;
@@ -425,9 +423,9 @@
 typedef struct tagMSG
 {
   HWND    hwnd;
-  WORD    message;
-  WORD    wParam;
-  DWORD   lParam WINE_PACKED;
+  UINT    message;
+  WPARAM  wParam;
+  LPARAM  lParam WINE_PACKED;
   DWORD   time WINE_PACKED;
   POINT	  pt WINE_PACKED;
 } MSG, *LPMSG;
@@ -1569,6 +1567,13 @@
 #define MK_CONTROL	    0x0008
 #define MK_MBUTTON	    0x0010
 
+  /* Mouse_Event flags */
+#define ME_MOVE             0x01
+#define ME_LDOWN            0x02
+#define ME_LUP              0x04
+#define ME_RDOWN            0x08
+#define ME_RUP              0x10
+
   /* Queue status flags */
 #define QS_KEY		0x0001
 #define QS_MOUSEMOVE	0x0002
@@ -2366,7 +2371,7 @@
 #define META_DRAWTEXT                0x062F
 #define META_CHORD                   0x0830
 #define META_SETMAPPERFLAGS          0x0231
-#define META_SETTEXTOUT              0x0A32
+#define META_EXTTEXTOUT              0x0A32
 #define META_SETDIBTODEV             0x0D33
 #define META_SELECTPALETTE           0x0234
 #define META_REALIZEPALETTE          0x0035
@@ -2458,19 +2463,19 @@
 ATOM GlobalFindAtom(SEGPTR);
 ATOM RegisterClass(LPWNDCLASS);
 BOOL AnyPopup(void);
-BOOL AppendMenu(HMENU,WORD,WORD,LPSTR);
+BOOL AppendMenu(HMENU,UINT,UINT,LPSTR);
 BOOL Arc(HDC,int,int,int,int,int,int,int,int);
 BOOL BitBlt(HDC,short,short,short,short,HDC,short,short,DWORD);
 BOOL BringWindowToTop(HWND);
 BOOL CallMsgFilter(SEGPTR,short);
 BOOL ChangeClipboardChain(HWND,HWND);
-BOOL ChangeMenu(HMENU,WORD,LPSTR,WORD,WORD);
-BOOL CheckMenuItem(HMENU,WORD,WORD);
+BOOL ChangeMenu(HMENU,UINT,LPSTR,UINT,UINT);
+BOOL CheckMenuItem(HMENU,UINT,UINT);
 BOOL Chord(HDC,int,int,int,int,int,int,int,int);
 BOOL CloseClipboard(void);
 BOOL DPtoLP(HDC,LPPOINT,int);
 BOOL DeleteDC(HDC);
-BOOL DeleteMenu(HMENU,WORD,WORD);
+BOOL DeleteMenu(HMENU,UINT,UINT);
 BOOL DeleteMetaFile(HMETAFILE);
 BOOL DeleteObject(HANDLE);
 BOOL DestroyCursor(HCURSOR);
@@ -2483,7 +2488,7 @@
 BOOL Ellipse(HDC,int,int,int,int);
 BOOL EmptyClipboard(void);
 BOOL EnableHardwareInput(BOOL);
-BOOL EnableMenuItem(HMENU,WORD,WORD);
+BOOL EnableMenuItem(HMENU,UINT,UINT);
 BOOL EnableScrollBar(HWND,INT,UINT);
 BOOL EnableWindow(HWND,BOOL);
 BOOL EndDeferWindowPos(HDWP);
@@ -2521,9 +2526,9 @@
 BOOL GlobalUnWire(HGLOBAL);
 BOOL GlobalUnlock(HGLOBAL);
 BOOL GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
-BOOL HiliteMenuItem(HWND,HMENU,WORD,WORD);
+BOOL HiliteMenuItem(HWND,HMENU,UINT,UINT);
 BOOL InSendMessage(void);
-BOOL InsertMenu(HMENU,WORD,WORD,WORD,LPSTR);
+BOOL InsertMenu(HMENU,UINT,UINT,UINT,LPSTR);
 BOOL IntersectRect(LPRECT,LPRECT,LPRECT);
 BOOL InvertRgn(HDC,HRGN);
 BOOL IsBadCodePtr(SEGPTR);
@@ -2552,7 +2557,7 @@
 BOOL LineTo(HDC,short,short);
 BOOL LocalInit(HANDLE,WORD,WORD);
 BOOL LocalUnlock(HANDLE);
-BOOL ModifyMenu(HMENU,WORD,WORD,WORD,LPSTR);
+BOOL ModifyMenu(HMENU,UINT,UINT,UINT,LPSTR);
 BOOL MoveToEx(HDC,short,short,LPPOINT);
 BOOL MoveWindow(HWND,short,short,short,short,BOOL);
 BOOL OemToAnsi(LPSTR,LPSTR);
@@ -2578,8 +2583,8 @@
 BOOL Rectangle(HDC,int,int,int,int);
 BOOL RedrawWindow(HWND,LPRECT,HRGN,UINT);
 BOOL RemoveFontResource(LPSTR);
-BOOL RemoveMenu(HMENU,WORD,WORD);
-BOOL ResizePalette(HPALETTE,WORD);
+BOOL RemoveMenu(HMENU,UINT,UINT);
+BOOL ResizePalette(HPALETTE,UINT);
 BOOL RestoreDC(HDC,short);
 BOOL RoundRect(HDC,short,short,short,short,short,short);
 BOOL ScaleViewportExtEx(HDC,short,short,short,short,LPSIZE);
@@ -2591,7 +2596,7 @@
 BOOL SetDeskWallPaper(LPSTR);
 BOOL SetErrorMode(WORD);
 BOOL SetMenu(HWND,HMENU);
-BOOL SetMenuItemBitmaps(HMENU,WORD,WORD,HBITMAP,HBITMAP);
+BOOL SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
 BOOL SetMessageQueue(int);
 BOOL SetProp(HWND,SEGPTR,HANDLE);
 BOOL SetViewportExtEx(HDC,short,short,LPSIZE);
@@ -2606,7 +2611,7 @@
 BOOL SubtractRect(LPRECT,LPRECT,LPRECT);
 BOOL SwapMouseButton(BOOL);
 BOOL TextOut(HDC,short,short,LPSTR,short);
-BOOL TrackPopupMenu(HMENU,WORD,short,short,short,HWND,LPRECT);
+BOOL TrackPopupMenu(HMENU,UINT,short,short,short,HWND,LPRECT);
 BOOL TranslateMDISysAccel(HWND,LPMSG);
 BOOL TranslateMessage(LPMSG);
 BOOL UnhookWindowsHook(short,FARPROC);
@@ -2628,7 +2633,8 @@
 DWORD GetBitmapDimension(HBITMAP);
 DWORD GetBrushOrg(HDC);
 DWORD GetCurrentPosition(HDC);
-DWORD GetCurrentTime(void);
+/*DWORD GetCurrentTime(void);*/
+#define GetCurrentTime GetTickCount
 DWORD GetDCOrg(HDC);
 DWORD GetDialogBaseUnits(void);
 DWORD GetFreeSpace(WORD);
@@ -2648,7 +2654,11 @@
 DWORD GetWindowOrg(HDC);
 DWORD GlobalCompact(DWORD);
 DWORD GlobalDOSAlloc(DWORD);
-DWORD GlobalHandle(WORD);
+#ifdef WINELIB32
+HGLOBAL GlobalHandle(LPCVOID);
+#else
+DWORD GlobalHandle(UINT);
+#endif
 DWORD GlobalSize(HGLOBAL);
 DWORD MoveTo(HDC,short,short);
 DWORD OemKeyScan(WORD);
@@ -2666,6 +2676,7 @@
 DWORD SetWindowExt(HDC,short,short);
 DWORD SetWindowOrg(HDC,short,short);
 DWORD SizeofResource(HANDLE,HRSRC);
+FARPROC GetMouseEventProc(void);
 FARPROC GetProcAddress(HANDLE,SEGPTR);
 FARPROC LocalNotify(FARPROC);
 FARPROC MakeProcInstance(FARPROC,HANDLE);
@@ -2758,8 +2769,8 @@
 HPEN CreatePenIndirect(LOGPEN*);
 HRGN CreateEllipticRgn(short,short,short,short);
 HRGN CreateEllipticRgnIndirect(LPRECT);
-HRGN CreatePolyPolygonRgn(LPPOINT,LPINT,short,short);
-HRGN CreatePolygonRgn(LPPOINT,short,short);
+HRGN CreatePolyPolygonRgn(LPPOINT,LPINT,INT,INT);
+HRGN CreatePolygonRgn(LPPOINT,INT,INT);
 HRGN CreateRectRgn(short,short,short,short);
 HRGN CreateRectRgnIndirect(LPRECT);
 HRGN CreateRoundRectRgn(short,short,short,short,short,short);
@@ -2869,15 +2880,15 @@
 WORD GetBkMode(HDC);
 WORD GetCaretBlinkTime(void);
 WORD GetClassWord(HWND,short);
-WORD GetCommEventMask(int,int);
+UINT GetCommEventMask(int,int);
 WORD GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
 WORD GetDoubleClickTime(void);
 WORD GetDriveType(INT);
 WORD GetInternalWindowPos(HWND,LPRECT,LPPOINT);
 WORD GetMapMode(HDC);
 WORD GetMenuItemCount(HMENU);
-WORD GetMenuItemID(HMENU,int);
-WORD GetMenuState(HMENU,WORD,WORD);
+UINT GetMenuItemID(HMENU,int);
+UINT GetMenuState(HMENU,UINT,UINT);
 WORD GetNearestPaletteIndex(HPALETTE,DWORD);
 WORD GetNumTasks(void);
 WORD GetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
@@ -2887,12 +2898,12 @@
 WORD GetROP2(HDC);
 WORD GetRelAbs(HDC);
 WORD GetStretchBltMode(HDC);
-WORD GetSystemDirectory(LPSTR,WORD);
+UINT GetSystemDirectory(LPSTR,UINT);
 WORD GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
 WORD GetSystemPaletteUse(HDC);
 WORD GetTextAlign(HDC);
 WORD GetWindowWord(HWND,short);
-WORD GetWindowsDirectory(LPSTR,WORD);
+UINT GetWindowsDirectory(LPSTR,UINT);
 WORD GlobalDOSFree(WORD);
 WORD GlobalFlags(HGLOBAL);
 WORD GlobalGetAtomName(ATOM,LPSTR,short);
@@ -2927,7 +2938,7 @@
 WORD SetTimer(HWND,WORD,WORD,FARPROC);
 WORD SetWindowWord(HWND,short,WORD);
 WORD VkKeyScan(WORD);
-WORD* SetCommEventMask(int,WORD);
+UINT* SetCommEventMask(int,UINT);
 int BuildCommDCB(LPSTR,DCB*);
 int Catch(LPCATCHBUF);
 int ClearCommBreak(int);
@@ -2969,7 +2980,7 @@
 int GetKeyNameText(LONG,LPSTR,int);
 int GetKeyState(int);
 int GetKeyboardType(int);
-int GetMenuString(HMENU,WORD,LPSTR,short,WORD);
+int GetMenuString(HMENU,UINT,LPSTR,short,UINT);
 int GetModuleFileName(HANDLE,LPSTR,short);
 int GetModuleUsage(HANDLE);
 int GetObject(HANDLE,int,LPSTR);
@@ -2989,7 +3000,7 @@
 int MulDiv(int,int,int);
 int OffsetClipRgn(HDC,short,short);
 int OffsetRgn(HRGN,short,short);
-int OpenComm(LPSTR,WORD,WORD);
+int OpenComm(LPSTR,UINT,UINT);
 int OpenSound(void);
 int ProfInsChk(void);
 int ReadComm(int,LPSTR,int);
diff --git a/include/wintypes.h b/include/wintypes.h
index 348af36..ff785d1 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -9,32 +9,41 @@
 #   define WINELIB32
 #  endif
 # endif
+#else
+# ifdef WINELIB32
+#  undef WINELIB16
+#  define WINELIB
+# endif
+# ifdef WINELIB16
+#  define WINELIB
+# endif
 #endif
 
-typedef short	INT;
-typedef unsigned short UINT;
-#define UIFMT "%hu"
 typedef unsigned short WORD;
 typedef unsigned long DWORD;
 typedef unsigned short BOOL;
 typedef unsigned char BYTE;
 typedef long LONG;
 #ifdef WINELIB32
+typedef int INT;
+typedef unsigned int UINT;
+typedef short SHORT;
 typedef LONG WPARAM;
+typedef void* HANDLE;
+typedef void* NPVOID;
+#define UIFMT "%u"
+#define NPFMT "%p"
 #else
+typedef short INT;
+typedef unsigned short UINT;
 typedef UINT WPARAM;
+typedef WORD HANDLE;
+typedef WORD NPVOID;
+#define UIFMT "%hu"
+#define NPFMT "%04X"
 #endif
 typedef LONG LPARAM;
 typedef LONG LRESULT;
-#ifdef WINELIB32
-typedef void* HANDLE;
-typedef void* NPVOID;
-#define NPFMT "%p"
-#else
-typedef WORD HANDLE;
-typedef WORD NPVOID;
-#define NPFMT "%04X"
-#endif
 typedef DWORD HHOOK;
 typedef DWORD SEGPTR;
 typedef char *LPSTR;
@@ -46,6 +55,7 @@
 typedef DWORD *LPDWORD;
 typedef LONG *LPLONG;
 typedef void *LPVOID;
+typedef const void *LPCVOID;
 typedef WORD CATCHBUF[9];
 typedef WORD *LPCATCHBUF;
 
@@ -119,12 +129,12 @@
 #define SELECTOROF(ptr)     (HIWORD(ptr))
 #define OFFSETOF(ptr)       (LOWORD(ptr))
 
-#ifndef max
-#define max(a,b) (((a) > (b)) ? (a) : (b))
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
 #endif
 
-#ifndef min
-#define min(a,b) (((a) < (b)) ? (a) : (b))
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
 #endif
 
 #endif /* __WINE_WINTYPES_H */
diff --git a/include/xmalloc.h b/include/xmalloc.h
new file mode 100644
index 0000000..e8b183d
--- /dev/null
+++ b/include/xmalloc.h
@@ -0,0 +1,8 @@
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#else
+#define size_t unsigned int
+#endif
+
+void *xmalloc (size_t);
+void *xrealloc (void *, size_t);
diff --git a/ipc/dde_proc.c b/ipc/dde_proc.c
index df6e6a8..c72f371 100644
--- a/ipc/dde_proc.c
+++ b/ipc/dde_proc.c
@@ -28,6 +28,7 @@
 #include "dde.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 int curr_proc_idx= -1;
 
@@ -73,7 +74,7 @@
 {
   fifo_element *created;
 
-  created= (fifo_element*) malloc( sizeof(fifo_element) );
+  created= (fifo_element*) xmalloc( sizeof(fifo_element) );
   created->value = val;
   created->next = NULL;
   
diff --git a/ipc/shm_block.c b/ipc/shm_block.c
index 259378f..6a5106b 100644
--- a/ipc/shm_block.c
+++ b/ipc/shm_block.c
@@ -24,6 +24,7 @@
 #include "shm_block.h"
 #include "shm_semaph.h"
 #include "dde_proc.h"
+#include "xmalloc.h"
 
 /* How each shmid is maped to local pointer */
 /* Only attached shm blocks are in this construct */
@@ -79,7 +80,7 @@
   block=(struct shm_block*)shmat(shm_id, NULL, 0);
   if (block==NULL || block == (struct shm_block*) -1) return NULL;
 
-  this=(struct local_shm_map *)malloc(sizeof(*this));
+  this=(struct local_shm_map *)xmalloc(sizeof(*this));
   this->next= shm_map;
   shm_map   = this;
   this->shm_id= shm_id;
diff --git a/ipc/shm_fragment_test.c b/ipc/shm_fragment_test.c
index 8964715..708dad4 100644
--- a/ipc/shm_fragment_test.c
+++ b/ipc/shm_fragment_test.c
@@ -16,6 +16,7 @@
 #include <string.h>
 #include "shm_block.h"
 #include "shm_fragment.h"
+#include "xmalloc.h"
 
 #define DO_FREE(id) (-id)
 #define LIST_LENGTH 20
@@ -60,8 +61,7 @@
   
   static char *ptr[LIST_LENGTH];
   
-  block=malloc(SHM_MINBLOCK);
-  assert(block);
+  block=xmalloc(SHM_MINBLOCK);
 
   /* setup first item in the free list */
   shm_FragmentInit(block, sizeof(*block), SHM_MINBLOCK);
diff --git a/loader/main.c b/loader/main.c
index de7df1e..08ad7cd 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -58,10 +58,10 @@
 
       /* Initialize Win32 relay code */
     if (!RELAY32_Init()) return 0;
-#endif
 
       /* Create built-in modules */
     if (!MODULE_Init()) return 0;
+#endif
 
       /* Initialize the DOS file system */
     DOS_InitFS();
diff --git a/loader/module.c b/loader/module.c
index e48ed03..7186c93 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -24,20 +24,22 @@
 #include "debug.h"
 
 #include "callback.h"
+#include "wine.h"
 
 static HMODULE hFirstModule = 0;
 static HMODULE hCachedModule = 0;  /* Module cached by MODULE_OpenFile */
 
 
+static HANDLE hInitialStack32 = 0;
 /***********************************************************************
  *           MODULE_LoadBuiltin
  *
  * Load a built-in module. If the 'force' parameter is FALSE, we only
  * load the module if it has not been disabled via the -dll option.
  */
+#ifndef WINELIB /* JBP: Not really allowed in libwine.a (FIXME:?) */
 static HMODULE MODULE_LoadBuiltin( LPCSTR name, BOOL force )
 {
-#ifndef WINELIB /* JBP: Not really allowed in libwine.a (FIXME:?) */
     HMODULE hModule;
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable;
@@ -91,7 +93,7 @@
     hFirstModule = hModule;
     return hModule;
 }
-
+#endif
 
 /***********************************************************************
  *           MODULE_Init
@@ -102,6 +104,7 @@
 {
     /* For these, built-in modules are always used */
 
+#ifndef WINELIB32
     if (!MODULE_LoadBuiltin( "KERNEL", TRUE ) ||
         !MODULE_LoadBuiltin( "GDI", TRUE ) ||
         !MODULE_LoadBuiltin( "USER", TRUE ) ||
@@ -317,6 +320,7 @@
 /***********************************************************************
  *           MODULE_CreateSegments
  */
+#ifndef WINELIB32
 static BOOL MODULE_CreateSegments( HMODULE hModule )
 {
     SEGTABLEENTRY *pSegment;
@@ -343,11 +347,13 @@
                             (pModule->dgroup - 1) * sizeof(SEGTABLEENTRY) : 0;
     return TRUE;
 }
+#endif
 
 
 /***********************************************************************
  *           MODULE_GetInstance
  */
+#ifndef WINELIB32
 static HINSTANCE MODULE_GetInstance( HMODULE hModule )
 {
     SEGTABLEENTRY *pSegment;
@@ -360,6 +366,7 @@
     
     return pSegment->selector;
 }
+#endif
 
 
 /***********************************************************************
@@ -795,7 +802,7 @@
 
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return NULL;
     p = (BYTE *)pModule + pModule->name_table;
-    len = min( *p, 8 );
+    len = MIN( *p, 8 );
     memcpy( buffer, p + 1, len );
     buffer[len] = '\0';
     return buffer;
@@ -1023,6 +1030,33 @@
 		oldsp = IF1632_Saved16_sp;
 		IF1632_Saved16_ss = pModule->self_loading_sel;
 		IF1632_Saved16_sp = 0xFF00;
+		if (!IF1632_Stack32_base) {
+		  STACK32FRAME* frame32;
+		  char *stack32Top;
+		  /* Setup an initial 32 bit stack frame */
+		  hInitialStack32 =  GLOBAL_Alloc( GMEM_FIXED, 0x10000,
+						  hModule, FALSE, FALSE, 
+						  FALSE );
+
+		  /* Create the 32-bit stack frame */
+		  
+		  *(DWORD *)GlobalLock(hInitialStack32) = 0xDEADBEEF;
+		  stack32Top = (char*)GlobalLock(hInitialStack32) + 
+		    0x10000;
+		  frame32 = (STACK32FRAME *)stack32Top - 1;
+		  frame32->saved_esp = (DWORD)stack32Top;
+		  frame32->edi = 0;
+		  frame32->esi = 0;
+		  frame32->edx = 0;
+		  frame32->ecx = 0;
+		  frame32->ebx = 0;
+		  frame32->ebp = 0;
+		  frame32->retaddr = 0;
+		  frame32->codeselector = WINE_CODE_SELECTOR;
+		  /* pTask->esp = (DWORD)frame32; */
+		  IF1632_Stack32_base = WIN16_GlobalLock(hInitialStack32);
+
+		}
 		CallTo16_word_ww (selfloadheader->BootApp,
 			pModule->self_loading_sel, hModule, fd);
 		/* some BootApp procs overwrite the selector of dgroup */
@@ -1030,6 +1064,11 @@
 		IF1632_Saved16_ss = oldss;
 		IF1632_Saved16_sp = oldsp;
 		for (i = 2; i <= pModule->seg_count; i++) NE_LoadSegment( hModule, i );
+		if (hInitialStack32){
+		  GlobalUnlock (hInitialStack32);
+		  GlobalFree (hInitialStack32);
+		  IF1632_Stack32_base = hInitialStack32 = 0;
+		}
 	} 
 	else
         {
@@ -1229,13 +1268,28 @@
     handle = LoadModule( filename, &params );
     if (handle == (HANDLE)2)  /* file not found */
     {
+	/* Check that the original file name did not have a suffix */
+	p = strrchr(filename, '.');
+        if (p && !(strchr(p, '/') || strchr(p, '\\')))
+            return handle;  /* filename already includes a suffix! */
         strcat( filename, ".exe" );
         handle = LoadModule( filename, &params );
     }
 
     GlobalFree( cmdShowHandle );
     GlobalFree( cmdLineHandle );
-    Yield();	/* program is executed immediatly ....needed for word */
+
+#if 0
+    if (handle < (HANDLE)32)	/* Error? */
+	return handle;
+    
+/* FIXME: Yield never returns! 
+   We may want to run more applications or start the debugger
+   before calling Yield. If we don't Yield will be called immdiately
+   after returning.  Why is it needed for Word anyway? */
+    Yield();	/* program is executed immediately ....needed for word */
+
+#endif
     return handle;
 }
 
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 9167a99..9774817 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -24,6 +24,7 @@
 #include "stackframe.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 
 /***********************************************************************
@@ -107,7 +108,7 @@
 	 but may be missing something. If you have any doco please either send
 	 it to me or fix the code yourself. gfm@werple.mira.net.au
       */
-      char* buff = malloc(size);
+      char* buff = xmalloc(size);
       char* curr = buff;
       read(fd, buff, size);
       while(curr < buff + size) {
@@ -137,7 +138,7 @@
                    (char *)pModule + pModule->name_table + 1,
                    segnum, pSeg->selector );
 
-    reloc_entries = (struct relocation_entry_s *)malloc(count * sizeof(struct relocation_entry_s));
+    reloc_entries = (struct relocation_entry_s *)xmalloc(count * sizeof(struct relocation_entry_s));
     if (read( fd, reloc_entries, count * sizeof(struct relocation_entry_s)) !=
             count * sizeof(struct relocation_entry_s))
     {
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 18117cd..47c9d87 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -28,6 +28,7 @@
 #include "selectors.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 #define MAP_ANONYMOUS	0x20
 
@@ -184,17 +185,17 @@
 {
 	int i, result;
 
-	wpnt->pe = malloc(sizeof(struct pe_data));
+	wpnt->pe = xmalloc(sizeof(struct pe_data));
 	memset(wpnt->pe,0,sizeof(struct pe_data));
-	wpnt->pe->pe_header = malloc(sizeof(struct pe_header_s));
+	wpnt->pe->pe_header = xmalloc(sizeof(struct pe_header_s));
 
 	/* read PE header */
 	lseek(wpnt->fd, wpnt->mz_header->ne_offset, SEEK_SET);
 	read(wpnt->fd, wpnt->pe->pe_header, sizeof(struct pe_header_s));
 
 	/* read sections */
-	wpnt->pe->pe_seg = malloc(sizeof(struct pe_segment_table) * 
-				wpnt->pe->pe_header->coff.NumberOfSections);
+	wpnt->pe->pe_seg = xmalloc(sizeof(struct pe_segment_table) * 
+				   wpnt->pe->pe_header->coff.NumberOfSections);
 	read(wpnt->fd, wpnt->pe->pe_seg, sizeof(struct pe_segment_table) * 
 			wpnt->pe->pe_header->coff.NumberOfSections);
 
@@ -261,7 +262,7 @@
 
 	ALIAS_UseAliases=1;
 
-	wpnt=malloc(sizeof(struct w_files));
+	wpnt=xmalloc(sizeof(struct w_files));
 	wpnt->next=wine_files;
 	wine_files=wpnt;
 	wpnt->ofs=*ofs;
@@ -271,7 +272,7 @@
 	wpnt->hModule=0;
 	wpnt->initialised=0;
 	lseek(fd,0,SEEK_SET);
-	wpnt->mz_header=malloc(sizeof(struct mz_header_s));
+	wpnt->mz_header=xmalloc(sizeof(struct mz_header_s));
 	read(fd,wpnt->mz_header,sizeof(struct mz_header_s));
 
 	size=sizeof(NE_MODULE) +
diff --git a/loader/resource.c b/loader/resource.c
index 7a5b4b1..437d8e2 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -362,7 +362,7 @@
     
     dprintf_resource( stddeb, "strlen = %d\n", (int)*p );
     
-    i = min(buflen - 1, *p);
+    i = MIN(buflen - 1, *p);
     if (buffer == NULL)
 	return i;
     if (i > 0) {
diff --git a/loader/signal.c b/loader/signal.c
index 3a560c5..8a31b8d 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -18,6 +18,7 @@
 #include "miscemu.h"
 #include "registers.h"
 #include "win.h"
+#include "xmalloc.h"
 
 #if !defined(BSD4_4) || defined(linux) || defined(__FreeBSD__)
 char * cstack[4096];
@@ -57,8 +58,8 @@
     {
         if (CS_reg(context) == WINE_CODE_SELECTOR)
         {
-            fprintf(stderr, "Segmentation fault in Wine program (%x:%lx)."
-                            "  Please debug\n",
+            fprintf(stderr, "Segmentation fault in Wine program (%04x:%08lx)."
+                            "  Please debug.\n",
                             CS_reg(context), EIP_reg(context) );
         }
         else if (INSTR_EmulateInstruction( context )) return;
@@ -100,14 +101,10 @@
         struct sigaltstack ss;
         
 #if !defined (__FreeBSD__)
-        if ((ss.ss_base = malloc(MINSIGSTKSZ)) == NULL) {
+        ss.ss_base = xmalloc (MINSIGSTKSZ);
 #else
-        if ((ss.ss_sp = malloc(MINSIGSTKSZ)) == NULL) {
+        ss.ss_sp = xmalloc (MINSIGSTKSZ);
 #endif
-	        fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
-		        MINSIGSTKSZ);
-		exit(1);
-	}
 	ss.ss_size = MINSIGSTKSZ;
         ss.ss_flags = 0;
         if (sigaltstack(&ss, NULL) < 0) {
diff --git a/memory/local.c b/memory/local.c
index 9f215af..e20bd9c 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -328,7 +328,7 @@
     }
     ptr = PTR_SEG_OFF_TO_LIN( selector, 0 );
 
-    start = LALIGN( max( start, sizeof(INSTANCEDATA) ) );
+    start = LALIGN( MAX( start, sizeof(INSTANCEDATA) ) );
     heapInfoArena = LALIGN(start + sizeof(LOCALARENA) );
     freeArena = LALIGN( heapInfoArena + ARENA_HEADER_SIZE
                         + sizeof(LOCALHEAPINFO) );
@@ -521,7 +521,7 @@
     }
     
     size += ARENA_HEADER_SIZE;
-    size = LALIGN( max( size, sizeof(LOCALARENA) ) );
+    size = LALIGN( MAX( size, sizeof(LOCALARENA) ) );
 
       /* Find a suitable free block */
     arena = LOCAL_FindFreeBlock( ds, size );
@@ -740,6 +740,8 @@
     WORD arena, newhandle, blockhandle;
     LONG nextarena;
 
+    if (!handle) return LOCAL_Alloc( ds, size, flags );
+
     dprintf_local( stddeb, "LocalReAlloc: %04x %d %04x ds=%04x\n",
                    handle, size, flags, ds );
     if (!(pInfo = LOCAL_GetHeap( ds ))) return 0;
@@ -904,9 +906,9 @@
 /***********************************************************************
  *           LocalReAlloc   (KERNEL.6)
  */
-HLOCAL LocalReAlloc( HLOCAL handle, WORD flags, WORD size )
+HLOCAL LocalReAlloc( HLOCAL handle, WORD size, WORD flags )
 {
-    return LOCAL_ReAlloc( CURRENT_DS, handle, flags, size );
+    return LOCAL_ReAlloc( CURRENT_DS, handle, size, flags );
 }
 
 
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 778e331..26ac02d 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -28,7 +28,8 @@
 	stress.c \
 	user.c \
 	user32.c \
-	winsocket.c
+	winsocket.c \
+	xmalloc.c
 
 all: checkrc $(MODULE).o
 
diff --git a/misc/clipboard.c b/misc/clipboard.c
index d3df59d..68f5fe7 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -265,7 +265,7 @@
     if (lpFormat->Name == NULL) return 0;
     dprintf_clipboard(stddeb,
 		"GetClipboardFormat // Name='%s' !\n", lpFormat->Name);
-    maxlen = min(maxlen - 1, strlen(lpFormat->Name));
+    maxlen = MIN(maxlen - 1, strlen(lpFormat->Name));
     dprintf_clipboard(stddeb,"GetClipboardFormat // maxlen=%d !\n", maxlen);
     memcpy(retStr, lpFormat->Name, maxlen);
     retStr[maxlen] = 0;
diff --git a/misc/commdlg.c b/misc/commdlg.c
index f85624f..5b86ad3 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -171,9 +171,9 @@
 {
   char str[512],str2[512];
 
-  strcpy(str,newPath);
+  strncpy(str,newPath,511); str[511]=0;
   SendDlgItemMessage(hWnd, edt1, WM_GETTEXT, 511, MAKE_SEGPTR(str2));
-  strcat(str, str2);
+  strncat(str,str2,511-strlen(str)); str[511]=0;
   if (!DlgDirList(hWnd, str, lst1, 0, 0x0000)) return FALSE;
   DlgDirList(hWnd, "*.*", lst2, stc1, 0x8010);
   
@@ -210,7 +210,7 @@
 /***********************************************************************
  *                              FILEDLG_WMDrawItem              [internal]
  */
-static LONG FILEDLG_WMDrawItem(HWND hWnd, WORD wParam, LONG lParam)
+static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
     LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)PTR_SEG_TO_LIN(lParam);
     char str[512];
@@ -219,7 +219,7 @@
     BITMAP bm;
     HDC hMemDC;
 
-    strcpy(str, "");
+    str[0]=0;
     if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1) {
 	hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
 	SelectObject(lpdis->hDC, hBrush);
@@ -290,7 +290,7 @@
 /***********************************************************************
  *                              FILEDLG_WMMeasureItem           [internal]
  */
-static LONG FILEDLG_WMMeasureItem(HWND hWnd, WORD wParam, LONG lParam) 
+static LONG FILEDLG_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) 
 {
     BITMAP bm;
     LPMEASUREITEMSTRUCT lpmeasure;
@@ -305,7 +305,7 @@
  *                              FILEDLG_WMInitDialog            [internal]
  */
 
-static LONG FILEDLG_WMInitDialog(HWND hWnd, WORD wParam, LONG lParam) 
+static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) 
 {
   int n;
   LPOPENFILENAME lpofn;
@@ -321,7 +321,7 @@
       while(*pstr)
 	{
 	  n = strlen(pstr);
-	  strcpy(tmpstr, pstr);
+	  strncpy(tmpstr, pstr, 511); tmpstr[511]=0;
 	  printf("lpstrCustomFilter // add tmpstr='%s' ", tmpstr);
 	  SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, MAKE_SEGPTR(tmpstr));
 	  pstr += n + 1;
@@ -335,7 +335,7 @@
   while(*pstr)
     {
       n = strlen(pstr);
-      strcpy(tmpstr, pstr);
+      strncpy(tmpstr, pstr, 511); tmpstr[511]=0;
       printf("lpstrFilter // add tmpstr='%s' ", tmpstr);
       SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, MAKE_SEGPTR(tmpstr));
       pstr += n + 1;
@@ -347,8 +347,9 @@
   if (lpofn->nFilterIndex == 0 && lpofn->lpstrCustomFilter == (SEGPTR)NULL)
   	lpofn->nFilterIndex = 1;
   SendDlgItemMessage(hWnd, cmb1, CB_SETCURSEL, lpofn->nFilterIndex - 1, 0);    
-  strcpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
-	     PTR_SEG_TO_LIN(lpofn->lpstrFilter), lpofn->nFilterIndex - 1));
+  strncpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
+	     PTR_SEG_TO_LIN(lpofn->lpstrFilter), lpofn->nFilterIndex - 1),511);
+  tmpstr[511]=0;
   printf("nFilterIndex = %ld // SetText of edt1 to '%s'\n", 
   			lpofn->nFilterIndex, tmpstr);
   SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
@@ -358,7 +359,8 @@
   /* read initial directory */
   if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL) 
     {
-      strcpy(tmpstr, PTR_SEG_TO_LIN(lpofn->lpstrInitialDir));
+      strncpy(tmpstr, PTR_SEG_TO_LIN(lpofn->lpstrInitialDir), 510);
+      tmpstr[510]=0;
       if (strlen(tmpstr) > 0 && tmpstr[strlen(tmpstr)-1] != '\\' 
 	  && tmpstr[strlen(tmpstr)-1] != ':')
 	strcat(tmpstr,"\\");
@@ -380,7 +382,7 @@
 /***********************************************************************
  *                              FILEDLG_WMCommand               [internal]
  */
-static LONG FILEDLG_WMCommand(HWND hWnd, WORD wParam, LONG lParam) 
+static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) 
 {
   LONG lRet;
   LPOPENFILENAME lpofn;
@@ -437,7 +439,7 @@
       pstr = FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
 				 PTR_SEG_TO_LIN(lpofn->lpstrFilter),
 				 lRet);
-      strcpy(tmpstr2, pstr); 
+      strncpy(tmpstr2, pstr, 511); tmpstr2[511]=0;
       SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
       FILEDLG_ScanDir(hWnd, tmpstr);
       return TRUE;
@@ -456,13 +458,13 @@
 	  /* edit control contains wildcards */
 	  if (pstr != NULL)
 	    {
-	      strcpy(tmpstr2, pstr+1);
+	      strncpy(tmpstr2, pstr+1, 511); tmpstr2[511]=0;
 	      *(pstr+1) = 0;
 	    }
 	  else
 	    {
 	      strcpy(tmpstr2, tmpstr);
-	      strcpy(tmpstr, "");
+	      *tmpstr=0;
 	    }
 	  printf("commdlg: %s, %s\n", tmpstr, tmpstr2);
 	  SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
@@ -478,10 +480,11 @@
       if (lRet == LB_ERR) return TRUE;
       lpofn->nFilterIndex = lRet + 1;
       printf("commdlg: lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex);
-      strcpy(tmpstr2, 
+      strncpy(tmpstr2, 
 	     FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
 				 PTR_SEG_TO_LIN(lpofn->lpstrFilter),
-				 lRet));
+				 lRet), 511);
+      tmpstr2[511]=0;
       SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
       /* if ScanDir succeeds, we have changed the directory */
       if (FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
@@ -491,7 +494,7 @@
 	{
 	  /* strip off the pathname */
 	  *pstr = 0;
-	  strcpy(tmpstr2, pstr+1);
+	  strncpy(tmpstr2, pstr+1, 511); tmpstr2[511]=0;
 	  SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
 	  /* Should we MessageBox() if this fails? */
 	  if (!FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
@@ -506,10 +509,11 @@
 	tmpstr2[0] = 'A'+ drive;
 	tmpstr2[1] = ':';
 	tmpstr2[2] = '\\';
-	strcpy(tmpstr2 + 3, DOS_GetCurrentDir(drive));
+	strncpy(tmpstr2 + 3, DOS_GetCurrentDir(drive), 510); tmpstr2[510]=0;
 	if (strlen(tmpstr2) > 3)
 	  strcat(tmpstr2, "\\");
-	strcat(tmpstr2, tmpstr);
+	strncat(tmpstr2, tmpstr, 511-strlen(tmpstr2)); tmpstr2[511]=0;
+	printf("strcpy'ing '%s'\n",tmpstr2); fflush(stdout);
 	strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2);
       }
       lpofn->nFileOffset = 0;
@@ -525,6 +529,7 @@
 	  lRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0);
 	  SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, lRet,
 			     MAKE_SEGPTR(tmpstr));
+          printf("strcpy'ing '%s'\n",tmpstr); fflush(stdout);
 	  strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFileTitle), tmpstr);
 	}
       EndDialog(hWnd, TRUE);
@@ -873,7 +878,7 @@
 	break;
       }
   printf("\n---> '%s' ", &lpFile[i]);
-  len = min(cbBuf, strlen(&lpFile[i]) + 1);
+  len = MIN(cbBuf, strlen(&lpFile[i]) + 1);
   strncpy(lpTitle, &lpFile[i], len + 1);
   if (len != cbBuf)
     return len;
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 6667058..13f52bf 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -8,6 +8,7 @@
  */
 
 #include <ctype.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -35,6 +36,7 @@
 #include "task.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 #ifndef WINE_INI_GLOBAL
 /* Get the WINE_INI_GLOBAL definition from autoconf.h */
@@ -765,13 +767,13 @@
 	if (name)
 		return name;
 		
-	name = malloc(1024);
+	name = xmalloc(1024);
 
 	strcpy(name, DOS_GetUnixFileName(WindowsDirectory));
 	strcat(name, "/");
 	strcat(name, "win.ini");
 
-	name = realloc(name, strlen(name) + 1);
+	name = xrealloc(name, strlen(name) + 1);
 	
 	return name;
 }
@@ -858,9 +860,9 @@
     for (x=0; x <= max_open_dirs; x++) {
 	if (x == max_open_dirs) {
 	    if (DosDirs) {
-		DosDirs=(struct dosdirent*)realloc(DosDirs,(++max_open_dirs)*sizeof(DosDirs[0]));
+		DosDirs=(struct dosdirent*)xrealloc(DosDirs,(++max_open_dirs)*sizeof(DosDirs[0]));
 	    } else {
-		DosDirs=(struct dosdirent*)malloc(sizeof(DosDirs[0]));
+		DosDirs=(struct dosdirent*)xmalloc(sizeof(DosDirs[0]));
 		max_open_dirs=1;
 	    }
 	    break; /* this one is definitely not in use */
diff --git a/misc/file.c b/misc/file.c
index b9bcc06..1d18e83 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -350,7 +350,7 @@
 /***************************************************************************
  GetDriveType
  ***************************************************************************/
-UINT GetDriveType(INT drive)
+WORD GetDriveType(INT drive)
 {
 
     	dprintf_file(stddeb,"GetDriveType %c:\n",'A'+drive);
diff --git a/misc/main.c b/misc/main.c
index d8876a1..9de2fe7 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -27,6 +27,7 @@
 #define DEBUG_DEFINE_VARIABLES
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 const char people[] = "Wine is available thanks to the work of "
 "Bob Amstadt, Dag Asheim, Martin Ayotte, Ross Biro, Erik Bos, "
@@ -125,11 +126,13 @@
 /***********************************************************************
  *           MAIN_Usage
  */
+#ifndef WINELIB32
 static void MAIN_Usage( char *name )
 {
     fprintf( stderr, USAGE, name );
     exit(1);
 }
+#endif
 
 
 /***********************************************************************
@@ -165,8 +168,8 @@
     char *dummy;
     int retval;
 
-    buff_instance = (char *)malloc(strlen(Options.programName)+strlen(name)+1);
-    buff_class    = (char *)malloc( strlen(WINE_CLASS) + strlen(name) + 1 );
+    buff_instance = (char *)xmalloc(strlen(Options.programName)+strlen(name)+1);
+    buff_class    = (char *)xmalloc( strlen(WINE_CLASS) + strlen(name) + 1 );
 
     strcpy( buff_instance, Options.programName );
     strcat( buff_instance, name );
@@ -299,7 +302,7 @@
     if (!(display = XOpenDisplay( display_name )))
     {
 	fprintf( stderr, "%s: Can't open display: %s\n",
-		 argv[0], display_name ? display_name : "" );
+		 argv[0], display_name ? display_name : "(none specified)" );
 	exit(1);
     }
 
@@ -588,7 +591,11 @@
     { WF_CPU086, WF_CPU186, WF_CPU286, WF_CPU386, WF_CPU486 };
 
   /* There doesn't seem to be any Pentium flag.  */
-  long cpuflag = cpuflags[min (runtime_cpu (), 4)];
+#ifndef WINELIB
+  long cpuflag = cpuflags[MIN (runtime_cpu (), 4)];
+#else
+  long cpuflag = cpuflags[4];
+#endif
 
   if (Options.enhanced)
     return (WF_ENHANCED | cpuflag | WF_PMODE | WF_80x87 | WF_PAGING);
@@ -685,7 +692,7 @@
 					lpPortName, lpEnviron, nMaxSiz);
 	while (lpEnv != NULL) {
 		if (lpEnv->Name != NULL && strcmp(lpEnv->Name, lpPortName) == 0) {
-			nCount = min(nMaxSiz, lpEnv->wSize);
+			nCount = MIN(nMaxSiz, lpEnv->wSize);
 			memcpy(lpEnviron, lpEnv->Value, nCount);
 			printf("GetEnvironnement() // found '%s' !\n", lpEnviron);
 			return nCount;
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index 5915ce8..f0dc52f 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -317,6 +317,108 @@
 */
 #endif /* LANG(De) */
 
+#if #LANG(Da)
+/* LOCVAL(LOCALE_ILANGUAGE,"9") */
+LOCVAL(LOCALE_SLANGUAGE,"Dansk")
+LOCVAL(LOCALE_SENGLANGUAGE,"Danish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"dan")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Dansk")
+LOCVAL(LOCALE_ICOUNTRY,"45")
+LOCVAL(LOCALE_SCOUNTRY,"Danmark")
+LOCVAL(LOCALE_SENGCOUNTRY,"Denmark")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Da")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Danmark")
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9") */
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"45")
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SCURRENCY,"kr")
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+LOCVAL(LOCALE_SMONDECIMALSEP,",")
+LOCVAL(LOCALE_SMONTHOUSANDSEP,".")
+/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159) */
+/* LOCVAL(LOCALE_S2359) */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+LOCVAL(LOCALE_SDAYNAME1,"Mandag")
+LOCVAL(LOCALE_SDAYNAME2,"Tirsdag")
+LOCVAL(LOCALE_SDAYNAME3,"Onsdag")
+LOCVAL(LOCALE_SDAYNAME4,"Torsdag")
+LOCVAL(LOCALE_SDAYNAME5,"Fredag")
+LOCVAL(LOCALE_SDAYNAME6,"Lørdag")
+LOCVAL(LOCALE_SDAYNAME7,"Søndag")
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"On")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø")
+LOCVAL(LOCALE_SMONTHNAME1,"Januar")
+LOCVAL(LOCALE_SMONTHNAME2,"Februar")
+LOCVAL(LOCALE_SMONTHNAME3,"Marts")
+LOCVAL(LOCALE_SMONTHNAME4,"April")
+LOCVAL(LOCALE_SMONTHNAME5,"Maj")
+LOCVAL(LOCALE_SMONTHNAME6,"Juni")
+LOCVAL(LOCALE_SMONTHNAME7,"Juli")
+LOCVAL(LOCALE_SMONTHNAME8,"August")
+LOCVAL(LOCALE_SMONTHNAME9,"September")
+LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
+LOCVAL(LOCALE_SMONTHNAME11,"November")
+LOCVAL(LOCALE_SMONTHNAME12,"December")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+#endif /* LANG(Da) */
+
 /*Insert other languages here*/
 
 
diff --git a/misc/profile.c b/misc/profile.c
index d9067b1..7dce512 100644
--- a/misc/profile.c
+++ b/misc/profile.c
@@ -29,9 +29,9 @@
 #include "stddebug.h"
 /* #define DEBUG_PROFILE */
 #include "debug.h"
+#include "xmalloc.h"
 
 #define STRSIZE 255
-#define xmalloc(x) malloc(x)
 #define overflow (next == &CharBuffer [STRSIZE-1])
 
 enum { FirstBrace, OnSecHeader, IgnoreToEOL, KeyDef, KeyValue };
@@ -101,6 +101,8 @@
     char c;
     char path[MAX_PATH+1];
 
+    *pfullname = NULL;
+
     /* Try the Windows directory */
 
     GetWindowsDirectory(path, sizeof(path));
@@ -126,6 +128,7 @@
     }
     if (f == NULL) {
 	fprintf(stderr, "profile.c: load() can't find file %s\n", filename);
+        /* FIXME: we ought to create it now (in which directory?) */
 	return NULL;
     }
     
@@ -276,7 +279,7 @@
 			dprintf_profile(stddeb,"GetSetProfile // No more storage for enum !\n");
 			return (Size - 2);
 		}
-		slen = min(strlen(key->KeyName) + 1, left);
+		slen = MIN(strlen(key->KeyName) + 1, left);
 		dprintf_profile(stddeb,"GetSetProfile // strncpy(%p, %p, %d);\n", 
 				ReturnedString, key->Value, slen);
 		strncpy (p, key->KeyName, slen);
@@ -298,7 +301,7 @@
 		Current->changed=TRUE;
 		return 1;
 	    }
-	    slen = min(strlen(key->Value), Size - 1);
+	    slen = MIN(strlen(key->Value), Size - 1);
 	    ReturnedString[slen] = 0;
 	    strncpy (ReturnedString, key->Value, slen);
 	    dprintf_profile(stddeb,"GetSetProfile // Return ``%s''\n", ReturnedString);
@@ -310,7 +313,7 @@
 	if (set) {
 	    new_key (section, KeyName, Default);
         } else {
-	    int slen = min(strlen(Default), Size - 1);
+	    int slen = MIN(strlen(Default), Size - 1);
             ReturnedString[slen] = 0;
             strncpy(ReturnedString, Default, slen);
 	    dprintf_profile(stddeb,"GetSetProfile // Key not found\n");
@@ -327,7 +330,7 @@
 	Current->Section = section;
 	Current->changed = TRUE;
     } else {
-	int slen = min(strlen(Default), Size - 1);
+	int slen = MIN(strlen(Default), Size - 1);
 	ReturnedString[slen] = 0;
 	strncpy(ReturnedString, Default, slen);
 	dprintf_profile(stddeb,"GetSetProfile // Section not found\n");
@@ -418,7 +421,7 @@
     dump_profile (p->link);
     if(!p->changed)
 	return;
-    if ((profile = fopen (p->FullName, "w")) != NULL){
+    if (p->FullName && (profile = fopen (p->FullName, "w")) != NULL){
 	dump_sections (profile, p->Section);
 	fclose (profile);
     }
diff --git a/misc/rect.c b/misc/rect.c
index 0b5133b..c5d7985 100644
--- a/misc/rect.c
+++ b/misc/rect.c
@@ -8,9 +8,6 @@
 
 #include "windows.h"
 
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
-
 
 /***********************************************************************
  *           SetRect    (USER.72)
diff --git a/misc/shell.c b/misc/shell.c
index 12822f1..86d60ee 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -18,6 +18,7 @@
 #include "win.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 LPKEYSTRUCT	lphRootKey = NULL,lphTopKey = NULL;
 
@@ -111,7 +112,7 @@
 	 * (HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER or whatever)
 	 * -choose better filename(s)
 	 */
-	_SaveKey(HKEY_CLASSES_ROOT,"/tmp/winereg");
+	_SaveKey((HKEY)HKEY_CLASSES_ROOT,"/tmp/winereg");
 }
 
 #define BUFSIZE	256
@@ -139,10 +140,10 @@
 			lpNewKey=lpKey->lpSubLvl=(LPKEYSTRUCT)GlobalLock(hNewKey);
 			lpNewKey->hKey		= hNewKey;
 			lpNewKey->dwType	= 0;
-			lpNewKey->lpSubKey	=
-			lpNewKey->lpValue	=
-			lpNewKey->lpSubLvl	=
-			lpNewKey->lpNextKey	=
+			lpNewKey->lpSubKey	= NULL;
+			lpNewKey->lpValue	= NULL;
+			lpNewKey->lpSubLvl	= NULL;
+			lpNewKey->lpNextKey	= NULL;
 			lpNewKey->lpPrevKey	= NULL;
 			if (NULL!=(t=strchr(s,'='))) {
 				*t='\0';t++;
@@ -165,9 +166,9 @@
 		lpNewKey->lpPrevKey	= lpKey;
 		lpNewKey->hKey		= hNewKey;
 		lpNewKey->dwType	= 0;
-		lpNewKey->lpSubKey	=
-		lpNewKey->lpValue	=
-		lpNewKey->lpSubLvl	=
+		lpNewKey->lpSubKey	= NULL;
+		lpNewKey->lpValue	= NULL;
+		lpNewKey->lpSubLvl	= NULL;
 		lpNewKey->lpNextKey	= NULL;
 		if (NULL!=(t=strchr(s,'='))) {
 			*t='\0';t++;
@@ -209,7 +210,7 @@
 	dwRet=SHELL_RegCheckForRoot();
 	if (dwRet!=ERROR_SUCCESS) 
 		return;/*very bad magic, if we can't even allocate the rootkeys*/
-	_LoadKey(HKEY_CLASSES_ROOT,"/tmp/winereg");
+	_LoadKey((HKEY)HKEY_CLASSES_ROOT,"/tmp/winereg");
 }
 
 /*************************************************************************
@@ -386,7 +387,7 @@
     lpKey = (LPKEYSTRUCT)GlobalLock(hRetKey);
     if (lpKey == NULL) return ERROR_BADKEY;
     if (lpKey->lpValue != NULL) free(lpKey->lpValue);
-    lpKey->lpValue = malloc(strlen(lpVal) + 1);
+    lpKey->lpValue = xmalloc(strlen(lpVal) + 1);
     strcpy(lpKey->lpValue, lpVal);
     dprintf_reg(stddeb,"RegSetValue // successful key='%s' val='%s' !\n", lpSubKey, lpKey->lpValue);
     return ERROR_SUCCESS;
@@ -458,7 +459,7 @@
         lpKey = lpKey->lpSubLvl;
         while(lpKey != NULL){
           if (!dwSubKey){
-            len = min(dwSize-1,strlen(lpKey->lpSubKey));
+            len = MIN(dwSize-1,strlen(lpKey->lpSubKey));
 	    strncpy(lpBuf,lpKey->lpSubKey,len);
 	    lpBuf[len] = 0;
             dprintf_reg(stddeb, "RegEnumKey: found %s\n",lpBuf);
@@ -479,7 +480,7 @@
 {
  /* flips WS_EX_ACCEPTFILES bit according to the value of b (TRUE or FALSE) */
 
- dprintf_reg(stddeb,"DragAcceptFiles(%04x, %u) old exStyle %08lx\n",hWnd,b,GetWindowLong(hWnd,GWL_EXSTYLE));
+ dprintf_reg(stddeb,"DragAcceptFiles("NPFMT", %u) old exStyle %08lx\n",hWnd,b,GetWindowLong(hWnd,GWL_EXSTYLE));
 
  SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | b*(LONG)WS_EX_ACCEPTFILES); 
 }
@@ -498,7 +499,7 @@
  LPSTR		  lpCurrent;
  WORD		  i;
 
- dprintf_reg(stddeb,"DragQueryFile(%04x, %i, %p, %u)\n",
+ dprintf_reg(stddeb,"DragQueryFile("NPFMT", %i, %p, %u)\n",
                            hDrop,wFile,lpszFile,wLength);
 
  lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop); 
@@ -610,7 +611,7 @@
 	    strcat(cmd,lpFile);
 	  } else {
 	    char *s;
-	    s=malloc(len+strlen(lpFile)+10);
+	    s=xmalloc(len+strlen(lpFile)+10);
 	    strncpy(s,cmd,t-cmd);
 	    s[t-cmd]='\0';
 	    strcat(s,lpFile);
diff --git a/misc/spy.c b/misc/spy.c
index eba14fe..2d4c430 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -408,14 +408,14 @@
 		    if(msg <= WM_USER)
 		      {
 		       if(MessageTypeNames[msg])
-		          dprintf_message(stddeb,"(%04x) message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
+		          dprintf_message(stddeb,"("NPFMT") message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
 		                          hWnd, msg, MessageTypeNames[msg], wParam, lParam);
 		       else
-		          dprintf_message(stddeb,"(%04x) message [%04x] dispatched  wp=%04x lp=%08lx\n",
+		          dprintf_message(stddeb,"("NPFMT") message [%04x] dispatched  wp=%04x lp=%08lx\n",
 		                          hWnd, msg, wParam, lParam);
 		      }
 		    else
-		          dprintf_message(stddeb,"(%04x) message [%04x] WM_USER+%04d dispatched  wp=%04x lp=%08lx\n",
+		          dprintf_message(stddeb,"("NPFMT") message [%04x] WM_USER+%04d dispatched  wp=%04x lp=%08lx\n",
 		                          hWnd, msg, msg-WM_USER ,wParam ,lParam);
 		    break;
 	case SPY_SENDMESSAGE:
@@ -425,27 +425,27 @@
   		      	   lpstrSpyMessageFrom = lpstrSpyMessageFromWine;
   		    	 else
   				{
-  				   sprintf(lpstrSpyMessageFromTask, "task %04x", hTask);	
+  				   sprintf(lpstrSpyMessageFromTask, "task "NPFMT, hTask);	
   				   lpstrSpyMessageFrom = lpstrSpyMessageFromTask;
   				}
 		     
 	            if(msg <= WM_USER)
 	                {
 	                  if(MessageTypeNames[msg])
-			      dprintf_message(stddeb,"%s(%04x) message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
+			      dprintf_message(stddeb,"%s("NPFMT") message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
                                    	      lpstrSpyMessageIndent,
                                    	      hWnd, msg, MessageTypeNames[msg],
                                    	      lpstrSpyMessageFrom,
                                    	      wParam, lParam);
 	                  else
-	                      dprintf_message(stddeb,"%s(%04x) message [%04x] sent from %s wp=%04x lp=%08lx\n",
+	                      dprintf_message(stddeb,"%s("NPFMT") message [%04x] sent from %s wp=%04x lp=%08lx\n",
                                    	      lpstrSpyMessageIndent,
                                    	      hWnd, msg,
                                    	      lpstrSpyMessageFrom,
                                    	      wParam, lParam);
           		}
         	    else
-             		  dprintf_message(stddeb,"%s(%04x) message [%04x] WM_USER+%04x sent from %s wp=%04x lp=%08lx\n",
+             		  dprintf_message(stddeb,"%s("NPFMT") message [%04x] WM_USER+%04x sent from %s wp=%04x lp=%08lx\n",
                                		  lpstrSpyMessageIndent,
                                		  hWnd, msg, msg-WM_USER,
                                		  lpstrSpyMessageFrom,
@@ -461,15 +461,15 @@
 	case SPY_DEFWNDPROC:
 		    if(msg <= WM_USER)
 		        if(MessageTypeNames[msg])
-		           dprintf_message(stddeb, "%s(%04x) DefWindowProc: %s [%04x]  wp=%04x lp=%08lx\n",
+		           dprintf_message(stddeb, "%s("NPFMT") DefWindowProc: %s [%04x]  wp=%04x lp=%08lx\n",
 		                           lpstrSpyMessageIndent,
 		                           hWnd, MessageTypeNames[msg], msg, wParam, lParam );
 		        else
-		           dprintf_message(stddeb, "%s(%04x) DefWindowProc: [%04x]  wp=%04x lp=%08lx\n",
+		           dprintf_message(stddeb, "%s("NPFMT") DefWindowProc: [%04x]  wp=%04x lp=%08lx\n",
 		                           lpstrSpyMessageIndent,
 		                           hWnd, msg, wParam, lParam );
 		    else
-		        dprintf_message(stddeb, "%s(%04x) DefWindowProc: WM_USER+%d [%04x] wp=%04x lp=%08lx\n",
+		        dprintf_message(stddeb, "%s("NPFMT") DefWindowProc: WM_USER+%d [%04x] wp=%04x lp=%08lx\n",
 		                        lpstrSpyMessageIndent,
 		                        hWnd, msg - WM_USER, msg, wParam, lParam );
 		    break;
@@ -493,11 +493,11 @@
   switch(iFlag)
     {
 	case SPY_RESULT_INVALIDHWND: 
-		dprintf_message(stddeb,"%s(%04x) message [%04x] HAS INVALID HWND\n",
+		dprintf_message(stddeb,"%s("NPFMT") message [%04x] HAS INVALID HWND\n",
                                 lpstrSpyMessageIndent, hWnd, msg);
 	        break;
 	case SPY_RESULT_OK:
-		dprintf_message(stddeb,"%s(%04x) message [%04x] returned %08lx\n",
+		dprintf_message(stddeb,"%s("NPFMT") message [%04x] returned %08lx\n",
 	                        lpstrSpyMessageIndent, hWnd, msg, lReturn);
 		break;
 	default:
diff --git a/misc/user32.c b/misc/user32.c
index 5a4c02f..b91b749 100644
--- a/misc/user32.c
+++ b/misc/user32.c
@@ -115,7 +115,7 @@
 BOOL USER32_EndPaint(DWORD hwnd,struct WIN32_PAINTSTRUCT *lpps)
 {
 	PAINTSTRUCT ps;
-	ps.hdc=lpps->hdc;
+	ps.hdc=(HDC)lpps->hdc;
 	ps.fErase=lpps->fErase;
 	ps.rcPaint.top=lpps->rcPaint.top;
 	ps.rcPaint.left=lpps->rcPaint.left;
diff --git a/misc/winsocket.c b/misc/winsocket.c
index 23675a1..52baf78 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -91,7 +91,9 @@
 };
 static struct WinSockHeap *Heap;
 static HANDLE HeapHandle;
+#ifndef WINELIB32
 static int ScratchPtr;
+#endif
 
 #ifndef WINELIB
 #define GET_SEG_PTR(x)	MAKELONG((int)((char*)(x)-(char*)Heap),	\
@@ -110,6 +112,7 @@
 			inet_ntoa(((struct sockaddr_in *)a)->sin_addr), \
 			ntohs(((struct sockaddr_in *)a)->sin_port))
 
+#ifndef WINELIB32
 static void ResetScratch()
 {
 	ScratchPtr=0;
@@ -131,6 +134,7 @@
 	strcpy(ret,s);
 	return GET_SEG_PTR(ret);
 }
+#endif
 
 static WORD wsaerrno(void)
 {
@@ -141,7 +145,7 @@
                 			errno, sys_errlist[errno]);
 #else
                 fprintf(stderr, "winsock: errno %d, (%s).\n", 
-                			errno, strerror(errno));
+					errno, strerror(errno));
 #endif
 #else
                 fprintf(stderr, "winsock: errno %d\n", errno);
@@ -151,6 +155,7 @@
         switch(errno)
         {
 	case EINTR:		return WSAEINTR;
+	case EBADF:		return WSAEBADF;
 	case EACCES:		return WSAEACCES;
 	case EFAULT:		return WSAEFAULT;
 	case EINVAL:		return WSAEINVAL;
@@ -158,7 +163,6 @@
 	case EWOULDBLOCK:	return WSAEWOULDBLOCK;
 	case EINPROGRESS:	return WSAEINPROGRESS;
 	case EALREADY:		return WSAEALREADY;
-	case EBADF:
 	case ENOTSOCK:		return WSAENOTSOCK;
 	case EDESTADDRREQ:	return WSAEDESTADDRREQ;
 	case EMSGSIZE:		return WSAEMSGSIZE;
@@ -195,6 +199,8 @@
 	case EDQUOT:		return WSAEDQUOT;
 	case ESTALE:		return WSAESTALE;
 	case EREMOTE:		return WSAEREMOTE;
+/* just in case we ever get here and there are no problems */
+	case 0:			return 0;
 
 #ifdef EDQUOT
         default:
@@ -209,9 +215,50 @@
 	wsa_errno = wsaerrno();
 }
 
+
+static WORD wsaherrno(void)
+{
+#if DEBUG_WINSOCK
+#ifndef sun
+#if defined(__FreeBSD__)
+                fprintf(stderr, "winsock: h_errno %d, (%s).\n", 
+                			h_errno, sys_errlist[h_errno]);
+#else
+                fprintf(stderr, "winsock: h_errno %d.\n", h_errno);
+		herror("wine: winsock: wsaherrno");
+#endif
+#else
+                fprintf(stderr, "winsock: h_errno %d\n", h_errno);
+#endif
+#endif
+
+        switch(h_errno)
+        {
+	case TRY_AGAIN:		return WSATRY_AGAIN;
+	case HOST_NOT_FOUND:	return WSAHOST_NOT_FOUND;
+	case NO_RECOVERY:	return WSANO_RECOVERY;
+	case NO_DATA:		return WSANO_DATA; 
+/* just in case we ever get here and there are no problems */
+	case 0:			return 0;
+
+#ifdef EDQUOT
+        default:
+#endif
+		fprintf(stderr, "winsock: unknown h_errorno %d!\n", h_errno);
+		return WSAEOPNOTSUPP;
+	}
+}
+
+
+static void herrno_to_wsaerrno(void)
+{
+	wsa_errno = wsaherrno();
+}
+
+
 static void convert_sockopt(INT *level, INT *optname)
 {
-/* $%#%!@! why couldn't they use the same values for both winsock and unix ? */
+/* $%#%!#! why couldn't they use the same values for both winsock and unix ? */
 
 	switch (*level) {
 		case -1: 
@@ -376,7 +423,11 @@
 	dump_sockaddr(name);
 
 	if (getpeername(s, name, (int *) namelen) < 0) {
-        	errno_to_wsaerrno();
+		if (h_errno < 0) {
+        		errno_to_wsaerrno();
+		} else {
+			herrno_to_wsaerrno();
+		}
         	return SOCKET_ERROR;
 	}
 	return 0;
@@ -386,7 +437,11 @@
 {
 	dprintf_winsock(stddeb, "WSA_getsockname: socket: %d, ptr %8x, ptr %8x\n", s, (int) name, (int) *namelen);
 	if (getsockname(s, name, (int *) namelen) < 0) {
-        	errno_to_wsaerrno();
+		if (h_errno < 0) {
+        		errno_to_wsaerrno();
+		} else {
+			herrno_to_wsaerrno();
+		}
         	return SOCKET_ERROR;
 	}
 	return 0;
@@ -596,6 +651,10 @@
     }
     
     if (sock > 0xffff) {
+	/* we set the value of wsa_errno directly, because 
+	 * only support socket numbers up to 0xffff. The
+	 * value return indicates there are no descriptors available
+	 */
 	wsa_errno = WSAEMFILE;
 	return INVALID_SOCKET;
     }
@@ -616,7 +675,11 @@
 	dprintf_winsock(stddeb, "WSA_gethostbyaddr: ptr %8x, len %d, type %d\n", (int) addr, len, type);
 
 	if ((host = gethostbyaddr(addr, len, type)) == NULL) {
-        	errno_to_wsaerrno();
+		if (h_errno < 0) {
+        		errno_to_wsaerrno();
+		} else {
+			herrno_to_wsaerrno();
+		}
         	return NULL;
 	}
 	CONVERT_HOSTENT(&Heap->hostent_addr, host);
@@ -634,7 +697,11 @@
 	dprintf_winsock(stddeb, "WSA_gethostbyname: %s\n", name);
 
 	if ((host = gethostbyname(name)) == NULL) {
-        	errno_to_wsaerrno();
+		if (h_errno < 0) {
+        		errno_to_wsaerrno();
+		} else {
+			herrno_to_wsaerrno();
+		}
         	return NULL;
 	}
 	CONVERT_HOSTENT(&Heap->hostent_name, host);
@@ -647,7 +714,11 @@
 	dprintf_winsock(stddeb, "WSA_gethostname: name %s, len %d\n", name, namelen);
 
 	if (gethostname(name, namelen) < 0) {
-        	errno_to_wsaerrno();
+		if (h_errno < 0) {
+        		errno_to_wsaerrno();
+		} else {
+			herrno_to_wsaerrno();
+		}
         	return SOCKET_ERROR;
 	}
 	return 0;
@@ -663,7 +734,11 @@
 	dprintf_winsock(stddeb, "WSA_getprotobyname: name %s\n", name);
 
 	if ((proto = getprotobyname(name)) == NULL) {
-        	errno_to_wsaerrno();
+		if (h_errno < 0) {
+        		errno_to_wsaerrno();
+		} else {
+			herrno_to_wsaerrno();
+		}
         	return NULL;
 	}
 	CONVERT_PROTOENT(&Heap->protoent_name, proto);
@@ -681,7 +756,11 @@
 	dprintf_winsock(stddeb, "WSA_getprotobynumber: num %d\n", number);
 
 	if ((proto = getprotobynumber(number)) == NULL) {
-        	errno_to_wsaerrno();
+		if (h_errno < 0) {
+        		errno_to_wsaerrno();
+		} else {
+			herrno_to_wsaerrno();
+		}
         	return NULL;
 	}
 	CONVERT_PROTOENT(&Heap->protoent_number, proto);
@@ -702,7 +781,11 @@
 	dprintf_winsock(stddeb, "WSA_getservbyname: name %s, proto %s\n", name, proto);
 
 	if ((service = getservbyname(name, proto)) == NULL) {
-        	errno_to_wsaerrno();
+		if (h_errno < 0) {
+        		errno_to_wsaerrno();
+		} else {
+			herrno_to_wsaerrno();
+		}
         	return NULL;
 	}
 	CONVERT_SERVENT(&Heap->servent_name, service);
@@ -720,7 +803,11 @@
 	dprintf_winsock(stddeb, "WSA_getservbyport: port %d, name %s\n", port, proto);
 
 	if ((service = getservbyport(port, proto)) == NULL) {
-        	errno_to_wsaerrno();
+		if (h_errno < 0) {
+        		errno_to_wsaerrno();
+		} else {
+			herrno_to_wsaerrno();
+		}
         	return NULL;
 	}
 	CONVERT_SERVENT(&Heap->servent_port, service);
@@ -742,7 +829,8 @@
 {
 	struct ipc_packet message;
 
-	if (msgrcv(wine_key, (struct msgbuf*)&message, 
+/* FIXME: something about no message of desired type */
+	if (msgrcv(wine_key, (struct msgbuf*)&(message), 
 		   IPC_PACKET_SIZE, MTYPE, IPC_NOWAIT) == -1)
 		perror("wine: msgrcv");
 
@@ -759,7 +847,7 @@
 }
 
 
-static void send_message(HANDLE handle, HWND hWnd, u_int wMsg, long lParam)
+static void send_message( HWND hWnd, u_int wMsg, HANDLE handle, long lParam)
 {
 	struct ipc_packet message;
 	
@@ -773,7 +861,8 @@
 		"WSA: send (hwnd "NPFMT", wMsg %d, handle "NPFMT", lParam %ld)\n",
 		hWnd, wMsg, handle, lParam);
 	
-	if (msgsnd(wine_key, (struct msgbuf*)&message,  
+/* FIXME: something about invalid argument */
+	if (msgsnd(wine_key, (struct msgbuf*)&(message),  
 		   IPC_PACKET_SIZE, IPC_NOWAIT) == -1)
 		perror("wine: msgsnd");
 		
@@ -793,6 +882,11 @@
 		return handle;
 	} else {
 		if ((host = gethostbyaddr(addr, len, type)) == NULL) {
+			if (h_errno < 0) {
+        			errno_to_wsaerrno();
+			} else {
+				herrno_to_wsaerrno();
+			}
 			send_message(hWnd, wMsg, handle, wsaerrno() << 16);
 			exit(0);
 		}
@@ -815,6 +909,11 @@
 		return handle;
 	} else {
 		if ((host = gethostbyname(name)) == NULL) {
+			if (h_errno < 0) {
+        			errno_to_wsaerrno();
+			} else {
+				herrno_to_wsaerrno();
+			}
 			send_message(hWnd, wMsg, handle, wsaerrno() << 16);
 			exit(0);
 		}
@@ -837,6 +936,11 @@
 		return handle;
 	} else {
 		if ((proto = getprotobyname(name)) == NULL) {
+			if (h_errno < 0) {
+        			errno_to_wsaerrno();
+			} else {
+				herrno_to_wsaerrno();
+			}
 			send_message(hWnd, wMsg, handle, wsaerrno() << 16);
 			exit(0);
 		}
@@ -859,6 +963,11 @@
 		return handle;
 	} else {
 		if ((proto = getprotobynumber(number)) == NULL) {
+			if (h_errno < 0) {
+        			errno_to_wsaerrno();
+			} else {
+				herrno_to_wsaerrno();
+			}
 			send_message(hWnd, wMsg, handle, wsaerrno() << 16);
 			exit(0);
 		}
@@ -881,6 +990,11 @@
 		return handle;
 	} else {
 		if ((service = getservbyname(name, proto)) == NULL) {
+			if (h_errno < 0) {
+        			errno_to_wsaerrno();
+			} else {
+				herrno_to_wsaerrno();
+			}
 			send_message(hWnd, wMsg, handle, wsaerrno() << 16);
 			exit(0);
 		}
@@ -903,6 +1017,11 @@
 		return handle;
 	} else {
 		if ((service = getservbyport(port, proto)) == NULL) {
+			if (h_errno < 0) {
+        			errno_to_wsaerrno();
+			} else {
+				herrno_to_wsaerrno();
+			}
 			send_message(hWnd, wMsg, handle, wsaerrno() << 16);
 			exit(0);
 		}
@@ -946,8 +1065,8 @@
 				event |= FD_READ;
 			if (FD_ISSET(s, &write_fds))
 				event |= FD_WRITE;
-
-			send_message(hWnd, wMsg, s, (wsaerrno() << 16) | event);
+	/* FIXME: the first time through we get a winsock error of 2, why? */
+			send_message(hWnd, wMsg, (HANDLE)s, (wsaerrno() << 16) | event);
 		}
 	}
 }
@@ -1049,7 +1168,7 @@
     /* ipc stuff */
 
     if ((wine_key = msgget(IPC_PRIVATE, 0600)) == -1)
-	perror("wine: msgget");
+	perror("wine: msgget"); 
 
     signal(SIGUSR1, recv_message);
 
diff --git a/misc/xmalloc.c b/misc/xmalloc.c
new file mode 100644
index 0000000..24dcef5
--- /dev/null
+++ b/misc/xmalloc.c
@@ -0,0 +1,44 @@
+/*
+   xmalloc - a safe malloc
+
+   Use this function instead of malloc whenever you don't intend to check
+   the return value yourself, for instance because you don't have a good
+   way to handle a zero return value.
+
+   Typically, Wine's own memory requests should be handles by this function,
+   while the client's should use malloc directly (and Wine should return an
+   error to the client if allocation fails).
+
+   Copyright 1995 by Morten Welinder.
+
+*/
+
+#include <stdio.h>
+#include "xmalloc.h"
+
+void *
+xmalloc (size_t size)
+{
+    void *res;
+
+    res = malloc (size ? size : 1);
+    if (res == NULL)
+    {
+        fprintf (stderr, "Virtual memory exhausted.\n");
+        exit (1);
+    }
+    return res;
+}
+
+
+void *
+xrealloc (void *ptr, size_t size)
+{
+    void *res = realloc (ptr, size);
+    if (res == NULL)
+    {
+        fprintf (stderr, "Virtual memory exhausted.\n");
+        exit (1);
+    }
+    return res;
+}
diff --git a/miscemu/dosmem.c b/miscemu/dosmem.c
index fd673ee..4568eb8 100644
--- a/miscemu/dosmem.c
+++ b/miscemu/dosmem.c
@@ -13,6 +13,7 @@
 #include "ldt.h"
 #include "miscemu.h"
 #include "module.h"
+#include "xmalloc.h"
 
 
 HANDLE DOSMEM_BiosSeg;  /* BIOS data segment at 0x40:0 */
@@ -90,7 +91,7 @@
 
     /* Allocate 7 64k segments for 0000, A000, B000, C000, D000, E000, F000. */
 
-    dosmem = malloc( 0x70000 );
+    dosmem = xmalloc( 0x70000 );
 
     MODULE_SetEntryPoint( hModule, 183,  /* KERNEL.183: __0000H */
                           GLOBAL_CreateBlock( GMEM_FIXED, dosmem,
diff --git a/miscemu/instr.c b/miscemu/instr.c
index 83f7cef..09daf43 100644
--- a/miscemu/instr.c
+++ b/miscemu/instr.c
@@ -429,10 +429,10 @@
 
 	      if (outp)
 		/* FIXME: Check segment readable.  */
-		;
+		(void)0;
 	      else
 		/* FIXME: Check segment writeable.  */
-		;
+		(void)0;
 
 	      if (repX)
 		if (long_addr)
diff --git a/miscemu/int21.c b/miscemu/int21.c
index 30862a6..0228602 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -799,8 +799,10 @@
 {
 	char temp[256];
 	int handle;
-	
-	sprintf(temp,"%s\\win%d.tmp",TempDirectory,(int) getpid());
+	static int counter = 0;
+
+	sprintf(temp,"%s\\win%d.%03d",TempDirectory,(int) getpid(), counter);
+        counter = (counter + 1) % 1000;
 
 	dprintf_int(stddeb,"CreateTempFile %s\n",temp);
 
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index 79fe669..3ea208f 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -22,6 +22,7 @@
 #include "mmsystem.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 extern MCI_OPEN_DRIVER_PARMS	mciDrv[MAXMCIDRIVERS];
 
@@ -1393,7 +1394,7 @@
 		len+=strlen(keywords[i])+1;
 		i++;
 	}
-	s=(char*)malloc(len);
+	s=(char*)xmalloc(len);
 	*s='\0';
 	while (i<nrofkeywords) {
 		strcat(s,keywords[i]);
@@ -1445,7 +1446,7 @@
 		len+=strlen(keywords[i])+1;
 		i++;
 	}
-	s=(char*)malloc(len);
+	s=(char*)xmalloc(len);
 	*s='\0';
 	while (i<nrofkeywords) {
 		strcat(s,keywords[i]);
@@ -1569,7 +1570,7 @@
 		len+=strlen(keywords[i])+1;
 		i++;
 	}
-	s=(char*)malloc(len);
+	s=(char*)xmalloc(len);
 	*s='\0';
 	while (i<nrofkeywords) {
 		strcat(s,keywords[i]);
@@ -1941,7 +1942,7 @@
 						break;
 					j++;
 				}
-				s=(char*)malloc(len);
+				s=(char*)xmalloc(len);
 				strcpy(s,keywords[i+1]+1);
 				k=j;j=i+2;
 				while (j<=k) {
@@ -2010,7 +2011,7 @@
 						break;
 					j++;
 				}
-				s=(char*)malloc(len);
+				s=(char*)xmalloc(len);
 				strcpy(s,keywords[i+1]+1);
 				k=j;j=i+2;
 				while (j<=k) {
@@ -2105,7 +2106,7 @@
 		i=1;/* nrofkeywords = nrofspaces+1 */
 		s=args;
 		while ((s=strchr(s,' '))!=NULL) i++,s++;
-		keywords=(char**)malloc(sizeof(char*)*(i+2));
+		keywords=(char**)xmalloc(sizeof(char*)*(i+2));
 		nrofkeywords=i;
 		s=args;i=0;
 		while (s && i<nrofkeywords) {
@@ -2116,7 +2117,7 @@
 		keywords[i]=NULL;
 	} else {
 		nrofkeywords=0;
-		keywords=(char**)malloc(sizeof(char*));
+		keywords=(char**)xmalloc(sizeof(char*));
 	}
 	dwFlags = 0; /* default flags */
 	for (i=0;i<nrofkeywords;) {
diff --git a/multimedia/midi.c b/multimedia/midi.c
index faa61b5..b734ecd 100644
--- a/multimedia/midi.c
+++ b/multimedia/midi.c
@@ -19,6 +19,7 @@
 #include "ldt.h"
 #include "driver.h"
 #include "mmsystem.h"
+#include "xmalloc.h"
 
 #include "stddebug.h"
 #include "debug.h"
@@ -520,7 +521,7 @@
 		dprintf_midi(stddeb, "MIDI_mciRecord // MCI_TO=%d \n", end);
 		}
 	lpMidiHdr = &MCIMidiDev[wDevID].MidiHdr;
-	lpMidiHdr->lpData = (LPSTR) malloc(1200);
+	lpMidiHdr->lpData = (LPSTR) xmalloc(1200);
 	lpMidiHdr->dwBufferLength = 1024;
 	lpMidiHdr->dwUser = 0L;
 	lpMidiHdr->dwFlags = 0L;
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index db3e707..81f1c1b 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -23,6 +23,7 @@
 #include "mmsystem.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 static int	InstalledCount;
 static int	InstalledListLen;
@@ -533,7 +534,7 @@
 			msgptr = "Unknown MCI Error !\n";
 			break;
 		}
-	maxbuf = min(uLength - 1, strlen(msgptr));
+	maxbuf = MIN(uLength - 1, strlen(msgptr));
 	if (maxbuf > 0) strncpy(lpstrBuffer, msgptr, maxbuf);
 	lpstrBuffer[maxbuf + 1] = '\0';
 	return(TRUE);
@@ -699,7 +700,7 @@
 			if (lpInstallNames == NULL) {
 				InstalledCount = 0;
 				InstalledListLen = 0;
-				ptr = lpInstallNames = malloc(2048);
+				ptr = lpInstallNames = xmalloc(2048);
 				GetPrivateProfileString("mci", NULL, "", lpInstallNames, 2000, SysFile);
 				while(strlen(ptr) > 0) {
 					dprintf_mci(stddeb, "---> '%s' \n", ptr);
@@ -900,7 +901,7 @@
 			msgptr = "Unknown MIDI Error !\n";
 			break;
 		}
-	maxbuf = min(uSize - 1, strlen(msgptr));
+	maxbuf = MIN(uSize - 1, strlen(msgptr));
 	if (maxbuf > 0) strncpy(lpText, msgptr, maxbuf);
 	lpText[maxbuf + 1] = '\0';
 	return(TRUE);
@@ -1356,7 +1357,7 @@
 			msgptr = "Unknown MMSYSTEM Error !\n";
 			break;
 		}
-	maxbuf = min(uSize - 1, strlen(msgptr));
+	maxbuf = MIN(uSize - 1, strlen(msgptr));
 	if (maxbuf > 0) strncpy(lpText, msgptr, maxbuf);
 	lpText[maxbuf + 1] = '\0';
 	return(TRUE);
diff --git a/multimedia/time.c b/multimedia/time.c
index 5193abd..c9e7f22 100644
--- a/multimedia/time.c
+++ b/multimedia/time.c
@@ -135,7 +135,7 @@
     if (lpNewTimer == NULL)
 	return 0;
     while (lpTimer != NULL) {
-	wNewID = max(wNewID, lpTimer->wTimerID);
+	wNewID = MAX(wNewID, lpTimer->wTimerID);
 	if (lpTimer->Next == NULL)
 	    break;
 	lpTimer = lpTimer->Next;
diff --git a/objects/bitblt.c b/objects/bitblt.c
index ae7dd30..89ae404 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -17,6 +17,7 @@
 #include "stddebug.h"
 /* #define DEBUG_BITBLT */
 #include "debug.h"
+#include "xmalloc.h"
 
 
 #define DST 0   /* Destination drawable */
@@ -1063,11 +1064,11 @@
                                       dcSrc, xSrc, ySrc, widthSrc, heightSrc,
                                       &visRectSrc, &visRectDst ))
             return TRUE;
-        dprintf_bitblt( stddeb, "    vissrc=%d,%d-%d,%d visdst=%d,%d-%d,%d\n",
-                        visRectSrc.left, visRectSrc.top,
-                        visRectSrc.right, visRectSrc.bottom,
-                        visRectDst.left, visRectDst.top,
-                        visRectDst.right, visRectDst.bottom );
+        dprintf_bitblt( stddeb, "    vissrc=%ld,%ld-%ld,%ld visdst=%ld,%ld-%ld,%ld\n",
+                        (LONG)visRectSrc.left, (LONG)visRectSrc.top,
+                        (LONG)visRectSrc.right, (LONG)visRectSrc.bottom,
+                        (LONG)visRectDst.left, (LONG)visRectDst.top,
+                        (LONG)visRectDst.right, (LONG)visRectDst.bottom );
     }
     else
     {
@@ -1075,9 +1076,9 @@
         if (!BITBLT_GetVisRectangles( dcDst, xDst, yDst, widthDst, heightDst,
                                       NULL, 0, 0, 0, 0, NULL, &visRectDst ))
             return TRUE;
-        dprintf_bitblt( stddeb, "    vissrc=none visdst=%d,%d-%d,%d\n",
-                        visRectDst.left, visRectDst.top,
-                        visRectDst.right, visRectDst.bottom );
+        dprintf_bitblt( stddeb, "    vissrc=none visdst=%ld,%ld-%ld,%ld\n",
+                        (LONG)visRectDst.left, (LONG)visRectDst.top,
+                        (LONG)visRectDst.right, (LONG)visRectDst.bottom );
     }
 
     width  = visRectDst.right - visRectDst.left;
diff --git a/objects/brush.c b/objects/brush.c
index 982920a..1034c40 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -11,6 +11,7 @@
 #include "color.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 #define NB_HATCH_STYLES  6
 
diff --git a/objects/clipping.c b/objects/clipping.c
index e6a3335..08e65d7 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -311,8 +311,9 @@
     RECT tmpRect;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
-    dprintf_clipping(stddeb,"RectVisible: "NPFMT" %d,%dx%d,%d\n",
-                     hdc, rect->left, rect->top, rect->right, rect->bottom );
+    dprintf_clipping(stddeb,"RectVisible: "NPFMT" %ld,%ldx%ld,%ld\n",
+                     hdc, (LONG)rect->left, (LONG)rect->top, (LONG)rect->right,
+		     (LONG)rect->bottom );
     if (!dc->w.hGCClipRgn) return FALSE;
     /* copy rectangle to avoid overwriting by LPtoDP */
     tmpRect = *rect;
diff --git a/objects/color.c b/objects/color.c
index 5941340..41e222c 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -12,6 +12,7 @@
 #include "gdi.h"
 #include "color.h"
 #include "palette.h"
+#include "xmalloc.h"
 
 Colormap COLOR_WinColormap = 0;
 int COLOR_FixedMap = 0;
@@ -126,8 +127,8 @@
 
     if ((COLOR_WinColormap == DefaultColormapOfScreen(screen)) && (screenDepth <= 8))
     {
-        COLOR_PaletteToPixel = (int *)malloc( sizeof(int) * size );
-        COLOR_PixelToPalette = (int *)malloc( sizeof(int) * size );
+        COLOR_PaletteToPixel = (int *)xmalloc( sizeof(int) * size );
+        COLOR_PixelToPalette = (int *)xmalloc( sizeof(int) * size );
         for (i = 0; i < size; i++)  /* Set the default mapping */
             COLOR_PaletteToPixel[i] = COLOR_PixelToPalette[i] = i;
     }
@@ -334,6 +335,7 @@
             idx = color & 0xffff;
             if (idx >= palPtr->logpalette.palNumEntries)
             {
+                fprintf(stderr, "COLOR_ToPhysical(%lx) : idx %d is out of bounds, assuming black\n", color, idx);
                 /* out of bounds */
                 red = green = blue = 0;
             }
@@ -375,12 +377,20 @@
     }
     if (dc&&dc->u.x.pal.mappingSize)
     {
-        if (index >= dc->u.x.pal.mappingSize) return 0;
+        if (index >= dc->u.x.pal.mappingSize)
+        {
+            fprintf(stderr, "COLOR_ToPhysical(%lx) : idx %d is >= dc->u.x.pal.mappingSize, assuming pixel 0\n", color, index);
+            return 0;
+        }
         mapping = (WORD *) GDI_HEAP_LIN_ADDR( dc->u.x.pal.hMapping );
     }
     else
     {
-        if (index >= NB_RESERVED_COLORS) return 0;
+        if (index >= NB_RESERVED_COLORS)
+        {
+            fprintf(stderr, "COLOR_ToPhysical(%lx) : idx %d is >= NB_RESERVED_COLORS, assuming pixel 0\n", color, index);
+	    return 0;
+        }
         mapping = (WORD *) GDI_HEAP_LIN_ADDR( hSysColorTranslation );
     }
     if (mapping) return mapping[index];
@@ -425,20 +435,6 @@
 
 
 /***********************************************************************
- *           GetNearestColor    (GDI.154)
- */
-COLORREF GetNearestColor( HDC hdc, COLORREF color )
-{
-    WORD index;
-    DC *dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return 0;
-    if (screenDepth > 8) return color; /* FIXME */
-    index = (WORD)(COLOR_ToPhysical( dc, color & 0xffffff ) & 0xffff);
-    return PALETTEINDEX( index );
-}
-
-
-/***********************************************************************
  *           RealizeDefaultPalette    (GDI.365)
  */
 WORD RealizeDefaultPalette( HDC hdc )
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 6cc3f2a..fcb553e 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -32,6 +32,7 @@
 #include "win.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 
 Cursor CURSORICON_XCursor = None;  /* Current X cursor */
@@ -278,8 +279,8 @@
 
     size = DIB_BitmapInfoSize( bmi, DIB_RGB_COLORS );
     /* Make sure we have room for the monochrome bitmap later on */
-    size = max( size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD) );
-    pInfo = (BITMAPINFO *)malloc( size );
+    size = MAX( size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD) );
+    pInfo = (BITMAPINFO *)xmalloc( size );
     memcpy( pInfo, bmi, size );
 
     if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
@@ -442,7 +443,7 @@
 
     return CURSORICON_Load( hInstance, name,
                             SYSMETRICS_CXICON, SYSMETRICS_CYICON,
-                            min( 16, 1 << screenDepth ), FALSE );
+                            MIN( 16, 1 << screenDepth ), FALSE );
 }
 
 
@@ -506,7 +507,7 @@
  */
 HICON CopyIcon( HANDLE hInstance, HICON hIcon )
 {
-    dprintf_icon( stddeb, "CopyIcon: %04x %04x\n", hInstance, hIcon );
+    dprintf_icon( stddeb, "CopyIcon: "NPFMT" "NPFMT"\n", hInstance, hIcon );
     return CURSORICON_Copy( hInstance, hIcon );
 }
 
@@ -516,7 +517,7 @@
  */
 HCURSOR CopyCursor( HANDLE hInstance, HCURSOR hCursor )
 {
-    dprintf_cursor( stddeb, "CopyCursor: %04x %04x\n", hInstance, hCursor );
+    dprintf_cursor( stddeb, "CopyCursor: "NPFMT" "NPFMT"\n", hInstance, hCursor );
     return CURSORICON_Copy( hInstance, hCursor );
 }
 
@@ -526,8 +527,9 @@
  */
 BOOL DestroyIcon( HICON hIcon )
 {
-    dprintf_icon( stddeb, "DestroyIcon: %04x\n", hIcon );
-    return GlobalFree( hIcon );
+    dprintf_icon( stddeb, "DestroyIcon: "NPFMT"\n", hIcon );
+    /* FIXME: should check for OEM icon here */
+    return (GlobalFree( hIcon ) != 0);
 }
 
 
@@ -536,8 +538,9 @@
  */
 BOOL DestroyCursor( HCURSOR hCursor )
 {
-    dprintf_cursor( stddeb, "DestroyCursor: %04x\n", hCursor );
-    return GlobalFree( hCursor );
+    dprintf_cursor( stddeb, "DestroyCursor: "NPFMT"\n", hCursor );
+    /* FIXME: should check for OEM cursor here */
+    return (GlobalFree( hCursor ) != 0);
 }
 
 
@@ -628,7 +631,7 @@
         if (!(ptr = (CURSORICONINFO*)GlobalLock( hCursor ))) return FALSE;
         if (ptr->bPlanes * ptr->bBitsPerPixel != 1)
         {
-            fprintf( stderr, "Cursor %04x has more than 1 bpp!\n", hCursor );
+            fprintf( stderr, "Cursor "NPFMT" has more than 1 bpp!\n", hCursor );
             return FALSE;
         }
 
@@ -672,22 +675,26 @@
              * bits on the screen) to black. This require some boolean
              * arithmetic:
              *
-             *   Windows                        X11
-             * Xor    And      Result      Bits     Mask
-             *  0      0     black          0        1
-             *  0      1     no change      X        0
-             *  1      0     white          1        1
-             *  1      1     inverted       0        1  (=black)
+             *         Windows          |          X11
+             * Xor    And      Result   |   Bits     Mask     Result
+             *  0      0     black      |    0        1     background
+             *  0      1     no change  |    X        0     no change
+             *  1      0     white      |    1        1     foreground
+             *  1      1     inverted   |    0        1     background
              *
              * which gives:
-             *  Bits = 'Xor' xor 'And'
+             *  Bits = 'Xor' and not 'And'
              *  Mask = 'Xor' or not 'And'
+             *
+             * FIXME: apparently some servers do support 'inverted' color.
+             * I don't know if it's correct per the X spec, but maybe
+             * we ought to take advantage of it.  -- AJ
              */
             XCopyArea( display, pixmapAll, pixmapBits, BITMAP_monoGC,
                        0, 0, ptr->nWidth, ptr->nHeight, 0, 0 );
             XCopyArea( display, pixmapAll, pixmapMask, BITMAP_monoGC,
                        0, 0, ptr->nWidth, ptr->nHeight, 0, 0 );
-            XSetFunction( display, BITMAP_monoGC, GXxor );
+            XSetFunction( display, BITMAP_monoGC, GXandReverse );
             XCopyArea( display, pixmapAll, pixmapBits, BITMAP_monoGC,
                        0, ptr->nHeight, ptr->nWidth, ptr->nHeight, 0, 0 );
             XSetFunction( display, BITMAP_monoGC, GXorReverse );
@@ -740,7 +747,7 @@
     HCURSOR hOldCursor;
 
     if (hCursor == hActiveCursor) return hActiveCursor;  /* No change */
-    dprintf_cursor( stddeb, "SetCursor: %04x\n", hCursor );
+    dprintf_cursor( stddeb, "SetCursor: "NPFMT"\n", hCursor );
     hOldCursor = hActiveCursor;
     hActiveCursor = hCursor;
     /* Change the cursor shape only if it is visible */
@@ -755,7 +762,7 @@
 void SetCursorPos( short x, short y )
 {
     dprintf_cursor( stddeb, "SetCursorPos: x=%d y=%d\n", x, y );
-    XWarpPointer( display, None, rootWindow, 0, 0, 0, 0, x, y );
+    XWarpPointer( display, rootWindow, rootWindow, 0, 0, 0, 0, x, y );
 }
 
 
@@ -818,7 +825,8 @@
 	pt->x = rootX + desktopX;
 	pt->y = rootY + desktopY;
     }
-    dprintf_cursor(stddeb, "GetCursorPos: ret=%d,%d\n", pt->x, pt->y );
+    dprintf_cursor(stddeb, "GetCursorPos: ret=%ld,%ld\n", (LONG)pt->x, 
+		   (LONG)pt->y );
 }
 
 
@@ -836,7 +844,7 @@
  */
 WORD GetIconID( HANDLE hResource, DWORD resType )
 {
-    fprintf( stderr, "GetIconId(%04x,%ld): empty stub!\n",
+    fprintf( stderr, "GetIconId("NPFMT",%ld): empty stub!\n",
              hResource, resType );
     return 0;
 }
@@ -847,7 +855,7 @@
  */
 HICON LoadIconHandler( HANDLE hResource, BOOL bNew )
 {
-    fprintf( stderr, "LoadIconHandle(%04x,%d): empty stub!\n",
+    fprintf( stderr, "LoadIconHandle("NPFMT",%d): empty stub!\n",
              hResource, bNew );
     return 0;
 }
diff --git a/objects/dc.c b/objects/dc.c
index 7dbd68e..41c981a 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -14,6 +14,7 @@
 #include "color.h"
 #include "debug.h"
 #include "font.h"
+#include "xmalloc.h"
 
 static DeviceCaps * displayDevCaps = NULL;
 
@@ -463,7 +464,7 @@
 
     if (!displayDevCaps)
     {
-	displayDevCaps = (DeviceCaps *) malloc( sizeof(DeviceCaps) );
+	displayDevCaps = (DeviceCaps *) xmalloc( sizeof(DeviceCaps) );
 	DC_FillDevCaps( displayDevCaps );
     }
 
diff --git a/objects/dib.c b/objects/dib.c
index 1082b74..3c02046 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -16,6 +16,7 @@
 #include "stddebug.h"
 #include "color.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 
 /***********************************************************************
@@ -280,7 +281,7 @@
 	BYTE *begin = bits;
 
         lines--;
-	while ((INT)lines >= 0)
+	while ((short)lines >= 0)
         {
 		length = *bits++;
 		if (length) {	/* encoded */
@@ -451,7 +452,7 @@
 			   * what caused the previous implementation to 
 			   * fail.			[JAY]
 			   */
-			  line=0; /* Cause exit from do loop. */
+			  line=-1; /* Cause exit from do loop. */
 			  break;
 		      }
 		      
@@ -511,7 +512,7 @@
 	    }  /* process either an encoded sequence or an escape sequence */
 	  
 	  /* We expect to come here more than once per line. */
-      } while (line > 0);  /* Do this until the bitmap is filled */
+      } while (line >= 0);  /* Do this until the bitmap is filled */
     
     /*
      * Everybody comes here at the end.
diff --git a/objects/font.c b/objects/font.c
index b1a89a8..be7ac76 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -518,8 +518,9 @@
     size->cy = abs((dc->u.x.font.fstruct->ascent+dc->u.x.font.fstruct->descent)
 		    * dc->w.WndExtY / dc->w.VportExtY);
 
-    dprintf_font(stddeb,"GetTextExtentPoint("NPFMT" '%*.*s' %d %p): returning %d,%d\n",
-	    hdc, count, count, str, count, size, size->cx, size->cy );
+    dprintf_font(stddeb,"GetTextExtentPoint("NPFMT" '%*.*s' %d %p): returning %ld,%ld\n",
+		 hdc, count, count, str, count, size, (LONG)size->cx, 
+		 (LONG)size->cy );
     return TRUE;
 }
 
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index b2434125..7f0e6a3 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -18,6 +18,7 @@
 #include "stddebug.h"
 /* #define DEBUG_GDI */
 #include "debug.h"
+#include "xmalloc.h"
 
 LPSTR GDI_Heap = NULL;
 WORD GDI_HeapSel = 0;
@@ -200,7 +201,7 @@
 	int	       	i = 1;
 	if (hNewObj == 0) return FALSE;
 	if (lpPenBrushList == NULL) {
-		lpPenBrushList = malloc(MAX_OBJ * sizeof(HANDLE));
+		lpPenBrushList = xmalloc(MAX_OBJ * sizeof(HANDLE));
 		lpPenBrushList[0] = 0;
 		dprintf_gdi(stddeb,"GDI_AppendToPenBrushList() lpPenBrushList allocated !\n");
 	}
@@ -495,7 +496,7 @@
       if (header->wMagic == PEN_MAGIC) {
 	PEN_GetObject( (PENOBJ *)header, sizeof(LOGPEN), lpLog);
 	dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnStyle=%04X\n", ((LPLOGPEN)lpLog)->lopnStyle);
-	dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnWidth=%d\n", ((LPLOGPEN)lpLog)->lopnWidth.x);
+	dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnWidth=%ld\n", (LONG)((LPLOGPEN)lpLog)->lopnWidth.x);
 	dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnColor=%08lX\n", ((LPLOGPEN)lpLog)->lopnColor);
       }
       nRet = CallEnumObjectsProc(lpEnumFunc, GDI_HEAP_SEG_ADDR(hLog),
diff --git a/objects/metafile.c b/objects/metafile.c
index 9628e99..e1d176e 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -50,6 +50,7 @@
   strcpy(mf->Filename, lpFilename);
   mf->wMagic = METAFILE_MAGIC;
   if ((mf->hFile = _lopen(lpFilename, OF_READ)) == HFILE_ERROR) {
+    GlobalFree(mf->hMetaHdr);
     GlobalFree(hmf);
     return 0;
   }
@@ -60,13 +61,16 @@
   }
   _lclose(mf->hFile);
 
+  if (mh->mtType != 1) {
+    GlobalFree(mf->hMetaHdr);
+    GlobalFree(hmf);
+    return 0;
+  }
 
   GlobalUnlock(mf->hMetaHdr);
   GlobalUnlock(hmf);
-  if (mh->mtType != 1)
-    return 0;
-  else
-    return hmf;
+  return hmf;
+
 }
 
 /******************************************************************
@@ -86,11 +90,14 @@
     if (!handle) return 0;
     dc = (DC *)GDI_HEAP_LIN_ADDR(handle);
 
-    if (!(dc->w.hMetaFile = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILE))))
+    if (!(dc->w.hMetaFile = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILE)))) {
+        GDI_FreeObject(handle);
 	return 0;
+    }
     mf = (METAFILE *)GlobalLock(dc->w.hMetaFile);
     if (!(mf->hMetaHdr = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAHEADER))))
     {
+        GDI_FreeObject(handle);
 	GlobalFree(dc->w.hMetaFile);
 	return 0;
     }
@@ -108,7 +115,12 @@
     {
 	mh->mtType = 1;
 	strcpy(mf->Filename, lpFilename);
+#ifndef WINELIB
 	mf->hFile = _lcreat(lpFilename, 0);
+#else
+        /* temporary fix until _lcreate works under WINELIB */
+	mf->hFile = creat(lpFilename, 0666);
+#endif
 	if (_lwrite(mf->hFile, (char *)mh, MFHEADERSIZE) == -1)
 	{
 	    GlobalFree(mf->hMetaHdr);
@@ -194,7 +206,7 @@
 {
     METAFILE *mf = (METAFILE *)GlobalLock(hmf);
 
-    if (mf->wMagic != METAFILE_MAGIC)
+    if (!mf || mf->wMagic != METAFILE_MAGIC)
 	return FALSE;
 
     GlobalFree(mf->hMetaHdr);
@@ -437,7 +449,7 @@
 
     case META_POLYPOLYGON:
       PolyPolygon(hdc, (LPPOINT)(mr->rdParam + *(mr->rdParam) + 1),
-		  (mr->rdParam + 1), *(mr->rdParam)); 
+		  (LPINT)(mr->rdParam + 1), *(mr->rdParam)); 
       break;
 
     case META_POLYLINE:
@@ -499,12 +511,130 @@
 		     CreateBrushIndirect((LOGBRUSH *)(&(mr->rdParam))));
 	break;
 
+    /* W. Magro: Some new metafile operations.  Not all debugged. */
+    case META_CREATEPALETTE:
+	MF_AddHandle(ht, nHandles, 
+		     CreatePalette((LPLOGPALETTE)mr->rdParam));
+	break;
+
+    case META_SETTEXTALIGN:
+        fprintf(stderr,"PlayMetaFileRecord: SETTEXTALIGN: %hd\n",mr->rdParam[0]);
+	SetTextAlign(hdc, *(mr->rdParam));
+	break;
+
+    case META_SELECTPALETTE:
+	SelectPalette(hdc, *(ht->objectHandle + *(mr->rdParam+1)),*(mr->rdParam));
+	break;
+
+    case META_SETMAPPERFLAGS:
+	SetMapperFlags(hdc, *(mr->rdParam));
+	break;
+
+    case META_REALIZEPALETTE:
+	RealizePalette(hdc);
+	break;
+
+    case META_ESCAPE:
+	dprintf_metafile(stddeb,"PlayMetaFileRecord: META_ESCAPE unimplemented.\n");
+        break;
+
+    case META_EXTTEXTOUT: /* FIXME: don't know the exact parameters here */
+        {
+        short x,y,options,x5,x6,x7,x8;
+        y=mr->rdParam[0];  /* X position */
+        x=mr->rdParam[1];  /* Y position */
+        s1=mr->rdParam[2]; /* String length */
+        options=mr->rdParam[3];
+        x5=mr->rdParam[(s1+1)/2+4]; /* unknown meaning */
+        x6=mr->rdParam[(s1+1)/2+5]; /* unknown meaning */
+        x7=mr->rdParam[(s1+1)/2+6]; /* unknown meaning */
+        x8=mr->rdParam[(s1+1)/2+7]; /* unknown meaning */
+	ExtTextOut(hdc, x, y, options, (LPRECT) &mr->rdParam[(s1+1)/2+4], (char *)(mr->rdParam + 4), s1, NULL);
+	/* fprintf(stderr,"EXTTEXTOUT (len: %d) %hd : %hd %hd %hd %hd [%s].\n",
+            (mr->rdSize-s1),options,x5,x6,x7,x8,(char*) &(mr->rdParam[4]) );*/
+        }
+        break;
+        /* End new metafile operations. */
+
     default:
-	fprintf(stderr,"PlayMetaFileRecord: Unknown record type %x\n",
+	fprintf(stddeb,"PlayMetaFileRecord: Unknown record type %x\n",
 	                                      mr->rdFunction);
     }
 }
 
+/******************************************************************
+ *         GetMetaFileBits		by William Magro, 19 Sep 1995
+ *
+ * Trade in a meta file object handle for a handle to the meta file memory
+ */
+HANDLE GetMetaFileBits(HMETAFILE hmf)
+{
+
+    /* save away the meta file bits handle */
+    METAFILE *mf = (METAFILE *)GlobalLock(hmf);
+    HANDLE hMem = mf->hMetaHdr;
+    METAHEADER *mh = (METAHEADER *)GlobalLock(hMem);
+
+    dprintf_metafile(stddeb,"GetMetaFileBits: hmf in: %x\n", hmf);
+
+    /* can't get bits of disk based metafile */
+    /* FIXME: should the disk file be loaded in this case? */
+    if(mh->mtType == 1) {
+        fprintf(stderr,
+            "GetMetaFileBits: application requested bits of disk meta file.\n");
+        GlobalUnlock(hMem);
+        GlobalUnlock(hmf);
+        return FALSE;
+    }
+    
+    /* unlock the memory and invalidate the metafile handle */
+    GlobalUnlock(hMem);
+    GlobalFree(hmf);
+
+    dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: %x\n", hMem);
+
+    return hMem;
+}
+
+/******************************************************************
+ *         SetMetaFileBits		by William Magro, 19 Sep 1995
+ *
+ * Trade in a meta file memory handle for a handle to a meta file object
+ */
+HMETAFILE SetMetaFileBits(HANDLE hMem)
+{
+    HMETAFILE hmf;
+    METAFILE *mf;
+    METAHEADER *mh = (METAHEADER *)GlobalLock(hMem);
+
+    dprintf_metafile(stddeb,"SetMetaFileBits: hMem in: %x\n", hMem);
+
+    if (!mh) return FALSE;
+
+    /* now it is a memory meta file */
+    mh->mtType = 0;
+
+    hmf = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILE));
+    mf = (METAFILE *)GlobalLock(hmf);
+    if (!mf) {
+      GlobalUnlock(hMem);
+      GlobalFree(hmf);
+      return FALSE;
+    }
+
+    /* use the supplied memory handle */
+    mf->hMetaHdr = hMem;
+    mf->wMagic = METAFILE_MAGIC;
+    mf->MetaOffset = mh->mtHeaderSize * 2;
+    mf->hFile = mf->hBuffer = (HANDLE) NULL;
+
+    GlobalUnlock(hMem);
+    GlobalUnlock(hmf);
+
+    dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: %x\n", hmf);
+
+    return hmf;
+}
 
 /******************************************************************
  *         MF_WriteRecord
@@ -538,7 +668,7 @@
     }
 
     mh->mtSize += rlen / 2;
-    mh->mtMaxRecord = max(mh->mtMaxRecord, rlen / 2);
+    mh->mtMaxRecord = MAX(mh->mtMaxRecord, rlen / 2);
     GlobalUnlock(mf->hMetaHdr);
     return TRUE;
 }
diff --git a/objects/palette.c b/objects/palette.c
index 7fa2cfe..ccd0b42 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -23,6 +23,56 @@
 
 static WORD SystemPaletteUse = SYSPAL_STATIC;	/* currently not considered */
 
+
+/***********************************************************************
+ *           PALETTE_GetNearestIndexAndColor
+ */
+static WORD PALETTE_GetNearestIndexAndColor(HPALETTE hpalette, COLORREF *color)
+{
+    int i, minDist, dist;
+    WORD index = 0;
+    BYTE r, g, b;
+    PALETTEENTRY * entry;
+    PALETTEOBJ * palPtr;
+    
+    palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hpalette, PALETTE_MAGIC );
+    if (!palPtr) return 0;
+
+    if ((COLOR_WinColormap != DefaultColormapOfScreen(screen)) &&
+	(hpalette == STOCK_DEFAULT_PALETTE))
+    {
+	if ((*color & 0xffffff) == 0) return 0;  /* Entry 0 is black */
+	if ((*color & 0xffffff) == 0xffffff)     /* Max entry is white */
+	    return palPtr->logpalette.palNumEntries - 1;
+    }
+    
+    r = GetRValue(*color);
+    g = GetGValue(*color);
+    b = GetBValue(*color);
+
+    entry = palPtr->logpalette.palPalEntry;
+    for (i = 0, minDist = MAXINT; minDist !=0 &&
+         i < palPtr->logpalette.palNumEntries ; i++)
+    {
+	if (entry->peFlags != 0xff)
+	{
+	    dist = (r - entry->peRed) * (r - entry->peRed) +
+		   (g - entry->peGreen) * (g - entry->peGreen) +
+		   (b - entry->peBlue) * (b - entry->peBlue);	
+	    if (dist < minDist)
+	    {
+		minDist = dist;
+		index = i;
+	    }
+	}
+	entry++;
+    }
+    entry = &palPtr->logpalette.palPalEntry[index];
+    *color = RGB( entry->peRed, entry->peGreen, entry->peBlue );
+    return index;
+}
+
+
 /***********************************************************************
  *           CreatePalette    (GDI.360)
  */
@@ -145,51 +195,30 @@
  */
 WORD GetNearestPaletteIndex( HPALETTE hpalette, COLORREF color )
 {
-    int i, minDist, dist;
-    WORD index = 0;
-    BYTE r, g, b;
-    PALETTEENTRY * entry;
-    PALETTEOBJ * palPtr;
-    
-    palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hpalette, PALETTE_MAGIC );
-    if (!palPtr) return 0;
-
-    if ((COLOR_WinColormap != DefaultColormapOfScreen(screen)) &&
-	(hpalette == STOCK_DEFAULT_PALETTE))
-    {
-	if ((color & 0xffffff) == 0) return 0;  /* Entry 0 is black */
-	if ((color & 0xffffff) == 0xffffff)     /* Max entry is white */
-	    return palPtr->logpalette.palNumEntries - 1;
-    }
-    
-    r = GetRValue(color);
-    g = GetGValue(color);
-    b = GetBValue(color);
-
-    entry = palPtr->logpalette.palPalEntry;
-    for (i = 0, minDist = MAXINT; minDist !=0 &&
-         i < palPtr->logpalette.palNumEntries ; i++)
-    {
-	if (entry->peFlags != 0xff)
-	{
-	    dist = (r - entry->peRed) * (r - entry->peRed) +
-		   (g - entry->peGreen) * (g - entry->peGreen) +
-		   (b - entry->peBlue) * (b - entry->peBlue);	
-	    if (dist < minDist)
-	    {
-		minDist = dist;
-		index = i;
-	    }
-	}
-	entry++;
-    }
+    WORD index = PALETTE_GetNearestIndexAndColor( hpalette, &color );
     dprintf_palette(stddeb,"GetNearestPaletteIndex("NPFMT",%06lx): returning %d\n", 
-	     hpalette, color, index );
+                    hpalette, color, index );
     return index;
 }
 
 
 /***********************************************************************
+ *           GetNearestColor    (GDI.154)
+ */
+COLORREF GetNearestColor( HDC hdc, COLORREF color )
+{
+    COLORREF nearest = color;
+    DC *dc;
+
+    if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
+    PALETTE_GetNearestIndexAndColor( dc->w.hPalette, &nearest );
+    dprintf_palette(stddeb,"GetNearestColor(%06lx): returning %06lx\n", 
+                    color, nearest );
+    return nearest;
+}
+
+
+/***********************************************************************
  *           PALETTE_GetObject
  */
 int PALETTE_GetObject( PALETTEOBJ * palette, int count, LPSTR buffer )
diff --git a/objects/region.c b/objects/region.c
index 5be23ff..73adc51 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -240,7 +240,7 @@
 /***********************************************************************
  *           CreatePolygonRgn    (GDI.63)
  */
-HRGN CreatePolygonRgn( POINT * points, short count, short mode )
+HRGN CreatePolygonRgn( POINT * points, INT count, INT mode )
 {
     return CreatePolyPolygonRgn( points, &count, 1, mode );
 }
@@ -249,8 +249,8 @@
 /***********************************************************************
  *           CreatePolyPolygonRgn    (GDI.451)
  */
-HRGN CreatePolyPolygonRgn( POINT * points, short * count,
-			   short nbpolygons, short mode )
+HRGN CreatePolyPolygonRgn( POINT * points, INT * count,
+			   INT nbpolygons, INT mode )
 {
     RGNOBJ * obj;
     HRGN hrgn;
diff --git a/objects/text.c b/objects/text.c
index fd94b10..3b6ec22 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -15,6 +15,7 @@
 #include "stddebug.h"
 /* #define DEBUG_TEXT */
 #include "debug.h"
+#include "xmalloc.h"
 
 #define TAB     9
 #define LF     10
@@ -196,8 +197,9 @@
     int width = rect->right - rect->left;
     int max_width = 0;
 
-    dprintf_text(stddeb,"DrawText: '%s', %d , [(%d,%d),(%d,%d)]\n", str, count,
-	   rect->left, rect->top, rect->right, rect->bottom);
+    dprintf_text(stddeb,"DrawText: '%s', %d , [(%ld,%ld),(%ld,%ld)]\n", str,
+		 count, (LONG)rect->left, (LONG)rect->top, (LONG)rect->right, 
+		 (LONG)rect->bottom);
     
     if (count == -1) count = strlen(str);
     strPtr = str;
@@ -307,8 +309,9 @@
     dprintf_text(stddeb,"ExtTextOut: %d,%d '%*.*s', %d  flags=%d\n",
             x, y, count, count, str, count, flags);
     if (lprect != NULL) {
-      dprintf_text(stddeb, "rect %d %d %d %d\n",
-		   lprect->left, lprect->top, lprect->right, lprect->bottom );
+      dprintf_text(stddeb, "rect %ld %ld %ld %ld\n", (LONG)lprect->left,
+		   (LONG)lprect->top, (LONG)lprect->right,
+		   (LONG)lprect->bottom );
     }
 
       /* Setup coordinates */
@@ -418,7 +421,7 @@
     {
         XTextItem *items, *pitem;
 
-        items = malloc( count * sizeof(XTextItem) );
+        items = xmalloc( count * sizeof(XTextItem) );
         for (i = 0, pitem = items; i < count; i++, pitem++)
         {
             pitem->chars  = str + i;
diff --git a/rc/winerc.c b/rc/winerc.c
index afdd89e..06f8396 100644
--- a/rc/winerc.c
+++ b/rc/winerc.c
@@ -34,6 +34,20 @@
 int transform_binary_file(void);
 int yyparse(void);
 
+static void *xmalloc (size_t size)
+{
+    void *res;
+
+    res = malloc (size ? size : 1);
+    if (res == NULL)
+    {
+        fprintf (stderr, "Virtual memory exhausted.\n");
+        exit (1);
+    }
+    return res;
+}
+
+
 int main(int argc,char *argv[])
 {  
 	extern int yydebug;
@@ -130,10 +144,8 @@
 
 /*create a new gen_res, initial size 100*/
 gen_res *new_res()
-{	gen_res* ret=malloc(sizeof(gen_res)+100);
+{	gen_res* ret=xmalloc(sizeof(gen_res)+100);
 	int i;
-	if(!ret)
-		fprintf(stderr,"Out of memory\n"),exit(1);
 	for(i=0;i<sizeof(gen_res)+100;i++)*((char*)ret+i)='\0';
 	ret->g_next=g_start;
 	ret->g_prev=0;
@@ -188,7 +200,7 @@
 /*create a new style*/
 rc_style *new_style()
 {
-	rc_style *ret=malloc(sizeof(rc_style));
+	rc_style *ret=xmalloc(sizeof(rc_style));
 	/*initially, no bits have to be reset*/
 	ret->and=-1;
 	/*initially, no bits are set*/
@@ -464,6 +476,7 @@
 gen_res *add_popup(char *name,short flags, gen_res* body, gen_res*res)
 {
 	char c_flags[2];
+	flags|=MF_POPUP;
 	if(res->num_entries==0)flags|=MF_END;
 	put_WORD(c_flags,flags);
 	res=insert_at_beginning(res,body->res,body->size);
@@ -617,7 +630,7 @@
 /* translate "Hello,\\tworld!\\10" to "Hello,\tworld!\n" */
 char *parse_c_string(char *in)
 {
-	char *out=malloc(strlen(in)-1);
+	char *out=xmalloc(strlen(in)-1);
 	char *it;
 	char tmp[5],*tend;
 	for(it=out,in++;*in;in++)
diff --git a/toolkit/Makefile.in b/toolkit/Makefile.in
index 73f8746..55745dd 100644
--- a/toolkit/Makefile.in
+++ b/toolkit/Makefile.in
@@ -19,9 +19,21 @@
 hello2: hello2.o ../winelib.a
 	gcc -g -o hello2 hello2.o ../winelib.a -lm $(X_LIBS) -lXpm $(XLIB)
 
+hello3: hello3res.o hello3.o
+	gcc -g -o hello3 hello3.o hello3res.o ../winelib.a -lm $(X_LIBS) -lXpm $(XLIB)
+
+hello3.o:   hello3res.o
+
+hello3res.o:    hello3res.rc
+	echo "#include \"windows.h\"" >hello3res.rct
+	echo WINDOWS_H_ENDS_HERE >>hello3res.rct
+	cat hello3res.rc  >>hello3res.rct
+	$(CC) $(ALLCFLAGS) -E -x c -P hello3res.rct | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | ../rc/winerc -o hello3res -v -p hello3
+	gcc -c hello3res.c
+
 @MAKE_RULES@
 
 clean::
-	$(RM) hello hello2
+	$(RM) hello hello2 hello3
 
 ### Dependencies:
diff --git a/toolkit/README.resources b/toolkit/README.resources
new file mode 100644
index 0000000..2ceb5a7
--- /dev/null
+++ b/toolkit/README.resources
@@ -0,0 +1,91 @@
+This is a short discussion of resources in WineLib.
+
+Introduction
+Resources are used to store dialogs, menus, bitmaps, icons, 
+version information, strings, fonts, and accelerators.
+In a Win3.1 programming environment, there are three file formats for 
+resources:
+- the RC script, which is human-readable and can be processed by a resource
+compiler
+- the .RES file, which is the output of the resource compiler
+- the .EXE and .DLL files, which store resources as a part of the NE
+file format
+For WineLib, only a part of this is supported. In particular, there is no
+.RES file, the executable is not a NE file (as it is a native Unix executable),
+and some resource types are not implemented: icons, version information,
+strings, and fonts.
+
+Building a WineLib application
+The build process assumes that the C source files and the resource script
+is available. At the moment, a single resource script is recommended.
+This script is processed by winerc:
+1) the preprocessor is used to resolve symbolic style name (LBS_STANDARD, ...)
+into numbers. This involves processing windows.h
+2) the unused parts of windows.h (type definitions) are removed. This would
+not be necessary if Wine's windows.h would use the RC_INVOKED macro.
+3) winerc is invoked to create a binary representation of the resources.
+This representation is stored as C source code (arrays).
+4) gcc is used to compile the generated C code.
+Now, each resource is available as a C array to the application. As the 
+executable is not in the NE format, it is not possible to retrieve resource
+locations in the executable via name. Instead, the resources have to be
+referenced with their generated C array names. The linker then resolves
+these names in the compiled resource file.
+5) The program sources are compiled and linked with the output of step 4.
+A sample build process is in toolkit/Makefile:hello3.
+
+Required changes to the program sources
+Because loading the resources from an instance handle is not possible,
+the *Indirect functions have to be used to load a resource. The C arrays
+can be directly passed to the *Indirect functions. So, instead of writing
+
+	hMenu=LoadMenu(hInstance,"MAIN");
+
+write
+
+	hMenu=LoadMenuIndirect(hello3_MENU_MAIN.bytes);
+
+Fortunately, the Windows API has the following functions available:
+DialogBoxIndirect
+CreateDialogIndirect
+DialogBoxIndirectParam
+CreateDialogIndirectParam
+
+LoadMenuIndirect
+SetDIBitsToDevice
+
+Sample code is available in hello3.c. hello3res.c contains the corresponding
+resources.
+
+Keeping a common source
+Clearly, changing the sources is not very desirable, and suggestions how
+to reduce the amount of work are welcome. In the meantime, two approaches
+allow at least to remain a common source between the Win3.1 code and the
+WineLib code:
+1) conditional compiles:
+When compiling a WineLib application, WINELIB is defined. This can be used
+to select Wine-specific code.
+2) usage of winerc for Windows: The *Indirect functions are available on
+plain Win3.1, and the resource format is fully compatible. Thus, recompiling
+sources modified for WineLib on Win3.1 is possible and known to work.
+
+Open problems
+1) Icons and cursors: For these resources, there is no *Indirect function
+documented. In addition, both are implemented by a set of two resources.
+This is the reason why they are not supported by winerc.
+2) Accelerators: Although winerc supports accelerators, there is no 
+LoadAcceleratorIndirect function. A work-around would be to define one.
+3) Fonts: Font resources are not supported by Wine at all.
+4) String tables: Although string tables are not supported by winerc, there
+is no reason not to add such support. Again, some indirect loading would
+be necessary.
+5) API requires loading by name: At some places, the name of a resource
+is passed instead of a handle. The WNDCLASS structure contains the name
+of a menu resource, and the icon in a dialog box is referenced by its name.
+(Are there some more places?)
+Clearly, loading the resource by name would be highly desirable. The
+resource compiler currently creates a structure containing all resources
+defined in an RC file. However, it is not clear how WINELIB could find the
+location of this structure, especially, when there is more than one RC file.
+
+
diff --git a/toolkit/atom.c b/toolkit/atom.c
index 26ae445..48fbfbe 100644
--- a/toolkit/atom.c
+++ b/toolkit/atom.c
@@ -10,6 +10,7 @@
 #include <ctype.h>
 
 #include "windows.h"
+#include "xmalloc.h"
 
 #ifdef CONFIG_IPC
 #include "dde_atom.h"
@@ -90,7 +91,7 @@
     }
     if(!FirstUnused)
     {
-      *tableptr = malloc(sizeof(ATOMtoHANDLEtable));
+      *tableptr = xmalloc(sizeof(ATOMtoHANDLEtable));
       (*tableptr)->next = NULL;
       for(i=0; i<16; i++)
       {
diff --git a/toolkit/heap.c b/toolkit/heap.c
index 370f7c6..75faefc 100644
--- a/toolkit/heap.c
+++ b/toolkit/heap.c
@@ -8,9 +8,11 @@
 
 /* #ifndef __STDC__ */
 #include <malloc.h>
+#include <stdio.h>
 #include <string.h>
 /* #endif */
 #include "windows.h"
+#include "xmalloc.h"
 
 #ifdef WINELIB16
 
@@ -39,7 +41,7 @@
     }
 
     /* No free slots */
-    last->next = malloc (sizeof (handle_table_t));
+    last->next = xmalloc (sizeof (handle_table_t));
     table = last->next;
     memset (table, 0, sizeof (handle_table_t));
     i = 0;
@@ -131,7 +133,7 @@
 {
     void **m = HEAP_FindSlot (hMem);
 
-    realloc (*m, bytes);
+    xrealloc (*m, bytes);
 }
 
 WORD LocalSize (HANDLE hMem)
@@ -140,7 +142,7 @@
 }
 
 
-BOOL LocalUnLock (HANDLE hMem)
+BOOL LocalUnlock (HANDLE hMem)
 {
     return 0;
 }
@@ -162,7 +164,7 @@
 
 BOOL GlobalUnlock (HANDLE hMem)
 {
-    return LocalUnLock (hMem);
+    return LocalUnlock (hMem);
 }
 
 WORD GlobalFlags (HANDLE hMem)
@@ -208,9 +210,47 @@
 #endif
 
 #else /* WINELIB16 */
+
+#ifdef DEBUG_HEAP
+static void* LastTwenty[20]={ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0  };
+
+void CheckMem(void* f)
+{
+  int i;
+
+  for(i=0; i<20; i++)
+  {
+    if(LastTwenty[i]==f)
+      LastTwenty[i]=NULL;
+    else if(LastTwenty[i])
+      if( *((int*)LastTwenty[i]) != 0x12345678  ||
+	  *(((int*)LastTwenty[i])+1) != 0x0fedcba9 )
+	fprintf(stderr,"memory corrupted at %p\n",LastTwenty[i]);
+  }
+  fflush(stderr);
+}
+
+void NewMem(void* n)
+{
+  int i;
+  for(i=0; i<20; i++)
+    if(!LastTwenty[i])
+    {
+      LastTwenty[i]=n;
+      return;
+    }
+  for(i=0; i<20; i++)
+    LastTwenty[i]=LastTwenty[i+1];
+  LastTwenty[4]=n;
+}
+#endif
+
 HANDLE LocalAlloc (WORD flags, WORD bytes)
 {
     HANDLE m;
+#ifdef DEBUG_HEAP
+    bytes+=2*sizeof(int);
+#endif
 
     if (flags & LMEM_WINE_ALIGN)
 	m = memalign (4, bytes);
@@ -220,6 +260,14 @@
 	if (flags & LMEM_ZEROINIT)
 	    bzero (m, bytes);
     }
+#ifdef DEBUG_HEAP
+    CheckMem(NULL);
+    *((int*) m)=0x12345678;
+    *(((int*) m)+1)=0x0fedcba9;
+    fprintf(stderr,"%p malloc'd\n",m); fflush(stderr);
+    NewMem(m);
+    return (HANDLE) (((int*)m)+2);
+#endif
     return m;
 }
 
@@ -235,7 +283,24 @@
 
 HANDLE LocalFree (HANDLE hMem)
 {
+#ifdef DEBUG_HEAP
+    hMem=(HANDLE) (((int*)hMem)-2);
+    CheckMem(hMem);
+    fprintf(stderr,"%p free-ing...",hMem);
+    if( *((int*)hMem) != 0x12345678  ||
+        *(((int*)hMem)+1) != 0x0fedcba9 )
+      fprintf(stderr,"memory corrupted...");
+    else
+    { 
+      *((int*)hMem) = 0x9abcdef0;
+      *(((int*)hMem)+1) = 0x87654321;
+    }
+    fflush(stderr);
+#endif
     free(hMem);
+#ifdef DEBUG_HEAP
+    fprintf(stderr,"free'd\n"); fflush(stderr);
+#endif
     return 0;
 }
 
@@ -251,8 +316,11 @@
 
 HANDLE LocalReAlloc (HANDLE hMem, WORD flags, WORD bytes)
 {
-    realloc(hMem, bytes);
-    return hMem;
+#ifdef DEBUG_HEAP
+    LocalFree(hMem);
+    return LocalAlloc(flags,bytes); 
+#endif
+    return realloc(hMem, bytes);
 }
 
 WORD LocalSize (HANDLE hMem)
@@ -262,7 +330,7 @@
 }
 
 
-BOOL LocalUnLock (HANDLE hMem)
+BOOL LocalUnlock (HANDLE hMem)
 {
     return 0;
 }
@@ -284,7 +352,7 @@
 
 BOOL GlobalUnlock (HANDLE hMem)
 {
-    return LocalUnLock (hMem);
+    return LocalUnlock (hMem);
 }
 
 WORD GlobalFlags (HANDLE hMem)
diff --git a/toolkit/hello3.c b/toolkit/hello3.c
new file mode 100644
index 0000000..c688cec
--- /dev/null
+++ b/toolkit/hello3.c
@@ -0,0 +1,85 @@
+#include <windows.h>
+#include "hello3res.h"
+
+BOOL CALLBACK DlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
+{
+	switch(msg)
+	{
+		case WM_INITDIALOG:
+			return 1;
+		case WM_COMMAND:
+		if(wParam==100)
+			DestroyWindow(hWnd);
+		return 0;
+	}
+	return 0;
+}
+
+LRESULT WndProc (HWND wnd, UINT msg, WPARAM w, LPARAM l)
+{
+    switch (msg){
+
+	case WM_COMMAND:
+	switch(w){
+		case 100:
+			CreateDialogIndirect(0,hello3_DIALOG_DIADEMO.bytes,wnd,(WNDPROC)DlgProc);
+			return 0;
+		case 101:
+		{
+			BITMAPINFO *bm=hello3_BITMAP_BITDEMO.bytes;
+			char *bits=bm;
+			HDC hdc=GetDC(wnd);
+			bits+=bm->bmiHeader.biSize;
+			bits+=(1<<bm->bmiHeader.biBitCount)*sizeof(RGBQUAD);
+			SetDIBitsToDevice(hdc,0,0,bm->bmiHeader.biWidth,
+				bm->bmiHeader.biHeight,0,0,0,bm->bmiHeader.biHeight,
+				bits,bm,DIB_RGB_COLORS);
+			ReleaseDC(wnd,hdc);
+			return 0;
+		}
+		default:
+			return DefWindowProc (wnd, msg, w, l);
+	}
+    case WM_DESTROY:
+	PostQuitMessage (0);
+	break;
+
+    default:
+	return DefWindowProc (wnd, msg, w, l);
+    }
+    return 0l;
+}
+
+int PASCAL WinMain (HANDLE inst, HANDLE prev, LPSTR cmdline, int show)
+{
+    HWND     wnd;
+    MSG      msg;
+    WNDCLASS class;
+
+    if (!prev){
+	class.style = CS_HREDRAW | CS_VREDRAW;
+	class.lpfnWndProc = WndProc;
+	class.cbClsExtra = 0;
+	class.cbWndExtra = 0;
+	class.hInstance  = inst;
+	class.hIcon      = LoadIcon (0, IDI_APPLICATION);
+	class.hCursor    = LoadCursor (0, IDC_ARROW);
+	class.hbrBackground = GetStockObject (WHITE_BRUSH);
+	class.lpszMenuName = 0;
+	class.lpszClassName = (SEGPTR)"class";
+    }
+    if (!RegisterClass (&class))
+	return FALSE;
+
+    wnd = CreateWindow ("class", "Test app", WS_OVERLAPPEDWINDOW,
+			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 
+			LoadMenuIndirect(hello3_MENU_MAIN.bytes), inst, 0);
+    ShowWindow (wnd, show);
+    UpdateWindow (wnd);
+
+    while (GetMessage (&msg, 0, 0, 0)){
+	TranslateMessage (&msg);
+	DispatchMessage (&msg);
+    }
+    return 0;
+}
diff --git a/toolkit/hello3res.rc b/toolkit/hello3res.rc
new file mode 100644
index 0000000..23f29c5
--- /dev/null
+++ b/toolkit/hello3res.rc
@@ -0,0 +1,32 @@
+MAIN MENU 
+{
+ POPUP "Menu demo" {
+   MENUITEM "Dialog Demo", 100
+   MENUITEM "Bitmap Demo", 101
+ }
+}
+
+DIADEMO DIALOG 20, 20, 179, 118
+STYLE DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_VISIBLE | WS_SYSMENU
+CAPTION "Dialog demo"
+FONT 8, "Helv"
+BEGIN
+	CONTROL "Pushbutton", 100, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 14, 92, 52, 13
+	CONTROL "Checkbox", 101, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 19, 76, 47, 12
+	CONTROL "Static text", 102, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 17, 60, 39, 10
+#if 0
+	/* Edit controls don't work, yet */
+	CONTROL "Edit control", 103, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 18, 41, 44, 13
+#endif
+	CONTROL "Radio button", 104, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 17, 23, 58, 12
+	CONTROL "Checkbox", 101, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 19, 76, 47, 12
+#if 0
+	CONTROL "", 106, "COMBOBOX", CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 86, 23, 86, 85
+#else
+	CONTROL "", 106, "LISTBOX", LBS_STANDARD | LBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 86, 23, 86, 85
+#endif
+END
+
+
+BITDEMO BITMAP "../rc/winelogo.bmp"
+
diff --git a/toolkit/miscstubs.c b/toolkit/miscstubs.c
index 5db9016..ddeeb49 100644
--- a/toolkit/miscstubs.c
+++ b/toolkit/miscstubs.c
@@ -11,6 +11,7 @@
 #include "windows.h"
 #include "global.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 int CallTo32_LargeStack( int (*func)(), int nbargs, ...)
 {
@@ -32,6 +33,8 @@
                 a[7],a[8],a[9],a[10]);
   case 14: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],
                 a[7],a[8],a[9],a[10],a[11],a[12],a[13]);
+  case 17: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],
+                a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]);
   default: fprintf(stderr,"JBP: CallTo32_LargeStack called with unsupported "
                           "number of arguments (%d).  Ignored.\n",nbargs);
            return 0;
@@ -40,25 +43,6 @@
 
 WORD CallTo16_word_ ( FARPROC func, WORD arg ) { return func(arg); }
 
-/* typedef void* ATOM; */
-/* ATOM GlobalAddAtom(char *n) */
-/* { */
-/*   return strdup(n); */
-/* } */
-/* GlobalDeleteAtom(ATOM n) */
-/* { */
-/*   free(n); */
-/* } */
-/* GlobalFindAtom(char*n) */
-/* { */
-/*   fprintf(stderr,"JBP: GlobalFindAtom() ignored.\n"); */
-/*   return 0; */
-/* } */
-/* char *GlobalGetAtomName(ATOM a) */
-/* { */
-/*   return a; */
-/* } */
-
 void GlobalFreeAll(HANDLE owner)
 {
   fprintf(stderr,"JBP: GlobalFreeAll() ignored.\n");
@@ -70,123 +54,36 @@
 }
 
 
-
-#if 0
-typedef WORD* HLOCAL;
-
-int IsValidHLOCAL(HLOCAL handle)
-{
-  return *(handle-1) + *(handle-2) == 0; /* Valid HLOCAL's sum to 0 */
-}
-
-/***********************************************************************
- *           LOCAL_Free
- *
- */
 HLOCAL LOCAL_Free( WORD ds, HLOCAL handle )
 {
-  if (!IsValidHLOCAL(handle)) return handle; /* couldn't free it */
-  free(handle-2);
-  return 0;
-}
-
-
-/***********************************************************************
- *           LOCAL_Alloc
- *
- */
-HLOCAL LOCAL_Alloc( WORD ds, WORD flags, WORD size )
-{
-  HLOCAL handle;
-    
-  handle = malloc(size + 2*sizeof(WORD));
-  handle += 2;
-  *(handle-2) = size;
-  *(handle-1) = -size;
-  return handle;
-}
-
-
-/***********************************************************************
- *           LOCAL_ReAlloc
- *
- */
-HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
-{
-  HLOCAL newhandle;
-
-  if(!IsValidHLOCAL(handle))return 0;
-  newhandle = realloc(handle-2, size+2*sizeof(WORD));
-  newhandle += 2;
-  *(newhandle-2) = size;
-  *(newhandle-1) = -size;
-  return newhandle;
-}
-
-
-/***********************************************************************
- *           LOCAL_Lock
- */
-WORD LOCAL_Lock( WORD ds, HLOCAL handle )
-{
-  if(!IsValidHLOCAL(handle))return 0;
-  return handle;
-}
-
-
-/***********************************************************************
- *           LOCAL_Unlock
- */
-BOOL LOCAL_Unlock( WORD ds, HLOCAL handle )
-{
-  return TRUE;
-}
-
-
-/***********************************************************************
- *           LOCAL_Size
- *
- */
-WORD LOCAL_Size( WORD ds, HLOCAL handle )
-{
-  return *(handle-2);
-}
-#endif
-
-HLOCAL LOCAL_Free( WORD ds, HLOCAL handle )
-{
-  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
-  return 0;
+    return LocalFree(handle);
 }
 
 HLOCAL LOCAL_Alloc( WORD ds, WORD flags, WORD size )
 {
-  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
-  return 0;
+    return LocalAlloc(flags,size);
 }
 
 HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
 {
-  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
-  return 0;
+    return LocalReAlloc(handle,size,flags);
 }
 
-WORD LOCAL_Lock( WORD ds, HLOCAL handle )
+NPVOID LOCAL_Lock( WORD ds, HLOCAL handle )
 {
-  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
-  return 0;
+    return LocalLock(handle);
 }
 
 BOOL LOCAL_Unlock( WORD ds, HLOCAL handle )
 {
-  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
-  return 1;
+    fprintf(stderr,"JBP: LOCAL_Unlock() ignored.\n");
+    return 1;
 }
 
 WORD LOCAL_Size( WORD ds, HLOCAL handle )
 {
-  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
-  return 0;
+    fprintf(stderr,"JBP: LOCAL_Size() ignored.\n");
+    return 0;
 }
 
 void FarSetOwner(HANDLE a, WORD b)
@@ -240,17 +137,17 @@
 			    BOOL is32Bit, BOOL isReadOnly,
 			    SHMDATA *shmdata)
 {
-  fprintf(stderr,"JBP: GLOBAL_CreateBlock() faked.\n");
+/*  fprintf(stderr,"JBP: GLOBAL_CreateBlock() faked.\n");*/
   return ptr;
 }
 
 BOOL GLOBAL_FreeBlock( HGLOBAL handle )
 {
-  fprintf(stderr,"JBP: GLOBAL_FreeBlock() ignored.\n");
+/*  fprintf(stderr,"JBP: GLOBAL_FreeBlock() ignored.\n");*/
   return 1;
 }
 
-DWORD GlobalHandle(WORD a)
+HGLOBAL GlobalHandle(LPCVOID a)
 {
   fprintf(stderr,"JBP: GlobalHandle() ignored.\n");
   return 0;
@@ -258,7 +155,7 @@
 
 void *RELAY32_GetEntryPoint(char *dll_name, char *item, int hint)
 {
-  fprintf(stderr,"JBP: RELAY32_GetEntryPoint() ignored.\n");
+/*  fprintf(stderr,"JBP: RELAY32_GetEntryPoint() ignored.\n");*/
   return NULL;
 }
 
diff --git a/toolkit/winmain.c b/toolkit/winmain.c
index 1982f6b..f132725 100644
--- a/toolkit/winmain.c
+++ b/toolkit/winmain.c
@@ -11,10 +11,13 @@
 extern void TASK_Reschedule(void);
 extern int USER_InitApp(HINSTANCE);
 
+char* progname=NULL;
+
 int _WinMain (int argc, char *argv [])
 {
   HINSTANCE hInstance;
 
+  progname=*argv;
   if(!MAIN_Init()) return 0; /* JBP: Needed for DosDrives[] structure, etc. */
   hInstance = WinExec( *argv, SW_SHOWNORMAL );
   TASK_Reschedule();
diff --git a/tools/build.c b/tools/build.c
index 5958875..70ff43f 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -84,6 +84,32 @@
    ((int)&(((struct sigcontext_struct *)1)->reg) - 1 \
     - sizeof(struct sigcontext_struct))
 
+static void *xmalloc (size_t size)
+{
+    void *res;
+
+    res = malloc (size ? size : 1);
+    if (res == NULL)
+    {
+        fprintf (stderr, "Virtual memory exhausted.\n");
+        exit (1);
+    }
+    return res;
+}
+
+
+static void *xrealloc (void *ptr, size_t size)
+{
+    void *res = realloc (ptr, size);
+    if (res == NULL)
+    {
+        fprintf (stderr, "Virtual memory exhausted.\n");
+        exit (1);
+    }
+    return res;
+}
+
+
 static int IsNumberString(char *s)
 {
     while (*s != '\0')
@@ -155,7 +181,7 @@
 
     if (ParseBuffer == NULL)
     {
-	ParseBuffer = malloc(512);
+	ParseBuffer = xmalloc(512);
 	ParseNext = ParseBuffer;
 	Line++;
 	while (1)
@@ -205,7 +231,7 @@
 
     n_values = 0;
     value_array_size = 25;
-    value_array = malloc(sizeof(*value_array) * value_array_size);
+    value_array = xmalloc(sizeof(*value_array) * value_array_size);
     
     while ((token = GetToken()) != NULL)
     {
@@ -216,8 +242,8 @@
 	if (n_values == value_array_size)
 	{
 	    value_array_size += 25;
-	    value_array = realloc(value_array, 
-				  sizeof(*value_array) * value_array_size);
+	    value_array = xrealloc(value_array, 
+				   sizeof(*value_array) * value_array_size);
 	}
 	
 	if (endptr == NULL || *endptr != '\0')
@@ -244,11 +270,11 @@
     odp->type = type;
     strcpy(odp->export_name, export_name);
 
-    vdp = malloc(sizeof(*vdp));
+    vdp = xmalloc(sizeof(*vdp));
     odp->additional_data = vdp;
     
     vdp->n_values = n_values;
-    vdp->values = realloc(value_array, sizeof(*value_array) * n_values);
+    vdp->values = xrealloc(value_array, sizeof(*value_array) * n_values);
 
     return 0;
 }
@@ -263,7 +289,7 @@
     odp = &OrdinalDefinitions[ordinal];
     strcpy(odp->export_name, GetToken());
     odp->type = type;
-    fdp = malloc(sizeof(*fdp));
+    fdp = xmalloc(sizeof(*fdp));
     odp->additional_data = fdp;
 
     token = GetToken();
@@ -331,7 +357,7 @@
     char *token;
     char *endptr;
     
-    rdp = malloc(sizeof(*rdp));
+    rdp = xmalloc(sizeof(*rdp));
     
     odp = &OrdinalDefinitions[ordinal];
     strcpy(odp->export_name, GetToken());
@@ -368,7 +394,7 @@
     odp = &OrdinalDefinitions[ordinal];
     strcpy( odp->export_name, GetToken() );
     odp->type = TYPE_STUB;
-    fdp = malloc(sizeof(*fdp));
+    fdp = xmalloc(sizeof(*fdp));
     odp->additional_data = fdp;
     fdp->arg_types[0] = '\0';
     strcpy( fdp->internal_name, STUB_CALLBACK );
@@ -533,7 +559,7 @@
      * BYTE[n]         Entry table
      */
 
-    buffer = malloc( 0x10000 );
+    buffer = xmalloc( 0x10000 );
 
     pModule = (NE_MODULE *)buffer;
     pModule->magic = NE_SIGNATURE;
@@ -1625,7 +1651,7 @@
     {
         /* File header */
 
-        printf( "/* File generated automatically. Do no edit! */\n\n" );
+        printf( "/* File generated automatically. Do not edit! */\n\n" );
         printf( "\t.text\n" );
 
         /* Build the 32-bit large stack callback */
@@ -1652,7 +1678,7 @@
     {
         /* File header */
 
-        printf( "/* File generated automatically. Do no edit! */\n\n" );
+        printf( "/* File generated automatically. Do not edit! */\n\n" );
         printf( "\t.text\n" );
         printf( "\t.globl " PREFIX "CALL16_Start\n" );
         printf( PREFIX "CALL16_Start:\n" );
diff --git a/win32/file.c b/win32/file.c
index 61b4a09..160fc40 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -21,7 +21,7 @@
 {
     DWORD file_type;
 
-    if(hFile < 3)
+    if((DWORD)hFile < 3)
     {
         file_type = 2;        /* FILE_TYPE_CHAR */
     }
@@ -67,7 +67,7 @@
         }
     }
 
-    rc = lseek(hFile, distance, method);
+    rc = lseek((DWORD)hFile, distance, method);
     if(rc == -1)
         SetLastError(ErrnoToLastError(errno));
     return rc;
@@ -84,9 +84,9 @@
 {
     int written;
 
-    if(hFile < 3)
+    if((DWORD)hFile < 3)
     {
-        written = write(hFile, lpBuffer, numberOfBytesToWrite);
+        written = write((DWORD)hFile, lpBuffer, numberOfBytesToWrite);
         if(numberOfBytesWritten)
             *numberOfBytesWritten = written;
     }
diff --git a/win32/init.c b/win32/init.c
index 8000edc..0554a2f 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -33,9 +33,9 @@
     lpStartupInfo->lpTitle = "Title";
 
     lpStartupInfo->lpReserved2 = NULL; /* must be NULL for VC runtime */
-    lpStartupInfo->hStdInput = 0;
-    lpStartupInfo->hStdOutput = 1;
-    lpStartupInfo->hStdError = 2;
+    lpStartupInfo->hStdInput  = (HANDLE)0;
+    lpStartupInfo->hStdOutput = (HANDLE)1;
+    lpStartupInfo->hStdError  = (HANDLE)2;
 }
 
 int KERN32_Init(void)
diff --git a/windows/defdlg.c b/windows/defdlg.c
index 9f30af1..4f152fb 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -62,6 +62,7 @@
 }
 
 
+#ifdef SUPERFLUOUS_FUNCTIONS
 /***********************************************************************
  *           DEFDLG_FindDefButton
  *
@@ -78,6 +79,7 @@
     }
     return hwndChild;
 }
+#endif
 
 
 /***********************************************************************
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 1479b68..eda4fe2 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -71,7 +71,10 @@
 	return NC_HandleNCPaint( hwnd );
 
     case WM_NCHITTEST:
-	return NC_HandleNCHitTest( hwnd, MAKEPOINT(lParam) );
+        {
+            POINT pt = { LOWORD(lParam), HIWORD(lParam) };
+            return NC_HandleNCHitTest( hwnd, pt );
+        }
 
     case WM_NCLBUTTONDOWN:
 	return NC_HandleNCLButtonDown( hwnd, wParam, lParam );
@@ -236,7 +239,10 @@
 	return NC_HandleSetCursor( hwnd, wParam, lParam );
 
     case WM_SYSCOMMAND:
-	return NC_HandleSysCommand( hwnd, wParam, MAKEPOINT(lParam) );
+        {
+            POINT pt = { LOWORD(lParam), HIWORD(lParam) };
+            return NC_HandleSysCommand( hwnd, wParam, pt );
+        }
 
     case WM_SYSKEYDOWN:
 	if (wParam == VK_MENU)
diff --git a/windows/dialog.c b/windows/dialog.c
index 8dc29c4..6a16805 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -328,12 +328,29 @@
 	if (hMenu) DestroyMenu( hMenu );
 	return 0;
     }
+    wndPtr = WIN_FindWndPtr( hwnd );
+
+      /* Purge junk from system menu */
+      /* FIXME: this doesn't belong here */
+
+    DeleteMenu(wndPtr->hSysMenu,SC_SIZE,MF_BYCOMMAND);
+    if (!(wndPtr->dwStyle & WS_MAXIMIZEBOX) )
+    {
+        DeleteMenu(wndPtr->hSysMenu,SC_MAXIMIZE,MF_BYCOMMAND);
+        if( !(wndPtr->dwStyle & WS_MINIMIZEBOX) )
+        {
+            DeleteMenu(wndPtr->hSysMenu,SC_MINIMIZE,MF_BYCOMMAND);
+            DeleteMenu(wndPtr->hSysMenu,SC_RESTORE,MF_BYCOMMAND);
+        }
+    }
+    else
+        if (!(wndPtr->dwStyle & WS_MINIMIZEBOX) )
+            DeleteMenu(wndPtr->hSysMenu,SC_MINIMIZE,MF_BYCOMMAND);
 
       /* Create control windows */
 
     dprintf_dialog(stddeb, " BEGIN\n" );
 
-    wndPtr = WIN_FindWndPtr( hwnd );
     dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
     dlgInfo->msgResult = 0;  /* This is used to store the default button id */
     dlgInfo->hDialogHeap = 0;
@@ -469,7 +486,7 @@
     EnableWindow( owner, FALSE );
     ShowWindow( hwnd, SW_SHOW );
 
-    while (MSG_InternalGetMessage( USER_HEAP_SEG_ADDR(msgHandle), hwnd, owner,
+    while (MSG_InternalGetMessage( (SEGPTR)USER_HEAP_SEG_ADDR(msgHandle), hwnd, owner,
                                    MSGF_DIALOGBOX, PM_REMOVE,
                                    !(wndPtr->dwStyle & DS_NOIDLEMSG) ))
     {
diff --git a/windows/event.c b/windows/event.c
index a91d248..28f21e1 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -19,6 +19,8 @@
 #include "message.h"
 #include "clipboard.h"
 #include "winpos.h"
+#include "registers.h"
+#include "stackframe.h"
 #include "stddebug.h"
 /* #define DEBUG_EVENT */
 /* #define DEBUG_KEY   */
@@ -586,6 +588,58 @@
 }
 
 
+/***********************************************************************
+ *           GetMouseEventProc   (USER.337)
+ */
+FARPROC GetMouseEventProc(void)
+{
+    char name[] = "Mouse_Event";
+    return GetProcAddress( GetModuleHandle("USER"), MAKE_SEGPTR(name) );
+}
+
+
+/***********************************************************************
+ *           Mouse_Event   (USER.299)
+ */
+#ifndef WINELIB
+void Mouse_Event( struct sigcontext_struct context )
+{
+    /* Register values:
+     * AX = mouse event
+     * BX = horizontal displacement if AX & ME_MOVE
+     * CX = vertical displacement if AX & ME_MOVE
+     * DX = button state (?)
+     * SI = mouse event flags (?)
+     */
+    Window root, child;
+    int rootX, rootY, childX, childY;
+    unsigned int state;
+
+    if (AX_reg(&context) & ME_MOVE)
+    {
+        /* We have to actually move the cursor */
+        XWarpPointer( display, rootWindow, None, 0, 0, 0, 0,
+                      (short)BX_reg(&context), (short)CX_reg(&context) );
+        return;
+    }
+    if (!XQueryPointer( display, rootWindow, &root, &child,
+                        &rootX, &rootY, &childX, &childY, &state )) return;
+    if (AX_reg(&context) & ME_LDOWN)
+        hardware_event( WM_LBUTTONDOWN, EVENT_XStateToKeyState( state ), 0L,
+                        rootX - desktopX, rootY - desktopY, GetTickCount(), 0);
+    if (AX_reg(&context) & ME_LUP)
+        hardware_event( WM_LBUTTONUP, EVENT_XStateToKeyState( state ), 0L,
+                        rootX - desktopX, rootY - desktopY, GetTickCount(), 0);
+    if (AX_reg(&context) & ME_RDOWN)
+        hardware_event( WM_RBUTTONDOWN, EVENT_XStateToKeyState( state ), 0L,
+                        rootX - desktopX, rootY - desktopY, GetTickCount(), 0);
+    if (AX_reg(&context) & ME_RUP)
+        hardware_event( WM_RBUTTONUP, EVENT_XStateToKeyState( state ), 0L,
+                        rootX - desktopX, rootY - desktopY, GetTickCount(), 0);
+}
+#endif
+
+
 /**********************************************************************
  *			EnableHardwareInput 		[USER.331]
  */
diff --git a/windows/graphics.c b/windows/graphics.c
index 608fbea..d4475ba 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -21,6 +21,7 @@
 #include "color.h"
 #include "region.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 static __inline__ void swap_int(int *a, int *b)
 {
@@ -786,7 +787,7 @@
 {
     register int i;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    XPoint *points = (XPoint *) malloc (sizeof (XPoint) * (count+1));
+    XPoint *points = (XPoint *) xmalloc (sizeof (XPoint) * (count+1));
 
     if (!dc) 
     {
@@ -847,7 +848,7 @@
 	XPoint *points;
 
 	for (i = 0; i < polygons; i++) if (counts[i] > max) max = counts[i];
-	points = (XPoint *) malloc( sizeof(XPoint) * (max+1) );
+	points = (XPoint *) xmalloc( sizeof(XPoint) * (max+1) );
 
 	for (i = 0; i < polygons; i++)
 	{
diff --git a/windows/hook.c b/windows/hook.c
index 08472af..d56c93f 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -109,7 +109,7 @@
 
     if ((id < FIRST_HOOK) || (id > LAST_HOOK)) return 0;
     if (id != WH_GETMESSAGE && id != WH_CALLWNDPROC) {
-	fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,%04x,%04x)!\n",
+	fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,"NPFMT","NPFMT")!\n",
                  id, (DWORD)proc, hinst, htask );
     }
     if (htask)  /* Task-specific hook */
diff --git a/windows/mdi.c b/windows/mdi.c
index 76f6d87..e1a3ddf 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -414,8 +414,9 @@
     xsize   = rect.right  - 8 * spacing;
     
     dprintf_mdi(stddeb, 
-	    "MDICascade: Client wnd at (%d,%d) - (%d,%d), spacing %d\n", 
-	    rect.left, rect.top, rect.right, rect.bottom, spacing);
+      "MDICascade: Client wnd at (%ld,%ld) - (%ld,%ld), spacing %d\n", 
+      (LONG)rect.left, (LONG)rect.top, (LONG)rect.right, (LONG)rect.bottom,
+      spacing);
     dprintf_mdi(stddeb, "MDICascade: searching for last child\n");
     hinfo = ci->infoActiveChildren;
     while(1) {
diff --git a/windows/message.c b/windows/message.c
index adefb14..a309356 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -291,6 +291,7 @@
     static DWORD lastClickTime = 0;
     static WORD  lastClickMsg = 0;
     static POINT lastClickPos = { 0, 0 };
+    POINT pt = msg->pt;
 
     BOOL mouseClick = ((msg->message == WM_LBUTTONDOWN) ||
 		       (msg->message == WM_RBUTTONDOWN) ||
@@ -301,8 +302,8 @@
     if (GetCapture())
     {
 	msg->hwnd = GetCapture();
-	msg->lParam = MAKELONG( msg->pt.x, msg->pt.y );
-	ScreenToClient( msg->hwnd, (LPPOINT)&msg->lParam );
+	ScreenToClient( msg->hwnd, &pt );
+	msg->lParam = MAKELONG( pt.x, pt.y );
 	return TRUE;  /* No need to further process the message */
     }
    
@@ -379,16 +380,14 @@
 
       /* Build the translated message */
 
-    msg->lParam = MAKELONG( msg->pt.x, msg->pt.y );
     if (hittest == HTCLIENT)
-    {
-	ScreenToClient( msg->hwnd, (LPPOINT)&msg->lParam );
-    }
+        ScreenToClient( msg->hwnd, &pt );
     else
     {
 	msg->wParam = hittest;
 	msg->message += WM_NCLBUTTONDOWN - WM_LBUTTONDOWN;
     }
+    msg->lParam = MAKELONG( pt.x, pt.y );
     
     return TRUE;
 }
@@ -952,7 +951,7 @@
 /***********************************************************************
  *           GetMessage   (USER.108)
  */
-BOOL GetMessage( SEGPTR msg, HWND hwnd, WORD first, WORD last ) 
+BOOL GetMessage( SEGPTR msg, HWND hwnd, UINT first, UINT last ) 
 {
     MSG_PeekMessage( (MSG *)PTR_SEG_TO_LIN(msg),
                      hwnd, first, last, PM_REMOVE, FALSE );
diff --git a/windows/msgbox.c b/windows/msgbox.c
index e0cd46c..ddb9690 100644
--- a/windows/msgbox.c
+++ b/windows/msgbox.c
@@ -121,7 +121,7 @@
     lRet = DrawText(hdc, lpmb->text, -1, &rect,
 		    DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_CALCRECT);
     theight = rect.bottom  - rect.top;
-    tiheight = 16 + max(iheight, theight);
+    tiheight = 16 + MAX(iheight, theight);
     ReleaseDC(hItem, hdc);
     
     /* Position the text */
diff --git a/windows/nonclient.c b/windows/nonclient.c
index aa77bef..086dc18 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -102,8 +102,9 @@
 	style |= WS_CAPTION;
     if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
 
-    dprintf_nonclient(stddeb, "AdjustWindowRectEx: (%d,%d)-(%d,%d) %08lx %d %08lx\n",
-      rect->left, rect->top, rect->right, rect->bottom, style, menu, exStyle );
+    dprintf_nonclient(stddeb, "AdjustWindowRectEx: (%ld,%ld)-(%ld,%ld) %08lx %d %08lx\n",
+      (LONG)rect->left, (LONG)rect->top, (LONG)rect->right, (LONG)rect->bottom,
+      style, menu, exStyle );
 
     NC_AdjustRect( rect, style, menu, exStyle );
 }
@@ -176,9 +177,9 @@
 
       /* Some sanity checks */
 
-    pMinMax->ptMaxTrackSize.x = max( pMinMax->ptMaxTrackSize.x,
+    pMinMax->ptMaxTrackSize.x = MAX( pMinMax->ptMaxTrackSize.x,
 				     pMinMax->ptMinTrackSize.x );
-    pMinMax->ptMaxTrackSize.y = max( pMinMax->ptMaxTrackSize.y,
+    pMinMax->ptMaxTrackSize.y = MAX( pMinMax->ptMaxTrackSize.y,
 				     pMinMax->ptMinTrackSize.y );
     
     if (maxSize) *maxSize = pMinMax->ptMaxSize;
@@ -260,8 +261,8 @@
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return HTERROR;
 
-    dprintf_nonclient(stddeb, "NC_HandleNCHitTest: hwnd="NPFMT" pt=%d,%d\n",
-		      hwnd, pt.x, pt.y );
+    dprintf_nonclient(stddeb, "NC_HandleNCHitTest: hwnd="NPFMT" pt=%ld,%ld\n",
+		      hwnd, (LONG)pt.x, (LONG)pt.y );
 
     GetWindowRect( hwnd, &rect );
     if (!PtInRect( &rect, pt )) return HTNOWHERE;
@@ -927,23 +928,23 @@
     else SetRect( &mouseRect, 0, 0, SYSMETRICS_CXSCREEN, SYSMETRICS_CYSCREEN );
     if (ON_LEFT_BORDER(hittest))
     {
-	mouseRect.left  = max( mouseRect.left, sizingRect.right-maxTrack.x );
-	mouseRect.right = min( mouseRect.right, sizingRect.right-minTrack.x );
+	mouseRect.left  = MAX( mouseRect.left, sizingRect.right-maxTrack.x );
+	mouseRect.right = MIN( mouseRect.right, sizingRect.right-minTrack.x );
     }
     else if (ON_RIGHT_BORDER(hittest))
     {
-	mouseRect.left  = max( mouseRect.left, sizingRect.left+minTrack.x );
-	mouseRect.right = min( mouseRect.right, sizingRect.left+maxTrack.x );
+	mouseRect.left  = MAX( mouseRect.left, sizingRect.left+minTrack.x );
+	mouseRect.right = MIN( mouseRect.right, sizingRect.left+maxTrack.x );
     }
     if (ON_TOP_BORDER(hittest))
     {
-	mouseRect.top    = max( mouseRect.top, sizingRect.bottom-maxTrack.y );
-	mouseRect.bottom = min( mouseRect.bottom,sizingRect.bottom-minTrack.y);
+	mouseRect.top    = MAX( mouseRect.top, sizingRect.bottom-maxTrack.y );
+	mouseRect.bottom = MIN( mouseRect.bottom,sizingRect.bottom-minTrack.y);
     }
     else if (ON_BOTTOM_BORDER(hittest))
     {
-	mouseRect.top    = max( mouseRect.top, sizingRect.top+minTrack.y );
-	mouseRect.bottom = min( mouseRect.bottom, sizingRect.top+maxTrack.y );
+	mouseRect.top    = MAX( mouseRect.top, sizingRect.top+minTrack.y );
+	mouseRect.bottom = MIN( mouseRect.bottom, sizingRect.top+maxTrack.y );
     }
     SendMessage( hwnd, WM_ENTERSIZEMOVE, 0, 0 );
 
@@ -988,10 +989,10 @@
 	    case VK_RIGHT: pt.x += 8; break;		
 	}
 
-	pt.x = max( pt.x, mouseRect.left );
-	pt.x = min( pt.x, mouseRect.right );
-	pt.y = max( pt.y, mouseRect.top );
-	pt.y = min( pt.y, mouseRect.bottom );
+	pt.x = MAX( pt.x, mouseRect.left );
+	pt.x = MIN( pt.x, mouseRect.right );
+	pt.y = MAX( pt.y, mouseRect.top );
+	pt.y = MIN( pt.y, mouseRect.bottom );
 
 	dx = pt.x - capturePoint.x;
 	dy = pt.y - capturePoint.y;
@@ -1120,9 +1121,10 @@
 	case WM_LBUTTONUP:
 	case WM_MOUSEMOVE:
         case WM_SYSTIMER:
-            pt = MAKEPOINT(msg->lParam);
-            pt.x += wndPtr->rectClient.left - wndPtr->rectWindow.left;
-            pt.y += wndPtr->rectClient.top - wndPtr->rectWindow.top;
+            pt.x = LOWORD(msg->lParam) + wndPtr->rectClient.left - 
+	      wndPtr->rectWindow.left;
+            pt.y = HIWORD(msg->lParam) + wndPtr->rectClient.top - 
+	      wndPtr->rectWindow.top;
             SCROLL_HandleScrollEvent( hwnd, scrollbar, msg->message, pt );
 	    break;
         default:
@@ -1177,6 +1179,7 @@
 LONG NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
     HDC hdc = GetWindowDC( hwnd );
+    POINT pt = { LOWORD(lParam), HIWORD(lParam) };
 
     switch(wParam)  /* Hit test */
     {
@@ -1185,7 +1188,7 @@
 	break;
 
     case HTSYSMENU:
-	NC_TrackSysMenu( hwnd, hdc, MAKEPOINT(lParam) );
+	NC_TrackSysMenu( hwnd, hdc, pt );
 	break;
 
     case HTMENU:
@@ -1245,8 +1248,11 @@
     switch(wParam)  /* Hit test */
     {
     case HTCAPTION:
-        SendMessage( hwnd, WM_SYSCOMMAND,
-                     IsZoomed(hwnd) ? SC_RESTORE : SC_MAXIMIZE, lParam );
+        /* stop processing if WS_MAXIMIZEBOX is missing */
+
+        if( GetWindowLong( hwnd , GWL_STYLE) & WS_MAXIMIZEBOX )
+            SendMessage( hwnd, WM_SYSCOMMAND,
+                         IsZoomed(hwnd) ? SC_RESTORE : SC_MAXIMIZE, lParam );
 	break;
 
     case HTSYSMENU:
@@ -1266,8 +1272,8 @@
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
-    dprintf_nonclient(stddeb, "Handling WM_SYSCOMMAND %lx %d,%d\n", 
-		      (DWORD)wParam, pt.x, pt.y );
+    dprintf_nonclient(stddeb, "Handling WM_SYSCOMMAND %lx %ld,%ld\n", 
+		      (DWORD)wParam, (LONG)pt.x, (LONG)pt.y );
 
     if (wndPtr->dwStyle & WS_CHILD) ScreenToClient( wndPtr->hwndParent, &pt );
 
diff --git a/windows/painting.c b/windows/painting.c
index 7e16632..014426d 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -140,9 +140,9 @@
 
     if (rectUpdate)
     {
-        dprintf_win( stddeb, "RedrawWindow: "NPFMT" %d,%d-%d,%d "NPFMT" flags=%04x\n",
-                     hwnd, rectUpdate->left, rectUpdate->top,
-                     rectUpdate->right, rectUpdate->bottom, hrgnUpdate, flags);
+        dprintf_win( stddeb, "RedrawWindow: "NPFMT" %ld,%ld-%ld,%ld "NPFMT" flags=%04x\n",
+                     hwnd, (LONG)rectUpdate->left, (LONG)rectUpdate->top,
+                     (LONG)rectUpdate->right, (LONG)rectUpdate->bottom, hrgnUpdate, flags);
     }
     else
     {
diff --git a/windows/scroll.c b/windows/scroll.c
index d662983..b24fcbf 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -27,8 +27,8 @@
     HRGN hrgnUpdate;
     RECT rc, cliprc;
 
-    dprintf_scroll(stddeb,"ScrollWindow: dx=%d, dy=%d, rect=%d,%d,%d,%d\n", 
-	   dx, dy, rect->left, rect->top, rect->right, rect->bottom);
+    dprintf_scroll(stddeb,"ScrollWindow: dx=%d, dy=%d, rect=%ld,%ld,%ld,%ld\n", 
+	   dx, dy, (LONG)rect->left, (LONG)rect->top, (LONG)rect->right, (LONG)rect->bottom);
 
     hdc = GetDC(hwnd);
 
@@ -60,8 +60,8 @@
     short width, height;
     DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
 
-    dprintf_scroll(stddeb, "ScrollDC: dx=%d, dy=%d, rc=%d,%d,%d,%d\n", dx, dy,
-	   rc->left, rc->top, rc->right, rc->bottom);
+    dprintf_scroll(stddeb, "ScrollDC: dx=%d, dy=%d, rc=%ld,%ld,%ld,%ld\n", dx, dy,
+	   (LONG)rc->left, (LONG)rc->top, (LONG)rc->right, (LONG)rc->bottom);
 
     if (rc == NULL)
 	return FALSE;
@@ -136,8 +136,9 @@
     HDC hdc;
     RECT rc, cliprc;
 
-    dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, rect=%d,%d,%d,%d\n", 
-	   dx, dy, rect->left, rect->top, rect->right, rect->bottom);
+    dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, rect=%ld,%ld,%ld,%ld\n", 
+	   dx, dy, (LONG)rect->left, (LONG)rect->top, (LONG)rect->right,
+           (LONG)rect->bottom);
 
     hdc = GetDC(hwnd);
 
diff --git a/windows/sysmetrics.c b/windows/sysmetrics.c
index 3aa9bb3..64b80dc 100644
--- a/windows/sysmetrics.c
+++ b/windows/sysmetrics.c
@@ -10,7 +10,7 @@
 #include "gdi.h"
 #include "sysmetrics.h"
 
-short sysMetrics[SM_CMETRICS];
+short sysMetrics[SM_CMETRICS+1];
 
 /***********************************************************************
  *           SYSMETRICS_Init
@@ -62,6 +62,7 @@
     sysMetrics[SM_MENUDROPALIGNMENT] = GetProfileInt( "windows","MenuDropAlignment", 0 );
     sysMetrics[SM_PENWINDOWS] = 0;
     sysMetrics[SM_DBCSENABLED] = 0;
+    sysMetrics[SM_CMETRICS] = SM_CMETRICS;
 }
 
 
@@ -70,6 +71,6 @@
  */
 int GetSystemMetrics( WORD index )
 {
-    if (index >= SM_CMETRICS) return 0;
+    if (index > SM_CMETRICS) return 0;
     else return sysMetrics[index];    
 }
diff --git a/windows/win.c b/windows/win.c
index 164b563..1e0d209 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -209,7 +209,7 @@
     }
     if (!(wndPtr->dwStyle & WS_CHILD))
     {
-        if (wndPtr->wIDmenu) DestroyMenu( wndPtr->wIDmenu );
+        if (wndPtr->wIDmenu) DestroyMenu( (HMENU)wndPtr->wIDmenu );
     }
     if (wndPtr->hSysMenu) DestroyMenu( wndPtr->hSysMenu );
     if (wndPtr->window) XDestroyWindow( display, wndPtr->window );
@@ -285,7 +285,7 @@
  *           CreateWindow   (USER.41)
  */
 HWND CreateWindow( SEGPTR className, SEGPTR windowName,
-		   DWORD style, short x, short y, short width, short height,
+		   DWORD style, INT x, INT y, INT width, INT height,
 		   HWND parent, HMENU menu, HANDLE instance, SEGPTR data ) 
 {
     return CreateWindowEx( 0, className, windowName, style,
@@ -297,7 +297,7 @@
  *           CreateWindowEx   (USER.452)
  */
 HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName,
-		     DWORD style, short x, short y, short width, short height,
+		     DWORD style, INT x, INT y, INT width, INT height,
 		     HWND parent, HMENU menu, HANDLE instance, SEGPTR data ) 
 {
     HANDLE class, hwnd;
@@ -465,7 +465,7 @@
         else if (classPtr->wc.lpszMenuName)
             SetMenu( hwnd, LoadMenu( instance, classPtr->wc.lpszMenuName ) );
     }
-    else wndPtr->wIDmenu = menu;
+    else wndPtr->wIDmenu = (UINT)menu;
 
       /* Send the WM_CREATE message */
 
@@ -744,12 +744,13 @@
     if (offset >= 0) ptr = (WORD *)(((char *)wndPtr->wExtra) + offset);
     else switch(offset)
     {
-	case GWW_ID:        ptr = &wndPtr->wIDmenu;   break;
 #ifdef WINELIB32
+	case GWW_ID:
 	case GWW_HINSTANCE:
             fprintf(stderr,"SetWindowWord called with offset %d.\n",offset);
             return 0;
 #else
+	case GWW_ID:        ptr = &wndPtr->wIDmenu;   break;
 	case GWW_HINSTANCE: ptr = (WORD*)&wndPtr->hInstance; break;
 #endif
 	default: return 0;
diff --git a/windows/winpos.c b/windows/winpos.c
index 32ca21c6..119b265 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -619,8 +619,8 @@
 	(wndPtr->dwStyle & (WS_POPUP | WS_CHILD) == 0))
     {
 	NC_GetMinMaxInfo( winpos->hwnd, &maxSize, NULL, NULL, NULL );
-	winpos->cx = min( winpos->cx, maxSize.x );
-	winpos->cy = min( winpos->cy, maxSize.y );
+	winpos->cx = MIN( winpos->cx, maxSize.x );
+	winpos->cy = MIN( winpos->cy, maxSize.y );
     }
     return 0;
 }
@@ -702,7 +702,7 @@
 
 
 /***********************************************************************
- *           WINPOS_SetXWindosPos
+ *           WINPOS_SetXWindowPos
  *
  * SetWindowPos() for an X window. Used by the real SetWindowPos().
  */