From 33072e1f2ca8ba5ad3c3d5c3d2ebcf62ba5bd907 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Sun, 29 Jun 1997 18:08:02 +0000
Subject: [PATCH] Release 970629

Thu Jun 26 02:14:03 1997  Slaven Rezic  <eserte@cs.tu-berlin.de>

	* [Makefile.in]
	New target install_includes.

	* [rc/parser.h] [rc/parser.y] [rc/winerc.c]
	Some bug fixes.

Wed Jun 25 14:43:41 1997  Victor Schneider <vischne@ibm.net>

	* [controls/edit.c]
	Fixed WM_GETTEXT return value.

Tue Jun 24 23:46:04 1997  Michiel van Loon <mfvl@xs4all.nl>

	* [multimedia/*.c] [include/mmsystem.h]
	Added more callback code, including (I hope) function callback.
	Changed some linear pointers into segmented.

	* [multimedia/audio.c]
	Removed some bugs.

Sat Jun 28 11:37:56 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [if1632/commdlg.spec][if1632/comdlg32.spec][misc/commdlg.c]
	  [include/commdlg.h]
	Implemented parts of comdlg32: GetOpenFileName32*,
	GetSaveFileName32*, GetFileTitle32* using the 16 bit equivalents.

	* [windows/event.c]
	EVENT_QueryZOrder: check for children !=NULL (happens when
	using -managed).

	* [BUGS][DEVELOPER-HINTS]
	Updated.

	* [objects/text.c]
	Added GetTextCharset... (stub mostly).

Sat Jun 21 08:47:58 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [if1632/kernel.spec] [if1632/gdi.spec] [include/windows.h]
	  [loader/resource.c] [graphics/x11drv/xfont.c]
	SetResourceHandler & RemoveFontResource prototypes fixed.

	* [if1632/relay.c] [if1632/kernel.spec] [if1632/user.spec]
	  [if1632/olesvr.spec] [if1632/commdlg.spec] [if1632/ddeml.spec]
	  [if1632/gdi.spec] [if1632/lzexpand.spec] [if1632/shell.spec]
	  [include/windows.h] [memory/string.c] [tools/build.c]
	New type of parameter allowed in .spec files : str, printed
	as a string with -debugmsg +relay. .spec files updated.

	* [objects/dc.c]
	In DC_SetupGCForPen, call BlackPixelOfScreen, not BlackPixel.
	Likewise for WhitePixel.

	* [objects/gdiobj.c] [graphics/x11drv/brush.c]
	Use BS_HATCHED with an added entry in HatchBrushes for DkGrayBrush,
 	instead of BS_SOLID.

Fri May 30 17:58:00 1997  Chris Faherty <chrisf@america.com>

	* [windows/keyboard.c]
	Added vkey to scancode translation table.
	This was primarily to fix Citrix WinFrame client which
	always needs scancodes in WM_KEYDOWN.
	Tested with Exceed 5.1.0.1 & XFree86 3.1.2.
---
 ANNOUNCE                     |  19 +-
 BUGS                         |  14 +-
 ChangeLog                    |  69 ++++++
 DEVELOPERS-HINTS             |   9 +-
 Makefile.in                  |  13 +-
 controls/edit.c              |   4 +-
 controls/listbox.c           |   9 +-
 documentation/fonts          |  23 +-
 graphics/x11drv/brush.c      |   5 +-
 graphics/x11drv/text.c       |  81 ++++---
 graphics/x11drv/xfont.c      |  23 +-
 if1632/advapi32.spec         |   4 +-
 if1632/builtin.c             |   2 +-
 if1632/comdlg32.spec         |  14 +-
 if1632/commdlg.spec          |   6 +-
 if1632/crtdll.spec           |   2 +-
 if1632/ddeml.spec            |   4 +-
 if1632/dummy.c               |   1 +
 if1632/gdi.spec              |  26 +-
 if1632/gdi32.spec            |  10 +-
 if1632/kernel.spec           |  47 ++--
 if1632/lzexpand.spec         |   4 +-
 if1632/olesvr.spec           |   4 +-
 if1632/relay.c               |  20 ++
 if1632/shell.spec            |  16 +-
 if1632/user.spec             |  22 +-
 if1632/user32.spec           |   2 +-
 include/commdlg.h            |  71 +++++-
 include/mmsystem.h           |   3 +-
 include/windows.h            |  12 +-
 loader/resource.c            |   8 +-
 memory/string.c              |  16 +-
 misc/comm.c                  |   9 +-
 misc/commdlg.c               | 447 ++++++++++++++++++++++++++++-------
 misc/crtdll.c                |  13 +
 misc/printdrv.c              |  24 +-
 multimedia/audio.c           | 123 ++++++----
 multimedia/mcianim.c         |   4 +
 multimedia/mcicda.c          |   5 +
 multimedia/mcistring.c       |  35 +--
 multimedia/midi.c            |  59 ++++-
 multimedia/mmsystem.c        |  35 ++-
 objects/dc.c                 |   8 +-
 objects/font.c               |  13 +-
 objects/gdiobj.c             |   8 +-
 objects/text.c               |  12 +
 programs/winhelp/ChangeLog   |   5 +
 programs/winhelp/Makefile.in |   2 +-
 programs/winhelp/Va.rc       |  51 ++++
 programs/winhelp/winhelp.c   |   2 +
 rc/parser.h                  |   3 +-
 rc/parser.y                  |   6 +-
 rc/winerc.c                  |  49 ++--
 tools/build-spec.txt         |   3 +-
 tools/build.c                |   6 +-
 win32/newfns.c               |   2 +-
 windows/dce.c                |  30 ++-
 windows/event.c              |   2 +-
 windows/keyboard.c           |  40 +++-
 windows/message.c            |  13 +-
 wine.ini                     |  10 +-
 61 files changed, 1177 insertions(+), 405 deletions(-)
 create mode 100644 programs/winhelp/Va.rc

diff --git a/ANNOUNCE b/ANNOUNCE
index 20b0e35f013..3a4afcceea0 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,16 +1,13 @@
-This is release 970616 of Wine, the MS Windows emulator.  This is still a
+This is release 970629 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 correctly.
 
 Patches should be submitted to "julliard@lrc.epfl.ch".  Please don't
 forget to include a ChangeLog entry.
 
-WHAT'S NEW with Wine-970616: (see ChangeLog for details)
-	- More improvements to multimedia code.
-	- New font mapper.
-	- Icon titles.
-	- Print spooling.
-	- Direct I/O ports access.
+WHAT'S NEW with Wine-970629: (see ChangeLog for details)
+	- Start of COMDLG32 implementation.
+	- Relay debugging knows about strings.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -19,10 +16,10 @@ Because of lags created by using mirror, this message may reach you before
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970616.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970616.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970616.tar.gz
-  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970616.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970629.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970629.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970629.tar.gz
+  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970629.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/BUGS b/BUGS
index f706ac64987..473e87eb980 100644
--- a/BUGS
+++ b/BUGS
@@ -11,7 +11,7 @@ General:
 
  * TrueType, .FON rasterizer.
 
- * No thread/process/kernel-object support in Win32 code. 
+ * No thread/process scheduling support in Win32 code. 
 
  * Very alpha printing code. [john@division.co.uk]
 
@@ -20,23 +20,19 @@ General:
  * No MS Video support (perhaps interface with xanim, don't hold
    your breath for this one).
 
- * No COMDLG32 support. (Needed badly, the Windows95 comdlg32.dll
-   doesn't work with WINE.)
+ * COMDLG32 support not complete yet.
 
  * No COMMCTRL/COMCTL32 support.
 
- * No icon titles.
-	- Windows uses a special window class to display icon titles.
-	  Handles to these title windows are stored in the icon window
-	  properties.
-
  * No manual pages describing the various Windows calls.
 	- You can find information about most of the Win32 API calls
           on the www.microsoft.com (go to 'search').
 
 Miscellaneous:
 
- * New font mapping scheme can be improved.
+ * Text alignment problems in Word and Write (variable pitch fonts).
+
+ * Font mapper weights
 
  * "Cursor XXXX has more than 1 bpp!"
 
diff --git a/ChangeLog b/ChangeLog
index f8b8b962a0a..50fa2fe7fe2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,72 @@
+----------------------------------------------------------------------
+Thu Jun 26 02:14:03 1997  Slaven Rezic  <eserte@cs.tu-berlin.de>
+
+	* [Makefile.in]
+	New target install_includes.
+
+	* [rc/parser.h] [rc/parser.y] [rc/winerc.c]
+	Some bug fixes.
+
+Wed Jun 25 14:43:41 1997  Victor Schneider <vischne@ibm.net>
+
+	* [controls/edit.c]
+	Fixed WM_GETTEXT return value.
+
+Tue Jun 24 23:46:04 1997  Michiel van Loon <mfvl@xs4all.nl>
+
+	* [multimedia/*.c] [include/mmsystem.h]
+	Added more callback code, including (I hope) function callback.
+	Changed some linear pointers into segmented.
+
+	* [multimedia/audio.c]
+	Removed some bugs.
+
+Sat Jun 28 11:37:56 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [if1632/commdlg.spec][if1632/comdlg32.spec][misc/commdlg.c]
+	  [include/commdlg.h]
+	Implemented parts of comdlg32: GetOpenFileName32*,
+	GetSaveFileName32*, GetFileTitle32* using the 16 bit equivalents.
+
+	* [windows/event.c]
+	EVENT_QueryZOrder: check for children !=NULL (happens when
+	using -managed).
+
+	* [BUGS][DEVELOPER-HINTS]
+	Updated.
+
+	* [objects/text.c]
+	Added GetTextCharset... (stub mostly).
+
+Sat Jun 21 08:47:58 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>
+
+	* [if1632/kernel.spec] [if1632/gdi.spec] [include/windows.h]
+	  [loader/resource.c] [graphics/x11drv/xfont.c]
+	SetResourceHandler & RemoveFontResource prototypes fixed.
+
+	* [if1632/relay.c] [if1632/kernel.spec] [if1632/user.spec]
+	  [if1632/olesvr.spec] [if1632/commdlg.spec] [if1632/ddeml.spec]
+	  [if1632/gdi.spec] [if1632/lzexpand.spec] [if1632/shell.spec]
+	  [include/windows.h] [memory/string.c] [tools/build.c]
+	New type of parameter allowed in .spec files : str, printed
+	as a string with -debugmsg +relay. .spec files updated.
+
+	* [objects/dc.c]
+	In DC_SetupGCForPen, call BlackPixelOfScreen, not BlackPixel.
+	Likewise for WhitePixel.
+
+	* [objects/gdiobj.c] [graphics/x11drv/brush.c]
+	Use BS_HATCHED with an added entry in HatchBrushes for DkGrayBrush,
+ 	instead of BS_SOLID.
+
+Fri May 30 17:58:00 1997  Chris Faherty <chrisf@america.com>
+
+	* [windows/keyboard.c]
+	Added vkey to scancode translation table.
+	This was primarily to fix Citrix WinFrame client which
+	always needs scancodes in WM_KEYDOWN.
+	Tested with Exceed 5.1.0.1 & XFree86 3.1.2.
+
 ----------------------------------------------------------------------
 Sat Jun 14 13:05:23 1997  Andreas Mohr <100.30936@germany.net>
 
diff --git a/DEVELOPERS-HINTS b/DEVELOPERS-HINTS
index 14b47e13d97..7f68ba4bd56 100644
--- a/DEVELOPERS-HINTS
+++ b/DEVELOPERS-HINTS
@@ -243,9 +243,12 @@ DEBUG_XXX's in include/stddebug.h or in a specific file.
 MORE INFO
 =========
 
-1. http://www.sonic.net/~undoc/bookstore.html
+1. There is a FREE online version of the MSDN library (including
+   documentation for the Win32 API) on http://www.microsoft.com/msdn/
 
-2. In 1993 Dr. Dobbs Journal published a column called "Undocumented Corner".
+2. http://www.sonic.net/~undoc/bookstore.html
 
-3. You might want to check out BYTE from December 1983 as well :-)
+3. In 1993 Dr. Dobbs Journal published a column called "Undocumented Corner".
+
+4. You might want to check out BYTE from December 1983 as well :-)
 
diff --git a/Makefile.in b/Makefile.in
index 039c74142c8..c62eb54c888 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -23,6 +23,7 @@ LDLIBS    = @LDLIBS@
 AR        = ar rc
 RANLIB    = @RANLIB@
 RM        = rm -f
+MKDIR     = mkdir
 SUBMAKE   = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
 @SET_MAKE@
 
@@ -37,6 +38,7 @@ bindir          = @bindir@
 libdir          = @libdir@
 mandir          = @mandir@/man1
 manext          = .1
+includedir      = @includedir@/wine
 
 # Main target to build
 
@@ -118,15 +120,19 @@ libwine.a: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy
 	$(AR) $@ $(COMMONOBJS) $(LIBOBJS)
 	$(RANLIB) $@
 
-install_libwine.a: dummy
+install_libwine.a: install_includes
 	$(INSTALL_DATA) libwine.a $(libdir)
 
 libwine.so.1.0: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy
 	$(CC) -shared -Wl,-soname,libwine.so -o$@ $(COMMONOBJS) $(LIBOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
 
-install_libwine.so.1.0: dummy
+install_libwine.so.1.0: install_includes
 	$(INSTALL_DATA) libwine.so.1.0 $(libdir)
 
+install_includes: dummy
+	if [ -d $(includedir) ]; then : ; else $(MKDIR) $(includedir); fi 
+	cd include; $(INSTALL_DATA) windows.h wintypes.h $(includedir)
+
 $(ALLSUBDIRS): dummy
 	@cd $@; $(SUBMAKE)
 
@@ -143,9 +149,8 @@ etags:
 
 clean:
 	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done
-	$(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc
+	for i in . include documentation; do (cd $$i; $(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc); done
 	$(RM) wine wine.sym libwine.a libwine.so.1.0 TAGS
-	(cd include; $(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc)
 
 distclean: clean
 	$(RM) config.* Make.rules include/config.h
diff --git a/controls/edit.c b/controls/edit.c
index f557b62c17c..707bc691bce 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -3078,9 +3078,9 @@ static INT32 EDIT_WM_GetText(WND *wnd, EDITSTATE *es, INT32 count, LPSTR text)
 
 	if (count > len) {
 		lstrcpy32A(text, es->text);
-		return len + 1;
+		return len;
 	} else
-		return 0;
+		return -1;
 }
 
 
diff --git a/controls/listbox.c b/controls/listbox.c
index 516fb24ab58..71f56beea7d 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -1731,9 +1731,12 @@ static LRESULT LISTBOX_HandleLButtonUp( WND *wnd, LB_DESCR *descr )
     if (LISTBOX_Timer != LB_TIMER_NONE)
         KillSystemTimer32( wnd->hwndSelf, LB_TIMER_ID );
     LISTBOX_Timer = LB_TIMER_NONE;
-    if (GetCapture32() == wnd->hwndSelf) ReleaseCapture();
-    if (descr->style & LBS_NOTIFY)
-        SEND_NOTIFICATION( wnd, descr, LBN_SELCHANGE );
+    if (GetCapture32() == wnd->hwndSelf)
+    {
+        ReleaseCapture();
+        if (descr->style & LBS_NOTIFY)
+            SEND_NOTIFICATION( wnd, descr, LBN_SELCHANGE );
+    }
     return 0;
 }
 
diff --git a/documentation/fonts b/documentation/fonts
index 32376131123..00ef738b06a 100644
--- a/documentation/fonts
+++ b/documentation/fonts
@@ -4,8 +4,8 @@ How To Convert Windows Fonts
 
 If you have access to Windows installation you should use 
 fnt2bdf utility (found in the 'tools)' directory to convert
-bitmap fonts (SYSTEM.FON, SSERIFE.FON, and SERIFE.FON) into 
-the format that X Window System can recognize.
+bitmap fonts (VGASYS.FON, SSERIFE.FON, and SERIFE.FON) into 
+the format that X Window System can recognize. 
 
 Step 1. Extract bitmap fonts with 'fnt2bdf'.
 
@@ -14,14 +14,25 @@ Step 2. Convert .bdf files produced by the Step 1 into
 
 Step 3. Copy .pcf files to the font server directory which
 	is usually /usr/lib/X11/fonts/misc (you will probably 
-        need superuser privileges).
+        need superuser privileges). If you want to create a new
+	font directory you will need to add it to the font path.
 
 Step 4. Run 'mkfontdir' for the directory you copied fonts to.
 	If you are already in X you should run 'xset fp rehash' 
         to make X server aware of the new fonts.
 
+Step 5. Edit wine.conf file to remove aliases for the fonts 
+	you've just installed.
+
 Wine can get by without these fonts but 'the look and feel'
-will be quite different. 
+will be quite different. Also, some applications try to load
+their custom fonts on the fly (WinWord 6.0) and since Wine does
+not implement this yet it instead prints out something like;
+
+STUB: AddFontResource( somefile.FON )
+
+You can convert this file too. Note that .FON file may not hold 
+any bitmap fonts and fnt2bdf will fail if this is the case.
 
 What to do with TrueType fonts? There are several commercial
 font tools that can convert them to the Type1 format but the 
@@ -87,7 +98,9 @@ installations, however X font table starts with whatever is the first line
 in the fonts.dir.  Therefore WINE uses the following entry to determine 
 which font to check first.
 
-Default = ...
+Example:
+
+Default = -adobe-times-
 
 Comments:
     It is better to have a scalable font family (bolds and italics included) 
diff --git a/graphics/x11drv/brush.c b/graphics/x11drv/brush.c
index 62bc41f8dbc..1fe88daf5d3 100644
--- a/graphics/x11drv/brush.c
+++ b/graphics/x11drv/brush.c
@@ -12,14 +12,15 @@
 #include "stddebug.h"
 #include "debug.h"
 
-static const char HatchBrushes[NB_HATCH_STYLES][8] =
+static const char HatchBrushes[NB_HATCH_STYLES + 1][8] =
 {
     { 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00 }, /* HS_HORIZONTAL */
     { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 }, /* HS_VERTICAL   */
     { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }, /* HS_FDIAGONAL  */
     { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }, /* HS_BDIAGONAL  */
     { 0x08, 0x08, 0x08, 0xff, 0x08, 0x08, 0x08, 0x08 }, /* HS_CROSS      */
-    { 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 }  /* HS_DIAGCROSS  */
+    { 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 }, /* HS_DIAGCROSS  */
+    { 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xbb }  /* Hack for DKGRAY */
 };
 
   /* Levels of each primary for dithering */
diff --git a/graphics/x11drv/text.c b/graphics/x11drv/text.c
index cc7249d2b3f..0b90d62e710 100644
--- a/graphics/x11drv/text.c
+++ b/graphics/x11drv/text.c
@@ -107,20 +107,17 @@ X11DRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags,
 
       /* Compute text starting position */
 
-    XTextExtents( font, str, count, &dir, &ascent, &descent, &info );
-
-    if (lpDx) /* have explicit character cell x offsets */
+    if (lpDx) /* have explicit character cell x offsets in logical coordinates */
     {
-	/* sum lpDx array and add the width of last character */
-
-        info.width = XTextWidth( font, str + count - 1, 1) + dc->w.charExtra;
-        if (str[count-1] == dfBreakChar)
-            info.width += dc->w.breakExtra;
-
-        for (i = 0; i < count; i++) info.width += lpDx[i];
+	int extra = dc->wndExtX / 2;
+        for (i = info.width = 0; i < count; i++) info.width += lpDx[i];
+	info.width = (info.width * dc->vportExtX + extra ) / dc->wndExtX;
     }
     else
-       info.width += count*dc->w.charExtra + dc->w.breakExtra*dc->w.breakCount;
+    {
+	XTextExtents( font, str, count, &dir, &ascent, &descent, &info );
+        info.width += count*dc->w.charExtra + dc->w.breakExtra*dc->w.breakCount;
+    }
 
     switch( dc->w.textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER) )
     {
@@ -200,32 +197,50 @@ X11DRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags,
 
         pitem = items = xmalloc( count * sizeof(XTextItem) );
         delta = i = 0;
-        while (i < count)
-        {
-	    /* initialize text item with accumulated delta */
-
-            pitem->chars  = (char *)str + i;
-	    pitem->delta  = delta; 
-            pitem->nchars = 0;
-            pitem->font   = None;
-            delta = 0;
-
-	    /* stuff characters into the same XTextItem until new delta 
-	     * becomes  non-zero */
-
-	    do
+	if( lpDx ) /* explicit character widths */
+	{
+	    int extra = dc->wndExtX / 2;
+
+	    while (i < count)
+	    {
+		/* initialize text item with accumulated delta */
+
+		pitem->chars  = (char *)str + i;
+		pitem->delta  = delta;
+		pitem->nchars = 0;
+		pitem->font   = None;
+		delta = 0;
+
+		/* add characters  to the same XTextItem until new delta
+		 * becomes  non-zero */
+
+		do
+		{
+		    delta += (lpDx[i] * dc->vportExtX + extra) / dc->wndExtX
+					    - XTextWidth( font, str + i, 1);
+		    pitem->nchars++;
+		} while ((++i < count) && !delta);
+		pitem++;
+	   }
+	}
+	else /* charExtra or breakExtra */
+	{
+            while (i < count)
             {
-                if (lpDx) delta += lpDx[i] - XTextWidth( font, str + i, 1);
-                else
+		pitem->chars  = (char *)str + i;
+		pitem->delta  = delta;
+		pitem->nchars = 0;
+		pitem->font   = None;
+		delta = 0;
+
+		do
                 {
                     delta += dc->w.charExtra;
-                    if (str[i] == (char)dfBreakChar)
-                        delta += dc->w.breakExtra;
-                }
-                pitem->nchars++;
+                    if (str[i] == (char)dfBreakChar) delta += dc->w.breakExtra;
+		    pitem->nchars++;
+                } while ((++i < count) && !delta);
+		pitem++;
             } 
-	    while ((++i < count) && !delta);
-            pitem++;
         }
 
         XDrawText( display, dc->u.x.drawable, dc->u.x.gc,
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index 60aa82fe959..f12d89f3fd6 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -606,6 +606,7 @@ static void XFONT_GetTextMetric( fontObject* pfo, LPTEXTMETRIC32A pTM )
 
     pTM->tmCharSet = pdf->dfCharSet;
     pTM->tmPitchAndFamily = pdf->dfPitchAndFamily;
+
     pTM->tmDigitizedAspectX = pdf->dfHorizRes;
     pTM->tmDigitizedAspectY = pdf->dfVertRes;
 }
@@ -1147,10 +1148,10 @@ BOOL32 X11DRV_FONT_Init( DeviceCaps* pDevCaps )
 
 	if( !fr ) /* add new family */
 	{
-	   if( n_ff++ > MAX_FONT_FAMILIES ) break;
-
+	   if( n_ff >= MAX_FONT_FAMILIES ) break;
 	   if( !LFD_InitFontInfo( fi, lpstr) ) continue;
 
+	   n_ff++;
 	   fr = (fontResource*) HeapAlloc(SystemHeap, 0, sizeof(fontResource)); 
 	   memset(fr, 0, sizeof(fontResource));
 	   fr->resource = (char*) HeapAlloc(SystemHeap, 0, j + 1 );
@@ -1318,8 +1319,11 @@ static UINT32 XFONT_Match( fontMatch* pfm )
 
    pfm->flags = 0;
 
-   if( plf->lfCharSet != DEFAULT_CHARSET &&
-       plf->lfCharSet != pfi->df.dfCharSet ) penalty += 0x200;
+   if( plf->lfCharSet == DEFAULT_CHARSET )
+   {
+       if( (pfi->df.dfCharSet!= ANSI_CHARSET) && (pfi->df.dfCharSet!=DEFAULT_CHARSET) ) penalty += 0x200;
+   }
+   else if (plf->lfCharSet != pfi->df.dfCharSet) penalty += 0x200;
 
    /* TMPF_FIXED_PITCH means exactly the opposite */
 
@@ -1937,7 +1941,7 @@ BOOL32 X11DRV_GetCharWidth( DC *dc, UINT32 firstChar, UINT32 lastChar,
 		    cs = &xfs->per_char[(i - xfs->min_char_or_byte2)]; 
 		    if (CI_NONEXISTCHAR(cs)) cs = def; 
   		} else cs = def;
-		*buffer++ = MAX( cs->width, 0 );
+		*buffer++ = MAX(cs->width, 0 );
 	    }
 	}
 	return TRUE;
@@ -1993,9 +1997,14 @@ INT32 AddFontResource32W( LPCWSTR str )
 /***********************************************************************
  *           RemoveFontResource16    (GDI.136)
  */
-BOOL16 RemoveFontResource16( LPCSTR str )
+BOOL16 RemoveFontResource16( SEGPTR str )
 {
-    return RemoveFontResource32A( str );
+    if (HIWORD(str))
+        fprintf( stdnimp, "STUB: RemoveFontResource('%s')\n",
+		(char *)PTR_SEG_TO_LIN( str) );
+    else
+        fprintf( stdnimp, "STUB: RemoveFontResource(%04x)\n", LOWORD(str) );
+    return TRUE;
 }
 
 
diff --git a/if1632/advapi32.spec b/if1632/advapi32.spec
index 4a88641e02b..792099541bd 100644
--- a/if1632/advapi32.spec
+++ b/if1632/advapi32.spec
@@ -12,7 +12,7 @@ base	0
 0007 stub AddAce
 0008 stub AddAuditAccessAce
 0009 stub AdjustTokenGroups
-0010 stub AdjustTokenPrivileges
+0010 stdcall AdjustTokenPrivileges(long long ptr long ptr ptr) AdjustTokenPrivileges
 0011 stdcall AllocateAndInitializeSid(ptr long long long long long long long long long ptr) AllocateAndInitializeSid
 0012 stdcall AllocateLocallyUniqueId(ptr) AllocateLocallyUniqueId
 0013 stub AreAllAccessesGranted
@@ -94,7 +94,7 @@ base	0
 0089 stub LookupPrivilegeDisplayNameW
 0090 stub LookupPrivilegeNameA
 0091 stub LookupPrivilegeNameW
-0092 stub LookupPrivilegeValueA
+0092 stdcall LookupPrivilegeValueA(ptr ptr ptr) LookupPrivilegeValue32A
 0093 stub LookupPrivilegeValueW
 0094 stub MakeAbsoluteSD
 0095 stub MakeSelfRelativeSD
diff --git a/if1632/builtin.c b/if1632/builtin.c
index 288e3633010..16756875640 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -148,7 +148,7 @@ static BUILTIN_DLL BuiltinDLLs[] =
     /* Win32 DLLs */
     { &ADVAPI32_Descriptor, 0 },
     { &COMCTL32_Descriptor, DLL_FLAG_NOT_USED },
-    { &COMDLG32_Descriptor, DLL_FLAG_NOT_USED },
+    { &COMDLG32_Descriptor, 0 },
     { &CRTDLL_Descriptor,   0 },
     { &OLE32_Descriptor,    DLL_FLAG_NOT_USED },
     { &GDI32_Descriptor,    0 },
diff --git a/if1632/comdlg32.spec b/if1632/comdlg32.spec
index b6fa002b9c0..a42e1a142d6 100644
--- a/if1632/comdlg32.spec
+++ b/if1632/comdlg32.spec
@@ -7,15 +7,15 @@ base	1
 0002 stub ChooseColorW
 0003 stub ChooseFontA
 0004 stub ChooseFontW
-0005 stub CommDlgExtendedError
+0005 stdcall CommDlgExtendedError() CommDlgExtendedError
 0006 stub FindTextA
 0007 stub FindTextW
-0008 stub GetFileTitleA
-0009 stub GetFileTitleW
-0010 stub GetOpenFileNameA
-0011 stub GetOpenFileNameW
-0012 stub GetSaveFileNameA
-0013 stub GetSaveFileNameW
+0008 stdcall GetFileTitleA(ptr ptr long) GetFileTitle32A
+0009 stdcall GetFileTitleW(ptr ptr long) GetFileTitle32W
+0010 stdcall GetOpenFileNameA(ptr) GetOpenFileName32A
+0011 stdcall GetOpenFileNameW(ptr) GetOpenFileName32W
+0012 stdcall GetSaveFileNameA(ptr) GetSaveFileName32A
+0013 stdcall GetSaveFileNameW(ptr) GetSaveFileName32A
 0014 stub LoadAlterBitmap
 0015 stub PageSetupDlgA
 0016 stub PageSetupDlgW
diff --git a/if1632/commdlg.spec b/if1632/commdlg.spec
index 5eb618148db..1a705ea55a5 100644
--- a/if1632/commdlg.spec
+++ b/if1632/commdlg.spec
@@ -1,8 +1,8 @@
 name	commdlg
 type	win16
 
-1   pascal16 GetOpenFileName(segptr) GetOpenFileName
-2   pascal16 GetSaveFileName(segptr) GetSaveFileName
+1   pascal16 GetOpenFileName(segptr) GetOpenFileName16
+2   pascal16 GetSaveFileName(segptr) GetSaveFileName16
 5   pascal16 ChooseColor(ptr) ChooseColor
 6   pascal   FileOpenDlgProc(word word word long) FileOpenDlgProc
 7   pascal   FileSaveDlgProc(word word word long) FileSaveDlgProc
@@ -22,7 +22,7 @@ type	win16
 #23  pascal  EDITINTEGERONLY exported, shared data
 #25  pascal  WANTARROWS exported, shared data
 26  pascal   CommDlgExtendedError() CommDlgExtendedError
-27  pascal16 GetFileTitle(ptr ptr word) GetFileTitle
+27  pascal16 GetFileTitle(str ptr word) GetFileTitle16
 #28  pascal  WEP exported, shared data
 #29  pascal  DWLBSUBCLASS exported, shared data
 #30  pascal  DWUPARROWHACK exported, shared data
diff --git a/if1632/crtdll.spec b/if1632/crtdll.spec
index 7e43ce9f577..42a88053f96 100644
--- a/if1632/crtdll.spec
+++ b/if1632/crtdll.spec
@@ -431,7 +431,7 @@ base	1
 426 stub longjmp
 427 cdecl malloc(ptr) CRTDLL_malloc
 428 stub mblen
-429 stub mbstowcs
+429 cdecl mbstowcs(ptr ptr long) CRTDLL_mbstowcs
 430 cdecl mbtowc(long) CRTDLL_mbtowc
 431 cdecl memchr(ptr long long) memchr
 432 cdecl memcmp(ptr ptr long) memcmp
diff --git a/if1632/ddeml.spec b/if1632/ddeml.spec
index 12c1420b953..8da729c8d34 100644
--- a/if1632/ddeml.spec
+++ b/if1632/ddeml.spec
@@ -20,9 +20,9 @@ type	win16
 18 stub DdeUnaccessData #(word) DdeUnaccessData
 19 stub DdeFreeDataHandle #(word) DdeFreeDataHandle
 20 stub DdeGetLastError #(long) DdeGetLastError
-21 stub DdeCreateStringHandle #(long ptr word) DdeCreateStringHandle
+21 stub DdeCreateStringHandle #(long str word) DdeCreateStringHandle
 22 stub DdeFreeStringHandle #(long word) DdeFreeStringHandle
-23 stub   DdeQueryString #(long word ptr long word) DdeQueryString
+23 stub DdeQueryString #(long word ptr long word) DdeQueryString
 24 stub DdeKeepStringHandle #(long word) DdeKeepStringHandle
 
 26 stub DdeEnableCallback #(long word word) DdeEnableCallback
diff --git a/if1632/dummy.c b/if1632/dummy.c
index cb0758eb4cd..abc792eda84 100644
--- a/if1632/dummy.c
+++ b/if1632/dummy.c
@@ -44,3 +44,4 @@ long stub_USER_919(void) { fprintf(stderr, "Warning: USER_919: unimplemented stu
 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; }
+long stub_KERNEL_700(void) { fprintf(stderr, "Warning: KERNEL_700: unimplemented stub\n"); return 1; }
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 4db37d0531a..f1ef2bd4c19 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -63,7 +63,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 54  pascal16 CreateEllipticRgn(s_word s_word s_word s_word) CreateEllipticRgn16
 55  pascal16 CreateEllipticRgnIndirect(ptr) CreateEllipticRgnIndirect16
 56  pascal16 CreateFont(s_word s_word s_word s_word s_word word word word
-                        word word word word word ptr) CreateFont16
+                        word word word word word str) CreateFont16
 57  pascal16 CreateFontIndirect(ptr) CreateFontIndirect16
 58  pascal16 CreateHatchBrush(word long) CreateHatchBrush16
 60  pascal16 CreatePatternBrush(word) CreatePatternBrush16
@@ -76,7 +76,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 67  pascal16 DPtoLP(word ptr s_word) DPtoLP16
 68  pascal16 DeleteDC(word) DeleteDC16
 69  pascal16 DeleteObject(word) DeleteObject16
-70  pascal16 EnumFonts(word ptr segptr long) THUNK_EnumFonts16
+70  pascal16 EnumFonts(word str segptr long) THUNK_EnumFonts16
 71  pascal16 EnumObjects(word word segptr long) THUNK_EnumObjects16
 72  pascal16 EqualRgn(word word) EqualRgn16
 73  pascal16 ExcludeVisRect(word s_word s_word s_word s_word) ExcludeVisRect
@@ -115,28 +115,28 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 105 pascal16 SelectVisRgn(word word) SelectVisRgn
 106 pascal SetBitmapBits(word long ptr) SetBitmapBits16
 117 pascal SetDCOrg(word s_word s_word) SetDCOrg
-119 pascal16 AddFontResource(ptr) AddFontResource16
+119 pascal16 AddFontResource(str) AddFontResource16
 #121 pascal Death
 #122 pascal ReSurRection
 123 pascal16 PlayMetaFile(word word) PlayMetaFile16
-124 pascal16 GetMetaFile(ptr) GetMetaFile16
-125 pascal16 CreateMetaFile(ptr) CreateMetaFile16
+124 pascal16 GetMetaFile(str) GetMetaFile16
+125 pascal16 CreateMetaFile(str) CreateMetaFile16
 126 pascal16 CloseMetaFile(word) CloseMetaFile16
 127 pascal16 DeleteMetaFile(word) DeleteMetaFile16
 128 pascal16 MulDiv(s_word s_word s_word) MulDiv16
 129 pascal16 SaveVisRgn(word) SaveVisRgn
 130 pascal16 RestoreVisRgn(word) RestoreVisRgn
 131 pascal16 InquireVisRgn(word) InquireVisRgn
-132 pascal16 SetEnvironment(ptr ptr word) SetEnvironment
-133 pascal16 GetEnvironment(ptr ptr word) GetEnvironment
+132 pascal16 SetEnvironment(str str word) SetEnvironment
+133 pascal16 GetEnvironment(str str word) GetEnvironment
 134 pascal16 GetRgnBox(word ptr) GetRgnBox16
 #135 pascal ScanLr
-136 pascal16 RemoveFontResource(ptr) RemoveFontResource16
+136 pascal16 RemoveFontResource(segptr) RemoveFontResource16
 148 pascal SetBrushOrg(word s_word s_word) SetBrushOrg
 149 pascal GetBrushOrg(word) GetBrushOrg
 150 pascal16 UnrealizeObject(word) UnrealizeObject16
-151 pascal16 CopyMetaFile(word ptr) CopyMetaFile16
-153 pascal16 CreateIC(ptr ptr ptr ptr) CreateIC16
+151 pascal16 CopyMetaFile(word str) CopyMetaFile16
+153 pascal16 CreateIC(str str str ptr) CreateIC16
 154 pascal   GetNearestColor(word long) GetNearestColor16
 155 stub QueryAbort
 156 pascal16 CreateDiscardableBitmap(word word word) CreateDiscardableBitmap16
@@ -219,7 +219,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 307 pascal16 GetCharABCWidths(word word word ptr) GetCharABCWidths16
 308 stub GetOutLineTextMetrics
 309 pascal   GetGlyphOutline(word word word ptr long ptr ptr) GetGlyphOutline16
-310 pascal16 CreateScalableFontResource(word ptr ptr ptr) CreateScalableFontResource16
+310 pascal16 CreateScalableFontResource(word str str str) CreateScalableFontResource16
 311 stub GetFontData
 312 stub ConvertOutLineFontFile
 313 pascal16 GetRasterizerCaps(ptr word) GetRasterizerCaps16
@@ -227,7 +227,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 315 stub EngineRealizeFontExt
 316 stub EngineGetCharWidthStr
 317 stub EngineGetGlyphBmpExt
-330 pascal16 EnumFontFamilies(word ptr segptr long) THUNK_EnumFontFamilies16
+330 pascal16 EnumFontFamilies(word str segptr long) THUNK_EnumFontFamilies16
 332 pascal16 GetKerningPairs(word word ptr) GetKerningPairs16
 345 pascal16 GetTextAlign(word) GetTextAlign16
 346 pascal16 SetTextAlign(word word) SetTextAlign16
@@ -380,7 +380,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 609 stub GDIFreeResources
 610 stub GDISignalProc32
 611 stub GetRandomRgn
-612 stub GetTextCharSet
+612 pascal16 GetTextCharset(word) GetTextCharset16
 613 pascal16 EnumFontFamiliesEx(word ptr segptr long long) THUNK_EnumFontFamiliesEx16
 614 stub AddLpkToGDI
 615 stub GetCharacterPlacement
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index 7e6131e6e66..5cf890af671 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -134,7 +134,7 @@ base	1
 0126 stub GdiDeleteLocalDC
 0127 stub GdiDeleteLocalObject
 0128 stub GdiFlush
-0129 stub GdiGetBatchLimit
+0129 return GdiGetBatchLimit 0 1
 0130 stub GdiGetLocalBrush
 0131 stub GdiGetLocalDC
 0132 stub GdiGetLocalFont
@@ -193,7 +193,7 @@ base	1
 0185 stub GetGlyphOutline
 0186 stdcall GetGlyphOutlineA(long long long ptr long ptr ptr) GetGlyphOutline32A
 0187 stdcall GetGlyphOutlineW(long long long ptr long ptr ptr) GetGlyphOutline32W
-0188 stub GetGraphicsMode
+0188 return GetGraphicsMode 4 1 	# just return 1
 0189 stub GetICMProfileA
 0190 stub GetICMProfileW
 0191 stub GetKerningPairs
@@ -231,7 +231,7 @@ base	1
 0223 stdcall GetSystemPaletteUse() GetSystemPaletteUse32
 0224 stdcall GetTextAlign(long) GetTextAlign32
 0225 stdcall GetTextCharacterExtra(long) GetTextCharacterExtra32
-0226 stub GetTextCharset
+0226 stdcall GetTextCharset(long) GetTextCharset32
 0227 stdcall GetTextColor(long) GetTextColor32
 0228 stdcall GetTextExtentExPointA(long ptr long long ptr ptr ptr) GetTextExtentExPoint32A
 0229 stdcall GetTextExtentExPointW(long ptr long long ptr ptr ptr) GetTextExtentExPoint32W
@@ -249,7 +249,7 @@ base	1
 0241 stub GetWinMetaFileBits
 0242 stdcall GetWindowExtEx(long ptr) GetWindowExtEx32
 0243 stdcall GetWindowOrgEx(long ptr) GetWindowOrgEx32
-0244 stub GetWorldTransform
+0244 return GetWorldTransform 8 0
 0245 stdcall IntersectClipRect(long long long long long) IntersectClipRect32
 0246 stdcall InvertRgn(long long) InvertRgn32
 0247 stdcall LPtoDP(long ptr long) LPtoDP32
@@ -323,7 +323,7 @@ base	1
 0314 stub SetDeviceGammaRamp
 0315 stub SetEnhMetaFileBits
 0316 stub SetFontEnumeration
-0317 stub SetGraphicsMode
+0317 return SetGraphicsMode 8 1
 0318 stub SetICMMode
 0319 stub SetICMProfileA
 0320 stub SetICMProfileW
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index af3761c8917..6c4c9a9ed8e 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -41,7 +41,7 @@ type	win16
 38  pascal   SetTaskSignalProc(word segptr) SetTaskSignalProc
 41  return EnableDos 0 0
 42  return DisableDos 0 0
-45  pascal16 LoadModule(ptr ptr) LoadModule16
+45  pascal16 LoadModule(str ptr) LoadModule16
 46  pascal16 FreeModule(word) FreeModule16
 47  pascal16 GetModuleHandle(segptr) WIN16_GetModuleHandle
 48  pascal16 GetModuleUsage(word) GetModuleUsage
@@ -53,9 +53,9 @@ type	win16
 54  pascal16 GetInstanceData(word word word) GetInstanceData
 55  pascal16 Catch(ptr) Catch 
 56  pascal16 Throw(ptr word) Throw
-57  pascal16 GetProfileInt(ptr ptr s_word) GetProfileInt16
-58  pascal16 GetProfileString(ptr ptr ptr ptr word) GetProfileString16
-59  pascal16 WriteProfileString(ptr ptr ptr) WriteProfileString16
+57  pascal16 GetProfileInt(str str s_word) GetProfileInt16
+58  pascal16 GetProfileString(str str str ptr word) GetProfileString16
+59  pascal16 WriteProfileString(str str str) WriteProfileString16
 60  pascal16 FindResource(word segptr segptr) FindResource16
 61  pascal16 LoadResource(word word) LoadResource16
 62  pascal LockResource(word) WIN16_LockResource16
@@ -63,14 +63,14 @@ type	win16
 64  pascal16 AccessResource(word word) AccessResource16
 65  pascal SizeofResource(word word) SizeofResource16
 66  pascal16 AllocResource(word word long) AllocResource16
-67  pascal SetResourceHandler(word ptr ptr) SetResourceHandler
+67  pascal SetResourceHandler(word segptr ptr) SetResourceHandler
 68  pascal16 InitAtomTable(word) InitAtomTable16
 69  pascal16 FindAtom(segptr) FindAtom16
 70  pascal16 AddAtom(segptr) AddAtom16
 71  pascal16 DeleteAtom(word) DeleteAtom16
 72  pascal16 GetAtomName(word ptr word) GetAtomName16
 73  pascal16 GetAtomHandle(word) GetAtomHandle
-74  pascal16 OpenFile(ptr ptr word) OpenFile16
+74  pascal16 OpenFile(str ptr word) OpenFile16
 75  stub OpenPathName
 76  stub DeletePathName
 77 stub KERNEL_77		#RESERVED1
@@ -79,21 +79,21 @@ type	win16
 #80 RESERVED4
 81  pascal16 _lclose(word) _lclose16
 82  pascal16 _lread(word segptr word) WIN16_lread
-83  pascal16 _lcreat(ptr word) _lcreat16
+83  pascal16 _lcreat(str word) _lcreat16
 84  pascal   _llseek(word long word) _llseek16
-85  pascal16 _lopen(ptr word) _lopen16
+85  pascal16 _lopen(str word) _lopen16
 86  pascal16 _lwrite(word ptr word) _lwrite16
-87  pascal16 RESERVED5(ptr ptr) lstrcmp16
-88  pascal   lstrcpy(segptr segptr) lstrcpy16
-89  pascal   lstrcat(segptr segptr) lstrcat16
-90  pascal16 lstrlen(ptr) lstrlen16
+87  pascal16 RESERVED5(str str) lstrcmp16
+88  pascal   lstrcpy(segptr str) lstrcpy16
+89  pascal   lstrcat(segptr str) lstrcat16
+90  pascal16 lstrlen(str) lstrlen16
 91  register InitTask() InitTask
 92  pascal   GetTempDrive(byte) WIN16_GetTempDrive
 93  pascal16 GetCodeHandle(segptr) GetCodeHandle
 94  stub DefineHandleTable
-95  pascal16 LoadLibrary(ptr) LoadLibrary16
+95  pascal16 LoadLibrary(str) LoadLibrary16
 96  pascal16 FreeLibrary(word) FreeLibrary16
-97  pascal16 GetTempFileName(byte ptr word ptr) GetTempFileName16
+97  pascal16 GetTempFileName(byte str word ptr) GetTempFileName16
 98  return GetLastDiskChange 0 0
 99  stub GetLPErrMode
 100 return ValidateCodeSegments 0 0
@@ -111,7 +111,7 @@ type	win16
 112 pascal16 GlobalUnWire(word) GlobalUnWire16
 113 equate __AHSHIFT 3
 114 equate __AHINCR 8
-115 pascal16 OutputDebugString(ptr) OutputDebugString16
+115 pascal16 OutputDebugString(str) OutputDebugString16
 116 stub InitLib
 117 pascal16 OldYield() OldYield
 118 register GetTaskQueueDS() GetTaskQueueDS
@@ -123,10 +123,10 @@ type	win16
 124 return EnableKernel 0 0
 125 return DisableKernel 0 0
 126 stub MemoryFreed
-127 pascal16 GetPrivateProfileInt(ptr ptr s_word ptr) GetPrivateProfileInt16
-128 pascal16 GetPrivateProfileString(ptr ptr ptr ptr word ptr)
+127 pascal16 GetPrivateProfileInt(str str s_word str) GetPrivateProfileInt16
+128 pascal16 GetPrivateProfileString(str str str ptr word str)
              GetPrivateProfileString16
-129 pascal16 WritePrivateProfileString(ptr ptr ptr ptr)
+129 pascal16 WritePrivateProfileString(str str str str)
              WritePrivateProfileString16
 130 pascal FileCDR(ptr) FileCDR
 131 pascal GetDOSEnvironment() GetDOSEnvironment
@@ -135,7 +135,7 @@ type	win16
 134 pascal16 GetWindowsDirectory(ptr word) GetWindowsDirectory16
 135 pascal16 GetSystemDirectory(ptr word) GetSystemDirectory16
 136 pascal16 GetDriveType(byte) GetDriveType16
-137 pascal16 FatalAppExit(word ptr) FatalAppExit16
+137 pascal16 FatalAppExit(word str) FatalAppExit16
 138 pascal GetHeapSpaces(word) GetHeapSpaces
 139 stub DoSignal
 140 pascal16 SetSigHandler(segptr ptr ptr word word) SetSigHandler
@@ -163,7 +163,7 @@ type	win16
 163 pascal16 GlobalLRUOldest(word) GlobalLRUOldest
 164 pascal16 GlobalLRUNewest(word) GlobalLRUNewest
 165 return A20Proc 2 0
-166 pascal16 WinExec(ptr word) WinExec16
+166 pascal16 WinExec(str word) WinExec16
 167 pascal16 GetExpWinVer(word) GetExpWinVer
 168 pascal16 DirectResAlloc(word word word) DirectResAlloc
 169 pascal GetFreeSpace(word) GetFreeSpace16
@@ -268,8 +268,8 @@ type	win16
 349 pascal   _hread(word segptr long) WIN16_hread
 350 pascal   _hwrite(word ptr long) _hwrite16
 #351 BUNNY_351
-352 pascal   lstrcatn(segptr segptr word) lstrcatn16
-353 pascal   lstrcpyn(segptr segptr word) lstrcpyn16
+352 pascal   lstrcatn(segptr str word) lstrcatn16
+353 pascal   lstrcpyn(segptr str word) lstrcpyn16
 354 pascal   GetAppCompatFlags(word) GetAppCompatFlags16
 355 pascal16 GetWinDebugInfo(ptr word) GetWinDebugInfo
 356 pascal16 SetWinDebugInfo(ptr) SetWinDebugInfo
@@ -311,6 +311,7 @@ type	win16
 472 stub KERNEL_472
 473 stub KERNEL_473
 482 stub KERNEL_482
+485 stub KERNEL_485
 491 stub RegisterServiceProcess
 500 stub KERNEL_500
 502 stub KERNEL_502
@@ -338,4 +339,4 @@ type	win16
 630 stub KERNEL_630
 631 stub FUNC004	# shell hook
 651 stub KERNEL_651
-700 return KERNEL_700 0 1
+700 pascal KERNEL_700() stub_KERNEL_700
diff --git a/if1632/lzexpand.spec b/if1632/lzexpand.spec
index a12c7e223f8..134347c046f 100644
--- a/if1632/lzexpand.spec
+++ b/if1632/lzexpand.spec
@@ -2,7 +2,7 @@ name	lzexpand
 type	win16
 
 1  pascal   LZCopy(word word) LZCopy16
-2  pascal16 LZOpenFile(ptr ptr word) LZOpenFile16
+2  pascal16 LZOpenFile(str ptr word) LZOpenFile16
 3  pascal16 LZInit(word) LZInit16
 4  pascal   LZSeek(word long word) LZSeek16
 5  pascal16 LZRead(word ptr word) LZRead16
@@ -10,6 +10,6 @@ type	win16
 7  pascal16 LZStart() LZStart16
 8  pascal   CopyLZFile(word word) CopyLZFile16
 9  pascal16 LZDone() LZDone
-10 pascal16 GetExpandedName(ptr ptr) GetExpandedName16
+10 pascal16 GetExpandedName(str ptr) GetExpandedName16
 #11 WEP
 #12 ___EXPORTEDSTUB 
diff --git a/if1632/olesvr.spec b/if1632/olesvr.spec
index 922da545e8f..3eac9779c7a 100644
--- a/if1632/olesvr.spec
+++ b/if1632/olesvr.spec
@@ -2,11 +2,11 @@ name	olesvr
 type	win16
 
 #1 WEP
-2  pascal OleRegisterServer(ptr ptr ptr word word) OleRegisterServer
+2  pascal OleRegisterServer(str ptr ptr word word) OleRegisterServer
 3  pascal OleRevokeServer(long) OleRevokeServer
 4  pascal OleBlockServer(long) OleBlockServer
 5  pascal OleUnblockServer(long ptr) OleUnblockServer
-6  pascal OleRegisterServerDoc(long ptr ptr ptr) OleRegisterServerDoc
+6  pascal OleRegisterServerDoc(long str ptr ptr) OleRegisterServerDoc
 7  pascal OleRevokeServerDoc(long) OleRevokeServerDoc
 8 stub OLERENAMESERVERDOC
 9 stub OLEREVERTSERVERDOC
diff --git a/if1632/relay.c b/if1632/relay.c
index 7f478f1bd7a..642f0e7b910 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -82,6 +82,7 @@ void RELAY_DebugCallFrom16( int func_type, char *args,
             break;
         case 'l':
         case 'p':
+        case 't':
             args16 += 4;
             break;
         }
@@ -100,6 +101,14 @@ void RELAY_DebugCallFrom16( int func_type, char *args,
             args16 -= 4;
             printf( "0x%08x", *(int *)args16 );
             break;
+        case 't':
+            args16 -= 4;
+            if (HIWORD(*(int *)args16))
+                printf( "0x%08x \"%s\"", *(int *)args16,
+                        (char *)PTR_SEG_TO_LIN(*(int *)args16) );
+            else
+                printf( "0x%08x", *(int *)args16 );
+            break;
         case 'p':
             args16 -= 4;
             printf( "%04x:%04x", *(WORD *)(args16+2), *(WORD *)args16 );
@@ -386,6 +395,7 @@ WIN16_CallProc32W() {
 	DWORD	argconvmask = win_stack[1];
 	FARPROC32	proc32 = (FARPROC32)win_stack[2];
 	DWORD	*args,ret;
+        STACK16FRAME stf16;
 	int	i;
 
 	fprintf(stderr,"CallProc32W(%ld,%ld,%p,args[",nrofargs,argconvmask,proc32);
@@ -419,6 +429,16 @@ WIN16_CallProc32W() {
 		ret = 0;
 		break;
 	}
+	/* POP nrofargs DWORD arguments and 3 DWORD parameters */
+	/* FIXME: this is a BAD hack, but I don't see any other way to
+	 * pop a variable number of arguments.  -MM
+	 * The -2 in the size is for not copying WORD args[0] (which would
+	 * overwrite the top WORD on the return stack)
+	 */
+	memcpy(&stf16,CURRENT_STACK16,sizeof(stf16)-2);
+	IF1632_Saved16_sp += (3+nrofargs)*sizeof(DWORD);
+	memcpy(CURRENT_STACK16,&stf16,sizeof(stf16)-2);
+
 	fprintf(stderr,"returns %08lx\n",ret);
 	free(args);
 	return ret;
diff --git a/if1632/shell.spec b/if1632/shell.spec
index 74e9ef37425..00ec20e5893 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -1,22 +1,22 @@
 name	shell
 type	win16
 
-  1 pascal   RegOpenKey(long ptr ptr) RegOpenKey16
-  2 pascal   RegCreateKey(long ptr ptr) RegCreateKey16
+  1 pascal   RegOpenKey(long str ptr) RegOpenKey16
+  2 pascal   RegCreateKey(long str ptr) RegCreateKey16
   3 pascal   RegCloseKey(long) RegCloseKey
-  4 pascal   RegDeleteKey(long ptr) RegDeleteKey16
-  5 pascal   RegSetValue(long ptr long ptr long) RegSetValue16
-  6 pascal   RegQueryValue(long ptr ptr ptr) RegQueryValue16
+  4 pascal   RegDeleteKey(long str) RegDeleteKey16
+  5 pascal   RegSetValue(long str long str long) RegSetValue16
+  6 pascal   RegQueryValue(long str ptr ptr) RegQueryValue16
   7 pascal   RegEnumKey(long long ptr long) RegEnumKey16
   9 pascal16 DragAcceptFiles(word word) DragAcceptFiles
  11 pascal16 DragQueryFile(word s_word ptr s_word) DragQueryFile
  12 pascal16 DragFinish(word) DragFinish
  13 pascal16 DragQueryPoint(word ptr) DragQueryPoint
- 20 pascal16 ShellExecute(word ptr ptr ptr ptr s_word) ShellExecute16
- 21 pascal16 FindExecutable(ptr ptr ptr) FindExecutable16
+ 20 pascal16 ShellExecute(word str str str str s_word) ShellExecute16
+ 21 pascal16 FindExecutable(str str ptr) FindExecutable16
  22 pascal16 ShellAbout(word ptr ptr word) ShellAbout16
  33 pascal16 AboutDlgProc(word word word long) AboutDlgProc16
- 34 pascal16 ExtractIcon(word ptr s_word) ExtractIcon16
+ 34 pascal16 ExtractIcon(word str s_word) ExtractIcon16
  36 pascal16 ExtractAssociatedIcon(word ptr ptr) ExtractAssociatedIcon
  37 pascal   DoEnvironmentSubst(ptr word) DoEnvironmentSubst
  38 pascal   FindEnvironmentString(ptr) FindEnvironmentString
diff --git a/if1632/user.spec b/if1632/user.spec
index fe0c4f750c7..2977f4a052f 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -2,7 +2,7 @@ name	user
 type	win16
 heap	65520
 
-1   pascal16 MessageBox(word ptr ptr word) MessageBox16
+1   pascal16 MessageBox(word str str word) MessageBox16
 2   stub OldExitWindows
 3   stub EnableOEMLayer
 4   stub DisableOEMLayer
@@ -40,7 +40,7 @@ heap	65520
 38  pascal16 GetWindowTextLength(word) GetWindowTextLength16
 39  pascal16 BeginPaint(word ptr) BeginPaint16
 40  pascal16 EndPaint(word ptr) EndPaint16
-41  pascal16 CreateWindow(ptr ptr long s_word s_word s_word s_word
+41  pascal16 CreateWindow(str str long s_word s_word s_word s_word
 	                  word word word segptr) CreateWindow16
 42  pascal16 ShowWindow(word word) ShowWindow16
 43  pascal16 CloseWindow(word) CloseWindow16
@@ -50,7 +50,7 @@ heap	65520
 47  pascal16 IsWindow(word) IsWindow16
 48  pascal16 IsChild(word word) IsChild16
 49  pascal16 IsWindowVisible(word) IsWindowVisible16
-50  pascal16 FindWindow(segptr ptr) FindWindow16
+50  pascal16 FindWindow(segptr str) FindWindow16
 #51 BEAR51
 52  pascal16 AnyPopup() AnyPopup16
 53  pascal16 DestroyWindow(word) DestroyWindow16
@@ -170,7 +170,7 @@ heap	65520
 168 pascal16 SetCaretBlinkTime(word) SetCaretBlinkTime16
 169 pascal16 GetCaretBlinkTime() GetCaretBlinkTime16
 170 pascal16 ArrangeIconicWindows(word) ArrangeIconicWindows16
-171 pascal16 WinHelp(word ptr word long) WinHelp16
+171 pascal16 WinHelp(word str word long) WinHelp16
 172 pascal16 SwitchToThisWindow(word word) SwitchToThisWindow16
 173 pascal16 LoadCursor(word segptr) LoadCursor16
 174 pascal16 LoadIcon(word segptr) LoadIcon16
@@ -200,7 +200,7 @@ heap	65520
 197 pascal   GetTabbedTextExtent(word ptr word word ptr) GetTabbedTextExtent16
 198 pascal16 CascadeChildWindows(word word) CascadeChildWindows
 199 pascal16 TileChildWindows(word word) TileChildWindows
-200 pascal16 OpenComm(ptr word word) OpenComm
+200 pascal16 OpenComm(str word word) OpenComm
 201 pascal16 SetCommState(ptr) SetCommState16
 202 pascal16 GetCommState(word ptr) GetCommState16
 203 pascal16 GetCommError(word ptr) GetCommError
@@ -254,7 +254,7 @@ heap	65520
 249 pascal16 GetAsyncKeyState(word) GetAsyncKeyState16
 250 pascal16 GetMenuState(word word word) GetMenuState16
 251 pascal   SendDriverMessage(word word long long) SendDriverMessage
-252 pascal16 OpenDriver(ptr ptr long) OpenDriver
+252 pascal16 OpenDriver(str str long) OpenDriver
 253 pascal   CloseDriver(word long long) CloseDriver
 254 pascal16 GetDriverModuleHandle(word) GetDriverModuleHandle
 255 pascal   DefDriverProc(long word word long long) DefDriverProc
@@ -377,15 +377,15 @@ heap	65520
 427 pascal16 FindWindowEx(word word segptr ptr) FindWindowEx16
 428 stub TileWindows
 429 stub CascadeWindows
-430 pascal16 lstrcmp(ptr ptr) lstrcmp16
+430 pascal16 lstrcmp(str str) lstrcmp16
 431 pascal   AnsiUpper(segptr) AnsiUpper16
 432 pascal   AnsiLower(segptr) AnsiLower16
 433 pascal16 IsCharAlpha(byte) IsCharAlpha16
 434 pascal16 IsCharAlphanumeric(byte) IsCharAlphanumeric16
 435 pascal16 IsCharUpper(byte) IsCharUpper16
 436 pascal16 IsCharLower(byte) IsCharLower16
-437 pascal16 AnsiUpperBuff(ptr word) AnsiUpperBuff16
-438 pascal16 AnsiLowerBuff(ptr word) AnsiLowerBuff16
+437 pascal16 AnsiUpperBuff(str word) AnsiUpperBuff16
+438 pascal16 AnsiLowerBuff(str word) AnsiLowerBuff16
 441 stub InsertMenuItem
 443 stub GetMenuItemInfo
 445 pascal   DefFrameProc(word word word word long) DefFrameProc16
@@ -395,7 +395,7 @@ heap	65520
 449 stub DrawState
 450 stub CreateIconFromResourceEx
 451 pascal16 TranslateMDISysAccel(word ptr) TranslateMDISysAccel16
-452 pascal16 CreateWindowEx(long ptr ptr long s_word s_word s_word s_word
+452 pascal16 CreateWindowEx(long str str long s_word s_word s_word s_word
                             word word word segptr) CreateWindowEx16
 454 pascal16 AdjustWindowRectEx(ptr long word long) AdjustWindowRectEx16
 455 pascal16 GetIconID(word long) GetIconID
@@ -411,7 +411,7 @@ heap	65520
 465 pascal16 DragDetect(word long) DragDetect16
 466 pascal16 DrawFocusRect(word ptr) DrawFocusRect16
 470 stub StringFunc
-471 pascal16 lstrcmpi(ptr ptr) lstrcmpi16
+471 pascal16 lstrcmpi(str str) lstrcmpi16
 472 pascal   AnsiNext(segptr) AnsiNext16
 473 pascal   AnsiPrev(segptr segptr) AnsiPrev16
 475 pascal16 SetScrollInfo(word s_word ptr word) SetScrollInfo16
diff --git a/if1632/user32.spec b/if1632/user32.spec
index ff7dd1aca66..0256cb05b50 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -140,7 +140,7 @@ base	1
 0133 stdcall DestroyMenu(long) DestroyMenu32
 0134 stdcall DestroyWindow(long) DestroyWindow32
 0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long) DialogBoxIndirectParam32A
-0136 stub DialogBoxIndirectParamAorW
+0136 stdcall DialogBoxIndirectParamAorW(long ptr long ptr long) DialogBoxIndirectParam32A
 0137 stdcall DialogBoxIndirectParamW(long ptr long ptr long) DialogBoxIndirectParam32W
 0138 stdcall DialogBoxParamA(long ptr long ptr long) DialogBoxParam32A
 0139 stdcall DialogBoxParamW(long ptr long ptr long) DialogBoxParam32W
diff --git a/include/commdlg.h b/include/commdlg.h
index 4e85561d1c3..61ac06fc7fe 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -43,6 +43,9 @@ extern "C" {
 #define OFN_NOREADONLYRETURN         0x00008000
 #define OFN_NOTESTFILECREATE         0x00010000
 
+#define OFN_UNICODE		     0x40000000	/*to differ between 32W/A hook*/
+#define OFN_WINE32		     0x80000000	/* comdlg32 */
+
 #define OFN_SHAREFALLTHROUGH     2
 #define OFN_SHARENOWARN          1
 #define OFN_SHAREWARN            0
@@ -68,9 +71,56 @@ typedef struct {
 	LPARAM 		lCustData;
         WNDPROC16       lpfnHook;
 	SEGPTR 		lpTemplateName;
-	}   OPENFILENAME;
-typedef OPENFILENAME * LPOPENFILENAME;
+}   OPENFILENAME16,*LPOPENFILENAME16;
+
+typedef struct {
+	DWORD		lStructSize;
+	HWND32		hwndOwner;
+	HINSTANCE32	hInstance;
+	LPCSTR		lpstrFilter;
+	LPSTR		lpstrCustomFilter;
+	DWORD		nMaxCustFilter;
+	DWORD		nFilterIndex;
+	LPSTR		lpstrFile;
+	DWORD		nMaxFile;
+	LPSTR		lpstrFileTitle;
+	DWORD		nMaxFileTitle;
+	LPCSTR		lpstrInitialDir;
+	LPCSTR		lpstrTitle;
+	DWORD		Flags;
+	WORD		nFileOffset;
+	WORD		nFileExtension;
+	LPCSTR		lpstrDefExt;
+	LPARAM		lCustData;
+	WNDPROC32	lpfnHook;
+	LPCSTR		lpTemplateName;
+} OPENFILENAME32A,*LPOPENFILENAME32A;
+
+typedef struct {
+	DWORD		lStructSize;
+	HWND32		hwndOwner;
+	HINSTANCE32	hInstance;
+	LPCWSTR		lpstrFilter;
+	LPWSTR		lpstrCustomFilter;
+	DWORD		nMaxCustFilter;
+	DWORD		nFilterIndex;
+	LPWSTR		lpstrFile;
+	DWORD		nMaxFile;
+	LPWSTR		lpstrFileTitle;
+	DWORD		nMaxFileTitle;
+	LPCWSTR		lpstrInitialDir;
+	LPCWSTR		lpstrTitle;
+	DWORD		Flags;
+	WORD		nFileOffset;
+	WORD		nFileExtension;
+	LPCWSTR		lpstrDefExt;
+	LPARAM		lCustData;
+	WNDPROC32	lpfnHook;
+	LPCWSTR		lpTemplateName;
+} OPENFILENAME32W,*LPOPENFILENAME32W;
 
+DECL_WINELIB_TYPE_AW(OPENFILENAME);
+DECL_WINELIB_TYPE_AW(LPOPENFILENAME);
 
 typedef struct {
 	DWORD		lStructSize;
@@ -82,7 +132,7 @@ typedef struct {
 	LPARAM		lCustData;
         WNDPROC16       lpfnHook;
 	SEGPTR 		lpTemplateName;
-	} CHOOSECOLOR;
+} CHOOSECOLOR;
 typedef CHOOSECOLOR *LPCHOOSECOLOR;
 
 #define CC_RGBINIT               0x00000001
@@ -278,9 +328,18 @@ typedef DEVNAMES * LPDEVNAMES;
 BOOL16  ChooseColor(LPCHOOSECOLOR lpChCol);
 DWORD CommDlgExtendedError(void);
 HWND16 FindText( SEGPTR find);
-short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf);
-BOOL16  GetOpenFileName(SEGPTR ofn);
-BOOL16  GetSaveFileName(SEGPTR ofn);
+INT16 GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf);
+INT16 GetFileTitle32A(LPCSTR lpFile, LPSTR lpTitle, UINT32 cbBuf);
+INT16 GetFileTitle32W(LPCWSTR lpFile, LPWSTR lpTitle, UINT32 cbBuf);
+#define GetFileTitle WINELIB_NAME_AW(GetFileTitle)
+BOOL16  GetOpenFileName16(SEGPTR ofn);
+BOOL32  GetOpenFileName32A(LPOPENFILENAME32A ofn);
+BOOL32  GetOpenFileName32W(LPOPENFILENAME32W ofn);
+#define GetOpenFileName WINELIB_NAME_AW(GetOpenFileName)
+BOOL16  GetSaveFileName16(SEGPTR ofn);
+BOOL32  GetSaveFileName32A(LPOPENFILENAME32A ofn);
+BOOL32  GetSaveFileName32W(LPOPENFILENAME32W ofn);
+#define GetSaveFileName WINELIB_NAME_AW(GetSaveFileName)
 BOOL16  PrintDlg( SEGPTR print);
 HWND16 ReplaceText( SEGPTR find);
 BOOL16  ChooseFont(LPCHOOSEFONT lpChFont);
diff --git a/include/mmsystem.h b/include/mmsystem.h
index 29cb8ea7582..2941b4a266b 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -171,7 +171,8 @@ typedef struct wavehdr_tag {
     DWORD       dwUser;                 /* for client's use */
     DWORD       dwFlags;                /* assorted flags (see defines) */
     DWORD       dwLoops;                /* loop control counter */
-    struct wavehdr_tag *lpNext;         /* reserved for driver */
+/*    struct wavehdr_tag *lpNext;*/         
+    SEGPTR      lp16Next;               /* reserved for driver */
     DWORD       reserved;               /* reserved for driver */
 } WAVEHDR, *LPWAVEHDR;
 
diff --git a/include/windows.h b/include/windows.h
index dc3a49457b4..fe00984f6e1 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -5122,7 +5122,7 @@ INT16      SetEnvironment(LPCSTR,LPCSTR,UINT16);
 WORD       SetHookFlags(HDC16,WORD);
 HMETAFILE16 SetMetaFileBits(HGLOBAL16);
 VOID       SetPriority(HTASK16,INT16);
-FARPROC16  SetResourceHandler(HINSTANCE16,LPSTR,FARPROC16);
+FARPROC16  SetResourceHandler(HINSTANCE16,SEGPTR,FARPROC16);
 WORD       SetSelectorBase(WORD,DWORD);
 WORD       SetSelectorLimit(WORD,DWORD);
 LONG       SetSwapAreaSize(WORD);
@@ -6949,7 +6949,7 @@ BOOL16     RemoveDirectory16(LPCSTR);
 BOOL32     RemoveDirectory32A(LPCSTR);
 BOOL32     RemoveDirectory32W(LPCWSTR);
 #define    RemoveDirectory WINELIB_NAME_AW(RemoveDirectory)
-BOOL16     RemoveFontResource16(LPCSTR);
+BOOL16     RemoveFontResource16(SEGPTR);
 BOOL32     RemoveFontResource32A(LPCSTR);
 BOOL32     RemoveFontResource32W(LPCWSTR);
 #define    RemoveFontResource WINELIB_NAME_AW(RemoveFontResource)
@@ -7413,11 +7413,11 @@ BOOL16     WriteProfileString16(LPCSTR,LPCSTR,LPCSTR);
 BOOL32     WriteProfileString32A(LPCSTR,LPCSTR,LPCSTR);
 BOOL32     WriteProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR);
 #define    WriteProfileString WINELIB_NAME_AW(WriteProfileString)
-SEGPTR     lstrcat16(SEGPTR,SEGPTR);
+SEGPTR     lstrcat16(SEGPTR,LPCSTR);
 LPSTR      lstrcat32A(LPSTR,LPCSTR);
 LPWSTR     lstrcat32W(LPWSTR,LPCWSTR);
 #define    lstrcat WINELIB_NAME_AW(lstrcat)
-SEGPTR     lstrcatn16(SEGPTR,SEGPTR,INT16);
+SEGPTR     lstrcatn16(SEGPTR,LPCSTR,INT16);
 LPSTR      lstrcatn32A(LPSTR,LPCSTR,INT32);
 LPWSTR     lstrcatn32W(LPWSTR,LPCWSTR,INT32);
 #define    lstrcatn WINELIB_NAME_AW(lstrcatn)
@@ -7429,11 +7429,11 @@ INT16      lstrcmpi16(LPCSTR,LPCSTR);
 INT32      lstrcmpi32A(LPCSTR,LPCSTR);
 INT32      lstrcmpi32W(LPCWSTR,LPCWSTR);
 #define    lstrcmpi WINELIB_NAME_AW(lstrcmpi)
-SEGPTR     lstrcpy16(SEGPTR,SEGPTR);
+SEGPTR     lstrcpy16(SEGPTR,LPCSTR);
 LPSTR      lstrcpy32A(LPSTR,LPCSTR);
 LPWSTR     lstrcpy32W(LPWSTR,LPCWSTR);
 #define    lstrcpy WINELIB_NAME_AW(lstrcpy)
-SEGPTR     lstrcpyn16(SEGPTR,SEGPTR,INT16);
+SEGPTR     lstrcpyn16(SEGPTR,LPCSTR,INT16);
 LPSTR      lstrcpyn32A(LPSTR,LPCSTR,INT32);
 LPWSTR     lstrcpyn32W(LPWSTR,LPCWSTR,INT32);
 #define    lstrcpyn WINELIB_NAME_AW(lstrcpyn)
diff --git a/loader/resource.c b/loader/resource.c
index 37dc9c1a58d..a569850298b 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -748,12 +748,14 @@ INT32 LoadMessage32W( HINSTANCE32 instance, UINT32 id, WORD lang,
  *	SetResourceHandler	(KERNEL.43)
  */
 FARPROC16
-SetResourceHandler(HINSTANCE16 instance,LPSTR s,FARPROC16 farproc)
+SetResourceHandler(HINSTANCE16 instance,SEGPTR s,FARPROC16 farproc)
 {
     if (HIWORD(s))
-	fprintf(stderr,"SetResourceHandler(%04x,%s,%p), empty STUB!\n",instance,s,farproc);
+	fprintf(stderr,"SetResourceHandler(%04x,%s,%p), empty STUB!\n",
+		instance,(char*)PTR_SEG_TO_LIN(s),farproc);
     else
-	fprintf(stderr,"SetResourceHandler(%04x,0x%04x,%p), empty STUB!\n",instance,LOWORD(s),farproc);
+	fprintf(stderr,"SetResourceHandler(%04x,0x%04x,%p), empty STUB!\n",
+		instance,LOWORD(s),farproc);
     return NULL;
 }
 
diff --git a/memory/string.c b/memory/string.c
index 4df0d004001..05beae1a526 100644
--- a/memory/string.c
+++ b/memory/string.c
@@ -64,9 +64,9 @@ void hmemcpy( LPVOID dst, LPCVOID src, LONG count )
 /***********************************************************************
  *           lstrcat16   (KERNEL.89)
  */
-SEGPTR lstrcat16( SEGPTR dst, SEGPTR src )
+SEGPTR lstrcat16( SEGPTR dst, LPCSTR src )
 {
-    lstrcat32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src) );
+    lstrcat32A( (LPSTR)PTR_SEG_TO_LIN(dst), src );
     return dst;
 }
 
@@ -98,9 +98,9 @@ LPWSTR lstrcat32W( LPWSTR dst, LPCWSTR src )
 /***********************************************************************
  *           lstrcatn16   (KERNEL.352)
  */
-SEGPTR lstrcatn16( SEGPTR dst, SEGPTR src, INT16 n )
+SEGPTR lstrcatn16( SEGPTR dst, LPCSTR src, INT16 n )
 {
-    lstrcatn32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src), n );
+    lstrcatn32A( (LPSTR)PTR_SEG_TO_LIN(dst), src, n );
     return dst;
 }
 
@@ -212,9 +212,9 @@ INT32 lstrcmpi32W( LPCWSTR str1, LPCWSTR str2 )
 /***********************************************************************
  *           lstrcpy16   (KERNEL.88)
  */
-SEGPTR lstrcpy16( SEGPTR dst, SEGPTR src )
+SEGPTR lstrcpy16( SEGPTR dst, LPCSTR src )
 {
-    lstrcpy32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src) );
+    lstrcpy32A( (LPSTR)PTR_SEG_TO_LIN(dst), src );
     return dst;
 }
 
@@ -246,9 +246,9 @@ LPWSTR lstrcpy32W( LPWSTR dst, LPCWSTR src )
 /***********************************************************************
  *           lstrcpyn16   (KERNEL.353)
  */
-SEGPTR lstrcpyn16( SEGPTR dst, SEGPTR src, INT16 n )
+SEGPTR lstrcpyn16( SEGPTR dst, LPCSTR src, INT16 n )
 {
-    lstrcpyn32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src), n );
+    lstrcpyn32A( (LPSTR)PTR_SEG_TO_LIN(dst), src, n );
     return dst;
 }
 
diff --git a/misc/comm.c b/misc/comm.c
index 9572070141d..df5b7c483c9 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -22,10 +22,9 @@
 #include <ctype.h>
 #include <sys/stat.h>
 #if defined(__NetBSD__) || defined(__FreeBSD__)
-#include <sys/ioctl.h>
-#else
-#include <sys/ioctl.h>
+#include <sys/filio.h>
 #endif
+#include <sys/ioctl.h>
 #include <unistd.h>
 
 #include "windows.h"
@@ -36,6 +35,10 @@
 #include "debug.h"
 #include "handle32.h"
 
+#ifndef TIOCINQ
+#define	TIOCINQ FIONREAD
+#endif
+
 /*
  * [RER] These are globals are wrong.  They should be in DosDeviceStruct
  * on a per port basis.
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 2f053daa020..4a4af0b63c1 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -56,44 +56,71 @@ static BOOL32 FileDlg_Init()
 /***********************************************************************
  *           GetOpenFileName   (COMMDLG.1)
  */
-BOOL16 GetOpenFileName( SEGPTR ofn )
+BOOL16 GetOpenFileName16( SEGPTR ofn )
 {
     HINSTANCE16 hInst;
-    HANDLE16 hDlgTmpl = 0, hResInfo;
+    HANDLE32 hDlgTmpl = 0, hResInfo;
     BOOL32 bRet = FALSE, win32Format = FALSE;
     HWND32 hwndDialog;
-    LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(ofn);
+    LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(ofn);
     LPCVOID template;
 
     if (!lpofn || !FileDlg_Init()) return FALSE;
 
-    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
-    {
-        if (!(template = LockResource16( lpofn->hInstance )))
-        {
-            CommDlgLastError = CDERR_LOADRESFAILURE;
-            return FALSE;
-        }
-    }
-    else if (lpofn->Flags & OFN_ENABLETEMPLATE)
-    {
-        if (!(hResInfo = FindResource16(lpofn->hInstance,
-                                        lpofn->lpTemplateName, RT_DIALOG)))
-        {
-            CommDlgLastError = CDERR_FINDRESFAILURE;
-            return FALSE;
-        }
-        if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
-            !(template = LockResource16( hDlgTmpl )))
-        {
-            CommDlgLastError = CDERR_LOADRESFAILURE;
-            return FALSE;
-        }
-    }
-    else
-    {
-        template = SYSRES_GetResPtr( SYSRES_DIALOG_OPEN_FILE );
-        win32Format = TRUE;
+    if (lpofn->Flags & OFN_WINE32) {
+	    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+	    {
+		if (!(template = LockResource32( lpofn->hInstance )))
+		{
+		    CommDlgLastError = CDERR_LOADRESFAILURE;
+		    return FALSE;
+		}
+	    }
+	    else if (lpofn->Flags & OFN_ENABLETEMPLATE)
+	    {
+		if (!(hResInfo = FindResource32A(lpofn->hInstance,
+						PTR_SEG_TO_LIN(lpofn->lpTemplateName), (LPSTR)RT_DIALOG)))
+		{
+		    CommDlgLastError = CDERR_FINDRESFAILURE;
+		    return FALSE;
+		}
+		if (!(hDlgTmpl = LoadResource32( lpofn->hInstance, hResInfo )) ||
+		    !(template = LockResource32( hDlgTmpl )))
+		{
+		    CommDlgLastError = CDERR_LOADRESFAILURE;
+		    return FALSE;
+		}
+	    } else {
+		template = SYSRES_GetResPtr( SYSRES_DIALOG_OPEN_FILE );
+	    }
+	    win32Format = TRUE;
+    } else {
+	    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+	    {
+		if (!(template = LockResource16( lpofn->hInstance )))
+		{
+		    CommDlgLastError = CDERR_LOADRESFAILURE;
+		    return FALSE;
+		}
+	    }
+	    else if (lpofn->Flags & OFN_ENABLETEMPLATE)
+	    {
+		if (!(hResInfo = FindResource16(lpofn->hInstance,
+						lpofn->lpTemplateName, RT_DIALOG)))
+		{
+		    CommDlgLastError = CDERR_FINDRESFAILURE;
+		    return FALSE;
+		}
+		if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
+		    !(template = LockResource16( hDlgTmpl )))
+		{
+		    CommDlgLastError = CDERR_LOADRESFAILURE;
+		    return FALSE;
+		}
+	    } else {
+		template = SYSRES_GetResPtr( SYSRES_DIALOG_OPEN_FILE );
+		win32Format = TRUE;
+	    }
     }
 
     hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
@@ -103,7 +130,12 @@ BOOL16 GetOpenFileName( SEGPTR ofn )
                                         ofn, WIN_PROC_16 );
     if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
 
-    if (hDlgTmpl) FreeResource16( hDlgTmpl );
+    if (hDlgTmpl) {
+	    if (lpofn->Flags & OFN_WINE32)
+		    FreeResource32( hDlgTmpl );
+	    else
+		    FreeResource16( hDlgTmpl );
+    }
 
     dprintf_commdlg(stddeb,"GetOpenFileName // return lpstrFile='%s' !\n", 
            (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
@@ -114,45 +146,74 @@ BOOL16 GetOpenFileName( SEGPTR ofn )
 /***********************************************************************
  *           GetSaveFileName   (COMMDLG.2)
  */
-BOOL16 GetSaveFileName( SEGPTR ofn)
+BOOL16 GetSaveFileName16( SEGPTR ofn)
 {
     HINSTANCE16 hInst;
-    HANDLE16 hDlgTmpl = 0;
+    HANDLE32 hDlgTmpl = 0;
     BOOL32 bRet = FALSE, win32Format = FALSE;
-    LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(ofn);
+    LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(ofn);
     LPCVOID template;
     HWND32 hwndDialog;
 
     if (!lpofn || !FileDlg_Init()) return FALSE;
 
-    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
-    {
-        if (!(template = LockResource16( lpofn->hInstance )))
-        {
-            CommDlgLastError = CDERR_LOADRESFAILURE;
-            return FALSE;
-        }
-    }
-    else if (lpofn->Flags & OFN_ENABLETEMPLATE)
-    {
-        HANDLE16 hResInfo;
-        if (!(hResInfo = FindResource16(lpofn->hInstance,
-                                        lpofn->lpTemplateName, RT_DIALOG)))
-        {
-            CommDlgLastError = CDERR_FINDRESFAILURE;
-            return FALSE;
-        }
-        if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
-            !(template = LockResource16( hDlgTmpl )))
-        {
-            CommDlgLastError = CDERR_LOADRESFAILURE;
-            return FALSE;
-        }
-    }
-    else
-    {
-        template = SYSRES_GetResPtr( SYSRES_DIALOG_SAVE_FILE );
-        win32Format = TRUE;
+    if (lpofn->Flags & OFN_WINE32) {
+	    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+	    {
+		if (!(template = LockResource32( lpofn->hInstance )))
+		{
+		    CommDlgLastError = CDERR_LOADRESFAILURE;
+		    return FALSE;
+		}
+	    }
+	    else if (lpofn->Flags & OFN_ENABLETEMPLATE)
+	    {
+		HANDLE32 hResInfo;
+		if (!(hResInfo = FindResource32A(lpofn->hInstance,
+						 PTR_SEG_TO_LIN(lpofn->lpTemplateName), (LPSTR)RT_DIALOG)))
+		{
+		    CommDlgLastError = CDERR_FINDRESFAILURE;
+		    return FALSE;
+		}
+		if (!(hDlgTmpl = LoadResource32(lpofn->hInstance,hResInfo)) ||
+		    !(template = LockResource32(hDlgTmpl)))
+		{
+		    CommDlgLastError = CDERR_LOADRESFAILURE;
+		    return FALSE;
+		}
+		win32Format= TRUE;
+	    } else {
+		template = SYSRES_GetResPtr( SYSRES_DIALOG_SAVE_FILE );
+		win32Format = TRUE;
+	    }
+    } else {
+	    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+	    {
+		if (!(template = LockResource16( lpofn->hInstance )))
+		{
+		    CommDlgLastError = CDERR_LOADRESFAILURE;
+		    return FALSE;
+		}
+	    }
+	    else if (lpofn->Flags & OFN_ENABLETEMPLATE)
+	    {
+		HANDLE16 hResInfo;
+		if (!(hResInfo = FindResource16(lpofn->hInstance,
+						lpofn->lpTemplateName, RT_DIALOG)))
+		{
+		    CommDlgLastError = CDERR_FINDRESFAILURE;
+		    return FALSE;
+		}
+		if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
+		    !(template = LockResource16( hDlgTmpl )))
+		{
+		    CommDlgLastError = CDERR_LOADRESFAILURE;
+		    return FALSE;
+		}
+	} else {
+		template = SYSRES_GetResPtr( SYSRES_DIALOG_SAVE_FILE );
+		win32Format = TRUE;
+	}
     }
 
     hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
@@ -163,7 +224,12 @@ BOOL16 GetSaveFileName( SEGPTR ofn)
                                         ofn, WIN_PROC_16 );
     if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
 
-    if (hDlgTmpl) FreeResource16( hDlgTmpl );
+    if (hDlgTmpl) {
+	    if (lpofn->Flags & OFN_WINE32)
+		    FreeResource32( hDlgTmpl );
+	    else
+		    FreeResource16( hDlgTmpl );
+    }
 
     dprintf_commdlg(stddeb, "GetSaveFileName // return lpstrFile='%s' !\n", 
             (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
@@ -342,7 +408,7 @@ static LONG FILEDLG_WMMeasureItem(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
 /***********************************************************************
  *                              FILEDLG_HookCallChk             [internal]
  */
-static int FILEDLG_HookCallChk(LPOPENFILENAME lpofn)
+static int FILEDLG_HookCallChk(LPOPENFILENAME16 lpofn)
 {
  if (lpofn)
   if (lpofn->Flags & OFN_ENABLEHOOK)
@@ -351,6 +417,25 @@ static int FILEDLG_HookCallChk(LPOPENFILENAME lpofn)
  return 0;   
 } 
 
+static BOOL32 FILEDLG_CallWindowProc(LPOPENFILENAME16 lpofn,HWND32 hwnd,
+	UINT32 wMsg,WPARAM32 wParam,LPARAM lParam
+) {
+	if (!(lpofn->Flags & OFN_WINE32))
+		return (BOOL32)CallWindowProc16(
+			lpofn->lpfnHook,hwnd,(UINT16)wMsg,(WPARAM16)wParam,lParam
+		);
+	/* |OFN_WINE32 */
+	if (lpofn->Flags & OFN_UNICODE)
+		return (BOOL32)CallWindowProc32W(
+			(WNDPROC32)lpofn->lpfnHook,hwnd,wMsg,wParam,lParam
+		);
+	/* ! |OFN_UNICODE */
+	return (BOOL32)CallWindowProc32A(
+		(WNDPROC32)lpofn->lpfnHook,hwnd,wMsg,wParam,lParam
+	);
+
+}
+
 /***********************************************************************
  *                              FILEDLG_WMInitDialog            [internal]
  */
@@ -358,11 +443,11 @@ static int FILEDLG_HookCallChk(LPOPENFILENAME lpofn)
 static LONG FILEDLG_WMInitDialog(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) 
 {
   int i, n;
-  LPOPENFILENAME lpofn;
+  LPOPENFILENAME16 lpofn;
   char tmpstr[512];
   LPSTR pstr;
   SetWindowLong32A(hWnd, DWL_USER, lParam);
-  lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(lParam);
+  lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(lParam);
   if (lpofn->lpstrTitle) SetWindowText16( hWnd, lpofn->lpstrTitle );
   /* read custom filter information */
   if (lpofn->lpstrCustomFilter)
@@ -433,8 +518,7 @@ static LONG FILEDLG_WMInitDialog(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
   if (lpofn->Flags & OFN_HIDEREADONLY)
     ShowWindow32(GetDlgItem32(hWnd, chx1), SW_HIDE); 
   if (FILEDLG_HookCallChk(lpofn))
-     return (BOOL16)CallWindowProc16(lpofn->lpfnHook, 
-                                     hWnd,  WM_INITDIALOG, wParam, lParam );
+     return (BOOL16)FILEDLG_CallWindowProc(lpofn,hWnd,WM_INITDIALOG,wParam,lParam );
   else  
      return TRUE;
 }
@@ -445,8 +529,8 @@ static LONG FILEDLG_WMInitDialog(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
 static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) 
 {
   LONG lRet;
-  LPOPENFILENAME lpofn;
-  OPENFILENAME ofn2;
+  LPOPENFILENAME16 lpofn;
+  OPENFILENAME16 ofn2;
   char tmpstr[512], tmpstr2[512];
   LPSTR pstr, pstr2;
   UINT16 control,notification;
@@ -455,7 +539,7 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
   control = wParam;
   notification = HIWORD(lParam);
     
-  lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
+  lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
   switch (control)
     {
     case lst1: /* file list */
@@ -472,7 +556,7 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
           SEGPTR_FREE(pstr);
       }
       if (FILEDLG_HookCallChk(lpofn))
-       CallWindowProc16(lpofn->lpfnHook, hWnd,
+       FILEDLG_CallWindowProc(lpofn,hWnd,
                   RegisterWindowMessage32A( LBSELCHSTRING ),
                   control, MAKELONG(lRet,CD_LBSELCHANGE));       
       /* FIXME: for OFN_ALLOWMULTISELECT we need CD_LBSELSUB, CD_SELADD, CD_LBSELNOITEMS */                  
@@ -610,7 +694,7 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
 	}
       if (FILEDLG_HookCallChk(lpofn))
       {
-       lRet= (BOOL16)CallWindowProc16(lpofn->lpfnHook,
+       lRet= (BOOL16)FILEDLG_CallWindowProc(lpofn,
                hWnd, RegisterWindowMessage32A( FILEOKSTRING ), 0, lParam );
        if (lRet)       
        {
@@ -636,12 +720,12 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
  */
 LRESULT FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
 {  
- LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
+ LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
  
  if (wMsg!=WM_INITDIALOG)
   if (FILEDLG_HookCallChk(lpofn))
   {
-   LRESULT  lRet=(BOOL16)CallWindowProc16(lpofn->lpfnHook, hWnd, wMsg, wParam, lParam);
+   LRESULT  lRet=(BOOL16)FILEDLG_CallWindowProc(lpofn,hWnd,wMsg,wParam,lParam);
    if (lRet)   
     return lRet;         /* else continue message processing */
   }             
@@ -679,12 +763,12 @@ LRESULT FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam
  */
 LRESULT FileSaveDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
 {
- LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
+ LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
  
  if (wMsg!=WM_INITDIALOG)
   if (FILEDLG_HookCallChk(lpofn))
   {
-   LRESULT  lRet=(BOOL16)CallWindowProc16(lpofn->lpfnHook, hWnd, wMsg, wParam, lParam);
+   LRESULT  lRet=(BOOL16)FILEDLG_CallWindowProc(lpofn,hWnd,wMsg,wParam,lParam);
    if (lRet)   
     return lRet;         /* else continue message processing */
   }             
@@ -1089,11 +1173,10 @@ DWORD CommDlgExtendedError(void)
   return CommDlgLastError;
 }
 
-
 /***********************************************************************
- *           GetFileTitle   (COMMDLG.27)
+ *           GetFileTitleA   (COMDLG32.8)
  */
-short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf)
+short GetFileTitle32A(LPCSTR lpFile, LPSTR lpTitle, UINT32 cbBuf)
 {
     int i, len;
     dprintf_commdlg(stddeb,"GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf);
@@ -1124,6 +1207,30 @@ short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf)
 }
 
 
+/***********************************************************************
+ *           GetFileTitleA   (COMDLG32.8)
+ */
+short GetFileTitle32W(LPCWSTR lpFile, LPWSTR lpTitle, UINT32 cbBuf)
+{
+	LPSTR file = HEAP_strdupWtoA(GetProcessHeap(),0,lpFile);
+	LPSTR title = HeapAlloc(GetProcessHeap(),0,cbBuf);
+	short	ret;
+
+	ret = GetFileTitle32A(file,title,cbBuf);
+
+	lstrcpynAtoW(lpTitle,title,cbBuf);
+	HeapFree(GetProcessHeap(),0,file);
+	HeapFree(GetProcessHeap(),0,title);
+	return ret;
+}
+/***********************************************************************
+ *           GetFileTitle   (COMMDLG.27)
+ */
+short GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf) {
+    return GetFileTitle32A(lpFile,lpTitle,cbBuf);
+}
+
+
 /* ------------------------ Choose Color Dialog --------------------------- */
 
 /***********************************************************************
@@ -2873,3 +2980,183 @@ LRESULT FormatCharDlgProc(HWND16 hDlg, UINT16 message, WPARAM16 wParam, LPARAM l
     }
   return FALSE;
 }
+
+
+#define GET_XXX_FILENAME(xxx) 						\
+BOOL32 xxx##32A( LPOPENFILENAME32A ofn )				\
+{									\
+	BOOL16 ret;							\
+	LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));	\
+									\
+	memset(ofn16,'\0',sizeof(*ofn16));				\
+	ofn16->lStructSize = sizeof(*ofn16);				\
+	ofn16->hwndOwner = ofn->hwndOwner;				\
+	ofn16->hInstance = ofn->hInstance;				\
+	if (ofn->lpstrFilter) {						\
+		LPSTR	s,x;						\
+									\
+		/* filter is a list...  title\0ext\0......\0\0 */	\
+		s = (LPSTR)ofn->lpstrFilter;				\
+		while (*s)						\
+			s = s+strlen(s)+1;				\
+		s++;							\
+		x = (LPSTR)SEGPTR_ALLOC(s-ofn->lpstrFilter);		\
+		memcpy(x,ofn->lpstrFilter,s-ofn->lpstrFilter);		\
+		ofn16->lpstrFilter = SEGPTR_GET(x);			\
+	}								\
+	if (ofn->lpstrCustomFilter) {					\
+		LPSTR	s,x;						\
+									\
+		/* filter is a list...  title\0ext\0......\0\0 */	\
+		s = (LPSTR)ofn->lpstrCustomFilter;			\
+		while (*s)						\
+			s = s+strlen(s)+1;				\
+		x = SEGPTR_ALLOC(s-ofn->lpstrCustomFilter);		\
+		s++;							\
+		memcpy(x,ofn->lpstrCustomFilter,s-ofn->lpstrCustomFilter);\
+		ofn16->lpstrCustomFilter = SEGPTR_GET(x);		\
+	}								\
+	ofn16->nMaxCustFilter = ofn->nMaxCustFilter;			\
+	ofn16->nFilterIndex = ofn->nFilterIndex;			\
+	ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile));	\
+	ofn16->nMaxFile = ofn->nMaxFile;				\
+	if (ofn->lpstrFileTitle)					\
+		ofn16->lpstrFileTitle= SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrFileTitle));\
+	ofn16->nMaxFileTitle = ofn->nMaxFileTitle;			\
+	if (ofn->lpstrInitialDir)					\
+		ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrInitialDir));\
+	if (ofn->lpstrTitle)						\
+		ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrTitle));\
+	ofn16->Flags = ofn->Flags|OFN_WINE32;				\
+	ofn16->nFileOffset = ofn->nFileOffset;				\
+	ofn16->nFileExtension = ofn->nFileExtension;			\
+	if (ofn->lpstrDefExt)						\
+		ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrDefExt));\
+	ofn16->lCustData = ofn->lCustData;				\
+	ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook;			\
+									\
+	if (ofn->lpTemplateName)					\
+		ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpTemplateName));\
+									\
+	ret = xxx##16(SEGPTR_GET(ofn16));				\
+									\
+	if (ofn16->lpstrFilter)						\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter));	\
+	if (ofn16->lpTemplateName)					\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName));	\
+	if (ofn16->lpstrDefExt)						\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt));	\
+	if (ofn16->lpstrTitle)						\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle));		\
+	if (ofn16->lpstrInitialDir)					\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir));	\
+	if (ofn16->lpstrCustomFilter)					\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter));	\
+									\
+	strcpy(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile));	\
+	SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile));			\
+									\
+	if (ofn16->lpstrFileTitle)					\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));	\
+	SEGPTR_FREE(ofn16);						\
+	return ret;							\
+}									\
+									\
+BOOL32 xxx##32W( LPOPENFILENAME32W ofn )				\
+{									\
+	BOOL16 ret;							\
+	LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));	\
+									\
+	memset(ofn16,'\0',sizeof(*ofn16));				\
+	ofn16->lStructSize = sizeof(*ofn16);				\
+	ofn16->hwndOwner = ofn->hwndOwner;				\
+	ofn16->hInstance = ofn->hInstance;				\
+	if (ofn->lpstrFilter) {						\
+		LPWSTR	s;						\
+		LPSTR	x,y;						\
+		int	n;						\
+									\
+		/* filter is a list...  title\0ext\0......\0\0 */	\
+		s = (LPWSTR)ofn->lpstrFilter;				\
+		while (*s)						\
+			s = s+lstrlen32W(s)+1;				\
+		s++;							\
+		n = s - ofn->lpstrFilter; /* already divides by 2. ptr magic */\
+		x = y = (LPSTR)SEGPTR_ALLOC(n);			\
+		s = (LPWSTR)ofn->lpstrFilter;				\
+		while (*s) {						\
+			lstrcpyWtoA(x,s);				\
+			x+=lstrlen32A(x)+1;				\
+			s+=lstrlen32W(s)+1;				\
+		}							\
+		*x=0;							\
+		ofn16->lpstrFilter = SEGPTR_GET(y);			\
+	}								\
+	if (ofn->lpstrCustomFilter) {					\
+		LPWSTR	s;						\
+		LPSTR	x,y;						\
+		int	n;						\
+									\
+		/* filter is a list...  title\0ext\0......\0\0 */	\
+		s = (LPWSTR)ofn->lpstrCustomFilter;			\
+		while (*s)						\
+			s = s+lstrlen32W(s)+1;				\
+		s++;							\
+		n = s - ofn->lpstrCustomFilter;				\
+		x = y = (LPSTR)SEGPTR_ALLOC(n);				\
+		s = (LPWSTR)ofn->lpstrCustomFilter;			\
+		while (*s) {						\
+			lstrcpyWtoA(x,s);				\
+			x+=lstrlen32A(x)+1;				\
+			s+=lstrlen32W(s)+1;				\
+		}							\
+		*x=0;							\
+		ofn16->lpstrCustomFilter = SEGPTR_GET(y);		\
+	}								\
+	ofn16->nMaxCustFilter = ofn->nMaxCustFilter;			\
+	ofn16->nFilterIndex = ofn->nFilterIndex;			\
+	ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile));	\
+	ofn16->nMaxFile = ofn->nMaxFile;				\
+	if (ofn->lpstrFileTitle)					\
+		ofn16->lpstrFileTitle= SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrFileTitle));\
+	ofn16->nMaxFileTitle = ofn->nMaxFileTitle;			\
+	if (ofn->lpstrInitialDir)					\
+		ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrInitialDir));\
+	if (ofn->lpstrTitle)						\
+		ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrTitle));\
+	ofn16->Flags = ofn->Flags|OFN_WINE32|OFN_UNICODE;		\
+	ofn16->nFileOffset = ofn->nFileOffset;				\
+	ofn16->nFileExtension = ofn->nFileExtension;			\
+	if (ofn->lpstrDefExt)						\
+		ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrDefExt));\
+	ofn16->lCustData = ofn->lCustData;				\
+	ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook;			\
+	if (ofn->lpTemplateName) {					\
+		ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpTemplateName));\
+	}								\
+	ret = xxx##16(SEGPTR_GET(ofn16));				\
+									\
+	if (ofn16->lpstrFilter)						\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter));	\
+	if (ofn16->lpTemplateName)					\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName));	\
+	if (ofn16->lpstrDefExt)						\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt));	\
+	if (ofn16->lpstrTitle)						\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle));		\
+	if (ofn16->lpstrInitialDir)					\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir));	\
+	if (ofn16->lpstrCustomFilter)					\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter));	\
+									\
+	lstrcpyAtoW(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile));	\
+	SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile));			\
+									\
+	if (ofn16->lpstrFileTitle)					\
+		SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));	\
+	SEGPTR_FREE(ofn16);						\
+	return ret;							\
+}
+
+GET_XXX_FILENAME(GetOpenFileName)
+GET_XXX_FILENAME(GetSaveFileName)
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 60d3aebb59f..0015d92dc88 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -912,6 +912,19 @@ CRTDLL_atexit(LPVOID x) {
 	return 0; /* successful */
 }
 
+/*********************************************************************
+ *                  mbstowcs           (CRTDLL.429)
+ * FIXME: check multibyte support
+ */
+INT32
+CRTDLL_mbstowcs(LPWSTR a,LPSTR b,INT32 nr) {
+	int	i;
+	for (i=0;(i<nr) && b[i];i++) {
+		a[i] = (WCHAR)b[i];
+	}
+	return i;
+}
+
 /*********************************************************************
  *                  mbtowc           (CRTDLL.430)
  * FIXME: check multibyte support
diff --git a/misc/printdrv.c b/misc/printdrv.c
index 9583c3843ce..df0bb96334c 100644
--- a/misc/printdrv.c
+++ b/misc/printdrv.c
@@ -40,8 +40,16 @@ DWORD
 DrvGetPrinterData(LPSTR lpPrinter, LPSTR lpProfile, LPDWORD lpType,
                   LPBYTE lpPrinterData, int cbData, LPDWORD lpNeeded)
 {
-    fprintf(stderr,"In DrvGetPrinterData printer %p profile %p lpType %p \n",
-           lpPrinter, lpProfile, lpType);
+    fprintf(stderr,"In DrvGetPrinterData ");
+    if (HIWORD(lpPrinter))
+	    fprintf(stderr,"printer %s ",lpPrinter);
+    else
+	    fprintf(stderr,"printer %p ",lpPrinter);
+    if (HIWORD(lpProfile))
+	    fprintf(stderr,"profile %s ",lpProfile);
+    else
+	    fprintf(stderr,"profile %p ",lpProfile);
+    fprintf(stderr,"lpType %p\n",lpType);
     return 0;
 }
 
@@ -51,8 +59,16 @@ DWORD
 DrvSetPrinterData(LPSTR lpPrinter, LPSTR lpProfile, LPDWORD lpType,
                   LPBYTE lpPrinterData, DWORD dwSize)
 {
-    fprintf(stderr,"In DrvSetPrinterData printer %p profile %p lpType %p \n",
-           lpPrinter, lpProfile, lpType);
+    fprintf(stderr,"In DrvSetPrinterData ");
+    if (HIWORD(lpPrinter))
+	    fprintf(stderr,"printer %s ",lpPrinter);
+    else
+	    fprintf(stderr,"printer %p ",lpPrinter);
+    if (HIWORD(lpProfile))
+	    fprintf(stderr,"profile %s ",lpProfile);
+    else
+	    fprintf(stderr,"profile %p ",lpProfile);
+    fprintf(stderr,"lpType %p\n",lpType);
     return 0;
 }
 
diff --git a/multimedia/audio.c b/multimedia/audio.c
index 517325f699b..039521e1851 100644
--- a/multimedia/audio.c
+++ b/multimedia/audio.c
@@ -47,7 +47,7 @@ typedef struct {
 	WAVEOPENDESC        waveDesc;
 	WORD                wFlags;
 	PCMWAVEFORMAT	    Format;
-	LPWAVEHDR 	    lpQueueHdr;
+	SEGPTR  	    lp16QueueHdr;  /* Segmented LPWAVEHDR */
 	DWORD		    dwTotalPlayed;
 	} LINUX_WAVEOUT;
 
@@ -58,7 +58,7 @@ typedef struct {
 	WAVEOPENDESC        waveDesc;
 	WORD                wFlags;
 	PCMWAVEFORMAT       Format;
-	LPWAVEHDR           lpQueueHdr;
+	SEGPTR              lp16QueueHdr;  /* Segmented LPWAVEHDR */
 	DWORD               dwTotalRecorded;
 	} LINUX_WAVEIN;
 
@@ -296,6 +296,7 @@ static DWORD WAVE_mciCue(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpPar
 	        dwRet = wodMessage(wDevID, WODM_CLOSE, 0, 0L, 0L);
 	        if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
 	        dwRet = widMessage(wDevID, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
+		MCIWavDev[wDevID].fInput = TRUE;
 	}
 	else if (MCIWavDev[wDevID].fInput) {
 /* FIXME this is just a hack WInDev should be hidden here */
@@ -304,6 +305,7 @@ static DWORD WAVE_mciCue(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpPar
 	        dwRet = widMessage(wDevID, WIDM_CLOSE, 0, 0L, 0L);
 	        if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
 	        dwRet = wodMessage(wDevID, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
+		MCIWavDev[wDevID].fInput = FALSE;
 	}
 
 	USER_HEAP_FREE(hDesc);
@@ -347,7 +349,7 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
 	HGLOBAL16		hData;
 	HLOCAL16		hWaveHdr;
 	LPWAVEHDR		lpWaveHdr;
-	LPWAVEHDR		lp16WaveHdr;
+	SEGPTR  		lp16WaveHdr;
 	DWORD			dwRet;
 
 	dprintf_mciwave(stddeb,
@@ -398,10 +400,10 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
 	lpWaveHdr->dwFlags = 0L;
 	lpWaveHdr->dwLoops = 0L;
 	hWaveHdr = USER_HEAP_ALLOC(sizeof(WAVEHDR));
-	lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
+	lp16WaveHdr = USER_HEAP_SEG_ADDR(hWaveHdr);
 	memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
 	lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
-	dwRet = wodMessage(wDevID, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = wodMessage(wDevID, WODM_PREPARE, 0, lp16WaveHdr, sizeof(WAVEHDR));
 	while(TRUE) {
 		count = mmioRead(MCIWavDev[wDevID].hFile, 
 			PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
@@ -411,9 +413,9 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
 /*		lpWaveHdr->dwBytesRecorded = count; */
 		dprintf_mciwave(stddeb,"WAVE_mciPlay // before WODM_WRITE lpWaveHdr=%p dwBufferLength=%lu dwBytesRecorded=%lu\n",
 				lpWaveHdr, lpWaveHdr->dwBufferLength, lpWaveHdr->dwBytesRecorded);
-		dwRet = wodMessage(wDevID, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+		dwRet = wodMessage(wDevID, WODM_WRITE, 0, lp16WaveHdr, sizeof(WAVEHDR));
 		}
-	dwRet = wodMessage(wDevID, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = wodMessage(wDevID, WODM_UNPREPARE, 0, lp16WaveHdr, sizeof(WAVEHDR));
 	if (lpWaveHdr->lpData != NULL) {
 		GlobalUnlock16(hData);
 		GlobalFree16(hData);
@@ -439,7 +441,7 @@ static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpP
 	HGLOBAL16		hData;
 	HLOCAL16		hWaveHdr;
 	LPWAVEHDR		lpWaveHdr;
-	LPWAVEHDR		lp16WaveHdr;
+	SEGPTR   		lp16WaveHdr;
 	DWORD			dwRet;
 
 	dprintf_mciwave(stddeb,
@@ -474,7 +476,7 @@ static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpP
 	lpWaveHdr->dwFlags = 0L;
 	lpWaveHdr->dwLoops = 0L;
 	hWaveHdr = USER_HEAP_ALLOC(sizeof(WAVEHDR));
-	lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
+	lp16WaveHdr = USER_HEAP_SEG_ADDR(hWaveHdr);
 	memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
 	lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
 	dwRet = widMessage(wDevID, WIDM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
@@ -926,7 +928,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 			dprintf_mciwave(stddeb,	"Linux 'wodOpen' // CALLBACK_FUNCTION !\n");
 			break;
 		}
-	WOutDev[wDevID].lpQueueHdr = NULL;
+	WOutDev[wDevID].lp16QueueHdr = NULL;
 	WOutDev[wDevID].unixdev = audio;
 	WOutDev[wDevID].dwTotalPlayed = 0;
 	WOutDev[wDevID].bufsize = abuf_size;
@@ -986,10 +988,14 @@ static DWORD wodClose(WORD wDevID)
 		dprintf_mciwave(stddeb,"Linux 'wodClose' // can't close !\n");
 		return MMSYSERR_NOTENABLED;
 		}
+	if (WOutDev[wDevID].lp16QueueHdr != NULL) {
+	        dprintf_mciwave(stddeb,"linux 'wodclose' // still buffers open !\n");
+		return WAVERR_STILLPLAYING;
+	}
 	close(WOutDev[wDevID].unixdev);
 	WOutDev[wDevID].unixdev = 0;
 	WOutDev[wDevID].bufsize = 0;
-	WOutDev[wDevID].lpQueueHdr = NULL;
+	WOutDev[wDevID].lp16QueueHdr = NULL;
 	if (WAVE_NotifyClient(wDevID, WOM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
 		dprintf_mciwave(stddeb,"Linux 'wodClose' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
@@ -1000,11 +1006,11 @@ static DWORD wodClose(WORD wDevID)
 /**************************************************************************
 * 				wodWrite			[internal]
 */
-static DWORD wodWrite(WORD wDevID, DWORD lpWH, DWORD dwSize)
+static DWORD wodWrite(WORD wDevID, SEGPTR lp16WaveHdr, DWORD dwSize)
 {
 	int		count;
 	LPSTR	        lpData;
-	LPWAVEHDR       lpWaveHdr = (LPWAVEHDR)PTR_SEG_TO_LIN(lpWH);
+	LPWAVEHDR       lpWaveHdr = (LPWAVEHDR)PTR_SEG_TO_LIN(lp16WaveHdr);
 
 	dprintf_mciwave(stddeb,"wodWrite(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
 	if (WOutDev[wDevID].unixdev == 0) {
@@ -1031,7 +1037,7 @@ static DWORD wodWrite(WORD wDevID, DWORD lpWH, DWORD dwSize)
 	WOutDev[wDevID].dwTotalPlayed += count;
 	lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
 	lpWaveHdr->dwFlags |= WHDR_DONE;
-	if (WAVE_NotifyClient(wDevID, WOM_DONE, lpWH, 0) != MMSYSERR_NOERROR) {
+	if (WAVE_NotifyClient(wDevID, WOM_DONE, lp16WaveHdr, count) != MMSYSERR_NOERROR) {
 		dprintf_mciwave(stddeb,"Linux 'wodWrite' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
 		}
@@ -1041,14 +1047,19 @@ static DWORD wodWrite(WORD wDevID, DWORD lpWH, DWORD dwSize)
 /**************************************************************************
 * 				wodPrepare			[internal]
 */
-static DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
+static DWORD wodPrepare(WORD wDevID, SEGPTR lp16WaveHdr, DWORD dwSize)
 {
+        LPWAVEHDR lpWaveHdr;
+
 	dprintf_mciwave(stddeb,
-		"wodPrepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
+		"wodPrepare(%u, %p, %08lX);\n", wDevID, (void *)lp16WaveHdr, dwSize);
 	if (WOutDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodPrepare' // can't prepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
+
+	lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
+
 	/* the COOL waveeditor feels much better without this check... 
 	 * someone please have a look at available documentation
 	if (WOutDev[wDevID].lpQueueHdr != NULL) {
@@ -1057,7 +1068,7 @@ static DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 	}
 	*/
 	WOutDev[wDevID].dwTotalPlayed = 0;
-	WOutDev[wDevID].lpQueueHdr = lpWaveHdr;
+	WOutDev[wDevID].lp16QueueHdr = lp16WaveHdr;
 	if (lpWaveHdr->dwFlags & WHDR_INQUEUE) return WAVERR_STILLPLAYING;
 	lpWaveHdr->dwFlags |= WHDR_PREPARED;
 	lpWaveHdr->dwFlags &= ~WHDR_DONE;
@@ -1075,6 +1086,13 @@ static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 		dprintf_mciwave(stddeb,"Linux 'wodUnprepare' // can't unprepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
+	
+	lpWaveHdr->dwFlags &= ~WHDR_PREPARED;
+	lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
+	lpWaveHdr->dwFlags |= WHDR_DONE;
+	WOutDev[wDevID].lp16QueueHdr = NULL;
+	dprintf_mciwave(stddeb,
+		"Linux 'wodUnprepare' // all headers unprepared !\n");
 	return MMSYSERR_NOERROR;
 }
 
@@ -1123,6 +1141,16 @@ static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 		return MMSYSERR_NOTENABLED;
 		}
 	if (lpTime == NULL)	return MMSYSERR_INVALPARAM;
+	dprintf_mciwave(stddeb,"wodGetPosition // wType=%04X !\n", 
+			lpTime->wType);
+	dprintf_mciwave(stddeb,"wodGetPosition // wBitsPerSample=%u\n",
+			WOutDev[wDevID].Format.wBitsPerSample); 
+	dprintf_mciwave(stddeb,"wodGetPosition // nSamplesPerSec=%lu\n",
+			WOutDev[wDevID].Format.wf.nSamplesPerSec); 
+	dprintf_mciwave(stddeb,"wodGetPosition // nChannels=%u\n",
+			WOutDev[wDevID].Format.wf.nChannels); 
+	dprintf_mciwave(stddeb,"wodGetPosition // nAvgBytesPerSec=%lu\n",
+			WOutDev[wDevID].Format.wf.nAvgBytesPerSec); 
 	switch(lpTime->wType) {
 		case TIME_BYTES:
 			lpTime->u.cb = WOutDev[wDevID].dwTotalPlayed;
@@ -1232,15 +1260,15 @@ DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
 		case WODM_WRITE:
 			return wodWrite(wDevID, dwParam1, dwParam2);
 		case WODM_PAUSE:
-			return 0L;
+			return MMSYSERR_NOTSUPPORTED;
 	        case WODM_STOP:
-			return 0L;
+			return MMSYSERR_NOTSUPPORTED;
 		case WODM_GETPOS:
 			return wodGetPosition(wDevID, (LPMMTIME)PTR_SEG_TO_LIN(dwParam1), dwParam2);
 		case WODM_BREAKLOOP:
-			return 0L;
+			return MMSYSERR_NOTSUPPORTED;
 		case WODM_PREPARE:
-			return wodPrepare(wDevID, (LPWAVEHDR)PTR_SEG_TO_LIN(dwParam1), dwParam2);
+			return wodPrepare(wDevID, dwParam1, dwParam2);
 		case WODM_UNPREPARE:
 			return wodUnprepare(wDevID, (LPWAVEHDR)PTR_SEG_TO_LIN(dwParam1), dwParam2);
 		case WODM_GETDEVCAPS:
@@ -1389,7 +1417,7 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 			dprintf_mciwave(stddeb,	"Linux 'widOpen' // CALLBACK_FUNCTION !\n");
 			break;
 		}
-	WInDev[wDevID].lpQueueHdr = NULL;
+	WInDev[wDevID].lp16QueueHdr = NULL;
 	WInDev[wDevID].unixdev = audio;
 	WInDev[wDevID].bufsize = abuf_size;
 	WInDev[wDevID].dwTotalRecorded = 0;
@@ -1442,6 +1470,10 @@ static DWORD widClose(WORD wDevID)
 		dprintf_mciwave(stddeb,"Linux 'widClose' // can't close !\n");
 		return MMSYSERR_NOTENABLED;
 		}
+	if (WInDev[wDevID].lp16QueueHdr != NULL) {
+	        dprintf_mciwave(stddeb,"linux 'widclose' // still buffers open !\n");
+		return WAVERR_STILLPLAYING;
+	}
 	close(WInDev[wDevID].unixdev);
 	WInDev[wDevID].unixdev = 0;
 	WInDev[wDevID].bufsize = 0;
@@ -1455,10 +1487,12 @@ static DWORD widClose(WORD wDevID)
 /**************************************************************************
 * 				widAddBuffer		[internal]
 */
-static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
+static DWORD widAddBuffer(WORD wDevID, SEGPTR lp16WaveHdr, DWORD dwSize)
 {
 	int			count	= 1;
 	LPWAVEHDR 	lpWIHdr;
+	LPWAVEHDR       lpWaveHdr = (LPWAVEHDR)PTR_SEG_TO_LIN(lp16WaveHdr);
+
 	dprintf_mciwave(stddeb,
 		"widAddBuffer(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
 	if (WInDev[wDevID].unixdev == 0) {
@@ -1477,19 +1511,19 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 	lpWaveHdr->dwFlags |= WHDR_INQUEUE;
 	lpWaveHdr->dwFlags &= ~WHDR_DONE;
 	lpWaveHdr->dwBytesRecorded = 0;
-	if (WInDev[wDevID].lpQueueHdr == NULL) {
+	if (WInDev[wDevID].lp16QueueHdr == NULL) {
 		/* begin the queue with a first header ... */
-		WInDev[wDevID].lpQueueHdr = lpWaveHdr;
+		WInDev[wDevID].lp16QueueHdr = lp16WaveHdr;
 		WInDev[wDevID].dwTotalRecorded = 0;
 		}
 	else {
 		/* added to the queue, except if it's the one just prepared ... */
-		lpWIHdr = WInDev[wDevID].lpQueueHdr;
-		while (lpWIHdr->lpNext != NULL) {
-			lpWIHdr = lpWIHdr->lpNext;
+		lpWIHdr = (LPWAVEHDR)PTR_SEG_TO_LIN(WInDev[wDevID].lp16QueueHdr);
+		while (lpWIHdr->lp16Next != NULL) {
+			lpWIHdr = (LPWAVEHDR)PTR_SEG_TO_LIN(lpWIHdr->lp16Next);
 			count++;
 			}
-		lpWIHdr->lpNext = lpWaveHdr;
+		lpWIHdr->lp16Next = lp16WaveHdr;
 		count++;
 		}
 	dprintf_mciwave(stddeb,
@@ -1508,7 +1542,7 @@ static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 		dprintf_mciwave(stddeb,"Linux 'widPrepare' // can't prepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	if (WInDev[wDevID].lpQueueHdr != NULL) {
+	if (WInDev[wDevID].lp16QueueHdr != NULL) {
 		dprintf_mciwave(stddeb,"Linux 'widPrepare' // already prepare !\n");
 		return WAVERR_BADFORMAT;
 		}
@@ -1535,7 +1569,7 @@ static DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 	lpWaveHdr->dwFlags &= ~WHDR_PREPARED;
 	lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
 	lpWaveHdr->dwFlags |= WHDR_DONE;
-	WInDev[wDevID].lpQueueHdr = NULL;
+	WInDev[wDevID].lp16QueueHdr = NULL;
 	dprintf_mciwave(stddeb,
 		"Linux 'widUnprepare' // all headers unprepared !\n");
 	return MMSYSERR_NOERROR;
@@ -1547,40 +1581,45 @@ static DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 static DWORD widStart(WORD wDevID)
 {
 	int			count	= 1;
+	int             bytesRead;
 	LPWAVEHDR 	lpWIHdr;
+	SEGPTR          lp16WaveHdr;
+
 	dprintf_mciwave(stddeb,"widStart(%u);\n", wDevID);
 	if (WInDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,	"Linux 'widStart' // can't start recording !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	if (WInDev[wDevID].lpQueueHdr == NULL || 
-		WInDev[wDevID].lpQueueHdr->lpData == NULL) {
+
+	lp16WaveHdr = WInDev[wDevID].lp16QueueHdr;
+	dprintf_mciwave(stddeb,"Linux 'widstart'// lp16WaveHdr = %08lx\n",(DWORD)lp16WaveHdr);
+	if (lp16WaveHdr == NULL || 
+		((LPWAVEHDR)PTR_SEG_TO_LIN(lp16WaveHdr))->lpData == NULL) {
 		dprintf_mciwave(stddeb,"Linux 'widStart' // never been prepared !\n");
 		return WAVERR_UNPREPARED;
 		}
-	lpWIHdr = WInDev[wDevID].lpQueueHdr;
-	while(lpWIHdr != NULL) {
+
+	while(lp16WaveHdr != NULL) {
+	        lpWIHdr = (LPWAVEHDR)PTR_SEG_TO_LIN(lp16WaveHdr);
 		lpWIHdr->dwBufferLength &= 0xFFFF;
 		dprintf_mciwave(stddeb,
 			"widStart // recording buf#%u=%p size=%lu \n",
 			count, lpWIHdr->lpData, lpWIHdr->dwBufferLength);
 		fflush(stddeb);
-		read (WInDev[wDevID].unixdev, 
+		bytesRead = read (WInDev[wDevID].unixdev, 
 			PTR_SEG_TO_LIN(lpWIHdr->lpData),
 			lpWIHdr->dwBufferLength);
-		lpWIHdr->dwBytesRecorded = lpWIHdr->dwBufferLength;
+		lpWIHdr->dwBytesRecorded = bytesRead;
 		WInDev[wDevID].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
 		lpWIHdr->dwFlags &= ~WHDR_INQUEUE;
 		lpWIHdr->dwFlags |= WHDR_DONE;
 
-/* FIXME here should be a segmented address in stead of lpWIHdr */
-
-		if (WAVE_NotifyClient(wDevID, WIM_DATA, (DWORD)lpWIHdr, 0L) != 
+		if (WAVE_NotifyClient(wDevID, WIM_DATA, (DWORD)lp16WaveHdr, lpWIHdr->dwBytesRecorded) != 
 			MMSYSERR_NOERROR) {
 			dprintf_mciwave(stddeb,	"Linux 'widStart' // can't notify client !\n");
 			return MMSYSERR_INVALPARAM;
 			}
-		lpWIHdr = lpWIHdr->lpNext;
+		lp16WaveHdr = lpWIHdr->lp16Next ;
 		count++;
 		}
 	dprintf_mciwave(stddeb,"widStart // end of recording !\n");
@@ -1697,7 +1736,7 @@ DWORD widMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
 		case WIDM_CLOSE:
 			return widClose(wDevID);
 		case WIDM_ADDBUFFER:
-			return widAddBuffer(wDevID, (LPWAVEHDR)PTR_SEG_TO_LIN(dwParam1), dwParam2);
+			return widAddBuffer(wDevID, dwParam1, dwParam2);
 		case WIDM_PREPARE:
 			return widPrepare(wDevID, (LPWAVEHDR)PTR_SEG_TO_LIN(dwParam1), dwParam2);
 		case WIDM_UNPREPARE:
diff --git a/multimedia/mcianim.c b/multimedia/mcianim.c
index 6ab5ddf960c..59a9f466541 100644
--- a/multimedia/mcianim.c
+++ b/multimedia/mcianim.c
@@ -92,6 +92,9 @@ static DWORD ANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
 	AnimDev[wDevID].dwTotalLen = 0;
 	AnimDev[wDevID].lpdwTrackLen = NULL;
 	AnimDev[wDevID].lpdwTrackPos = NULL;
+/*
+   Moved to mmsystem.c mciOpen routine 
+
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_mcianim(stddeb,
 			"ANIM_mciOpen // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
@@ -99,6 +102,7 @@ static DWORD ANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
 			AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
+*/
  	return 0;
 #else
 	return MCIERR_HARDWARE;
diff --git a/multimedia/mcicda.c b/multimedia/mcicda.c
index 42139335c57..bfde0cc4c82 100644
--- a/multimedia/mcicda.c
+++ b/multimedia/mcicda.c
@@ -270,6 +270,10 @@ static DWORD CDAUDIO_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpPa
 		dprintf_cdaudio(stddeb,"CDAUDIO_mciOpen // error reading TracksInfo !\n");
 /*		return MCIERR_INTERNAL; */
 		}
+
+/*
+   Moved to mmsystem.c mciOpen routine
+
 	if (dwFlags & MCI_NOTIFY) {
         	dprintf_cdaudio(stddeb,
 			"CDAUDIO_mciOpen // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
@@ -277,6 +281,7 @@ static DWORD CDAUDIO_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpPa
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
 			CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
+*/
  	return 0;
 #else
 	return MCIERR_HARDWARE;
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index be6c70678b7..36d33896c52 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -6,6 +6,11 @@
 /* FIXME: special commands of device drivers should be handled by those drivers
  */
 
+/* FIXME: this current implementation does not allow commands like
+ * capability <filename> can play
+ * which is allowed by the MCI standard.
+ */
+
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -57,7 +62,8 @@ LONG ANIM_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 /* standard functionparameters for all functions */
 #define _MCISTR_PROTO_ \
 	WORD wDevID,WORD uDevTyp,LPSTR lpstrReturnString,UINT16 uReturnLength,\
-	LPCSTR dev,LPSTR *keywords,UINT16 nrofkeywords,DWORD dwFlags
+	LPCSTR dev,LPSTR *keywords,UINT16 nrofkeywords,DWORD dwFlags,\
+        HWND16 hwndCallback
 
 /* copy string to return pointer including necessary checks 
  * for use in mciSendString()
@@ -340,7 +346,7 @@ MCISTR_Open(_MCISTR_PROTO_) {
 	}
 	GetDrv(wDevID)->wType		= uDevTyp;
 	GetDrv(wDevID)->wDeviceID	= 0;  /* FIXME? for multiple devices */
-	pU->openParams.dwCallback	= 0;
+	pU->openParams.dwCallback	= hwndCallback ;
 	pU->openParams.wDeviceID	= wDevID;
 	pU->ovlyopenParams.dwStyle	= 0; 
 	pU->animopenParams.dwStyle	= 0; 
@@ -543,7 +549,7 @@ MCISTR_Status(_MCISTR_PROTO_) {
 	MCI_STATUS_PARMS	*statusParams = SEGPTR_NEW(MCI_STATUS_PARMS);
 	int			type = 0,i,res,timef;
 
-	statusParams->dwCallback = 0;
+	statusParams->dwCallback = hwndCallback;
 	dwFlags	|= MCI_STATUS_ITEM;
 	res = _MCISTR_determine_timeformat(dev,wDevID,uDevTyp,&timef);
 	if (res) return res;
@@ -672,7 +678,7 @@ MCISTR_Set(_MCISTR_PROTO_) {
         union U *pU = SEGPTR_NEW(union U);
 	int	i,res;
 
-	pU->setParams.dwCallback = 0;
+	pU->setParams.dwCallback = hwndCallback;
 	i = 0;
 	while (i<nrofkeywords) {
 		FLAG2("door","open",MCI_SET_DOOR_OPEN);
@@ -931,7 +937,7 @@ MCISTR_Capability(_MCISTR_PROTO_) {
 	MCI_GETDEVCAPS_PARMS *gdcParams = SEGPTR_NEW(MCI_GETDEVCAPS_PARMS);
 	int	type=0,i,res;
 
-	gdcParams->dwCallback = 0;
+	gdcParams->dwCallback = hwndCallback;
 	if (!nrofkeywords)
 		return MCIERR_MISSING_STRING_ARGUMENT;
 	/* well , thats default */
@@ -995,7 +1001,7 @@ MCISTR_Resume(_MCISTR_PROTO_)
 {
     MCI_GENERIC_PARMS *genParams = SEGPTR_NEW(MCI_GENERIC_PARMS);
     int	res;
-    genParams->dwCallback = 0;
+    genParams->dwCallback = hwndCallback;
     _MCI_CALL_DRIVER( MCI_RESUME, SEGPTR_GET(genParams) );
     return res;
 }
@@ -1006,7 +1012,7 @@ MCISTR_Pause(_MCISTR_PROTO_)
 {
     MCI_GENERIC_PARMS *genParams = SEGPTR_NEW(MCI_GENERIC_PARMS);
     int res;
-    genParams->dwCallback = 0;
+    genParams->dwCallback = hwndCallback;
     _MCI_CALL_DRIVER( MCI_PAUSE, SEGPTR_GET(genParams) );
     return res;
 }
@@ -1017,7 +1023,7 @@ MCISTR_Stop(_MCISTR_PROTO_)
 {
     MCI_GENERIC_PARMS *genParams = SEGPTR_NEW(MCI_GENERIC_PARMS);
     int res;
-    genParams->dwCallback = 0;
+    genParams->dwCallback = hwndCallback;
     _MCI_CALL_DRIVER( MCI_STOP, SEGPTR_GET(genParams) );
     return res;
 }
@@ -1060,7 +1066,7 @@ MCISTR_Record(_MCISTR_PROTO_) {
 		nrargs=1;
 		break;
 	}
-	recordParams->dwCallback = 0;
+	recordParams->dwCallback = hwndCallback;
 	i = 0;
 	while (i<nrofkeywords) {
 		if (!strcmp(keywords[i],"to") && (i+1<nrofkeywords)) {
@@ -1149,7 +1155,7 @@ MCISTR_Play(_MCISTR_PROTO_) {
 		nrargs=1;
 		break;
 	}
-	pU->playParams.dwCallback=0;
+	pU->playParams.dwCallback=hwndCallback;
 	i=0;
 	while (i<nrofkeywords) {
 		if (!strcmp(keywords[i],"to") && (i+1<nrofkeywords)) {
@@ -1246,7 +1252,7 @@ MCISTR_Seek(_MCISTR_PROTO_) {
 		nrargs=1;
 		break;
 	}
-	seekParams->dwCallback=0;
+	seekParams->dwCallback=hwndCallback;
 	i=0;
 	while (i<nrofkeywords) {
 		if (	!STRCMP(keywords[i],"to") && (i+1<nrofkeywords)) {
@@ -2157,8 +2163,7 @@ DWORD mciSendString (LPCSTR lpstrCommand, LPSTR lpstrReturnString,
 			continue;
 		}
 		if (!STRCMP(keywords[i],"notify")) {
-			/* how should we callback?  I don't know. */
-			/*dwFlags |= MCI_NOTIFY;*/
+		        dwFlags |= MCI_NOTIFY;
 			memcpy(keywords+i,keywords+(i+1),(nrofkeywords-i-1)*sizeof(char *));
 			nrofkeywords--;
 			continue;
@@ -2181,7 +2186,7 @@ DWORD mciSendString (LPCSTR lpstrCommand, LPSTR lpstrReturnString,
 			if (!MMSYSTEM_DevIDValid(wDevID)) {
 				dprintf_mci(stddeb, __FILE__":mciSendString:MAXMCIDRIVERS reached!\n");
 				free(keywords);free(cmd);
-				return MCIERR_INTERNAL;
+				return MCIERR_INVALID_DEVICE_NAME;
 			}
 		}
 		uDevTyp=GetDrv(wDevID)->wType;
@@ -2192,7 +2197,7 @@ DWORD mciSendString (LPCSTR lpstrCommand, LPSTR lpstrReturnString,
  			res=MCISTR_cmdtable[i].fun(
  				wDevID,uDevTyp,lpstrReturnString,
  				uReturnLength,dev,(LPSTR*)keywords,nrofkeywords,
- 				dwFlags
+ 				dwFlags,hwndCallback
  			);
  			break;
  		}
diff --git a/multimedia/midi.c b/multimedia/midi.c
index 4706a454549..7384f8de8e2 100644
--- a/multimedia/midi.c
+++ b/multimedia/midi.c
@@ -91,14 +91,42 @@ static LINUX_MCIMIDI	MCIMidiDev[MAX_MCIMIDIDRV];
 static DWORD MIDI_NotifyClient(UINT16 wDevID, WORD wMsg, 
 				DWORD dwParam1, DWORD dwParam2)
 {
+	dprintf_midi(stddeb,"MIDI_NotifyClient // wDevID = %04X wMsg = %d dwParm1 = %04lX dwParam2 = %04lX\n",wDevID, wMsg, dwParam1, dwParam2);
+
 #if defined(linux) || defined(__FreeBSD__)
+
+	switch (wMsg) {
+	case MOM_OPEN:
+	case MOM_CLOSE:
+	case MOM_DONE:
+	  if (wDevID > MAX_MIDIOUTDRV) return MCIERR_INTERNAL;
+	  
+	  if (MidiOutDev[wDevID].wFlags != DCB_NULL && !DriverCallback(
+		MidiOutDev[wDevID].midiDesc.dwCallback, 
+		MidiOutDev[wDevID].wFlags, 
+		MidiOutDev[wDevID].midiDesc.hMidi, 
+                wMsg, 
+		MidiOutDev[wDevID].midiDesc.dwInstance, 
+                dwParam1, 
+                dwParam2)) {
+	    dprintf_midi(stddeb,"MIDI_NotifyClient // can't notify client !\n");
+	    return MMSYSERR_NOERROR;
+	  }
+	  break;
+
+	case MIM_OPEN:
+	case MIM_CLOSE:
+	  if (wDevID > MAX_MIDIINDRV) return MCIERR_INTERNAL;
+	  
 	if (MidiInDev[wDevID].wFlags != DCB_NULL && !DriverCallback(
 		MidiInDev[wDevID].midiDesc.dwCallback, MidiInDev[wDevID].wFlags, 
 		MidiInDev[wDevID].midiDesc.hMidi, wMsg, 
 		MidiInDev[wDevID].midiDesc.dwInstance, dwParam1, dwParam2)) {
-		dprintf_midi(stddeb, "MIDI_NotifyClient // can't notify client !\n");
+	    dprintf_mciwave(stddeb,"MIDI_NotifyClient // can't notify client !\n");
 		return MMSYSERR_NOERROR;
 		}
+	  break;
+	}
         return 0;
 #else
 	return MMSYSERR_NOTENABLED;
@@ -293,6 +321,7 @@ static DWORD MIDI_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
 		MCIMidiDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
 		MCIMidiDev[wDevID].hMidiHdr = USER_HEAP_ALLOC(sizeof(MIDIHDR));
 		}
+
 	dprintf_midi(stddeb, "MIDI_mciOpen // wDevID=%04X\n", wDevID);
 /*	lpParms->wDeviceID = wDevID;*/
 	dprintf_midi(stddeb, "MIDI_mciOpen // lpParms->wDevID=%04X\n", lpParms->wDeviceID);
@@ -352,15 +381,16 @@ static DWORD MIDI_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
 				(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType,
 				ckMainRIFF.cksize);
 		}
+
 	dwRet = modMessage(wDevID, MODM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);
-/*	dwRet = midMessage(wDevID, MIDM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL); */
+/*	dwRet = midMessage(wDevID, MIDM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);*/
+
 	return 0;
 #else
 	return MMSYSERR_NOTENABLED;
 #endif
 }
 
-
 /**************************************************************************
 * 				MIDI_mciStop			[internal]
 */
@@ -868,7 +898,12 @@ static DWORD MIDI_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms
 static DWORD midGetDevCaps(WORD wDevID, LPMIDIINCAPS lpCaps, DWORD dwSize)
 {
 	dprintf_midi(stddeb, "midGetDevCaps(%04X, %p, %08lX);\n", wDevID, lpCaps, dwSize);
-	return MMSYSERR_NOTENABLED;
+	lpCaps->wMid = 0x00FF; 	        /* Manufac ID */
+	lpCaps->wPid = 0x0001; 	        /* Product ID */
+	lpCaps->vDriverVersion = 0x001; /* Product Version */
+	strcpy(lpCaps->szPname, "Linux MIDIIN Driver");
+
+	return MMSYSERR_NOERROR;
 }
 
 /**************************************************************************
@@ -1051,7 +1086,21 @@ DWORD midMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
 static DWORD modGetDevCaps(WORD wDevID, LPMIDIOUTCAPS lpCaps, DWORD dwSize)
 {
 	dprintf_midi(stddeb, "modGetDevCaps(%04X, %p, %08lX);\n", wDevID, lpCaps, dwSize);
-	return MMSYSERR_NOTENABLED;
+	lpCaps->wMid = 0x00FF; 	/* Manufac ID */
+	lpCaps->wPid = 0x0001; 	/* Product ID */
+	lpCaps->vDriverVersion = 0x001; /* Product Version */
+	strcpy(lpCaps->szPname, "Linux MIDIOUT Driver version 0.01");
+/* FIXME
+   Values are the same as I get with Borland TC 4.5
+*/
+
+	lpCaps->wTechnology = MOD_FMSYNTH;
+	lpCaps->wVoices     = 14;       /* make it ioctl */
+	lpCaps->wNotes      = 14;       /* make it ioctl */
+	lpCaps->dwSupport   = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME;
+	dprintf_midi(stddeb,"Linux modGetDevCaps // techn = %d voices=%d notes = %d support = %ld\n",lpCaps->wTechnology,lpCaps->wVoices,lpCaps->wNotes,lpCaps->dwSupport);
+
+	return MMSYSERR_NOERROR;
 }
 
 
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index e8d094ab736..42eace9f91e 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -12,6 +12,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <fcntl.h>
+#include <errno.h>
 #include <sys/ioctl.h>
 #include "windows.h"
 #include "win.h"
@@ -280,20 +281,19 @@ BOOL16 DriverCallback(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev,
 			dprintf_mmsys(stddeb, "DriverCallback() // CALLBACK_NULL !\n");
 			break;
 		case DCB_WINDOW:
-			dprintf_mmsys(stddeb, "DriverCallback() // CALLBACK_WINDOW = %04lX!\n",dwCallBack);
+			dprintf_mmsys(stddeb, "DriverCallback() // CALLBACK_WINDOW = %04lX handle = %04X!\n",dwCallBack,hDev);
 			if (!IsWindow32(dwCallBack)) return FALSE;
-			dprintf_mmsys(stddeb, "DriverCallback() // Device Handle = %04X\n", hDev);
 			lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hDev);
 			if (lpDesc == NULL) return FALSE;
 
-			dprintf_mmsys(stddeb, "DriverCallback() // Before PostMessage16\n");
 			PostMessage16((HWND16)dwCallBack, wMsg, hDev, dwParam1);
 			break;
 		case DCB_TASK:
 			dprintf_mmsys(stddeb, "DriverCallback() // CALLBACK_TASK !\n");
-			break;
+			return FALSE;
 		case DCB_FUNCTION:
 			dprintf_mmsys(stddeb, "DriverCallback() // CALLBACK_FUNCTION !\n");
+			CallTo16_word_wwlll((FARPROC16)dwCallBack,hDev,wMsg,dwUser,dwParam1,dwParam2);
 			break;
 		}
 	return TRUE;
@@ -715,7 +715,7 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
 			uDevTyp = LOWORD((DWORD)lpParms->lpstrDeviceType);
  			GetOpenDrv(wDevID)->lpstrDeviceType=lpParms->lpstrDeviceType;
 		} else {
-			if (lpParms->lpstrDeviceType == NULL) return MCIERR_INTERNAL;
+			if (lpParms->lpstrDeviceType == (SEGPTR)NULL) return MCIERR_INTERNAL;
 			dprintf_mmsys(stddeb, "MCI_OPEN // Dev='%s' !\n",
                               (char*)PTR_SEG_TO_LIN(lpParms->lpstrDeviceType));
                         GetOpenDrv(wDevID)->lpstrDeviceType = SEGPTR_GET(
@@ -770,11 +770,14 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
 	  return MCIERR_INVALID_DEVICE_NAME;
         }
 
+
+	if (dwParam&MCI_NOTIFY)
+	  mciDriverNotify(lpParms->dwCallback,wDevID,
+			  (dwret==0?MCI_NOTIFY_SUCCESSFUL:MCI_NOTIFY_FAILURE));
+
 	/* only handled devices fall through */
 	dprintf_mmsys(stddeb, "MCI_OPEN // wDevID = %04X wDeviceID = %d dwret = %ld\n",wDevID, lpParms->wDeviceID, dwret);
 	return dwret;
-
-/*	return MCIERR_INTERNAL; */
 }
 
 
@@ -811,6 +814,11 @@ DWORD mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
 			dwRet = MCIERR_DEVICE_NOT_INSTALLED;
 		}
 	GetDrv(wDevID)->wType = 0;
+
+	if (dwParam&MCI_NOTIFY)
+	  mciDriverNotify(lpParms->dwCallback,wDevID,
+			  (dwRet==0?MCI_NOTIFY_SUCCESSFUL:MCI_NOTIFY_FAILURE));
+
 	dprintf_mmsys(stddeb, "mciClose() // returns %ld\n",dwRet);
 	return dwRet;
 }
@@ -1046,7 +1054,7 @@ UINT16 midiOutGetNumDevs(void)
 UINT16 midiOutGetDevCaps(UINT16 uDeviceID, MIDIOUTCAPS * lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiOutGetDevCaps\n");
-	return 0;
+	return modMessage(uDeviceID,MODM_GETDEVCAPS,0,(DWORD)lpCaps,uSize);
 }
 
 /**************************************************************************
@@ -1307,7 +1315,7 @@ UINT16 midiInGetDevCaps(UINT16 uDeviceID,
     LPMIDIINCAPS lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiInGetDevCaps\n");
-	return 0;
+	return midMessage(uDeviceID,MIDM_GETDEVCAPS,0,(DWORD)lpCaps,uSize);;
 }
 
 /**************************************************************************
@@ -1592,6 +1600,7 @@ UINT16 waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
 	lpDesc->lpFormat = lpFormat;  /* should the struct be copied iso pointer? */
 	lpDesc->dwCallBack = dwCallback;
 	lpDesc->dwInstance = dwInstance;
+	if (uDeviceID >= MAXWAVEDRIVERS) uDeviceID = 0;
 	while(uDeviceID < MAXWAVEDRIVERS) {
 		dwRet = wodMessage(uDeviceID, WODM_OPEN, 
 			lpDesc->dwInstance, (DWORD)lp16Desc, dwFlags);
@@ -1899,7 +1908,7 @@ UINT16 waveInOpen(HWAVEIN16 * lphWaveIn, UINT16 uDeviceID,
 	lpDesc->uDeviceID = uDeviceID;
 	if (dwFlags & WAVE_FORMAT_QUERY) {
 		dprintf_mmsys(stddeb, "waveInOpen	// End of WAVE_FORMAT_QUERY !\n");
-		waveInClose(hWaveIn);
+		dwRet = waveInClose(hWaveIn);
 		}
 	return dwRet;
 }
@@ -1934,7 +1943,7 @@ UINT16 waveInPrepareHeader(HWAVEIN16 hWaveIn,
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
 	if (lpWaveInHdr == NULL) return MMSYSERR_INVALHANDLE;
 	lp32WaveInHdr = PTR_SEG_TO_LIN(lpWaveInHdr);
-	lp32WaveInHdr->lpNext = NULL;
+	lp32WaveInHdr->lp16Next = (SEGPTR)NULL;
     lp32WaveInHdr->dwBytesRecorded = 0;
 	dprintf_mmsys(stddeb, "waveInPrepareHeader // lpData=%p size=%lu \n", 
 		lp32WaveInHdr->lpData, lp32WaveInHdr->dwBufferLength);
@@ -1960,7 +1969,7 @@ UINT16 waveInUnprepareHeader(HWAVEIN16 hWaveIn,
 	lp32WaveInHdr = PTR_SEG_TO_LIN(lpWaveInHdr);
 	USER_HEAP_FREE(HIWORD((DWORD)lp32WaveInHdr->lpData));
 	lp32WaveInHdr->lpData = NULL;
-	lp32WaveInHdr->lpNext = NULL;
+	lp32WaveInHdr->lp16Next = (SEGPTR)NULL;
 	return widMessage(lpDesc->uDeviceID, WIDM_UNPREPARE, lpDesc->dwInstance, 
 							(DWORD)lpWaveInHdr, uSize);
 }
@@ -1980,7 +1989,7 @@ UINT16 waveInAddBuffer(HWAVEIN16 hWaveIn,
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
 	if (lpWaveInHdr == NULL) return MMSYSERR_INVALHANDLE;
 	lp32WaveInHdr = PTR_SEG_TO_LIN(lpWaveInHdr);
-	lp32WaveInHdr->lpNext = NULL;
+	lp32WaveInHdr->lp16Next = (SEGPTR)NULL;
     lp32WaveInHdr->dwBytesRecorded = 0;
 	dprintf_mmsys(stddeb, "waveInAddBuffer // lpData=%p size=%lu \n", 
 		lp32WaveInHdr->lpData, lp32WaveInHdr->dwBufferLength);
diff --git a/objects/dc.c b/objects/dc.c
index 4f25c906d27..0210fc386b1 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -305,11 +305,11 @@ BOOL32 DC_SetupGCForPen( DC * dc )
     switch (dc->w.ROPmode)
     {
     case R2_BLACK :
-	val.foreground = BlackPixel(display, DefaultScreen(display));
+	val.foreground = BlackPixelOfScreen( screen );
 	val.function = GXcopy;
 	break;
     case R2_WHITE :
-	val.foreground = WhitePixel(display, DefaultScreen(display));
+	val.foreground = WhitePixelOfScreen( screen );
 	val.function = GXcopy;
 	break;
     case R2_XORPEN :
@@ -317,8 +317,8 @@ BOOL32 DC_SetupGCForPen( DC * dc )
 	/* It is very unlikely someone wants to XOR with 0 */
 	/* This fixes the rubber-drawings in paintbrush */
 	if (val.foreground == 0)
-	    val.foreground = BlackPixel(display, DefaultScreen(display))
-			    ^ WhitePixel(display, DefaultScreen(display));
+	    val.foreground = BlackPixelOfScreen( screen )
+			    ^ WhitePixelOfScreen( screen );
 	val.function = GXxor;
 	break;
     default :
diff --git a/objects/font.c b/objects/font.c
index e79c6b6352e..75dcf63bc41 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -797,6 +797,7 @@ BOOL32 GetTextMetrics32A( HDC32 hdc, TEXTMETRIC32A *metrics )
     Italic = % 3i\t LastChar = %03i\t\t MaxCharWidth = %i
     UnderLined = %01i\t DefaultChar = %03i\t Overhang = %i
     StruckOut = %01i\t BreakChar = %03i\t CharSet = %i
+    PitchAndFamily = %02x
     --------------------
     InternalLeading = %i
     Ascent = %i
@@ -806,6 +807,7 @@ BOOL32 GetTextMetrics32A( HDC32 hdc, TEXTMETRIC32A *metrics )
     metrics->tmItalic, metrics->tmLastChar, metrics->tmMaxCharWidth,
     metrics->tmUnderlined, metrics->tmDefaultChar, metrics->tmOverhang,
     metrics->tmStruckOut, metrics->tmBreakChar, metrics->tmCharSet,
+    metrics->tmPitchAndFamily,
     metrics->tmInternalLeading,
     metrics->tmAscent,
     metrics->tmDescent,
@@ -852,11 +854,11 @@ BOOL16 GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
 	    HeapFree(SystemHeap, 0, obuf32);
 	}
     }
-    else
+    else /* happens quite often to warrant a special treatment */
     {
 	INT32 chWidth;
 	retVal = GetCharWidth32A(hdc, firstChar, lastChar, &chWidth );
-	*buffer = chWidth;
+       *buffer = chWidth;
     }
     return retVal;
 }
@@ -868,6 +870,7 @@ BOOL16 GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
 BOOL32 GetCharWidth32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
                         LPINT32 buffer )
 {
+    UINT32 i, extra;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc)
     {
@@ -879,6 +882,12 @@ BOOL32 GetCharWidth32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
         !dc->funcs->pGetCharWidth( dc, firstChar, lastChar, buffer))
         return FALSE;
 
+    /* convert device units to logical */
+
+    extra = dc->vportExtX >> 1;
+    for( i = firstChar; i <= lastChar; i++, buffer++ )
+         *buffer = (*buffer * dc->wndExtX + extra) / dc->vportExtX;
+
     return TRUE;
 }
 
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 52c8bd5a178..813fa6f1540 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -37,19 +37,23 @@ static BRUSHOBJ WhiteBrush =
 static BRUSHOBJ LtGrayBrush =
 {
     { 0, BRUSH_MAGIC, 1 },             /* header */
+/* FIXME : this should perhaps be BS_HATCHED, at least for 1 bitperpixel */
     { BS_SOLID, RGB(192,192,192), 0 }  /* logbrush */
 };
 
 static BRUSHOBJ GrayBrush =
 {
     { 0, BRUSH_MAGIC, 1 },             /* header */
+/* FIXME : this should perhaps be BS_HATCHED, at least for 1 bitperpixel */
     { BS_SOLID, RGB(128,128,128), 0 }  /* logbrush */
 };
 
 static BRUSHOBJ DkGrayBrush =
 {
     { 0, BRUSH_MAGIC, 1 },          /* header */
-    { BS_SOLID, RGB(64,64,64), 0 }  /* logbrush */
+/* This is BS_HATCHED, for 1 bitperpixel. This makes the spray work in pbrush */
+/* NB_HATCH_STYLES is an index into HatchBrushes */
+    { BS_HATCHED, RGB(0,0,0), NB_HATCH_STYLES }  /* logbrush */
 };
 
 static BRUSHOBJ BlackBrush =
@@ -106,7 +110,7 @@ static FONTOBJ AnsiVarFont =
 static FONTOBJ SystemFont =
 {
     { 0, FONT_MAGIC, 1 },
-    { 12, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET,
+    { 16, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET,
       0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "System" }
 };
 
diff --git a/objects/text.c b/objects/text.c
index ce7572b47db..176ddd665b1 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -601,3 +601,15 @@ DWORD GetTabbedTextExtent32W( HDC32 hdc, LPCWSTR lpstr, INT32 count,
     HeapFree( GetProcessHeap(), 0, p );
     return ret;
 }
+
+/***********************************************************************
+ *           GetTextCharset    (USER32.226) (USER.612)
+ */
+INT32 GetTextCharset32(HDC32 hdc) {
+    fprintf(stdnimp,"GetTextCharset(0x%x)\n",hdc);
+    return DEFAULT_CHARSET; /* FIXME */
+}
+
+INT16 GetTextCharset16(HDC16 hdc) {
+    return GetTextCharset32(hdc);
+}
diff --git a/programs/winhelp/ChangeLog b/programs/winhelp/ChangeLog
index 3845ae377d3..63484af8e04 100644
--- a/programs/winhelp/ChangeLog
+++ b/programs/winhelp/ChangeLog
@@ -1,3 +1,8 @@
+Tue Jun  3 07:47:42 1997  Marcel Baur <mbaur@g26.ethz.ch
+
+	* [Va.rc] (new)
+	Added Vallader (Rumantsch Ladin) language support.
+
 Wed Feb 12 00:58:37 1997  Elker Cavina <elker@mail.asianet.it>
 
 	* [It.rc] (new)
diff --git a/programs/winhelp/Makefile.in b/programs/winhelp/Makefile.in
index 9a9edfd3615..0e5ea167d0e 100644
--- a/programs/winhelp/Makefile.in
+++ b/programs/winhelp/Makefile.in
@@ -7,7 +7,7 @@ PROGRAMS  = winhelp hlp2sgml
 ALL_LIBS  = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
 RCFLAGS   = -w32
 
-LANGUAGES   = En De Fr Fi Ko Hu It
+LANGUAGES   = En De Fr Fi Ko Hu It Va
 
 # Installation infos
 
diff --git a/programs/winhelp/Va.rc b/programs/winhelp/Va.rc
new file mode 100644
index 00000000000..62d04241ddf
--- /dev/null
+++ b/programs/winhelp/Va.rc
@@ -0,0 +1,51 @@
+/*
+ * Help Viewer
+ * 
+ * Copyright 1996 Ulrich Schmid
+ *
+ * Rumantsch Ladin (Vallader) by mbaur@g26.ethz.ch
+ *
+ */
+
+/* This file is not yet complete !! */
+
+#define LANGUAGE_ID                  Rl
+#define LANGUAGE_NUMBER              C
+
+/* Menu */
+
+#define MENU_FILE                    "&Datoteca"
+#define MENU_FILE_OPEN               "&Rivir"
+#define MENU_FILE_PRINT              "&Stampar tema"
+#define MENU_FILE_PRINTER_SETUP      "&Installaziun dal stampader..."
+#define MENU_FILE_EXIT               "&Finir"
+
+#define MENU_EDIT                    "&Lavurar"
+#define MENU_EDIT_COPY_DIALOG        "&Capchar"
+#define MENU_EDIT_ANNOTATE           "&Annotaziun..."
+
+#define MENU_BOOKMARK                "&Marca"
+#define MENU_BOOKMARK_DEFINE         "&Definir..."
+
+#define MENU_HELP                    "&Agüd"
+#define MENU_HELP_ON_HELP            "&Douvrar l'agüd"
+#define MENU_HELP_ON_TOP             "Adüna da&vant"
+#define MENU_HELP_INFO               "I&nfuormaziuns"
+#define MENU_HELP_ABOUT_WINE         "Davart &WINE"
+
+/* Strings */
+
+#define STRING_WINE_HELP             "WINE agüd"
+#define STRING_ERROR                 "SBAGL"
+#define STRING_WARNING               "ATTENZIUN"
+#define STRING_INFO                  "INFUORMAZIUN"
+#define STRING_NOT_IMPLEMENTED       "Na implementa"
+#define STRING_HLPFILE_ERROR_s       "Sbagl cun leger la datoteca d'agüd `%s'"
+#define STRING_CONTENTS              "&Cuntgnü"
+#define STRING_SEARCH                "&Tscherchar"
+#define STRING_BACK                  "&Inavo"
+#define STRING_HISTORY               "&Fin qua"
+#define STRING_ALL_FILES             "Tuot las datotecas (*.*)"
+#define STRING_HELP_FILES_HLP        "Datotecas d'agüd (*.hlp)"
+
+#include "Xx.rc"
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index 8c338e3b571..8b530553189 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -21,6 +21,7 @@ VOID LIBWINE_Register_Fr(void);
 VOID LIBWINE_Register_It(void);
 VOID LIBWINE_Register_Ko(void);
 VOID LIBWINE_Register_Hu(void);
+VOID LIBWINE_Register_Va(void);
 
 static BOOL    WINHELP_RegisterWinClasses();
 static LRESULT WINHELP_MainWndProc(HWND, UINT, WPARAM, LPARAM);
@@ -62,6 +63,7 @@ int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show)
   LIBWINE_Register_It();
   LIBWINE_Register_Ko();
   LIBWINE_Register_Hu();
+  LIBWINE_Register_Va();
 #endif
 
   Globals.hInstance = hInstance;
diff --git a/rc/parser.h b/rc/parser.h
index c0d2d27feab..cb345ae4c96 100644
--- a/rc/parser.h
+++ b/rc/parser.h
@@ -67,7 +67,8 @@ int dialog_get_fontsize(gen_res*);
 gen_res* dialog_caption(char*,gen_res*);
 gen_res* dialog_font(short,char*,gen_res*);
 gen_res* dialog_class(char*,gen_res*);
-gen_res* dialog_menu(char*,gen_res*);
+gen_res* dialog_menu_id(short,gen_res*);
+gen_res* dialog_menu_str(char*,gen_res*);
 gen_res* create_control_desc(int,int,int,int,int,rc_style*);
 gen_res* label_control_desc(char*,gen_res*);
 gen_res* create_generic_control(char*,int,char*,rc_style*,int,int,int,int);
diff --git a/rc/parser.y b/rc/parser.y
index bbf38fa7979..cae8a1a8433 100644
--- a/rc/parser.y
+++ b/rc/parser.y
@@ -72,7 +72,7 @@ resource_definition:	accelerators {$$=$1;}
                 ;
 
 /* have to use tBEGIN because BEGIN is predefined */
-accelerators:	ACCELERATORS  tBEGIN  events tEND {$$=$3;$$->type=acc;}
+accelerators:	ACCELERATORS load_and_memoption tBEGIN  events tEND {$$=$4;$$->type=acc;}
 /* the events are collected in a gen_res, as the accelerator resource is just
    an array of events */
 events:		{$$=new_res();}
@@ -113,7 +113,9 @@ dlg_attributes:	{$$=new_dialog();}
 		| CLASS tSTRING dlg_attributes
 		  {$$=dialog_class($2,$3);}
 		| MENU tSTRING dlg_attributes
-		  {$$=dialog_menu($2,$3);}
+		  {$$=dialog_menu_str($2,$3);}
+		| MENU NUMBER dlg_attributes
+		  {$$=dialog_menu_id($2,$3);}
 
 /* the controls are collected into a gen_res, and finally the dialog header 
    is put at the beginning */
diff --git a/rc/winerc.c b/rc/winerc.c
index 9dbcf90eef1..66f7efecac9 100644
--- a/rc/winerc.c
+++ b/rc/winerc.c
@@ -354,7 +354,16 @@ gen_res* dialog_class(char* cap, gen_res*attr)
 	return insert_string(attr,cap,dialog_get_class(attr),0);
 }
 
-gen_res* dialog_menu(char* cap, gen_res*attr)
+gen_res* dialog_menu_id(short nr, gen_res*attr)
+{
+	char c_nr[2];
+	int offs=dialog_get_menu(attr);
+	attr->res[offs] = 0xff;
+	if (win32) attr->res[offs+1] = 0xff;
+	put_WORD(c_nr,nr);
+	return insert_bytes(attr,c_nr,offs+(win32?2:1),2);
+}
+gen_res* dialog_menu_str(char* cap, gen_res*attr)
 {
 	return insert_string(attr,cap,dialog_get_menu(attr),0);
 }
@@ -415,10 +424,12 @@ gen_res* label_control_desc(char* label,gen_res* cd)
 gen_res* create_generic_control(char* label,int id,char* class,
 	rc_style*style,int x,int y,int cx,int cy)
 {	gen_res* ret=new_res();
+	int s=WS_VISIBLE|WS_CHILD; /*default styles for any control*/
+	if(style)s=(s|style->or)&style->and;
 	if(win32)
 	{
 		WORD cl;
-		put_DWORD(ret->res+0,style->or);
+		put_DWORD(ret->res+0,s);
 		/* FIXME */
 		/* put_DWORD(ret->res+4,exstyle->or); */
 		put_WORD(ret->res+8,x);
@@ -430,12 +441,12 @@ gen_res* create_generic_control(char* label,int id,char* class,
 		ret=insert_string(ret,label,20,0);
 		/* is it a predefined class? */
 		cl=0;
-		if(!strcmp(class,"BUTTON"))cl=CT_BUTTON;
-		if(!strcmp(class,"EDIT"))cl=CT_EDIT;
-		if(!strcmp(class,"STATIC"))cl=CT_STATIC;
-		if(!strcmp(class,"LISTBOX"))cl=CT_LISTBOX;
-		if(!strcmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
-		if(!strcmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
+		if(!strcasecmp(class,"BUTTON"))cl=CT_BUTTON;
+		if(!strcasecmp(class,"EDIT"))cl=CT_EDIT;
+		if(!strcasecmp(class,"STATIC"))cl=CT_STATIC;
+		if(!strcasecmp(class,"LISTBOX"))cl=CT_LISTBOX;
+		if(!strcasecmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
+		if(!strcasecmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
 		if(cl) {
 			char ffff[2]={0xff, 0xff};
 			ret=insert_bytes(ret,ffff,18,2);
@@ -451,17 +462,17 @@ gen_res* create_generic_control(char* label,int id,char* class,
 		put_WORD(ret->res+4,cx);
 		put_WORD(ret->res+6,cy);
 		put_WORD(ret->res+8,id);
-		put_DWORD(ret->res+10,style->or);
+		put_DWORD(ret->res+10,s);
 		ret->size=17;
 		ret=insert_string(ret,label,15,0);
 		/* is it a predefined class? */
 		cl=0;
-		if(!strcmp(class,"BUTTON"))cl=CT_BUTTON;
-		if(!strcmp(class,"EDIT"))cl=CT_EDIT;
-		if(!strcmp(class,"STATIC"))cl=CT_STATIC;
-		if(!strcmp(class,"LISTBOX"))cl=CT_LISTBOX;
-		if(!strcmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
-		if(!strcmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
+		if(!strcasecmp(class,"BUTTON"))cl=CT_BUTTON;
+		if(!strcasecmp(class,"EDIT"))cl=CT_EDIT;
+		if(!strcasecmp(class,"STATIC"))cl=CT_STATIC;
+		if(!strcasecmp(class,"LISTBOX"))cl=CT_LISTBOX;
+		if(!strcasecmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
+		if(!strcasecmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
 		if(cl)ret->res[14]=cl;
 		else ret=insert_string(ret,class,14,0);
 	}
@@ -583,7 +594,11 @@ gen_res *load_file(char* name)
 	gen_res *res;
 	struct stat st;
 	int f=open(name,O_RDONLY);
-	if(!f)perror(name);
+	if(f<0)
+	{
+	  perror(name);
+	  exit(1);
+	}
 	fstat(f,&st);
 	res=new_res();
 	while(res->space<st.st_size)res=grow(res);
@@ -656,7 +671,9 @@ void add_str_tbl_elm(int id,char* str)
   while(*elm && (*elm)->group<group) elm=&(*elm)->next;
   if(!*elm || (*elm)->group!=group)
   {
+    int i;
     str_tbl_elm* new=xmalloc(sizeof(str_tbl_elm));
+    for(i=0; i<16; i++) new->strings[i] = NULL;
     new->group=group;
     new->next=*elm;
     *elm=new;
diff --git a/tools/build-spec.txt b/tools/build-spec.txt
index cb78f01c72e..4c980a5a07e 100644
--- a/tools/build-spec.txt
+++ b/tools/build-spec.txt
@@ -62,12 +62,13 @@ by the ordinal number corresponding to the function.
 - "word"
 - "long"
 - "ptr" (linear pointer)
+- "str" (linear pointer to a string)
 - "s_byte" (signed byte)
 - "s_word" (signed word)
 - "s_long" (signed long)
 - "segptr" (segmented pointer).
 
-Only "ptr" and "long" are valid for Win32 functions.
+Only "ptr", "str" and "long" are valid for Win32 functions.
 
 "HANDLERNAME" is the name of the actual Wine function that will
 process the request in 32-bit mode.
diff --git a/tools/build.c b/tools/build.c
index 53e67802b6d..c38785fc70c 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -370,6 +370,8 @@ static int ParseExportFunction( ORDDEF *odp )
             odp->u.func.arg_types[i] = 'l';
         else if (!strcmp(token, "ptr"))
             odp->u.func.arg_types[i] = 'p';
+	else if (!strcmp(token, "str"))
+	    odp->u.func.arg_types[i] = 't';
         else
         {
             fprintf(stderr, "%d: Unknown variable type '%s'\n", Line, token);
@@ -1442,6 +1444,7 @@ static int TransferArgs16To32( FILE *outfile, char *args )
             break;
 
         case 'p':  /* ptr */
+        case 't':  /* string */
             /* Get the selector */
             fprintf( outfile, "\tmovw %d(%%ebp),%%ax\n", pos16 + 2 );
             /* Get the selector base */
@@ -1574,7 +1577,7 @@ static void RestoreContext16( FILE *outfile )
  * Build a 16-bit-to-Wine callback function. The syntax of the function
  * profile is: type_xxxxx, where 'type' is one of 'regs', 'word' or
  * 'long' and each 'x' is an argument ('w'=word, 's'=signed word,
- * 'l'=long, 'p'=pointer).
+ * 'l'=long, 'p'=pointer, 't'=string).
  * For register functions, the arguments are ignored, but they are still
  * removed from the stack upon return.
  *
@@ -1736,6 +1739,7 @@ static void BuildCallFrom16Func( FILE *outfile, char *profile )
                 argsize += 2;
                 break;
             case 'p':
+            case 't':
             case 'l':
                 argsize += 4;
                 break;
diff --git a/win32/newfns.c b/win32/newfns.c
index 1bc9a98ce8d..b53a5036adf 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -26,10 +26,10 @@ QueryPerformanceCounter(LPLARGE_INTEGER counter) {
 
 /****************************************************************************
  *		DisableThreadLibraryCalls (KERNEL32.74)
+ * Don't call DllEntryPoint for DLL_THREAD_{ATTACH,DETACH} if set.
  */
 BOOL32
 DisableThreadLibraryCalls(HMODULE32 hModule) {
-	/* FIXME: stub for now */
     fprintf(stdnimp, "DisableThreadLibraryCalls Stub called!\n");
     return TRUE;
 }
diff --git a/windows/dce.c b/windows/dce.c
index d259fe08a3c..92622b1b581 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -461,27 +461,25 @@ HDC32 GetDCEx32( HWND32 hwnd, HRGN32 hrgnClip, DWORD flags )
     }
 
     if( flags & DCX_NOCLIPCHILDREN )
-      {
+    {
         flags |= DCX_CACHE;
         flags &= ~(DCX_PARENTCLIP | DCX_CLIPCHILDREN);
-      }
-
-    if (hwnd == GetDesktopWindow32() || !(wndPtr->dwStyle & WS_CHILD))
-        flags &= ~DCX_PARENTCLIP;
+    }
 
     if (flags & DCX_WINDOW) flags = (flags & ~DCX_CLIPCHILDREN) | DCX_CACHE;
 
-    if( flags & DCX_PARENTCLIP )
-      {
+    if (!(wndPtr->dwStyle & WS_CHILD) || !wndPtr->parent ) flags &= ~DCX_PARENTCLIP;
+    else if( flags & DCX_PARENTCLIP )
+    {
         flags |= DCX_CACHE;
         if( !(flags & (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN)) )
           if( (wndPtr->dwStyle & WS_VISIBLE) && (wndPtr->parent->dwStyle & WS_VISIBLE) )
-            {
+          {
               flags &= ~DCX_CLIPCHILDREN;
               if( wndPtr->parent->dwStyle & WS_CLIPSIBLINGS )
-                flags |= DCX_CLIPSIBLINGS;
-            }
-      }
+                  flags |= DCX_CLIPSIBLINGS;
+          }
+    }
 
     if (flags & DCX_CACHE)
     {
@@ -494,17 +492,17 @@ HDC32 GetDCEx32( HWND32 hwnd, HRGN32 hrgnClip, DWORD flags )
     {
         dce = (wndPtr->class->style & CS_OWNDC)?wndPtr->dce:wndPtr->class->dce;
 	if( dce->hwndCurrent == hwnd )
-	  {
+	{
 	    dprintf_dc(stddeb,"\tskipping hVisRgn update\n");
 	    need_update = FALSE;
-	  }
+	}
 
 	if( hrgnClip && dce->hClipRgn && !(dce->DCXflags & DCX_KEEPCLIPRGN))
-	  {
+	{
 	    fprintf(stdnimp,"GetDCEx: hClipRgn collision!\n");
             DeleteObject32( dce->hClipRgn ); 
 	    need_update = TRUE;
-	  }
+	}
     }
 
     dcx_flags = flags & ( DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_CACHE | DCX_WINDOW | DCX_WINDOWPAINT);
@@ -561,7 +559,7 @@ HDC32 GetDCEx32( HWND32 hwnd, HRGN32 hrgnClip, DWORD flags )
     }
     else hrgnVisible = CreateRectRgn32( 0, 0, 0, 0 );
 
-    if ((flags & DCX_INTERSECTRGN) || (flags & DCX_EXCLUDERGN))
+    if( flags & (DCX_EXCLUDERGN | DCX_INTERSECTRGN) )
     {
 	dce->DCXflags |= flags & (DCX_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_EXCLUDERGN);
 	dce->hClipRgn = hrgnClip;
diff --git a/windows/event.c b/windows/event.c
index c03c98cf068..42c8f34e318 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -451,7 +451,7 @@ static BOOL32 EVENT_QueryZOrder( WND* pWndCheck )
 
     parent = __get_common_ancestor( pWndZ->window, pWnd->window,
                                       &children, &total );
-    if( parent )
+    if( parent && children )
     {
         w = __get_top_decoration( pWndCheck->window, parent );
         if( w != children[total - 1] )
diff --git a/windows/keyboard.c b/windows/keyboard.c
index d1a6b117a1c..c1965ca9f0a 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -105,6 +105,44 @@ static const int modifier_key[] =
     VK_MENU, VK_MENU, VK_MENU, VK_MENU                         /* FFE7 */
 };
 
+/*
+ * Table for vkey to scancode translation - 5/29/97 chrisf@america.com 
+ */
+static BYTE vkey2scode[512] = {
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0e,0x0f,0x00,0x00,0x00,0x1c,0x00,0x00,
+  0x2a,0x1d,0x38,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+  0x39,0x49,0x51,0x4f,0x47,0x4b,0x48,0x4d, 0x50,0x00,0x00,0x00,0x00,0x52,0x53,0x00,
+  0x0b,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x1e,0x30,0x2e,0x20,0x12,0x21,0x22, 0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18,
+  0x19,0x10,0x13,0x1f,0x14,0x16,0x2f,0x11, 0x2d,0x15,0x2c,0x00,0x00,0x00,0x00,0x00,
+  0x0b,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0x0a,0x37,0x4e,0x00,0x4a,0x34,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x29,0x0c,0x0d,0x1a,0x1b,0x2b,
+  0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x28,0x33,0x34,0x35,0x4c,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+/* 256 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,
+  0x00,0x1d,0x38,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x49,0x51,0x4f,0x47,0x4b,0x48,0x4d, 0x50,0x00,0x00,0x00,0x00,0x52,0x53,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,
+  0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42, 0x43,0x44,0x57,0x58,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
 
 static WORD EVENT_event_to_vkey( XKeyEvent *e)
 {
@@ -367,7 +405,7 @@ void KEYBOARD_HandleEvent( XKeyEvent *event )
    if (vkey)
    {
     keylp.lp1.count = 1;
-    keylp.lp1.code = LOBYTE(event->keycode) - 8;
+    keylp.lp1.code = vkey2scode[vkey]; /* 5/29/97 chrisf@america.com */
     keylp.lp1.extended = (vkey & 0x100 ? 1 : 0);
     keylp.lp1.win_internal = 0; /* this has something to do with dialogs, 
 				* don't remember where I read it - AK */
diff --git a/windows/message.c b/windows/message.c
index 5b70ee282a3..0c22b8aff80 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -1012,8 +1012,9 @@ LRESULT SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam)
 
     if (hwnd == HWND_BROADCAST)
     {
+        if (!(list = WIN_BuildWinArray( WIN_GetDesktop(), 0, NULL )))
+            return TRUE;
         dprintf_msg(stddeb,"SendMessage // HWND_BROADCAST !\n");
-        list = WIN_BuildWinArray( WIN_GetDesktop(), 0, NULL );
         for (ppWnd = list; *ppWnd; ppWnd++)
         {
             wndPtr = *ppWnd;
@@ -1023,9 +1024,9 @@ LRESULT SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam)
                 dprintf_msg(stddeb,"BROADCAST Message to hWnd=%04x m=%04X w=%04lX l=%08lX !\n",
                             wndPtr->hwndSelf, msg, (DWORD)wParam, lParam);
                 SendMessage16( wndPtr->hwndSelf, msg, wParam, lParam );
-	    }
+            }
         }
-	HeapFree( SystemHeap, 0, list );
+        HeapFree( SystemHeap, 0, list );
         dprintf_msg(stddeb,"SendMessage // End of HWND_BROADCAST !\n");
         return TRUE;
     }
@@ -1099,7 +1100,8 @@ LRESULT SendMessage32A(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
 
     if (hwnd == HWND_BROADCAST)
     {
-        list = WIN_BuildWinArray( WIN_GetDesktop(), 0, NULL );
+        if (!(list = WIN_BuildWinArray( WIN_GetDesktop(), 0, NULL )))
+            return TRUE;
         for (ppWnd = list; *ppWnd; ppWnd++)
         {
             wndPtr = *ppWnd;
@@ -1148,7 +1150,8 @@ LRESULT SendMessage32W(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
 
     if (hwnd == HWND_BROADCAST)
     {
-        list = WIN_BuildWinArray( WIN_GetDesktop(), 0, NULL );
+        if (!(list = WIN_BuildWinArray( WIN_GetDesktop(), 0, NULL )))
+            return TRUE;
         for (ppWnd = list; *ppWnd; ppWnd++)
         {
             wndPtr = *ppWnd;
diff --git a/wine.ini b/wine.ini
index 1eff7932609..af8f3caebb9 100644
--- a/wine.ini
+++ b/wine.ini
@@ -48,11 +48,11 @@ SymbolTableFile=./wine.sym
 AllocSystemColors=100
 
 [fonts]
-; see documentation/fonts
-;Alias0 = System, --international-
-;Alias1 = MS Sans Serif, -adobe-helvetica-
-;Alias2 = Arial, -adobe-helvetica-, subst
-;Alias3 = Times New Roman, -adobe-times-, subst
+;Read documentation/fonts before changing this
+Alias0 = MS Sans Serif, -adobe-helvetica-
+;Alias1 = Arial, -adobe-helvetica-, subst
+;Alias2 = Times New Roman, -adobe-times-, subst
+Default = -adobe-times-
 
 [serialports]
 Com1=/dev/cua0
-- 
GitLab