diff --git a/ANNOUNCE b/ANNOUNCE
index 73a0d1a..b22dffa 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,13 +1,15 @@
-This is release 970804 of Wine, the MS Windows emulator.  This is still a
+This is release 970824 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-970804: (see ChangeLog for details)
-	- Joystick support.
-	- More Win32 stuff.
+WHAT'S NEW with Wine-970824: (see ChangeLog for details)
+	- Better Win32 menu support.
+	- Improved Winsock.
+	- UpDown control.
+	- More undocumented Win95 hacks.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -16,10 +18,10 @@
 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-970804.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970804.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970804.tar.gz
-  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970804.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970824.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970824.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970824.tar.gz
+  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970824.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/BUGS b/BUGS
index 74110a3..05f5253 100644
--- a/BUGS
+++ b/BUGS
@@ -42,9 +42,6 @@
 
  * "Cursor XXXX has more than 1 bpp!"
 
- * 32-bit Freecell segfaults when started from the Progman (looks like
-   a problem with cards.dll).
-
  * Margins in edit controls are too wide.
 
  * SGI window manager treats Wine windows as topmost.
diff --git a/ChangeLog b/ChangeLog
index f1264ad..94d3fd9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,129 @@
 ----------------------------------------------------------------------
+Sat Aug 23 00:05:23 1997  Andreas Mohr <100.30936@germany.net>
+
+	* [if1632/kernel.spec] [if1632/mmsystem.spec]
+	Added some stubs.
+
+	* [include/neexe.h] [loader/module.c]
+	Added warning for OS/2 executables.
+
+	* [multimedia/midi.c]
+	Shortened MIDIOUT driver version string to be less than 31 chars.
+
+	* [objects/gdiobj.c]
+	Fixed DeleteObject32() to react properly when called with stock object.
+
+Fri Aug 22 18:03:26 1997  Dimitrie O. Paun <dimi@cs.toronto.edu>
+
+	* [controls/updown.c] [include/updown.h]
+	First attempt at implementiong the UpDown class.
+
+	* [controls/widgets.c]
+	Added the UpDown class to be initialized by InitCommonControls().
+
+Wed Aug 20 18:01:33 1997  Doug Ridgway <ridgway@routh.UCSD.EDU>
+
+	* [graphics/*] [objects/*] [include/gdi.h]
+	Made all GDI objects (except DCs) moveable.
+
+Mon Aug 18 03:25:30 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>
+
+	* [windows/event.c] [misc/winsock.c] [misc/winsock_dns.c]
+	Removed IPC communication to speed up winsock services
+	(tested only with 16-bit netscape 3.03).
+
+	* [graphics/x11drv/xfont.c] [documentation/fonts]
+	Miscellaneous improvements. Updated docs.
+
+Sun Aug 17 20:39:55 1997  Ingo Schneider <schneidi@informatik.tu-muenchen.de>
+
+	* [misc/comm.c]
+	A couple of bug fixes.
+
+Sun Aug 17 19:29:22 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [debugger/dbg.y]
+	Display next instruction after stepi/nexti.
+
+	* [if1632/relay.c] [include/callback.h] [tools/build.c]
+	Replaced CallTo32_LargeStack with the CALL_LARGE_STACK macro for
+	better Winelib support.
+
+	* [include/sigcontext.h]
+	Renamed to sig_context.h to avoid conflicts with libc.
+
+	* [*/*]
+	All API functions are now prefixed with WINAPI in prevision of
+	future Winelib integration.
+
+	* [loader/signal.c] [memory/ldt.c]
+	Fixed assembly code to be -fPIC compatible.
+
+Thu Aug 14 14:38:15 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [if1632/crtdll.spec][win32/except.c]
+	_global_unwind, _local_unwind stub added.
+
+	* [objects/dib.c]	
+	Don't read memory you don't even need for the target bitmap (fixes
+	one 'lazy' program).
+
+	* [if1632/relay.c][if1632/thunk.c][if1632/kernel32.spec]
+	  [win32/ordinals.c][memory/selector.c][memory/global.c]
+	  [include/callback.h]
+	Added/moved some more win95 ordinal stuff. Implemented QT_Thunk
+	(not 100% correct yet) and some friends.
+
+	* [loader/pe_image.c]
+	Add possibility to break at the DLL entrypoint.
+
+	* [controls/static.c][misc/commdlg.c][scheduler/thread.c]
+	Misc bugfixes and additions.
+
+	* [misc/registry.c]
+	The registry seems to be case-preserving but case-insensitive.
+
+	* [memory/global.c]	
+	Adapted to new /proc/meminfo format.
+
+	* [objects/font.c][graphics/x11drv/xfont.c]
+	FONT_SelectObject and GetTextMetrics* get passed ranges in logical
+ 	and not device points (thanks to Marion Reyzl for pointing this
+ 	out).
+
+	* [windows/caret.c]
+	Use the windows own DC if present (The caret coordinates are
+	logical coordinates based on it). Fixes another AMIPRO problem.
+
+Wed Aug  6 18:22:22 1997  Morten Welinder  <terra@diku.dk>
+
+	* [controls/menu.c]
+	General clean-up and Win32 work: split item_flags into fType and
+	fState; split item_id into wID and hSubMenu.  Improved
+	debug-printing.  Implemented InsertMenuItem32[AW],
+	SetMenuDefaultItem32, and SetMenuItemInfo32[AW].  Fixed
+	GetMenuItemInfo32[AW].
+
+	* [if1632/user32.spec]
+	Define above new functions.
+
+	* [include/windows.h]
+	Define MF_DEFAULT and MF_RIGHTJUSTIFY.  Prototype above functions.
+
+	* [include/menu.h]
+	Don't prototype now-static MENU_InitSysMenuPopup.
+
+	* [include/comm.h]
+	Reduce MAX_PORTS to 9 (which the profile code can handle).
+
+Tue Aug  5 20:16:22 1997  Victor Schneider <vischne@ibm.net>
+
+	* [library/winestub.c] [libtest/expand.c]
+	These patches let people porting Windows apps compile them using
+	the same conventions regarding global _argc and _argv as those on
+	Windows C/C++ compilers.
+
+----------------------------------------------------------------------
 Sun Aug  3 14:03:43 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [documentation/Makefile.in]
diff --git a/README b/README
index 25a81f6..01bc791 100644
--- a/README
+++ b/README
@@ -83,7 +83,8 @@
 
 The best place to get help or to report bugs is the Usenet newsgroup
 comp.emulators.ms-windows.wine. The Wine FAQ is posted there every
-month.
+month. Also, you may want to browse old messages on www.dejanews.com 
+to check whether your problem is already fixed. 
 
 If you add something, or fix a bug, please send a patch ('diff -u'
 format preferred) to julliard@lrc.epfl.ch for inclusion in the next
diff --git a/controls/Makefile.in b/controls/Makefile.in
index 3379b18..9d24345 100644
--- a/controls/Makefile.in
+++ b/controls/Makefile.in
@@ -16,6 +16,7 @@
 	scroll.c \
 	static.c \
 	status.c \
+	updown.c \
 	widgets.c
 
 all: $(MODULE).o
diff --git a/controls/button.c b/controls/button.c
index 07cc5e1..312282d 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -71,7 +71,8 @@
 /***********************************************************************
  *           ButtonWndProc
  */
-LRESULT ButtonWndProc(HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+LRESULT WINAPI ButtonWndProc( HWND32 hWnd, UINT32 uMsg,
+                              WPARAM32 wParam, LPARAM lParam )
 {
     RECT16 rect;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
diff --git a/controls/combo.c b/controls/combo.c
index 3771933..3c3590f 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -83,30 +83,32 @@
  */
 static LRESULT COMBO_NCCreate(WND* wnd, LPARAM lParam)
 {
-  LPHEADCOMBO 		lphc;
+   LPHEADCOMBO 		lphc;
 
-  if ( wnd && COMBO_Init() &&
+   if ( wnd && COMBO_Init() &&
       (lphc = HeapAlloc(GetProcessHeap(), 0, sizeof(HEADCOMBO))) )
-  {
-       LPCREATESTRUCT32A     lpcs = (CREATESTRUCT32A*)lParam;
+   {
+	LPCREATESTRUCT32A     lpcs = (CREATESTRUCT32A*)lParam;
        
-       memset( lphc, 0, sizeof(HEADCOMBO) );
+	memset( lphc, 0, sizeof(HEADCOMBO) );
        *(LPHEADCOMBO*)wnd->wExtra = lphc;
 
        /* some braindead apps do try to use scrollbar/border flags */
 
-       lphc->dwStyle = (lpcs->style & ~(WS_BORDER | WS_HSCROLL | WS_VSCROLL));
-       wnd->dwStyle &= ~(WS_BORDER | WS_HSCROLL | WS_VSCROLL);
+	lphc->dwStyle = (lpcs->style & ~(WS_BORDER | WS_HSCROLL | WS_VSCROLL));
+	wnd->dwStyle &= ~(WS_BORDER | WS_HSCROLL | WS_VSCROLL);
 
-       if( !(lpcs->style & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) )
-             lphc->dwStyle |= CBS_HASSTRINGS;
+	if( !(lpcs->style & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) )
+              lphc->dwStyle |= CBS_HASSTRINGS;
+	if( !(wnd->dwExStyle & WS_EX_NOPARENTNOTIFY) )
+	      lphc->wState |= CBF_NOTIFY;
 
-       dprintf_combo(stddeb, "COMBO_NCCreate: [0x%08x], style = %08x\n", 
-				              (UINT32)lphc, lphc->dwStyle );
+	dprintf_combo(stddeb, "COMBO_NCCreate: [0x%08x], style = %08x\n", 
+						(UINT32)lphc, lphc->dwStyle );
 
-       return (LRESULT)(UINT32)wnd->hwndSelf; 
-  }
-  return (LRESULT)FALSE;
+	return (LRESULT)(UINT32)wnd->hwndSelf; 
+    }
+    return (LRESULT)FALSE;
 }
 
 /***********************************************************************
@@ -1239,7 +1241,8 @@
  *
  * http://www.microsoft.com/msdn/sdk/platforms/doc/sdk/win32/ctrl/src/combobox_15.htm
  */
-LRESULT ComboWndProc(HWND32 hwnd, UINT32 message, WPARAM32 wParam, LPARAM lParam)
+LRESULT WINAPI ComboWndProc( HWND32 hwnd, UINT32 message,
+                             WPARAM32 wParam, LPARAM lParam )
 {
     WND*	pWnd = WIN_FindWndPtr(hwnd);
    
diff --git a/controls/desktop.c b/controls/desktop.c
index 6708fb7..b1651f2 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -131,8 +131,8 @@
  *
  * Window procedure for the desktop window.
  */
-LRESULT DesktopWndProc( HWND32 hwnd, UINT32 message,
-                        WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI DesktopWndProc( HWND32 hwnd, UINT32 message,
+                               WPARAM32 wParam, LPARAM lParam )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     DESKTOPINFO *infoPtr = (DESKTOPINFO *)wndPtr->wExtra;
@@ -169,7 +169,7 @@
 /***********************************************************************
  *           SetDeskPattern   (USER.279)
  */
-BOOL16 SetDeskPattern(void)
+BOOL16 WINAPI SetDeskPattern(void)
 {
     char buffer[100];
     GetProfileString32A( "desktop", "Pattern", "(None)", buffer, 100 );
@@ -180,7 +180,7 @@
 /***********************************************************************
  *           SetDeskWallPaper16   (USER.285)
  */
-BOOL16 SetDeskWallPaper16( LPCSTR filename )
+BOOL16 WINAPI SetDeskWallPaper16( LPCSTR filename )
 {
     return SetDeskWallPaper32( filename );
 }
@@ -191,7 +191,7 @@
  *
  * FIXME: is there a unicode version?
  */
-BOOL32 SetDeskWallPaper32( LPCSTR filename )
+BOOL32 WINAPI SetDeskWallPaper32( LPCSTR filename )
 {
     HBITMAP32 hbitmap;
     HDC32 hdc;
diff --git a/controls/edit.c b/controls/edit.c
index 0a8a3d48..28373cd 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -148,7 +148,8 @@
 /*
  *	This is the only exported function
  */
-LRESULT EditWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam);
+LRESULT WINAPI EditWndProc( HWND32 hwnd, UINT32 msg,
+                            WPARAM32 wParam, LPARAM lParam );
 /*
  *	Helper functions only valid for one type of control
  */
@@ -297,7 +298,8 @@
  *	names).
  *
  */
-LRESULT EditWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+LRESULT WINAPI EditWndProc( HWND32 hwnd, UINT32 msg,
+                            WPARAM32 wParam, LPARAM lParam )
 {
 	WND *wnd = WIN_FindWndPtr(hwnd);
 	EDITSTATE *es = *(EDITSTATE **)((wnd)->wExtra);
diff --git a/controls/icontitle.c b/controls/icontitle.c
index 1864086..b54801e 100644
--- a/controls/icontitle.c
+++ b/controls/icontitle.c
@@ -185,7 +185,8 @@
 /***********************************************************************
  *           IconTitleWndProc
  */
-LRESULT IconTitleWndProc( HWND32 hWnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI IconTitleWndProc( HWND32 hWnd, UINT32 msg,
+                                 WPARAM32 wParam, LPARAM lParam )
 {
     WND *wnd = WIN_FindWndPtr( hWnd );
 
diff --git a/controls/listbox.c b/controls/listbox.c
index 71f56be..5466abe 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -233,7 +233,8 @@
     {
         INT32 diff = (descr->top_item - index) / descr->page_size * descr->column_width;
         if (scroll && (abs(diff) < descr->width))
-            ScrollWindow32( wnd->hwndSelf, diff, 0, NULL, NULL );
+            ScrollWindowEx32( wnd->hwndSelf, diff, 0, NULL, NULL, 0, NULL, 
+				SW_INVALIDATE | SW_ERASE );
         else
             scroll = FALSE;
     }
@@ -259,7 +260,8 @@
             diff = (descr->top_item - index) * descr->item_height;
 
         if (abs(diff) < descr->height)
-            ScrollWindow32( wnd->hwndSelf, 0, diff, NULL, NULL );
+            ScrollWindowEx32( wnd->hwndSelf, 0, diff, NULL, NULL, 0, NULL,
+					SW_INVALIDATE | SW_ERASE );
         else
             scroll = FALSE;
     }
@@ -1006,7 +1008,8 @@
     descr->horz_pos = pos;
     LISTBOX_UpdateScroll( wnd, descr );
     if (abs(diff) < descr->width)
-        ScrollWindow32( wnd->hwndSelf, diff, 0, NULL, NULL );
+        ScrollWindowEx32( wnd->hwndSelf, diff, 0, NULL, NULL, 0, NULL,
+			SW_INVALIDATE | SW_ERASE );
     else
         InvalidateRect32( wnd->hwndSelf, NULL, TRUE );
 }
@@ -2019,6 +2022,8 @@
 
     *(LB_DESCR **)wnd->wExtra = descr;
 
+/*    if (wnd->dwExStyle & WS_EX_NOPARENTNOTIFY) descr->style &= ~LBS_NOTIFY;
+ */
     if (descr->style & LBS_EXTENDEDSEL) descr->style |= LBS_MULTIPLESEL;
     if (descr->style & LBS_MULTICOLUMN) descr->style &= ~LBS_OWNERDRAWVARIABLE;
     if (descr->style & LBS_OWNERDRAWVARIABLE) descr->style |= LBS_NOINTEGRALHEIGHT;
@@ -2066,7 +2071,8 @@
 /***********************************************************************
  *           ListBoxWndProc
  */
-LRESULT ListBoxWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+LRESULT WINAPI ListBoxWndProc( HWND32 hwnd, UINT32 msg,
+                               WPARAM32 wParam, LPARAM lParam )
 {
     LRESULT ret;
     LB_DESCR *descr;
@@ -2491,7 +2497,8 @@
  *  NOTE: in Windows, winproc address of the ComboLBox is the same 
  *	  as that of the Listbox.
  */
-LRESULT ComboLBWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+LRESULT WINAPI ComboLBWndProc( HWND32 hwnd, UINT32 msg,
+                               WPARAM32 wParam, LPARAM lParam )
 {
     LRESULT lRet = 0;
     WND *wnd = WIN_FindWndPtr( hwnd );
diff --git a/controls/menu.c b/controls/menu.c
index 769084b..5a1e28c 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -51,26 +51,24 @@
 #define MM_SETMENUHANDLE	(WM_USER + 0)
 #define MM_GETMENUHANDLE	(WM_USER + 1)
 
-typedef struct
-{
-  HBITMAP32	hCheckBit;
-  HBITMAP32	hUnCheckBit;
-} CBITMAPS, *PCBITMAPS;
-
 /* Menu item structure */
-typedef struct
-{
-    UINT32      item_flags;    /* Item flags */
-    UINT32      item_id;       /* Item or popup id */
+typedef struct {
+    /* ----------- MENUITEMINFO Stuff ----------- */
+    UINT32 fType;		/* Item type. */
+    UINT32 fState;		/* Item state.  */
+    UINT32 wID;			/* Item id.  */
+    HMENU32 hSubMenu;		/* Pop-up menu.  */
+    HBITMAP32 hCheckBit;	/* Bitmap when checked.  */
+    HBITMAP32 hUnCheckBit;	/* Bitmap when unchecked.  */
+    LPSTR text;			/* Item text or bitmap handle.  */
+    DWORD dwItemData;		/* Application defined.  */
+    /* ----------- Wine stuff ----------- */
     RECT32      rect;          /* Item area (relative to menu window) */
     UINT32      xTab;          /* X position of text after Tab */
-    PCBITMAPS	pCB;	       /* checkmark bitmaps */
-    LPSTR       text;          /* Item text or bitmap handle */
 } MENUITEM;
 
 /* Popup menu structure */
-typedef struct
-{
+typedef struct {
     WORD        wFlags;       /* Menu flags (MF_POPUP, MF_SYSMENU) */
     WORD        wMagic;       /* Magic number */
     HQUEUE16    hTaskQ;       /* Task queue for this menu */
@@ -98,6 +96,7 @@
 } MTRACKER;
 
 #define MENU_MAGIC   0x554d  /* 'MU' */
+#define IS_A_MENU(pmenu) ((pmenu) && (pmenu)->wMagic == MENU_MAGIC)
 
 #define ITEM_PREV		-1
 #define ITEM_NEXT		 1
@@ -112,24 +111,33 @@
 #define POPUP_YSHADE		4
 
   /* Space between 2 menu bar items */
-int MENU_BAR_ITEMS_SPACE = 12;
+#define MENU_BAR_ITEMS_SPACE 12
 
   /* Minimum width of a tab character */
-int MENU_TAB_SPACE = 8;
+#define MENU_TAB_SPACE 8
 
   /* Height of a separator item */
-int SEPARATOR_HEIGHT = 5;
+#define SEPARATOR_HEIGHT 5
 
   /* (other menu->FocusedItem values give the position of the focused item) */
 #define NO_SELECTED_ITEM  0xffff
 
-#define IS_STRING_ITEM(flags) \
-    (!((flags) & (MF_BITMAP | MF_OWNERDRAW | MF_SEPARATOR)))
+#define MENU_ITEM_TYPE(flags) \
+  ((flags) & (MF_STRING | MF_BITMAP | MF_OWNERDRAW | MF_SEPARATOR))
+
+#define IS_STRING_ITEM(flags) (MENU_ITEM_TYPE ((flags)) == MF_STRING)
+
 #define IS_SYSTEM_MENU(menu)  \
 	(!((menu)->wFlags & MF_POPUP) && (menu)->wFlags & MF_SYSMENU)
 #define IS_SYSTEM_POPUP(menu) \
 	((menu)->wFlags & MF_POPUP && (menu)->wFlags & MF_SYSMENU)
 
+#define TYPE_MASK (MFT_STRING | MFT_BITMAP | MFT_OWNERDRAW | MFT_SEPARATOR | \
+		   MFT_MENUBARBREAK | MFT_MENUBREAK | MFT_RADIOCHECK | \
+		   MFT_RIGHTORDER | MFT_RIGHTJUSTIFY | \
+		   MF_POPUP | MF_SYSMENU | MF_HELP)
+#define STATE_MASK (~TYPE_MASK)
+
   /* Dimension of the menu bitmaps */
 static WORD check_bitmap_width = 0, check_bitmap_height = 0;
 static WORD arrow_bitmap_width = 0, arrow_bitmap_height = 0;
@@ -150,6 +158,92 @@
 
 
 /***********************************************************************
+ *           debug_print_menuitem
+ *
+ * Print a menuitem in readable form.
+ */
+
+#define MENUOUT(text) \
+  dprintf_menu (stddeb, "%s%s", (count++ ? "," : ""), (text))
+
+#define MENUFLAG(bit,text) \
+  do { \
+    if (flags & (bit)) { flags &= ~(bit); MENUOUT ((text)); } \
+  } while (0)
+
+static void debug_print_menuitem(const char *prefix, MENUITEM * mp, const char *postfix)
+{
+    dprintf_menu(stddeb, "%s", prefix);
+    if (mp) {
+	UINT32 flags = mp->fType;
+	int typ = MENU_ITEM_TYPE(flags);
+	dprintf_menu(stddeb, "{ ID=0x%x", mp->wID);
+	if (flags & MF_POPUP)
+	    dprintf_menu(stddeb, ", Sub=0x%x", mp->hSubMenu);
+	if (flags) {
+	    int count = 0;
+	    dprintf_menu(stddeb, ", Typ=");
+	    if (typ == MFT_STRING)
+		/* Nothing */ ;
+	    else if (typ == MFT_SEPARATOR)
+		MENUOUT("sep");
+	    else if (typ == MFT_OWNERDRAW)
+		MENUOUT("own");
+	    else if (typ == MFT_BITMAP)
+		MENUOUT("bit");
+	    else
+		MENUOUT("???");
+	    flags -= typ;
+
+	    MENUFLAG(MF_POPUP, "pop");
+	    MENUFLAG(MFT_MENUBARBREAK, "barbrk");
+	    MENUFLAG(MFT_MENUBREAK, "brk");
+	    MENUFLAG(MFT_RADIOCHECK, "radio");
+	    MENUFLAG(MFT_RIGHTORDER, "rorder");
+	    MENUFLAG(MF_SYSMENU, "sys");
+	    MENUFLAG(MFT_RIGHTJUSTIFY, "right");
+
+	    if (flags)
+		dprintf_menu(stddeb, "+0x%x", flags);
+	}
+	flags = mp->fState;
+	if (flags) {
+	    int count = 0;
+	    dprintf_menu(stddeb, ", State=");
+	    MENUFLAG(MFS_GRAYED, "grey");
+	    MENUFLAG(MFS_DISABLED, "dis");
+	    MENUFLAG(MFS_CHECKED, "check");
+	    MENUFLAG(MFS_HILITE, "hi");
+	    MENUFLAG(MF_USECHECKBITMAPS, "usebit");
+	    MENUFLAG(MF_MOUSESELECT, "mouse");
+	    if (flags)
+		dprintf_menu(stddeb, "+0x%x", flags);
+	}
+	if (mp->hCheckBit)
+	    dprintf_menu(stddeb, ", Chk=0x%x", mp->hCheckBit);
+	if (mp->hUnCheckBit)
+	    dprintf_menu(stddeb, ", Unc=0x%x", mp->hUnCheckBit);
+
+	if (typ == MFT_STRING) {
+	    if (mp->text)
+		dprintf_menu(stddeb, ", Text=\"%s\"", mp->text);
+	    else
+		dprintf_menu(stddeb, ", Text=Null");
+	} else if (mp->text == NULL)
+	    /* Nothing */ ;
+	else
+	    dprintf_menu(stddeb, ", Text=%p", mp->text);
+	dprintf_menu(stddeb, " }");
+    } else {
+	dprintf_menu(stddeb, "NULL");
+    }
+    dprintf_menu(stddeb, "%s", postfix);
+}
+
+#undef MENUOUT
+#undef MENUFLAG
+
+/***********************************************************************
  *           MENU_CopySysPopup
  *
  * Return the default system menu.
@@ -167,7 +261,7 @@
 	fprintf( stderr, "Unable to load default system menu\n" );
     }
 
-    dprintf_menu( stddeb, "MENU_CopySysPopup: returning %d.\n", hMenu );
+    dprintf_menu( stddeb, "MENU_CopySysPopup: returning %x.\n", hMenu );
 
     return hMenu;
 }
@@ -200,7 +294,8 @@
 	{
 	    InsertMenu32A( hMenu, -1, MF_SYSMENU | MF_POPUP | MF_BYPOSITION, hPopupMenu, NULL );
 
-	    menu->items[0].item_flags = MF_SYSMENU | MF_POPUP;
+            menu->items[0].fType = MF_SYSMENU | MF_POPUP;
+            menu->items[0].fState = 0;
 	    menu = (POPUPMENU*) USER_HEAP_LIN_ADDR(hPopupMenu);
 	    menu->wFlags |= MF_SYSMENU;
 
@@ -260,7 +355,7 @@
  *
  * Grey the appropriate items in System menu.
  */
-void MENU_InitSysMenuPopup( HMENU32 hmenu, DWORD style, DWORD clsStyle )
+static void MENU_InitSysMenuPopup( HMENU32 hmenu, DWORD style, DWORD clsStyle )
 {
     BOOL32 gray;
 
@@ -299,7 +394,7 @@
 	return i;
 
     for( ; i < menu->nItems; ++i ) {
-	if( menu->items[i].item_flags & MF_MENUBARBREAK )
+	if (menu->items[i].fType & MF_MENUBARBREAK)
 	    return i;
     }
 
@@ -329,14 +424,14 @@
     /* Find the start of the column */
 
     for(i = menu->FocusedItem; i != 0 &&
-	    !(menu->items[i].item_flags & MF_MENUBARBREAK);
+	 !(menu->items[i].fType & MF_MENUBARBREAK);
 	--i); /* empty */
 
     if(i == 0)
 	return NO_SELECTED_ITEM;
 
     for(--i; i != 0; --i) {
-	if(menu->items[i].item_flags & MF_MENUBARBREAK)
+	if (menu->items[i].fType & MF_MENUBARBREAK)
 	    break;
     }
 
@@ -369,14 +464,14 @@
         MENUITEM *item = menu->items;
 	for (i = 0; i < menu->nItems; i++, item++)
 	{
-	    if (item->item_id == *nPos)
+	    if (item->wID == *nPos)
 	    {
 		*nPos = i;
 		return item;
 	    }
-	    else if (item->item_flags & MF_POPUP)
+	    else if (item->fType & MF_POPUP)
 	    {
-		HMENU32 hsubmenu = (HMENU32)item->item_id;
+		HMENU32 hsubmenu = item->hSubMenu;
 		MENUITEM *subitem = MENU_FindItem( &hsubmenu, nPos, wFlags );
 		if (subitem)
 		{
@@ -395,13 +490,8 @@
 static void MENU_FreeItemData( MENUITEM* item )
 {
     /* delete text */
-
-    if (IS_STRING_ITEM(item->item_flags) && item->text)
+    if (IS_STRING_ITEM(item->fType) && item->text)
         HeapFree( SystemHeap, 0, item->text );
-
-    /* delete checkmark stuff */
-
-    if (item->pCB) HeapFree( SystemHeap, 0, item->pCB );
 }
 
 /***********************************************************************
@@ -465,7 +555,7 @@
 	     key = toupper(key);
 	     for (i = 0; i < menu->nItems; i++, item++)
 	     {
-		if (IS_STRING_ITEM(item->item_flags))
+		if (IS_STRING_ITEM(item->fType))
 		{
 		    char *p = strchr( item->text, '&' );
 		    if (p && (p[1] != '&') && (toupper(p[1]) == key)) return i;
@@ -492,29 +582,29 @@
     DWORD dwSize;
     char *p;
 
-    dprintf_menu( stddeb, "MENU_CalcItemSize: HDC %p, item '%s', at "
-		  "(%d, %d) %s\n", (void *)hdc, lpitem->text, orgX, orgY,
-		  menuBar ? "(MenuBar)" : "" );
+    dprintf_menu(stddeb, "MENU_CalcItemSize: HDC 0x%x at (%d,%d): ",
+                 hdc, orgX, orgY);
+    debug_print_menuitem("", lpitem, (menuBar ? " (MenuBar)\n" : "\n"));
 
     SetRect32( &lpitem->rect, orgX, orgY, orgX, orgY );
 
-    if (lpitem->item_flags & MF_OWNERDRAW)
+    if (lpitem->fType & MF_OWNERDRAW)
     {
         MEASUREITEMSTRUCT32 mis;
         mis.CtlType    = ODT_MENU;
-        mis.itemID     = lpitem->item_id;
+        mis.itemID     = lpitem->wID;
         mis.itemData   = (DWORD)lpitem->text;
         mis.itemHeight = 16;
         mis.itemWidth  = 30;
         SendMessage32A( hwndOwner, WM_MEASUREITEM, 0, (LPARAM)&mis );
         lpitem->rect.bottom += mis.itemHeight;
         lpitem->rect.right  += mis.itemWidth;
-        dprintf_menu( stddeb, "DrawMenuItem: MeasureItem %04x %dx%d!\n",
-                      lpitem->item_id, mis.itemWidth, mis.itemHeight );
+        dprintf_menu(stddeb, "MENU_CalcItemSize: %08x %dx%d\n",
+                     lpitem->wID, mis.itemWidth, mis.itemHeight);
         return;
     } 
 
-    if (lpitem->item_flags & MF_SEPARATOR)
+    if (lpitem->fType & MF_SEPARATOR)
     {
 	lpitem->rect.bottom += SEPARATOR_HEIGHT;
 	return;
@@ -523,11 +613,11 @@
     if (!menuBar)
     {
 	lpitem->rect.right += 2 * check_bitmap_width;
-	if (lpitem->item_flags & MF_POPUP)
+	if (lpitem->fType & MF_POPUP)
 	    lpitem->rect.right += arrow_bitmap_width;
     }
 
-    if (lpitem->item_flags & MF_BITMAP)
+    if (lpitem->fType & MF_BITMAP)
     {
 	BITMAP32 bm;
         if (GetObject32A( (HBITMAP32)lpitem->text, sizeof(bm), &bm ))
@@ -540,7 +630,7 @@
     
     /* If we get here, then it must be a text item */
 
-    if (IS_STRING_ITEM( lpitem->item_flags ))
+    if (IS_STRING_ITEM( lpitem->fType ))
     {
         dwSize = GetTextExtent( hdc, lpitem->text, strlen(lpitem->text) );
         lpitem->rect.right  += LOWORD(dwSize);
@@ -595,19 +685,16 @@
 	for (i = start; i < lppop->nItems; i++, lpitem++)
 	{
 	    if ((i != start) &&
-		(lpitem->item_flags & (MF_MENUBREAK | MF_MENUBARBREAK))) break;
+		(lpitem->fType & (MF_MENUBREAK | MF_MENUBARBREAK))) break;
 
-	    dprintf_menu( stddeb, "MENU_PopupMenuCalcSize: calling "
-			  "MENU_CalcItemSize on '%s', org=(%d, %d)\n",
-			  lpitem->text, orgX, orgY );
 	    if(TWEAK_Win95Look)
 		++orgY;
 
 	    MENU_CalcItemSize( hdc, lpitem, hwndOwner, orgX, orgY, FALSE );
-            if (lpitem->item_flags & MF_MENUBARBREAK) orgX++;
+            if (lpitem->fType & MF_MENUBARBREAK) orgX++;
 	    maxX = MAX( maxX, lpitem->rect.right );
 	    orgY = lpitem->rect.bottom;
-	    if (IS_STRING_ITEM(lpitem->item_flags) && lpitem->xTab)
+	    if (IS_STRING_ITEM(lpitem->fType) && lpitem->xTab)
 	    {
 		maxTab = MAX( maxTab, lpitem->xTab );
 		maxTabWidth = MAX(maxTabWidth,lpitem->rect.right-lpitem->xTab);
@@ -619,7 +706,7 @@
 	for (lpitem = &lppop->items[start]; start < i; start++, lpitem++)
 	{
 	    lpitem->rect.right = maxX;
-	    if (IS_STRING_ITEM(lpitem->item_flags) && lpitem->xTab)
+	    if (IS_STRING_ITEM(lpitem->fType) && lpitem->xTab)
                 lpitem->xTab = maxTab;
 	}
 	lppop->Height = MAX( lppop->Height, orgY );
@@ -663,9 +750,9 @@
 	  /* Parse items until line break or end of menu */
 	for (i = start; i < lppop->nItems; i++, lpitem++)
 	{
-	    if ((helpPos == -1) && (lpitem->item_flags & MF_HELP)) helpPos = i;
+	    if ((helpPos == -1) && (lpitem->fType & MF_HELP)) helpPos = i;
 	    if ((i != start) &&
-		(lpitem->item_flags & (MF_MENUBREAK | MF_MENUBARBREAK))) break;
+		(lpitem->fType & (MF_MENUBREAK | MF_MENUBARBREAK))) break;
 
 
 	    dprintf_menu( stddeb, "MENU_MenuBarCalcSize: calling "
@@ -716,34 +803,36 @@
 {
     RECT32 rect;
 
-    if (lpitem->item_flags & MF_SYSMENU)
+    debug_print_menuitem("MENU_DrawMenuItem: ", lpitem, "\n");
+
+    if (lpitem->fType & MF_SYSMENU)
     {
 	if( !IsIconic32(hwnd) ) {
 	    if(TWEAK_Win95Look)
 		NC_DrawSysButton95( hwnd, hdc,
-				    lpitem->item_flags &
+				    lpitem->fState &
 				    (MF_HILITE | MF_MOUSESELECT) );
 	    else
 		NC_DrawSysButton( hwnd, hdc, 
-				  lpitem->item_flags &
+				  lpitem->fState &
 				  (MF_HILITE | MF_MOUSESELECT) );
 	}
 
 	return;
     }
 
-    if (lpitem->item_flags & MF_OWNERDRAW)
+    if (lpitem->fType & MF_OWNERDRAW)
     {
         DRAWITEMSTRUCT32 dis;
 
         dprintf_menu( stddeb, "DrawMenuItem: Ownerdraw!\n" );
         dis.CtlType   = ODT_MENU;
-        dis.itemID    = lpitem->item_id;
+        dis.itemID    = lpitem->wID;
         dis.itemData  = (DWORD)lpitem->text;
         dis.itemState = 0;
-        if (lpitem->item_flags & MF_CHECKED) dis.itemState |= ODS_CHECKED;
-        if (lpitem->item_flags & MF_GRAYED)  dis.itemState |= ODS_GRAYED;
-        if (lpitem->item_flags & MF_HILITE)  dis.itemState |= ODS_SELECTED;
+        if (lpitem->fState & MF_CHECKED) dis.itemState |= ODS_CHECKED;
+        if (lpitem->fState & MF_GRAYED)  dis.itemState |= ODS_GRAYED;
+        if (lpitem->fState & MF_HILITE)  dis.itemState |= ODS_SELECTED;
         dis.itemAction = ODA_DRAWENTIRE | ODA_SELECT | ODA_FOCUS;
         dis.hwndItem   = hwnd;
         dis.hDC        = hdc;
@@ -752,7 +841,7 @@
         return;
     }
 
-    if (menuBar && (lpitem->item_flags & MF_SEPARATOR)) return;
+    if (menuBar && (lpitem->fType & MF_SEPARATOR)) return;
     rect = lpitem->rect;
 
     /* Draw the background */
@@ -770,7 +859,7 @@
 	*/
     }
 
-    if (lpitem->item_flags & MF_HILITE) {
+    if (lpitem->fState & MF_HILITE) {
 	RECT32  r = rect;
 	r.top += MENU_HighlightTopNudge;
 	r.bottom += MENU_HighlightBottomNudge;
@@ -791,7 +880,7 @@
 
       /* Draw the separator bar (if any) */
 
-    if (!menuBar && (lpitem->item_flags & MF_MENUBARBREAK))
+    if (!menuBar && (lpitem->fType & MF_MENUBARBREAK))
     {
 	if(TWEAK_Win95Look)
 	    TWEAK_DrawMenuSeparatorVert95(hdc, rect.left - 1, 3, height - 3);
@@ -801,7 +890,7 @@
 	    LineTo32( hdc, rect.left, height );
 	}
     }
-    if (lpitem->item_flags & MF_SEPARATOR)
+    if (lpitem->fType & MF_SEPARATOR)
     {
 	if(TWEAK_Win95Look)
 	    TWEAK_DrawMenuSeparatorHoriz95(hdc, rect.left + 1,
@@ -818,9 +907,9 @@
 
       /* Setup colors */
 
-    if (lpitem->item_flags & MF_HILITE)
+    if (lpitem->fState & MF_HILITE)
     {
-	if (lpitem->item_flags & MF_GRAYED)
+	if (lpitem->fState & MF_GRAYED)
 	    SetTextColor32( hdc, GetSysColor32( COLOR_GRAYTEXT ) );
 	else
 	    SetTextColor32( hdc, GetSysColor32( COLOR_HIGHLIGHTTEXT ) );
@@ -828,7 +917,7 @@
     }
     else
     {
-	if (lpitem->item_flags & MF_GRAYED)
+	if (lpitem->fState & MF_GRAYED)
 	    SetTextColor32( hdc, GetSysColor32( COLOR_GRAYTEXT ) );
 	else
 	    SetTextColor32( hdc, GetSysColor32( COLOR_MENUTEXT ) );
@@ -846,18 +935,18 @@
 	   * is 1 for a white pixel and 0 for a black one. 
 	   */
 
-	if (lpitem->item_flags & MF_CHECKED)
-            GRAPH_DrawBitmap( hdc, lpitem->pCB ? lpitem->pCB->hCheckBit
+	if (lpitem->fState & MF_CHECKED)
+            GRAPH_DrawBitmap( hdc, lpitem->hCheckBit ? lpitem->hCheckBit
 			      : hStdCheck, rect.left, (y - check_bitmap_height) / 2, 
 			      0, 0, check_bitmap_width, check_bitmap_height, TRUE );
-	else if (lpitem->pCB)
-	    GRAPH_DrawBitmap( hdc, lpitem->pCB->hUnCheckBit, rect.left, 
+        else if (lpitem->hUnCheckBit)
+            GRAPH_DrawBitmap( hdc, lpitem->hUnCheckBit, rect.left,
 			      (y - check_bitmap_height) / 2, 0, 0,
 			      check_bitmap_width, check_bitmap_height, TRUE );
 
 	  /* Draw the popup-menu arrow */
 
-	if (lpitem->item_flags & MF_POPUP)
+	if (lpitem->fType & MF_POPUP)
 	{
 	    GRAPH_DrawBitmap( hdc, hStdMnArrow,
 			      rect.right-arrow_bitmap_width-1,
@@ -871,7 +960,7 @@
 
       /* Draw the item text or bitmap */
 
-    if (lpitem->item_flags & MF_BITMAP)
+    if (lpitem->fType & MF_BITMAP)
     {
 	GRAPH_DrawBitmap( hdc, (HBITMAP32)lpitem->text,
                           rect.left, rect.top, 0, 0,
@@ -879,7 +968,7 @@
 	return;
     }
     /* No bitmap - process text if present */
-    else if (IS_STRING_ITEM(lpitem->item_flags))
+    else if (IS_STRING_ITEM(lpitem->fType))
     {
 	register int i;
 
@@ -902,12 +991,13 @@
 	    rect.left += MENU_ItemLeftNudge;
 	}
 
-	if(!TWEAK_Win95Look || !(lpitem->item_flags & MF_GRAYED)) {
+	if(!TWEAK_Win95Look || !(lpitem->fState & MF_GRAYED)) {
 	    DrawText32A( hdc, lpitem->text, i, &rect,
 			 DT_LEFT | DT_VCENTER | DT_SINGLELINE );
 	}
 	else {
-	    if (!(lpitem->item_flags & MF_HILITE)) {
+	    if (!(lpitem->fState & MF_HILITE))
+            {
 		++rect.left;
 		++rect.top;
 		++rect.right;
@@ -1119,7 +1209,7 @@
     if (!(menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu ))) return FALSE;
     if (menu->FocusedItem != NO_SELECTED_ITEM)
     {
-	menu->items[menu->FocusedItem].item_flags &= ~(MF_HILITE|MF_MOUSESELECT);
+	menu->items[menu->FocusedItem].fState &= ~(MF_HILITE|MF_MOUSESELECT);
 	menu->FocusedItem = NO_SELECTED_ITEM;
     }
 
@@ -1220,7 +1310,7 @@
     if (!lppop->nItems) return;
 
     if ((wIndex != NO_SELECTED_ITEM) && 
-	(lppop->items[wIndex].item_flags & MF_SEPARATOR))
+	(lppop->items[wIndex].fType & MF_SEPARATOR))
 	wIndex = NO_SELECTED_ITEM;
 
     if (lppop->FocusedItem == wIndex) return;
@@ -1230,7 +1320,7 @@
       /* Clear previous highlighted item */
     if (lppop->FocusedItem != NO_SELECTED_ITEM) 
     {
-	lppop->items[lppop->FocusedItem].item_flags &=~(MF_HILITE|MF_MOUSESELECT);
+	lppop->items[lppop->FocusedItem].fState &= ~(MF_HILITE|MF_MOUSESELECT);
 	MENU_DrawMenuItem(lppop->hWnd,hdc,&lppop->items[lppop->FocusedItem],
                           lppop->Height, !(lppop->wFlags & MF_POPUP) );
     }
@@ -1239,13 +1329,16 @@
     lppop->FocusedItem = wIndex;
     if (lppop->FocusedItem != NO_SELECTED_ITEM) 
     {
-	lppop->items[lppop->FocusedItem].item_flags |= MF_HILITE;
+	lppop->items[lppop->FocusedItem].fState |= MF_HILITE;
 	MENU_DrawMenuItem( lppop->hWnd, hdc, &lppop->items[lppop->FocusedItem],
                            lppop->Height, !(lppop->wFlags & MF_POPUP) );
         if (sendMenuSelect)
-	    SendMessage16( hwndOwner, WM_MENUSELECT,
-                           lppop->items[lppop->FocusedItem].item_id,
-                           MAKELONG( lppop->items[lppop->FocusedItem].item_flags | MF_MOUSESELECT, hmenu));
+        {
+            MENUITEM *ip = &lppop->items[lppop->FocusedItem];
+	    SendMessage16( hwndOwner, WM_MENUSELECT, ip->wID,
+                           MAKELONG(ip->fType | (ip->fState | MF_MOUSESELECT),
+                                    hmenu) );
+        }
     }
     else if (sendMenuSelect)
         SendMessage16( hwndOwner, WM_MENUSELECT, hmenu,
@@ -1275,7 +1368,7 @@
 	if( menu->nItems == 1 ) return; else
 	for (i = menu->FocusedItem + offset ; i >= 0 && i < menu->nItems 
 					    ; i += offset)
-	    if (!(menu->items[i].item_flags & MF_SEPARATOR))
+	    if (!(menu->items[i].fType & MF_SEPARATOR))
 	    {
 		MENU_SelectItem( hwndOwner, hmenu, i, TRUE );
 		return;
@@ -1284,7 +1377,7 @@
 
     for ( i = (offset > 0) ? 0 : menu->nItems - 1; 
 		  i >= 0 && i < menu->nItems ; i += offset)
-	if (!(menu->items[i].item_flags & MF_SEPARATOR))
+	if (!(menu->items[i].fType & MF_SEPARATOR))
 	{
 	    MENU_SelectItem( hwndOwner, hmenu, i, TRUE );
 	    return;
@@ -1301,11 +1394,9 @@
 static BOOL32 MENU_SetItemData( MENUITEM *item, UINT32 flags, UINT32 id,
                                 LPCSTR str )
 {
-    LPSTR prevText = IS_STRING_ITEM(item->item_flags) ? item->text : NULL;
+    LPSTR prevText = IS_STRING_ITEM(item->fType) ? item->text : NULL;
 
-    dprintf_menu(stddeb,"SetItemData: %04x [%08x] '%s'  -> %04x [%08x] '%s'\n",
-		 item->item_flags, item->item_id, prevText ? prevText : "",
-		 flags, id, (IS_STRING_ITEM(flags) && str) ? str : "" );
+    debug_print_menuitem("MENU_SetItemData from: ", item, "\n");
 
     if (IS_STRING_ITEM(flags))
     {
@@ -1331,22 +1422,32 @@
     else if (flags & MF_OWNERDRAW) item->text = (LPSTR)str;
     else item->text = NULL;
 
-    if (item->item_flags & MF_POPUP && item->item_id != id )
-	DestroyMenu32( (HMENU32)item->item_id );   /* ModifyMenu() spec */
+    if (item->fType & MF_POPUP && item->hSubMenu != id )
+	DestroyMenu32( item->hSubMenu );   /* ModifyMenu() spec */
 
     if (flags & MF_POPUP)
     {
-	POPUPMENU*	menu = (POPUPMENU *)USER_HEAP_LIN_ADDR((UINT16)id);
-	if( menu && menu->wMagic == MENU_MAGIC) menu->wFlags |= MF_POPUP;
+	POPUPMENU *menu = (POPUPMENU *)USER_HEAP_LIN_ADDR((UINT16)id);
+        if (IS_A_MENU(menu)) menu->wFlags |= MF_POPUP;
 	else
-	    return (item->item_id = item->item_flags = FALSE);
+        {
+            item->wID = 0;
+            item->hSubMenu = 0;
+            item->fType = 0;
+            item->fState = 0;
+	    return FALSE;
+        }
     }
 
-    item->item_flags = flags & ~(MF_HILITE | MF_MOUSESELECT);
-    item->item_id    = id;
+    item->fType = flags & TYPE_MASK;
+    item->fState = (flags & STATE_MASK) &
+        ~(MF_HILITE | MF_MOUSESELECT | MF_BYPOSITION);
+    item->wID = item->hSubMenu = id;
 
     SetRectEmpty32( &item->rect );
     if (prevText) HeapFree( SystemHeap, 0, prevText );
+
+    debug_print_menuitem("MENU_SetItemData to  : ", item, "\n");
     return TRUE;
 }
 
@@ -1470,55 +1571,50 @@
  */
 static LPCSTR MENUEX_ParseResource( LPCSTR res, HMENU32 hMenu)
 {
-    DWORD flags;
-    DWORD state;
-    DWORD id;
-    LPCWSTR str;
     WORD resinfo;
+    do {
+	MENUITEMINFO32W mii;
 
-    do
-    {
-        /* printf ("%p:", res); */
-
-        flags = GET_DWORD(res);
+	mii.cbSize = sizeof(mii);
+	mii.fMask = MIIM_STATE | MIIM_ID | MIIM_TYPE;
+	mii.fType = GET_DWORD(res);
         res += sizeof(DWORD);
-        state = GET_DWORD(res);
+	mii.fState = GET_DWORD(res);
         res += sizeof(DWORD);
-        id = GET_DWORD(res);
+	mii.wID = GET_DWORD(res);
         res += sizeof(DWORD);
 	resinfo = GET_WORD(res); /* FIXME: for 16-bit apps this is a byte.  */
         res += sizeof(WORD);
 	/* Align the text on a word boundary.  */
 	res += (~((int)res - 1)) & 1;
-        str = (LPCWSTR)res;
-        res += (1 + lstrlen32W (str)) * sizeof(WCHAR);
+	mii.dwTypeData = (LPWSTR) res;
+	res += (1 + lstrlen32W(mii.dwTypeData)) * sizeof(WCHAR);
 	/* Align the following fields on a dword boundary.  */
 	res += (~((int)res - 1)) & 3;
 
         /* FIXME: This is inefficient and cannot be optimised away by gcc.  */
 	{
-	  LPSTR newstr = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
-	  dprintf_menu (stddeb, "Menu item: [%08lx,%08lx,%04lx,%04x,%s]\n",
-			flags, state, id, resinfo, newstr);
+	    LPSTR newstr = HEAP_strdupWtoA(GetProcessHeap(),
+					   0, mii.dwTypeData);
+	    dprintf_menu(stddeb, "Menu item: [%08x,%08x,%04x,%04x,%s]\n",
+			 mii.fType, mii.fState, mii.wID, resinfo, newstr);
 	  HeapFree( GetProcessHeap(), 0, newstr );
 	}
 
-        if (resinfo & 1) /* Pop-up? */
-        {
+	if (resinfo & 1) {	/* Pop-up? */
 	    DWORD helpid = GET_DWORD(res); /* FIXME: use this.  */
-            HMENU32 hSubMenu = CreatePopupMenu32();
 	    res += sizeof(DWORD);
-            if (!hSubMenu) return NULL;
-            if (!(res = MENUEX_ParseResource( res, hSubMenu)))
+	    mii.hSubMenu = CreatePopupMenu32();
+	    if (!mii.hSubMenu)
+		return NULL;
+	    if (!(res = MENUEX_ParseResource(res, mii.hSubMenu))) {
+		DestroyMenu32(mii.hSubMenu);
                 return NULL;
-            AppendMenu32W( hMenu, flags | MF_POPUP /* HACK!  FIXME */,
-			   (UINT32)hSubMenu, (LPCWSTR)str );
         }
-        else  /* Not a popup */
-        {
-	  AppendMenu32W( hMenu, flags, id,
-			 *(LPCWSTR)str ? (LPCWSTR)str : NULL );
+	    mii.fMask |= MIIM_SUBMENU;
+	    mii.fType |= MF_POPUP;
         }
+	InsertMenuItem32W(hMenu, -1, MF_BYPOSITION, &mii);
     } while (!(resinfo & MF_END));
     return res;
 }
@@ -1539,9 +1635,8 @@
     if (menu->FocusedItem == NO_SELECTED_ITEM) return 0;
 
     item = &menu->items[menu->FocusedItem];
-    if ((item->item_flags & (MF_POPUP | MF_MOUSESELECT))
-			 == (MF_POPUP | MF_MOUSESELECT))
-	return (HMENU32)item->item_id;
+    if ((item->fType & MF_POPUP) && (item->fState & MF_MOUSESELECT))
+        return item->hSubMenu;
     return 0;
 }
 
@@ -1565,10 +1660,10 @@
 	if (menu->FocusedItem != NO_SELECTED_ITEM)
 	{
 	    item = &menu->items[menu->FocusedItem];
-	    if (!(item->item_flags & MF_POPUP) ||
-		!(item->item_flags & MF_MOUSESELECT)) return;
-	    item->item_flags &= ~MF_MOUSESELECT;
-	    hsubmenu = (HMENU32)item->item_id;
+	    if (!(item->fType & MF_POPUP) ||
+		!(item->fState & MF_MOUSESELECT)) return;
+	    item->fState &= ~MF_MOUSESELECT;
+	    hsubmenu = item->hSubMenu;
 	} else return;
 
 	submenu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hsubmenu );
@@ -1609,17 +1704,18 @@
          (menu->FocusedItem == NO_SELECTED_ITEM)) return hmenu;
 
     item = &menu->items[menu->FocusedItem];
-    if (!(item->item_flags & MF_POPUP) ||
-         (item->item_flags & (MF_GRAYED | MF_DISABLED))) return hmenu;
-    item->item_flags |= MF_MOUSESELECT;
+    if (!(item->fType & MF_POPUP) ||
+         (item->fState & (MF_GRAYED | MF_DISABLED))) return hmenu;
+    item->fState |= MF_MOUSESELECT;
 
     if (IS_SYSTEM_MENU(menu))
     {
-	MENU_InitSysMenuPopup((HMENU16)item->item_id, wndPtr->dwStyle, wndPtr->class->style);
+	MENU_InitSysMenuPopup(item->hSubMenu, wndPtr->dwStyle, wndPtr->class->style);
 
 	NC_GetSysPopupPos( wndPtr, &rect );
 	rect.top = rect.bottom;
-	rect.right = SYSMETRICS_CXSIZE; rect.bottom = SYSMETRICS_CYSIZE;
+	rect.right = SYSMETRICS_CXSIZE;
+        rect.bottom = SYSMETRICS_CYSIZE;
     }
     else
     {
@@ -1639,11 +1735,11 @@
 	}
     }
 
-    MENU_ShowPopup( hwndOwner, (HMENU16)item->item_id, menu->FocusedItem,
+    MENU_ShowPopup( hwndOwner, item->hSubMenu, menu->FocusedItem,
 		    rect.left, rect.top, rect.right, rect.bottom );
     if (selectFirst)
-        MENU_MoveSelection( hwndOwner, (HMENU32)item->item_id, ITEM_NEXT );
-    return (HMENU32)item->item_id;
+        MENU_MoveSelection( hwndOwner, item->hSubMenu, ITEM_NEXT );
+    return item->hSubMenu;
 }
 
 /***********************************************************************
@@ -1656,12 +1752,11 @@
    POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hMenu );
    register UINT32 ht = menu->FocusedItem;
 
-#define HAS_POPUP(item)	(((item).item_flags & (MF_POPUP | MF_MOUSESELECT)) \
-			== (MF_POPUP | MF_MOUSESELECT))
    /* try subpopup first (if any) */
-   ht = (ht != NO_SELECTED_ITEM && HAS_POPUP(menu->items[ht]))
-	? (UINT32)MENU_PtMenu( menu->items[ht].item_id, pt ) : 0;
-#undef HAS_POPUP
+    ht = (ht != NO_SELECTED_ITEM &&
+          (menu->items[ht].fType & MF_POPUP) &&
+          (menu->items[ht].fState & MF_MOUSESELECT))
+        ? (UINT32) MENU_PtMenu(menu->items[ht].hSubMenu, pt) : 0;
 
    if( !ht )	/* check the current window (avoiding WM_HITTEST) */
    {
@@ -1694,18 +1789,21 @@
 	(menu->FocusedItem == NO_SELECTED_ITEM)) return TRUE;
 
     item = &menu->items[menu->FocusedItem];
-    if (!(item->item_flags & MF_POPUP))
+
+    dprintf_menu(stddeb, "MENU_ExecFocusedItem: %08x %08x %08x\n",
+                 hMenu, item->wID, item->hSubMenu);
+
+    if (!(item->fType & MF_POPUP))
     {
-	if (!(item->item_flags & (MF_GRAYED | MF_DISABLED)))
+	if (!(item->fState & (MF_GRAYED | MF_DISABLED)))
 	{
 	    if( menu->wFlags & MF_SYSMENU )
 	    {
-		PostMessage16( pmt->hOwnerWnd, WM_SYSCOMMAND, item->item_id,
+		PostMessage16( pmt->hOwnerWnd, WM_SYSCOMMAND, item->hSubMenu,
 			       MAKELPARAM((INT16)pmt->pt.x, (INT16)pmt->pt.y) );
 	    }
 	    else
-		PostMessage16( pmt->hOwnerWnd, WM_COMMAND,
-					item->item_id, 0 );
+		PostMessage16( pmt->hOwnerWnd, WM_COMMAND, item->wID, 0 );
 	    return FALSE;
 	}
 	else return TRUE;
@@ -1765,9 +1863,9 @@
 	    if( ptmenu->FocusedItem == id )
 	    {
 		/* nothing to do with already selected non-popup */
-		if( !(item->item_flags & MF_POPUP) ) return TRUE;
+		if( !(item->fType & MF_POPUP) ) return TRUE;
 
-	        if( item->item_flags & MF_MOUSESELECT )
+	        if( item->fState & MF_MOUSESELECT )
 		{
 		    if( ptmenu->wFlags & MF_POPUP )
 		    {
@@ -1812,9 +1910,9 @@
 
 	if( ptmenu->FocusedItem == id )
 	{
-	    if( !(item->item_flags & MF_POPUP) )
+	    if( !(item->fType & MF_POPUP) )
 		return MENU_ExecFocusedItem( pmt, hPtMenu );
-	    hPtMenu = (HMENU32)item->item_id;
+	    hPtMenu = item->hSubMenu;
 	    if( hPtMenu == pmt->hCurrentMenu )
 	    {
 	        /* Select first item of sub-popup */    
@@ -2390,8 +2488,8 @@
 /**********************************************************************
  *           TrackPopupMenu16   (USER.416)
  */
-BOOL16 TrackPopupMenu16( HMENU16 hMenu, UINT16 wFlags, INT16 x, INT16 y,
-                         INT16 nReserved, HWND16 hWnd, const RECT16 *lpRect )
+BOOL16 WINAPI TrackPopupMenu16( HMENU16 hMenu, UINT16 wFlags, INT16 x, INT16 y,
+                           INT16 nReserved, HWND16 hWnd, const RECT16 *lpRect )
 {
     RECT32 r;
     if (lpRect)
@@ -2404,8 +2502,8 @@
 /**********************************************************************
  *           TrackPopupMenu32   (USER32.548)
  */
-BOOL32 TrackPopupMenu32( HMENU32 hMenu, UINT32 wFlags, INT32 x, INT32 y,
-                         INT32 nReserved, HWND32 hWnd, const RECT32 *lpRect )
+BOOL32 WINAPI TrackPopupMenu32( HMENU32 hMenu, UINT32 wFlags, INT32 x, INT32 y,
+                           INT32 nReserved, HWND32 hWnd, const RECT32 *lpRect )
 {
     BOOL32 ret = FALSE;
 
@@ -2419,8 +2517,8 @@
 /**********************************************************************
  *           TrackPopupMenuEx   (USER32.549)
  */
-BOOL32 TrackPopupMenuEx( HMENU32 hMenu, UINT32 wFlags, INT32 x, INT32 y,
-			 HWND32 hWnd, LPTPMPARAMS lpTpm )
+BOOL32 WINAPI TrackPopupMenuEx( HMENU32 hMenu, UINT32 wFlags, INT32 x, INT32 y,
+                                HWND32 hWnd, LPTPMPARAMS lpTpm )
 {
     fprintf( stderr, "TrackPopupMenuEx: not fully implemented\n" );
     return TrackPopupMenu32( hMenu, wFlags, x, y, 0, hWnd,
@@ -2432,8 +2530,8 @@
  *
  * NOTE: Windows has totally different (and undocumented) popup wndproc.
  */
-LRESULT PopupMenuWndProc( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
-                          LPARAM lParam )
+LRESULT WINAPI PopupMenuWndProc( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
+                                 LPARAM lParam )
 {    
     WND* wndPtr = WIN_FindWndPtr(hwnd);
 
@@ -2517,7 +2615,7 @@
     WND *wndPtr;
     LPPOPUPMENU lppop;
 
-    dprintf_menu( stddeb, "MENU_GetMenuBarHeight: HWND 0x%lx, width %d, "
+    dprintf_menu( stddeb, "MENU_GetMenuBarHeight: HWND 0x%x, width %d, "
 		  "at (%d, %d).\n", hwnd, menubarWidth, orgX, orgY );
     
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
@@ -2534,8 +2632,8 @@
 /*******************************************************************
  *         ChangeMenu16    (USER.153)
  */
-BOOL16 ChangeMenu16( HMENU16 hMenu, UINT16 pos, SEGPTR data,
-                     UINT16 id, UINT16 flags )
+BOOL16 WINAPI ChangeMenu16( HMENU16 hMenu, UINT16 pos, SEGPTR data,
+                            UINT16 id, UINT16 flags )
 {
     dprintf_menu( stddeb,"ChangeMenu16: menu=%04x pos=%d data=%08lx id=%04x flags=%04x\n",
                   hMenu, pos, (DWORD)data, id, flags );
@@ -2560,8 +2658,8 @@
 /*******************************************************************
  *         ChangeMenu32A    (USER32.22)
  */
-BOOL32 ChangeMenu32A( HMENU32 hMenu, UINT32 pos, LPCSTR data,
-                      UINT32 id, UINT32 flags )
+BOOL32 WINAPI ChangeMenu32A( HMENU32 hMenu, UINT32 pos, LPCSTR data,
+                             UINT32 id, UINT32 flags )
 {
     dprintf_menu( stddeb,"ChangeMenu32A: menu=%08x pos=%d data=%08lx id=%08x flags=%08x\n",
                   hMenu, pos, (DWORD)data, id, flags );
@@ -2581,8 +2679,8 @@
 /*******************************************************************
  *         ChangeMenu32W    (USER32.23)
  */
-BOOL32 ChangeMenu32W( HMENU32 hMenu, UINT32 pos, LPCWSTR data,
-                      UINT32 id, UINT32 flags )
+BOOL32 WINAPI ChangeMenu32W( HMENU32 hMenu, UINT32 pos, LPCWSTR data,
+                             UINT32 id, UINT32 flags )
 {
     dprintf_menu( stddeb,"ChangeMenu32W: menu=%08x pos=%d data=%08lx id=%08x flags=%08x\n",
                   hMenu, pos, (DWORD)data, id, flags );
@@ -2602,7 +2700,7 @@
 /*******************************************************************
  *         CheckMenuItem16    (USER.154)
  */
-BOOL16 CheckMenuItem16( HMENU16 hMenu, UINT16 id, UINT16 flags )
+BOOL16 WINAPI CheckMenuItem16( HMENU16 hMenu, UINT16 id, UINT16 flags )
 {
     return (BOOL16)CheckMenuItem32( hMenu, id, flags );
 }
@@ -2611,16 +2709,16 @@
 /*******************************************************************
  *         CheckMenuItem32    (USER32.45)
  */
-DWORD CheckMenuItem32( HMENU32 hMenu, UINT32 id, UINT32 flags )
+DWORD WINAPI CheckMenuItem32( HMENU32 hMenu, UINT32 id, UINT32 flags )
 {
     MENUITEM *item;
     DWORD ret;
 
     dprintf_menu( stddeb,"CheckMenuItem: %04x %04x %04x\n", hMenu, id, flags );
     if (!(item = MENU_FindItem( &hMenu, &id, flags ))) return -1;
-    ret = item->item_flags & MF_CHECKED;
-    if (flags & MF_CHECKED) item->item_flags |= MF_CHECKED;
-    else item->item_flags &= ~MF_CHECKED;
+    ret = item->fState & MF_CHECKED;
+    if (flags & MF_CHECKED) item->fState |= MF_CHECKED;
+    else item->fState &= ~MF_CHECKED;
     return ret;
 }
 
@@ -2628,7 +2726,7 @@
 /**********************************************************************
  *         EnableMenuItem16    (USER.155)
  */
-BOOL16 EnableMenuItem16( HMENU16 hMenu, UINT16 wItemID, UINT16 wFlags )
+BOOL16 WINAPI EnableMenuItem16( HMENU16 hMenu, UINT16 wItemID, UINT16 wFlags )
 {
     return EnableMenuItem32( hMenu, wItemID, wFlags );
 }
@@ -2637,7 +2735,7 @@
 /**********************************************************************
  *         EnableMenuItem32    (USER32.169)
  */
-BOOL32 EnableMenuItem32( HMENU32 hMenu, UINT32 wItemID, UINT32 wFlags )
+BOOL32 WINAPI EnableMenuItem32( HMENU32 hMenu, UINT32 wItemID, UINT32 wFlags )
 {
     BOOL32    bRet = FALSE;
     MENUITEM *item, *first = NULL;
@@ -2647,20 +2745,20 @@
 
     while( (item = MENU_FindItem( &hMenu, &wItemID, wFlags )) )
     {
-      if( !(item->item_flags & MF_POPUP) )
+      if( !(item->fType & MF_POPUP) )
       {
            /* We can't have MF_GRAYED and MF_DISABLED together */
            if (wFlags & MF_GRAYED)
            {
-  	     item->item_flags = (item->item_flags & ~MF_DISABLED) | MF_GRAYED;
+  	     item->fState = (item->fState & ~MF_DISABLED) | MF_GRAYED;
            }
            else if (wFlags & MF_DISABLED)
            {
-	     item->item_flags = (item->item_flags & ~MF_GRAYED) | MF_DISABLED;
+	     item->fState = (item->fState & ~MF_GRAYED) | MF_DISABLED;
            }
            else   /* MF_ENABLED */
            {
-	     item->item_flags &= ~(MF_GRAYED | MF_DISABLED);
+	     item->fState &= ~(MF_GRAYED | MF_DISABLED);
            } 
 	   bRet = TRUE;
 	   break;
@@ -2675,8 +2773,8 @@
 /*******************************************************************
  *         GetMenuString16    (USER.161)
  */
-INT16 GetMenuString16( HMENU16 hMenu, UINT16 wItemID,
-                       LPSTR str, INT16 nMaxSiz, UINT16 wFlags )
+INT16 WINAPI GetMenuString16( HMENU16 hMenu, UINT16 wItemID,
+                              LPSTR str, INT16 nMaxSiz, UINT16 wFlags )
 {
     return GetMenuString32A( hMenu, wItemID, str, nMaxSiz, wFlags );
 }
@@ -2685,8 +2783,8 @@
 /*******************************************************************
  *         GetMenuString32A    (USER32.267)
  */
-INT32 GetMenuString32A( HMENU32 hMenu, UINT32 wItemID,
-                        LPSTR str, INT32 nMaxSiz, UINT32 wFlags )
+INT32 WINAPI GetMenuString32A( HMENU32 hMenu, UINT32 wItemID,
+                               LPSTR str, INT32 nMaxSiz, UINT32 wFlags )
 {
     MENUITEM *item;
 
@@ -2695,7 +2793,7 @@
     if (!str || !nMaxSiz) return 0;
     str[0] = '\0';
     if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return 0;
-    if (!IS_STRING_ITEM(item->item_flags)) return 0;
+    if (!IS_STRING_ITEM(item->fType)) return 0;
     lstrcpyn32A( str, item->text, nMaxSiz );
     dprintf_menu( stddeb, "GetMenuString32A: returning '%s'\n", str );
     return strlen(str);
@@ -2705,8 +2803,8 @@
 /*******************************************************************
  *         GetMenuString32W    (USER32.268)
  */
-INT32 GetMenuString32W( HMENU32 hMenu, UINT32 wItemID,
-                        LPWSTR str, INT32 nMaxSiz, UINT32 wFlags )
+INT32 WINAPI GetMenuString32W( HMENU32 hMenu, UINT32 wItemID,
+                               LPWSTR str, INT32 nMaxSiz, UINT32 wFlags )
 {
     MENUITEM *item;
 
@@ -2715,7 +2813,7 @@
     if (!str || !nMaxSiz) return 0;
     str[0] = '\0';
     if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return 0;
-    if (!IS_STRING_ITEM(item->item_flags)) return 0;
+    if (!IS_STRING_ITEM(item->fType)) return 0;
     lstrcpynAtoW( str, item->text, nMaxSiz );
     return lstrlen32W(str);
 }
@@ -2724,8 +2822,8 @@
 /**********************************************************************
  *         HiliteMenuItem16    (USER.162)
  */
-BOOL16 HiliteMenuItem16( HWND16 hWnd, HMENU16 hMenu, UINT16 wItemID,
-                         UINT16 wHilite )
+BOOL16 WINAPI HiliteMenuItem16( HWND16 hWnd, HMENU16 hMenu, UINT16 wItemID,
+                                UINT16 wHilite )
 {
     return HiliteMenuItem32( hWnd, hMenu, wItemID, wHilite );
 }
@@ -2734,8 +2832,8 @@
 /**********************************************************************
  *         HiliteMenuItem32    (USER32.317)
  */
-BOOL32 HiliteMenuItem32( HWND32 hWnd, HMENU32 hMenu, UINT32 wItemID,
-                         UINT32 wHilite )
+BOOL32 WINAPI HiliteMenuItem32( HWND32 hWnd, HMENU32 hMenu, UINT32 wItemID,
+                                UINT32 wHilite )
 {
     LPPOPUPMENU menu;
     dprintf_menu(stddeb,"HiliteMenuItem(%04x, %04x, %04x, %04x);\n", 
@@ -2752,7 +2850,7 @@
 /**********************************************************************
  *         GetMenuState16    (USER.250)
  */
-UINT16 GetMenuState16( HMENU16 hMenu, UINT16 wItemID, UINT16 wFlags )
+UINT16 WINAPI GetMenuState16( HMENU16 hMenu, UINT16 wItemID, UINT16 wFlags )
 {
     return GetMenuState32( hMenu, wItemID, wFlags );
 }
@@ -2761,31 +2859,32 @@
 /**********************************************************************
  *         GetMenuState32    (USER32.266)
  */
-UINT32 GetMenuState32( HMENU32 hMenu, UINT32 wItemID, UINT32 wFlags )
+UINT32 WINAPI GetMenuState32( HMENU32 hMenu, UINT32 wItemID, UINT32 wFlags )
 {
     MENUITEM *item;
     dprintf_menu(stddeb,"GetMenuState(%04x, %04x, %04x);\n", 
 		 hMenu, wItemID, wFlags);
     if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return -1;
-    if (item->item_flags & MF_POPUP)
+    if (item->fType & MF_POPUP)
     {
-	POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( (HMENU16)item->item_id );
+	POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( item->hSubMenu );
 	if (!menu) return -1;
 	else return (menu->nItems << 8) | (menu->wFlags & 0xff);
     }
     else
-      /* Non POPUP Menus only return flags in the lower byte */
-      return (item->item_flags & 0x00ff);
+        /* Non POPUP Menus only return flags in the lower byte */
+        /* XXX ??? */
+	return ((item->fType | item->fState) & 0x00ff);
 }
 
 
 /**********************************************************************
  *         GetMenuItemCount16    (USER.263)
  */
-INT16 GetMenuItemCount16( HMENU16 hMenu )
+INT16 WINAPI GetMenuItemCount16( HMENU16 hMenu )
 {
     LPPOPUPMENU	menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
-    if (!menu || (menu->wMagic != MENU_MAGIC)) return -1;
+    if (!IS_A_MENU(menu)) return -1;
     dprintf_menu( stddeb,"GetMenuItemCount16(%04x) returning %d\n", 
                   hMenu, menu->nItems );
     return menu->nItems;
@@ -2795,10 +2894,10 @@
 /**********************************************************************
  *         GetMenuItemCount32    (USER32.261)
  */
-INT32 GetMenuItemCount32( HMENU32 hMenu )
+INT32 WINAPI GetMenuItemCount32( HMENU32 hMenu )
 {
     LPPOPUPMENU	menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
-    if (!menu || (menu->wMagic != MENU_MAGIC)) return -1;
+    if (!IS_A_MENU(menu)) return -1;
     dprintf_menu( stddeb,"GetMenuItemCount32(%04x) returning %d\n", 
                   hMenu, menu->nItems );
     return menu->nItems;
@@ -2808,36 +2907,37 @@
 /**********************************************************************
  *         GetMenuItemID16    (USER.264)
  */
-UINT16 GetMenuItemID16( HMENU16 hMenu, INT16 nPos )
+UINT16 WINAPI GetMenuItemID16( HMENU16 hMenu, INT16 nPos )
 {
     LPPOPUPMENU	menu;
 
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return -1;
     if ((nPos < 0) || ((UINT16) nPos >= menu->nItems)) return -1;
-    if (menu->items[nPos].item_flags & MF_POPUP) return -1;
-    return menu->items[nPos].item_id;
+    if (menu->items[nPos].fType & MF_POPUP) return -1;
+    return menu->items[nPos].wID;
 }
 
 
 /**********************************************************************
  *         GetMenuItemID32    (USER32.262)
  */
-UINT32 GetMenuItemID32( HMENU32 hMenu, INT32 nPos )
+UINT32 WINAPI GetMenuItemID32( HMENU32 hMenu, INT32 nPos )
 {
     LPPOPUPMENU	menu;
 
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return -1;
     if ((nPos < 0) || (nPos >= menu->nItems)) return -1;
-    if (menu->items[nPos].item_flags & MF_POPUP) return -1;
-    return menu->items[nPos].item_id;
+    /* FIXME: Now that submenus can have ids, is this still right?  */
+    if (menu->items[nPos].fType & MF_POPUP) return -1;
+    return menu->items[nPos].wID;
 }
 
 
 /*******************************************************************
  *         InsertMenu16    (USER.410)
  */
-BOOL16 InsertMenu16( HMENU16 hMenu, UINT16 pos, UINT16 flags,
-                     UINT16 id, SEGPTR data )
+BOOL16 WINAPI InsertMenu16( HMENU16 hMenu, UINT16 pos, UINT16 flags,
+                            UINT16 id, SEGPTR data )
 {
     UINT32 pos32 = (UINT32)pos;
     if ((pos == (UINT16)-1) && (flags & MF_BYPOSITION)) pos32 = (UINT32)-1;
@@ -2851,8 +2951,8 @@
 /*******************************************************************
  *         InsertMenu32A    (USER32.321)
  */
-BOOL32 InsertMenu32A( HMENU32 hMenu, UINT32 pos, UINT32 flags,
-                      UINT32 id, LPCSTR str )
+BOOL32 WINAPI InsertMenu32A( HMENU32 hMenu, UINT32 pos, UINT32 flags,
+                             UINT32 id, LPCSTR str )
 {
     MENUITEM *item;
 
@@ -2875,7 +2975,8 @@
     if (flags & MF_POPUP)  /* Set the MF_POPUP flag on the popup-menu */
 	((POPUPMENU *)USER_HEAP_LIN_ADDR((HMENU16)id))->wFlags |= MF_POPUP;
 
-    item->pCB = NULL;
+    item->hCheckBit = item->hUnCheckBit = 0;
+    item->dwItemData = 0;
     return TRUE;
 }
 
@@ -2883,8 +2984,8 @@
 /*******************************************************************
  *         InsertMenu32W    (USER32.324)
  */
-BOOL32 InsertMenu32W( HMENU32 hMenu, UINT32 pos, UINT32 flags,
-                      UINT32 id, LPCWSTR str )
+BOOL32 WINAPI InsertMenu32W( HMENU32 hMenu, UINT32 pos, UINT32 flags,
+                             UINT32 id, LPCWSTR str )
 {
     BOOL32 ret;
 
@@ -2902,7 +3003,7 @@
 /*******************************************************************
  *         AppendMenu16    (USER.411)
  */
-BOOL16 AppendMenu16( HMENU16 hMenu, UINT16 flags, UINT16 id, SEGPTR data )
+BOOL16 WINAPI AppendMenu16(HMENU16 hMenu, UINT16 flags, UINT16 id, SEGPTR data)
 {
     return InsertMenu16( hMenu, -1, flags | MF_BYPOSITION, id, data );
 }
@@ -2911,7 +3012,8 @@
 /*******************************************************************
  *         AppendMenu32A    (USER32.4)
  */
-BOOL32 AppendMenu32A( HMENU32 hMenu, UINT32 flags, UINT32 id, LPCSTR data )
+BOOL32 WINAPI AppendMenu32A( HMENU32 hMenu, UINT32 flags,
+                             UINT32 id, LPCSTR data )
 {
     return InsertMenu32A( hMenu, -1, flags | MF_BYPOSITION, id, data );
 }
@@ -2920,7 +3022,8 @@
 /*******************************************************************
  *         AppendMenu32W    (USER32.5)
  */
-BOOL32 AppendMenu32W( HMENU32 hMenu, UINT32 flags, UINT32 id, LPCWSTR data )
+BOOL32 WINAPI AppendMenu32W( HMENU32 hMenu, UINT32 flags,
+                             UINT32 id, LPCWSTR data )
 {
     return InsertMenu32W( hMenu, -1, flags | MF_BYPOSITION, id, data );
 }
@@ -2929,7 +3032,7 @@
 /**********************************************************************
  *         RemoveMenu16    (USER.412)
  */
-BOOL16 RemoveMenu16( HMENU16 hMenu, UINT16 nPos, UINT16 wFlags )
+BOOL16 WINAPI RemoveMenu16( HMENU16 hMenu, UINT16 nPos, UINT16 wFlags )
 {
     return RemoveMenu32( hMenu, nPos, wFlags );
 }
@@ -2938,7 +3041,7 @@
 /**********************************************************************
  *         RemoveMenu32    (USER32.440)
  */
-BOOL32 RemoveMenu32( HMENU32 hMenu, UINT32 nPos, UINT32 wFlags )
+BOOL32 WINAPI RemoveMenu32( HMENU32 hMenu, UINT32 nPos, UINT32 wFlags )
 {
     LPPOPUPMENU	menu;
     MENUITEM *item;
@@ -2974,7 +3077,7 @@
 /**********************************************************************
  *         DeleteMenu16    (USER.413)
  */
-BOOL16 DeleteMenu16( HMENU16 hMenu, UINT16 nPos, UINT16 wFlags )
+BOOL16 WINAPI DeleteMenu16( HMENU16 hMenu, UINT16 nPos, UINT16 wFlags )
 {
     return DeleteMenu32( hMenu, nPos, wFlags );
 }
@@ -2983,11 +3086,11 @@
 /**********************************************************************
  *         DeleteMenu32    (USER32.128)
  */
-BOOL32 DeleteMenu32( HMENU32 hMenu, UINT32 nPos, UINT32 wFlags )
+BOOL32 WINAPI DeleteMenu32( HMENU32 hMenu, UINT32 nPos, UINT32 wFlags )
 {
     MENUITEM *item = MENU_FindItem( &hMenu, &nPos, wFlags );
     if (!item) return FALSE;
-    if (item->item_flags & MF_POPUP) DestroyMenu32( (HMENU32)item->item_id );
+    if (item->fType & MF_POPUP) DestroyMenu32( item->hSubMenu );
       /* nPos is now the position of the item */
     RemoveMenu32( hMenu, nPos, wFlags | MF_BYPOSITION );
     return TRUE;
@@ -2997,8 +3100,8 @@
 /*******************************************************************
  *         ModifyMenu16    (USER.414)
  */
-BOOL16 ModifyMenu16( HMENU16 hMenu, UINT16 pos, UINT16 flags,
-                     UINT16 id, SEGPTR data )
+BOOL16 WINAPI ModifyMenu16( HMENU16 hMenu, UINT16 pos, UINT16 flags,
+                            UINT16 id, SEGPTR data )
 {
     if (IS_STRING_ITEM(flags))
         return ModifyMenu32A( hMenu, pos, flags, id,
@@ -3010,8 +3113,8 @@
 /*******************************************************************
  *         ModifyMenu32A    (USER32.396)
  */
-BOOL32 ModifyMenu32A( HMENU32 hMenu, UINT32 pos, UINT32 flags,
-                      UINT32 id, LPCSTR str )
+BOOL32 WINAPI ModifyMenu32A( HMENU32 hMenu, UINT32 pos, UINT32 flags,
+                             UINT32 id, LPCSTR str )
 {
     MENUITEM *item;
 
@@ -3035,8 +3138,8 @@
 /*******************************************************************
  *         ModifyMenu32W    (USER32.397)
  */
-BOOL32 ModifyMenu32W( HMENU32 hMenu, UINT32 pos, UINT32 flags,
-                      UINT32 id, LPCWSTR str )
+BOOL32 WINAPI ModifyMenu32W( HMENU32 hMenu, UINT32 pos, UINT32 flags,
+                             UINT32 id, LPCWSTR str )
 {
     BOOL32 ret;
 
@@ -3054,7 +3157,7 @@
 /**********************************************************************
  *         CreatePopupMenu16    (USER.415)
  */
-HMENU16 CreatePopupMenu16(void)
+HMENU16 WINAPI CreatePopupMenu16(void)
 {
     return CreatePopupMenu32();
 }
@@ -3063,7 +3166,7 @@
 /**********************************************************************
  *         CreatePopupMenu32    (USER32.81)
  */
-HMENU32 CreatePopupMenu32(void)
+HMENU32 WINAPI CreatePopupMenu32(void)
 {
     HMENU32 hmenu;
     POPUPMENU *menu;
@@ -3078,7 +3181,7 @@
 /**********************************************************************
  *         GetMenuCheckMarkDimensions    (USER.417) (USER32.257)
  */
-DWORD GetMenuCheckMarkDimensions(void)
+DWORD WINAPI GetMenuCheckMarkDimensions(void)
 {
     return MAKELONG( check_bitmap_width, check_bitmap_height );
 }
@@ -3087,8 +3190,8 @@
 /**********************************************************************
  *         SetMenuItemBitmaps16    (USER.418)
  */
-BOOL16 SetMenuItemBitmaps16( HMENU16 hMenu, UINT16 nPos, UINT16 wFlags,
-                             HBITMAP16 hNewUnCheck, HBITMAP16 hNewCheck )
+BOOL16 WINAPI SetMenuItemBitmaps16( HMENU16 hMenu, UINT16 nPos, UINT16 wFlags,
+                                    HBITMAP16 hNewUnCheck, HBITMAP16 hNewCheck)
 {
     return SetMenuItemBitmaps32( hMenu, nPos, wFlags, hNewUnCheck, hNewCheck );
 }
@@ -3097,8 +3200,8 @@
 /**********************************************************************
  *         SetMenuItemBitmaps32    (USER32.489)
  */
-BOOL32 SetMenuItemBitmaps32( HMENU32 hMenu, UINT32 nPos, UINT32 wFlags,
-                             HBITMAP32 hNewUnCheck, HBITMAP32 hNewCheck )
+BOOL32 WINAPI SetMenuItemBitmaps32( HMENU32 hMenu, UINT32 nPos, UINT32 wFlags,
+                                    HBITMAP32 hNewUnCheck, HBITMAP32 hNewCheck)
 {
     MENUITEM *item;
     dprintf_menu(stddeb,"SetMenuItemBitmaps(%04x, %04x, %04x, %04x, %04x)\n",
@@ -3107,17 +3210,13 @@
 
     if (!hNewCheck && !hNewUnCheck)
     {
-	if( item->pCB ) HeapFree( SystemHeap, 0, item->pCB );
-	item->pCB = NULL;
-	item->item_flags &= ~MF_USECHECKBITMAPS;
+	item->fState &= ~MF_USECHECKBITMAPS;
     }
     else  /* Install new bitmaps */
     {
-	if( item->pCB == NULL ) 
-	    item->pCB = HeapAlloc( SystemHeap, 0, sizeof(CBITMAPS));
-	item->pCB->hCheckBit = hNewCheck;
-	item->pCB->hUnCheckBit = hNewUnCheck;
-	item->item_flags |= MF_USECHECKBITMAPS;
+	item->hCheckBit = hNewCheck;
+	item->hUnCheckBit = hNewUnCheck;
+	item->fState |= MF_USECHECKBITMAPS;
     }
     return TRUE;
 }
@@ -3126,7 +3225,7 @@
 /**********************************************************************
  *         CreateMenu16    (USER.151)
  */
-HMENU16 CreateMenu16(void)
+HMENU16 WINAPI CreateMenu16(void)
 {
     return CreateMenu32();
 }
@@ -3135,7 +3234,7 @@
 /**********************************************************************
  *         CreateMenu32    (USER32.80)
  */
-HMENU32 CreateMenu32(void)
+HMENU32 WINAPI CreateMenu32(void)
 {
     HMENU32 hMenu;
     LPPOPUPMENU menu;
@@ -3158,7 +3257,7 @@
 /**********************************************************************
  *         DestroyMenu16    (USER.152)
  */
-BOOL16 DestroyMenu16( HMENU16 hMenu )
+BOOL16 WINAPI DestroyMenu16( HMENU16 hMenu )
 {
     return DestroyMenu32( hMenu );
 }
@@ -3167,7 +3266,7 @@
 /**********************************************************************
  *         DestroyMenu32    (USER32.133)
  */
-BOOL32 DestroyMenu32( HMENU32 hMenu )
+BOOL32 WINAPI DestroyMenu32( HMENU32 hMenu )
 {
     dprintf_menu(stddeb,"DestroyMenu(%04x)\n", hMenu);
 
@@ -3180,7 +3279,7 @@
 	if( pTopPopupWnd && (hMenu == *(HMENU32*)pTopPopupWnd->wExtra) )
 	  *(UINT32*)pTopPopupWnd->wExtra = 0;
 
-	if (lppop && (lppop->wMagic == MENU_MAGIC))
+	if (IS_A_MENU( lppop ))
 	{
 	    lppop->wMagic = 0;  /* Mark it as destroyed */
 
@@ -3194,8 +3293,7 @@
 	        MENUITEM *item = lppop->items;
 	        for (i = lppop->nItems; i > 0; i--, item++)
 	        {
-	            if (item->item_flags & MF_POPUP)
-	                DestroyMenu32( (HMENU32)item->item_id );
+	            if (item->fType & MF_POPUP) DestroyMenu32(item->hSubMenu);
 		    MENU_FreeItemData( item );
 	        }
 	        HeapFree( SystemHeap, 0, lppop->items );
@@ -3211,7 +3309,7 @@
 /**********************************************************************
  *         GetSystemMenu16    (USER.156)
  */
-HMENU16 GetSystemMenu16( HWND16 hWnd, BOOL16 bRevert )
+HMENU16 WINAPI GetSystemMenu16( HWND16 hWnd, BOOL16 bRevert )
 {
     return GetSystemMenu32( hWnd, bRevert );
 }
@@ -3220,7 +3318,7 @@
 /**********************************************************************
  *         GetSystemMenu32    (USER32.290)
  */
-HMENU32 GetSystemMenu32( HWND32 hWnd, BOOL32 bRevert )
+HMENU32 WINAPI GetSystemMenu32( HWND32 hWnd, BOOL32 bRevert )
 {
     WND *wndPtr = WIN_FindWndPtr( hWnd );
 
@@ -3237,8 +3335,8 @@
 	    {
 		POPUPMENU *menu = (POPUPMENU*) 
 			   USER_HEAP_LIN_ADDR(wndPtr->hSysMenu);
-		if( menu->items[0].item_id == MENU_DefSysPopup )
-		    menu->items[0].item_id = MENU_CopySysPopup();
+		if( menu->items[0].hSubMenu == MENU_DefSysPopup )
+		    menu->items[0].hSubMenu = MENU_CopySysPopup();
 	    }
 	}
 
@@ -3255,7 +3353,7 @@
 /*******************************************************************
  *         SetSystemMenu16    (USER.280)
  */
-BOOL16 SetSystemMenu16( HWND16 hwnd, HMENU16 hMenu )
+BOOL16 WINAPI SetSystemMenu16( HWND16 hwnd, HMENU16 hMenu )
 {
     return SetSystemMenu32( hwnd, hMenu );
 }
@@ -3264,7 +3362,7 @@
 /*******************************************************************
  *         SetSystemMenu32    (USER32.507)
  */
-BOOL32 SetSystemMenu32( HWND32 hwnd, HMENU32 hMenu )
+BOOL32 WINAPI SetSystemMenu32( HWND32 hwnd, HMENU32 hMenu )
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
 
@@ -3281,7 +3379,7 @@
 /**********************************************************************
  *         GetMenu16    (USER.157)
  */
-HMENU16 GetMenu16( HWND16 hWnd ) 
+HMENU16 WINAPI GetMenu16( HWND16 hWnd ) 
 {
     WND * wndPtr = WIN_FindWndPtr(hWnd);
     if (wndPtr && !(wndPtr->dwStyle & WS_CHILD)) 
@@ -3293,7 +3391,7 @@
 /**********************************************************************
  *         GetMenu32    (USER32.256)
  */
-HMENU32 GetMenu32( HWND32 hWnd ) 
+HMENU32 WINAPI GetMenu32( HWND32 hWnd ) 
 { 
     WND * wndPtr = WIN_FindWndPtr(hWnd);
     if (wndPtr && !(wndPtr->dwStyle & WS_CHILD)) 
@@ -3305,7 +3403,7 @@
 /**********************************************************************
  *         SetMenu16    (USER.158)
  */
-BOOL16 SetMenu16( HWND16 hWnd, HMENU16 hMenu )
+BOOL16 WINAPI SetMenu16( HWND16 hWnd, HMENU16 hMenu )
 {
     return SetMenu32( hWnd, hMenu );
 }
@@ -3314,7 +3412,7 @@
 /**********************************************************************
  *         SetMenu32    (USER32.486)
  */
-BOOL32 SetMenu32( HWND32 hWnd, HMENU32 hMenu )
+BOOL32 WINAPI SetMenu32( HWND32 hWnd, HMENU32 hMenu )
 {
     WND * wndPtr = WIN_FindWndPtr(hWnd);
 
@@ -3347,7 +3445,7 @@
 /**********************************************************************
  *         GetSubMenu16    (USER.159)
  */
-HMENU16 GetSubMenu16( HMENU16 hMenu, INT16 nPos )
+HMENU16 WINAPI GetSubMenu16( HMENU16 hMenu, INT16 nPos )
 {
     return GetSubMenu32( hMenu, nPos );
 }
@@ -3356,21 +3454,21 @@
 /**********************************************************************
  *         GetSubMenu32    (USER32.287)
  */
-HMENU32 GetSubMenu32( HMENU32 hMenu, INT32 nPos )
+HMENU32 WINAPI GetSubMenu32( HMENU32 hMenu, INT32 nPos )
 {
     LPPOPUPMENU lppop;
 
     if (!(lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return 0;
     if ((UINT32)nPos >= lppop->nItems) return 0;
-    if (!(lppop->items[nPos].item_flags & MF_POPUP)) return 0;
-    return (HMENU32)lppop->items[nPos].item_id;
+    if (!(lppop->items[nPos].fType & MF_POPUP)) return 0;
+    return lppop->items[nPos].hSubMenu;
 }
 
 
 /**********************************************************************
  *         DrawMenuBar16    (USER.160)
  */
-void DrawMenuBar16( HWND16 hWnd )
+void WINAPI DrawMenuBar16( HWND16 hWnd )
 {
     DrawMenuBar32( hWnd );
 }
@@ -3379,7 +3477,7 @@
 /**********************************************************************
  *         DrawMenuBar32    (USER32.160)
  */
-BOOL32 DrawMenuBar32( HWND32 hWnd )
+BOOL32 WINAPI DrawMenuBar32( HWND32 hWnd )
 {
     LPPOPUPMENU lppop;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
@@ -3400,7 +3498,7 @@
 /***********************************************************************
  *           EndMenu   (USER.187) (USER32.174)
  */
-void EndMenu(void)
+void WINAPI EndMenu(void)
 {
     fEndMenu = TRUE;
 }
@@ -3409,7 +3507,7 @@
 /***********************************************************************
  *           LookupMenuHandle   (USER.217)
  */
-HMENU16 LookupMenuHandle( HMENU16 hmenu, INT16 id )
+HMENU16 WINAPI LookupMenuHandle( HMENU16 hmenu, INT16 id )
 {
     HMENU32 hmenu32 = hmenu;
     INT32 id32 = id;
@@ -3421,7 +3519,7 @@
 /**********************************************************************
  *	    LoadMenu16    (USER.150)
  */
-HMENU16 LoadMenu16( HINSTANCE16 instance, SEGPTR name )
+HMENU16 WINAPI LoadMenu16( HINSTANCE16 instance, SEGPTR name )
 {
     HRSRC16 hRsrc;
     HGLOBAL16 handle;
@@ -3454,7 +3552,7 @@
 /*****************************************************************
  *        LoadMenu32A   (USER32.370)
  */
-HMENU32 LoadMenu32A( HINSTANCE32 instance, LPCSTR name )
+HMENU32 WINAPI LoadMenu32A( HINSTANCE32 instance, LPCSTR name )
 {
     HRSRC32 hrsrc = FindResource32A( instance, name, (LPSTR)RT_MENU );
     if (!hrsrc) return 0;
@@ -3465,7 +3563,7 @@
 /*****************************************************************
  *        LoadMenu32W   (USER32.372)
  */
-HMENU32 LoadMenu32W( HINSTANCE32 instance, LPCWSTR name )
+HMENU32 WINAPI LoadMenu32W( HINSTANCE32 instance, LPCWSTR name )
 {
     HRSRC32 hrsrc = FindResource32W( instance, name, (LPWSTR)RT_MENU );
     if (!hrsrc) return 0;
@@ -3476,7 +3574,7 @@
 /**********************************************************************
  *	    LoadMenuIndirect16    (USER.220)
  */
-HMENU16 LoadMenuIndirect16( LPCVOID template )
+HMENU16 WINAPI LoadMenuIndirect16( LPCVOID template )
 {
     HMENU16 hMenu;
     WORD version, offset;
@@ -3505,7 +3603,7 @@
 /**********************************************************************
  *	    LoadMenuIndirect32A    (USER32.370)
  */
-HMENU32 LoadMenuIndirect32A( LPCVOID template )
+HMENU32 WINAPI LoadMenuIndirect32A( LPCVOID template )
 {
     HMENU16 hMenu;
     WORD version, offset;
@@ -3547,7 +3645,7 @@
 /**********************************************************************
  *	    LoadMenuIndirect32W    (USER32.371)
  */
-HMENU32 LoadMenuIndirect32W( LPCVOID template )
+HMENU32 WINAPI LoadMenuIndirect32W( LPCVOID template )
 {
     /* FIXME: is there anything different between A and W? */
     return LoadMenuIndirect32A( template );
@@ -3557,11 +3655,20 @@
 /**********************************************************************
  *		IsMenu16    (USER.358)
  */
-BOOL16 IsMenu16( HMENU16 hmenu )
+BOOL16 WINAPI IsMenu16( HMENU16 hmenu )
 {
-    LPPOPUPMENU menu;
-    if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR( hmenu ))) return FALSE;
-    return (menu->wMagic == MENU_MAGIC);
+    LPPOPUPMENU menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hmenu);
+    return IS_A_MENU(menu);
+}
+
+
+/**********************************************************************
+ *		IsMenu32    (USER32.345)
+ */
+BOOL32 WINAPI IsMenu32(HMENU32 hmenu)
+{
+    LPPOPUPMENU menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hmenu);
+    return IS_A_MENU(menu);
 }
 
 /**********************************************************************
@@ -3574,40 +3681,48 @@
 					 BOOL32 unicode)
 {
   MENUITEM *menu = MENU_FindItem (&hmenu, &item, bypos);
-  if (!menu) return FALSE;
+    debug_print_menuitem("GetMenuItemInfo32_common: ", menu, "\n");
+    if (!menu)
+	return FALSE;
 
-  if (lpmii->fMask && MIIM_TYPE)
-    {
-      lpmii->fType = menu->item_flags;
-      lpmii->dwTypeData = menu->text;
-      if (IS_STRING_ITEM (menu->item_flags))
-	{
-	  lpmii->cch = strlen (menu->text);
+    if (lpmii->fMask & MIIM_TYPE) {
+	lpmii->fType = menu->fType;
+	switch (MENU_ITEM_TYPE(menu->fType)) {
+	case MF_STRING:
+	    if (menu->text && lpmii->dwTypeData && lpmii->cch) {
 	  if (unicode)
-	    ; /* UGH! FIXME */
+		    lstrcpynAtoW((LPWSTR) lpmii->dwTypeData,
+				 menu->text,
+				 lpmii->cch);
+		else
+		    lstrcpyn32A(lpmii->dwTypeData,
+				menu->text,
+				lpmii->cch);
 	}
-      else
-	lpmii->cch = 0;
+	    break;
+	case MF_OWNERDRAW:
+	case MF_BITMAP:
+	    lpmii->dwTypeData = menu->text;
+	    break;
+	default:
+	    break;
     }
-
-  if (lpmii->fMask && MIIM_STATE)
-    lpmii->fState = 0; /* FIXME -- not saved.  */
-
-  if (lpmii->wID && MIIM_ID)
-    lpmii->fType = menu->item_id;
-
-  if (lpmii->fMask && MIIM_SUBMENU)
-    lpmii->hSubMenu = menu->item_id; /* FIXME: ??? */
-
-  if (lpmii->fMask && MIIM_CHECKMARKS)
-    {
-      PCBITMAPS pCB = menu->pCB;
-      lpmii->hbmpChecked = pCB ? pCB->hCheckBit : 0;
-      lpmii->hbmpUnchecked = pCB ? pCB->hUnCheckBit : 0;
     }
+    if (lpmii->fMask & MIIM_STATE)
+	lpmii->fState = menu->fState;
 
-  if (lpmii->fMask && MIIM_DATA)
-    lpmii->dwItemData = 0; /* FIXME -- not saved.  */
+    if (lpmii->fMask & MIIM_ID)
+	lpmii->wID = menu->wID;
+
+    if (lpmii->fMask & MIIM_SUBMENU)
+	lpmii->hSubMenu = menu->hSubMenu;
+
+    if (lpmii->fMask & MIIM_CHECKMARKS) {
+	lpmii->hbmpChecked = menu->hCheckBit;
+	lpmii->hbmpUnchecked = menu->hUnCheckBit;
+    }
+    if (lpmii->fMask & MIIM_DATA)
+	lpmii->dwItemData = menu->dwItemData;
 
   return TRUE;
 }
@@ -3615,8 +3730,8 @@
 /**********************************************************************
  *		GetMenuItemInfo32A    (USER32.263)
  */
-BOOL32 GetMenuItemInfo32A( HMENU32 hmenu, UINT32 item, BOOL32 bypos,
-			   LPMENUITEMINFO32A lpmii)
+BOOL32 WINAPI GetMenuItemInfo32A( HMENU32 hmenu, UINT32 item, BOOL32 bypos,
+                                  LPMENUITEMINFO32A lpmii)
 {
     return GetMenuItemInfo32_common (hmenu, item, bypos, lpmii, FALSE);
 }
@@ -3624,20 +3739,136 @@
 /**********************************************************************
  *		GetMenuItemInfo32W    (USER32.264)
  */
-BOOL32 GetMenuItemInfo32W( HMENU32 hmenu, UINT32 item, BOOL32 bypos,
-			   LPMENUITEMINFO32W lpmii)
+BOOL32 WINAPI GetMenuItemInfo32W( HMENU32 hmenu, UINT32 item, BOOL32 bypos,
+                                  LPMENUITEMINFO32W lpmii)
 {
     return GetMenuItemInfo32_common (hmenu, item, bypos,
                                      (LPMENUITEMINFO32A)lpmii, TRUE);
 }
 
+/**********************************************************************
+ *		SetMenuItemInfo32_common
+ */
+
+static BOOL32 SetMenuItemInfo32_common(MENUITEM * menu,
+				       const MENUITEMINFO32A *lpmii,
+				       BOOL32 unicode)
+{
+    if (!menu) return FALSE;
+
+    if (lpmii->fMask & MIIM_TYPE) {
+	/* Get rid of old string.  */
+	if (IS_STRING_ITEM(menu->fType) && menu->text)
+	    HeapFree(SystemHeap, 0, menu->text);
+
+	menu->fType = lpmii->fType;
+	menu->text = lpmii->dwTypeData;
+	if (IS_STRING_ITEM(menu->fType) && menu->text) {
+	    menu->text =
+		unicode
+		? HEAP_strdupWtoA(SystemHeap, 0,
+				  (LPWSTR) lpmii->dwTypeData)
+		: HEAP_strdupA(SystemHeap, 0, lpmii->dwTypeData);
+	}
+    }
+    if (lpmii->fMask & MIIM_STATE)
+	menu->fState = lpmii->fState;
+
+    if (lpmii->fMask & MIIM_ID)
+	menu->wID = lpmii->wID;
+
+    if (lpmii->fMask & MIIM_SUBMENU)
+	menu->hSubMenu = lpmii->hSubMenu;
+
+    if (lpmii->fMask & MIIM_CHECKMARKS)
+    {
+	menu->hCheckBit = lpmii->hbmpChecked;
+	menu->hUnCheckBit = lpmii->hbmpUnchecked;
+    }
+    if (lpmii->fMask & MIIM_DATA)
+	menu->dwItemData = lpmii->dwItemData;
+
+    debug_print_menuitem("SetMenuItemInfo32_common: ", menu, "\n");
+    return TRUE;
+}
 
 /**********************************************************************
- *		IsMenu32    (USER32.345)
+ *		SetMenuItemInfo32A    (USER32.490)
  */
-BOOL32 IsMenu32( HMENU32 hmenu )
+BOOL32 WINAPI SetMenuItemInfo32A(HMENU32 hmenu, UINT32 item, BOOL32 bypos,
+                                 const MENUITEMINFO32A *lpmii) 
 {
-    LPPOPUPMENU menu;
-    if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR( hmenu ))) return FALSE;
-    return (menu->wMagic == MENU_MAGIC);
+    return SetMenuItemInfo32_common(MENU_FindItem(&hmenu, &item, bypos),
+				    lpmii, FALSE);
+}
+
+/**********************************************************************
+ *		SetMenuItemInfo32W    (USER32.491)
+ */
+BOOL32 WINAPI SetMenuItemInfo32W(HMENU32 hmenu, UINT32 item, BOOL32 bypos,
+                                 const MENUITEMINFO32W *lpmii)
+{
+    return SetMenuItemInfo32_common(MENU_FindItem(&hmenu, &item, bypos),
+				    (const MENUITEMINFO32A*)lpmii, TRUE);
+}
+
+/**********************************************************************
+ *		SetMenuDefaultItem32    (USER32.488)
+ */
+BOOL32 WINAPI SetMenuDefaultItem32(HMENU32 hmenu, UINT32 item, BOOL32 bypos)
+{
+    MENUITEM *menu = MENU_FindItem(&hmenu, &item, bypos);
+    if (!menu) return FALSE;
+    debug_print_menuitem("SetMenuDefaultItem32: ", menu, "\n");
+    fprintf(stdnimp, "SetMenuDefaultItem32 (0x%x,%d,%d), empty stub!\n",
+	    hmenu, item, bypos);
+    return TRUE;
+}
+
+/*******************************************************************
+ *              InsertMenuItem16   (USER.441)
+ *
+ * FIXME: untested
+ */
+BOOL16 WINAPI InsertMenuItem16( HMENU16 hmenu, UINT16 pos, BOOL16 byposition,
+                                const MENUITEMINFO16 *mii )
+{
+    MENUITEMINFO32A miia;
+
+    miia.cbSize        = sizeof(miia);
+    miia.fMask         = mii->fMask;
+    miia.dwTypeData    = miia.dwTypeData;
+    miia.fType         = mii->fType;
+    miia.fState        = mii->fState;
+    miia.wID           = mii->wID;
+    miia.hSubMenu      = mii->hSubMenu;
+    miia.hbmpChecked   = mii->hbmpChecked;
+    miia.hbmpUnchecked = mii->hbmpUnchecked;
+    miia.dwItemData    = mii->dwItemData;
+    miia.cch           = mii->cch;
+    if (IS_STRING_ITEM(miia.fType))
+        miia.dwTypeData = PTR_SEG_TO_LIN(miia.dwTypeData);
+    return InsertMenuItem32A( hmenu, pos, byposition, &miia );
+}
+
+
+/**********************************************************************
+ *		InsertMenuItem32A    (USER32.322)
+ */
+BOOL32 WINAPI InsertMenuItem32A(HMENU32 hMenu, UINT32 uItem, BOOL32 bypos,
+                                const MENUITEMINFO32A *lpmii)
+{
+    MENUITEM *item = MENU_InsertItem(hMenu, uItem, bypos);
+    return SetMenuItemInfo32_common(item, lpmii, FALSE);
+}
+
+
+/**********************************************************************
+ *		InsertMenuItem32W    (USER32.323)
+ */
+BOOL32 WINAPI InsertMenuItem32W(HMENU32 hMenu, UINT32 uItem, BOOL32 bypos,
+                                const MENUITEMINFO32W *lpmii)
+{
+    MENUITEM *item = MENU_InsertItem(hMenu, uItem, bypos);
+    return SetMenuItemInfo32_common(item, (const MENUITEMINFO32A*)lpmii, TRUE);
 }
diff --git a/controls/scroll.c b/controls/scroll.c
index d2371f1..b8a3d4e 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -756,8 +756,8 @@
 /***********************************************************************
  *           ScrollBarWndProc
  */
-LRESULT ScrollBarWndProc( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
-                          LPARAM lParam )
+LRESULT WINAPI ScrollBarWndProc( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
+                                 LPARAM lParam )
 {
     switch(message)
     {
@@ -893,8 +893,8 @@
 /*************************************************************************
  *           SetScrollInfo16   (USER.475)
  */
-INT16 SetScrollInfo16( HWND16 hwnd, INT16 nBar, const SCROLLINFO *info,
-                       BOOL16 bRedraw )
+INT16 WINAPI SetScrollInfo16( HWND16 hwnd, INT16 nBar, const SCROLLINFO *info,
+                              BOOL16 bRedraw )
 {
     return (INT16)SetScrollInfo32( hwnd, nBar, info, bRedraw );
 }
@@ -903,8 +903,8 @@
 /*************************************************************************
  *           SetScrollInfo32   (USER32.500)
  */
-INT32 SetScrollInfo32( HWND32 hwnd, INT32 nBar, const SCROLLINFO *info,
-                       BOOL32 bRedraw )
+INT32 WINAPI SetScrollInfo32( HWND32 hwnd, INT32 nBar, const SCROLLINFO *info,
+                              BOOL32 bRedraw )
 {
     SCROLLBAR_INFO *infoPtr;
     UINT32 new_flags;
@@ -1007,7 +1007,7 @@
 /*************************************************************************
  *           GetScrollInfo16   (USER.476)
  */
-BOOL16 GetScrollInfo16( HWND16 hwnd, INT16 nBar, LPSCROLLINFO info )
+BOOL16 WINAPI GetScrollInfo16( HWND16 hwnd, INT16 nBar, LPSCROLLINFO info )
 {
     return GetScrollInfo32( hwnd, nBar, info );
 }
@@ -1016,7 +1016,7 @@
 /*************************************************************************
  *           GetScrollInfo32   (USER32.283)
  */
-BOOL32 GetScrollInfo32( HWND32 hwnd, INT32 nBar, LPSCROLLINFO info )
+BOOL32 WINAPI GetScrollInfo32( HWND32 hwnd, INT32 nBar, LPSCROLLINFO info )
 {
     SCROLLBAR_INFO *infoPtr;
 
@@ -1041,7 +1041,8 @@
 /*************************************************************************
  *           SetScrollPos16   (USER.62)
  */
-INT16 SetScrollPos16( HWND16 hwnd, INT16 nBar, INT16 nPos, BOOL16 bRedraw )
+INT16 WINAPI SetScrollPos16( HWND16 hwnd, INT16 nBar, INT16 nPos,
+                             BOOL16 bRedraw )
 {
     return (INT16)SetScrollPos32( hwnd, nBar, nPos, bRedraw );
 }
@@ -1050,7 +1051,8 @@
 /*************************************************************************
  *           SetScrollPos32   (USER32.501)
  */
-INT32 SetScrollPos32( HWND32 hwnd, INT32 nBar, INT32 nPos, BOOL32 bRedraw )
+INT32 WINAPI SetScrollPos32( HWND32 hwnd, INT32 nBar, INT32 nPos,
+                             BOOL32 bRedraw )
 {
     SCROLLINFO info;
     SCROLLBAR_INFO *infoPtr;
@@ -1069,7 +1071,7 @@
 /*************************************************************************
  *           GetScrollPos16   (USER.63)
  */
-INT16 GetScrollPos16( HWND16 hwnd, INT16 nBar )
+INT16 WINAPI GetScrollPos16( HWND16 hwnd, INT16 nBar )
 {
     return (INT16)GetScrollPos32( hwnd, nBar );
 }
@@ -1078,7 +1080,7 @@
 /*************************************************************************
  *           GetScrollPos32   (USER32.284)
  */
-INT32 GetScrollPos32( HWND32 hwnd, INT32 nBar )
+INT32 WINAPI GetScrollPos32( HWND32 hwnd, INT32 nBar )
 {
     SCROLLBAR_INFO *infoPtr;
 
@@ -1090,8 +1092,8 @@
 /*************************************************************************
  *           SetScrollRange16   (USER.64)
  */
-void SetScrollRange16( HWND16 hwnd, INT16 nBar, INT16 MinVal, INT16 MaxVal,
-                       BOOL16 bRedraw )
+void WINAPI SetScrollRange16( HWND16 hwnd, INT16 nBar,
+                              INT16 MinVal, INT16 MaxVal, BOOL16 bRedraw )
 {
     /* Invalid range -> range is set to (0,0) */
     if ((INT32)MaxVal - (INT32)MinVal > 0x7fff) MinVal = MaxVal = 0;
@@ -1102,8 +1104,8 @@
 /*************************************************************************
  *           SetScrollRange32   (USER32.502)
  */
-BOOL32 SetScrollRange32( HWND32 hwnd, INT32 nBar, INT32 MinVal, INT32 MaxVal,
-                         BOOL32 bRedraw )
+BOOL32 WINAPI SetScrollRange32( HWND32 hwnd, INT32 nBar,
+                                INT32 MinVal, INT32 MaxVal, BOOL32 bRedraw )
 {
     SCROLLINFO info;
 
@@ -1153,7 +1155,8 @@
 /*************************************************************************
  *           GetScrollRange16   (USER.65)
  */
-BOOL16 GetScrollRange16( HWND16 hwnd, INT16 nBar, LPINT16 lpMin, LPINT16 lpMax)
+BOOL16 WINAPI GetScrollRange16( HWND16 hwnd, INT16 nBar,
+                                LPINT16 lpMin, LPINT16 lpMax)
 {
     INT32 min, max;
     BOOL16 ret = GetScrollRange32( hwnd, nBar, &min, &max );
@@ -1166,7 +1169,8 @@
 /*************************************************************************
  *           GetScrollRange32   (USER32.285)
  */
-BOOL32 GetScrollRange32( HWND32 hwnd, INT32 nBar, LPINT32 lpMin, LPINT32 lpMax)
+BOOL32 WINAPI GetScrollRange32( HWND32 hwnd, INT32 nBar,
+                                LPINT32 lpMin, LPINT32 lpMax)
 {
     SCROLLBAR_INFO *infoPtr;
 
@@ -1185,7 +1189,7 @@
 /*************************************************************************
  *           ShowScrollBar16   (USER.267)
  */
-void ShowScrollBar16( HWND16 hwnd, INT16 nBar, BOOL16 fShow )
+void WINAPI ShowScrollBar16( HWND16 hwnd, INT16 nBar, BOOL16 fShow )
 {
     ShowScrollBar32( hwnd, nBar, fShow );
 }
@@ -1194,7 +1198,7 @@
 /*************************************************************************
  *           ShowScrollBar32   (USER32.531)
  */
-BOOL32 ShowScrollBar32( HWND32 hwnd, INT32 nBar, BOOL32 fShow )
+BOOL32 WINAPI ShowScrollBar32( HWND32 hwnd, INT32 nBar, BOOL32 fShow )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
@@ -1261,7 +1265,7 @@
 /*************************************************************************
  *           EnableScrollBar16   (USER.482)
  */
-BOOL16 EnableScrollBar16( HWND16 hwnd, INT16 nBar, UINT16 flags )
+BOOL16 WINAPI EnableScrollBar16( HWND16 hwnd, INT16 nBar, UINT16 flags )
 {
     return EnableScrollBar32( hwnd, nBar, flags );
 }
@@ -1270,7 +1274,7 @@
 /*************************************************************************
  *           EnableScrollBar32   (USER32.170)
  */
-BOOL32 EnableScrollBar32( HWND32 hwnd, INT32 nBar, UINT32 flags )
+BOOL32 WINAPI EnableScrollBar32( HWND32 hwnd, INT32 nBar, UINT32 flags )
 {
     SCROLLBAR_INFO *infoPtr;
 
diff --git a/controls/static.c b/controls/static.c
index 6a547e2..ecd4a02 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -50,13 +50,17 @@
 {
     HICON16 prevIcon;
     STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
+    CURSORICONINFO *info = hicon?(CURSORICONINFO *) GlobalLock16( hicon ):NULL;
 
     if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return 0;
+    if (hicon && !info) {
+	fprintf(stderr,"STATIC_SetIcon: huh? hicon!=0, but info=0???\n");
+    	return 0;
+    }
     prevIcon = infoPtr->hIcon;
     infoPtr->hIcon = hicon;
     if (hicon)
     {
-        CURSORICONINFO *info = (CURSORICONINFO *) GlobalLock16( hicon );
         SetWindowPos32( wndPtr->hwndSelf, 0, 0, 0, info->nWidth, info->nHeight,
                         SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
         GlobalUnlock16( hicon );
@@ -95,8 +99,8 @@
 /***********************************************************************
  *           StaticWndProc
  */
-LRESULT StaticWndProc( HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam,
-                       LPARAM lParam )
+LRESULT WINAPI StaticWndProc( HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam,
+                              LPARAM lParam )
 {
     LRESULT lResult = 0;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
diff --git a/controls/status.c b/controls/status.c
index feef96c..0732664 100644
--- a/controls/status.c
+++ b/controls/status.c
@@ -38,7 +38,8 @@
 /***********************************************************************
  *           DrawStatusText32A   (COMCTL32.3)
  */
-void DrawStatusText32A( HDC32 hdc, LPRECT32 lprc, LPCSTR text, UINT32 style )
+void WINAPI DrawStatusText32A( HDC32 hdc, LPRECT32 lprc, LPCSTR text,
+                               UINT32 style )
 {
     RECT32		r, rt;
     int	oldbkmode;
@@ -435,8 +436,8 @@
     return 0;
 }
 
-LRESULT StatusWindowProc( HWND32 hwnd, UINT32 msg,
-                          WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI StatusWindowProc( HWND32 hwnd, UINT32 msg,
+                                 WPARAM32 wParam, LPARAM lParam )
 {
     STATUSWINDOWINFO *self;
 
@@ -480,8 +481,8 @@
 /***********************************************************************
  *           CreateStatusWindow32A   (COMCTL32.4)
  */
-HWND32 CreateStatusWindow32A( INT32 style, LPCSTR text, HWND32 parent,
-                              UINT32 wid )
+HWND32 WINAPI CreateStatusWindow32A( INT32 style, LPCSTR text, HWND32 parent,
+                                     UINT32 wid )
 {
     HWND32 ret;
     ATOM atom;
diff --git a/controls/updown.c b/controls/updown.c
new file mode 100644
index 0000000..a3a75ef
--- /dev/null
+++ b/controls/updown.c
@@ -0,0 +1,865 @@
+/*		
+ * Updown control
+ *
+ * Copyright 1997 Dimitrie O. Paun
+ *
+ * TODO:
+ *   - subclass the buddy window (in UPDOWN_SetBuddy) to process the
+ *     arrow keys
+ *   - I am not sure about the default values for the Min, Max, Pos
+ *     (in the UPDOWN_INFO the fields: MinVal, MaxVal, CurVal)
+ * Testing:
+ *   Not much. The following  have not been tested at all:
+ *     - horizontal arrows
+ *     - listbox as buddy window
+ *     - acceleration
+ *     - base 16
+ *     - UDS_ALIGNLEFT, ~UDS_WRAP
+ *     - integers with thousand separators.
+ *   Even though the above list seems rather large, the control seems to
+ *   behave very well so I am confident it does work in most (all) of the
+ *   untested cases.
+ * Problems:
+ *   At the moment, the control will no draw itself very well because it
+ *   uses some features in DrawEdge that are not yet implemented. 
+ *   In other words, there is no known problem, exempt for the things in
+ *   the TODO list above.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include "windows.h"
+#include "winnls.h"
+#include "syscolor.h"
+#include "sysmetrics.h"
+#include "updown.h"
+#include "graphics.h"
+#include "heap.h"
+#include "win.h"
+#include "stddebug.h"
+/*#define  DEBUG_UPDOWN*/
+#include "debug.h"
+
+/* Control configuration constants */
+
+#define INITIAL_DELAY    500 /* initial timer until auto-increment kicks in */
+#define REPEAT_DELAY     50  /* delay between auto-increments */
+
+#define DEFAULT_WIDTH    10  /* default width of the ctrl */
+#define DEFAULT_XSEP     0   /* default separation between buddy and crtl */
+#define DEFAULT_ADDTOP   1   /* amount to extend above the buddy window */
+#define DEFAULT_ADDBOT   1   /* amount to extend below the buddy window */
+
+
+/* Work constants */
+
+#define FLAG_INCR        0x01
+#define FLAG_DECR        0x02
+#define FLAG_MOUSEIN     0x04
+#define FLAG_CLICKED     (FLAG_INCR | FLAG_DECR)
+
+#define TIMERID1         1
+#define TIMERID2         2
+
+static int accelIndex = -1;
+
+#define max(a,b) ((a)>(b)?(a):(b))
+#define min(a,b) ((a)<(b)?(a):(b))
+
+#define UNKNOWN_PARAM(msg, wParam, lParam) dprintf_updown(stddeb, \
+        "UpDown Ctrl: Unknown parameter(s) for message " #msg     \
+	"(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam);
+
+#define UPDOWN_GetInfoPtr(wndPtr) ((UPDOWN_INFO *)wndPtr->wExtra)
+
+/***********************************************************************
+ *           UPDOWN_InBounds
+ * Tests if a given value 'val' is between the Min&Max limits
+ */
+static BOOL32 UPDOWN_InBounds(WND *wndPtr, int val)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
+
+  if(infoPtr->MaxVal > infoPtr->MinVal)
+    return (infoPtr->MinVal <= val) && (val <= infoPtr->MaxVal);
+  else
+    return (infoPtr->MaxVal <= val) && (val <= infoPtr->MinVal);
+}
+
+/***********************************************************************
+ *           UPDOWN_OffsetVal
+ * Tests if we can change the current value by delta. If so, it changes
+ * it and returns TRUE. Else, it leaves it unchanged and returns FALSE.
+ */
+static BOOL32 UPDOWN_OffsetVal(WND *wndPtr, int delta)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
+
+  /* check if we can do the modification first */
+  if(!UPDOWN_InBounds(wndPtr, infoPtr->CurVal+delta)){
+    if(wndPtr->dwStyle & UDS_WRAP)
+      delta += (delta < 0 ? -1 : 1) *
+	(infoPtr->MaxVal < infoPtr->MinVal ? -1 : 1) *
+	(infoPtr->MinVal - infoPtr->MaxVal) +
+	(delta < 0 ? 1 : -1);
+    else
+      return FALSE;
+  }
+
+  infoPtr->CurVal += delta;
+  return TRUE;
+}
+
+/***********************************************************************
+ *           UPDOWN_GetArrawRect
+ * wndPtr   - pointer to the up-down wnd
+ * rect     - will hold the rectangle
+ * incr     - TRUE  get the "increment" rect (up or right)
+ *            FALSE get the "decrement" rect (down or left)
+ *          
+ */
+static void UPDOWN_GetArrowRect(WND *wndPtr, RECT32 *rect, BOOL32 incr)
+{
+  int len; /* will hold the width or height */
+
+  GetClientRect32(wndPtr->hwndSelf, rect);
+
+  if (wndPtr->dwStyle & UDS_HORZ) {
+    len = rect->right - rect->left; /* compute the width */
+    if (incr)
+      rect->left = len/2;
+    else
+      rect->right = len/2;
+  }
+  else {
+    len = rect->bottom - rect->top; /* compute the height */
+    if (incr)
+      rect->bottom = len/2;
+    else
+      rect->top = len/2;
+  }
+}
+
+/***********************************************************************
+ *           UPDOWN_GetArrowFromPoint
+ * Returns the rectagle (for the up or down arrow) that contains pt.
+ * If it returns the up rect, it returns TRUE.
+ * If it returns the down rect, it returns FALSE.
+ */
+static int UPDOWN_GetArrowFromPoint(WND *wndPtr, RECT32 *rect, POINT32 pt)
+{
+  UPDOWN_GetArrowRect(wndPtr, rect, TRUE);
+  if(PtInRect32(rect, pt))
+    return TRUE;
+
+  UPDOWN_GetArrowRect(wndPtr, rect, FALSE);
+  return FALSE;
+}
+
+
+/***********************************************************************
+ *           UPDOWN_GetThousandSep
+ * Returns the thousand sep. If an error occurs, it returns ','.
+ */
+static char UPDOWN_GetThousandSep()
+{
+  char sep[2];
+
+  if(GetLocaleInfo32A(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, 
+		      sep, sizeof(sep)) != 1)
+    return ',';
+
+  return sep[0];
+}
+
+/***********************************************************************
+ *           UPDOWN_GetBuddyInt
+ * Tries to read the pos from the buddy window and if it succeeds,
+ * it stores it in the control's CurVal
+ * returns:
+ *   TRUE  - if it read the integer from the buddy successfully
+ *   FALSE - if an error occured
+ */
+static BOOL32 UPDOWN_GetBuddyInt(WND *wndPtr)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
+  char txt[20], sep, *src, *dst;
+  int newVal;
+
+  if (!IsWindow32(infoPtr->Buddy))
+    return FALSE;
+
+  /*if the buddy is a list window, we must set curr index */
+  if(WIDGETS_IsControl32(WIN_FindWndPtr(infoPtr->Buddy), BIC32_LISTBOX)){
+    newVal = SendMessage32A(infoPtr->Buddy, LB_GETCARETINDEX32, 0, 0);
+    if(newVal < 0)
+      return FALSE;
+  }
+  else{
+    /* we have a regural window, so will get the text */
+    if (!GetWindowText32A(infoPtr->Buddy, txt, sizeof(txt)))
+      return FALSE;
+
+    sep = UPDOWN_GetThousandSep(); 
+
+    /* now get rid of the separators */
+    for(src = dst = txt; *src; src++)
+      if(*src != sep)
+	*dst++ = *src;
+    *dst = 0;
+
+    /* try to convert the number and validate it */
+    newVal = strtol(txt, &src, infoPtr->Base);
+    if(*src || !UPDOWN_InBounds(wndPtr, newVal)) 
+      return FALSE;
+
+    dprintf_updown(stddeb, "UpDown Ctrl: new value(%d) read from buddy "
+		   "(old=%d)\n",  newVal, infoPtr->CurVal);
+  }
+  
+  infoPtr->CurVal = newVal;
+  return TRUE;
+}
+
+
+/***********************************************************************
+ *           UPDOWN_SetBuddyInt
+ * Tries to set the pos to the buddy window based on current pos
+ * returns:
+ *   TRUE  - if it set the caption of the  buddy successfully
+ *   FALSE - if an error occured
+ */
+static BOOL32 UPDOWN_SetBuddyInt(WND *wndPtr)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
+  char txt1[20], sep;
+  int len;
+
+  if (!IsWindow32(infoPtr->Buddy)) 
+    return FALSE;
+
+  dprintf_updown(stddeb, "UpDown Ctrl: set new value(%d) to buddy.\n",
+		 infoPtr->CurVal);
+
+  /*if the buddy is a list window, we must set curr index */
+  if(WIDGETS_IsControl32(WIN_FindWndPtr(infoPtr->Buddy), BIC32_LISTBOX)){
+    SendMessage32A(infoPtr->Buddy, LB_SETCURSEL32, infoPtr->CurVal, 0);
+  }
+  else{ /* Regural window, so set caption to the number */
+    len = sprintf(txt1, (infoPtr->Base==16) ? "%X" : "%d", infoPtr->CurVal);
+
+    sep = UPDOWN_GetThousandSep(); 
+
+    if (!(wndPtr->dwStyle & UDS_NOTHOUSANDS)) {
+      char txt2[20], *src = txt1, *dst = txt2;
+      if(len%3 > 0){
+	strncpy(dst, src, len%3);
+	dst += len%3;
+	src += len%3;
+      }
+      for(len=0; *src; len++,src++){
+	if(len%3==0)
+	  *dst++ = sep;
+	*dst++ = *src++;
+      }
+      *dst = 0;           /* null terminate it */
+      strcpy(txt1, txt2); /* move it to the proper place */
+    }
+    SetWindowText32A(infoPtr->Buddy, txt1);
+  }
+
+  return TRUE;
+} 
+
+/***********************************************************************
+ *           UPDOWN_DrawArraw
+ * Draw the arrows for the up-down control. The arrows are drawn with the
+ * current pen and filled with the current brush.
+ * Input:
+ * hdc      - the DC to draw on
+ * rect     - rectangle holding the arrow
+ * incr     - TRUE  if we draw the "increment" arrow
+ *            FALSE if we draw the "decrement" arrow
+ * pressed  - TRUE  if the arrow is pressed (clicked)
+ *            FALSE if the arrow is not pressed (clicked)
+ * horz     - TRUE  if the arrow is horizontal
+ *            FLASE if the arrow is vertical
+ */
+static void UPDOWN_DrawArrow(HDC32 hdc, RECT32 *rect, BOOL32 incr, 
+			     BOOL32 pressed, BOOL32 horz)
+{
+  const int w = rect->right - rect->left;
+  const int h = rect->bottom - rect->top;
+  int offset = pressed ? 1 : 0, tmp;
+  POINT32 pts[3];
+
+  if(horz){ /* horizontal arrows */
+    pts[0].x = rect->right  - max(2, w/3) + offset;
+    pts[0].y = rect->top    + max(2, h/4) + offset;
+    pts[1].x = pts[0].x;
+    pts[1].y = rect->bottom - max(2, h/4) + offset;
+    pts[2].x = rect->left + w/3 + offset;
+    pts[2].y = (pts[0].y + pts[1].y)/2;
+    if(pts[2].x-2<rect->left)
+      pts[2].x = rect->left + 2;
+    if(pts[2].x <= pts[0].x)
+      pts[2].x = pts[0].x - 1;
+
+    if(incr){
+      tmp = pts[2].x;
+      pts[2].x = pts[0].x;
+      pts[0].x = pts[1].x = tmp;
+    }
+  }
+  else{                   /* vertical arrows */
+    pts[0].x = rect->left + max(2, w/4) + offset;
+    pts[0].y = rect->top  + max(2, h/3) + offset;
+    pts[1].x = rect->right- max(2, w/4) + offset;
+    pts[1].y = pts[0].y;
+    pts[2].x = (pts[0].x + pts[1].x)/2;
+    pts[2].y = pts[0].y + h/3 + offset;
+    if(pts[2].y+2>rect->bottom)
+      pts[2].y = rect->bottom - 2;
+    if(pts[2].y <= pts[0].y)
+      pts[2].y = pts[0].y + 1;
+
+    if(incr){
+      tmp = pts[2].y;
+      pts[2].y = pts[0].y;
+      pts[0].y = pts[1].y = tmp;
+    }
+  }
+  Polygon32(hdc, pts, 3);
+
+}
+
+/***********************************************************************
+ *           UPDOWN_Paint
+ * Draw the arrows. The background need not be erased.
+ */
+static void UPDOWN_Paint(WND *wndPtr)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
+  PAINTSTRUCT32 ps;
+  BOOL32 prssed;
+  RECT32 rect;
+  HDC32 hdc;
+  HBRUSH32 oldBrush;
+
+  hdc = BeginPaint32( wndPtr->hwndSelf, &ps );
+
+  /*FIXME - this is just for test */
+  /*      - when DrawEdge works properly, this should dissapear 
+	  as DrawEdge will erase the background */
+/*oldBrush = SelectObject32(hdc, GetStockObject32(GRAY_BRUSH));
+  GetClientRect32(wndPtr->hwndSelf, &rect);
+  Rectangle32(hdc, rect.left, rect.top, rect.right, rect.bottom);
+  SelectObject32(hdc, oldBrush);*/
+
+  /* First select the proper brush */
+  oldBrush = wndPtr->dwStyle & WS_DISABLED ? GRAY_BRUSH : BLACK_BRUSH;
+  oldBrush = SelectObject32(hdc, GetStockObject32(oldBrush));
+
+  /* Draw the incr button */
+  UPDOWN_GetArrowRect(wndPtr, &rect, TRUE);
+  prssed = (infoPtr->Flags & FLAG_INCR) && (infoPtr->Flags & FLAG_MOUSEIN);
+  DrawEdge32(hdc, &rect, prssed ? EDGE_SUNKEN : EDGE_RAISED, 
+	   BF_RECT | BF_SOFT | BF_MIDDLE);
+  UPDOWN_DrawArrow(hdc, &rect, TRUE, prssed, wndPtr->dwStyle & UDS_HORZ);
+		    
+  /* Draw the decr button */
+  UPDOWN_GetArrowRect(wndPtr, &rect, FALSE);
+  prssed = (infoPtr->Flags & FLAG_DECR) && (infoPtr->Flags & FLAG_MOUSEIN);
+  DrawEdge32(hdc, &rect, prssed ? EDGE_SUNKEN : EDGE_RAISED, 
+	   BF_RECT | BF_SOFT | BF_MIDDLE);
+  UPDOWN_DrawArrow(hdc, &rect, FALSE, prssed, wndPtr->dwStyle & UDS_HORZ);
+
+  /* clean-up */  
+  SelectObject32(hdc, oldBrush);
+  EndPaint32( wndPtr->hwndSelf, &ps );
+}
+
+/***********************************************************************
+ *           UPDOWN_SetBuddy
+ * Tests if 'hwndBud' is a valid window handle. If not, returns FALSE.
+ * Else, sets it as a new Buddy.
+ * Then, it should subclass the buddy 
+ * If window has the UDS_ARROWKEYS, it subcalsses the buddy window to
+ * process the UP/DOWN arrow keys.
+ * If window has the UDS_ALIGNLEFT or UDS_ALIGNRIGHT style
+ * the size/pos of the buddy and the control are adjusted accordingly.
+ */
+static BOOL32 UPDOWN_SetBuddy(WND *wndPtr, HWND32 hwndBud)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr); 
+  RECT32 budRect; /* new coord for the buddy */
+  int x;          /* new x position and width for the up-down */
+ 	  
+  /* Is is a valid bud? */
+  if(!IsWindow32(hwndBud))
+    return FALSE;
+
+  if(wndPtr->dwStyle & UDS_ARROWKEYS){
+    /* FIXME: we need to subclass the buddy to process the arrow keys. */
+    fprintf(stderr, "UpDown Ctrl: we should subclass the buddy window!\n");
+  }
+
+  /* do we need to do any adjustments? */
+  if(!(wndPtr->dwStyle & (UDS_ALIGNLEFT | UDS_ALIGNRIGHT)))
+    return TRUE;
+
+  /* Get the rect of the buddy relative to its parent */
+  GetWindowRect32(infoPtr->Buddy, &budRect);
+  MapWindowPoints32(HWND_DESKTOP, GetParent32(infoPtr->Buddy),
+		  (POINT32 *)(&budRect.left), 2);
+	  
+  /* now do the positioning */
+  if(wndPtr->dwStyle & UDS_ALIGNRIGHT){
+    budRect.right -= DEFAULT_WIDTH+DEFAULT_XSEP;
+    x  = budRect.right+DEFAULT_XSEP;
+  }
+  else{ /* UDS_ALIGNLEFT */
+    x  = budRect.left;
+    budRect.left += DEFAULT_WIDTH+DEFAULT_XSEP;
+  }
+
+  /* first adjust the buddy to accomodate the up/down */
+  SetWindowPos32(infoPtr->Buddy, 0, budRect.left, budRect.top,
+	       budRect.right  - budRect.left, budRect.bottom - budRect.top, 
+	       SWP_NOACTIVATE|SWP_NOZORDER);
+
+  /* now position the up/down */
+  /* Since the UDS_ALIGN* flags were used, */
+  /* we will pick the position and size of the window. */
+  SetWindowPos32(wndPtr->hwndSelf,0,x,budRect.top-DEFAULT_ADDTOP,DEFAULT_WIDTH,
+		 (budRect.bottom-budRect.top)+DEFAULT_ADDTOP+DEFAULT_ADDBOT,
+		 SWP_NOACTIVATE|SWP_NOZORDER); 
+
+  return TRUE;
+}	  
+
+/***********************************************************************
+ *           UPDOWN_DoAction
+ *
+ * This function increments/decrements the CurVal by the 
+ * 'delta' amount according to the 'incr' flag
+ * It notifies the parent as required.
+ * It handles wraping and non-wraping correctly.
+ * It is assumed that delta>0
+ */
+static void UPDOWN_DoAction(WND *wndPtr, int delta, BOOL32 incr)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr); 
+  int old_val = infoPtr->CurVal;
+  NM_UPDOWN ni;
+
+  dprintf_updown(stddeb, "UpDown Ctrl action: %s by %d\n",
+		 incr ? "inc" : "dec", delta);
+
+  /* check if we can do the modification first */
+  delta *= (incr ? 1 : -1) * (infoPtr->MaxVal < infoPtr->MinVal ? -1 : 1);
+  if(!UPDOWN_OffsetVal(wndPtr, delta))
+    return;
+
+  /* so, if we can do the change, recompute delta and restore old value */
+  delta = infoPtr->CurVal - old_val;
+  infoPtr->CurVal = old_val;
+
+  /* We must notify parent now to obtain permission */
+  ni.iPos = infoPtr->CurVal;
+  ni.iDelta = delta;
+  ni.hdr.hwndFrom = wndPtr->hwndSelf;
+  ni.hdr.idFrom = wndPtr->wIDmenu;
+  ni.hdr.code = UDN_DELTAPOS; 
+  if(SendMessage32A(wndPtr->parent->hwndSelf, 
+		    WM_NOTIFY, wndPtr->wIDmenu, (LPARAM)&ni))
+    return; /* we are not allowed to change */
+  
+  /* Now adjust value with (maybe new) delta */
+  if(!UPDOWN_OffsetVal(wndPtr, ni.iDelta))
+    return;
+
+  /* Now take care about our buddy */
+  if(!IsWindow32(infoPtr->Buddy)) 
+    return; /* Nothing else to do */
+
+
+  if(wndPtr->dwStyle & UDS_SETBUDDYINT)
+    UPDOWN_SetBuddyInt(wndPtr);
+
+  /* Also, notify it */
+  /* FIXME: do we need to send the notification only if
+            we do not have the UDS_SETBUDDYINT style set? */
+  SendMessage32A(infoPtr->Buddy, 
+		 wndPtr->dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL, 
+		 MAKELONG(incr ? SB_LINEUP : SB_LINEDOWN, infoPtr->CurVal),
+		 wndPtr->hwndSelf);
+}
+
+/***********************************************************************
+ *           UPDOWN_IsEnabled
+ *
+ * Returns TRUE if it is enabled as well as its buddy (if any)
+ *         FALSE otherwise
+ */
+static BOOL32 UPDOWN_IsEnabled(WND *wndPtr)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
+
+  if(wndPtr->dwStyle & WS_DISABLED)
+    return FALSE;
+  return IsWindowEnabled32(infoPtr->Buddy);
+}
+
+/***********************************************************************
+ *           UPDOWN_CancelMode
+ *
+ * Deletes any timers, releases the mouse and does  redraw if necessary.
+ * If the control is not in "capture" mode, it does nothing.
+ * If the control was not in cancel mode, it returns FALSE. 
+ * If the control was in cancel mode, it returns TRUE.
+ */
+static BOOL32 UPDOWN_CancelMode(WND *wndPtr)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
+ 
+  /* if not in 'capture' mode, do nothing */
+  if(!(infoPtr->Flags & FLAG_CLICKED))
+    return FALSE;
+
+  KillTimer32(wndPtr->hwndSelf, TIMERID1); /* kill all possible timers */
+  KillTimer32(wndPtr->hwndSelf, TIMERID2);
+  
+  if(GetCapture32() == wndPtr->hwndSelf)   /* let the mouse go         */
+    ReleaseCapture();          /* if we still have it      */  
+  
+  infoPtr->Flags = 0;          /* get rid of any flags     */
+  UPDOWN_Paint(wndPtr);        /* redraw the control just in case */
+  
+  return TRUE;
+}
+
+/***********************************************************************
+ *           UPDOWN_HandleMouseEvent
+ *
+ * Handle a mouse event for the updown.
+ * 'pt' is the location of the mouse event in client or
+ * windows coordinates. 
+ */
+static void UPDOWN_HandleMouseEvent(WND *wndPtr, UINT32 msg, POINT32 pt)
+{
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
+  RECT32 rect;
+  int temp;
+
+  switch(msg)
+    {
+    case WM_LBUTTONDOWN:  /* Initialise mouse tracking */
+      /* If we are already in the 'clicked' mode, then nothing to do */
+      if(infoPtr->Flags & FLAG_CLICKED)
+	return;
+
+      /* If the buddy is an edit, will set focus to it */
+      if(WIDGETS_IsControl32(WIN_FindWndPtr(infoPtr->Buddy), BIC32_EDIT))
+	SetFocus32(infoPtr->Buddy);
+
+      /* Now see which one is the 'active' arrow */
+      temp = UPDOWN_GetArrowFromPoint(wndPtr, &rect, pt);
+
+      /* Update the CurVal if necessary */
+      if(wndPtr->dwStyle & UDS_SETBUDDYINT)
+	UPDOWN_GetBuddyInt(wndPtr);
+	
+      /* Before we proceed, see if we can spin... */
+      if(!(wndPtr->dwStyle & UDS_WRAP))
+	if(( temp && infoPtr->CurVal==infoPtr->MaxVal) ||
+	   (!temp && infoPtr->CurVal==infoPtr->MinVal))
+	  return;
+
+      /* Set up the correct flags */
+      infoPtr->Flags  = 0; 
+      infoPtr->Flags |= temp ? FLAG_INCR : FLAG_DECR;
+      infoPtr->Flags |= FLAG_MOUSEIN;
+      
+      /* repaint the control */
+      UPDOWN_Paint(wndPtr);
+
+      /* process the click */
+      UPDOWN_DoAction(wndPtr, 1, infoPtr->Flags & FLAG_INCR);
+
+      /* now capture all mouse messages */
+      SetCapture32(wndPtr->hwndSelf);
+
+      /* and startup the first timer */
+      SetTimer32(wndPtr->hwndSelf, TIMERID1, INITIAL_DELAY, 0); 
+      break;
+
+    case WM_MOUSEMOVE:
+      /* If we are not in the 'clicked' mode, then nothing to do */
+      if(!(infoPtr->Flags & FLAG_CLICKED))
+	return;
+
+      /* save the flags to see if any got modified */
+      temp = infoPtr->Flags;
+
+      /* Now get the 'active' arrow rectangle */
+      if (infoPtr->Flags & FLAG_INCR)
+	UPDOWN_GetArrowRect(wndPtr, &rect, TRUE);
+      else
+	UPDOWN_GetArrowRect(wndPtr, &rect, FALSE);
+
+      /* Update the flags if we are in/out */
+      if(PtInRect32(&rect, pt))
+	infoPtr->Flags |=  FLAG_MOUSEIN;
+      else{
+	infoPtr->Flags &= ~FLAG_MOUSEIN;
+	if(accelIndex != -1) /* if we have accel info */
+	  accelIndex = 0;    /* reset it              */
+      }
+      /* If state changed, redraw the control */
+      if(temp != infoPtr->Flags)
+	UPDOWN_Paint(wndPtr);
+      break;
+
+      default:
+	fprintf(stderr, "UpDown: Impossible case in proc "
+		"UPDOWN_HandleMouseEvent");
+    }
+
+}
+
+/***********************************************************************
+ *           UpDownWndProc
+ */
+LRESULT WINAPI UpDownWindowProc(HWND32 hwnd, UINT32 message, WPARAM32 wParam,
+                                LPARAM lParam)
+{
+  WND *wndPtr = WIN_FindWndPtr(hwnd);
+  UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr); 
+  int temp;
+
+  switch(message)
+    {
+    case WM_CREATE:
+      /* initialize the info struct */
+      infoPtr->AccelCount=0; infoPtr->AccelVect=0; 
+      infoPtr->CurVal=0; infoPtr->MinVal=0; infoPtr->MaxVal=100; /*FIXME*/
+      infoPtr->Base  = 10; /* Default to base 10  */
+      infoPtr->Buddy = 0;  /* No buddy window yet */
+      infoPtr->Flags = 0;  /* And no flags        */
+
+      /* Do we pick the buddy win ourselves? */
+      if(wndPtr->dwStyle & UDS_AUTOBUDDY)
+	UPDOWN_SetBuddy(wndPtr, GetWindow32(wndPtr->hwndSelf, GW_HWNDPREV));
+	
+      dprintf_updown(stddeb, "UpDown Ctrl creation, hwnd=%04x\n", hwnd);
+      break;
+    
+    case WM_DESTROY:
+      if(infoPtr->AccelVect)
+	free(infoPtr->AccelVect);
+      dprintf_updown(stddeb, "UpDown Ctrl destruction, hwnd=%04x\n", hwnd);
+      break;
+	
+    case WM_ENABLE:
+      if(wndPtr->dwStyle & WS_DISABLED)
+	UPDOWN_CancelMode(wndPtr);
+      UPDOWN_Paint(wndPtr);
+      break;
+
+    case WM_TIMER:
+      /* if initial timer, kill it and start the repeat timer */
+      if(wParam == TIMERID1){
+	KillTimer32(hwnd, TIMERID1);
+	/* if no accel info given, used default timer */
+	if(infoPtr->AccelCount==0 || infoPtr->AccelVect==0){
+	  accelIndex = -1;
+	  temp = REPEAT_DELAY;
+	}
+	else{
+	  accelIndex = 0; /* otherwise, use it */
+	  temp = infoPtr->AccelVect[accelIndex].nSec * 1000 + 1;
+	}
+	SetTimer32(hwnd, TIMERID2, temp, 0);
+      }
+
+      /* now, if the mouse is above us, do the thing...*/
+      if(infoPtr->Flags & FLAG_MOUSEIN){
+	temp = accelIndex==-1 ? 1 : infoPtr->AccelVect[accelIndex].nInc;
+	UPDOWN_DoAction(wndPtr, temp, infoPtr->Flags & FLAG_INCR);
+	
+	if(accelIndex!=-1 && accelIndex < infoPtr->AccelCount-1){
+	  KillTimer32(hwnd, TIMERID2);
+	  accelIndex++; /* move to the next accel info */
+	  temp = infoPtr->AccelVect[accelIndex].nSec * 1000 + 1;
+	  /* make sure we have at least 1ms intervals */
+	  SetTimer32(hwnd, TIMERID2, temp, 0);	    
+	}
+      }
+      break;
+
+    case WM_CANCELMODE:
+      UPDOWN_CancelMode(wndPtr);
+      break;
+
+    case WM_LBUTTONUP:
+      if(!UPDOWN_CancelMode(wndPtr))
+	break;
+      /*If we released the mouse and our buddy is an edit */
+      /* we must select all text in it.                   */
+      if(WIDGETS_IsControl32(WIN_FindWndPtr(infoPtr->Buddy), BIC32_EDIT))
+	SendMessage32A(infoPtr->Buddy, EM_SETSEL32, 0, MAKELONG(0, -1));
+      break;
+      
+    case WM_LBUTTONDOWN:
+    case WM_MOUSEMOVE:
+      if(UPDOWN_IsEnabled(wndPtr)){
+	POINT32 pt;
+	CONV_POINT16TO32( (POINT16 *)&lParam, &pt );
+	UPDOWN_HandleMouseEvent( wndPtr, message, pt );
+      }
+    break;
+
+    case WM_KEYDOWN:
+      if((wndPtr->dwStyle & UDS_ARROWKEYS) && UPDOWN_IsEnabled(wndPtr)){
+	switch(wParam){
+	case VK_UP:  
+	case VK_DOWN:
+	  UPDOWN_GetBuddyInt(wndPtr);
+	  UPDOWN_DoAction(wndPtr, 1, wParam==VK_UP);
+	  break;
+	}
+      }
+      break;
+      
+    case WM_PAINT:
+      UPDOWN_Paint(wndPtr);
+      break;
+    
+    case UDM_GETACCEL:
+      if (wParam==0 && lParam==0)    /*if both zero, */
+	return infoPtr->AccelCount;  /*just return the accel count*/
+      if (wParam || lParam){
+	UNKNOWN_PARAM(UDM_GETACCEL, wParam, lParam);
+	return 0;
+      }
+      temp = min(infoPtr->AccelCount, wParam);
+      memcpy((void *)lParam, infoPtr->AccelVect, temp*sizeof(UDACCEL));
+      return temp;
+
+    case UDM_SETACCEL:
+      dprintf_updown(stddeb, "UpDown Ctrl new accel info, hwnd=%04x\n", hwnd);
+      if(infoPtr->AccelVect){
+	free(infoPtr->AccelVect);
+	infoPtr->AccelCount = 0;
+	infoPtr->AccelVect  = 0;
+      }
+      if(wParam==0)
+	return TRUE;
+      infoPtr->AccelVect = malloc(wParam*sizeof(UDACCEL));
+      if(infoPtr->AccelVect==0)
+	return FALSE;
+      memcpy(infoPtr->AccelVect, (void*)lParam, wParam*sizeof(UDACCEL));
+      return TRUE;
+
+    case UDM_GETBASE:
+      if (wParam || lParam)
+	UNKNOWN_PARAM(UDM_GETBASE, wParam, lParam);
+      return infoPtr->Base;
+
+    case UDM_SETBASE:
+      dprintf_updown(stddeb, "UpDown Ctrl new base(%d), hwnd=%04x\n", 
+		     wParam, hwnd);
+      if ( !(wParam==10 || wParam==16) || lParam)
+	UNKNOWN_PARAM(UDM_SETBASE, wParam, lParam);
+      if (wParam==10 || wParam==16){
+	temp = infoPtr->Base;
+	infoPtr->Base = wParam;
+	return temp;       /* return the prev base */
+      }
+      break;
+
+    case UDM_GETBUDDY:
+      if (wParam || lParam)
+	UNKNOWN_PARAM(UDM_GETBUDDY, wParam, lParam);
+      return infoPtr->Buddy;
+
+    case UDM_SETBUDDY:
+      if (lParam)
+	UNKNOWN_PARAM(UDM_SETBUDDY, wParam, lParam);
+      temp = infoPtr->Buddy;
+      infoPtr->Buddy = wParam;
+      UPDOWN_SetBuddy(wndPtr, wParam);
+      dprintf_updown(stddeb, "UpDown Ctrl new buddy(%04x), hwnd=%04x\n", 
+		     infoPtr->Buddy, hwnd);
+      return temp;
+
+    case UDM_GETPOS:
+      if (wParam || lParam)
+	UNKNOWN_PARAM(UDM_GETPOS, wParam, lParam);
+      temp = UPDOWN_GetBuddyInt(wndPtr);
+      return MAKELONG(infoPtr->CurVal, temp ? 0 : 1);
+
+    case UDM_SETPOS:
+      if (wParam || HIWORD(lParam))
+	UNKNOWN_PARAM(UDM_GETPOS, wParam, lParam);
+      temp = SLOWORD(lParam);
+      dprintf_updown(stddeb, "UpDown Ctrl new value(%d), hwnd=%04x\n",
+		     temp, hwnd);
+      if(!UPDOWN_InBounds(wndPtr, temp)){
+	if(temp < infoPtr->MinVal)  
+	  temp = infoPtr->MinVal;
+	if(temp > infoPtr->MaxVal)
+	  temp = infoPtr->MaxVal;
+      }
+      wParam = infoPtr->CurVal; /* save prev value   */
+      infoPtr->CurVal = temp;   /* set the new value */
+      if(wndPtr->dwStyle & UDS_SETBUDDYINT)
+	UPDOWN_SetBuddyInt(wndPtr);
+      return wParam;            /* return prev value */
+      
+    case UDM_GETRANGE:
+      if (wParam || lParam)
+	UNKNOWN_PARAM(UDM_GETRANGE, wParam, lParam);
+      return MAKELONG(infoPtr->MaxVal, infoPtr->MinVal);
+
+    case UDM_SETRANGE:
+      if (wParam)
+	UNKNOWN_PARAM(UDM_SETRANGE, wParam, lParam); /* we must have:     */
+      infoPtr->MaxVal = SLOWORD(lParam); /* UD_MINVAL <= Max <= UD_MAXVAL */
+      infoPtr->MinVal = SHIWORD(lParam); /* UD_MINVAL <= Min <= UD_MAXVAL */
+                                         /* |Max-Min| <= UD_MAXVAL        */
+      dprintf_updown(stddeb, "UpDown Ctrl new range(%d to %d), hwnd=%04x\n", 
+		     infoPtr->MinVal, infoPtr->MaxVal, hwnd);
+      break;                             
+
+    default: 
+      if (message >= WM_USER) 
+	fprintf( stderr, "UpDown Ctrl: unknown msg %04x wp=%04x lp=%08lx\n", 
+		 message, wParam, lParam );
+      return DefWindowProc32A( hwnd, message, wParam, lParam ); 
+    } 
+
+    return 0;
+}
+
+/***********************************************************************
+ *           CreateUpDownControl  (COMCTL32.14)
+ */
+HWND32 WINAPI CreateUpDownControl( DWORD style, INT32 x, INT32 y,
+                                   INT32 cx, INT32 cy, HWND32 parent,
+                                   INT32 id, HINSTANCE32 inst, HWND32 buddy,
+                                   INT32 maxVal, INT32 minVal, INT32 curVal )
+{
+  HWND32 hUD = CreateWindow32A(UPDOWN_CLASS32A, 0, style, x, y, cx, cy,
+			       parent, id, inst, 0);
+  if(hUD){
+    SendMessage32A(hUD, UDM_SETBUDDY, buddy, 0);
+    SendMessage32A(hUD, UDM_SETRANGE, 0, MAKELONG(maxVal, minVal));
+    SendMessage32A(hUD, UDM_SETPOS, 0, MAKELONG(curVal, 0));     
+  }
+
+  return hUD;
+}
diff --git a/controls/widgets.c b/controls/widgets.c
index 20fe5a5..c8b9990 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -12,6 +12,7 @@
 #include "static.h"
 #include "status.h"
 #include "scroll.h"
+#include "updown.h"
 #include "desktop.h"
 #include "mdi.h"
 #include "gdi.h"
@@ -20,18 +21,18 @@
 
 /* Window procedures */
 
-extern LRESULT EditWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
-                            LPARAM lParam );
-extern LRESULT ComboWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
-                             LPARAM lParam );
-extern LRESULT ComboLBWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
-                               LPARAM lParam );
-extern LRESULT ListBoxWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
-                               LPARAM lParam );
-extern LRESULT PopupMenuWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
-                                 LPARAM lParam );
-extern LRESULT IconTitleWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
-				 LPARAM lParam );
+extern LRESULT WINAPI EditWndProc( HWND32 hwnd, UINT32 msg,
+                                   WPARAM32 wParam, LPARAM lParam );
+extern LRESULT WINAPI ComboWndProc( HWND32 hwnd, UINT32 msg,
+                                    WPARAM32 wParam, LPARAM lParam );
+extern LRESULT WINAPI ComboLBWndProc( HWND32 hwnd, UINT32 msg,
+                                      WPARAM32 wParam, LPARAM lParam );
+extern LRESULT WINAPI ListBoxWndProc( HWND32 hwnd, UINT32 msg,
+                                      WPARAM32 wParam, LPARAM lParam );
+extern LRESULT WINAPI PopupMenuWndProc( HWND32 hwnd, UINT32 msg,
+                                        WPARAM32 wParam, LPARAM lParam );
+extern LRESULT WINAPI IconTitleWndProc( HWND32 hwnd, UINT32 msg,
+                                        WPARAM32 wParam, LPARAM lParam );
 
 /* Win16 class info */
 
@@ -102,6 +103,8 @@
 {
     { CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW, StatusWindowProc, 0,
       sizeof(STATUSWINDOWINFO), 0, 0, 0, 0, 0, STATUSCLASSNAME32A },
+    { CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW, UpDownWindowProc, 0,
+      sizeof(UPDOWN_INFO), 0, 0, 0, 0, 0, UPDOWN_CLASS32A }
 };
 
 #define NB_COMMON_CONTROLS32 \
@@ -160,7 +163,7 @@
 /***********************************************************************
  *           InitCommonControls   (COMCTL32.15)
  */
-void InitCommonControls(void)
+void WINAPI InitCommonControls(void)
 {
     int i;
     char name[30];
diff --git a/debugger/dbg.y b/debugger/dbg.y
index cc6d35d..39541c1 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -504,8 +504,10 @@
 	    DEBUG_SilentBackTrace();
 	}
 
-	if( signal != SIGTRAP )
-	  {
+	if ((signal != SIGTRAP) ||
+            (dbg_exec_mode == EXEC_STEPI_OVER) ||
+            (dbg_exec_mode == EXEC_STEPI_INSTR))
+        {
 	    /* Show where we crashed */
 	    curr_frame = 0;
 	    DEBUG_PrintAddress( &addr, dbg_mode, TRUE );
@@ -515,7 +517,7 @@
 		DEBUG_Disasm( &addr, TRUE );
 		fprintf(stderr,"\n");
 	      }
-	  }
+        }
 
         ret_ok = 0;
         do
diff --git a/documentation/fonts b/documentation/fonts
index 00ef738..32ac06c 100644
--- a/documentation/fonts
+++ b/documentation/fonts
@@ -2,7 +2,7 @@
 How To Convert Windows Fonts
 ============================
 
-If you have access to Windows installation you should use 
+If you have access to a Windows installation you should use 
 fnt2bdf utility (found in the 'tools)' directory to convert
 bitmap fonts (VGASYS.FON, SSERIFE.FON, and SERIFE.FON) into 
 the format that X Window System can recognize. 
@@ -21,18 +21,21 @@
 	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 
+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. Also, some applications try to load
-their custom fonts on the fly (WinWord 6.0) and since Wine does
+WINE can get by without these fonts but 'the look and feel'
+may 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 )
+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.
+any bitmap fonts and fnt2bdf will fail if this is the case. Also
+note that although the above message will not disappear WINE will
+work around the problem by using the font you extracted from the
+SOMEFILE.FON.
 
 What to do with TrueType fonts? There are several commercial
 font tools that can convert them to the Type1 format but the 
@@ -44,53 +47,75 @@
 via FreeType renderer in the future (hint, hint :-)
 
 
-WINE.CONF And Font Mapper
-=========================
+How To Add Font Aliases To WINE.CONF
+====================================
 
 Many Windows applications assume that fonts included in original Windows 3.1 
-distribution (Arial, Times New Roman, MS Sans Serif, etc.) are always present. 
-In order to make font mapper choose a closely related font you can add aliases
-to the [fonts] section.
+distribution are always present. By default Wine creates a number of aliases
+that map them on the existing X fonts:
+
+Windows font		...is mapped to...	X font
+
+"MS Sans Serif"			->		"-adobe-helvetica-"
+"MS Serif"			->		"-bitstream-charter-"
+"Times New Roman"		->		"-adobe-times-"
+"Arial"				->		"-adobe-helvetica-"
+
+There is no default alias for the "System" font. Also, no aliases are 
+created for the fonts that applications install at runtime. The recommended 
+way to deal with this problem is to convert the missing font (see above). 
+If it proves impossible, like in the case with TrueType fonts, you can force 
+the font mapper to choose a closely related X font by adding an alias to the 
+[fonts] section. Make sure that the X font actually exists (with xfontsel
+tool).
 
 AliasN = [Windows font], [X font] <, optional "mask X font" flag>
 
 Example:
 
-Alias0 = System, --international-, mask
-Alias1 = Arial, -adobe-helvetica-
-Alias2 = Times New Roman, -adobe-times-
+Alias0 = System, --international-, subst
+Alias1 = ...
 ...
 
 Comments:
-    There must be no gaps in the sequence {0, ..., N} otherwise all aliases
+*   There must be no gaps in the sequence {0, ..., N} otherwise all aliases
     after the first gap won't be read.
 
-    Usually font mapper translates X font names into font names visible to
+*   Usually font mapper translates X font names into font names visible to
     Windows programs in the following fashion:
 
-    X font			Converted name
+    X font		...will show up as...		Extracted name
 
-    -adobe-helvetica-...	"Helvetica"
-    -adobe-utopia-...		"Utopia"
-    -misc-fixed-...		"Fixed"
+    --international-...		->			"International"
+    -adobe-helvetica-...	->			"Helvetica"
+    -adobe-utopia-...		->			"Utopia"
+    -misc-fixed-...		->			"Fixed"
     -...
-    -sony-fixed-...		"Sony Fixed"  (already have "Fixed")
+    -sony-fixed-...		->			"Sony Fixed" 
     -...
 
-    Only converted names appear in the font selection dialogs. However, 
-    if there is an alias with the "mask" flag set converted name will be 
-    replaced by this alias.
+    Note that since -misc-fixed- and -sony-fixed- are different fonts
+    Wine modified the second extracted name to make sure Windows programs
+    can distinguish them because only extracted names appear in the font 
+    selection dialogs. 
+ 
+*   "Masking" alias replaces the original extracted name so that in the 
+    example case we will have the following mapping:
 
-    --international-		"System"
+    --international-		->			"System"
 
-    Nonmasking aliases are translated only when program asks for a font
-    with the name that matches an alias.
+    "Nonmasking" aliases are transparent to the user and they do not 
+    replace extracted names.
 
-    If you do not have an access to Windows fonts mentioned in the first 
-    paragraph you should try to substitute them with similar X fonts.
+    Wine discards an alias when it sees that the native X font is
+    available.
+
+*   If you do not have access to Windows fonts mentioned in the first 
+    paragraph you should try to substitute the "System" font with 
+    nonmasking alias. 'xfontsel' will show you the fonts available to
+    X.
 
     Alias.. = System, ...bold font without serifs
-    Alias.. = MS Sans Serif, ...helvetica-like font
 
 Also, some Windows applications request fonts without specifying the 
 typeface name of the font. Font table starts with Arial in most Windows 
@@ -106,15 +131,16 @@
     It is better to have a scalable font family (bolds and italics included) 
     as the default choice because mapper checks all available fonts until 
     requested height and other attributes match perfectly or the end of the 
-    font table is reached.
+    font table is reached. Typical X installations have scalable fonts in
+    the ../fonts/Type1 and ../fonts/Speedo directories.
 
 
-Cached Font Metrics
-===================
+How To Manage Cached Font Metrics
+=================================
 
 WINE stores detailed information about available fonts in the ~/.wine/.cachedmetrics
 file. You can copy it elsewhere and add this entry to the [fonts] section 
-in the WINE.CONF:
+in your WINE.CONF:
 
 FontMetrics = <file with metrics>
 
@@ -122,3 +148,27 @@
 metrics from scratch and then it will overwrite ~/.wine/.cachedmetrics with 
 the new information. This process can take a while.
 
+
+Too Small Or Too Large Fonts
+============================
+
+Windows programs may ask WINE to render a font with the height specified
+in points. However, point-to-pixel ratio depends on the real physical size 
+of your display (15", 17", etc...). X tries to provide an estimate of that 
+but it can be quite different from the actual size. You can change this
+ratio by adding the following entry to the [fonts] section:
+
+Resolution = <integer value>
+
+In general, higher numbers give you larger fonts. Try to experiment with
+values in the 60 - 120 range. 96 is a good starting point.
+
+
+"FONT_Init: failed to load ..." Messages On Startup
+===================================================
+
+The most likely cause is a broken fonts.dir file in one of your font
+directories. You need to rerun 'mkfontdir' to rebuild this file. Read
+its manpage for more information.
+
+
diff --git a/documentation/wine.texinfo b/documentation/wine.texinfo
index a530871..1395c61 100644
--- a/documentation/wine.texinfo
+++ b/documentation/wine.texinfo
@@ -45,12 +45,14 @@
 
 @sp 4
 FIXME: UNIX and POSIX trademarks. @*
-DOS @*
 X11 @*
-MS-Windows, Windows-NT, Windows 95 are registered trademarks of
-Microsoft Corp. Postscript is a registered trademark of Adobe Systems
-Inc. All other product names mentioned herein are the trademarks of
-their respective owners.
+Microsoft, Windows, MS-Windows, Windows-NT, Windows 95, and MS-DOS are
+registered trademarks of Microsoft Corporation.
+NT is a trademark of Northern Telecom Limited.
+C++Builder is a trademark of Borland International, Inc.
+Postscript is a registered trademark of Adobe Systems Inc.
+Other trademarks are the property of their respective owners, which may
+be registered in certain jurisdictions.
 @end ifinfo
 
 @c begin chapters on right pages
@@ -60,7 +62,7 @@
 @sp 10
 
 @center @titlefont{The Wine Reference Manual}
-@center Edition 0.0.2, 21 July 1997
+@center Edition 0.0.3, 14 August 1997
 
 
 @c The following two commands start the copyright page.
@@ -81,10 +83,14 @@
 
 @sp 4
 FIXME: UNIX and POSIX trademarks. @*
-MS-Windows, Windows-NT, Windows 95 are registered trademarks of
-Microsoft Corp. Postscript is a registered trademark of Adobe Systems
-Inc. All other product names mentioned herein are the trademarks of
-their respective owners.
+X11 @*
+Microsoft, Windows, MS-Windows, Windows-NT, Windows 95, and MS-DOS are
+registered trademarks of Microsoft Corporation.
+NT is a trademark of Northern Telecom Limited.
+C++Builder is a trademark of Borland International, Inc.
+Postscript is a registered trademark of Adobe Systems Inc.
+Other trademarks are the property of their respective owners, which may
+be registered in certain jurisdictions.
 @end titlepage
 
 
@@ -95,12 +101,12 @@
 
 @c Edit this macro manually in the above parts of the document
 @macro winemanualversion
-0.0.2
+0.0.3
 @end macro
 
 @c Edit this macro manually in the above parts of the document
 @macro winemanualdate
-21 July 1997
+14 August 1997
 @end macro
 
 @c Edit this macro manually into the TeX titlepage
@@ -136,6 +142,11 @@
 @end macro
 
 @c FIXME: automatical trademark reference
+@macro WINNT40
+Windows NT 4.0
+@end macro
+
+@c FIXME: automatical trademark reference
 @macro WIN95
 Windows 95
 @end macro
@@ -409,12 +420,12 @@
 @file{RELEASE-NOTES}, @file{BUGS}, @file{LICENSE}, and @file{WARRANTY},
 in the root directory of the Wine distribution.
 
-The Wine FAQ, available from
-@url{ftp://ftp.asgardpro.com/wine/dave/Wine.FAQ},
-@url{ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/Wine.FAQ},
-@url{ftp://rtfm.mit.edu/pub/usenet-by-group/comp.emulators.ms-windows.wine/WINE_(WINdows_Emulator)_Frequently_Asked_Questions},
-@url{ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/Wine.FAQ},
-@url{http://www.asgardpro.com/wine/index.html},
+The Wine FAQ, available from @*
+@url{ftp://ftp.asgardpro.com/wine/dave/Wine.FAQ}, @*
+@url{ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/Wine.FAQ}, @*
+@url{ftp://rtfm.mit.edu/pub/usenet-by-group/comp.emulators.ms-windows.wine/WINE_(WINdows_Emulator)_Frequently_Asked_Questions}, @*
+@url{ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/Wine.FAQ}, @*
+@url{http://www.asgardpro.com/wine/index.html}, @*
 gives answer to a lot of questions.
 
 The Wine USENET newsgroup is interesting for developers. It discusses technical
@@ -702,8 +713,10 @@
 The file is a directory. (Wine value: 0x0010).
 @end defvr
 @defvr_cw32 FILE_ATTRIBUTE_ARCHIVE
-The file is an archive file. All non-directory files are reported by Wine 
-to have this attribute. (Wine value: 0x0020).
+The file is an archive file. Currently, all non-directory files are
+reported by Wine to have this attribute. This attribute is normally set
+by @mswindows{} to indicate that a file is to be archived; when the file
+is archived, the flag is cleared. (Wine value: 0x0020).
 @end defvr
 @defvr_cw32 FILE_ATTRIBUTE_NORMAL
 The file does not have any other attributes set. This value must be used
@@ -948,7 +961,21 @@
 name is the common usage, some program parts (notably DLL's themselves)
 sometimes refer to DLL entries by ordinal. Therefore, the ordinals
 cannot be chosen arbitrarily.
-@* FIXME: is that correct?
+
+Regular programs that are compiled and linked against @mswindows{} DLL's
+will import DLL functions by name. This is therefore the default
+behaviour. Most DLL functions will be imported by name in all cases.
+Apparently, the @WIN32{} DLL's even show some difference in the mapping
+of functions and ordinals on @WINNT{} and @WIN95{}. For most DLL
+functions, the ordinal number will not matter.
+
+There are some exceptions to that. Notable the KERNEL32 ordinals below
+100 are (presently) unnamed and undocumented functions which can only be
+imported by ordinal. These functions are called by some @mswindows{}
+programs. Also the @file{shell32.dll} functions are reported to be
+imported by ordinal in some other DLL's.
+
+@xref{Getting information on the API}, for sources of further information.
 
 @node Spec file header, Variable entry points, Ordinals, The spec files
 @subsubsection The header of a @file{.spec}-file
@@ -1034,7 +1061,8 @@
 @item register
 A function using CPU registers to pass arguments.
 @item stdcall
-A normal @WIN32{} function.
+A normal @WIN32{} function. @xref{Investigating the undocumented API},
+for an explanation of the stdcall calling convention.
 @item cdecl
 A @WIN32{} function using the C calling conventions. (This is presently
 only used for the built-in functions of the C runtime system).
@@ -1097,6 +1125,9 @@
 See the @code{wsprintf}* functions in @file{user.spec} and 
 @file{user32.spec} for an example.
 
+Sometimes it is not known how many arguments an undocumented DLL
+function takes. @xref{Getting information on the API}, for some hints on
+how to proceed in such a case.
 
 @node Special entries, , Function entry points, The spec files
 @subsubsection Special entries of @file{.spec}-files
@@ -1132,8 +1163,10 @@
 
 @var{ORDINAL} is replaced by the ordinal number corresponding to the
 function. @var{ARGLENGTH} is the number of bytes that need to be removed
-from the stack before returning to the caller. @var{RETVALUE} is the
-return value which will be passed back to the caller.
+from the stack before returning to the caller. @xref{Investigating the
+undocumented API}, for an explanation of the stdcall calling convention.
+@var{RETVALUE} is the return value which will be passed back to the
+caller.
 
 @strong{Extern ordinals}
 
@@ -1182,6 +1215,10 @@
 some suggestions. 
 
 @menu
+* Getting information on the API::      Official and unofficial sources
+                                        of information on the @WIN32{} API.
+* Investigating the undocumented API::  You can find out some API
+                                        information on your own.
 * Implementing an API type::            How to implement a data type
                                         of the API (a checklist).
 * Implementing an API function::        How to implement one function
@@ -1198,9 +1235,268 @@
 @xref{Debugging}, for advice on how to debug Wine.
 @xref{Applying patches}, for instructions on applying patches.
 
-FIXME: what is most urgently needed
 
-@node Implementing an API type, Implementing an API function, , The Wine Project
+@node Getting information on the API, Investigating the undocumented API, , The Wine Project
+@section Official and unofficial documentation on the @mswindows{} API
+@cindex documentation of API functions
+@cindex undocumented API functions
+
+
+@strong{Official documentation}
+
+For documentation on @WIN32{} API functions, you might try one of these
+sources:
+
+@itemize @bullet
+
+@item
+There is a free online version of the MSDN library (including
+documentation for the @WIN32{} API) on
+@url{http://www.microsoft.com/msdn/}.
+
+@item 
+The @WINNT{} DDK gives information about some kernel (``executive'')
+routines. Some of the function documentation might also apply to user
+accessible DLL's.
+@end itemize
+
+@strong{Unofficial documentation}
+
+Not all of the @WIN32{} API is well documented. Some functions are
+obscured, and undocumented. @xref{Ordinals}, for information about
+undocumented functions imported by ordinal. Getting to know what these
+functions do can be tiresome and tedious. Here is a quote from a
+news posting concerning two books that might help:
+@c From: vischne@ibm.net-nospam (root)
+@c Subject: Re: Functions
+@c Newsgroups: comp.emulators.ms-windows.wine
+@c Date: 24 Jul 97 16:45:11 GMT
+@c Organization: The Light
+@c NNTP-Posting-Host: 129.37.246.203
+@c Message-ID: <33d78697.0@news3.ibm.net>
+
+@quotation
+Well actually, there are at least _two_ books that address these problems.
+One is by Matt Pietrek, ``Windows 95 System Programming Secrets'', which
+gives some auxiliary programs for helping ferret out the information, and
+the other is by Shulman, ``Undocumented Windows 95''.
+@end quotation
+
+@xref{Ordinals}, for some notes on undocumented kernel functions.
+
+@itemize @bullet
+
+@item
+@cindex book on undocumented API features by Pietrik
+``Windows 95 System Programming Secrets'' @*
+by Matt Pietrek @*
+Book & Disk Edition @*
+Paperback, 778 pages @*
+Published by IDG Books Worldwide @*
+Publication date: November 1, 1995 @*
+Dimensions (in inches): 9.25 x 7.42 x 2.06 @*
+ISBN: 1568843186 @*
+
+@item
+@cindex book on undocumented API features by Schulman
+``Undocumented Windows; A Programmers Guide
+to Reserved Microsoft Windows API Functions'' @*
+by Andrew Schulman @*
+Paperback, 715 pages @*
+Published by Addison-Wesley Pub Co @*
+Publication date: February 1, 1994 @*
+Dimensions (in inches): 9.11 x 7.37 x 1.53 @*
+ISBN: 0201608340  @*
+
+@item
+More books on these topics (including Schulman and Pietrik): @*
+@url{http://www.sonic.net/~undoc/bookstore.html}
+
+@item
+More details about calling undocumented functions can be found at
+@url{http://ftp.uni-mannheim.de/info/OReilly/windows/win95.update/dirty.html}.
+
+@item
+In 1993 Dr. Dobbs Journal published a column called ``Undocumented
+Corner''.
+@item
+You might want to check out BYTE from December 1983 as well.
+@* FIXME: is that to be taken seriously?
+@item
+And you might try to find out something on your own. @xref{Investigating
+the undocumented API}, for details.
+@end itemize
+
+But, all in all, @url{news:comp.emulators.ms-windows.wine} says
+@c From: dacut@henry.ece.cmu.edu (David A. Cuthbert)
+@c Subject: Re: Getting Internet Explorer to work
+@c Newsgroups: comp.emulators.ms-windows.wine
+@c Date: 24 Jul 1997 03:10:30 GMT
+@c Organization: Electrical & Computer Engineering, Carnegie Mellon University
+@c Reply-To: henry.ece.cmu.edu!dacut
+@c Message-ID: <5r6h36$86c@fs7.ece.cmu.edu>
+@c NNTP-Posting-Host: henry.ece.cmu.edu
+
+@quotation
+Unfortunately, short of getting something like NuMega's SoftIce, I
+don't think there's a ``good'' reference on the mystery <100 ordinals in
+KERNEL32.DLL.
+@end quotation
+
+
+@node Investigating the undocumented API, Implementing an API type, Getting information on the API, The Wine Project
+@section Investigating the undocumented API
+@cindex undocumented API investigation
+@cindex parameters of undocumented API functions
+@cindex stdcall calling convention
+@cindex C calling convention
+@cindex API function parameters investigation
+@cindex stack handling under stdcall calling
+
+Besides reading the documentation in @ref{Getting information on the API},
+you can find out some properties of API functions on your own.
+
+Sometimes it is not known how many arguments an undocumented DLL
+function takes. Here is a text from a news posting that gives some
+hints on how you might proceed in this case.
+
+@c The following text is closely quoted from:
+@c From: dacut@henry.ece.cmu.edu (David A. Cuthbert)
+@c Subject: Win32 stub functions (Claus Fischer, please read)
+@c Newsgroups: comp.emulators.ms-windows.wine
+@c Date: 7 Aug 1997 22:33:09 GMT
+@c Organization: Electrical & Computer Engineering, Carnegie Mellon University
+@c Reply-To: henry.ece.cmu.edu!dacut
+@c Message-ID: <5sdif5$qt3@fs7.ece.cmu.edu>
+
+The problem with implementing stubs for @WIN32{} functions is that it is
+not sufficient to return a default value (usually 0) and leave the
+stack the way we found it. For most @WIN32{} functions -- those that use
+the @dfn{stdcall} calling convention -- the arguments sent to the function
+are removed from the stack.
+
+Some background:  On the i386 class of machines, stack entries are
+usually dword (4 bytes) in size, little-endian.  The stack grows
+downward in memory.  The stack pointer, maintained in the @samp{esp}
+register, points to the last valid entry; thus, the operation of
+pushing a value onto the stack involves decrementing @samp{esp} and then
+moving the value into the memory pointed to by esp (i.e., @code{push p}
+in assembly resembles @code{*(--esp) = p;} in C).  Removing (popping)
+values off the stack is the reverse (i.e., @code{pop p} corresponds to
+@code{p = *(esp++);}).
+
+In the @dfn{stdcall} calling convention, arguments are pushed onto the
+stack right-to-left.  For example, the C call
+
+@example
+    myfunction(40, 20, 70, 30);
+@end example
+
+is expressed in Intel assembly as:
+
+@example
+    push 30
+    push 70
+    push 20
+    push 40
+    call myfunction
+@end example
+
+In addition, the called function is responsible for removing the
+arguments off the stack.  Thus, before the call to myfunction, the
+stack would look like:
+
+@example
+             [local variable or temporary]
+             [local variable or temporary]
+              30
+              70
+              20
+    esp ->    40
+@end example
+
+After the call returns, it should look like:
+
+@example
+             [local variable or temporary]
+    esp ->   [local variable or temporary]
+@end example
+
+To restore the stack to this state, the called function must know how
+many arguments to remove (which is the number of arguments it takes).
+This is a problem if the function is undocumented.
+
+One way to attempt to document the number of arguments each function
+takes is to create a wrapper around that function that detects the
+stack offset.  @file{WinRelay} (see below) was written to create such
+wrappers. Essentially, each wrapper assumes that the function will take
+a large number of arguments (by default, 64 in @file{WinRelay}).  The
+wrapper copies each of these arguments into its stack, calls the actual
+function, and then calculates the number of arguments by checking esp
+before and after the call.
+
+@cindex bsod (blue screen of death)
+@cindex blue screen of death
+The main problem with this scheme is that the function must actually
+be called from another program.  Many of these functions are seldom
+used.  An attempt was made to aggressively query each function in a
+given library (@file{ntdll.dll}) by passing 64 arguments, all 0, to each
+function.  Unfortunately, @WINNT40{} quickly goes to a blue screen
+of death (@dfn{bsod}), even if the program is run from a
+non-administrator account.
+
+Another method that has been much more successful is to attempt to
+figure out how many arguments each function is removing from the
+stack.  This instruction, @code{ret hhll} (where @samp{hhll} is the
+number of bytes to remove, i.e. the number of arguments times 4), contains
+the bytes @samp{0xc2 ll hh} in memory.  It is a reasonable assumption
+that few, if any, functions take more than 16 arguments; therefore,
+@samp{hh} is 0x0 and @samp{ll} is less than 0x40.  This utility,
+@file{MakeSpec} (see below), simply queries the address of a function
+and looks for the first occurrence of the bytes @samp{0xc2 ll 0x0},
+where @math{@samp{ll} <= 0x40}.
+
+Of course, this is not without errors. @code{ret 00ll} is not the only
+instruction that can have the byte sequence @samp{0xc2 ll 0x0}; for
+example, @code{push 0x000040c2} has the byte sequence
+@samp{0x68 0xc2 0x40 0x0 0x0}, which matches the above.  Properly, the
+utility should look for this sequence only on an instruction boundary;
+unfortunately, finding instruction boundaries on an i386 requires
+implementing a full disassemble -- quite a daunting task.  Besides,
+the probability of having such a byte sequence that is not the actual
+return instruction is fairly low.
+
+Much more troublesome is the non-linear flow of a function.  For
+example, consider the following two functions:
+
+@example
+    somefunction1:
+        jmp  somefunction1_impl
+
+    somefunction2:
+        ret  0004
+
+    somefunction1_impl:
+        ret  0008
+@end example
+
+@file{MakeSpec} would incorrectly list both @code{somefunction1} and
+@code{somefunction2} as taking only a single argument, whereas
+@code{somefunction1} really takes two arguments.
+
+With these limitations in mind, it is possible to implement more stubs
+in Wine and, eventually, the functions themselves.
+
+@c end of quote
+
+The program @file{WinRelay} can be downloaded from
+@url{http://www.ece.cmu.edu/afs/ece/usr/dacut/www/src},
+and @file{MakeSpec} will be available from the same location. You can
+compile them with Borland's C++Builder; you should not optimize when
+compiling (@file{WinRelay} needs the stack frames).
+
+
+@node Implementing an API type, Implementing an API function, Investigating the undocumented API, The Wine Project
 @section Implementing an API type
 
 Here is a checklist that should help you writing your first API type. It
@@ -1279,6 +1575,11 @@
 @xref{API function and type naming}, for details.
 
 @item
+Find out what the function should do. This may be tricky for
+undocumented functions. @xref{Getting information on the API}, for some
+hints.
+
+@item
 Find out where the function should go:
 @enumerate
 @item
diff --git a/files/directory.c b/files/directory.c
index 6bc5c45..ba6a2aa 100644
--- a/files/directory.c
+++ b/files/directory.c
@@ -179,7 +179,7 @@
 /***********************************************************************
  *           GetTempPath32A   (KERNEL32.292)
  */
-UINT32 GetTempPath32A( UINT32 count, LPSTR path )
+UINT32 WINAPI GetTempPath32A( UINT32 count, LPSTR path )
 {
     if (path) lstrcpyn32A( path, DIR_TempDosDir, count );
     return strlen( DIR_TempDosDir );
@@ -189,7 +189,7 @@
 /***********************************************************************
  *           GetTempPath32W   (KERNEL32.293)
  */
-UINT32 GetTempPath32W( UINT32 count, LPWSTR path )
+UINT32 WINAPI GetTempPath32W( UINT32 count, LPWSTR path )
 {
     if (path) lstrcpynAtoW( path, DIR_TempDosDir, count );
     return strlen( DIR_TempDosDir );
@@ -240,14 +240,14 @@
 /***********************************************************************
  *           GetTempDrive   (KERNEL.92)
  */
-BYTE GetTempDrive( BYTE ignored )
+BYTE WINAPI GetTempDrive( BYTE ignored )
 {
     /* FIXME: apparently Windows does something with the ignored byte */
     return DIR_TempDosDir[0];
 }
 
 
-UINT32 WIN16_GetTempDrive( BYTE ignored )
+UINT32 WINAPI WIN16_GetTempDrive( BYTE ignored )
 {
     /* A closer look at krnl386.exe shows what the SDK doesn't mention:
      *
@@ -264,7 +264,7 @@
 /***********************************************************************
  *           GetWindowsDirectory16   (KERNEL.134)
  */
-UINT16 GetWindowsDirectory16( LPSTR path, UINT16 count )
+UINT16 WINAPI GetWindowsDirectory16( LPSTR path, UINT16 count )
 {
     return (UINT16)GetWindowsDirectory32A( path, count );
 }
@@ -273,7 +273,7 @@
 /***********************************************************************
  *           GetWindowsDirectory32A   (KERNEL32.311)
  */
-UINT32 GetWindowsDirectory32A( LPSTR path, UINT32 count )
+UINT32 WINAPI GetWindowsDirectory32A( LPSTR path, UINT32 count )
 {
     if (path) lstrcpyn32A( path, DIR_WindowsDosDir, count );
     return strlen( DIR_WindowsDosDir );
@@ -283,7 +283,7 @@
 /***********************************************************************
  *           GetWindowsDirectory32W   (KERNEL32.312)
  */
-UINT32 GetWindowsDirectory32W( LPWSTR path, UINT32 count )
+UINT32 WINAPI GetWindowsDirectory32W( LPWSTR path, UINT32 count )
 {
     if (path) lstrcpynAtoW( path, DIR_WindowsDosDir, count );
     return strlen( DIR_WindowsDosDir );
@@ -293,7 +293,7 @@
 /***********************************************************************
  *           GetSystemDirectory16   (KERNEL.135)
  */
-UINT16 GetSystemDirectory16( LPSTR path, UINT16 count )
+UINT16 WINAPI GetSystemDirectory16( LPSTR path, UINT16 count )
 {
     return (UINT16)GetSystemDirectory32A( path, count );
 }
@@ -302,7 +302,7 @@
 /***********************************************************************
  *           GetSystemDirectory32A   (KERNEL32.282)
  */
-UINT32 GetSystemDirectory32A( LPSTR path, UINT32 count )
+UINT32 WINAPI GetSystemDirectory32A( LPSTR path, UINT32 count )
 {
     if (path) lstrcpyn32A( path, DIR_SystemDosDir, count );
     return strlen( DIR_SystemDosDir );
@@ -312,7 +312,7 @@
 /***********************************************************************
  *           GetSystemDirectory32W   (KERNEL32.283)
  */
-UINT32 GetSystemDirectory32W( LPWSTR path, UINT32 count )
+UINT32 WINAPI GetSystemDirectory32W( LPWSTR path, UINT32 count )
 {
     if (path) lstrcpynAtoW( path, DIR_SystemDosDir, count );
     return strlen( DIR_SystemDosDir );
@@ -322,7 +322,7 @@
 /***********************************************************************
  *           CreateDirectory16   (KERNEL.144)
  */
-BOOL16 CreateDirectory16( LPCSTR path, LPVOID dummy )
+BOOL16 WINAPI CreateDirectory16( LPCSTR path, LPVOID dummy )
 {
     dprintf_file( stddeb,"CreateDirectory16(%s,%p)\n", path, dummy );
     return (BOOL16)CreateDirectory32A( path, NULL );
@@ -332,7 +332,8 @@
 /***********************************************************************
  *           CreateDirectory32A   (KERNEL32.39)
  */
-BOOL32 CreateDirectory32A( LPCSTR path, LPSECURITY_ATTRIBUTES lpsecattribs )
+BOOL32 WINAPI CreateDirectory32A( LPCSTR path,
+                                  LPSECURITY_ATTRIBUTES lpsecattribs )
 {
     DOS_FULL_NAME full_name;
     LPCSTR unixName;
@@ -357,7 +358,8 @@
 /***********************************************************************
  *           CreateDirectory32W   (KERNEL32.42)
  */
-BOOL32 CreateDirectory32W( LPCWSTR path, LPSECURITY_ATTRIBUTES lpsecattribs )
+BOOL32 WINAPI CreateDirectory32W( LPCWSTR path,
+                                  LPSECURITY_ATTRIBUTES lpsecattribs )
 {
     LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
     BOOL32 ret = CreateDirectory32A( xpath, lpsecattribs );
@@ -369,8 +371,8 @@
 /***********************************************************************
  *           CreateDirectoryEx32A   (KERNEL32.40)
  */
-BOOL32 CreateDirectoryEx32A( LPCSTR template, LPCSTR path,
-                             LPSECURITY_ATTRIBUTES lpsecattribs)
+BOOL32 WINAPI CreateDirectoryEx32A( LPCSTR template, LPCSTR path,
+                                    LPSECURITY_ATTRIBUTES lpsecattribs)
 {
     return CreateDirectory32A(path,lpsecattribs);
 }
@@ -379,8 +381,8 @@
 /***********************************************************************
  *           CreateDirectoryEx32W   (KERNEL32.41)
  */
-BOOL32 CreateDirectoryEx32W( LPCWSTR template, LPCWSTR path,
-                             LPSECURITY_ATTRIBUTES lpsecattribs)
+BOOL32 WINAPI CreateDirectoryEx32W( LPCWSTR template, LPCWSTR path,
+                                    LPSECURITY_ATTRIBUTES lpsecattribs)
 {
     return CreateDirectory32W(path,lpsecattribs);
 }
@@ -389,7 +391,7 @@
 /***********************************************************************
  *           RemoveDirectory16   (KERNEL)
  */
-BOOL16 RemoveDirectory16( LPCSTR path )
+BOOL16 WINAPI RemoveDirectory16( LPCSTR path )
 {
     return (BOOL16)RemoveDirectory32A( path );
 }
@@ -398,7 +400,7 @@
 /***********************************************************************
  *           RemoveDirectory32A   (KERNEL32.437)
  */
-BOOL32 RemoveDirectory32A( LPCSTR path )
+BOOL32 WINAPI RemoveDirectory32A( LPCSTR path )
 {
     DOS_FULL_NAME full_name;
     LPCSTR unixName;
@@ -424,7 +426,7 @@
 /***********************************************************************
  *           RemoveDirectory32W   (KERNEL32.438)
  */
-BOOL32 RemoveDirectory32W( LPCWSTR path )
+BOOL32 WINAPI RemoveDirectory32W( LPCWSTR path )
 {
     LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
     BOOL32 ret = RemoveDirectory32A( xpath );
@@ -583,8 +585,8 @@
 /***********************************************************************
  *           SearchPath32A   (KERNEL32.447)
  */
-DWORD SearchPath32A( LPCSTR path, LPCSTR name, LPCSTR ext, DWORD buflen,
-                     LPSTR buffer, LPSTR *lastpart )
+DWORD WINAPI SearchPath32A( LPCSTR path, LPCSTR name, LPCSTR ext, DWORD buflen,
+                            LPSTR buffer, LPSTR *lastpart )
 {
     LPSTR p, res;
     DOS_FULL_NAME full_name;
@@ -604,8 +606,8 @@
 /***********************************************************************
  *           SearchPath32W   (KERNEL32.448)
  */
-DWORD SearchPath32W( LPCWSTR path, LPCWSTR name, LPCWSTR ext, DWORD buflen,
-                     LPWSTR buffer, LPWSTR *lastpart )
+DWORD WINAPI SearchPath32W( LPCWSTR path, LPCWSTR name, LPCWSTR ext,
+                            DWORD buflen, LPWSTR buffer, LPWSTR *lastpart )
 {
     LPWSTR p;
     LPSTR res;
diff --git a/files/dos_fs.c b/files/dos_fs.c
index 014b41e..74f6cf2 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -764,7 +764,8 @@
 /***********************************************************************
  *           GetShortPathName32A   (KERNEL32.271)
  */
-DWORD GetShortPathName32A( LPCSTR longpath, LPSTR shortpath, DWORD shortlen )
+DWORD WINAPI GetShortPathName32A( LPCSTR longpath, LPSTR shortpath,
+                                  DWORD shortlen )
 {
     DOS_FULL_NAME full_name;
 
@@ -778,7 +779,8 @@
 /***********************************************************************
  *           GetShortPathName32W   (KERNEL32.272)
  */
-DWORD GetShortPathName32W( LPCWSTR longpath, LPWSTR shortpath, DWORD shortlen )
+DWORD WINAPI GetShortPathName32W( LPCWSTR longpath, LPWSTR shortpath,
+                                  DWORD shortlen )
 {
     DOS_FULL_NAME full_name;
     DWORD ret = 0;
@@ -877,7 +879,8 @@
 /***********************************************************************
  *           GetFullPathName32A   (KERNEL32.272)
  */
-DWORD GetFullPathName32A(LPCSTR name, DWORD len, LPSTR buffer, LPSTR *lastpart)
+DWORD WINAPI GetFullPathName32A( LPCSTR name, DWORD len, LPSTR buffer,
+                                 LPSTR *lastpart )
 {
     DWORD ret = DOSFS_DoGetFullPathName( name, len, buffer, FALSE );
     if (ret && lastpart)
@@ -893,8 +896,8 @@
 /***********************************************************************
  *           GetFullPathName32W   (KERNEL32.273)
  */
-DWORD GetFullPathName32W( LPCWSTR name, DWORD len, LPWSTR buffer,
-                          LPWSTR *lastpart )
+DWORD WINAPI GetFullPathName32W( LPCWSTR name, DWORD len, LPWSTR buffer,
+                                 LPWSTR *lastpart )
 {
     LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
     DWORD ret = DOSFS_DoGetFullPathName( nameA, len, (LPSTR)buffer, TRUE );
@@ -1044,7 +1047,7 @@
 /*************************************************************************
  *           FindFirstFile16   (KERNEL.413)
  */
-HANDLE16 FindFirstFile16( LPCSTR path, WIN32_FIND_DATA32A *data )
+HANDLE16 WINAPI FindFirstFile16( LPCSTR path, WIN32_FIND_DATA32A *data )
 {
     DOS_FULL_NAME full_name;
     HGLOBAL16 handle;
@@ -1076,7 +1079,7 @@
 /*************************************************************************
  *           FindFirstFile32A   (KERNEL32.123)
  */
-HANDLE32 FindFirstFile32A( LPCSTR path, WIN32_FIND_DATA32A *data )
+HANDLE32 WINAPI FindFirstFile32A( LPCSTR path, WIN32_FIND_DATA32A *data )
 {
     HANDLE32 handle = FindFirstFile16( path, data );
     if (handle == INVALID_HANDLE_VALUE16) return INVALID_HANDLE_VALUE32;
@@ -1087,7 +1090,7 @@
 /*************************************************************************
  *           FindFirstFile32W   (KERNEL32.124)
  */
-HANDLE32 FindFirstFile32W( LPCWSTR path, WIN32_FIND_DATA32W *data )
+HANDLE32 WINAPI FindFirstFile32W( LPCWSTR path, WIN32_FIND_DATA32W *data )
 {
     WIN32_FIND_DATA32A dataA;
     LPSTR pathA = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
@@ -1111,7 +1114,7 @@
 /*************************************************************************
  *           FindNextFile16   (KERNEL.414)
  */
-BOOL16 FindNextFile16( HANDLE16 handle, WIN32_FIND_DATA32A *data )
+BOOL16 WINAPI FindNextFile16( HANDLE16 handle, WIN32_FIND_DATA32A *data )
 {
     FIND_FIRST_INFO *info;
     int count;
@@ -1143,7 +1146,7 @@
 /*************************************************************************
  *           FindNextFile32A   (KERNEL32.126)
  */
-BOOL32 FindNextFile32A( HANDLE32 handle, WIN32_FIND_DATA32A *data )
+BOOL32 WINAPI FindNextFile32A( HANDLE32 handle, WIN32_FIND_DATA32A *data )
 {
     return FindNextFile16( handle, data );
 }
@@ -1152,7 +1155,7 @@
 /*************************************************************************
  *           FindNextFile32W   (KERNEL32.127)
  */
-BOOL32 FindNextFile32W( HANDLE32 handle, WIN32_FIND_DATA32W *data )
+BOOL32 WINAPI FindNextFile32W( HANDLE32 handle, WIN32_FIND_DATA32W *data )
 {
     WIN32_FIND_DATA32A dataA;
     if (!FindNextFile32A( handle, &dataA )) return FALSE;
@@ -1171,7 +1174,7 @@
 /*************************************************************************
  *           FindClose16   (KERNEL.415)
  */
-BOOL16 FindClose16( HANDLE16 handle )
+BOOL16 WINAPI FindClose16( HANDLE16 handle )
 {
     FIND_FIRST_INFO *info;
 
@@ -1191,7 +1194,7 @@
 /*************************************************************************
  *           FindClose32   (KERNEL32.119)
  */
-BOOL32 FindClose32( HANDLE32 handle )
+BOOL32 WINAPI FindClose32( HANDLE32 handle )
 {
     return FindClose16( (HANDLE16)handle );
 }
@@ -1419,7 +1422,7 @@
 /***********************************************************************
  *           DosDateTimeToFileTime   (KERNEL32.76)
  */
-BOOL32 DosDateTimeToFileTime( WORD fatdate, WORD fattime, LPFILETIME ft )
+BOOL32 WINAPI DosDateTimeToFileTime( WORD fatdate, WORD fattime, LPFILETIME ft)
 {
     struct tm newtm;
 
@@ -1437,8 +1440,8 @@
 /***********************************************************************
  *           FileTimeToDosDateTime   (KERNEL32.111)
  */
-BOOL32 FileTimeToDosDateTime( const FILETIME *ft, LPWORD fatdate,
-                              LPWORD fattime )
+BOOL32 WINAPI FileTimeToDosDateTime( const FILETIME *ft, LPWORD fatdate,
+                                     LPWORD fattime )
 {
     time_t unixtime = DOSFS_FileTimeToUnixTime( ft, NULL );
     struct tm *tm = localtime( &unixtime );
@@ -1454,7 +1457,8 @@
 /***********************************************************************
  *           LocalFileTimeToFileTime   (KERNEL32.373)
  */
-BOOL32 LocalFileTimeToFileTime( const FILETIME *localft, LPFILETIME utcft )
+BOOL32 WINAPI LocalFileTimeToFileTime( const FILETIME *localft,
+                                       LPFILETIME utcft )
 {
     struct tm *xtm;
     DWORD remainder;
@@ -1470,7 +1474,8 @@
 /***********************************************************************
  *           FileTimeToLocalFileTime   (KERNEL32.112)
  */
-BOOL32 FileTimeToLocalFileTime( const FILETIME *utcft, LPFILETIME localft )
+BOOL32 WINAPI FileTimeToLocalFileTime( const FILETIME *utcft,
+                                       LPFILETIME localft )
 {
     struct tm *xtm;
     DWORD remainder;
@@ -1486,7 +1491,7 @@
 /***********************************************************************
  *           FileTimeToSystemTime   (KERNEL32.113)
  */
-BOOL32 FileTimeToSystemTime( const FILETIME *ft, LPSYSTEMTIME syst )
+BOOL32 WINAPI FileTimeToSystemTime( const FILETIME *ft, LPSYSTEMTIME syst )
 {
     struct tm *xtm;
     DWORD remainder;
@@ -1508,8 +1513,7 @@
  *
  * returns array of strings terminated by \0, terminated by \0
  */
-DWORD
-QueryDosDevice32A(LPCSTR devname,LPSTR target,DWORD bufsize)
+DWORD WINAPI QueryDosDevice32A(LPCSTR devname,LPSTR target,DWORD bufsize)
 {
     LPSTR s;
     char  buffer[200];
@@ -1537,8 +1541,7 @@
  *
  * returns array of strings terminated by \0, terminated by \0
  */
-DWORD
-QueryDosDevice32W(LPCWSTR devname,LPWSTR target,DWORD bufsize)
+DWORD WINAPI QueryDosDevice32W(LPCWSTR devname,LPWSTR target,DWORD bufsize)
 {
     LPSTR devnameA = devname?HEAP_strdupWtoA(GetProcessHeap(),0,devname):NULL;
     LPSTR targetA = (LPSTR)HEAP_xalloc(GetProcessHeap(),0,bufsize);
@@ -1554,7 +1557,7 @@
 /***********************************************************************
  *           SystemTimeToFileTime   (KERNEL32.526)
  */
-BOOL32 SystemTimeToFileTime( const SYSTEMTIME *syst, LPFILETIME ft )
+BOOL32 WINAPI SystemTimeToFileTime( const SYSTEMTIME *syst, LPFILETIME ft )
 {
     struct tm xtm;
 
diff --git a/files/drive.c b/files/drive.c
index c4a88de..cee484a 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -538,9 +538,9 @@
 /***********************************************************************
  *           GetDiskFreeSpace16   (KERNEL.422)
  */
-BOOL16 GetDiskFreeSpace16( LPCSTR root, LPDWORD cluster_sectors,
-                           LPDWORD sector_bytes, LPDWORD free_clusters,
-                           LPDWORD total_clusters )
+BOOL16 WINAPI GetDiskFreeSpace16( LPCSTR root, LPDWORD cluster_sectors,
+                                  LPDWORD sector_bytes, LPDWORD free_clusters,
+                                  LPDWORD total_clusters )
 {
     return GetDiskFreeSpace32A( root, cluster_sectors, sector_bytes,
                                 free_clusters, total_clusters );
@@ -550,9 +550,9 @@
 /***********************************************************************
  *           GetDiskFreeSpace32A   (KERNEL32.206)
  */
-BOOL32 GetDiskFreeSpace32A( LPCSTR root, LPDWORD cluster_sectors,
-                            LPDWORD sector_bytes, LPDWORD free_clusters,
-                            LPDWORD total_clusters )
+BOOL32 WINAPI GetDiskFreeSpace32A( LPCSTR root, LPDWORD cluster_sectors,
+                                   LPDWORD sector_bytes, LPDWORD free_clusters,
+                                   LPDWORD total_clusters )
 {
     int	drive;
     DWORD size,available;
@@ -583,9 +583,9 @@
 /***********************************************************************
  *           GetDiskFreeSpace32W   (KERNEL32.207)
  */
-BOOL32 GetDiskFreeSpace32W( LPCWSTR root, LPDWORD cluster_sectors,
-                            LPDWORD sector_bytes, LPDWORD free_clusters,
-                            LPDWORD total_clusters )
+BOOL32 WINAPI GetDiskFreeSpace32W( LPCWSTR root, LPDWORD cluster_sectors,
+                                   LPDWORD sector_bytes, LPDWORD free_clusters,
+                                   LPDWORD total_clusters )
 {
     LPSTR xroot;
     BOOL32 ret;
@@ -601,7 +601,7 @@
 /***********************************************************************
  *           GetDriveType16   (KERNEL.136)
  */
-UINT16 GetDriveType16( UINT16 drive )
+UINT16 WINAPI GetDriveType16( UINT16 drive )
 {
     dprintf_dosfs( stddeb, "GetDriveType16(%c:)\n", 'A' + drive );
     switch(DRIVE_GetType(drive))
@@ -619,7 +619,7 @@
 /***********************************************************************
  *           GetDriveType32A   (KERNEL32.208)
  */
-UINT32 GetDriveType32A( LPCSTR root )
+UINT32 WINAPI GetDriveType32A( LPCSTR root )
 {
     dprintf_dosfs( stddeb, "GetDriveType32A(%s)\n", root );
     if (root[1] != ':')
@@ -642,7 +642,7 @@
 /***********************************************************************
  *           GetDriveType32W   (KERNEL32.209)
  */
-UINT32 GetDriveType32W( LPCWSTR root )
+UINT32 WINAPI GetDriveType32W( LPCWSTR root )
 {
     LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, root );
     UINT32 ret = GetDriveType32A( xpath );
@@ -654,7 +654,7 @@
 /***********************************************************************
  *           GetCurrentDirectory16   (KERNEL.411)
  */
-UINT16 GetCurrentDirectory16( UINT16 buflen, LPSTR buf )
+UINT16 WINAPI GetCurrentDirectory16( UINT16 buflen, LPSTR buf )
 {
     return (UINT16)GetCurrentDirectory32A( buflen, buf );
 }
@@ -665,7 +665,7 @@
  *
  * Returns "X:\\path\\etc\\".
  */
-UINT32 GetCurrentDirectory32A( UINT32 buflen, LPSTR buf )
+UINT32 WINAPI GetCurrentDirectory32A( UINT32 buflen, LPSTR buf )
 {
     char *pref = "A:\\";
     const char *s = DRIVE_GetDosCwd( DRIVE_GetCurrentDrive() );
@@ -684,7 +684,7 @@
 /***********************************************************************
  *           GetCurrentDirectory32W   (KERNEL32.197)
  */
-UINT32 GetCurrentDirectory32W( UINT32 buflen, LPWSTR buf )
+UINT32 WINAPI GetCurrentDirectory32W( UINT32 buflen, LPWSTR buf )
 {
     LPSTR xpath = HeapAlloc( GetProcessHeap(), 0, buflen+1 );
     UINT32 ret = GetCurrentDirectory32A( buflen, xpath );
@@ -697,7 +697,7 @@
 /***********************************************************************
  *           SetCurrentDirectory   (KERNEL.412)
  */
-BOOL16 SetCurrentDirectory16( LPCSTR dir )
+BOOL16 WINAPI SetCurrentDirectory16( LPCSTR dir )
 {
     return SetCurrentDirectory32A( dir );
 }
@@ -706,7 +706,7 @@
 /***********************************************************************
  *           SetCurrentDirectory32A   (KERNEL32.479)
  */
-BOOL32 SetCurrentDirectory32A( LPCSTR dir )
+BOOL32 WINAPI SetCurrentDirectory32A( LPCSTR dir )
 {
     int drive = DRIVE_GetCurrentDrive();
 
@@ -730,7 +730,7 @@
 /***********************************************************************
  *           SetCurrentDirectory32W   (KERNEL32.480)
  */
-BOOL32 SetCurrentDirectory32W( LPCWSTR dirW )
+BOOL32 WINAPI SetCurrentDirectory32W( LPCWSTR dirW )
 {
     LPSTR dir = HEAP_strdupWtoA( GetProcessHeap(), 0, dirW );
     BOOL32 res = SetCurrentDirectory32A( dir );
@@ -742,7 +742,7 @@
 /***********************************************************************
  *           GetLogicalDriveStrings32A   (KERNEL32.231)
  */
-UINT32 GetLogicalDriveStrings32A( UINT32 len, LPSTR buffer )
+UINT32 WINAPI GetLogicalDriveStrings32A( UINT32 len, LPSTR buffer )
 {
     int drive, count;
 
@@ -768,7 +768,7 @@
 /***********************************************************************
  *           GetLogicalDriveStrings32W   (KERNEL32.232)
  */
-UINT32 GetLogicalDriveStrings32W( UINT32 len, LPWSTR buffer )
+UINT32 WINAPI GetLogicalDriveStrings32W( UINT32 len, LPWSTR buffer )
 {
     int drive, count;
 
@@ -794,7 +794,7 @@
 /***********************************************************************
  *           GetLogicalDrives   (KERNEL32.233)
  */
-DWORD GetLogicalDrives(void)
+DWORD WINAPI GetLogicalDrives(void)
 {
     DWORD ret = 0;
     int drive;
@@ -808,9 +808,10 @@
 /***********************************************************************
  *           GetVolumeInformation32A   (KERNEL32.309)
  */
-BOOL32 GetVolumeInformation32A( LPCSTR root, LPSTR label, DWORD label_len,
-                                DWORD *serial, DWORD *filename_len,
-                                DWORD *flags, LPSTR fsname, DWORD fsname_len )
+BOOL32 WINAPI GetVolumeInformation32A( LPCSTR root, LPSTR label,
+                                       DWORD label_len, DWORD *serial,
+                                       DWORD *filename_len, DWORD *flags,
+                                       LPSTR fsname, DWORD fsname_len )
 {
     int drive;
 
@@ -843,9 +844,10 @@
 /***********************************************************************
  *           GetVolumeInformation32W   (KERNEL32.310)
  */
-BOOL32 GetVolumeInformation32W( LPCWSTR root, LPWSTR label, DWORD label_len,
-                                DWORD *serial, DWORD *filename_len,
-                                DWORD *flags, LPWSTR fsname, DWORD fsname_len)
+BOOL32 WINAPI GetVolumeInformation32W( LPCWSTR root, LPWSTR label,
+                                       DWORD label_len, DWORD *serial,
+                                       DWORD *filename_len, DWORD *flags,
+                                       LPWSTR fsname, DWORD fsname_len )
 {
     LPSTR xroot    = HEAP_strdupWtoA( GetProcessHeap(), 0, root );
     LPSTR xvolname = label ? HeapAlloc(GetProcessHeap(),0,label_len) : NULL;
diff --git a/files/file.c b/files/file.c
index 742d518..540446a 100644
--- a/files/file.c
+++ b/files/file.c
@@ -376,8 +376,8 @@
 /***********************************************************************
  *             GetFileInformationByHandle   (KERNEL32.219)
  */
-DWORD GetFileInformationByHandle( HFILE32 hFile,
-                                  BY_HANDLE_FILE_INFORMATION *info )
+DWORD WINAPI GetFileInformationByHandle( HFILE32 hFile,
+                                         BY_HANDLE_FILE_INFORMATION *info )
 {
     FILE_OBJECT *file;
     DWORD ret = 0;
@@ -400,7 +400,7 @@
 /**************************************************************************
  *           GetFileAttributes16   (KERNEL.420)
  */
-DWORD GetFileAttributes16( LPCSTR name )
+DWORD WINAPI GetFileAttributes16( LPCSTR name )
 {
     return GetFileAttributes32A( name );
 }
@@ -409,7 +409,7 @@
 /**************************************************************************
  *           GetFileAttributes32A   (KERNEL32.217)
  */
-DWORD GetFileAttributes32A( LPCSTR name )
+DWORD WINAPI GetFileAttributes32A( LPCSTR name )
 {
     DOS_FULL_NAME full_name;
     BY_HANDLE_FILE_INFORMATION info;
@@ -425,7 +425,7 @@
 /**************************************************************************
  *           GetFileAttributes32W   (KERNEL32.218)
  */
-DWORD GetFileAttributes32W( LPCWSTR name )
+DWORD WINAPI GetFileAttributes32W( LPCWSTR name )
 {
     LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
     DWORD res = GetFileAttributes32A( nameA );
@@ -437,7 +437,7 @@
 /***********************************************************************
  *           GetFileSize   (KERNEL32.220)
  */
-DWORD GetFileSize( HFILE32 hFile, LPDWORD filesizehigh )
+DWORD WINAPI GetFileSize( HFILE32 hFile, LPDWORD filesizehigh )
 {
     BY_HANDLE_FILE_INFORMATION info;
     if (!GetFileInformationByHandle( hFile, &info )) return 0;
@@ -449,8 +449,9 @@
 /***********************************************************************
  *           GetFileTime   (KERNEL32.221)
  */
-BOOL32 GetFileTime( HFILE32 hFile, FILETIME *lpCreationTime,
-                    FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime )
+BOOL32 WINAPI GetFileTime( HFILE32 hFile, FILETIME *lpCreationTime,
+                           FILETIME *lpLastAccessTime,
+                           FILETIME *lpLastWriteTime )
 {
     BY_HANDLE_FILE_INFORMATION info;
     if (!GetFileInformationByHandle( hFile, &info )) return FALSE;
@@ -463,7 +464,7 @@
 /***********************************************************************
  *           CompareFileTime   (KERNEL32.28)
  */
-INT32 CompareFileTime( LPFILETIME x, LPFILETIME y )
+INT32 WINAPI CompareFileTime( LPFILETIME x, LPFILETIME y )
 {
         if (!x || !y) return -1;
 
@@ -517,8 +518,8 @@
 /***********************************************************************
  *           GetTempFileName16   (KERNEL.97)
  */
-UINT16 GetTempFileName16( BYTE drive, LPCSTR prefix, UINT16 unique,
-                          LPSTR buffer )
+UINT16 WINAPI GetTempFileName16( BYTE drive, LPCSTR prefix, UINT16 unique,
+                                 LPSTR buffer )
 {
     char temppath[144];
 
@@ -544,8 +545,8 @@
 /***********************************************************************
  *           GetTempFileName32A   (KERNEL32.290)
  */
-UINT32 GetTempFileName32A( LPCSTR path, LPCSTR prefix, UINT32 unique,
-                           LPSTR buffer)
+UINT32 WINAPI GetTempFileName32A( LPCSTR path, LPCSTR prefix, UINT32 unique,
+                                  LPSTR buffer)
 {
     DOS_FULL_NAME full_name;
     int i;
@@ -603,8 +604,8 @@
 /***********************************************************************
  *           GetTempFileName32W   (KERNEL32.291)
  */
-UINT32 GetTempFileName32W( LPCWSTR path, LPCWSTR prefix, UINT32 unique,
-                           LPWSTR buffer )
+UINT32 WINAPI GetTempFileName32W( LPCWSTR path, LPCWSTR prefix, UINT32 unique,
+                                  LPWSTR buffer )
 {
     LPSTR   patha,prefixa;
     char    buffera[144];
@@ -758,7 +759,7 @@
 /***********************************************************************
  *           OpenFile16   (KERNEL.74)
  */
-HFILE16 OpenFile16( LPCSTR name, OFSTRUCT *ofs, UINT16 mode )
+HFILE16 WINAPI OpenFile16( LPCSTR name, OFSTRUCT *ofs, UINT16 mode )
 {
     return FILE_DoOpenFile( name, ofs, mode, FALSE );
 }
@@ -767,7 +768,7 @@
 /***********************************************************************
  *           OpenFile32   (KERNEL32.396)
  */
-HFILE32 OpenFile32( LPCSTR name, OFSTRUCT *ofs, UINT32 mode )
+HFILE32 WINAPI OpenFile32( LPCSTR name, OFSTRUCT *ofs, UINT32 mode )
 {
     return FILE_DoOpenFile( name, ofs, mode, TRUE );
 }
@@ -776,7 +777,7 @@
 /***********************************************************************
  *           _lclose16   (KERNEL.81)
  */
-HFILE16 _lclose16( HFILE16 hFile )
+HFILE16 WINAPI _lclose16( HFILE16 hFile )
 {
     dprintf_file( stddeb, "_lclose16: handle %d\n", hFile );
     return CloseHandle( hFile ) ? 0 : HFILE_ERROR16;
@@ -786,7 +787,7 @@
 /***********************************************************************
  *           _lclose32   (KERNEL32.592)
  */
-HFILE32 _lclose32( HFILE32 hFile )
+HFILE32 WINAPI _lclose32( HFILE32 hFile )
 {
     dprintf_file( stddeb, "_lclose32: handle %d\n", hFile );
     return CloseHandle( hFile ) ? 0 : HFILE_ERROR32;
@@ -796,7 +797,7 @@
 /***********************************************************************
  *           WIN16_hread
  */
-LONG WIN16_hread( HFILE16 hFile, SEGPTR buffer, LONG count )
+LONG WINAPI WIN16_hread( HFILE16 hFile, SEGPTR buffer, LONG count )
 {
     LONG maxlen;
 
@@ -813,7 +814,7 @@
 /***********************************************************************
  *           WIN16_lread
  */
-UINT16 WIN16_lread( HFILE16 hFile, SEGPTR buffer, UINT16 count )
+UINT16 WINAPI WIN16_lread( HFILE16 hFile, SEGPTR buffer, UINT16 count )
 {
     return (UINT16)WIN16_hread( hFile, buffer, (LONG)count );
 }
@@ -822,7 +823,7 @@
 /***********************************************************************
  *           _lread32   (KERNEL32.596)
  */
-UINT32 _lread32( HFILE32 hFile, LPVOID buffer, UINT32 count )
+UINT32 WINAPI _lread32( HFILE32 hFile, LPVOID buffer, UINT32 count )
 {
     FILE_OBJECT *file;
     UINT32 result;
@@ -840,7 +841,7 @@
 /***********************************************************************
  *           _lread16   (KERNEL.82)
  */
-UINT16 _lread16( HFILE16 hFile, LPVOID buffer, UINT16 count )
+UINT16 WINAPI _lread16( HFILE16 hFile, LPVOID buffer, UINT16 count )
 {
     return (UINT16)_lread32( hFile, buffer, (LONG)count );
 }
@@ -849,7 +850,7 @@
 /***********************************************************************
  *           _lcreat16   (KERNEL.83)
  */
-HFILE16 _lcreat16( LPCSTR path, INT16 attr )
+HFILE16 WINAPI _lcreat16( LPCSTR path, INT16 attr )
 {
     int mode = (attr & 1) ? 0444 : 0666;
     dprintf_file( stddeb, "_lcreat16: %s %02x\n", path, attr );
@@ -860,7 +861,7 @@
 /***********************************************************************
  *           _lcreat32   (KERNEL32.593)
  */
-HFILE32 _lcreat32( LPCSTR path, INT32 attr )
+HFILE32 WINAPI _lcreat32( LPCSTR path, INT32 attr )
 {
     int mode = (attr & 1) ? 0444 : 0666;
     dprintf_file( stddeb, "_lcreat32: %s %02x\n", path, attr );
@@ -882,8 +883,8 @@
 /***********************************************************************
  *           SetFilePointer   (KERNEL32.492)
  */
-DWORD SetFilePointer( HFILE32 hFile, LONG distance, LONG *highword,
-                      DWORD method )
+DWORD WINAPI SetFilePointer( HFILE32 hFile, LONG distance, LONG *highword,
+                             DWORD method )
 {
     FILE_OBJECT *file;
     int origin, result;
@@ -915,7 +916,7 @@
 /***********************************************************************
  *           _llseek16   (KERNEL.84)
  */
-LONG _llseek16( HFILE16 hFile, LONG lOffset, INT16 nOrigin )
+LONG WINAPI _llseek16( HFILE16 hFile, LONG lOffset, INT16 nOrigin )
 {
     return SetFilePointer( hFile, lOffset, NULL, nOrigin );
 }
@@ -924,7 +925,7 @@
 /***********************************************************************
  *           _llseek32   (KERNEL32.594)
  */
-LONG _llseek32( HFILE32 hFile, LONG lOffset, INT32 nOrigin )
+LONG WINAPI _llseek32( HFILE32 hFile, LONG lOffset, INT32 nOrigin )
 {
     return SetFilePointer( hFile, lOffset, NULL, nOrigin );
 }
@@ -933,7 +934,7 @@
 /***********************************************************************
  *           _lopen16   (KERNEL.85)
  */
-HFILE16 _lopen16( LPCSTR path, INT16 mode )
+HFILE16 WINAPI _lopen16( LPCSTR path, INT16 mode )
 {
     return _lopen32( path, mode );
 }
@@ -942,7 +943,7 @@
 /***********************************************************************
  *           _lopen32   (KERNEL32.595)
  */
-HFILE32 _lopen32( LPCSTR path, INT32 mode )
+HFILE32 WINAPI _lopen32( LPCSTR path, INT32 mode )
 {
     INT32 unixMode;
 
@@ -968,7 +969,7 @@
 /***********************************************************************
  *           _lwrite16   (KERNEL.86)
  */
-UINT16 _lwrite16( HFILE16 hFile, LPCSTR buffer, UINT16 count )
+UINT16 WINAPI _lwrite16( HFILE16 hFile, LPCSTR buffer, UINT16 count )
 {
     return (UINT16)_hwrite32( hFile, buffer, (LONG)count );
 }
@@ -976,7 +977,7 @@
 /***********************************************************************
  *           _lwrite32   (KERNEL.86)
  */
-UINT32 _lwrite32( HFILE32 hFile, LPCSTR buffer, UINT32 count )
+UINT32 WINAPI _lwrite32( HFILE32 hFile, LPCSTR buffer, UINT32 count )
 {
     return (UINT32)_hwrite32( hFile, buffer, (LONG)count );
 }
@@ -985,7 +986,7 @@
 /***********************************************************************
  *           _hread16   (KERNEL.349)
  */
-LONG _hread16( HFILE16 hFile, LPVOID buffer, LONG count)
+LONG WINAPI _hread16( HFILE16 hFile, LPVOID buffer, LONG count)
 {
     return _lread32( hFile, buffer, count );
 }
@@ -994,7 +995,7 @@
 /***********************************************************************
  *           _hread32   (KERNEL32.590)
  */
-LONG _hread32( HFILE32 hFile, LPVOID buffer, LONG count)
+LONG WINAPI _hread32( HFILE32 hFile, LPVOID buffer, LONG count)
 {
     return _lread32( hFile, buffer, count );
 }
@@ -1003,7 +1004,7 @@
 /***********************************************************************
  *           _hwrite16   (KERNEL.350)
  */
-LONG _hwrite16( HFILE16 hFile, LPCSTR buffer, LONG count )
+LONG WINAPI _hwrite16( HFILE16 hFile, LPCSTR buffer, LONG count )
 {
     return _hwrite32( hFile, buffer, count );
 }
@@ -1012,7 +1013,7 @@
 /***********************************************************************
  *           _hwrite32   (KERNEL32.591)
  */
-LONG _hwrite32( HFILE32 hFile, LPCSTR buffer, LONG count )
+LONG WINAPI _hwrite32( HFILE32 hFile, LPCSTR buffer, LONG count )
 {
     FILE_OBJECT *file;
     LONG result;
@@ -1042,7 +1043,7 @@
 /***********************************************************************
  *           SetHandleCount16   (KERNEL.199)
  */
-UINT16 SetHandleCount16( UINT16 count )
+UINT16 WINAPI SetHandleCount16( UINT16 count )
 {
     HGLOBAL16 hPDB = GetCurrentPDB();
     PDB *pdb = (PDB *)GlobalLock16( hPDB );
@@ -1094,7 +1095,7 @@
 /*************************************************************************
  *           SetHandleCount32   (KERNEL32.494)
  */
-UINT32 SetHandleCount32( UINT32 count )
+UINT32 WINAPI SetHandleCount32( UINT32 count )
 {
     return MIN( 256, count );
 }
@@ -1103,7 +1104,7 @@
 /***********************************************************************
  *           FlushFileBuffers   (KERNEL32.133)
  */
-BOOL32 FlushFileBuffers( HFILE32 hFile )
+BOOL32 WINAPI FlushFileBuffers( HFILE32 hFile )
 {
     FILE_OBJECT *file;
     BOOL32 ret;
@@ -1124,7 +1125,7 @@
 /**************************************************************************
  *           SetEndOfFile   (KERNEL32.483)
  */
-BOOL32 SetEndOfFile( HFILE32 hFile )
+BOOL32 WINAPI SetEndOfFile( HFILE32 hFile )
 {
     FILE_OBJECT *file;
     BOOL32 ret = TRUE;
@@ -1145,7 +1146,7 @@
 /***********************************************************************
  *           DeleteFile16   (KERNEL.146)
  */
-BOOL16 DeleteFile16( LPCSTR path )
+BOOL16 WINAPI DeleteFile16( LPCSTR path )
 {
     return DeleteFile32A( path );
 }
@@ -1154,7 +1155,7 @@
 /***********************************************************************
  *           DeleteFile32A   (KERNEL32.71)
  */
-BOOL32 DeleteFile32A( LPCSTR path )
+BOOL32 WINAPI DeleteFile32A( LPCSTR path )
 {
     DOS_FULL_NAME full_name;
     const char *unixName;
@@ -1181,7 +1182,7 @@
 /***********************************************************************
  *           DeleteFile32W   (KERNEL32.72)
  */
-BOOL32 DeleteFile32W( LPCWSTR path )
+BOOL32 WINAPI DeleteFile32W( LPCWSTR path )
 {
     LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
     BOOL32 ret = RemoveDirectory32A( xpath );
@@ -1218,13 +1219,6 @@
 
     if (!file)
     {
-	/* Linux EINVAL's on us if we don't pass MAP_PRIVATE to an anon mmap */
-#ifdef MAP_SHARED
-	flags &= ~MAP_SHARED;
-#endif
-#ifdef MAP_PRIVATE
-	flags |= MAP_PRIVATE;
-#endif
 #ifdef MAP_ANON
         flags |= MAP_ANON;
 #else
@@ -1240,6 +1234,13 @@
         }
         fd = fdzero;
 #endif  /* MAP_ANON */
+	/* Linux EINVAL's on us if we don't pass MAP_PRIVATE to an anon mmap */
+#ifdef MAP_SHARED
+	flags &= ~MAP_SHARED;
+#endif
+#ifdef MAP_PRIVATE
+	flags |= MAP_PRIVATE;
+#endif
     }
     else fd = file->unix_handle;
 
@@ -1250,7 +1251,7 @@
 /***********************************************************************
  *           GetFileType   (KERNEL32.222)
  */
-DWORD GetFileType( HFILE32 hFile )
+DWORD WINAPI GetFileType( HFILE32 hFile )
 {
     FILE_OBJECT *file = FILE_GetFile(hFile);
     if (!file) return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
@@ -1264,7 +1265,7 @@
  *
  * 
  */
-BOOL32 MoveFileEx32A( LPCSTR fn1, LPCSTR fn2, DWORD flag )
+BOOL32 WINAPI MoveFileEx32A( LPCSTR fn1, LPCSTR fn2, DWORD flag )
 {
     DOS_FULL_NAME full_name1, full_name2;
     int mode=0; /* mode == 1: use copy */
@@ -1348,7 +1349,7 @@
 /**************************************************************************
  *           MoveFileEx32W   (KERNEL32.???)
  */
-BOOL32 MoveFileEx32W( LPCWSTR fn1, LPCWSTR fn2, DWORD flag )
+BOOL32 WINAPI MoveFileEx32W( LPCWSTR fn1, LPCWSTR fn2, DWORD flag )
 {
     LPSTR afn1 = HEAP_strdupWtoA( GetProcessHeap(), 0, fn1 );
     LPSTR afn2 = HEAP_strdupWtoA( GetProcessHeap(), 0, fn2 );
@@ -1364,7 +1365,7 @@
  *
  *  Move file or directory
  */
-BOOL32 MoveFile32A( LPCSTR fn1, LPCSTR fn2 )
+BOOL32 WINAPI MoveFile32A( LPCSTR fn1, LPCSTR fn2 )
 {
     DOS_FULL_NAME full_name1, full_name2;
     struct stat fstat;
@@ -1408,7 +1409,7 @@
 /**************************************************************************
  *           MoveFile32W   (KERNEL32.390)
  */
-BOOL32 MoveFile32W( LPCWSTR fn1, LPCWSTR fn2 )
+BOOL32 WINAPI MoveFile32W( LPCWSTR fn1, LPCWSTR fn2 )
 {
     LPSTR afn1 = HEAP_strdupWtoA( GetProcessHeap(), 0, fn1 );
     LPSTR afn2 = HEAP_strdupWtoA( GetProcessHeap(), 0, fn2 );
@@ -1422,7 +1423,7 @@
 /**************************************************************************
  *           CopyFile32A   (KERNEL32.36)
  */
-BOOL32 CopyFile32A( LPCSTR source, LPCSTR dest, BOOL32 fail_if_exists )
+BOOL32 WINAPI CopyFile32A( LPCSTR source, LPCSTR dest, BOOL32 fail_if_exists )
 {
     HFILE32 h1, h2;
     BY_HANDLE_FILE_INFORMATION info;
@@ -1465,7 +1466,7 @@
 /**************************************************************************
  *           CopyFile32W   (KERNEL32.37)
  */
-BOOL32 CopyFile32W( LPCWSTR source, LPCWSTR dest, BOOL32 fail_if_exists )
+BOOL32 WINAPI CopyFile32W( LPCWSTR source, LPCWSTR dest, BOOL32 fail_if_exists)
 {
     LPSTR sourceA = HEAP_strdupWtoA( GetProcessHeap(), 0, source );
     LPSTR destA   = HEAP_strdupWtoA( GetProcessHeap(), 0, dest );
@@ -1479,10 +1480,10 @@
 /***********************************************************************
  *              SetFileTime   (KERNEL32.493)
  */
-BOOL32 SetFileTime( HFILE32 hFile,
-                    const FILETIME *lpCreationTime,
-                    const FILETIME *lpLastAccessTime,
-                    const FILETIME *lpLastWriteTime )
+BOOL32 WINAPI SetFileTime( HFILE32 hFile,
+                           const FILETIME *lpCreationTime,
+                           const FILETIME *lpLastAccessTime,
+                           const FILETIME *lpLastWriteTime )
 {
     FILE_OBJECT *file = FILE_GetFile(hFile);
     struct utimbuf utimbuf;
@@ -1596,7 +1597,7 @@
 /**************************************************************************
  *           LockFile   (KERNEL32.511)
  */
-BOOL32 LockFile(
+BOOL32 WINAPI LockFile(
 	HFILE32 hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,
 	DWORD nNumberOfBytesToLockLow,DWORD nNumberOfBytesToLockHigh )
 {
@@ -1647,7 +1648,7 @@
 /**************************************************************************
  *           UnlockFile   (KERNEL32.703)
  */
-BOOL32 UnlockFile(
+BOOL32 WINAPI UnlockFile(
 	HFILE32 hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,
 	DWORD nNumberOfBytesToUnlockLow,DWORD nNumberOfBytesToUnlockHigh )
 {
diff --git a/files/profile.c b/files/profile.c
index 6fac8eb..eb15ace 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -766,15 +766,14 @@
 
     for (lpchX = start, lpch = NULL; *lpchX != '\0'; lpchX++ )
     {
-        if( isspace( *lpchX ) ) lpch = lpch ? lpch : lpchX;
-        else lpch = NULL;
-
         if( *lpchX == ',' )
         {
             if( lpch ) *lpch = '\0'; else *lpchX = '\0';
             while( *(++lpchX) )
                 if( !isspace(*lpchX) ) return lpchX;
         }
+	else if( isspace( *lpchX ) && !lpch ) lpch = lpchX;
+	     else lpch = NULL;
     }
     if( lpch ) *lpch = '\0';
     return NULL;
@@ -786,7 +785,7 @@
 /***********************************************************************
  *           GetProfileInt16   (KERNEL.57)
  */
-UINT16 GetProfileInt16( LPCSTR section, LPCSTR entry, INT16 def_val )
+UINT16 WINAPI GetProfileInt16( LPCSTR section, LPCSTR entry, INT16 def_val )
 {
     return GetPrivateProfileInt16( section, entry, def_val, "win.ini" );
 }
@@ -795,7 +794,7 @@
 /***********************************************************************
  *           GetProfileInt32A   (KERNEL32.264)
  */
-UINT32 GetProfileInt32A( LPCSTR section, LPCSTR entry, INT32 def_val )
+UINT32 WINAPI GetProfileInt32A( LPCSTR section, LPCSTR entry, INT32 def_val )
 {
     return GetPrivateProfileInt32A( section, entry, def_val, "win.ini" );
 }
@@ -803,7 +802,7 @@
 /***********************************************************************
  *           GetProfileInt32W   (KERNEL32.264)
  */
-UINT32 GetProfileInt32W( LPCWSTR section, LPCWSTR entry, INT32 def_val )
+UINT32 WINAPI GetProfileInt32W( LPCWSTR section, LPCWSTR entry, INT32 def_val )
 {
     if (!wininiW) wininiW = HEAP_strdupAtoW( SystemHeap, 0, "win.ini" );
     return GetPrivateProfileInt32W( section, entry, def_val, wininiW );
@@ -812,8 +811,8 @@
 /***********************************************************************
  *           GetProfileString16   (KERNEL.58)
  */
-INT16 GetProfileString16( LPCSTR section, LPCSTR entry, LPCSTR def_val,
-                          LPSTR buffer, INT16 len )
+INT16 WINAPI GetProfileString16( LPCSTR section, LPCSTR entry, LPCSTR def_val,
+                                 LPSTR buffer, INT16 len )
 {
     return GetPrivateProfileString16( section, entry, def_val,
                                       buffer, len, "win.ini" );
@@ -822,8 +821,8 @@
 /***********************************************************************
  *           GetProfileString32A   (KERNEL32.268)
  */
-INT32 GetProfileString32A( LPCSTR section, LPCSTR entry, LPCSTR def_val,
-                           LPSTR buffer, INT32 len )
+INT32 WINAPI GetProfileString32A( LPCSTR section, LPCSTR entry, LPCSTR def_val,
+                                  LPSTR buffer, INT32 len )
 {
     return GetPrivateProfileString32A( section, entry, def_val,
                                        buffer, len, "win.ini" );
@@ -832,8 +831,8 @@
 /***********************************************************************
  *           GetProfileString32W   (KERNEL32.269)
  */
-INT32 GetProfileString32W( LPCWSTR section,LPCWSTR entry,LPCWSTR def_val,
-                           LPWSTR buffer, INT32 len )
+INT32 WINAPI GetProfileString32W( LPCWSTR section, LPCWSTR entry,
+                                  LPCWSTR def_val, LPWSTR buffer, INT32 len )
 {
     if (!wininiW) wininiW = HEAP_strdupAtoW( SystemHeap, 0, "win.ini" );
     return GetPrivateProfileString32W( section, entry, def_val,
@@ -844,7 +843,8 @@
 /***********************************************************************
  *           WriteProfileString16   (KERNEL.59)
  */
-BOOL16 WriteProfileString16( LPCSTR section, LPCSTR entry, LPCSTR string )
+BOOL16 WINAPI WriteProfileString16( LPCSTR section, LPCSTR entry,
+                                    LPCSTR string )
 {
     return WritePrivateProfileString16( section, entry, string, "win.ini" );
 }
@@ -852,7 +852,8 @@
 /***********************************************************************
  *           WriteProfileString32A   (KERNEL32.587)
  */
-BOOL32 WriteProfileString32A( LPCSTR section, LPCSTR entry, LPCSTR string )
+BOOL32 WINAPI WriteProfileString32A( LPCSTR section, LPCSTR entry,
+                                     LPCSTR string )
 {
     return WritePrivateProfileString32A( section, entry, string, "win.ini" );
 }
@@ -860,7 +861,8 @@
 /***********************************************************************
  *           WriteProfileString32W   (KERNEL32.588)
  */
-BOOL32 WriteProfileString32W( LPCWSTR section, LPCWSTR entry, LPCWSTR string )
+BOOL32 WINAPI WriteProfileString32W( LPCWSTR section, LPCWSTR entry,
+                                     LPCWSTR string )
 {
     if (!wininiW) wininiW = HEAP_strdupAtoW( SystemHeap, 0, "win.ini" );
     return WritePrivateProfileString32W( section, entry, string, wininiW );
@@ -870,8 +872,8 @@
 /***********************************************************************
  *           GetPrivateProfileInt16   (KERNEL.127)
  */
-UINT16 GetPrivateProfileInt16( LPCSTR section, LPCSTR entry, INT16 def_val,
-                               LPCSTR filename )
+UINT16 WINAPI GetPrivateProfileInt16( LPCSTR section, LPCSTR entry,
+                                      INT16 def_val, LPCSTR filename )
 {
     long result=(long)GetPrivateProfileInt32A(section,entry,def_val,filename);
 
@@ -884,8 +886,8 @@
 /***********************************************************************
  *           GetPrivateProfileInt32A   (KERNEL32.251)
  */
-UINT32 GetPrivateProfileInt32A( LPCSTR section, LPCSTR entry, INT32 def_val,
-                                LPCSTR filename )
+UINT32 WINAPI GetPrivateProfileInt32A( LPCSTR section, LPCSTR entry,
+                                       INT32 def_val, LPCSTR filename )
 {
     char buffer[20];
     char *p;
@@ -902,8 +904,8 @@
 /***********************************************************************
  *           GetPrivateProfileInt32W   (KERNEL32.252)
  */
-UINT32 GetPrivateProfileInt32W( LPCWSTR section, LPCWSTR entry, INT32 def_val,
-                                LPCWSTR filename )
+UINT32 WINAPI GetPrivateProfileInt32W( LPCWSTR section, LPCWSTR entry,
+                                       INT32 def_val, LPCWSTR filename )
 {
     LPSTR sectionA  = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
     LPSTR entryA    = HEAP_strdupWtoA( GetProcessHeap(), 0, entry );
@@ -918,8 +920,9 @@
 /***********************************************************************
  *           GetPrivateProfileString16   (KERNEL.128)
  */
-INT16 GetPrivateProfileString16( LPCSTR section, LPCSTR entry, LPCSTR def_val,
-                                 LPSTR buffer, INT16 len, LPCSTR filename )
+INT16 WINAPI GetPrivateProfileString16( LPCSTR section, LPCSTR entry,
+                                        LPCSTR def_val, LPSTR buffer,
+                                        INT16 len, LPCSTR filename )
 {
     return GetPrivateProfileString32A(section,entry,def_val,buffer,len,filename);
 }
@@ -927,8 +930,9 @@
 /***********************************************************************
  *           GetPrivateProfileString32A   (KERNEL32.255)
  */
-INT32 GetPrivateProfileString32A( LPCSTR section, LPCSTR entry, LPCSTR def_val,
-                                  LPSTR buffer, INT32 len, LPCSTR filename )
+INT32 WINAPI GetPrivateProfileString32A( LPCSTR section, LPCSTR entry,
+                                         LPCSTR def_val, LPSTR buffer,
+                                         INT32 len, LPCSTR filename )
 {
     if (PROFILE_Open( filename ))
         return PROFILE_GetString( section, entry, def_val, buffer, len );
@@ -939,9 +943,9 @@
 /***********************************************************************
  *           GetPrivateProfileString32W   (KERNEL32.256)
  */
-INT32 GetPrivateProfileString32W( LPCWSTR section, LPCWSTR entry,
-                                  LPCWSTR def_val, LPWSTR buffer,
-                                  INT32 len, LPCWSTR filename )
+INT32 WINAPI GetPrivateProfileString32W( LPCWSTR section, LPCWSTR entry,
+                                         LPCWSTR def_val, LPWSTR buffer,
+                                         INT32 len, LPCWSTR filename )
 {
     LPSTR sectionA  = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
     LPSTR entryA    = HEAP_strdupWtoA( GetProcessHeap(), 0, entry );
@@ -964,8 +968,8 @@
 /***********************************************************************
  *           WritePrivateProfileString16   (KERNEL.129)
  */
-BOOL16 WritePrivateProfileString16(LPCSTR section,LPCSTR entry,LPCSTR string,
-                                   LPCSTR filename)
+BOOL16 WINAPI WritePrivateProfileString16( LPCSTR section, LPCSTR entry,
+                                           LPCSTR string, LPCSTR filename )
 {
     return WritePrivateProfileString32A(section,entry,string,filename);
 }
@@ -973,8 +977,8 @@
 /***********************************************************************
  *           WritePrivateProfileString32A   (KERNEL32.582)
  */
-BOOL32 WritePrivateProfileString32A(LPCSTR section,LPCSTR entry,LPCSTR string,
-                                    LPCSTR filename )
+BOOL32 WINAPI WritePrivateProfileString32A( LPCSTR section, LPCSTR entry,
+                                            LPCSTR string, LPCSTR filename )
 {
     if (!PROFILE_Open( filename )) return FALSE;
     if (!section) return PROFILE_FlushFile();
@@ -984,8 +988,8 @@
 /***********************************************************************
  *           WritePrivateProfileString32W   (KERNEL32.583)
  */
-BOOL32 WritePrivateProfileString32W( LPCWSTR section, LPCWSTR entry,
-                                     LPCWSTR string, LPCWSTR filename )
+BOOL32 WINAPI WritePrivateProfileString32W( LPCWSTR section, LPCWSTR entry,
+                                            LPCWSTR string, LPCWSTR filename )
 {
     LPSTR sectionA  = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
     LPSTR entryA    = HEAP_strdupWtoA( GetProcessHeap(), 0, entry );
@@ -1004,7 +1008,7 @@
 /***********************************************************************
  *           WriteOutProfiles   (KERNEL.315)
  */
-void WriteOutProfiles(void)
+void WINAPI WriteOutProfiles(void)
 {
     PROFILE_FlushFile();
 }
diff --git a/graphics/bitblt.c b/graphics/bitblt.c
index eda13f4..2356de8 100644
--- a/graphics/bitblt.c
+++ b/graphics/bitblt.c
@@ -12,8 +12,8 @@
 /***********************************************************************
  *           PatBlt16    (GDI.29)
  */
-BOOL16 PatBlt16( HDC16 hdc, INT16 left, INT16 top,
-                 INT16 width, INT16 height, DWORD rop)
+BOOL16 WINAPI PatBlt16( HDC16 hdc, INT16 left, INT16 top,
+                        INT16 width, INT16 height, DWORD rop)
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc || !dc->funcs->pPatBlt) return FALSE;
@@ -27,8 +27,8 @@
 /***********************************************************************
  *           PatBlt32    (GDI32.260)
  */
-BOOL32 PatBlt32( HDC32 hdc, INT32 left, INT32 top,
-                 INT32 width, INT32 height, DWORD rop)
+BOOL32 WINAPI PatBlt32( HDC32 hdc, INT32 left, INT32 top,
+                        INT32 width, INT32 height, DWORD rop)
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc || !dc->funcs->pPatBlt) return FALSE;
@@ -42,8 +42,9 @@
 /***********************************************************************
  *           BitBlt16    (GDI.34)
  */
-BOOL16 BitBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, INT16 width,
-                 INT16 height, HDC16 hdcSrc, INT16 xSrc, INT16 ySrc, DWORD rop)
+BOOL16 WINAPI BitBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, INT16 width,
+                        INT16 height, HDC16 hdcSrc, INT16 xSrc, INT16 ySrc,
+                        DWORD rop )
 {
     DC *dcDst, *dcSrc;
 
@@ -63,8 +64,9 @@
 /***********************************************************************
  *           BitBlt32    (GDI32.10)
  */
-BOOL32 BitBlt32( HDC32 hdcDst, INT32 xDst, INT32 yDst, INT32 width,
-                 INT32 height, HDC32 hdcSrc, INT32 xSrc, INT32 ySrc, DWORD rop)
+BOOL32 WINAPI BitBlt32( HDC32 hdcDst, INT32 xDst, INT32 yDst, INT32 width,
+                        INT32 height, HDC32 hdcSrc, INT32 xSrc, INT32 ySrc,
+                        DWORD rop )
 {
     DC *dcDst, *dcSrc;
 
@@ -84,10 +86,10 @@
 /***********************************************************************
  *           StretchBlt16    (GDI.35)
  */
-BOOL16 StretchBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst,
-                     INT16 widthDst, INT16 heightDst,
-                     HDC16 hdcSrc, INT16 xSrc, INT16 ySrc,
-                     INT16 widthSrc, INT16 heightSrc, DWORD rop )
+BOOL16 WINAPI StretchBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst,
+                            INT16 widthDst, INT16 heightDst,
+                            HDC16 hdcSrc, INT16 xSrc, INT16 ySrc,
+                            INT16 widthSrc, INT16 heightSrc, DWORD rop )
 {
     DC *dcDst, *dcSrc;
 
@@ -109,10 +111,10 @@
 /***********************************************************************
  *           StretchBlt32    (GDI32.350)
  */
-BOOL32 StretchBlt32( HDC32 hdcDst, INT32 xDst, INT32 yDst,
-                     INT32 widthDst, INT32 heightDst,
-                     HDC32 hdcSrc, INT32 xSrc, INT32 ySrc,
-                     INT32 widthSrc, INT32 heightSrc, DWORD rop )
+BOOL32 WINAPI StretchBlt32( HDC32 hdcDst, INT32 xDst, INT32 yDst,
+                            INT32 widthDst, INT32 heightDst,
+                            HDC32 hdcSrc, INT32 xSrc, INT32 ySrc,
+                            INT32 widthSrc, INT32 heightSrc, DWORD rop )
 {
     DC *dcDst, *dcSrc;
 
@@ -134,8 +136,8 @@
 /***********************************************************************
  *           FastWindowFrame    (GDI.400)
  */
-BOOL16 FastWindowFrame( HDC16 hdc, const RECT16 *rect,
-                        INT16 width, INT16 height, DWORD rop )
+BOOL16 WINAPI FastWindowFrame( HDC16 hdc, const RECT16 *rect,
+                               INT16 width, INT16 height, DWORD rop )
 {
     HBRUSH32 hbrush = SelectObject32( hdc, GetStockObject32( GRAY_BRUSH ) );
     PatBlt32( hdc, rect->left, rect->top,
diff --git a/graphics/escape.c b/graphics/escape.c
index d742fc1..b60b9a8 100644
--- a/graphics/escape.c
+++ b/graphics/escape.c
@@ -9,19 +9,24 @@
 #include "gdi.h"
 #include "dc.h"
 
-INT16 Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput,
-                SEGPTR lpszInData, SEGPTR lpvOutData )
+INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput,
+                       SEGPTR lpszInData, SEGPTR lpvOutData )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc || !dc->funcs->pEscape) return 0;
     return dc->funcs->pEscape( dc, nEscape, cbInput, lpszInData, lpvOutData );
 }
 
-INT32 Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
-                LPVOID lpszInData, LPVOID lpvOutData )
+INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
+                       LPVOID lpszInData, LPVOID lpvOutData )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc || !dc->funcs->pEscape) return 0;
+    switch (nEscape) {
+    case GETSCALINGFACTOR:
+         return 1;
+    	
+    }
     return dc->funcs->pEscape( dc, nEscape, cbInput,
                                (SEGPTR)lpszInData, (SEGPTR)lpvOutData );
 }
diff --git a/graphics/fontengine.c b/graphics/fontengine.c
index 376b7f7..4dd6e1f 100644
--- a/graphics/fontengine.c
+++ b/graphics/fontengine.c
@@ -8,23 +8,20 @@
 #include "windows.h"
 
 /* GDI 300 */
-WORD 
-EngineEnumerateFont(LPSTR fontname, FARPROC16 proc, DWORD data )
+WORD WINAPI EngineEnumerateFont(LPSTR fontname, FARPROC16 proc, DWORD data )
 {
     printf("In engineEnumerateFont for %s\n",(fontname)?fontname:"NULL");
     return 0;
 }
 #ifdef NOTDEF
 /* GDI 301 */
-WORD 
-EngineDeleteFont(LPFONTINFO16 lpFontInfo)
+WORD WINAPI EngineDeleteFont(LPFONTINFO16 lpFontInfo)
 {
     return 0
 }
 #endif
 /* GDI 302 */
-WORD
-EngineRealizeFont(LPLOGFONT16 lplogFont, LPTEXTXFORM16 lptextxform, LPFONTINFO16 lpfontInfo)
+WORD WINAPI EngineRealizeFont(LPLOGFONT16 lplogFont, LPTEXTXFORM16 lptextxform, LPFONTINFO16 lpfontInfo)
 {
     printf("In EngineRealizeFont\n");
     
@@ -32,27 +29,23 @@
 }
 #ifdef NOTDEF
 /* GDI 303 */
-WORD 
-EngineGetCharWidth(LPFONTINFO16 lpFontInfo, BYTE, BYTE, LPINT16)
+WORD WINAPI EngineGetCharWidth(LPFONTINFO16 lpFontInfo, BYTE, BYTE, LPINT16)
 {
     return 0;
 }
 
 /* GDI 304 */
-WORD 
-EngineSetFontContext(LPFONTINFO lpFontInfo, WORD data)
+WORD WINAPI EngineSetFontContext(LPFONTINFO lpFontInfo, WORD data)
 {
 }
 /* GDI 305 */
-WORD 
-EngineGetGlyphBMP(WORD word, LPFONTINFO lpFontInfo, WORD, WORD, LPSTR string, DWORD dword, LPBITMAPMETRICS16 metrics)
+WORD WINAPI EngineGetGlyphBMP(WORD word, LPFONTINFO lpFontInfo, WORD, WORD, LPSTR string, DWORD dword, LPBITMAPMETRICS16 metrics)
 {
     return 0;
 }
 
 /* GDI 306 */
-DWORD 
-EngineMakeFontDir(HDC16 hdc, LPFONTDIR fontdir, LPCSTR string)
+DWORD WINAPI EngineMakeFontDir(HDC16 hdc, LPFONTDIR fontdir, LPCSTR string)
 {
     return 0;
     
@@ -60,8 +53,7 @@
 
 /* GDI 314 */
 
-WORD 
-EngineExtTextOut()
+WORD WINAPI EngineExtTextOut()
 {
 }
 
diff --git a/graphics/mapping.c b/graphics/mapping.c
index e70c1e5..576eb34 100644
--- a/graphics/mapping.c
+++ b/graphics/mapping.c
@@ -37,7 +37,7 @@
 /***********************************************************************
  *           DPtoLP16    (GDI.67)
  */
-BOOL16 DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count )
+BOOL16 WINAPI DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
@@ -55,7 +55,7 @@
 /***********************************************************************
  *           DPtoLP32    (GDI32.65)
  */
-BOOL32 DPtoLP32( HDC32 hdc, LPPOINT32 points, INT32 count )
+BOOL32 WINAPI DPtoLP32( HDC32 hdc, LPPOINT32 points, INT32 count )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
@@ -73,7 +73,7 @@
 /***********************************************************************
  *           LPtoDP16    (GDI.99)
  */
-BOOL16 LPtoDP16( HDC16 hdc, LPPOINT16 points, INT16 count )
+BOOL16 WINAPI LPtoDP16( HDC16 hdc, LPPOINT16 points, INT16 count )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
@@ -91,7 +91,7 @@
 /***********************************************************************
  *           LPtoDP32    (GDI32.247)
  */
-BOOL32 LPtoDP32( HDC32 hdc, LPPOINT32 points, INT32 count )
+BOOL32 WINAPI LPtoDP32( HDC32 hdc, LPPOINT32 points, INT32 count )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
@@ -109,7 +109,7 @@
 /***********************************************************************
  *           SetMapMode16    (GDI.3)
  */
-INT16 SetMapMode16( HDC16 hdc, INT16 mode )
+INT16 WINAPI SetMapMode16( HDC16 hdc, INT16 mode )
 {
     return SetMapMode32( hdc, mode );
 }
@@ -118,7 +118,7 @@
 /***********************************************************************
  *           SetMapMode32    (GDI32.321)
  */
-INT32 SetMapMode32( HDC32 hdc, INT32 mode )
+INT32 WINAPI SetMapMode32( HDC32 hdc, INT32 mode )
 {
     INT32 prevMode;
     DC * dc = DC_GetDCPtr( hdc );
@@ -199,7 +199,7 @@
 /***********************************************************************
  *           SetViewportExt    (GDI.14)
  */
-DWORD SetViewportExt( HDC16 hdc, INT16 x, INT16 y )
+DWORD WINAPI SetViewportExt( HDC16 hdc, INT16 x, INT16 y )
 {
     SIZE32 size;
     if (!SetViewportExtEx32( hdc, x, y, &size )) return 0;
@@ -210,7 +210,7 @@
 /***********************************************************************
  *           SetViewportExtEx16    (GDI.479)
  */
-BOOL16 SetViewportExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
+BOOL16 WINAPI SetViewportExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
 {
     SIZE32 size32;
     BOOL16 ret = SetViewportExtEx32( hdc, x, y, &size32 );
@@ -222,7 +222,7 @@
 /***********************************************************************
  *           SetViewportExtEx32    (GDI32.340)
  */
-BOOL32 SetViewportExtEx32( HDC32 hdc, INT32 x, INT32 y, LPSIZE32 size )
+BOOL32 WINAPI SetViewportExtEx32( HDC32 hdc, INT32 x, INT32 y, LPSIZE32 size )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc) return FALSE;
@@ -246,7 +246,7 @@
 /***********************************************************************
  *           SetViewportOrg    (GDI.13)
  */
-DWORD SetViewportOrg( HDC16 hdc, INT16 x, INT16 y )
+DWORD WINAPI SetViewportOrg( HDC16 hdc, INT16 x, INT16 y )
 {
     POINT32 pt;
     if (!SetViewportOrgEx32( hdc, x, y, &pt )) return 0;
@@ -257,7 +257,7 @@
 /***********************************************************************
  *           SetViewportOrgEx16    (GDI.480)
  */
-BOOL16 SetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
+BOOL16 WINAPI SetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
 {
     POINT32 pt32;
     BOOL16 ret = SetViewportOrgEx32( hdc, x, y, &pt32 );
@@ -269,7 +269,7 @@
 /***********************************************************************
  *           SetViewportOrgEx32    (GDI32.341)
  */
-BOOL32 SetViewportOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt )
+BOOL32 WINAPI SetViewportOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc) return FALSE;
@@ -289,7 +289,7 @@
 /***********************************************************************
  *           SetWindowExt    (GDI.12)
  */
-DWORD SetWindowExt( HDC16 hdc, INT16 x, INT16 y )
+DWORD WINAPI SetWindowExt( HDC16 hdc, INT16 x, INT16 y )
 {
     SIZE32 size;
     if (!SetWindowExtEx32( hdc, x, y, &size )) return 0;
@@ -300,7 +300,7 @@
 /***********************************************************************
  *           SetWindowExtEx16    (GDI.481)
  */
-BOOL16 SetWindowExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
+BOOL16 WINAPI SetWindowExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
 {
     SIZE32 size32;
     BOOL16 ret = SetWindowExtEx32( hdc, x, y, &size32 );
@@ -312,7 +312,7 @@
 /***********************************************************************
  *           SetWindowExtEx32    (GDI32.344)
  */
-BOOL32 SetWindowExtEx32( HDC32 hdc, INT32 x, INT32 y, LPSIZE32 size )
+BOOL32 WINAPI SetWindowExtEx32( HDC32 hdc, INT32 x, INT32 y, LPSIZE32 size )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc) return FALSE;
@@ -335,7 +335,7 @@
 /***********************************************************************
  *           SetWindowOrg    (GDI.11)
  */
-DWORD SetWindowOrg( HDC16 hdc, INT16 x, INT16 y )
+DWORD WINAPI SetWindowOrg( HDC16 hdc, INT16 x, INT16 y )
 {
     POINT32 pt;
     if (!SetWindowOrgEx32( hdc, x, y, &pt )) return 0;
@@ -346,7 +346,7 @@
 /***********************************************************************
  *           SetWindowOrgEx16    (GDI.482)
  */
-BOOL16 SetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
+BOOL16 WINAPI SetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
 {
     POINT32 pt32;
     BOOL16 ret = SetWindowOrgEx32( hdc, x, y, &pt32 );
@@ -358,7 +358,7 @@
 /***********************************************************************
  *           SetWindowOrgEx32    (GDI32.345)
  */
-BOOL32 SetWindowOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt )
+BOOL32 WINAPI SetWindowOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc) return FALSE;
@@ -377,7 +377,7 @@
 /***********************************************************************
  *           OffsetViewportOrg    (GDI.17)
  */
-DWORD OffsetViewportOrg( HDC16 hdc, INT16 x, INT16 y )
+DWORD WINAPI OffsetViewportOrg( HDC16 hdc, INT16 x, INT16 y )
 {
     POINT32 pt;
     if (!OffsetViewportOrgEx32( hdc, x, y, &pt )) return 0;
@@ -388,7 +388,7 @@
 /***********************************************************************
  *           OffsetViewportOrgEx16    (GDI.476)
  */
-BOOL16 OffsetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
+BOOL16 WINAPI OffsetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt)
 {
     POINT32 pt32;
     BOOL16 ret = OffsetViewportOrgEx32( hdc, x, y, &pt32 );
@@ -400,7 +400,7 @@
 /***********************************************************************
  *           OffsetViewportOrgEx32    (GDI32.257)
  */
-BOOL32 OffsetViewportOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt )
+BOOL32 WINAPI OffsetViewportOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt)
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc) return FALSE;
@@ -420,7 +420,7 @@
 /***********************************************************************
  *           OffsetWindowOrg    (GDI.15)
  */
-DWORD OffsetWindowOrg( HDC16 hdc, INT16 x, INT16 y )
+DWORD WINAPI OffsetWindowOrg( HDC16 hdc, INT16 x, INT16 y )
 {
     POINT32 pt;
     if (!OffsetWindowOrgEx32( hdc, x, y, &pt )) return 0;
@@ -431,7 +431,7 @@
 /***********************************************************************
  *           OffsetWindowOrgEx16    (GDI.477)
  */
-BOOL16 OffsetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
+BOOL16 WINAPI OffsetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
 {
     POINT32 pt32;
     BOOL16 ret = OffsetWindowOrgEx32( hdc, x, y, &pt32 );
@@ -443,7 +443,7 @@
 /***********************************************************************
  *           OffsetWindowOrgEx32    (GDI32.258)
  */
-BOOL32 OffsetWindowOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt )
+BOOL32 WINAPI OffsetWindowOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc) return FALSE;
@@ -463,8 +463,8 @@
 /***********************************************************************
  *           ScaleViewportExt    (GDI.18)
  */
-DWORD ScaleViewportExt( HDC16 hdc, INT16 xNum, INT16 xDenom,
-                        INT16 yNum, INT16 yDenom )
+DWORD WINAPI ScaleViewportExt( HDC16 hdc, INT16 xNum, INT16 xDenom,
+                               INT16 yNum, INT16 yDenom )
 {
     SIZE32 size;
     if (!ScaleViewportExtEx32( hdc, xNum, xDenom, yNum, yDenom, &size ))
@@ -476,8 +476,8 @@
 /***********************************************************************
  *           ScaleViewportExtEx16    (GDI.484)
  */
-BOOL16 ScaleViewportExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
-                             INT16 yNum, INT16 yDenom, LPSIZE16 size )
+BOOL16 WINAPI ScaleViewportExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
+                                    INT16 yNum, INT16 yDenom, LPSIZE16 size )
 {
     SIZE32 size32;
     BOOL16 ret = ScaleViewportExtEx32( hdc, xNum, xDenom, yNum, yDenom,
@@ -490,8 +490,8 @@
 /***********************************************************************
  *           ScaleViewportExtEx32    (GDI32.293)
  */
-BOOL32 ScaleViewportExtEx32( HDC32 hdc, INT32 xNum, INT32 xDenom,
-                             INT32 yNum, INT32 yDenom, LPSIZE32 size )
+BOOL32 WINAPI ScaleViewportExtEx32( HDC32 hdc, INT32 xNum, INT32 xDenom,
+                                    INT32 yNum, INT32 yDenom, LPSIZE32 size )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc) return FALSE;
@@ -517,8 +517,8 @@
 /***********************************************************************
  *           ScaleWindowExt    (GDI.16)
  */
-DWORD ScaleWindowExt( HDC16 hdc, INT16 xNum, INT16 xDenom,
-		      INT16 yNum, INT16 yDenom )
+DWORD WINAPI ScaleWindowExt( HDC16 hdc, INT16 xNum, INT16 xDenom,
+                             INT16 yNum, INT16 yDenom )
 {
     SIZE32 size;
     if (!ScaleWindowExtEx32( hdc, xNum, xDenom, yNum, yDenom, &size ))
@@ -530,8 +530,8 @@
 /***********************************************************************
  *           ScaleWindowExtEx16    (GDI.485)
  */
-BOOL16 ScaleWindowExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
-                           INT16 yNum, INT16 yDenom, LPSIZE16 size )
+BOOL16 WINAPI ScaleWindowExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
+                                  INT16 yNum, INT16 yDenom, LPSIZE16 size )
 {
     SIZE32 size32;
     BOOL16 ret = ScaleWindowExtEx32( hdc, xNum, xDenom, yNum, yDenom,
@@ -544,8 +544,8 @@
 /***********************************************************************
  *           ScaleWindowExtEx32    (GDI32.294)
  */
-BOOL32 ScaleWindowExtEx32( HDC32 hdc, INT32 xNum, INT32 xDenom,
-                           INT32 yNum, INT32 yDenom, LPSIZE32 size )
+BOOL32 WINAPI ScaleWindowExtEx32( HDC32 hdc, INT32 xNum, INT32 xDenom,
+                                  INT32 yNum, INT32 yDenom, LPSIZE32 size )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc) return FALSE;
diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c
index a5ffa69..b187bce 100644
--- a/graphics/metafiledrv/init.c
+++ b/graphics/metafiledrv/init.c
@@ -138,7 +138,7 @@
 /**********************************************************************
  *	     CreateMetafile16   (GDI.125)
  */
-HDC16 CreateMetaFile16( LPCSTR filename )
+HDC16 WINAPI CreateMetaFile16( LPCSTR filename )
 {
     DC *dc;
     METAFILEDRV_PDEVICE *physDev;
@@ -177,7 +177,7 @@
 /******************************************************************
  *	     CloseMetafile16   (GDI.126)
  */
-HMETAFILE16 CloseMetaFile16( HDC16 hdc )
+HMETAFILE16 WINAPI CloseMetaFile16( HDC16 hdc )
 {
     DC *dc;
     HMETAFILE16 hmf;
@@ -231,7 +231,7 @@
 /******************************************************************
  *	     DeleteMetafile16   (GDI.127)
  */
-BOOL16 DeleteMetaFile16( HMETAFILE16 hmf )
+BOOL16 WINAPI DeleteMetaFile16( HMETAFILE16 hmf )
 {
     return !GlobalFree16( hmf );
 }
diff --git a/graphics/metafiledrv/objects.c b/graphics/metafiledrv/objects.c
index 2c1aa22..dcb096d 100644
--- a/graphics/metafiledrv/objects.c
+++ b/graphics/metafiledrv/objects.c
@@ -83,6 +83,7 @@
 HGDIOBJ32 MFDRV_SelectObject( DC *dc, HGDIOBJ32 handle )
 {
     GDIOBJHDR * ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE );
+    HGDIOBJ32 ret = 0;
 
     if (!ptr) return 0;
     dprintf_gdi(stddeb, "SelectObject: hdc=%04x %04x\n", dc->hSelf, handle );
@@ -90,15 +91,21 @@
     switch(ptr->wMagic)
     {
       case PEN_MAGIC:
-	  return MFDRV_PEN_SelectObject( dc, handle, (PENOBJ *)ptr );
+	  ret = MFDRV_PEN_SelectObject( dc, handle, (PENOBJ *)ptr );
+	  break;
       case BRUSH_MAGIC:
-	  return MFDRV_BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );
+	  ret = MFDRV_BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );
+	  break;
       case BITMAP_MAGIC:
-	  return MFDRV_BITMAP_SelectObject( dc, handle, (BITMAPOBJ *)ptr );
+	  ret = MFDRV_BITMAP_SelectObject( dc, handle, (BITMAPOBJ *)ptr );
+	  break;
       case FONT_MAGIC:
-	  return MFDRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
+	  ret = MFDRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
+	  break;
       case REGION_MAGIC:
-	  return (HGDIOBJ16)SelectClipRgn16( dc->hSelf, handle );
+	  ret = (HGDIOBJ16)SelectClipRgn16( dc->hSelf, handle );
+	  break;
     }
-    return 0;
+    GDI_HEAP_UNLOCK( handle );
+    return ret;
 }
diff --git a/graphics/painting.c b/graphics/painting.c
index ed96464..efd785a 100644
--- a/graphics/painting.c
+++ b/graphics/painting.c
@@ -29,7 +29,7 @@
 /***********************************************************************
  *           LineTo16    (GDI.19)
  */
-BOOL16 LineTo16( HDC16 hdc, INT16 x, INT16 y )
+BOOL16 WINAPI LineTo16( HDC16 hdc, INT16 x, INT16 y )
 {
     return LineTo32( hdc, x, y );
 }
@@ -38,7 +38,7 @@
 /***********************************************************************
  *           LineTo32    (GDI32.249)
  */
-BOOL32 LineTo32( HDC32 hdc, INT32 x, INT32 y )
+BOOL32 WINAPI LineTo32( HDC32 hdc, INT32 x, INT32 y )
 {
     DC * dc = DC_GetDCPtr( hdc );
 
@@ -50,7 +50,7 @@
 /***********************************************************************
  *           MoveTo    (GDI.20)
  */
-DWORD MoveTo( HDC16 hdc, INT16 x, INT16 y )
+DWORD WINAPI MoveTo( HDC16 hdc, INT16 x, INT16 y )
 {
     POINT16	pt;
 
@@ -63,7 +63,7 @@
 /***********************************************************************
  *           MoveToEx16    (GDI.483)
  */
-BOOL16 MoveToEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
+BOOL16 WINAPI MoveToEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
 {
     POINT32 pt32;
 
@@ -77,7 +77,7 @@
 /***********************************************************************
  *           MoveToEx32    (GDI32.254)
  */
-BOOL32 MoveToEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt )
+BOOL32 WINAPI MoveToEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt )
 {
     DC * dc = DC_GetDCPtr( hdc );
   
@@ -89,8 +89,9 @@
 /***********************************************************************
  *           Arc16    (GDI.23)
  */
-BOOL16 Arc16( HDC16 hdc, INT16 left, INT16 top, INT16 right, INT16 bottom,
-              INT16 xstart, INT16 ystart, INT16 xend, INT16 yend )
+BOOL16 WINAPI Arc16( HDC16 hdc, INT16 left, INT16 top, INT16 right,
+                     INT16 bottom, INT16 xstart, INT16 ystart,
+                     INT16 xend, INT16 yend )
 {
     return Arc32( (HDC32)hdc, (INT32)left, (INT32)top, (INT32)right,
    		  (INT32)bottom, (INT32)xstart, (INT32)ystart, (INT32)xend,
@@ -101,8 +102,9 @@
 /***********************************************************************
  *           Arc32    (GDI32.7)
  */
-BOOL32 Arc32( HDC32 hdc, INT32 left, INT32 top, INT32 right, INT32 bottom,
-              INT32 xstart, INT32 ystart, INT32 xend, INT32 yend )
+BOOL32 WINAPI Arc32( HDC32 hdc, INT32 left, INT32 top, INT32 right,
+                     INT32 bottom, INT32 xstart, INT32 ystart,
+                     INT32 xend, INT32 yend )
 {
     DC * dc = DC_GetDCPtr( hdc );
   
@@ -114,8 +116,9 @@
 /***********************************************************************
  *           Pie16    (GDI.26)
  */
-BOOL16 Pie16( HDC16 hdc, INT16 left, INT16 top, INT16 right, INT16 bottom,
-              INT16 xstart, INT16 ystart, INT16 xend, INT16 yend )
+BOOL16 WINAPI Pie16( HDC16 hdc, INT16 left, INT16 top,
+                     INT16 right, INT16 bottom, INT16 xstart, INT16 ystart,
+                     INT16 xend, INT16 yend )
 {
     return Pie32( (HDC32)hdc, (INT32)left, (INT32)top, (INT32)right,
    		  (INT32)bottom, (INT32)xstart, (INT32)ystart, (INT32)xend,
@@ -126,8 +129,9 @@
 /***********************************************************************
  *           Pie32   (GDI32.262)
  */
-BOOL32 Pie32( HDC32 hdc, INT32 left, INT32 top, INT32 right, INT32 bottom,
-              INT32 xstart, INT32 ystart, INT32 xend, INT32 yend )
+BOOL32 WINAPI Pie32( HDC32 hdc, INT32 left, INT32 top,
+                     INT32 right, INT32 bottom, INT32 xstart, INT32 ystart,
+                     INT32 xend, INT32 yend )
 {
     DC * dc = DC_GetDCPtr( hdc );
   
@@ -139,8 +143,9 @@
 /***********************************************************************
  *           Chord16    (GDI.348)
  */
-BOOL16 Chord16( HDC16 hdc, INT16 left, INT16 top, INT16 right, INT16 bottom,
-                INT16 xstart, INT16 ystart, INT16 xend, INT16 yend )
+BOOL16 WINAPI Chord16( HDC16 hdc, INT16 left, INT16 top,
+                       INT16 right, INT16 bottom, INT16 xstart, INT16 ystart,
+                       INT16 xend, INT16 yend )
 {
     return Chord32( hdc, left, top, right, bottom, xstart, ystart, xend, yend );
 }
@@ -149,8 +154,9 @@
 /***********************************************************************
  *           Chord32    (GDI32.14)
  */
-BOOL32 Chord32( HDC32 hdc, INT32 left, INT32 top, INT32 right, INT32 bottom,
-                INT32 xstart, INT32 ystart, INT32 xend, INT32 yend )
+BOOL32 WINAPI Chord32( HDC32 hdc, INT32 left, INT32 top,
+                       INT32 right, INT32 bottom, INT32 xstart, INT32 ystart,
+                       INT32 xend, INT32 yend )
 {
     DC * dc = DC_GetDCPtr( hdc );
   
@@ -162,7 +168,8 @@
 /***********************************************************************
  *           Ellipse16    (GDI.24)
  */
-BOOL16 Ellipse16( HDC16 hdc, INT16 left, INT16 top, INT16 right, INT16 bottom )
+BOOL16 WINAPI Ellipse16( HDC16 hdc, INT16 left, INT16 top,
+                         INT16 right, INT16 bottom )
 {
     return Ellipse32( hdc, left, top, right, bottom );
 }
@@ -171,7 +178,8 @@
 /***********************************************************************
  *           Ellipse32    (GDI32.75)
  */
-BOOL32 Ellipse32( HDC32 hdc, INT32 left, INT32 top, INT32 right, INT32 bottom )
+BOOL32 WINAPI Ellipse32( HDC32 hdc, INT32 left, INT32 top,
+                         INT32 right, INT32 bottom )
 {
     DC * dc = DC_GetDCPtr( hdc );
   
@@ -183,7 +191,8 @@
 /***********************************************************************
  *           Rectangle16    (GDI.27)
  */
-BOOL16 Rectangle16(HDC16 hdc, INT16 left, INT16 top, INT16 right, INT16 bottom)
+BOOL16 WINAPI Rectangle16( HDC16 hdc, INT16 left, INT16 top,
+                           INT16 right, INT16 bottom )
 {
     return Rectangle32( hdc, left, top, right, bottom );
 }
@@ -192,7 +201,8 @@
 /***********************************************************************
  *           Rectangle32    (GDI32.283)
  */
-BOOL32 Rectangle32(HDC32 hdc, INT32 left, INT32 top, INT32 right, INT32 bottom)
+BOOL32 WINAPI Rectangle32( HDC32 hdc, INT32 left, INT32 top,
+                           INT32 right, INT32 bottom )
 {
     DC * dc = DC_GetDCPtr( hdc );
   
@@ -204,8 +214,8 @@
 /***********************************************************************
  *           RoundRect16    (GDI.28)
  */
-BOOL16 RoundRect16( HDC16 hdc, INT16 left, INT16 top, INT16 right,
-                    INT16 bottom, INT16 ell_width, INT16 ell_height )
+BOOL16 WINAPI RoundRect16( HDC16 hdc, INT16 left, INT16 top, INT16 right,
+                           INT16 bottom, INT16 ell_width, INT16 ell_height )
 {
     return RoundRect32( hdc, left, top, right, bottom, ell_width, ell_height );
 }
@@ -214,8 +224,8 @@
 /***********************************************************************
  *           RoundRect32    (GDI32.291)
  */
-BOOL32 RoundRect32( HDC32 hdc, INT32 left, INT32 top, INT32 right,
-                    INT32 bottom, INT32 ell_width, INT32 ell_height )
+BOOL32 WINAPI RoundRect32( HDC32 hdc, INT32 left, INT32 top, INT32 right,
+                           INT32 bottom, INT32 ell_width, INT32 ell_height )
 {
     DC * dc = DC_GetDCPtr( hdc );
   
@@ -227,7 +237,7 @@
 /***********************************************************************
  *           FillRect16    (USER.81)
  */
-INT16 FillRect16( HDC16 hdc, const RECT16 *rect, HBRUSH16 hbrush )
+INT16 WINAPI FillRect16( HDC16 hdc, const RECT16 *rect, HBRUSH16 hbrush )
 {
     HBRUSH16 prevBrush;
 
@@ -246,7 +256,7 @@
 /***********************************************************************
  *           FillRect32    (USER32.196)
  */
-INT32 FillRect32( HDC32 hdc, const RECT32 *rect, HBRUSH32 hbrush )
+INT32 WINAPI FillRect32( HDC32 hdc, const RECT32 *rect, HBRUSH32 hbrush )
 {
     HBRUSH32 prevBrush;
 
@@ -261,7 +271,7 @@
 /***********************************************************************
  *           InvertRect16    (USER.82)
  */
-void InvertRect16( HDC16 hdc, const RECT16 *rect )
+void WINAPI InvertRect16( HDC16 hdc, const RECT16 *rect )
 {
     PatBlt32( hdc, rect->left, rect->top,
               rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
@@ -271,7 +281,7 @@
 /***********************************************************************
  *           InvertRect32    (USER32.329)
  */
-void InvertRect32( HDC32 hdc, const RECT32 *rect )
+void WINAPI InvertRect32( HDC32 hdc, const RECT32 *rect )
 {
     PatBlt32( hdc, rect->left, rect->top,
               rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
@@ -281,7 +291,7 @@
 /***********************************************************************
  *           FrameRect16    (USER.83)
  */
-INT16 FrameRect16( HDC16 hdc, const RECT16 *rect, HBRUSH16 hbrush )
+INT16 WINAPI FrameRect16( HDC16 hdc, const RECT16 *rect, HBRUSH16 hbrush )
 {
     HBRUSH16 prevBrush;
     int left, top, right, bottom;
@@ -316,7 +326,7 @@
 /***********************************************************************
  *           FrameRect32    (USER32.202)
  */
-INT32 FrameRect32( HDC32 hdc, const RECT32 *rect, HBRUSH32 hbrush )
+INT32 WINAPI FrameRect32( HDC32 hdc, const RECT32 *rect, HBRUSH32 hbrush )
 {
     RECT16 rect16;
     CONV_RECT32TO16( rect, &rect16 );
@@ -327,7 +337,7 @@
 /***********************************************************************
  *           SetPixel16    (GDI.31)
  */
-COLORREF SetPixel16( HDC16 hdc, INT16 x, INT16 y, COLORREF color )
+COLORREF WINAPI SetPixel16( HDC16 hdc, INT16 x, INT16 y, COLORREF color )
 {
     return SetPixel32( hdc, x, y, color );
 }
@@ -336,7 +346,7 @@
 /***********************************************************************
  *           SetPixel32    (GDI32.327)
  */
-COLORREF SetPixel32( HDC32 hdc, INT32 x, INT32 y, COLORREF color )
+COLORREF WINAPI SetPixel32( HDC32 hdc, INT32 x, INT32 y, COLORREF color )
 {
     DC * dc = DC_GetDCPtr( hdc );
   
@@ -348,7 +358,7 @@
 /***********************************************************************
  *           GetPixel16    (GDI.83)
  */
-COLORREF GetPixel16( HDC16 hdc, INT16 x, INT16 y )
+COLORREF WINAPI GetPixel16( HDC16 hdc, INT16 x, INT16 y )
 {
     return GetPixel32( hdc, x, y );
 }
@@ -357,7 +367,7 @@
 /***********************************************************************
  *           GetPixel32    (GDI32.211)
  */
-COLORREF GetPixel32( HDC32 hdc, INT32 x, INT32 y )
+COLORREF WINAPI GetPixel32( HDC32 hdc, INT32 x, INT32 y )
 {
     DC * dc = DC_GetDCPtr( hdc );
 
@@ -376,7 +386,7 @@
 /***********************************************************************
  *           PaintRgn16    (GDI.43)
  */
-BOOL16 PaintRgn16( HDC16 hdc, HRGN16 hrgn )
+BOOL16 WINAPI PaintRgn16( HDC16 hdc, HRGN16 hrgn )
 {
     return PaintRgn32( hdc, hrgn );
 }
@@ -385,7 +395,7 @@
 /***********************************************************************
  *           PaintRgn32    (GDI32.259)
  */
-BOOL32 PaintRgn32( HDC32 hdc, HRGN32 hrgn )
+BOOL32 WINAPI PaintRgn32( HDC32 hdc, HRGN32 hrgn )
 {
     DC * dc = DC_GetDCPtr( hdc );
 
@@ -397,7 +407,7 @@
 /***********************************************************************
  *           FillRgn16    (GDI.40)
  */
-BOOL16 FillRgn16( HDC16 hdc, HRGN16 hrgn, HBRUSH16 hbrush )
+BOOL16 WINAPI FillRgn16( HDC16 hdc, HRGN16 hrgn, HBRUSH16 hbrush )
 {
     return FillRgn32( hdc, hrgn, hbrush );
 }
@@ -406,7 +416,7 @@
 /***********************************************************************
  *           FillRgn32    (GDI32.101)
  */
-BOOL32 FillRgn32( HDC32 hdc, HRGN32 hrgn, HBRUSH32 hbrush )
+BOOL32 WINAPI FillRgn32( HDC32 hdc, HRGN32 hrgn, HBRUSH32 hbrush )
 {
     BOOL32 retval;
     HBRUSH32 prevBrush = SelectObject32( hdc, hbrush );
@@ -420,8 +430,8 @@
 /***********************************************************************
  *           FrameRgn16     (GDI.41)
  */
-BOOL16 FrameRgn16( HDC16 hdc, HRGN16 hrgn, HBRUSH16 hbrush,
-                   INT16 nWidth, INT16 nHeight )
+BOOL16 WINAPI FrameRgn16( HDC16 hdc, HRGN16 hrgn, HBRUSH16 hbrush,
+                          INT16 nWidth, INT16 nHeight )
 {
     return FrameRgn32( hdc, hrgn, hbrush, nWidth, nHeight );
 }
@@ -430,8 +440,8 @@
 /***********************************************************************
  *           FrameRgn32     (GDI32.105)
  */
-BOOL32 FrameRgn32( HDC32 hdc, HRGN32 hrgn, HBRUSH32 hbrush,
-                   INT32 nWidth, INT32 nHeight )
+BOOL32 WINAPI FrameRgn32( HDC32 hdc, HRGN32 hrgn, HBRUSH32 hbrush,
+                          INT32 nWidth, INT32 nHeight )
 {
     HRGN32 tmp = CreateRectRgn32( 0, 0, 0, 0 );
     if(!REGION_FrameRgn( tmp, hrgn, nWidth, nHeight )) return FALSE;
@@ -444,7 +454,7 @@
 /***********************************************************************
  *           InvertRgn16    (GDI.42)
  */
-BOOL16 InvertRgn16( HDC16 hdc, HRGN16 hrgn )
+BOOL16 WINAPI InvertRgn16( HDC16 hdc, HRGN16 hrgn )
 {
     return InvertRgn32( hdc, hrgn );
 }
@@ -453,7 +463,7 @@
 /***********************************************************************
  *           InvertRgn32    (GDI32.246)
  */
-BOOL32 InvertRgn32( HDC32 hdc, HRGN32 hrgn )
+BOOL32 WINAPI InvertRgn32( HDC32 hdc, HRGN32 hrgn )
 {
     HBRUSH32 prevBrush = SelectObject32( hdc, GetStockObject32(BLACK_BRUSH) );
     INT32 prevROP = SetROP232( hdc, R2_NOT );
@@ -467,7 +477,7 @@
 /***********************************************************************
  *           DrawFocusRect16    (USER.466)
  */
-void DrawFocusRect16( HDC16 hdc, const RECT16* rc )
+void WINAPI DrawFocusRect16( HDC16 hdc, const RECT16* rc )
 {
     RECT32 rect32;
     CONV_RECT16TO32( rc, &rect32 );
@@ -480,7 +490,7 @@
  *
  * FIXME: PatBlt(PATINVERT) with background brush.
  */
-void DrawFocusRect32( HDC32 hdc, const RECT32* rc )
+void WINAPI DrawFocusRect32( HDC32 hdc, const RECT32* rc )
 {
     HPEN32 hOldPen;
     INT32 oldDrawMode, oldBkMode;
@@ -515,7 +525,7 @@
 /**********************************************************************
  *          Polyline16  (GDI.37)
  */
-BOOL16 Polyline16( HDC16 hdc, LPPOINT16 pt, INT16 count )
+BOOL16 WINAPI Polyline16( HDC16 hdc, LPPOINT16 pt, INT16 count )
 {
     register int i;
     LPPOINT32 pt32 = (LPPOINT32)xmalloc(count*sizeof(POINT32));
@@ -531,7 +541,7 @@
 /**********************************************************************
  *          Polyline32   (GDI32.276)
  */
-BOOL32 Polyline32( HDC32 hdc, const LPPOINT32 pt, INT32 count )
+BOOL32 WINAPI Polyline32( HDC32 hdc, const LPPOINT32 pt, INT32 count )
 {
     DC * dc = DC_GetDCPtr( hdc );
 
@@ -543,7 +553,7 @@
 /**********************************************************************
  *          Polygon16  (GDI.36)
  */
-BOOL16 Polygon16( HDC16 hdc, LPPOINT16 pt, INT16 count )
+BOOL16 WINAPI Polygon16( HDC16 hdc, LPPOINT16 pt, INT16 count )
 {
     register int i;
     LPPOINT32 pt32 = (LPPOINT32)xmalloc(count*sizeof(POINT32));
@@ -560,7 +570,7 @@
 /**********************************************************************
  *          Polygon32  (GDI32.275)
  */
-BOOL32 Polygon32( HDC32 hdc, LPPOINT32 pt, INT32 count )
+BOOL32 WINAPI Polygon32( HDC32 hdc, LPPOINT32 pt, INT32 count )
 {
     DC * dc = DC_GetDCPtr( hdc );
 
@@ -572,7 +582,8 @@
 /**********************************************************************
  *          PolyPolygon16  (GDI.450)
  */
-BOOL16 PolyPolygon16( HDC16 hdc, LPPOINT16 pt, LPINT16 counts, UINT16 polygons)
+BOOL16 WINAPI PolyPolygon16( HDC16 hdc, LPPOINT16 pt, LPINT16 counts,
+                             UINT16 polygons )
 {
     int		i,nrpts;
     LPPOINT32	pt32;
@@ -597,7 +608,8 @@
 /**********************************************************************
  *          PolyPolygon32  (GDI.450)
  */
-BOOL32 PolyPolygon32( HDC32 hdc, LPPOINT32 pt, LPINT32 counts, UINT32 polygons)
+BOOL32 WINAPI PolyPolygon32( HDC32 hdc, LPPOINT32 pt, LPINT32 counts,
+                             UINT32 polygons )
 {
     DC * dc = DC_GetDCPtr( hdc );
 
@@ -608,8 +620,8 @@
 /**********************************************************************
  *          ExtFloodFill16   (GDI.372)
  */
-BOOL16 ExtFloodFill16( HDC16 hdc, INT16 x, INT16 y, COLORREF color,
-                       UINT16 fillType )
+BOOL16 WINAPI ExtFloodFill16( HDC16 hdc, INT16 x, INT16 y, COLORREF color,
+                              UINT16 fillType )
 {
     return ExtFloodFill32( hdc, x, y, color, fillType );
 }
@@ -618,8 +630,8 @@
 /**********************************************************************
  *          ExtFloodFill32   (GDI32.96)
  */
-BOOL32 ExtFloodFill32( HDC32 hdc, INT32 x, INT32 y, COLORREF color,
-                       UINT32 fillType )
+BOOL32 WINAPI ExtFloodFill32( HDC32 hdc, INT32 x, INT32 y, COLORREF color,
+                              UINT32 fillType )
 {
     DC *dc = DC_GetDCPtr( hdc );
 
@@ -631,7 +643,7 @@
 /**********************************************************************
  *          FloodFill16   (GDI.25)
  */
-BOOL16 FloodFill16( HDC16 hdc, INT16 x, INT16 y, COLORREF color )
+BOOL16 WINAPI FloodFill16( HDC16 hdc, INT16 x, INT16 y, COLORREF color )
 {
     return ExtFloodFill32( hdc, x, y, color, FLOODFILLBORDER );
 }
@@ -640,7 +652,7 @@
 /**********************************************************************
  *          FloodFill32   (GDI32.104)
  */
-BOOL32 FloodFill32( HDC32 hdc, INT32 x, INT32 y, COLORREF color )
+BOOL32 WINAPI FloodFill32( HDC32 hdc, INT32 x, INT32 y, COLORREF color )
 {
     return ExtFloodFill32( hdc, x, y, color, FLOODFILLBORDER );
 }
@@ -649,7 +661,7 @@
 /**********************************************************************
  *          DrawEdge16   (USER.659)
  */
-BOOL16 DrawEdge16( HDC16 hdc, LPRECT16 rc, UINT16 edge, UINT16 flags )
+BOOL16 WINAPI DrawEdge16( HDC16 hdc, LPRECT16 rc, UINT16 edge, UINT16 flags )
 {
     RECT32 rect32;
     BOOL32 ret;
@@ -664,7 +676,7 @@
 /**********************************************************************
  *          DrawEdge32   (USER32.154)
  */
-BOOL32 DrawEdge32( HDC32 hdc, LPRECT32 rc, UINT32 edge, UINT32 flags )
+BOOL32 WINAPI DrawEdge32( HDC32 hdc, LPRECT32 rc, UINT32 edge, UINT32 flags )
 {
     HBRUSH32 hbrushOld;
 
@@ -747,7 +759,8 @@
 /**********************************************************************
  *          DrawFrameControl16  (USER.656)
  */
-BOOL16 DrawFrameControl16( HDC16 hdc, LPRECT16 rc, UINT16 uType, UINT16 uState )
+BOOL16 WINAPI DrawFrameControl16( HDC16 hdc, LPRECT16 rc, UINT16 uType,
+                                  UINT16 uState )
 {
     fprintf( stdnimp,"DrawFrameControl16(%x,%p,%d,%x), empty stub!\n",
              hdc,rc,uType,uState );
@@ -758,7 +771,8 @@
 /**********************************************************************
  *          DrawFrameControl32  (USER32.157)
  */
-BOOL32 DrawFrameControl32( HDC32 hdc, LPRECT32 rc, UINT32 uType, UINT32 uState )
+BOOL32 WINAPI DrawFrameControl32( HDC32 hdc, LPRECT32 rc, UINT32 uType,
+                                  UINT32 uState )
 {
     fprintf( stdnimp,"DrawFrameControl32(%x,%p,%d,%x), empty stub!\n",
              hdc,rc,uType,uState );
@@ -768,10 +782,22 @@
 /**********************************************************************
  *          DrawFrameControl32  (USER32.152)
  */
-BOOL32 DrawAnimatedRects32( HWND32 hwnd, int idAni,
-                           const LPRECT32 lprcFrom, const LPRECT32 lprcTo )
+BOOL32 WINAPI DrawAnimatedRects32( HWND32 hwnd, int idAni,
+                                   const LPRECT32 lprcFrom,
+                                   const LPRECT32 lprcTo )
 {
     fprintf( stdnimp,"DrawAnimatedRects32(%x,%d,%p,%p), empty stub!\n",
              hwnd, idAni, lprcFrom, lprcTo );
     return TRUE;
 }
+
+BOOL32 WINAPI DrawState32A(
+	HDC32 hdc,HBRUSH32 hbrush,DRAWSTATEPROC drawstateproc,
+	LPARAM lparam,WPARAM32 wparam,INT32 x,INT32 y,INT32 z,INT32 a,UINT32 b
+) {
+	fprintf(stderr,"DrawStateA(%x,%x,%p,0x%08lx,0x%08lx,%d,%d,%d,%d,%d),stub\n",
+		hdc,hbrush,drawstateproc,lparam,wparam,x,y,z,a,b
+	);
+	return TRUE;
+}
+
diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c
index 9fc2086..4611105 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -173,8 +173,9 @@
  * 	1) Just count the number of fonts available.
  * 	2) Store all font data passed.
  */
-WORD WineEnumDFontCallback(LPLOGFONT16 lpLogFont, LPTEXTMETRIC16 lpTextMetrics, 
-			   WORD wFontType, LONG lpvClientData) 
+WORD WINAPI WineEnumDFontCallback(LPLOGFONT16 lpLogFont,
+                                  LPTEXTMETRIC16 lpTextMetrics,
+                                  WORD wFontType, LONG lpvClientData) 
 {
     int wRet = 0;
     WEPFC *pWEPFC = (WEPFC *)lpvClientData; 
@@ -325,6 +326,12 @@
 				  (void *)&wepfc);
                 numFonts = wepfc.nCount;
 	    }
+            else
+            {
+                /* If the number of fonts returned are zero we can not continue */
+                fprintf( stderr, "No fonts? Aborting CreateDC...\n");
+                return FALSE;
+            }
 	}
     }
 		
@@ -476,20 +483,17 @@
 
 static struct hpq *hpqueue;
 
-HPQ 
-CreatePQ(int size) 
+HPQ WINAPI CreatePQ(int size) 
 {
     printf("CreatePQ: %d\n",size);
     return 1;
 }
-int 
-DeletePQ(HPQ hPQ) 
+int WINAPI DeletePQ(HPQ hPQ) 
 {
     printf("DeletePQ: %x\n", hPQ);
     return 0;
 }
-int 
-ExtractPQ(HPQ hPQ) 
+int WINAPI ExtractPQ(HPQ hPQ) 
 { 
     struct hpq *queue, *prev, *current, *currentPrev;
     int key = 0, tag = -1;
@@ -527,8 +531,7 @@
     return tag;
 }
 
-int 
-InsertPQ(HPQ hPQ, int tag, int key) 
+int WINAPI InsertPQ(HPQ hPQ, int tag, int key) 
 {
     struct hpq *queueItem = malloc(sizeof(struct hpq));
     queueItem->next = hpqueue;
@@ -539,14 +542,12 @@
     printf("InsertPQ: %x %d %d\n", hPQ, tag, key);
     return TRUE;
 }
-int
-MinPQ(HPQ hPQ) 
+int WINAPI MinPQ(HPQ hPQ) 
 {
     printf("MinPQ: %x\n", hPQ); 
     return 0;
 }
-int
-SizePQ(HPQ hPQ, int sizechange) 
+int WINAPI SizePQ(HPQ hPQ, int sizechange) 
 {  
     printf("SizePQ: %x %d\n", hPQ, sizechange); 
     return -1; 
@@ -656,7 +657,7 @@
     return nRet;
 }
 
-HANDLE16 OpenJob(LPSTR lpOutput, LPSTR lpTitle, HDC16 hDC)
+HANDLE16 WINAPI OpenJob(LPSTR lpOutput, LPSTR lpTitle, HDC16 hDC)
 {
     HANDLE16 hHandle = SP_ERROR;
     PPRINTJOB pPrintJob;
@@ -690,7 +691,7 @@
     return hHandle;
 }
 
-int CloseJob(HANDLE16 hJob)
+int WINAPI CloseJob(HANDLE16 hJob)
 {
     int nRet = SP_ERROR;
     PPRINTJOB pPrintJob = NULL;
@@ -708,7 +709,7 @@
     return nRet;
 }
 
-int WriteSpool(HANDLE16 hJob, LPSTR lpData, WORD cch)
+int WINAPI WriteSpool(HANDLE16 hJob, LPSTR lpData, WORD cch)
 {
     int nRet = SP_ERROR;
     PPRINTJOB pPrintJob = NULL;
@@ -726,7 +727,7 @@
     return nRet;
 }
 
-int WriteDialog(HANDLE16 hJob, LPSTR lpMsg, WORD cchMsg)
+int WINAPI WriteDialog(HANDLE16 hJob, LPSTR lpMsg, WORD cchMsg)
 {
     int nRet = 0;
 
@@ -736,7 +737,7 @@
     return nRet;
 }
 
-int DeleteJob(HANDLE16 hJob, WORD wNotUsed)
+int WINAPI DeleteJob(HANDLE16 hJob, WORD wNotUsed)
 {
     int nRet;
 
@@ -751,20 +752,20 @@
  * when it has been processed.  For simplicity they havn't been implemented.
  * This means a whole job has to be processed before it is sent to the printer.
  */
-int StartSpoolPage(HANDLE16 hJob)
+int WINAPI StartSpoolPage(HANDLE16 hJob)
 {
     dprintf_win16drv(stddeb, "StartSpoolPage GDI.246 unimplemented\n");
     return 1;
 
 }
-int EndSpoolPage(HANDLE16 hJob)
+int WINAPI EndSpoolPage(HANDLE16 hJob)
 {
     dprintf_win16drv(stddeb, "EndSpoolPage GDI.247 unimplemented\n");
     return 1;
 }
 
 
-DWORD GetSpoolJob(int nOption, LONG param)
+DWORD WINAPI GetSpoolJob(int nOption, LONG param)
 {
     DWORD retval = 0;
     dprintf_win16drv(stddeb, "In GetSpoolJob param 0x%lx noption %d\n",param, nOption);
diff --git a/graphics/win16drv/objects.c b/graphics/win16drv/objects.c
index c865790..ee54724 100644
--- a/graphics/win16drv/objects.c
+++ b/graphics/win16drv/objects.c
@@ -24,11 +24,12 @@
 
 
 /***********************************************************************
- *           X11DRV_SelectObject
+ *           WIN16DRV_SelectObject
  */
 HGDIOBJ32 WIN16DRV_SelectObject( DC *dc, HGDIOBJ32 handle )
 {
     GDIOBJHDR *ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE );
+    HGDIOBJ32 ret = 0;
 
     if (!ptr) return 0;
     dprintf_gdi(stddeb, "SelectObject: hdc=%04x %04x\n", dc->hSelf, handle );
@@ -37,17 +38,17 @@
     {
     case PEN_MAGIC:
         fprintf(stderr, "WIN16DRV_SelectObject for PEN not implemented\n");
-        return 0;
     case BRUSH_MAGIC:
         fprintf(stderr, "WIN16DRV_SelectObject for BRUSH not implemented\n");
-        return 0;
     case BITMAP_MAGIC:
         fprintf(stderr, "WIN16DRV_SelectObject for BITMAP not implemented\n");
-        return 0;
     case FONT_MAGIC:
-        return WIN16DRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
+        ret = WIN16DRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
+	break;
     case REGION_MAGIC:
-	  return (HGDIOBJ16)SelectClipRgn16( dc->hSelf, handle );
+	ret = (HGDIOBJ16)SelectClipRgn16( dc->hSelf, handle );
+	break;
     }
-    return 0;
+    GDI_HEAP_UNLOCK( handle );
+    return ret;
 }
diff --git a/graphics/wing.c b/graphics/wing.c
index 90321e5..58be554 100644
--- a/graphics/wing.c
+++ b/graphics/wing.c
@@ -66,7 +66,7 @@
 /***********************************************************************
  *          WinGCreateDC16	(WING.1001)
  */
-HDC16 WinGCreateDC16(void)
+HDC16 WINAPI WinGCreateDC16(void)
 {
   __initWinG();
 
@@ -78,7 +78,7 @@
 /***********************************************************************
  *  WinGRecommendDIBFormat16    (WING.1002)
  */
-BOOL16 WinGRecommendDIBFormat16(BITMAPINFO *fmt)
+BOOL16 WINAPI WinGRecommendDIBFormat16(BITMAPINFO *fmt)
 {
   fprintf(stdnimp,"WinGRecommendDIBFormat()\n");
 
@@ -93,7 +93,8 @@
 /***********************************************************************
  *        WinGCreateBitmap16    (WING.1003)
  */
-HBITMAP16 WinGCreateBitmap16(HDC16 winDC, BITMAPINFO *header, void **bits)
+HBITMAP16 WINAPI WinGCreateBitmap16(HDC16 winDC, BITMAPINFO *header,
+                                    void **bits)
 {
   fprintf(stdnimp,"WinGCreateBitmap: empty stub! (expect failure)\n");
   if( __WinGOK > 0 && header )
@@ -126,7 +127,7 @@
 	    if (hbitmap)
 	    {
 	      __ShmBitmapCtl* p = (__ShmBitmapCtl*)xmalloc(sizeof(__ShmBitmapCtl));
-		BITMAPOBJ* 	 bmpObjPtr = (BITMAPOBJ *) GDI_HEAP_LIN_ADDR( hbitmap );
+		BITMAPOBJ* 	 bmpObjPtr = (BITMAPOBJ *) GDI_HEAP_LOCK( hbitmap );
 
 		bmpObjPtr->size.cx = 0;
 		bmpObjPtr->size.cy = 0;
@@ -170,6 +171,7 @@
 		    hbitmap = 0;
 		}
 	    }
+	    GDI_HEAP_UNLOCK( hbitmap );
 	    return hbitmap;
 	}
     }
@@ -181,7 +183,7 @@
 /***********************************************************************
  *  WinGGetDIBPointer   (WING.1004)
  */
-SEGPTR WinGGetDIBPointer16(HBITMAP16 hWinGBitmap, BITMAPINFO* bmpi)
+SEGPTR WINAPI WinGGetDIBPointer16(HBITMAP16 hWinGBitmap, BITMAPINFO* bmpi)
 {
 #ifdef PRELIMINARY_WING16_SUPPORT
   BITMAPOBJ*	bmp = (BITMAPOBJ *) GDI_GetObjPtr( hWinGBitmap, BITMAP_MAGIC );
@@ -192,6 +194,7 @@
     if( p )
     {
       if( bmpi ) memcpy( bmpi, &__bmpiWinG, sizeof(BITMAPINFOHEADER));
+      GDI_HEAP_UNLOCK( hWinGBitmap );
       return p->bits;
     }
   }
@@ -202,7 +205,8 @@
 /***********************************************************************
  *  WinGSetDIBColorTable   (WING.1004)
  */
-UINT16 WinGSetDIBColorTable16(HDC16 hWinGDC, UINT16 start, UINT16 num, RGBQUAD* pColor)
+UINT16 WINAPI WinGSetDIBColorTable16(HDC16 hWinGDC, UINT16 start, UINT16 num,
+                                     RGBQUAD* pColor)
 {
         fprintf(stdnimp,"WinGSetDIBColorTable: empty stub!\n");
         return num;
@@ -211,8 +215,8 @@
 /***********************************************************************
  *  WinGGetDIBColorTable16   (WING.1005)
  */
-UINT16 WinGGetDIBColorTable16(HDC16 winDC, UINT16 start, UINT16 numentry,
-                            RGBQUAD* colors)
+UINT16 WINAPI WinGGetDIBColorTable16(HDC16 winDC, UINT16 start,
+                                     UINT16 numentry, RGBQUAD* colors)
 {
 	fprintf(stdnimp,"WinGGetDIBColorTable: empty stub!\n");
 	return 0;
@@ -221,7 +225,7 @@
 /***********************************************************************
  *  WinGCreateHalfTonePalette16   (WING.1007)
  */
-HPALETTE16 WinGCreateHalfTonePalette16(void)
+HPALETTE16 WINAPI WinGCreateHalfTonePalette16(void)
 {
         fprintf(stdnimp,"WinGCreateHalfTonePalette: empty stub!\n");
 	return 0;
@@ -230,7 +234,8 @@
 /***********************************************************************
  *  WinGCreateHalfToneBrush16   (WING.1008)
  */
-HPALETTE16 WinGCreateHalfToneBrush16(HDC16 winDC, COLORREF col, WING_DITHER_TYPE type)
+HPALETTE16 WINAPI WinGCreateHalfToneBrush16(HDC16 winDC, COLORREF col,
+                                            WING_DITHER_TYPE type)
 {
         fprintf(stdnimp,"WinGCreateHalfToneBrush: empty stub!\n");
 	return 0;
@@ -239,9 +244,10 @@
 /***********************************************************************
  *  WinGStretchBlt16   (WING.1009)
  */
-BOOL16 WinGStretchBlt16(HDC16 destDC, INT16 xDest, INT16 yDest, INT16 widDest,
-                        INT16 heiDest, HDC16 srcDC, INT16 xSrc, INT16 ySrc,
-                        INT16 widSrc, INT16 heiSrc)
+BOOL16 WINAPI WinGStretchBlt16(HDC16 destDC, INT16 xDest, INT16 yDest,
+                               INT16 widDest, INT16 heiDest,
+                               HDC16 srcDC, INT16 xSrc, INT16 ySrc,
+                               INT16 widSrc, INT16 heiSrc)
 {
 
         return StretchBlt16(destDC, xDest, yDest, widDest, heiDest, srcDC, xSrc, ySrc, widSrc, heiSrc, SRCCOPY);
@@ -252,8 +258,9 @@
 /***********************************************************************
  *  WinGBitBlt16   (WING.1010)
  */
-BOOL16 WinGBitBlt16(HDC16 destDC, INT16 xDest, INT16 yDest, INT16 widDest,
-                    INT16 heiDest, HDC16 srcDC, INT16 xSrc, INT16 ySrc)
+BOOL16 WINAPI WinGBitBlt16(HDC16 destDC, INT16 xDest, INT16 yDest,
+                           INT16 widDest, INT16 heiDest, HDC16 srcDC,
+                           INT16 xSrc, INT16 ySrc)
 {
     /* destDC is a display DC, srcDC is a memory DC */
 
diff --git a/graphics/x11drv/bitblt.c b/graphics/x11drv/bitblt.c
index 1fbd3c5..a497ce2 100644
--- a/graphics/x11drv/bitblt.c
+++ b/graphics/x11drv/bitblt.c
@@ -1341,6 +1341,34 @@
     return TRUE;
 }
 
+struct StretchBlt_params
+{
+    DC   *dcDst;
+    INT32 xDst;
+    INT32 yDst;
+    INT32 widthDst;
+    INT32 heightDst;
+    DC   *dcSrc;
+    INT32 xSrc;
+    INT32 ySrc;
+    INT32 widthSrc;
+    INT32 heightSrc;
+    DWORD rop;
+};
+
+/***********************************************************************
+ *           BITBLT_DoStretchBlt
+ *
+ * Wrapper function for BITBLT_InternalStretchBlt
+ * to use with CALL_LARGE_STACK.
+ */
+static int BITBLT_DoStretchBlt( const struct StretchBlt_params *p )
+{
+    return (int)BITBLT_InternalStretchBlt( p->dcDst, p->xDst, p->yDst,
+                                           p->widthDst, p->heightDst,
+                                           p->dcSrc, p->xSrc, p->ySrc,
+                                           p->widthSrc, p->heightSrc, p->rop );
+}
 
 /***********************************************************************
  *           X11DRV_PatBlt
@@ -1348,9 +1376,9 @@
 BOOL32 X11DRV_PatBlt( DC *dc, INT32 left, INT32 top,
                       INT32 width, INT32 height, DWORD rop )
 {
-    return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
-                                 dc, left, top, width, height,
-                                 NULL, 0, 0, 0, 0, rop );
+    struct StretchBlt_params params = { dc, left, top, width, height,
+                                        NULL, 0, 0, 0, 0, rop };
+    return (BOOL32)CALL_LARGE_STACK( BITBLT_DoStretchBlt, &params );
 }
 
 
@@ -1361,9 +1389,9 @@
                       INT32 width, INT32 height, DC *dcSrc,
                       INT32 xSrc, INT32 ySrc, DWORD rop )
 {
-    return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
-                                dcDst, xDst, yDst, width, height,
-                                dcSrc, xSrc, ySrc, width, height, rop );
+    struct StretchBlt_params params = { dcDst, xDst, yDst, width, height,
+                                        dcSrc, xSrc, ySrc, width, height, rop};
+    return (BOOL32)CALL_LARGE_STACK( BITBLT_DoStretchBlt, &params );
 }
 
 
@@ -1375,7 +1403,8 @@
                           DC *dcSrc, INT32 xSrc, INT32 ySrc,
                           INT32 widthSrc, INT32 heightSrc, DWORD rop )
 {
-    return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
-                                dcDst, xDst, yDst, widthDst, heightDst,
-                                dcSrc, xSrc, ySrc, widthSrc, heightSrc, rop );
+    struct StretchBlt_params params = { dcDst, xDst, yDst, widthDst, heightDst,
+                                        dcSrc, xSrc, ySrc, widthSrc, heightSrc,
+                                        rop };
+    return (BOOL32)CALL_LARGE_STACK( BITBLT_DoStretchBlt, &params );
 }
diff --git a/graphics/x11drv/brush.c b/graphics/x11drv/brush.c
index 1fe88da..a162ad7 100644
--- a/graphics/x11drv/brush.c
+++ b/graphics/x11drv/brush.c
@@ -179,6 +179,7 @@
 	dc->u.x.brush.fillStyle = FillOpaqueStippled;
 	dc->u.x.brush.pixel = -1;  /* Special case (see DC_SetupGCForBrush) */
     }
+    GDI_HEAP_UNLOCK( hbitmap );
     return TRUE;
 }
 
diff --git a/graphics/x11drv/clipping.c b/graphics/x11drv/clipping.c
index ddc9183..7645e68 100644
--- a/graphics/x11drv/clipping.c
+++ b/graphics/x11drv/clipping.c
@@ -31,4 +31,5 @@
     {
         XSetClipRectangles( display, dc->u.x.gc, 0, 0, NULL, 0, 0 );
     }
+    GDI_HEAP_UNLOCK( dc->w.hGCClipRgn );
 }
diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c
index 2619425..ec80312 100644
--- a/graphics/x11drv/graphics.c
+++ b/graphics/x11drv/graphics.c
@@ -631,16 +631,29 @@
  *
  * Main flood-fill routine.
  */
-static BOOL32 X11DRV_DoFloodFill( DC *dc, RECT32 *rect, INT32 x, INT32 y,
-                                 COLORREF color, UINT32 fillType )
+
+struct FloodFill_params
+{
+    DC      *dc;
+    INT32    x;
+    INT32    y;
+    COLORREF color;
+    UINT32   fillType;
+};
+
+static BOOL32 X11DRV_DoFloodFill( const struct FloodFill_params *params )
 {
     XImage *image;
+    RECT32 rect;
+    DC *dc = params->dc;
+
+    if (GetRgnBox32( dc->w.hGCClipRgn, &rect ) == ERROR) return FALSE;
 
     if (!(image = XGetImage( display, dc->u.x.drawable,
-                             dc->w.DCOrgX + rect->left,
-                             dc->w.DCOrgY + rect->top,
-                             rect->right - rect->left,
-                             rect->bottom - rect->top,
+                             dc->w.DCOrgX + rect.left,
+                             dc->w.DCOrgY + rect.top,
+                             rect.right - rect.left,
+                             rect.bottom - rect.top,
                              AllPlanes, ZPixmap ))) return FALSE;
 
     if (DC_SetupGCForBrush( dc ))
@@ -648,11 +661,12 @@
           /* ROP mode is always GXcopy for flood-fill */
         XSetFunction( display, dc->u.x.gc, GXcopy );
         X11DRV_InternalFloodFill(image, dc,
-                                 XLPTODP(dc,x) - rect->left,
-                                 YLPTODP(dc,y) - rect->top,
-                                 dc->w.DCOrgX + rect->left,
-                                 dc->w.DCOrgY + rect->top,
-                                 COLOR_ToPhysical( dc, color ), fillType );
+                                 XLPTODP(dc,params->x) - rect.left,
+                                 YLPTODP(dc,params->y) - rect.top,
+                                 dc->w.DCOrgX + rect.left,
+                                 dc->w.DCOrgY + rect.top,
+                                 COLOR_ToPhysical( dc, params->color ),
+                                 params->fillType );
     }
 
     XDestroyImage( image );
@@ -667,15 +681,11 @@
 X11DRV_ExtFloodFill( DC *dc, INT32 x, INT32 y, COLORREF color,
                      UINT32 fillType )
 {
-    RECT32 rect;
-    HDC32	hdc = dc->hSelf; /* FIXME */
+    struct FloodFill_params params = { dc, x, y, color, fillType };
 
     dprintf_graphics( stddeb, "X11DRV_ExtFloodFill %d,%d %06lx %d\n",
                       x, y, color, fillType );
 
-    if (!PtVisible32( hdc, x, y )) return FALSE;
-    if (GetRgnBox32( dc->w.hGCClipRgn, &rect ) == ERROR) return FALSE;
-
-    return CallTo32_LargeStack( (int(*)())X11DRV_DoFloodFill, 6,
-                                dc, &rect, x, y, color, fillType );
+    if (!PtVisible32( dc->hSelf, x, y )) return FALSE;
+    return CALL_LARGE_STACK( X11DRV_DoFloodFill, &params );
 }
diff --git a/graphics/x11drv/init.c b/graphics/x11drv/init.c
index 0d7496f..6cfd5a1 100644
--- a/graphics/x11drv/init.c
+++ b/graphics/x11drv/init.c
@@ -136,6 +136,8 @@
 	X11DRV_DevCaps.rasterCaps |= RC_PALETTE;
 	X11DRV_DevCaps.sizePalette = DefaultVisual(display,DefaultScreen(display))->map_entries;
     }
+ 
+    /* Resolution will be adjusted during the font init */
 
     X11DRV_DevCaps.logPixelsX = (int)(X11DRV_DevCaps.horzRes * 25.4 / X11DRV_DevCaps.horzSize);
     X11DRV_DevCaps.logPixelsY = (int)(X11DRV_DevCaps.vertRes * 25.4 / X11DRV_DevCaps.vertSize);
@@ -177,6 +179,7 @@
         dc->w.bitsPerPixel = bmp->bitmap.bmBitsPixel;
         dc->w.hVisRgn      = CreateRectRgn32( 0, 0, bmp->bitmap.bmWidth,
                                               bmp->bitmap.bmHeight );
+	GDI_HEAP_UNLOCK( dc->w.hBitmap );
     }
     else
     {
diff --git a/graphics/x11drv/objects.c b/graphics/x11drv/objects.c
index fb2f0b8..c665b07 100644
--- a/graphics/x11drv/objects.c
+++ b/graphics/x11drv/objects.c
@@ -29,6 +29,7 @@
 HGDIOBJ32 X11DRV_SelectObject( DC *dc, HGDIOBJ32 handle )
 {
     GDIOBJHDR *ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE );
+    HGDIOBJ32 ret = 0;
 
     if (!ptr) return 0;
     dprintf_gdi(stddeb, "SelectObject: hdc=%04x %04x\n", dc->hSelf, handle );
@@ -36,15 +37,21 @@
     switch(ptr->wMagic)
     {
       case PEN_MAGIC:
-	  return X11DRV_PEN_SelectObject( dc, handle, (PENOBJ *)ptr );
+	  ret = X11DRV_PEN_SelectObject( dc, handle, (PENOBJ *)ptr );
+	  break;
       case BRUSH_MAGIC:
-	  return X11DRV_BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );
+	  ret = X11DRV_BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );
+	  break;
       case BITMAP_MAGIC:
-	  return X11DRV_BITMAP_SelectObject( dc, handle, (BITMAPOBJ *)ptr );
+	  ret = X11DRV_BITMAP_SelectObject( dc, handle, (BITMAPOBJ *)ptr );
+	  break;
       case FONT_MAGIC:
-	  return X11DRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
+	  ret = X11DRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
+	  break;
       case REGION_MAGIC:
-	  return (HGDIOBJ16)SelectClipRgn16( dc->hSelf, handle );
+	  ret = (HGDIOBJ16)SelectClipRgn16( dc->hSelf, handle );
+	  break;
     }
-    return 0;
+    GDI_HEAP_UNLOCK( handle );
+    return ret;
 }
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index f12d89f..4b112e2 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -48,11 +48,44 @@
   struct __fontAlias*	next;
 } fontAlias;
 
+typedef struct
+{
+  LPSTR                 fatResource;
+  LPSTR                 fatAlias;
+} aliasTemplate;
+
+/* Font alias table - these 2 aliases are always present */
+
 static fontAlias aliasTable[2] = { 
 			{ "Helvetica", "Helv", &aliasTable[1] },
 			{ "Times", "Tms Rmn", NULL } 
 			};
 
+/* Optional built-in aliases, they are installed only when X
+ * cannot supply us with original MS fonts */
+
+static int	     faTemplateNum = 4;
+static aliasTemplate faTemplate[4] = {
+			  { "-adobe-helvetica-", "MS Sans Serif" },
+			  { "-bitstream-charter-", "MS Serif" },
+			  { "-adobe-times-", "Times New Roman" },
+			  { "-adobe-helvetica-", "Arial" }
+			  };
+
+/* Charset translation table, cp125-.. encoded fonts are produced by
+ * the fnt2bdf */
+
+static int	 numCPTranslation = 8;
+static BYTE	 CPTranslation[] = { EE_CHARSET,	/* cp125-0 */
+				     RUSSIAN_CHARSET,	/* cp125-1 */
+				     ANSI_CHARSET,	/* cp125-2 */
+				     GREEK_CHARSET,	/* cp125-3 */
+				     TURKISH_CHARSET,	/* cp125-4 */
+				     HEBREW_CHARSET,	/* cp125-5 */
+				     ARABIC_CHARSET,	/* cp125-6 */
+				     BALTIC_CHARSET	/* cp125-7 */
+				   }; 
+
 UINT16			XTextCaps = TC_OP_CHARACTER | TC_OP_STROKE | TC_CP_STROKE |
 				    TC_SA_DOUBLE | TC_SA_INTEGER | TC_SA_CONTIN |
 			 	    TC_UA_ABLE | TC_SO_ABLE | TC_RA_ABLE;
@@ -64,14 +97,17 @@
 static const char*	INIFontSection = "fonts";
 static const char*	INISubSection = "Alias";
 static const char*	INIDefault = "Default";
+static const char*	INIResolution = "Resolution";
+static const char*	INIGlobalMetrics = "FontMetrics";
 
 static const char*	LFDSeparator = "*-";
+static const char*	localMSEncoding = "cp125-";
 static const char*	iso8859Encoding = "iso8859-";
 static const char*	iso646Encoding = "iso646.1991-";
 static const char*	ansiEncoding = "ansi-";
-static fontResource*	fontList = NULL; 	
 static unsigned		DefResolution = 0;
 
+static fontResource*	fontList = NULL;
 static fontObject*      fontCache = NULL;		/* array */
 static int		fontCacheSize = FONTCACHE;
 static int		fontLF = -1, fontMRU = -1;	/* last free, most recently used */
@@ -317,28 +353,32 @@
   *(lpch - 1) = LFDSeparator[1];
 
 /* charset registry, charset encoding - */
-   if( strstr(lpch, "jisx") || strstr(lpch, "ksc") ) return FALSE;	/* 2-byte stuff */
+   if( strstr(lpch, "jisx") || 
+       strstr(lpch, "ksc") || 
+       strstr(lpch, "gb2312") ) return FALSE;	/* 2-byte stuff */
 
+   fi->df.dfCharSet = ANSI_CHARSET;
    if( strstr(lpch, iso8859Encoding) )
-   {
      fi->fi_flags |= FI_ENC_ISO8859;
-     fi->df.dfCharSet = ANSI_CHARSET;
-   }
    else if( strstr(lpch, iso646Encoding) )
-   {
      fi->fi_flags |= FI_ENC_ISO646;
-     fi->df.dfCharSet = ANSI_CHARSET;
-   }
-   else if( strstr(lpch, ansiEncoding) )	/* font2bdf produces -ansi-0 LFD */
-   {
+   else if( strstr(lpch, ansiEncoding) )	/* fnt2bdf produces -ansi-0 LFD */
      fi->fi_flags |= FI_ENC_ANSI;
-     fi->df.dfCharSet = ANSI_CHARSET;
+   else						/* ... and -cp125-x */
+   {
+	fi->df.dfCharSet = OEM_CHARSET;
+	if( !strncasecmp(lpch, localMSEncoding, 6) )
+	{
+	    lpch = LFD_Advance( lpch, 1 );
+	    if( lpch && (i = atoi( lpch )) < numCPTranslation )
+	    {
+		fi->fi_flags |= FI_ENC_MSCODEPAGE;
+		fi->df.dfCharSet = CPTranslation[i];
+	    }
+	}
+	else if( strstr(lpch, "fontspecific") )
+	    fi->df.dfCharSet = SYMBOL_CHARSET;
    }
-   else if( strstr(lpch, "fontspecific") )
-     fi->df.dfCharSet = SYMBOL_CHARSET;
-   else
-     fi->df.dfCharSet = OEM_CHARSET;		/* FIXME: -cp126-.. from fnt2bdf */
-   
    return TRUE;					
 }
 
@@ -348,7 +388,7 @@
 static BOOL32  LFD_ComposeLFD( fontObject* fo, 
 			       INT32 height, LPSTR lpLFD, UINT32 uRelax )
 {
-   int		h, w, ch, point = 0;
+   int		h, w, ch, enc_ch, point = 0;
    char*	lpch; 
    const char*  lpEncoding = NULL;
 
@@ -400,9 +440,12 @@
    if( fo->fo_flags & FO_SYNTH_HEIGHT ) h = fo->fi->lfd_height;
    else h = (fo->fi->lfd_height * height) / fo->fi->df.dfPixHeight;
 
-   if( fo->lf.lfWidth && (XTextCaps & TC_SF_X_YINDEP) 
-	              && !(fo->fo_flags & FO_SYNTH_WIDTH) )
-       point = (fo->fi->lfd_decipoints * fo->lf.lfWidth) / fo->fi->df.dfAvgWidth;
+   if( XTextCaps & TC_SF_X_YINDEP ) 
+	if( fo->lf.lfWidth && !(fo->fo_flags & FO_SYNTH_WIDTH) )
+	    point = (fo->fi->lfd_decipoints * fo->lf.lfWidth) / fo->fi->df.dfAvgWidth;
+	else 
+	if( fo->fi->fi_flags & FI_SCALABLE ) /* adjust h/w ratio */
+	    point = h * 72 * 10 / fo->fi->lfd_resolution;
 
 /* spacing and width */
 
@@ -411,16 +454,35 @@
    else 
        w = ( fo->fi->fi_flags & FI_VARIABLEPITCH ) ? 'p' : LFDSeparator[0]; 
 
-/* encoding, not quite there yet */
+/* encoding */
 
+   enc_ch = '*';
    if( fo->fi->df.dfCharSet == ANSI_CHARSET )
    {
 	if( fo->fi->fi_flags & FI_ENC_ISO8859 )
 	     lpEncoding = iso8859Encoding;
 	else if( fo->fi->fi_flags & FI_ENC_ISO646 )
 	     lpEncoding = iso646Encoding;
+	else if( fo->fi->fi_flags & FI_ENC_MSCODEPAGE )
+	{
+	     enc_ch = '2';
+	     lpEncoding = localMSEncoding;
+	}
 	else lpEncoding = ansiEncoding;
-   } else    lpEncoding = LFDSeparator;
+   } 
+   else if( fo->fi->fi_flags & FI_ENC_MSCODEPAGE )
+   {
+	int i;
+
+	lpEncoding = localMSEncoding;
+	for( i = 0; i < numCPTranslation; i++ )
+	     if( CPTranslation[i] == fo->fi->df.dfCharSet )
+	     {
+		enc_ch = '0' + i;
+		break;
+	     }
+   }
+   else lpEncoding = LFDSeparator;	/* whatever */
 
    lpch = lpLFD + lstrlen32A(lpLFD);
    ch = (fo->fi->fi_flags & FI_SCALABLE) ? '0' : LFDSeparator[0];
@@ -433,20 +495,20 @@
        case 0: 
 	    if( point )
 	    {
-	        sprintf( lpch, "%i-%i-%i-%c-%c-*-%s*", h, point, 
-			 fo->fi->lfd_resolution, ch, w, lpEncoding );
+	        sprintf( lpch, "%i-%i-%i-%c-%c-*-%s%c", h, point, 
+			 fo->fi->lfd_resolution, ch, w, lpEncoding, enc_ch );
 	        break;
 	    }
 	    /* fall through */
 
        case 1: 
-	    sprintf( lpch, "%i-*-%i-%c-%c-*-%s*", h, 
-			fo->fi->lfd_resolution, ch, w, lpEncoding );
+	    sprintf( lpch, "%i-*-%i-%c-%c-*-%s%c", h, 
+			fo->fi->lfd_resolution, ch, w, lpEncoding, enc_ch );
 	    break;
 
        case 2:
-	    sprintf( lpch, "%i-*-%i-%c-*-*-%s*",
-			h, fo->fi->lfd_resolution, ch, lpEncoding );
+	    sprintf( lpch, "%i-*-%i-%c-*-*-%s%c",
+			h, fo->fi->lfd_resolution, ch, lpEncoding, enc_ch );
 	    break;
 
        case 3:
@@ -668,7 +730,8 @@
                     return FF_SWISS;
                   break;
         case 'c':
-        case 'C': if(!lstrcmpi32A(lfFaceName, "Courier") )
+        case 'C': if(!lstrcmpi32A(lfFaceName, "Courier") ||
+		     !lstrcmpi32A(lfFaceName, "Charter") )
                     return FF_ROMAN;
                   break;
         case 'p':
@@ -692,6 +755,18 @@
 
 
 /***********************************************************************
+ *           XFONT_CheckResourceName
+ */
+static BOOL32 XFONT_CheckResourceName( LPSTR resource, LPCSTR name, INT32 n )
+{
+    resource = LFD_Advance( resource, 2 );
+    if( resource )
+	return (!lstrncmpi32A( resource, name, n ));
+    return FALSE;
+}
+
+
+/***********************************************************************
  *           XFONT_WindowsNames
  *
  * Build generic Windows aliases for X font names.
@@ -711,17 +786,13 @@
 	if( fr->fr_flags & FR_NAMESET ) continue;     /* skip already assigned */
 
 	lpstr = LFD_Advance(fr->resource, 2);
-	i = lpstr - LFD_Advance( lpstr, 1 );
+	i = LFD_Advance( lpstr, 1 ) - lpstr;
 
 	for( pfr = fontList; pfr != fr ; pfr = pfr->next )
 	    if( pfr->fr_flags & FR_NAMESET )
-	    {
-		lpch = LFD_Advance(pfr->resource, 2);
+		if( XFONT_CheckResourceName( pfr->resource, lpstr, i ) )
+		    break;
 
-		/* check if already have the same face name */
-
-		if( !lstrncmp32A(lpch, lpstr, i) ) break;
-	    }
 	if( pfr != fr )  /* prepend vendor name */
 	    lpstr = fr->resource + 1;
 
@@ -781,10 +852,24 @@
  */
 static fontAlias* XFONT_CreateAlias( LPCSTR lpTypeFace, LPCSTR lpAlias )
 {
+    int j;
     fontAlias* pfa = aliasTable;
-    int j = lstrlen32A(lpTypeFace) + 1;
 
-    while( pfa->next ) pfa = pfa->next;
+    while( 1 ) 
+    {
+	/* check if we already got one */
+	if( !lstrcmpi32A( pfa->faTypeFace, lpAlias ) )
+	{
+#ifdef DEBUG_FONT_INIT
+	    dprintf_font(stddeb,"\tredundant alias '%s' -> '%s'\n", lpAlias, lpTypeFace );
+#endif
+	    return NULL;
+	} 
+	if( pfa->next ) pfa = pfa->next;
+	else break;
+    }
+
+    j = lstrlen32A(lpTypeFace) + 1;
     pfa->next = HeapAlloc( SystemHeap, 0, sizeof(fontAlias) +
 					  j + lstrlen32A(lpAlias) + 1 );
     if((pfa = pfa->next))
@@ -814,54 +899,79 @@
  *   Alias0 = Arial, -adobe-helvetica- 
  *   Alias1 = Times New Roman, -bitstream-courier-, 1
  *   ...
+ *
+ * Note that from 081797 and on we have built-in alias templates that take
+ * care of the necessary Windows typefaces.
  */
 static void XFONT_LoadAliases( char** buffer, int buf_size )
 {
+    char* lpResource, *lpAlias;
     char  subsection[32];
-    int	  i = 0;
+    int	  i = 0, j = 0;
+    BOOL32 bHaveAlias = TRUE, bSubst = FALSE;
 
     if( buf_size < 128 )
 	*buffer = HeapReAlloc(SystemHeap, 0, *buffer, 256 );
     do
     {
-	wsprintf32A( subsection, "%s%i", INISubSection, i++ );
-
-	if( PROFILE_GetWineIniString( INIFontSection, subsection, "", *buffer, 128 ) )
+	if( j < faTemplateNum )
 	{
-	    char* lpchX, *lpchW = *buffer;
+	    /* built-in templates first */
 
-	    while( isspace(*lpchW) ) lpchW++;
-	    lpchX = PROFILE_GetStringItem( lpchW );
+	    lpResource = faTemplate[j].fatResource;
+	    lpAlias = faTemplate[j].fatAlias;
+	    j++;
+	}
+	else
+	{
+	    /* then WINE.CONF */
 
-	    if( lpchX )
+	    wsprintf32A( subsection, "%s%i", INISubSection, i++ );
+
+	    if( (bHaveAlias = PROFILE_GetWineIniString( INIFontSection, 
+					subsection, "", *buffer, 128 )) )
 	    {
-		fontResource* fr;
+		lpAlias = *buffer;
+		while( isspace(*lpAlias) ) lpAlias++;
+		lpResource = PROFILE_GetStringItem( lpAlias );
+		bSubst = (PROFILE_GetStringItem( lpResource )) ? TRUE : FALSE;
+	    }
+	}
+
+	if( bHaveAlias )
+	{
+	    int length;
+
+	    length = lstrlen32A( lpAlias );
+	    if( lpResource && length )
+	    {
+		fontResource* fr, *frMatch = NULL;
 
 		for (fr = fontList; fr ; fr = fr->next)
 		{
-		    int j;
-
-		    j = lstrlen32A( fr->resource );
-
-		    if( !lstrncmpi32A( fr->resource, lpchX, j) )
+		    if( !lstrcmpi32A( fr->resource, lpResource ) ) frMatch = fr;
+		    if( XFONT_CheckResourceName( fr->resource, lpAlias, length ) )
 		    {
-			char* lpch = PROFILE_GetStringItem( lpchX );
+			/* alias is not needed since the real font is present */
+			frMatch = NULL; break;
+		    }
+		}
 
-			if( lpch )
-			{
+		if( frMatch )
+		{
+		    if( bSubst )
+		    {
 #ifdef DEBUG_FONT_INIT
-                            dprintf_font(stddeb, "\tsubstituted '%s' with %s\n",
-							fr->lfFaceName, lpchW );
+                        dprintf_font(stddeb, "\tsubstituted '%s' with %s\n",
+						frMatch->lfFaceName, lpAlias );
 #endif
-			    lstrcpyn32A( fr->lfFaceName, lpchW, LF_FACESIZE );
-			    fr->fr_flags |= FR_NAMESET;
-			}
-		        else
-			{
-			    /* create new entry in the alias table */
-			    XFONT_CreateAlias(fr->lfFaceName, lpchW);
-			}
-			break;
+			lstrcpyn32A( frMatch->lfFaceName, lpAlias, LF_FACESIZE );
+			frMatch->fr_flags |= FR_NAMESET;
+		    }
+		    else
+		    {
+			/* create new entry in the alias table */
+			XFONT_CreateAlias( frMatch->lfFaceName, lpAlias );
 		    }
 		}
 	    }
@@ -883,8 +993,10 @@
     pwd = getpwuid(getuid());
     if( pwd && pwd->pw_dir )
     {
-	int i = lstrlen32A( pwd->pw_dir ) + lstrlen32A( INIWinePrefix ) + lstrlen32A( INIFontMetrics ) + 2;
-	if( i > *buf_size ) buffer = (char*) HeapReAlloc( SystemHeap, 0, buffer, *buf_size = i );
+	int i = lstrlen32A( pwd->pw_dir ) + lstrlen32A( INIWinePrefix ) + 
+					    lstrlen32A( INIFontMetrics ) + 2;
+	if( i > *buf_size ) 
+	    buffer = (char*) HeapReAlloc( SystemHeap, 0, buffer, *buf_size = i );
 	lstrcpy32A( buffer, pwd->pw_dir );
 	strcat( buffer, INIWinePrefix );
 	strcat( buffer, INIFontMetrics );
@@ -896,7 +1008,7 @@
 /***********************************************************************
  *           XFONT_ReadCachedMetrics
  */
-static BOOL32 XFONT_ReadCachedMetrics( int fd, unsigned x_checksum, int x_count )
+static BOOL32 XFONT_ReadCachedMetrics( int fd, int res, unsigned x_checksum, int x_count )
 {
     if( fd >= 0 )
     {
@@ -938,6 +1050,9 @@
 			      (int)(pfi->next) != j++ ) goto fail;
 
 			   pfi->df.dfFace = pfr->lfFaceName;
+			   pfi->df.dfHorizRes = pfi->df.dfVertRes = res;
+			   pfi->df.dfPoints = (INT16)(((INT32)(pfi->df.dfPixHeight -
+					pfi->df.dfInternalLeading) * 72) / res );
 			   pfi->next = pfi + 1;
 
 			   if( j > pfr->count ) break;
@@ -1059,6 +1174,108 @@
 }
 
 /***********************************************************************
+ *           XFONT_CheckIniSection
+ *
+ *   Examines wine.conf for old/invalid font entries and recommend changes to
+ *   the user.
+ *
+ *   Revision history
+ *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ */
+static void XFONT_CheckIniCallback(char const *, char const *, void *);
+
+static char const  *fontmsgprologue =
+"Wine warning:\n"
+"   The following entries in the [fonts] section of the wine.conf file are\n"
+"   obsolete or invalid:\n";
+
+static char const  *fontmsgepilogue =
+"   These entries should be eliminated or updated.\n"
+"   See the documentation/fonts file for more information.\n";
+
+static int XFONT_CheckIniSection()
+{
+    int  found = 0;
+
+    PROFILE_EnumerateWineIniSection("Fonts", &XFONT_CheckIniCallback,
+                    (void *)&found);
+    if(found)
+    fprintf(stderr, fontmsgepilogue);
+
+    return 1;
+}
+
+static void  XFONT_CheckIniCallback(
+    char const  *key,
+    char const  *value,
+    void  *found)
+{
+    /* Ignore any keys that start with potential comment characters "'", '#',
+       or ';'. */
+    if(key[0] == '\'' || key[0] == '#' || key[0] == ';' || key[0] == '\0')
+    return;
+
+    /* Make sure this is a valid key */
+    if((strncasecmp(key, INISubSection, 5) == 0) ||
+       (strcasecmp(key, INIDefault) == 0) ||
+       (strcasecmp(key, INIGlobalMetrics) == 0) ||
+       (strcasecmp(key, INIResolution) == 0) ) 
+    {
+	/* Valid key; make sure the value doesn't contain a wildcard */
+	if(strchr(value, '*')) {
+	    if(*(int *)found == 0) {
+		fprintf(stderr, fontmsgprologue);
+		++*(int *)found;
+	    }
+
+	    fprintf(stderr, "     %s=%s [no wildcards allowed]\n", key, value);
+	}
+    }
+    else {
+	/* Not a valid key */
+	if(*(int *)found == 0) {
+	    fprintf(stderr, fontmsgprologue);
+	    ++*(int *)found;
+    }
+
+	fprintf(stderr, "     %s=%s [obsolete]\n", key, value);
+    }
+
+    return;
+}
+
+/***********************************************************************
+ *           XFONT_GetPointResolution()
+ *
+ * Here we initialize DefResolution which is used in the
+ * XFONT_Match() penalty function. We also load the point
+ * resolution value (higher values result in larger fonts).
+ */
+static int XFONT_GetPointResolution( DeviceCaps* pDevCaps )
+{
+    int i, j, point_resolution, num = 3; 
+    int allowed_xfont_resolutions[3] = { 72, 75, 100 };
+    int best = 0, best_diff = 65536;
+
+    DefResolution = point_resolution = PROFILE_GetWineIniInt( INIFontSection, INIResolution, 0 );
+    if( !DefResolution ) DefResolution = point_resolution = pDevCaps->logPixelsY;
+    else pDevCaps->logPixelsX = pDevCaps->logPixelsY = DefResolution;
+
+    for( i = best = 0; i < num; i++ )
+    {
+	j = abs( DefResolution - allowed_xfont_resolutions[i] );
+	if( j < best_diff )
+	{
+	    best = i;
+		best_diff = j;
+	}
+    }
+    DefResolution = allowed_xfont_resolutions[best];
+    return point_resolution;
+}
+
+/***********************************************************************
  *           X11DRV_FONT_Init
  *
  * Initialize font resource list and allocate font cache.
@@ -1069,24 +1286,18 @@
   fontResource* fr, *pfr;
   fontInfo*	fi, *pfi;
   unsigned	x_checksum;
-  int		i, j, k, x_count, fd = -1, buf_size = 0;
+  int		i, j, res, x_count, fd = -1, buf_size = 0;
   char*		lpstr, *lpch, *lpmetrics, *buffer;
   char**	x_pattern;
 
-  DefResolution = PROFILE_GetWineIniInt( INIFontSection, "Resolution", 0 );
-  if( !DefResolution ) DefResolution = pDevCaps->logPixelsY;
+  XFONT_CheckIniSection();
 
-  i = abs(DefResolution - 72);
-  j = abs(DefResolution - 75);
-  k = abs(DefResolution - 100);
-
-  if( i < j ) DefResolution = ( i < k ) ? 72 : 100;
-  else DefResolution = ( j < k ) ? 75 : 100;
+  res = XFONT_GetPointResolution( pDevCaps );
       
   x_pattern = XListFonts(display, "*", MAX_FONT_FAMILIES * 16, &x_count );
 
-  dprintf_font(stddeb,"Font Mapper: initializing %i fonts [LPY=%i, DR=%i]\n", 
-				    x_count, pDevCaps->logPixelsY, DefResolution);
+  dprintf_font(stddeb,"Font Mapper: initializing %i fonts [LPY=%i, XDR=%i, DR=%i]\n", 
+				    x_count, pDevCaps->logPixelsY, DefResolution, res);
   for( i = x_checksum = 0; i < x_count; i++ )
   {
 #if 0
@@ -1104,17 +1315,17 @@
 
   /* deal with systemwide font metrics cache */
 
-  if( PROFILE_GetWineIniString( INIFontSection, "FontMetrics", "", buffer, 128 ) )
+  if( PROFILE_GetWineIniString( INIFontSection, INIGlobalMetrics, "", buffer, 128 ) )
       fd = open( buffer, O_RDONLY );
 
-  if( XFONT_ReadCachedMetrics(fd, x_checksum, x_count) == FALSE )
+  if( XFONT_ReadCachedMetrics(fd, res, x_checksum, x_count) == FALSE )
   {
       /* try per-user */
       buffer = XFONT_UserMetricsCache( buffer, &buf_size );
       if( buffer[0] )
       {
 	  fd = open( buffer, O_RDONLY );
-	  if( XFONT_ReadCachedMetrics(fd, x_checksum, x_count) == FALSE )
+	  if( XFONT_ReadCachedMetrics(fd, res, x_checksum, x_count) == FALSE )
 	      lpmetrics = HEAP_strdupA( SystemHeap, 0, buffer ); /* update later on */
       }
   }
@@ -1196,8 +1407,7 @@
 
 	if( (x_fs = XLoadQueryFont(display, lpstr)) )
 	{
-	   fi->df.dfHorizRes = pDevCaps->logPixelsX;
-           fi->df.dfVertRes = pDevCaps->logPixelsY;
+	   fi->df.dfHorizRes = fi->df.dfVertRes = res;
 
 	   XFONT_SetFontMetric( fi, fr, x_fs );
            XFreeFont( display, x_fs );
@@ -1301,7 +1511,7 @@
  *      weight, italics, underlines, strikeouts
  *
  * NOTE: you can experiment with different penalty weights to see what happens.
- * http://premium.microsoft.com/msdn/library/techart/f30/f34/f40/d4d/sa8bf.htm
+ * http://premium.microsoft.com/msdn/library/techart/f365/f36b/f37b/d38b/sa8bf.htm
  */
 static UINT32 XFONT_Match( fontMatch* pfm )
 {
@@ -1354,7 +1564,7 @@
 	   else 	/* expand only in integer multiples */
 	   {
 	       pfm->height = height - height%pfi->df.dfPixHeight;
-	       penalty += (height - pfm->height) * pfm->height / height;
+	       penalty += (height - pfm->height + 1) * height / pfi->df.dfPixHeight;
 	   }
        }
        else /* can't be scaled at all */
@@ -1432,18 +1642,6 @@
 }
 
 /***********************************************************************
- *            XFONT_CheckAliasTable
- */
-static LPSTR XFONT_CheckAliasTable( LPSTR lpAlias )
-{
-    fontAlias* fa;
-
-    for( fa = aliasTable; fa; fa = fa->next )
-	if( !lstrcmpi32A( fa->faAlias, lpAlias ) ) return fa->faTypeFace;
-    return NULL;
-}
-
-/***********************************************************************
  *            XFONT_CheckFIList
  *
  * REMOVE_SUBSETS - attach new fi and purge subsets
@@ -1515,9 +1713,17 @@
     fontMatch           fm = *pfm;
 
     pfm->pfi = NULL;
-    if( fm.plf->lfFaceName[0] )
+    if( fm.plf->lfFaceName[0] ) 
     {
-	LPSTR str = XFONT_CheckAliasTable( fm.plf->lfFaceName );
+	fontAlias* fa;
+	LPSTR str = NULL;
+
+	for( fa = aliasTable; fa; fa = fa->next )
+	     if( !lstrcmpi32A( fa->faAlias, fm.plf->lfFaceName ) ) 
+	     {
+		str = fa->faTypeFace;
+		break;
+	     }
         fm.pfr = XFONT_FindFIList( start, str ? str : fm.plf->lfFaceName );
     }
 
@@ -1827,11 +2033,17 @@
 HFONT32 X11DRV_FONT_SelectObject( DC* dc, HFONT32 hfont, FONTOBJ* font )
 {
     HFONT32 hPrevFont = 0;
+    LOGFONT16	lf;
 
     if( CHECK_PFONT(dc->u.x.font) ) 
         XFONT_ReleaseCacheEntry( __PFONT(dc->u.x.font) );
 
-    dc->u.x.font = XFONT_RealizeFont( &font->logfont );
+    /* FIXME: do we need to pass anything back from here? */
+    memcpy(&lf,&font->logfont,sizeof(lf));
+    lf.lfWidth	= font->logfont.lfWidth * dc->vportExtX/dc->wndExtX;
+    lf.lfHeight	= font->logfont.lfHeight* dc->vportExtY/dc->wndExtY;
+
+    dc->u.x.font = XFONT_RealizeFont( &lf );
     hPrevFont = dc->w.hFont;
     dc->w.hFont = hfont;
 
@@ -1966,7 +2178,7 @@
  *	   the pfr->resource field) with FR_SOFTFONT/FR_SOFTRESOURCE 
  *	   flag set. 
  */
-INT16 AddFontResource16( LPCSTR filename )
+INT16 WINAPI AddFontResource16( LPCSTR filename )
 {
     return AddFontResource32A( filename );
 }
@@ -1975,7 +2187,7 @@
 /***********************************************************************
  *           AddFontResource32A    (GDI32.2)
  */
-INT32 AddFontResource32A( LPCSTR str )
+INT32 WINAPI AddFontResource32A( LPCSTR str )
 {
     if (HIWORD(str))	/* font file */
         fprintf( stdnimp, "STUB: AddFontResource('%s')\n", str );
@@ -1988,7 +2200,7 @@
 /***********************************************************************
  *           AddFontResource32W    (GDI32.4)
  */
-INT32 AddFontResource32W( LPCWSTR str )
+INT32 WINAPI AddFontResource32W( LPCWSTR str )
 {
     fprintf( stdnimp, "STUB: AddFontResource32W(%p)\n", str );
     return 1;
@@ -1997,7 +2209,7 @@
 /***********************************************************************
  *           RemoveFontResource16    (GDI.136)
  */
-BOOL16 RemoveFontResource16( SEGPTR str )
+BOOL16 WINAPI RemoveFontResource16( SEGPTR str )
 {
     if (HIWORD(str))
         fprintf( stdnimp, "STUB: RemoveFontResource('%s')\n",
@@ -2011,7 +2223,7 @@
 /***********************************************************************
  *           RemoveFontResource32A    (GDI32.284)
  */
-BOOL32 RemoveFontResource32A( LPCSTR str )
+BOOL32 WINAPI RemoveFontResource32A( LPCSTR str )
 {
     if (HIWORD(str))
         fprintf( stdnimp, "STUB: RemoveFontResource('%s')\n", str );
@@ -2024,7 +2236,7 @@
 /***********************************************************************
  *           RemoveFontResource32W    (GDI32.286)
  */
-BOOL32 RemoveFontResource32W( LPCWSTR str )
+BOOL32 WINAPI RemoveFontResource32W( LPCWSTR str )
 {
     fprintf( stdnimp, "STUB: RemoveFontResource32W(%p)\n", str );
     return TRUE;
diff --git a/if1632/builtin.c b/if1632/builtin.c
index ebe48ad..6cc4527 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -154,7 +154,7 @@
     { &GDI32_Descriptor,    0 },
     { &KERNEL32_Descriptor, DLL_FLAG_ALWAYS_USED },
     { &LZ32_Descriptor,     0 },
-    { &MPR_Descriptor,      0 },
+    { &MPR_Descriptor,      DLL_FLAG_NOT_USED },
     { &NTDLL_Descriptor,    0 },
     { &SHELL32_Descriptor,  0 },
     { &USER32_Descriptor,   0 },
diff --git a/if1632/comctl32.spec b/if1632/comctl32.spec
index be6c101..d2f1efa 100644
--- a/if1632/comctl32.spec
+++ b/if1632/comctl32.spec
@@ -20,7 +20,7 @@
 11 stub MakeDragList
 12 stub LBItemFromPt
 13 stub DrawInsert
-14 stub CreateUpDownControl
+14 stdcall CreateUpDownControl(long long long long long long long long long long long long) CreateUpDownControl
 15 stdcall InitCommonControls() InitCommonControls
 16 stub CreateStatusWindow
 17 stub CreateStatusWindowW
diff --git a/if1632/crtdll.spec b/if1632/crtdll.spec
index 42a8805..5a61f97 100644
--- a/if1632/crtdll.spec
+++ b/if1632/crtdll.spec
@@ -131,7 +131,7 @@
 126 stub _getpid
 127 stub _getsystime
 128 stub _getw
-129 stub _global_unwind2
+129 register _global_unwind2(ptr) CRTDLL__global_unwind2
 130 stub _heapchk
 131 stub _heapmin
 132 stub _heapset
@@ -175,7 +175,7 @@
 170 stub _kbhit
 171 stub _lfind
 172 stub _loaddll
-173 stub _local_unwind2
+173 register _local_unwind2(ptr long) CRTDLL__local_unwind2
 174 stub _locking
 175 stub _logb
 176 stub _lrotl
@@ -461,7 +461,7 @@
 456 cdecl sin(long) CRTDLL_sin
 457 cdecl sinh(long) CRTDLL_sinh
 458 cdecl sprintf() CRTDLL_sprintf
-459 cdecl sqrt(long) CRTDLL_sqrt
+459 cdecl sqrt(long long) CRTDLL_sqrt
 460 cdecl srand(long) CRTDLL_srand
 461 cdecl sscanf() CRTDLL_sscanf
 462 cdecl strcat(ptr ptr) strcat
diff --git a/if1632/dummy.c b/if1632/dummy.c
index abc792e..dbf23c8 100644
--- a/if1632/dummy.c
+++ b/if1632/dummy.c
@@ -1,47 +1,49 @@
 #include <stdio.h>
-long stub_GDI_379(void) { fprintf(stderr, "Warning: GDI_379:STARTPAGE unimplemented stub\n"); return 1; }
-long stub_GDI_380(void) { fprintf(stderr, "Warning: GDI_380:ENDPAGE unimplemented stub\n"); return 1; }
-long stub_GDI_381(void) { fprintf(stderr, "Warning: GDI_381:SETABORTPROC unimplemented stub\n"); return 1; }
-long stub_GDI_382(void) { fprintf(stderr, "Warning: GDI_382:ABORTPROC unimplemented stub\n"); return 1; }
-long stub_GDI_530(void) { fprintf(stderr, "Warning: GDI_530: unimplemented stub\n"); return 0; }
-long stub_GDI_531(void) { fprintf(stderr, "Warning: GDI_531: unimplemented stub\n"); return 0; }
-long stub_GDI_532(void) { fprintf(stderr, "Warning: GDI_532: unimplemented stub\n"); return 0; }
-long stub_GDI_536(void) { fprintf(stderr, "Warning: GDI_536: unimplemented stub\n"); return 0; }
-long stub_GDI_538(void) { fprintf(stderr, "Warning: GDI_538: unimplemented stub\n"); return 0; }
-long stub_GDI_540(void) { fprintf(stderr, "Warning: GDI_540: unimplemented stub\n"); return 0; }
-long stub_GDI_543(void) { fprintf(stderr, "Warning: GDI_543: unimplemented stub\n"); return 0; }
-long stub_GDI_555(void) { fprintf(stderr, "Warning: GDI_555: unimplemented stub\n"); return 0; }
-long stub_GDI_560(void) { fprintf(stderr, "Warning: GDI_560: unimplemented stub\n"); return 0; }
-long stub_GDI_561(void) { fprintf(stderr, "Warning: GDI_561: unimplemented stub\n"); return 0; }
-long stub_GDI_564(void) { fprintf(stderr, "Warning: GDI_564: unimplemented stub\n"); return 0; }
-long stub_GDI_565(void) { fprintf(stderr, "Warning: GDI_565: unimplemented stub\n"); return 0; }
-long stub_GDI_566(void) { fprintf(stderr, "Warning: GDI_566: unimplemented stub\n"); return 0; }
-long stub_GDI_571(void) { fprintf(stderr, "Warning: GDI_571: unimplemented stub\n"); return 0; }
-long stub_GDI_572(void) { fprintf(stderr, "Warning: GDI_572: unimplemented stub\n"); return 0; }
-long stub_GDI_573(void) { fprintf(stderr, "Warning: GDI_573: unimplemented stub\n"); return 0; }
-long stub_GDI_556(void) { fprintf(stderr, "Warning: GDI_556: unimplemented stub\n"); return 0; }
-long stub_GDI_558(void) { fprintf(stderr, "Warning: GDI_558: unimplemented stub\n"); return 0; }
-long stub_GDI_569(void) { fprintf(stderr, "Warning: GDI_569: unimplemented stub\n"); return 0; }
-long stub_KERNEL_450(void) { fprintf(stderr, "Warning: KERNEL_450: unimplemented stub\n"); return 0; }
-long stub_USER_489(void) { fprintf(stderr, "Warning: USER_489: unimplemented stub\n"); return 0; }
-long stub_USER_490(void) { fprintf(stderr, "Warning: USER_490: unimplemented stub\n"); return 0; }
-long stub_USER_492(void) { fprintf(stderr, "Warning: USER_492: unimplemented stub\n"); return 0; }
-long stub_USER_496(void) { fprintf(stderr, "Warning: USER_496: unimplemented stub\n"); return 0; }
-long stub_USER_902(void) { fprintf(stderr, "Warning: USER_902: unimplemented stub\n"); return 0; }
-long stub_USER_905(void) { fprintf(stderr, "Warning: USER_905: unimplemented stub\n"); return 0; }
-long stub_USER_906(void) { fprintf(stderr, "Warning: USER_906: unimplemented stub\n"); return 0; }
-long stub_USER_907(void) { fprintf(stderr, "Warning: USER_907: unimplemented stub\n"); return 0; }
-long stub_USER_909(void) { fprintf(stderr, "Warning: USER_909: unimplemented stub\n"); return 0; }
-long stub_USER_910(void) { fprintf(stderr, "Warning: USER_910: unimplemented stub\n"); return 0; }
-long stub_USER_911(void) { fprintf(stderr, "Warning: USER_911: unimplemented stub\n"); return 0; }
-long stub_USER_912(void) { fprintf(stderr, "Warning: USER_912: unimplemented stub\n"); return 0; }
-long stub_USER_913(void) { fprintf(stderr, "Warning: USER_913: unimplemented stub\n"); return 0; }
-long stub_USER_914(void) { fprintf(stderr, "Warning: USER_914: unimplemented stub\n"); return 0; }
-long stub_USER_915(void) { fprintf(stderr, "Warning: USER_915: unimplemented stub\n"); return 0; }
-long stub_USER_916(void) { fprintf(stderr, "Warning: USER_916: unimplemented stub\n"); return 0; }
-long stub_USER_918(void) { fprintf(stderr, "Warning: USER_918: unimplemented stub\n"); return 0; }
-long stub_USER_919(void) { fprintf(stderr, "Warning: USER_919: unimplemented stub\n"); return 0; }
-long stub_USER_920(void) { fprintf(stderr, "Warning: USER_920: unimplemented stub\n"); return 0; }
-long stub_USER_922(void) { fprintf(stderr, "Warning: USER_922: unimplemented stub\n"); return 0; }
-long stub_USER_923(void) { fprintf(stderr, "Warning: USER_923: unimplemented stub\n"); return 0; }
-long stub_KERNEL_700(void) { fprintf(stderr, "Warning: KERNEL_700: unimplemented stub\n"); return 1; }
+#include "wintypes.h"
+long WINAPI stub_GDI_379(void) { fprintf(stderr, "Warning: GDI_379:STARTPAGE unimplemented stub\n"); return 1; }
+long WINAPI stub_GDI_380(void) { fprintf(stderr, "Warning: GDI_380:ENDPAGE unimplemented stub\n"); return 1; }
+long WINAPI stub_GDI_381(void) { fprintf(stderr, "Warning: GDI_381:SETABORTPROC unimplemented stub\n"); return 1; }
+long WINAPI stub_GDI_382(void) { fprintf(stderr, "Warning: GDI_382:ABORTPROC unimplemented stub\n"); return 1; }
+long WINAPI stub_GDI_530(void) { fprintf(stderr, "Warning: GDI_530: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_531(void) { fprintf(stderr, "Warning: GDI_531: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_532(void) { fprintf(stderr, "Warning: GDI_532: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_536(void) { fprintf(stderr, "Warning: GDI_536: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_538(void) { fprintf(stderr, "Warning: GDI_538: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_540(void) { fprintf(stderr, "Warning: GDI_540: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_543(void) { fprintf(stderr, "Warning: GDI_543: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_555(void) { fprintf(stderr, "Warning: GDI_555: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_560(void) { fprintf(stderr, "Warning: GDI_560: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_561(void) { fprintf(stderr, "Warning: GDI_561: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_564(void) { fprintf(stderr, "Warning: GDI_564: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_565(void) { fprintf(stderr, "Warning: GDI_565: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_566(void) { fprintf(stderr, "Warning: GDI_566: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_571(void) { fprintf(stderr, "Warning: GDI_571: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_572(void) { fprintf(stderr, "Warning: GDI_572: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_573(void) { fprintf(stderr, "Warning: GDI_573: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_556(void) { fprintf(stderr, "Warning: GDI_556: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_558(void) { fprintf(stderr, "Warning: GDI_558: unimplemented stub\n"); return 0; }
+long WINAPI stub_GDI_569(void) { fprintf(stderr, "Warning: GDI_569: unimplemented stub\n"); return 0; }
+long WINAPI stub_KERNEL_450(void) { fprintf(stderr, "Warning: KERNEL_450: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_489(void) { fprintf(stderr, "Warning: USER_489: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_490(void) { fprintf(stderr, "Warning: USER_490: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_492(void) { fprintf(stderr, "Warning: USER_492: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_496(void) { fprintf(stderr, "Warning: USER_496: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_902(void) { fprintf(stderr, "Warning: USER_902: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_905(void) { fprintf(stderr, "Warning: USER_905: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_906(void) { fprintf(stderr, "Warning: USER_906: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_907(void) { fprintf(stderr, "Warning: USER_907: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_909(void) { fprintf(stderr, "Warning: USER_909: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_910(void) { fprintf(stderr, "Warning: USER_910: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_911(void) { fprintf(stderr, "Warning: USER_911: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_912(void) { fprintf(stderr, "Warning: USER_912: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_913(void) { fprintf(stderr, "Warning: USER_913: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_914(void) { fprintf(stderr, "Warning: USER_914: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_915(void) { fprintf(stderr, "Warning: USER_915: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_916(void) { fprintf(stderr, "Warning: USER_916: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_918(void) { fprintf(stderr, "Warning: USER_918: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_919(void) { fprintf(stderr, "Warning: USER_919: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_920(void) { fprintf(stderr, "Warning: USER_920: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_922(void) { fprintf(stderr, "Warning: USER_922: unimplemented stub\n"); return 0; }
+long WINAPI stub_USER_923(void) { fprintf(stderr, "Warning: USER_923: unimplemented stub\n"); return 0; }
+long WINAPI stub_KERNEL_700(void) { fprintf(stderr, "Warning: KERNEL_700: unimplemented stub\n"); return 1; }
+long WINAPI stub_KERNEL_449(void) { fprintf(stderr, "Warning: KERNEL_449: unimplemented stub\n"); return 0; }
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index e407b44..1b0f157 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -314,7 +314,7 @@
              ScaleViewportExtEx16
 485 pascal16 ScaleWindowExtEx(word s_word s_word s_word s_word ptr)
              ScaleWindowExtEx16
-486 stub GETASPECTRATIOFILTEREX
+486 pascal16 GetAspectRatioFilterEx(word ptr) GetAspectRatioFilterEx16
 489 stub CreateDIBSection
 490 stub CloseEnhMetafile
 491 stub CopyEnhMetafile
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index 5cf890a..fd5c543 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -391,7 +391,7 @@
 0379 stub GdiWinWatchOpen
 0380 stub GetGlyphOutlineWow
 0381 stub GetTextCharsetInfo
-0382 stub TranslateCharsetInfo
+0382 stdcall TranslateCharsetInfo(ptr ptr long) TranslateCharSetInfo
 0383 stub UpdateICMRegKeyA
 0384 stub UpdateICMRegKeyW
 0385 stub gdiPlaySpoolStream
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 39a6b41..e17ff9c 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -243,6 +243,7 @@
 318 stub FatalExitHook
 319 stub FlushCachedFileHandle
 320 pascal16 IsTask(word) IsTask
+321 stub KERNEL_321
 323 return IsRomModule 2 0
 324 pascal16 LogError(word ptr) LogError
 325 pascal16 LogParamError(word ptr ptr) LogParamError
@@ -304,7 +305,7 @@
 445 stub KERNEL_445
 446 stub KERNEL_446
 447 stub KERNEL_447
-449 stub KERNEL_449
+449 pascal KERNEL_449() stub_KERNEL_449
 450 pascal16 KERNEL_450() stub_KERNEL_450
 454 stub KERNEL_454
 455 stub KERNEL_455
@@ -321,7 +322,7 @@
 513 pascal   LoadLibraryEx32W(ptr long long) LoadLibraryEx32W16
 514 pascal16 FreeLibrary32W(long) FreeLibrary32
 515 pascal   GetProcAddress32W(long ptr) GetProcAddress32
-516 stub GetVDMPointer32W
+516 pascal GetVDMPointer32W(segptr long) GetVDMPointer32W
 517 pascal CallProc32W() WIN16_CallProc32W
 518 stub CallProcEx32W
 519 stub KERNEL_519
@@ -334,7 +335,7 @@
 612 stub KERNEL_612
 613 stub KERNEL_613
 614 stub KERNEL_614
-619 stub KERNEL_619
+619 pascal KERNEL_619(word long long) _KERNEL_619
 621 stub KERNEL_621
 627 stub IsBadFlatReadWritePtr
 630 stub KERNEL_630
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index b858d62..695a564 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -35,7 +35,7 @@
 40  stdcall _KERNEL32_41(long long long long long) _KERNEL32_41
 41  stub _KERNEL32_42
 42  stdcall _KERNEL32_43(long ptr long ptr ptr) _KERNEL32_43
-44  register _KERNEL32_45(long) _KERNEL32_45 
+44  register _KERNEL32_45() _KERNEL32_45 
 45  stdcall _KERNEL32_46(long long long long long) _KERNEL32_46
 46  stub _KERNEL32_47
  
@@ -44,7 +44,7 @@
 51  register _KERNEL32_52(long) _KERNEL32_52
 
 # WOW calls
-53  stub WOWCallback16
+53  stdcall WOWCallback16(long long) WOWCallback16
 54  stub WOWCallback16Ex
 55  stdcall WOWGetVDMPointer(long long long) WOWGetVDMPointer
 56  stub WOWHandle32
@@ -53,7 +53,7 @@
 59  stub WOWGlobalLock16
 60  stub WOWGlobalUnlock16
 61  stub WOWGlobalFree16
-62  stub WOWGlobalAllocLock16
+62  stdcall WOWGlobalAllocLock16(long long ptr) WOWGlobalAllocLock16
 63  stub WOWGlobalUnlockFree16
 64  stub WOWGlobalLockSize16
 65  stub WOWYield16
@@ -78,10 +78,10 @@
 84  stub RtlConvertUlongToLargeInteger
 
 86  stdcall _KERNEL32_87() _KERNEL32_87
-87  cdecl _KERNEL32_88(long long ptr) _KERNEL32_88
+87  cdecl _KERNEL32_88() _KERNEL32_88
 88  stub _KERNEL32_89
-89  stub _KERNEL32_90
-90  register _KERNEL32_91() _KERNEL32_91
+89  register _KERNEL32_90() _KERNEL32_90
+90  stub _KERNEL32_91
 91  stub _KERNEL32_92
 92  stdcall GETPWIN16LOCK(ptr) GetPWinLock
 96  stub ENTERSYSLEVEL
@@ -137,7 +137,7 @@
 144   stub ConnectNamedPipe
 145   stdcall ContinueDebugEvent(long long long) ContinueDebugEvent
 146   stub ConvertDefaultLocale
-147   stub ConvertToGlobalHandle
+147   stdcall ConvertToGlobalHandle(long) ConvertToGlobalHandle
 148   stdcall CopyFileA(ptr ptr long) CopyFile32A
 149   stdcall CopyFileW(ptr ptr long) CopyFile32W
 150   stub CreateConsoleScreenBuffer
@@ -285,6 +285,7 @@
 292   stdcall GetComputerNameA(ptr ptr) GetComputerName32A
 293   stdcall GetComputerNameW(ptr ptr) GetComputerName32W
 294   stdcall GetConsoleCP() GetConsoleCP
+295   stub GetConsoleCursorInfo
 296   stdcall GetConsoleMode(long ptr) GetConsoleMode
 297   stdcall GetConsoleOutputCP() GetConsoleOutputCP
 298   stdcall GetConsoleScreenBufferInfo(long ptr) GetConsoleScreenBufferInfo
@@ -368,7 +369,7 @@
 376   stub GetProcessShutdownParameters
 377   stdcall GetProcessTimes(long ptr ptr ptr ptr) GetProcessTimes
 378   stdcall GetProcessVersion(long) GetProcessVersion
-379   stub GetProcessWorkingSetSize
+379   stdcall GetProcessWorkingSetSize(long ptr ptr) GetProcessWorkingSetSize
 380   stub GetProductName
 381   stdcall GetProfileIntA(ptr ptr long) GetProfileInt32A
 382   stdcall GetProfileIntW(ptr ptr long) GetProfileInt32W
@@ -407,7 +408,7 @@
 415   stdcall GetThreadContext(long ptr) GetThreadContext
 416   stdcall GetThreadLocale() GetThreadLocale
 417   stdcall GetThreadPriority(long) GetThreadPriority
-418   stub GetThreadSelectorEntry
+418   stdcall GetThreadSelectorEntry(long long ptr) GetThreadSelectorEntry
 419   stub GetThreadTimes
 420   stdcall GetTickCount() GetTickCount
 421   stub GetTimeFormatA
@@ -454,6 +455,7 @@
 462   stdcall HeapFree(long long ptr) HeapFree
 463   stdcall HeapLock(long) HeapLock
 464   stdcall HeapReAlloc(long long ptr long) HeapReAlloc
+465   stub HeapSetFlags
 466   stdcall HeapSize(long long ptr) HeapSize
 467   stdcall HeapUnlock(long) HeapUnlock
 468   stdcall HeapValidate(long long ptr) HeapValidate
@@ -461,10 +463,10 @@
 470   stub InitAtomTable
 471   stdcall InitializeCriticalSection(ptr) InitializeCriticalSection
 472   stdcall InterlockedDecrement(ptr) InterlockedDecrement
-473   stdcall InterlockedExchange(ptr) InterlockedExchange
+473   stdcall InterlockedExchange(ptr long) InterlockedExchange
 474   stdcall InterlockedIncrement(ptr) InterlockedIncrement
 475   stub InvalidateNLSCache
-476   stdcall IsBadCodePtr(ptr long) IsBadCodePtr32
+476   stdcall IsBadCodePtr(ptr) IsBadCodePtr32
 477   stdcall IsBadHugeReadPtr(ptr long) IsBadHugeReadPtr32
 478   stdcall IsBadHugeWritePtr(ptr long) IsBadHugeWritePtr32
 479   stdcall IsBadReadPtr(ptr long) IsBadReadPtr32
@@ -483,7 +485,7 @@
 492   stub LCMapStringW
 493   stdcall LeaveCriticalSection(ptr)	LeaveCriticalSection
 494   stdcall LoadLibraryA(ptr) LoadLibrary32A
-495   stub LoadLibraryExA
+495   stdcall LoadLibraryExA(ptr long long) LoadLibraryEx32A
 496   stub LoadLibraryExW
 497   stdcall LoadLibraryW(ptr) LoadLibrary32W
 498   stub LoadModule
@@ -510,9 +512,8 @@
 519   stub MapHModuleLS
 520   stub MapHModuleSL
 521   stdcall MapLS(ptr) MapLS
-643   stdcall MapSL(long) MapSL
+522   stdcall MapSL(long) MapSL
 523   stub MapSLFix
-522   stub MapSL
 524   stdcall MapViewOfFile(long long long long long) MapViewOfFile
 525   stdcall MapViewOfFileEx(long long long long long ptr) MapViewOfFileEx
 526   stub Module32First
@@ -523,6 +524,7 @@
 531   stdcall MoveFileW(ptr ptr) MoveFile32W
 532   stdcall MulDiv(long long long) MulDiv32
 533   stdcall MultiByteToWideChar(long long ptr long ptr long) MultiByteToWideChar
+534   stub NotifyNLSUserCache
 535   stdcall OpenEventA(long long ptr) OpenEvent32A
 536   stdcall OpenEventW(long long ptr) OpenEvent32W
 537   stdcall OpenFile(ptr ptr long) OpenFile32
@@ -546,7 +548,7 @@
 555   stub Process32Next
 556   stub PulseEvent
 557   stub PurgeComm
-558   stub QT_Thunk
+558   register QT_Thunk() QT_Thunk
 559   stdcall QueryDosDeviceA(ptr ptr long) QueryDosDevice32A
 560   stdcall QueryDosDeviceW(ptr ptr long) QueryDosDevice32W
 561   stub QueryNumberOfEventLogRecords
@@ -566,7 +568,7 @@
 575   stdcall ReadConsoleW(long ptr long ptr ptr) ReadConsole32W
 576   stdcall ReadFile(long ptr long ptr ptr) ReadFile
 577   stub ReadFileEx
-578   stub ReadProcessMemory
+578   stdcall ReadProcessMemory(long ptr ptr long ptr) ReadProcessMemory
 579   stub RegisterServiceProcess
 580   stdcall ReinitializeCriticalSection(ptr) ReinitializeCriticalSection
 581   stdcall ReleaseMutex(long) ReleaseMutex
@@ -579,16 +581,16 @@
 588   stdcall RtlMoveMemory(ptr ptr long) RtlMoveMemory
 589   register RtlUnwind(ptr long ptr long) RtlUnwind
 590   stdcall RtlZeroMemory(ptr long) RtlZeroMemory
-591   stub SMapLS
-592   stub SMapLS_IP_EBP_12
-593   stub SMapLS_IP_EBP_16
-594   stub SMapLS_IP_EBP_20
-595   stub SMapLS_IP_EBP_24
-596   stub SMapLS_IP_EBP_28
-597   stub SMapLS_IP_EBP_32
-598   stub SMapLS_IP_EBP_36
-599   stub SMapLS_IP_EBP_40
-600   stub SMapLS_IP_EBP_8
+591   register SMapLS() SMapLS
+592   register SMapLS_IP_EBP_12() SMapLS_IP_EBP_12
+593   register SMapLS_IP_EBP_16() SMapLS_IP_EBP_16
+594   register SMapLS_IP_EBP_20() SMapLS_IP_EBP_20
+595   register SMapLS_IP_EBP_24() SMapLS_IP_EBP_24
+596   register SMapLS_IP_EBP_28() SMapLS_IP_EBP_28
+597   register SMapLS_IP_EBP_32() SMapLS_IP_EBP_32
+598   register SMapLS_IP_EBP_36() SMapLS_IP_EBP_36
+599   register SMapLS_IP_EBP_40() SMapLS_IP_EBP_40
+600   register SMapLS_IP_EBP_8() SMapLS_IP_EBP_8
 601   stub SUnMapLS
 602   stub SUnMapLS_IP_EBP_12
 603   stub SUnMapLS_IP_EBP_16
@@ -648,8 +650,8 @@
 657   stub SetMailslotInfo
 658   stub SetNamedPipeHandleState
 659   stdcall SetPriorityClass(long long) SetPriorityClass
-660   stub SetProcessShutdownParameters
-661   stub SetProcessWorkingSetSize
+660   stdcall SetProcessShutdownParameters(long long) SetProcessShutdownParameters
+661   stdcall SetProcessWorkingSetSize(long long long) SetProcessWorkingSetSize
 662   stdcall SetStdHandle(long long) SetStdHandle
 663   stdcall SetSystemPowerState(long long) SetSystemPowerState
 664   stdcall SetSystemTime(ptr) SetSystemTime
@@ -672,11 +674,12 @@
 681   stdcall SystemTimeToFileTime(ptr ptr) SystemTimeToFileTime
 682   stub SystemTimeToTzSpecificLocalTime
 683   stub TerminateProcess
-684   stub TerminateThread
+684   stdcall TerminateThread(long long) TerminateThread
 685   stub Thread32First
 686   stub Thread32Next
 687   stdcall ThunkConnect32(ptr ptr ptr ptr ptr ptr) ThunkConnect32
 688   stdcall TlsAlloc()	TlsAlloc
+689   stub TlsAllocInternal
 690   stdcall TlsFree(long) TlsFree
 691   stub TlsFreeInternal
 692   stdcall TlsGetValue(long) TlsGetValue
@@ -710,7 +713,7 @@
 720   stub WaitForMultipleObjects
 721   stub WaitForMultipleObjectsEx
 722   stdcall WaitForSingleObject(long long) WaitForSingleObject
-723   stub WaitForSingleObjectEx
+723   stdcall WaitForSingleObjectEx(long long long) WaitForSingleObjectEx
 724   stub WaitNamedPipeA
 725   stub WaitNamedPipeW
 726   stdcall WideCharToMultiByte(long long ptr long ptr long ptr ptr)	WideCharToMultiByte
@@ -798,8 +801,6 @@
 805   stub GetConsoleCommandHistoryLengthA
 806   stub GetConsoleCommandHistoryLengthW
 807   stub GetConsoleCommandHistoryW
-808   stub GetConsoleCursorInfo
-809   stub GetConsoleCursorInfo
 810   stub GetConsoleDisplayMode
 811   stub GetConsoleFontInfo
 812   stub GetConsoleFontSize
@@ -812,12 +813,10 @@
 819   stub HeapCreateTagsW
 820   stub HeapExtend
 821   stub HeapQueryTagW
-822   stub HeapSetFlags
 823   stub HeapSummary
 824   stub HeapUsage
 825   stub InvalidateConsoleDIBits
 826   stub IsDebuggerPresent
-827   stub NotifyNLSUserCache
 828   stub OpenConsoleW
 829   stub QueryWin31IniFilesMappedToRegistry
 830   stub RegisterConsoleVDM
diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec
index 910f246..68b3a60 100644
--- a/if1632/mmsystem.spec
+++ b/if1632/mmsystem.spec
@@ -42,6 +42,7 @@
 305    pascal  MIDIINCLOSE(word) midiInClose
 306    pascal  MIDIINPREPAREHEADER(word segptr word) midiInPrepareHeader
 307    pascal  MIDIINUNPREPAREHEADER(word segptr word) midiInUnprepareHeader
+308    pascal  MIDIINADDBUFFER(word segptr word) midiInAddBuffer
 309    pascal  MIDIINSTART(word) midiInStart
 310    pascal  MIDIINSTOP(word) midiInStop
 311    pascal  MIDIINRESET(word) midiInReset
diff --git a/if1632/ntdll.spec b/if1632/ntdll.spec
index eeee134..08d3941 100644
--- a/if1632/ntdll.spec
+++ b/if1632/ntdll.spec
@@ -874,20 +874,20 @@
 870 stub _snwprintf
 871 stub _splitpath
 872 stub _strcmpi
-873 stub _stricmp
+873 stdcall _stricmp(ptr ptr) lstrcmpi32A
 874 stub _strlwr
 875 stub _strnicmp
 876 stdcall _strupr(ptr) CRTDLL__strupr
 877 stub _ultoa
 878 stub _vsnprintf
 879 stdcall _wcsicmp(ptr ptr) lstrcmpi32W
-880 stub _wcslwr
-881 stub _wcsnicmp
-882 stub _wcsupr
+880 stdcall _wcslwr(ptr) CRTDLL__wcslwr
+881 stdcall _wcsnicmp(ptr ptr long) lstrncmpi32W
+882 stdcall _wcsupr(ptr) CRTDLL__wcsupr
 883 stub abs
 884 stub atan
 885 stdcall atoi(ptr) CRTDLL_atoi
-886 stub atol
+886 stdcall atol(ptr) CRTDLL_atol
 887 stub ceil
 888 stub cos
 889 stub fabs
@@ -917,10 +917,10 @@
 913 stdcall sscanf() CRTDLL_sscanf
 914 stub strcat
 915 stdcall strchr(ptr long) strchr
-916 stub strcmp
-917 stub strcpy
+916 stdcall strcmp(ptr ptr) lstrcmp32A
+917 stdcall strcpy(ptr ptr) lstrcpy32A
 918 stub strcspn
-919 stub strlen
+919 stdcall strlen(ptr) lstrlen32A
 920 stub strncat
 921 stub strncmp
 922 stub strncpy
diff --git a/if1632/relay.c b/if1632/relay.c
index 06bf036..f8e98c4 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -35,6 +35,7 @@
 
     extern void CALLTO16_Start(), CALLTO16_End();
     extern void CALLTO16_Ret_word(), CALLTO16_Ret_long();
+    extern int CALLTO32_LargeStack();
     extern DWORD CALLTO16_RetAddr_word, CALLTO16_RetAddr_long;
 
     codesel = GLOBAL_CreateBlock( GMEM_FIXED, (void *)CALLTO16_Start,
@@ -49,6 +50,10 @@
     CALLTO16_RetAddr_long=MAKELONG( (int)CALLTO16_Ret_long-(int)CALLTO16_Start,
                                     codesel );
 
+    /* Set the CallLargeStack function pointer */
+
+    IF1632_CallLargeStack = CALLTO32_LargeStack;
+
     /* Initialize thunking */
 
     return THUNK_Init();
@@ -326,7 +331,7 @@
 /**********************************************************************
  *	     Catch    (KERNEL.55)
  */
-INT16 Catch( LPCATCHBUF lpbuf )
+INT16 WINAPI Catch( LPCATCHBUF lpbuf )
 {
     STACK16FRAME *pFrame = CURRENT_STACK16;
 
@@ -363,7 +368,7 @@
 /**********************************************************************
  *	     Throw    (KERNEL.56)
  */
-INT16 Throw( LPCATCHBUF lpbuf, INT16 retval )
+INT16 WINAPI Throw( LPCATCHBUF lpbuf, INT16 retval )
 {
     STACK16FRAME *pFrame;
     WORD es = CURRENT_STACK16->es;
@@ -394,8 +399,8 @@
 /**********************************************************************
  *	     CallProc32W    (KERNEL.56)
  */
-DWORD
-WIN16_CallProc32W() {
+DWORD /*WINAPI*/ WIN16_CallProc32W()
+{
 	DWORD *win_stack = (DWORD *)CURRENT_STACK16->args;
 	DWORD	nrofargs = win_stack[0];
 	DWORD	argconvmask = win_stack[1];
@@ -429,6 +434,10 @@
 		break;
 	case 5:	ret = CallTo32_5(proc32,args[0],args[1],args[2],args[3],args[4]);
 		break;
+	case 6:	ret = CallTo32_6(proc32,args[0],args[1],args[2],args[3],args[4],args[5]);
+		break;
+	case 7:	ret = CallTo32_7(proc32,args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
+		break;
 	default:
 		/* FIXME: should go up to 32  arguments */
 		fprintf(stderr,"CallProc32W: unsupported number of arguments %ld, please report.\n",nrofargs);
diff --git a/if1632/shell32.spec b/if1632/shell32.spec
index 4498271..14f5deb 100644
--- a/if1632/shell32.spec
+++ b/if1632/shell32.spec
@@ -17,6 +17,7 @@
   39 stdcall DragAcceptFiles(long long) DragAcceptFiles
   40 stub DragFinish
   42 stub DragQueryFile
+  47 stub SHELL32_47
   48 stub DragQueryFileA
   51 stub DragQueryFileAorW
   52 stub DragQueryFileW
@@ -31,9 +32,15 @@
  136 stub ExtractIconExA
  146 stub ExtractIconResInfoA
  148 stub ExtractIconResInfoW
+ 154 stub SHELL32_154
+ 155 stub SHELL32_155
+ 156 stub SHELL32_156
+ 158 stub SHELL32_158
  178 stub ExtractIconW
  180 stub ExtractVersionResource16W
- 184 stub FindExecutableA
+ 182 stub SHELL32_182
+ 183 stub SHELL32_183
+ 184 stdcall FindExecutableA(ptr ptr ptr) FindExecutable32A
  185 stub FindExecutableW
  186 return FreeIconList 4 0
  187 stub InternalExtractIconListA
diff --git a/if1632/signal.c b/if1632/signal.c
index 58f0c0b..62a6395 100644
--- a/if1632/signal.c
+++ b/if1632/signal.c
@@ -28,7 +28,7 @@
 
 #include "debugger.h"
 #include "options.h"
-#include "sigcontext.h"
+#include "sig_context.h"
 #include "miscemu.h"
 
 
diff --git a/if1632/thunk.c b/if1632/thunk.c
index 39cf091..a28c665 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -1,7 +1,8 @@
 /*
- * Emulator thunks
+ * Emulator and Win95 thunks
  *
  * Copyright 1996 Alexandre Julliard
+ * Copyright 1997 Marcus Meissner
  */
 
 #include "windows.h"
@@ -134,8 +135,8 @@
 /***********************************************************************
  *           THUNK_EnumObjects16   (GDI.71)
  */
-INT16 THUNK_EnumObjects16( HDC16 hdc, INT16 nObjType,
-                           GOBJENUMPROC16 func, LPARAM lParam )
+INT16 WINAPI THUNK_EnumObjects16( HDC16 hdc, INT16 nObjType,
+                                  GOBJENUMPROC16 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_ll );
     return EnumObjects16( hdc, nObjType, (GOBJENUMPROC16)&thunk, lParam );
@@ -145,8 +146,8 @@
 /***********************************************************************
  *           THUNK_EnumObjects32   (GDI32.89)
  */
-INT32 THUNK_EnumObjects32( HDC32 hdc, INT32 nObjType,
-                           GOBJENUMPROC32 func, LPARAM lParam )
+INT32 WINAPI THUNK_EnumObjects32( HDC32 hdc, INT32 nObjType,
+                                  GOBJENUMPROC32 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_2 );
     return EnumObjects32( hdc, nObjType, (GOBJENUMPROC32)&thunk, lParam );
@@ -156,8 +157,8 @@
 /*************************************************************************
  *           THUNK_EnumFonts16   (GDI.70)
  */
-INT16 THUNK_EnumFonts16( HDC16 hdc, LPCSTR lpFaceName,
-                         FONTENUMPROC16 func, LPARAM lParam )
+INT16 WINAPI THUNK_EnumFonts16( HDC16 hdc, LPCSTR lpFaceName,
+                                FONTENUMPROC16 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_llwl );
     return EnumFonts16( hdc, lpFaceName, (FONTENUMPROC16)&thunk, lParam );
@@ -166,8 +167,8 @@
 /*************************************************************************
  *           THUNK_EnumFonts32A   (GDI32.84)
  */
-INT32 THUNK_EnumFonts32A( HDC32 hdc, LPCSTR lpFaceName,
-                          FONTENUMPROC32A func, LPARAM lParam )
+INT32 WINAPI THUNK_EnumFonts32A( HDC32 hdc, LPCSTR lpFaceName,
+                                 FONTENUMPROC32A func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumFonts32A( hdc, lpFaceName, (FONTENUMPROC32A)&thunk, lParam );
@@ -176,8 +177,8 @@
 /*************************************************************************
  *           THUNK_EnumFonts32W   (GDI32.85)
  */
-INT32 THUNK_EnumFonts32W( HDC32 hdc, LPCWSTR lpFaceName,
-                          FONTENUMPROC32W func, LPARAM lParam )
+INT32 WINAPI THUNK_EnumFonts32W( HDC32 hdc, LPCWSTR lpFaceName,
+                                 FONTENUMPROC32W func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumFonts32W( hdc, lpFaceName, (FONTENUMPROC32W)&thunk, lParam );
@@ -186,8 +187,8 @@
 /******************************************************************
  *           THUNK_EnumMetaFile16   (GDI.175)
  */
-BOOL16 THUNK_EnumMetaFile16( HDC16 hdc, HMETAFILE16 hmf,
-                             MFENUMPROC16 func, LPARAM lParam )
+BOOL16 WINAPI THUNK_EnumMetaFile16( HDC16 hdc, HMETAFILE16 hmf,
+                                    MFENUMPROC16 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_wllwl );
     return EnumMetaFile16( hdc, hmf, (MFENUMPROC16)&thunk, lParam );
@@ -197,8 +198,8 @@
 /*************************************************************************
  *           THUNK_EnumFontFamilies16   (GDI.330)
  */
-INT16 THUNK_EnumFontFamilies16( HDC16 hdc, LPCSTR lpszFamily,
-                                FONTENUMPROC16 func, LPARAM lParam )
+INT16 WINAPI THUNK_EnumFontFamilies16( HDC16 hdc, LPCSTR lpszFamily,
+                                       FONTENUMPROC16 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_llwl );
     return EnumFontFamilies16(hdc, lpszFamily, (FONTENUMPROC16)&thunk, lParam);
@@ -208,8 +209,8 @@
 /*************************************************************************
  *           THUNK_EnumFontFamilies32A   (GDI32.80)
  */
-INT32 THUNK_EnumFontFamilies32A( HDC32 hdc, LPCSTR lpszFamily,
-                                 FONTENUMPROC32A func, LPARAM lParam )
+INT32 WINAPI THUNK_EnumFontFamilies32A( HDC32 hdc, LPCSTR lpszFamily,
+                                        FONTENUMPROC32A func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumFontFamilies32A(hdc,lpszFamily,(FONTENUMPROC32A)&thunk,lParam);
@@ -219,8 +220,8 @@
 /*************************************************************************
  *           THUNK_EnumFontFamilies32W   (GDI32.83)
  */
-INT32 THUNK_EnumFontFamilies32W( HDC32 hdc, LPCWSTR lpszFamily,
-                                 FONTENUMPROC32W func, LPARAM lParam )
+INT32 WINAPI THUNK_EnumFontFamilies32W( HDC32 hdc, LPCWSTR lpszFamily,
+                                        FONTENUMPROC32W func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumFontFamilies32W(hdc,lpszFamily,(FONTENUMPROC32W)&thunk,lParam);
@@ -229,9 +230,9 @@
 /*************************************************************************
  *           THUNK_EnumFontFamiliesEx16   (GDI.613)
  */
-INT16 THUNK_EnumFontFamiliesEx16( HDC16 hdc, LPLOGFONT16 lpLF,
-                                  FONTENUMPROCEX16 func, LPARAM lParam,
-                                  DWORD reserved )
+INT16 WINAPI THUNK_EnumFontFamiliesEx16( HDC16 hdc, LPLOGFONT16 lpLF,
+                                         FONTENUMPROCEX16 func, LPARAM lParam,
+                                         DWORD reserved )
 {
     DECL_THUNK( thunk, func, CallTo16_word_llwl );
     return EnumFontFamiliesEx16( hdc, lpLF, (FONTENUMPROCEX16)&thunk,
@@ -242,9 +243,9 @@
 /*************************************************************************
  *           THUNK_EnumFontFamiliesEx32A   (GDI32.81)
  */
-INT32 THUNK_EnumFontFamiliesEx32A( HDC32 hdc, LPLOGFONT32A lpLF,
-                                   FONTENUMPROCEX32A func, LPARAM lParam,
-                                   DWORD reserved)
+INT32 WINAPI THUNK_EnumFontFamiliesEx32A( HDC32 hdc, LPLOGFONT32A lpLF,
+                                          FONTENUMPROCEX32A func, LPARAM lParam,
+                                          DWORD reserved)
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumFontFamiliesEx32A( hdc, lpLF, (FONTENUMPROCEX32A)&thunk,
@@ -255,9 +256,9 @@
 /*************************************************************************
  *           THUNK_EnumFontFamiliesEx32W   (GDI32.82)
  */
-INT32 THUNK_EnumFontFamiliesEx32W( HDC32 hdc, LPLOGFONT32W lpLF,
-                                   FONTENUMPROCEX32W func, LPARAM lParam,
-                                   DWORD reserved )
+INT32 WINAPI THUNK_EnumFontFamiliesEx32W( HDC32 hdc, LPLOGFONT32W lpLF,
+                                          FONTENUMPROCEX32W func, LPARAM lParam,
+                                          DWORD reserved )
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumFontFamiliesEx32W( hdc, lpLF, (FONTENUMPROCEX32W)&thunk,
@@ -268,8 +269,8 @@
 /**********************************************************************
  *           THUNK_LineDDA16   (GDI.100)
  */
-void THUNK_LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd, INT16 nYEnd,
-                      LINEDDAPROC16 func, LPARAM lParam )
+void WINAPI THUNK_LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd,
+                             INT16 nYEnd, LINEDDAPROC16 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_wwl );
     LineDDA16( nXStart, nYStart, nXEnd, nYEnd, (LINEDDAPROC16)&thunk, lParam );
@@ -279,8 +280,8 @@
 /**********************************************************************
  *           THUNK_LineDDA32   (GDI32.248)
  */
-BOOL32 THUNK_LineDDA32( INT32 nXStart, INT32 nYStart, INT32 nXEnd, INT32 nYEnd,
-                        LINEDDAPROC32 func, LPARAM lParam )
+BOOL32 WINAPI THUNK_LineDDA32( INT32 nXStart, INT32 nYStart, INT32 nXEnd,
+                               INT32 nYEnd, LINEDDAPROC32 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_3 );
     return LineDDA32( nXStart, nYStart, nXEnd, nYEnd,
@@ -291,7 +292,7 @@
 /*******************************************************************
  *           THUNK_EnumWindows16   (USER.54)
  */
-BOOL16 THUNK_EnumWindows16( WNDENUMPROC16 func, LPARAM lParam )
+BOOL16 WINAPI THUNK_EnumWindows16( WNDENUMPROC16 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_wl );
     return EnumWindows16( (WNDENUMPROC16)&thunk, lParam );
@@ -301,7 +302,7 @@
 /*******************************************************************
  *           THUNK_EnumWindows32   (USER32.192)
  */
-BOOL32 THUNK_EnumWindows32( WNDENUMPROC32 func, LPARAM lParam )
+BOOL32 WINAPI THUNK_EnumWindows32( WNDENUMPROC32 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_2 );
     return EnumWindows32( (WNDENUMPROC32)&thunk, lParam );
@@ -311,8 +312,8 @@
 /**********************************************************************
  *           THUNK_EnumChildWindows16   (USER.55)
  */
-BOOL16 THUNK_EnumChildWindows16( HWND16 parent, WNDENUMPROC16 func,
-                                 LPARAM lParam )
+BOOL16 WINAPI THUNK_EnumChildWindows16( HWND16 parent, WNDENUMPROC16 func,
+                                        LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_wl );
     return EnumChildWindows16( parent, (WNDENUMPROC16)&thunk, lParam );
@@ -322,8 +323,8 @@
 /**********************************************************************
  *           THUNK_EnumChildWindows32   (USER32.177)
  */
-BOOL32 THUNK_EnumChildWindows32( HWND32 parent, WNDENUMPROC32 func,
-                                 LPARAM lParam )
+BOOL32 WINAPI THUNK_EnumChildWindows32( HWND32 parent, WNDENUMPROC32 func,
+                                        LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_2 );
     return EnumChildWindows32( parent, (WNDENUMPROC32)&thunk, lParam );
@@ -333,8 +334,8 @@
 /**********************************************************************
  *           THUNK_EnumTaskWindows16   (USER.225)
  */
-BOOL16 THUNK_EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func,
-                                LPARAM lParam )
+BOOL16 WINAPI THUNK_EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func,
+                                       LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_wl );
     return EnumTaskWindows16( hTask, (WNDENUMPROC16)&thunk, lParam );
@@ -344,7 +345,8 @@
 /**********************************************************************
  *           THUNK_EnumThreadWindows   (USER32.189)
  */
-BOOL32 THUNK_EnumThreadWindows( DWORD id, WNDENUMPROC32 func, LPARAM lParam )
+BOOL32 WINAPI THUNK_EnumThreadWindows( DWORD id, WNDENUMPROC32 func,
+                                       LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_2 );
     return EnumThreadWindows( id, (WNDENUMPROC32)&thunk, lParam );
@@ -354,7 +356,7 @@
 /***********************************************************************
  *           THUNK_EnumProps16   (USER.27)
  */
-INT16 THUNK_EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
+INT16 WINAPI THUNK_EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
 {
     DECL_THUNK( thunk, func, CallTo16_word_wlw );
     return EnumProps16( hwnd, (PROPENUMPROC16)&thunk );
@@ -364,7 +366,7 @@
 /***********************************************************************
  *           THUNK_EnumProps32A   (USER32.185)
  */
-INT32 THUNK_EnumProps32A( HWND32 hwnd, PROPENUMPROC32A func )
+INT32 WINAPI THUNK_EnumProps32A( HWND32 hwnd, PROPENUMPROC32A func )
 {
     DECL_THUNK( thunk, func, CallTo32_3 );
     return EnumProps32A( hwnd, (PROPENUMPROC32A)&thunk );
@@ -374,7 +376,7 @@
 /***********************************************************************
  *           THUNK_EnumProps32W   (USER32.188)
  */
-INT32 THUNK_EnumProps32W( HWND32 hwnd, PROPENUMPROC32W func )
+INT32 WINAPI THUNK_EnumProps32W( HWND32 hwnd, PROPENUMPROC32W func )
 {
     DECL_THUNK( thunk, func, CallTo32_3 );
     return EnumProps32W( hwnd, (PROPENUMPROC32W)&thunk );
@@ -384,7 +386,8 @@
 /***********************************************************************
  *           THUNK_EnumPropsEx32A   (USER32.186)
  */
-INT32 THUNK_EnumPropsEx32A( HWND32 hwnd, PROPENUMPROCEX32A func, LPARAM lParam)
+INT32 WINAPI THUNK_EnumPropsEx32A( HWND32 hwnd, PROPENUMPROCEX32A func,
+                                   LPARAM lParam)
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumPropsEx32A( hwnd, (PROPENUMPROCEX32A)&thunk, lParam );
@@ -394,7 +397,8 @@
 /***********************************************************************
  *           THUNK_EnumPropsEx32W   (USER32.187)
  */
-INT32 THUNK_EnumPropsEx32W( HWND32 hwnd, PROPENUMPROCEX32W func, LPARAM lParam)
+INT32 WINAPI THUNK_EnumPropsEx32W( HWND32 hwnd, PROPENUMPROCEX32W func,
+                                   LPARAM lParam)
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumPropsEx32W( hwnd, (PROPENUMPROCEX32W)&thunk, lParam );
@@ -404,7 +408,8 @@
 /***********************************************************************
  *           THUNK_EnumSystemCodePages32A	(KERNEL32.92)
  */
-BOOL32 THUNK_EnumSystemCodePages32A( CODEPAGE_ENUMPROC32A func, DWORD flags )
+BOOL32 WINAPI THUNK_EnumSystemCodePages32A( CODEPAGE_ENUMPROC32A func,
+                                            DWORD flags )
 {
     DECL_THUNK( thunk, func, CallTo32_1 );
     return EnumSystemCodePages32A( (CODEPAGE_ENUMPROC32A)&thunk, flags );
@@ -414,7 +419,8 @@
 /***********************************************************************
  *           THUNK_EnumSystemCodePages32W	(KERNEL32.93)
  */
-BOOL32 THUNK_EnumSystemCodePages32W( CODEPAGE_ENUMPROC32W func, DWORD flags )
+BOOL32 WINAPI THUNK_EnumSystemCodePages32W( CODEPAGE_ENUMPROC32W func,
+                                            DWORD flags )
 {
     DECL_THUNK( thunk, func, CallTo32_1 );
     return EnumSystemCodePages32W( (CODEPAGE_ENUMPROC32W)&thunk, flags );
@@ -423,7 +429,7 @@
 /***********************************************************************
  *           THUNK_EnumSystemLocales32A   (KERNEL32.92)
  */
-BOOL32 THUNK_EnumSystemLocales32A( LOCALE_ENUMPROC32A func, DWORD flags )
+BOOL32 WINAPI THUNK_EnumSystemLocales32A( LOCALE_ENUMPROC32A func, DWORD flags)
 {
     DECL_THUNK( thunk, func, CallTo32_1 );
     return EnumSystemLocales32A( (LOCALE_ENUMPROC32A)&thunk, flags );
@@ -433,7 +439,7 @@
 /***********************************************************************
  *           THUNK_EnumSystemLocales32W   (KERNEL32.93)
  */
-BOOL32 THUNK_EnumSystemLocales32W( LOCALE_ENUMPROC32W func, DWORD flags )
+BOOL32 WINAPI THUNK_EnumSystemLocales32W( LOCALE_ENUMPROC32W func, DWORD flags)
 {
     DECL_THUNK( thunk, func, CallTo32_1 );
     return EnumSystemLocales32W( (LOCALE_ENUMPROC32W)&thunk, flags );
@@ -442,7 +448,10 @@
 /***********************************************************************
  *           THUNK_EnumResourceLanguages32W   (KERNEL32.87)
  */
-BOOL32 THUNK_EnumResourceLanguages32W( HMODULE32 hmod,LPCWSTR type,LPCWSTR name,ENUMRESLANGPROC32W func, LONG lParam )
+BOOL32 WINAPI THUNK_EnumResourceLanguages32W( HMODULE32 hmod, LPCWSTR type,
+                                              LPCWSTR name,
+                                              ENUMRESLANGPROC32W func,
+                                              LONG lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_5 );
     return EnumResourceLanguages32W( hmod,type,name,(ENUMRESLANGPROC32W)&thunk, lParam );
@@ -451,7 +460,10 @@
 /***********************************************************************
  *           THUNK_EnumResourceLanguages32A   (KERNEL32.86)
  */
-BOOL32 THUNK_EnumResourceLanguages32A( HMODULE32 hmod,LPCSTR type,LPCSTR name,ENUMRESLANGPROC32A func, LONG lParam )
+BOOL32 WINAPI THUNK_EnumResourceLanguages32A( HMODULE32 hmod, LPCSTR type,
+                                              LPCSTR name,
+                                              ENUMRESLANGPROC32A func,
+                                              LONG lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_5 );
     return EnumResourceLanguages32A( hmod,type,name,(ENUMRESLANGPROC32A)&thunk, lParam );
@@ -460,8 +472,8 @@
 /***********************************************************************
  *           THUNK_EnumResourceNames32A   (KERNEL32.88)
  */
-BOOL32 THUNK_EnumResourceNames32A( HMODULE32 hmod, LPCSTR type,
-                                   ENUMRESNAMEPROC32A func, LONG lParam )
+BOOL32 WINAPI THUNK_EnumResourceNames32A( HMODULE32 hmod, LPCSTR type,
+                                          ENUMRESNAMEPROC32A func, LONG lParam)
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumResourceNames32A( hmod,type,(ENUMRESNAMEPROC32A)&thunk,lParam );
@@ -470,8 +482,8 @@
 /***********************************************************************
  *           THUNK_EnumResourceNames32W   (KERNEL32.89)
  */
-BOOL32 THUNK_EnumResourceNames32W( HMODULE32 hmod, LPCWSTR type,
-                                   ENUMRESNAMEPROC32W func, LONG lParam )
+BOOL32 WINAPI THUNK_EnumResourceNames32W( HMODULE32 hmod, LPCWSTR type,
+                                          ENUMRESNAMEPROC32W func, LONG lParam)
 {
     DECL_THUNK( thunk, func, CallTo32_4 );
     return EnumResourceNames32W( hmod,type,(ENUMRESNAMEPROC32W)&thunk, lParam);
@@ -480,7 +492,8 @@
 /***********************************************************************
  *           THUNK_EnumResourceTypes32A   (KERNEL32.90)
  */
-BOOL32 THUNK_EnumResourceTypes32A( HMODULE32 hmod,ENUMRESTYPEPROC32A func, LONG lParam )
+BOOL32 WINAPI THUNK_EnumResourceTypes32A( HMODULE32 hmod,
+                                          ENUMRESTYPEPROC32A func, LONG lParam)
 {
     DECL_THUNK( thunk, func, CallTo32_3 );
     return EnumResourceTypes32A( hmod,(ENUMRESTYPEPROC32A)&thunk, lParam );
@@ -489,7 +502,9 @@
 /***********************************************************************
  *           THUNK_EnumResourceTypes32W   (KERNEL32.91)
  */
-BOOL32 THUNK_EnumResourceTypes32W( HMODULE32 hmod,ENUMRESTYPEPROC32W func, LONG lParam )
+BOOL32 WINAPI THUNK_EnumResourceTypes32W( HMODULE32 hmod,
+                                          ENUMRESTYPEPROC32W func,
+                                          LONG lParam )
 {
     DECL_THUNK( thunk, func, CallTo32_3 );
     return EnumResourceTypes32W( hmod,(ENUMRESTYPEPROC32W)&thunk, lParam );
@@ -499,9 +514,10 @@
 /***********************************************************************
  *           THUNK_GrayString16   (USER.185)
  */
-BOOL16 THUNK_GrayString16( HDC16 hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 func,
-                           LPARAM lParam, INT16 cch, INT16 x, INT16 y,
-                           INT16 cx, INT16 cy )
+BOOL16 WINAPI THUNK_GrayString16( HDC16 hdc, HBRUSH16 hbr,
+                                  GRAYSTRINGPROC16 func, LPARAM lParam,
+                                  INT16 cch, INT16 x, INT16 y,
+                                  INT16 cx, INT16 cy )
 {
     DECL_THUNK( thunk, func, CallTo16_word_wlw );
     if (!func)
@@ -515,9 +531,10 @@
 /***********************************************************************
  *           THUNK_GrayString32A   (USER32.314)
  */
-BOOL32 THUNK_GrayString32A( HDC32 hdc, HBRUSH32 hbr, GRAYSTRINGPROC32 func,
-                            LPARAM lParam, INT32 cch, INT32 x, INT32 y,
-                            INT32 cx, INT32 cy )
+BOOL32 WINAPI THUNK_GrayString32A( HDC32 hdc, HBRUSH32 hbr,
+                                   GRAYSTRINGPROC32 func, LPARAM lParam,
+                                   INT32 cch, INT32 x, INT32 y,
+                                   INT32 cx, INT32 cy )
 {
     DECL_THUNK( thunk, func, CallTo32_3 );
     if (!func)
@@ -531,9 +548,10 @@
 /***********************************************************************
  *           THUNK_GrayString32W   (USER32.315)
  */
-BOOL32 THUNK_GrayString32W( HDC32 hdc, HBRUSH32 hbr, GRAYSTRINGPROC32 func,
-                            LPARAM lParam, INT32 cch, INT32 x, INT32 y,
-                            INT32 cx, INT32 cy )
+BOOL32 WINAPI THUNK_GrayString32W( HDC32 hdc, HBRUSH32 hbr,
+                                   GRAYSTRINGPROC32 func,
+                                   LPARAM lParam, INT32 cch, INT32 x, INT32 y,
+                                   INT32 cx, INT32 cy )
 {
     DECL_THUNK( thunk, func, CallTo32_3 );
     if (!func)
@@ -547,7 +565,7 @@
 /***********************************************************************
  *           THUNK_SetWindowsHook16   (USER.121)
  */
-FARPROC16 THUNK_SetWindowsHook16( INT16 id, HOOKPROC16 proc )
+FARPROC16 WINAPI THUNK_SetWindowsHook16( INT16 id, HOOKPROC16 proc )
 {
     HINSTANCE16 hInst = FarGetOwner( HIWORD(proc) );
     HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
@@ -560,7 +578,7 @@
 /***********************************************************************
  *           THUNK_UnhookWindowsHook16   (USER.234)
  */
-BOOL16 THUNK_UnhookWindowsHook16( INT16 id, HOOKPROC16 proc )
+BOOL16 WINAPI THUNK_UnhookWindowsHook16( INT16 id, HOOKPROC16 proc )
 {
     BOOL16 ret;
     THUNK *thunk = THUNK_Find( (FARPROC16)proc );
@@ -574,8 +592,8 @@
 /***********************************************************************
  *           THUNK_SetWindowsHookEx16   (USER.291)
  */
-HHOOK THUNK_SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
-                                HTASK16 hTask )
+HHOOK WINAPI THUNK_SetWindowsHookEx16( INT16 id, HOOKPROC16 proc,
+                                       HINSTANCE16 hInst, HTASK16 hTask )
 {
     THUNK *thunk = THUNK_Alloc( (FARPROC16)proc, (RELAY)CallTo16_long_wwl );
     if (!thunk) return 0;
@@ -586,7 +604,7 @@
 /***********************************************************************
  *           THUNK_UnhookWindowHookEx16   (USER.292)
  */
-BOOL16 THUNK_UnhookWindowsHookEx16( HHOOK hhook )
+BOOL16 WINAPI THUNK_UnhookWindowsHookEx16( HHOOK hhook )
 {
     THUNK *thunk = (THUNK *)HOOK_GetProc16( hhook );
     BOOL16 ret = UnhookWindowsHookEx16( hhook );
@@ -598,7 +616,7 @@
 /***********************************************************************
  *           THUNK_CreateSystemTimer   (SYSTEM.2)
  */
-WORD THUNK_CreateSystemTimer( WORD rate, FARPROC16 callback )
+WORD WINAPI THUNK_CreateSystemTimer( WORD rate, FARPROC16 callback )
 {
     THUNK *thunk = THUNK_Alloc( callback, (RELAY)CallTo16_word_ );
     if (!thunk) return 0;
@@ -609,7 +627,7 @@
 /***********************************************************************
  *           THUNK_KillSystemTimer   (SYSTEM.3)
  */
-WORD THUNK_KillSystemTimer( WORD timer )
+WORD WINAPI THUNK_KillSystemTimer( WORD timer )
 {
     extern WORD SYSTEM_KillSystemTimer( WORD timer );  /* misc/system.c */
     extern FARPROC16 SYSTEM_GetTimerProc( WORD timer );  /* misc/system.c */
@@ -624,7 +642,7 @@
 /***********************************************************************
  *            THUNK_SetUnhandledExceptionFilter   (KERNEL32.516)
  */
-LPTOP_LEVEL_EXCEPTION_FILTER THUNK_SetUnhandledExceptionFilter(
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI THUNK_SetUnhandledExceptionFilter(
                                           LPTOP_LEVEL_EXCEPTION_FILTER filter )
 {
     LPTOP_LEVEL_EXCEPTION_FILTER old;
@@ -644,7 +662,7 @@
 /***********************************************************************
  *           THUNK_SetDCHook   (GDI.190)
  */
-BOOL16 THUNK_SetDCHook( HDC16 hdc, FARPROC16 proc, DWORD dwHookData )
+BOOL16 WINAPI THUNK_SetDCHook( HDC16 hdc, FARPROC16 proc, DWORD dwHookData )
 {
     THUNK *thunk, *oldThunk;
 
@@ -669,7 +687,7 @@
 /***********************************************************************
  *           THUNK_GetDCHook   (GDI.191)
  */
-DWORD THUNK_GetDCHook( HDC16 hdc, FARPROC16 *phookProc )
+DWORD WINAPI THUNK_GetDCHook( HDC16 hdc, FARPROC16 *phookProc )
 {
     THUNK *thunk = NULL;
     DWORD ret = GetDCHook( hdc, (FARPROC16 *)&thunk );
@@ -687,19 +705,81 @@
     return ret;
 }
 
+/***********************************************************************
+ *                                                                     *
+ *                 Win95 internal thunks                               *
+ *                                                                     *
+ ***********************************************************************/
 
+/***********************************************************************
+ * Generates a FT_Prolog call.
+ *	
+ *  0FB6D1                  movzbl edx,cl
+ *  8B1495xxxxxxxx	    mov edx,[4*edx + xxxxxxxx]
+ *  68xxxxxxxx		    push FT_Prolog
+ *  C3			    lret
+ */
+static void _write_ftprolog(LPBYTE start,DWORD thunkstart) {
+	LPBYTE	x;
+
+	x	= start;
+	*x++	= 0x0f;*x++=0xb6;*x++=0xd1; /* movzbl edx,cl */
+	*x++	= 0x8B;*x++=0x14;*x++=0x95;*(DWORD*)x= thunkstart;
+	x+=4;	/* mov edx, [4*edx + thunkstart] */
+	*x++	= 0x68; *(DWORD*)x = (DWORD)GetProcAddress32(WIN32_GetModuleHandleA("KERNEL32"),"FT_Prolog");
+	x+=4; 	/* push FT_Prolog */
+	*x++	= 0xC3;		/* lret */
+	/* fill rest with 0xCC / int 3 */
+}
+
+/***********************************************************************
+ * Generates a QT_Thunk style call.
+ *	
+ *  33C9                    xor ecx, ecx
+ *  8A4DFC                  mov cl , [ebp-04]
+ *  8B148Dxxxxxxxx          mov edx, [4*ecx + (EAX+EDX)]
+ *  B8yyyyyyyy              mov eax, QT_Thunk
+ *  FFE0                    jmp eax
+ */
+static void _write_qtthunk(LPBYTE start,DWORD thunkstart) {
+	LPBYTE	x;
+
+	x	= start;
+	*x++	= 0x33;*x++=0xC9; /* xor ecx,ecx */
+	*x++	= 0x8A;*x++=0x4D;*x++=0xFC; /* movb cl,[ebp-04] */
+	*x++	= 0x8B;*x++=0x14;*x++=0x8D;*(DWORD*)x= thunkstart;
+	x+=4;	/* mov edx, [4*ecx + (EAX+EDX) */
+	*x++	= 0xB8; *(DWORD*)x = (DWORD)GetProcAddress32(WIN32_GetModuleHandleA("KERNEL32"),"QT_Thunk");
+	x+=4; 	/* mov eax , QT_Thunk */
+	*x++	= 0xFF; *x++ = 0xE0;	/* jmp eax */
+	/* should fill the rest of the 32 bytes with 0xCC */
+}
+
+/***********************************************************************
+ *		ThunkConnect32		(KERNEL32)
+ * Connects a 32bit and a 16bit thunkbuffer.
+ */
 struct thunkstruct
 {
 	char	magic[4];
-	DWORD	x1;
-	DWORD	x2;
+	DWORD	length;
+	DWORD	ptr;
+	DWORD	x0C;
+
+	DWORD	x10;
+	DWORD	x14;
+	DWORD	x18;
+	DWORD	x1C;
+	DWORD	x20;
 };
 
-UINT32 ThunkConnect32( struct thunkstruct *ths, LPSTR thunkfun16,
-                       LPSTR module16, LPSTR module32, HMODULE32 hmod32,
-                       DWORD dllinitarg1 )
+UINT32 WINAPI ThunkConnect32( struct thunkstruct *ths, LPSTR thunkfun16,
+                              LPSTR module16, LPSTR module32, HMODULE32 hmod32,
+                              DWORD dllinitarg1 )
 {
 	HINSTANCE16	hmm;
+	SEGPTR		thkbuf;
+	struct	thunkstruct	*ths16;
 
 	fprintf(stdnimp,"ThunkConnect32(<struct>,%s,%s,%s,%x,%lx)\n",
 		thunkfun16,module32,module16,hmod32,dllinitarg1
@@ -710,8 +790,402 @@
 		ths->magic[2],
 		ths->magic[3]
 	);
-	fprintf(stdnimp,"	x1 = %lx\n",ths->x1);
-	fprintf(stdnimp,"	x2 = %lx\n",ths->x2);
+	fprintf(stdnimp,"	length = %lx\n",ths->length);
+	if (lstrncmp32A(ths->magic,"SL01",4)&&lstrncmp32A(ths->magic,"LS01",4))
+		return 0;
 	hmm=LoadModule16(module16,NULL);
+	if (hmm<=32)
+		return 0;
+	thkbuf=(SEGPTR)WIN32_GetProcAddress16(hmm,thunkfun16);
+	if (!thkbuf)
+		return 0;
+	ths16=(struct thunkstruct*)PTR_SEG_TO_LIN(thkbuf);
+	if (lstrncmp32A(ths16->magic,ths->magic,4))
+		return 0;
+
+	if (!lstrncmp32A(ths->magic,"SL01",4))  {
+		if (ths16->length != ths->length)
+			return 0;
+		ths->x0C = (DWORD)ths16;
+
+		fprintf(stderr,"	ths16 magic is 0x%08lx\n",*(DWORD*)ths16->magic);
+		if (*((DWORD*)ths16->magic) != 0x0000304C)
+			return 0;
+		if (!*(WORD*)(((LPBYTE)ths16)+0x12))
+			return 0;
+		
+	}
+	if (!lstrncmp32A(ths->magic,"LS01",4))  {
+		if (ths16->length != ths->length)
+			return 0;
+		ths->ptr = (DWORD)PTR_SEG_TO_LIN(ths16->ptr);
+		/* code offset for QT_Thunk is at 0x1C...  */
+		_write_qtthunk (((LPBYTE)ths) + ths->x1C,ths->ptr);
+		/* code offset for FT_Prolog is at 0x20...  */
+		_write_ftprolog(((LPBYTE)ths) + ths->x20,ths->ptr);
+		return 1;
+	}
 	return TRUE;
 }
+
+
+/**********************************************************************
+ * The infamous and undocumented QT_Thunk procedure.
+ *
+ * We get arguments in [EBP+8] up to [EBP+38].
+ * We have to set up a frame in the 16 bit stackframe.
+ *	saved_ss_sp:	bp+0x40
+ *			bp+0x3c
+ *			...
+ *		bp:	bp+0x00
+ *		sp:	
+ *		
+ */
+extern DWORD IF1632_Saved16_ss_sp;
+VOID WINAPI QT_Thunk(CONTEXT *context)
+{
+	CONTEXT	context16;
+	LPBYTE	curstack;
+	DWORD	ret;
+
+	fprintf(stderr,"QT_Thunk(%08lx) ..",EDX_reg(context));
+	fprintf(stderr,"	argsize probably ebp-esp=%ld\n",
+		EBP_reg(context)-ESP_reg(context)
+	);
+	memcpy(&context16,context,sizeof(context16));
+
+	curstack = PTR_SEG_TO_LIN(IF1632_Saved16_ss_sp);
+	memcpy(curstack-0x40,(LPBYTE)EBP_reg(context),0x40);
+	EBP_reg(&context16)	 = LOWORD(IF1632_Saved16_ss_sp)-0x40;
+	IF1632_Saved16_ss_sp	-= 0x3c;
+
+	CS_reg(&context16)	 = HIWORD(EDX_reg(context));
+	IP_reg(&context16)	 = LOWORD(EDX_reg(context));
+#ifndef WINELIB
+	ret = CallTo16_regs_(&context16);
+#endif
+	fprintf(stderr,". returned %08lx\n",ret);
+	EAX_reg(context) 	 = ret;
+	IF1632_Saved16_ss_sp	+= 0x3c;
+}
+
+
+/**********************************************************************
+ *           WOWCallback16 (KERNEL32.62)
+ */
+DWORD WINAPI WOWCallback16(FARPROC16 fproc,DWORD arg)
+{
+	DWORD	ret;
+	fprintf(stderr,"WOWCallback16(%p,0x%08lx) ",fproc,arg);
+	ret =  CallTo16_long_l(fproc,arg);
+	fprintf(stderr,"... returns %ld\n",ret);
+	return ret;
+}
+
+/***********************************************************************
+ *           _KERNEL32_52    (KERNEL32.52)
+ * FIXME: what does it really do?
+ */
+VOID WINAPI _KERNEL32_52(DWORD arg1,CONTEXT *regs)
+{
+	fprintf(stderr,"_KERNE32_52(arg1=%08lx,%08lx)\n",arg1,EDI_reg(regs));
+
+	EAX_reg(regs) = (DWORD)WIN32_GetProcAddress16(EDI_reg(regs),"ThkBuf");
+
+	fprintf(stderr,"	GetProcAddress16(\"ThkBuf\") returns %08lx\n",
+			EAX_reg(regs)
+	);
+}
+
+/***********************************************************************
+ * 		_KERNEL32_43 	(KERNEL32.42)
+ * A thunkbuffer link routine 
+ * The thunkbuf looks like:
+ *
+ *	00: DWORD	length		? don't know exactly
+ *	04: SEGPTR	ptr		? where does it point to?
+ * The pointer ptr is written into the first DWORD of 'thunk'.
+ * (probably correct implemented)
+ */
+BOOL32 WINAPI _KERNEL32_43(LPDWORD thunk,LPCSTR thkbuf,DWORD len,
+                           LPCSTR dll16,LPCSTR dll32)
+{
+	HINSTANCE16	hmod;
+	LPDWORD		addr;
+	SEGPTR		segaddr;
+
+	fprintf(stderr,"_KERNEL32_43(%p,%s,0x%08lx,%s,%s)\n",thunk,thkbuf,len,dll16,dll32);
+
+	hmod = LoadLibrary16(dll16);
+	if (hmod<32) {
+		fprintf(stderr,"->failed to load 16bit DLL %s, error %d\n",dll16,hmod);
+		return NULL;
+	}
+	segaddr = (DWORD)WIN32_GetProcAddress16(hmod,(LPSTR)thkbuf);
+	if (!segaddr) {
+		fprintf(stderr,"->no %s exported from %s!\n",thkbuf,dll16);
+		return NULL;
+	}
+	addr = (LPDWORD)PTR_SEG_TO_LIN(segaddr);
+	if (addr[0] != len) {
+		fprintf(stderr,"->thkbuf length mismatch? %ld vs %ld\n",len,addr[0]);
+		return NULL;
+	}
+	if (!addr[1])
+		return 0;
+	fprintf(stderr,"	addr[1] is %08lx\n",addr[1]);
+	*(DWORD*)thunk = addr[1];
+	return addr[1];
+}
+
+/***********************************************************************
+ * 		_KERNEL32_45 	(KERNEL32.44)
+ * Looks like another 32->16 thunk. Dunno why they need two of them.
+ * calls the win16 address in EAX with the current stack.
+ *
+ * FIXME: doesn't seem to work correctly yet...
+ */
+VOID WINAPI _KERNEL32_45(CONTEXT *context)
+{
+	CONTEXT	context16;
+	LPBYTE	curstack;
+	DWORD	ret,stacksize;
+
+	fprintf(stderr,"KERNEL32_45(%%eax=0x%08lx(%%cx=0x%04lx,%%edx=0x%08lx))\n",
+		(DWORD)EAX_reg(context),(DWORD)CX_reg(context),(DWORD)EDX_reg(context)
+	);
+	stacksize = EBP_reg(context)-ESP_reg(context);
+	fprintf(stderr,"	stacksize = %ld\n",stacksize);
+
+	memcpy(&context16,context,sizeof(context16));
+
+	curstack = PTR_SEG_TO_LIN(IF1632_Saved16_ss_sp);
+	memcpy(curstack-stacksize,(LPBYTE)EBP_reg(context),stacksize);
+	fprintf(stderr,"IF1632_Saved16_ss_sp is 0x%08lx\n",IF1632_Saved16_ss_sp);
+	EBP_reg(&context16)	 = LOWORD(IF1632_Saved16_ss_sp)-stacksize;
+	IF1632_Saved16_ss_sp	-= stacksize;
+
+	DI_reg(&context16)	 = CX_reg(context);
+	CS_reg(&context16)	 = HIWORD(EAX_reg(context));
+	IP_reg(&context16)	 = LOWORD(EAX_reg(context));
+	/* some more registers spronged locally, but I don't think they are
+	 * needed
+	 */
+#ifndef WINELIB
+	ret = CallTo16_regs_(&context16);
+#endif
+	fprintf(stderr,". returned %08lx\n",ret);
+	EAX_reg(context) 	 = ret;
+	IF1632_Saved16_ss_sp	+= stacksize;
+
+}
+
+/***********************************************************************
+ *		(KERNEL32.40)
+ * A thunk setup routine.
+ * Expects a pointer to a preinitialized thunkbuffer in the first argument
+ * looking like:
+ *	00..03:		unknown	(pointer, check _41, _43, _46)
+ *	04: EB1E		jmp +0x20
+ *
+ *	06..23:		unknown (space for replacement code, check .90)
+ *
+ *	24:>E800000000		call offset 29
+ *	29:>58			pop eax		   ( target of call )
+ *	2A: 2D25000000		sub eax,0x00000025 ( now points to offset 4 )
+ *	2F: BAxxxxxxxx		mov edx,xxxxxxxx
+ *	34: 68yyyyyyyy		push KERNEL32.90
+ *	39: C3			ret
+ *
+ *	3A: EB1E		jmp +0x20
+ *	3E ... 59:	unknown (space for replacement code?)
+ *	5A: E8xxxxxxxx		call <32bitoffset xxxxxxxx>
+ *	5F: 5A			pop edx
+ *	60: 81EA25xxxxxx	sub edx, 0x25xxxxxx
+ *	66: 52			push edx
+ *	67: 68xxxxxxxx		push xxxxxxxx
+ *	6C: 68yyyyyyyy		push KERNEL32.89
+ *	71: C3			ret
+ *	72: end?
+ * This function checks if the code is there, and replaces the yyyyyyyy entries
+ * by the functionpointers.
+ * The thunkbuf looks like:
+ *
+ *	00: DWORD	length		? don't know exactly
+ *	04: SEGPTR	ptr		? where does it point to?
+ * The segpointer ptr is written into the first DWORD of 'thunk'.
+ * (probably correct implemented)
+ */
+
+LPVOID WINAPI _KERNEL32_41(LPBYTE thunk,LPCSTR thkbuf,DWORD len,LPCSTR dll16,
+                           LPCSTR dll32)
+{
+	HMODULE32	hkrnl32 = WIN32_GetModuleHandleA("KERNEL32");
+	HMODULE16	hmod;
+	LPDWORD		addr,addr2;
+	DWORD		segaddr;
+
+	fprintf(stderr,"KERNEL32_41(%p,%s,%ld,%s,%s)\n",
+		thunk,thkbuf,len,dll16,dll32
+	);
+
+	/* FIXME: add checks for valid code ... */
+	/* write pointers to kernel32.89 and kernel32.90 (+ordinal base of 1) */
+	*(DWORD*)(thunk+0x35) = (DWORD)GetProcAddress32(hkrnl32,(LPSTR)90);
+	*(DWORD*)(thunk+0x6D) = (DWORD)GetProcAddress32(hkrnl32,(LPSTR)89);
+
+	
+	hmod = LoadLibrary16(dll16);
+	if (hmod<32) {
+		fprintf(stderr,"->failed to load 16bit DLL %s, error %d\n",dll16,hmod);
+		return NULL;
+	}
+	segaddr = (DWORD)WIN32_GetProcAddress16(hmod,(LPSTR)thkbuf);
+	if (!segaddr) {
+		fprintf(stderr,"->no %s exported from %s!\n",thkbuf,dll16);
+		return NULL;
+	}
+	addr = (LPDWORD)PTR_SEG_TO_LIN(segaddr);
+	if (addr[0] != len) {
+		fprintf(stderr,"->thkbuf length mismatch? %ld vs %ld\n",len,addr[0]);
+		return NULL;
+	}
+	addr2 = PTR_SEG_TO_LIN(addr[1]);
+	fprintf(stderr,"	addr2 is %08lx:%p\n",addr[1],addr2);
+	if (HIWORD(addr2))
+		*(DWORD*)thunk = (DWORD)addr2;
+	return addr2;
+}
+
+/***********************************************************************
+ *							(KERNEL32.91)
+ * Thunk priming? function
+ * Rewrites the first part of the thunk to use the QT_Thunk interface
+ * and jumps to the start of that code.
+ */
+VOID WINAPI _KERNEL32_90(CONTEXT *context)
+{
+	fprintf(stderr,"_KERNEL32_90(eax=0x%08lx,edx=0x%08lx,ebp[-4]=0x%02x,target = %08lx, *target =%08lx)\n",
+		EAX_reg(context),EDX_reg(context),((BYTE*)EBP_reg(context))[-4],
+		(*(DWORD*)(EAX_reg(context)+EDX_reg(context)))+4*(((BYTE*)EBP_reg(context))[-4]),
+		*(DWORD*)((*(DWORD*)(EAX_reg(context)+EDX_reg(context)))+4*(((BYTE*)EBP_reg(context))[-4]))
+	);
+	_write_qtthunk((LPBYTE)EAX_reg(context),*(DWORD*)(EAX_reg(context)+EDX_reg(context)));
+	/* we just call the real QT_Thunk right now 
+	 * we can bypass the relaycode, for we already have the registercontext
+	 */
+	EDX_reg(context) = *(DWORD*)((*(DWORD*)(EAX_reg(context)+EDX_reg(context)))+4*(((BYTE*)EBP_reg(context))[-4]));
+	return QT_Thunk(context);
+}
+
+/***********************************************************************
+ *							(KERNEL32.45)
+ * Another thunkbuf link routine.
+ * The start of the thunkbuf looks like this:
+ * 	00: DWORD	length
+ *	04: SEGPTR	address for thunkbuffer pointer
+ */
+VOID WINAPI _KERNEL32_46(LPBYTE thunk,LPSTR thkbuf,DWORD len,LPSTR dll16,
+                         LPSTR dll32)
+{
+	LPDWORD		addr;
+	HMODULE16	hmod;
+	SEGPTR		segaddr;
+
+	fprintf(stderr,"KERNEL32_46(%p,%s,%lx,%s,%s)\n",
+		thunk,thkbuf,len,dll16,dll32
+	);
+	hmod = LoadLibrary16(dll16);
+	if (hmod < 32) {
+		fprintf(stderr,"->couldn't load %s, error %d\n",dll16,hmod);
+		return;
+	}
+	segaddr = (SEGPTR)WIN32_GetProcAddress16(hmod,thkbuf);
+	if (!segaddr) {
+		fprintf(stderr,"-> haven't found %s in %s!\n",thkbuf,dll16);
+		return;
+	}
+	addr = (LPDWORD)PTR_SEG_TO_LIN(segaddr);
+	if (addr[0] != len) {
+		fprintf(stderr,"-> length of thkbuf differs from expected length! (%ld vs %ld)\n",addr[0],len);
+		return;
+	}
+	*(DWORD*)PTR_SEG_TO_LIN(addr[1]) = (DWORD)thunk;
+}
+
+/**********************************************************************
+ *           _KERNEL32_87
+ * Check if thunking is initialized (ss selector set up etc.)
+ */
+BOOL32 WINAPI _KERNEL32_87()
+{
+    fprintf(stderr,"KERNEL32_87 stub, returning TRUE\n");
+    return TRUE;
+}
+
+/**********************************************************************
+ *           _KERNEL32_88
+ * One of the real thunking functions. This one seems to be for 32<->32
+ * thunks. It should probably be capable of crossing processboundaries.
+ *
+ * And YES, I've seen nr=48 (somewhere in the Win95 32<->16 OLE coupling)
+ */
+DWORD WINAPI _KERNEL32_88(DWORD *args)
+{
+    DWORD	nr = args[0];
+    DWORD	flags = args[1];
+    FARPROC32	fun = (FARPROC32)args[2];
+    DWORD	i,ret;
+
+    fprintf(stderr,"KERNEL32_88(%ld,0x%08lx,%p,[ ",nr,flags,fun);
+    for (i=0;i<nr/4;i++)
+    	fprintf(stderr,"0x%08lx,",args[3+i]);
+    fprintf(stderr,"])");
+#ifndef WINELIB
+    switch (nr) {
+    case 0:	ret = CallTo32_0(fun);
+		break;
+    case 4:	ret = CallTo32_1(fun,args[3]);
+		break;
+    case 8:	ret = CallTo32_2(fun,args[3],args[4]);
+		break;
+    case 12:	ret = CallTo32_3(fun,args[3],args[4],args[5]);
+		break;
+    case 16:	ret = CallTo32_4(fun,args[3],args[4],args[5],args[6]);
+		break;
+    case 20:	ret = CallTo32_5(fun,args[3],args[4],args[5],args[6],args[7]);
+		break;
+    case 24:	ret = CallTo32_6(fun,args[3],args[4],args[5],args[6],args[7],args[8]);
+		break;
+    case 28:	ret = CallTo32_7(fun,args[3],args[4],args[5],args[6],args[7],args[8],args[9]);
+		break;
+    case 32:	ret = CallTo32_8(fun,args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10]);
+		break;
+    case 36:	ret = CallTo32_9(fun,args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11]);
+		break;
+    case 40:	ret = CallTo32_10(fun,args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12]);
+		break;
+    case 44:	ret = CallTo32_11(fun,args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13]);
+		break;
+    case 48:	ret = CallTo32_12(fun,args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14]);
+		break;
+    default:
+	fprintf(stderr,"    unsupported nr of arguments, %ld\n",nr);
+	ret = 0;
+	break;
+
+    }
+#endif
+    fprintf(stderr," returning %ld ...\n",ret);
+    return ret;
+}
+
+/**********************************************************************
+ * 		KERNEL_619		(KERNEL)
+ * Seems to store y and z depending on x in some internal lists...
+ */
+WORD WINAPI _KERNEL_619(WORD x,DWORD y,DWORD z)
+{
+    fprintf(stderr,"KERNEL_619(0x%04x,0x%08lx,0x%08lx)\n",x,y,z);
+    return x;
+}
diff --git a/if1632/user.spec b/if1632/user.spec
index 5f2dce1..6465424 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -283,7 +283,7 @@
 276 stub LockMyTask
 277 pascal16 GetDlgCtrlID(word) GetDlgCtrlID16
 278 pascal16 GetDesktopHwnd() GetDesktopHwnd
-279 stub OldSetDeskPattern
+279 pascal16 OldSetDeskPattern() SetDeskPattern
 280 pascal16 SetSystemMenu(word word) SetSystemMenu16
 281 pascal16 GetSysColorBrush(word) GetSysColorBrush16
 282 pascal16 SelectPalette(word word word) SelectPalette16
@@ -382,12 +382,12 @@
 431 pascal   AnsiUpper(segstr) AnsiUpper16
 432 pascal   AnsiLower(segstr) AnsiLower16
 433 pascal16 IsCharAlpha(byte) IsCharAlpha16
-434 pascal16 IsCharAlphanumeric(byte) IsCharAlphanumeric16
+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
-441 stub InsertMenuItem
+441 pascal16 InsertMenuItem(word word word ptr) InsertMenuItem16
 443 stub GetMenuItemInfo
 445 pascal   DefFrameProc(word word word word long) DefFrameProc16
 446 stub SetMenuItemInfo
@@ -503,8 +503,8 @@
 804 stub CHOOSECOLOR_CALLBACK16
 819 stub PeekMessage32
 820 stub GetMessage32
-821 stub TranslateMessage32
-821 stub IsDialogMessage32
+821 stub TranslateMessage32	
+#821 stub IsDialogMessage32		# FIXME: two ordinal 821???
 822 stub DispatchMessage32
 825 stub PostMessage32
 826 stub PostThreadMessage32
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 2144d97..78b5f23 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -165,7 +165,7 @@
 0158 stdcall DrawIcon(long long long long) DrawIcon32
 0159 stub DrawIconEx
 0160 stdcall DrawMenuBar(long) DrawMenuBar32
-0161 stub DrawStateA
+0161 stdcall DrawStateA(long long ptr long long long long long long long) DrawState32A
 0162 stub DrawStateW
 0163 stdcall DrawTextA(long ptr long ptr long) DrawText32A
 0164 stub DrawTextExA
@@ -253,7 +253,7 @@
 0246 stdcall GetKeyNameTextA(long ptr long) GetKeyNameText32A
 0247 stdcall GetKeyNameTextW(long ptr long) GetKeyNameText32W
 0248 stdcall GetKeyState(long) GetKeyState32
-0249 stub GetKeyboardLayout
+0249 stdcall GetKeyboardLayout(long) GetKeyboardLayout
 0250 stub GetKeyboardLayoutList
 0251 stub GetKeyboardLayoutNameA
 0252 stub GetKeyboardLayoutNameW
@@ -326,8 +326,8 @@
 0319 stdcall InSendMessage() InSendMessage32
 0320 stdcall InflateRect(ptr long long) InflateRect32
 0321 stdcall InsertMenuA(long long long long ptr) InsertMenu32A
-0322 stub InsertMenuItemA
-0323 stub InsertMenuItemW
+0322 stdcall InsertMenuItemA(long long long ptr) InsertMenuItem32A
+0323 stdcall InsertMenuItemW(long long long ptr) InsertMenuItem32W
 0324 stdcall InsertMenuW(long long long long ptr) InsertMenu32W
 0325 stub InternalGetWindowText
 0326 stdcall IntersectRect(ptr ptr ptr) IntersectRect32
@@ -492,10 +492,10 @@
 0485 stub SetLogonNotifyWindow
 0486 stdcall SetMenu(long long) SetMenu32
 0487 stub SetMenuContextHelpId
-0488 stub SetMenuDefaultItem
+0488 stdcall SetMenuDefaultItem(long long long) SetMenuDefaultItem32
 0489 stdcall SetMenuItemBitmaps(long long long long long) SetMenuItemBitmaps32
-0490 stub SetMenuItemInfoA
-0491 stub SetMenuItemInfoW
+0490 stdcall SetMenuItemInfoA(long long long ptr) SetMenuItemInfo32A
+0491 stdcall SetMenuItemInfoW(long long long ptr) SetMenuItemInfo32W
 0492 stub SetMessageExtraInfo
 0493 stdcall SetMessageQueue(long) SetMessageQueue32
 0494 stdcall SetParent(long long) SetParent32
diff --git a/if1632/winsock.spec b/if1632/winsock.spec
index 37ce932..2548e10 100644
--- a/if1632/winsock.spec
+++ b/if1632/winsock.spec
@@ -6,36 +6,36 @@
 name	winsock
 type	win16
 
-1   pascal16 accept(word ptr ptr) WINSOCK_accept
-2   pascal16 bind(word ptr word) WINSOCK_bind
-3   pascal16 closesocket(word) WINSOCK_closesocket
-4   pascal16 connect(word ptr word) WINSOCK_connect
-5   pascal16 getpeername(word ptr ptr) WINSOCK_getpeername
-6   pascal16 getsockname(word ptr ptr) WINSOCK_getsockname
-7   pascal16 getsockopt(word word word ptr ptr) WINSOCK_getsockopt
+1   pascal16 accept(word ptr ptr) WINSOCK_accept16
+2   pascal16 bind(word ptr word) WINSOCK_bind16
+3   pascal16 closesocket(word) WINSOCK_closesocket16
+4   pascal16 connect(word ptr word) WINSOCK_connect16
+5   pascal16 getpeername(word ptr ptr) WINSOCK_getpeername16
+6   pascal16 getsockname(word ptr ptr) WINSOCK_getsockname16
+7   pascal16 getsockopt(word word word ptr ptr) WINSOCK_getsockopt16
 8   pascal   htonl(long) WINSOCK_htonl
 9   pascal16 htons(word) WINSOCK_htons
 10  pascal   inet_addr(ptr) WINSOCK_inet_addr
 11  pascal   inet_ntoa(long) WINSOCK_inet_ntoa
-12  pascal16 ioctlsocket(word long ptr) WINSOCK_ioctlsocket
-13  pascal16 listen(word word) WINSOCK_listen
+12  pascal16 ioctlsocket(word long ptr) WINSOCK_ioctlsocket16
+13  pascal16 listen(word word) WINSOCK_listen16
 14  pascal   ntohl(long) WINSOCK_ntohl
 15  pascal16 ntohs(word) WINSOCK_ntohs
-16  pascal16 recv(word ptr word word) WINSOCK_recv
-17  pascal16 recvfrom(word ptr word word ptr ptr) WINSOCK_recvfrom
-18  pascal16 select(word ptr ptr ptr ptr) WINSOCK_select
-19  pascal16 send(word ptr word word) WINSOCK_send
-20  pascal16 sendto(word ptr word word ptr word) WINSOCK_sendto
-21  pascal16 setsockopt(word word word ptr word) WINSOCK_setsockopt
-22  pascal16 shutdown(word word) WINSOCK_shutdown
-23  pascal16 socket(word word word) WINSOCK_socket
-51  pascal   gethostbyaddr(ptr word word) WINSOCK_gethostbyaddr
-52  pascal   gethostbyname(ptr) WINSOCK_gethostbyname
-53  pascal   getprotobyname(ptr) WINSOCK_getprotobyname
-54  pascal   getprotobynumber(word) WINSOCK_getprotobynumber
-55  pascal   getservbyname(ptr ptr) WINSOCK_getservbyname
-56  pascal   getservbyport(word ptr) WINSOCK_getservbyport
-57  pascal   gethostname(ptr word) WINSOCK_gethostname
+16  pascal16 recv(word ptr word word) WINSOCK_recv16
+17  pascal16 recvfrom(word ptr word word ptr ptr) WINSOCK_recvfrom16
+18  pascal16 select(word ptr ptr ptr ptr) WINSOCK_select16
+19  pascal16 send(word ptr word word) WINSOCK_send16
+20  pascal16 sendto(word ptr word word ptr word) WINSOCK_sendto16
+21  pascal16 setsockopt(word word word ptr word) WINSOCK_setsockopt16
+22  pascal16 shutdown(word word) WINSOCK_shutdown16
+23  pascal16 socket(word word word) WINSOCK_socket16
+51  pascal   gethostbyaddr(ptr word word) WINSOCK_gethostbyaddr16
+52  pascal   gethostbyname(ptr) WINSOCK_gethostbyname16
+53  pascal   getprotobyname(ptr) WINSOCK_getprotobyname16
+54  pascal   getprotobynumber(word) WINSOCK_getprotobynumber16
+55  pascal   getservbyname(ptr ptr) WINSOCK_getservbyname16
+56  pascal   getservbyport(word ptr) WINSOCK_getservbyport16
+57  pascal   gethostname(ptr word) WINSOCK_gethostname16
 101 pascal16 WSAAsyncSelect(word word word long) WSAAsyncSelect
 102 pascal16 WSAAsyncGetHostByAddr(word word ptr word word segptr word)
              WSAAsyncGetHostByAddr
@@ -53,9 +53,9 @@
 109 pascal16 WSASetBlockingHook(segptr) WSASetBlockingHook16
 110 pascal16 WSAUnhookBlockingHook() WSAUnhookBlockingHook16
 111 pascal16 WSAGetLastError() WSAGetLastError
-112 pascal   WSASetLastError(word) WSASetLastError
+112 pascal   WSASetLastError(word) WSASetLastError16
 113 pascal16 WSACancelBlockingCall() WSACancelBlockingCall
 114 pascal16 WSAIsBlocking() WSAIsBlocking
-115 pascal   WSAStartup(word ptr) WSAStartup
+115 pascal   WSAStartup(word ptr) WSAStartup16
 116 pascal   WSACleanup() WSACleanup
-151 pascal16 __WSAFDIsSet(word ptr) __WSAFDIsSet
+151 pascal16 __WSAFDIsSet(word ptr) __WSAFDIsSet16
diff --git a/if1632/winspool.spec b/if1632/winspool.spec
index 12e16f6..ccc6dc7 100644
--- a/if1632/winspool.spec
+++ b/if1632/winspool.spec
@@ -52,11 +52,11 @@
 048 stub DeletePrinterIC
 049 stub DevQueryPrint
 050 stub DeviceCapabilities
-051 stub DeviceCapabilitiesA
+051 stdcall DeviceCapabilitiesA(ptr ptr long ptr ptr) DeviceCapabilities32A
 052 stub DeviceCapabilitiesW
 053 stub DeviceMode
 054 stub DocumentEvent
-055 stub DocumentPropertiesA
+055 stdcall DocumentPropertiesA(long long ptr ptr ptr long) DocumentProperties32A
 056 stub DocumentPropertiesW
 057 stub EXTDEVICEMODE
 058 stub EndDocPrinter
diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec
index 2172fe7..48c1b4b 100644
--- a/if1632/wprocs.spec
+++ b/if1632/wprocs.spec
@@ -1,7 +1,6 @@
 name	wprocs
 type	win16
 
-1  pascal WINPROC_CallProc16To32A(word word word long long) WINPROC_CallProc16To32A
 10 pascal MDIClientWndProc(word word word long) MDIClientWndProc
 14 pascal FileOpenDlgProc(word word word long) FileOpenDlgProc
 15 pascal FileSaveDlgProc(word word word long) FileSaveDlgProc
@@ -11,7 +10,7 @@
 19 pascal PrintSetupDlgProc(word word word long) PrintSetupDlgProc
 20 pascal PrintDlgProc(word word word long) PrintDlgProc
 24 pascal16 TASK_Reschedule() TASK_Reschedule
-27 pascal EntryAddrProc(word word) MODULE_GetEntryPoint
+27 pascal EntryAddrProc(word word) EntryAddrProc
 28 pascal MyAlloc(word word word) MODULE_AllocateSegment
 30 pascal FormatCharDlgProc(word word word long) FormatCharDlgProc
  
@@ -279,6 +278,7 @@
 #
 #400+VXD_ID register <VxD handler>() <VxD handler>
 #
+405 register VXD_Timer() VXD_Timer
 414 register VXD_Comm() VXD_Comm
 #415 register VXD_Printer() VXD_Printer
 423 register VXD_Shell() VXD_Shell
diff --git a/if1632/wsock32.spec b/if1632/wsock32.spec
index 36893c2..1b36974 100644
--- a/if1632/wsock32.spec
+++ b/if1632/wsock32.spec
@@ -2,36 +2,36 @@
 type	win32
 base	0
 
-001 stdcall accept(long ptr ptr) WINSOCK_accept
-002 stdcall bind(long ptr long) WINSOCK_bind
-003 stdcall closesocket(long) WINSOCK_closesocket
-004 stdcall connect(long ptr long) WINSOCK_connect
-005 stub getpeername
-006 stdcall getsockname(long ptr ptr) WINSOCK_getsockname
-007 stub getsockopt
+001 stdcall accept(long ptr ptr) WINSOCK_accept32
+002 stdcall bind(long ptr long) WINSOCK_bind32
+003 stdcall closesocket(long) WINSOCK_closesocket32
+004 stdcall connect(long ptr long) WINSOCK_connect32
+005 stdcall getpeername(long ptr ptr) WINSOCK_getpeername32
+006 stdcall getsockname(long ptr ptr) WINSOCK_getsockname32
+007 stdcall getsockopt(long long long ptr ptr) WINSOCK_getsockopt32
 008 stdcall htonl(long) WINSOCK_htonl
 009 stdcall htons(long) WINSOCK_htons
 010 stdcall inet_addr(ptr) inet_addr
 011 stdcall inet_ntoa(ptr) inet_ntoa
-012 stub ioctlsocket
-013 stub listen
+012 stdcall ioctlsocket(long long ptr) WINSOCK_ioctlsocket32
+013 stdcall listen(long long) WINSOCK_listen32
 014 stdcall ntohl(long) WINSOCK_ntohl
 015 stdcall ntohs(long) WINSOCK_ntohs
-016 stub recv
-017 stub recvfrom
-018 stub select
-019 stub send
-020 stub sendto
-021 stub setsockopt
-022 stub shutdown
-023 stdcall socket(long long long) WINSOCK_socket
-051 stdcall gethostbyaddr(ptr long long) WINSOCK_gethostbyaddr
-052 stdcall gethostbyname(ptr) gethostbyname
-053 stub getprotobyname
-054 stub getprotobynumber
-055 stdcall getservbyname(ptr ptr) getservbyname
-056 stub getservbyport
-057 stdcall gethostname(ptr long) gethostname
+016 stdcall recv(long ptr long long) WINSOCK_recv32
+017 stdcall recvfrom(long ptr long long ptr ptr) WINSOCK_recvfrom32
+018 stdcall select(long ptr ptr ptr ptr) WINSOCK_select32
+019 stdcall send(long ptr long long) WINSOCK_send32
+020 stdcall sendto(long ptr long long ptr long) WINSOCK_sendto32
+021 stdcall setsockopt(long long long ptr long) WINSOCK_setsockopt32
+022 stdcall shutdown(long long) WINSOCK_shutdown32
+023 stdcall socket(long long long) WINSOCK_socket32
+051 stdcall gethostbyaddr(ptr long long) WINSOCK_gethostbyaddr32
+052 stdcall gethostbyname(ptr) WINSOCK_gethostbyname32
+053 stdcall getprotobyname(ptr) WINSOCK_getprotobyname32
+054 stdcall getprotobynumber(long) WINSOCK_getprotobynumber32
+055 stdcall getservbyname(ptr ptr) WINSOCK_getservbyname32
+056 stdcall getservbyport(long ptr) WINSOCK_getservbyport32
+057 stdcall gethostname(ptr long) WINSOCK_gethostname32
 101 stub WSAAsyncSelect
 102 stub WSAAsyncGetHostByAddr
 103 stub WSAAsyncGetHostByName
@@ -42,13 +42,13 @@
 108 stub WSACancelAsyncRequest
 109 stdcall WSASetBlockingHook(ptr) WSASetBlockingHook32
 110 stdcall WSAUnhookBlockingHook() WSAUnhookBlockingHook32
-111 stub WSAGetLastError
-112 stub WSASetLastError
-113 stub WSACancelBlockingCall
-114 stub WSAIsBlocking
-115 stdcall WSAStartup(long ptr) WSAStartup
+111 stdcall WSAGetLastError() WSAGetLastError
+112 stdcall WSASetLastError(long) WSASetLastError32
+113 stdcall WSACancelBlockingCall() WSACancelBlockingCall
+114 stdcall WSAIsBlocking() WSAIsBlocking
+115 stdcall WSAStartup(long ptr) WSAStartup32
 116 stdcall WSACleanup() WSACleanup
-151 stub __WSAFDIsSet
+151 stdcall __WSAFDIsSet(long ptr) __WSAFDIsSet32
 #500 stub WEP
 # applications *should* 'degrade gracefully if these are not present
 # ... as it is, they don't
diff --git a/include/bitmap.h b/include/bitmap.h
index b6c6545..6ec1ad0 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -53,6 +53,7 @@
 extern INT16 BITMAP_GetObject16( BITMAPOBJ * bmp, INT16 count, LPVOID buffer );
 extern INT32 BITMAP_GetObject32( BITMAPOBJ * bmp, INT32 count, LPVOID buffer );
 extern BOOL32 BITMAP_DeleteObject( HBITMAP16 hbitmap, BITMAPOBJ * bitmap );
+extern XImage *BITMAP_GetXImage( const BITMAPOBJ *bmp );
 
   /* objects/dib.c */
 extern int DIB_GetDIBWidthBytes( int width, int depth );
diff --git a/include/button.h b/include/button.h
index b0c7a1f..64c1c08 100644
--- a/include/button.h
+++ b/include/button.h
@@ -28,7 +28,7 @@
 
 #define BUTTON_STATE(hwnd)     ((WIN_FindWndPtr(hwnd))->wExtra[0])
 
-extern LRESULT ButtonWndProc( HWND32 hWnd, UINT32 uMsg,
-                              WPARAM32 wParam, LPARAM lParam );
+extern LRESULT WINAPI ButtonWndProc( HWND32 hWnd, UINT32 uMsg,
+                                     WPARAM32 wParam, LPARAM lParam );
 
 #endif  /* __WINE_BUTTON_H */
diff --git a/include/callback.h b/include/callback.h
index c2d1020..4efb4e4 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -10,17 +10,22 @@
 #include "wintypes.h"
 #include "winnt.h"
 
-extern
-int CallTo32_LargeStack( int (*func)(), int nbargs, ... );
+extern int (*IF1632_CallLargeStack)( int (*func)(), void *arg );
+
+#define CALL_LARGE_STACK(func,arg) \
+    (IF1632_CallLargeStack ? \
+     IF1632_CallLargeStack( (int(*)())(func), (void *)(arg) ) : \
+     ((int(*)())(func))((void *)arg))
 
 /* List of the 16-bit callback functions. This list is used  */
 /* by the build program to generate the file if1632/callto16.S */
 
 #ifndef WINELIB
 
-extern void CallTo16_regs_     ( const CONTEXT *context );
+extern LONG CallTo16_regs_     ( const CONTEXT *context );
 extern WORD CallTo16_word_     ( FARPROC16 );
 extern WORD CallTo16_word_w    ( FARPROC16, WORD );
+extern LONG CallTo16_long_l    ( FARPROC16, LONG );
 extern WORD CallTo16_word_ww   ( FARPROC16, WORD, WORD );
 extern WORD CallTo16_word_wl   ( FARPROC16, WORD, LONG );
 extern WORD CallTo16_word_ll   ( FARPROC16, LONG, LONG );
@@ -67,6 +72,14 @@
 extern LONG CallTo32_3( FARPROC32, DWORD, DWORD, DWORD );
 extern LONG CallTo32_4( FARPROC32, DWORD, DWORD, DWORD, DWORD );
 extern LONG CallTo32_5( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CallTo32_6( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CallTo32_7( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CallTo32_8( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CallTo32_9( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CallTo32_10( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CallTo32_11( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CallTo32_12( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CallTo32_13( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
 
 #define CallTaskStart32( func ) \
     CallTo32_0( func )
diff --git a/include/color.h b/include/color.h
index 985c877..735e629 100644
--- a/include/color.h
+++ b/include/color.h
@@ -17,7 +17,7 @@
 extern void	  COLOR_Cleanup(void);
 extern COLORREF	  COLOR_ToLogical(int pixel);
 extern int 	  COLOR_ToPhysical( DC *dc, COLORREF color );
-extern int 	  COLOR_SetMapping( PALETTEOBJ* pal, BOOL32 mapOnly );
+extern int 	  COLOR_SetMapping( PALETTEOBJ* pal, UINT32 uStart, UINT32 uNum, BOOL32 mapOnly );
 extern BOOL32 	  COLOR_IsSolid( COLORREF color );
 extern Colormap	  COLOR_GetColormap();
 extern UINT16	  COLOR_GetSystemPaletteSize();
diff --git a/include/combo.h b/include/combo.h
index 7060bdb..a4a861e 100644
--- a/include/combo.h
+++ b/include/combo.h
@@ -18,6 +18,7 @@
 #define CBF_CAPTURE             0x0020
 #define CBF_EDIT                0x0040
 #define CBF_NORESIZE		0x0080
+#define CBF_NOTIFY		0x0100
 #define CBF_EUI                 0x8000
 
 /* Combo state struct */
diff --git a/include/comm.h b/include/comm.h
index 5f2b0af..e65df31 100644
--- a/include/comm.h
+++ b/include/comm.h
@@ -1,7 +1,7 @@
 #ifndef __WINE_COMM_H
 #define __WINE_COMM_H
 
-#define MAX_PORTS   16
+#define MAX_PORTS   9
 
 struct DosDeviceStruct {
     char *devicename;   /* /dev/cua1 */
diff --git a/include/commctrl.h b/include/commctrl.h
index a16e7bf..7e6d09d 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -7,7 +7,7 @@
 
 #include "windows.h"
 
-void       InitCommonControls(void);
+void WINAPI InitCommonControls(void);
 
 /* StatusWindow */
 
@@ -41,11 +41,61 @@
 #define CCS_BOTTOM            0x0003
 #define SBARS_SIZEGRIP        0x0100
 
-HWND32     CreateStatusWindow32A(INT32,LPCSTR,HWND32,UINT32);
-HWND32     CreateStatusWindow32W(INT32,LPCWSTR,HWND32,UINT32);
+/* UpDown control */
+
+#define UPDOWN_CLASS32A  "msctls_updown32"
+#define UPDOWN_CLASS32W  "msctls_updown32"
+#define UPDOWN_CLASS16   "msctls_updown"
+#define UPDOWN_CLASS WINELIB_NAME_AW(UPDOWN_CLASS)
+
+typedef struct tagUDACCEL
+{
+  UINT32 nSec;
+  UINT32 nInc;
+} UDACCEL;
+ 
+typedef struct tagNM_UPDOWN
+{
+    NMHDR hdr;
+    int iPos;
+    int iDelta;
+} NM_UPDOWN;
+
+#define UD_MAXVAL          0x7fff
+#define UD_MINVAL          0x8001
+
+#define UDS_WRAP           0x0001
+#define UDS_SETBUDDYINT    0x0002
+#define UDS_ALIGNRIGHT     0x0004
+#define UDS_ALIGNLEFT      0x0008
+#define UDS_AUTOBUDDY      0x0010
+#define UDS_ARROWKEYS      0x0020
+#define UDS_HORZ           0x0040
+#define UDS_NOTHOUSANDS    0x0080
+
+#define UDN_FIRST          (0U-721)
+#define UDN_DELTAPOS       (UDN_FIRST - 1)
+
+#define UDM_SETRANGE       (WM_USER+101)
+#define UDM_GETRANGE       (WM_USER+102)
+#define UDM_SETPOS         (WM_USER+103)
+#define UDM_GETPOS         (WM_USER+104)
+#define UDM_SETBUDDY       (WM_USER+105)
+#define UDM_GETBUDDY       (WM_USER+106)
+#define UDM_SETACCEL       (WM_USER+107)
+#define UDM_GETACCEL       (WM_USER+108)
+#define UDM_SETBASE        (WM_USER+109)
+#define UDM_GETBASE        (WM_USER+110)
+
+/* Functions prototypes */
+
+HWND32     WINAPI CreateStatusWindow32A(INT32,LPCSTR,HWND32,UINT32);
+HWND32     WINAPI CreateStatusWindow32W(INT32,LPCWSTR,HWND32,UINT32);
 #define    CreateStatusWindow WINELIB_NAME_AW(CreateStatusWindow)
-VOID       DrawStatusText32A(HDC32,LPRECT32,LPCSTR,UINT32);
-VOID       DrawStatusText32W(HDC32,LPRECT32,LPCWSTR,UINT32);
+HWND32     WINAPI CreateUpDownControl(DWORD,INT32,INT32,INT32,INT32,HWND32,
+                                   INT32,HINSTANCE32,HWND32,INT32,INT32,INT32);
+VOID       WINAPI DrawStatusText32A(HDC32,LPRECT32,LPCSTR,UINT32);
+VOID       WINAPI DrawStatusText32W(HDC32,LPRECT32,LPCWSTR,UINT32);
 #define    DrawStatusText WINELIB_NAME_AW(DrawStatusText)
 
 #endif  /* __WINE_COMMCTRL_H */
diff --git a/include/commdlg.h b/include/commdlg.h
index 61ac06f..01d7bb7 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -325,33 +325,32 @@
 #define CDERR_NOHOOK           0x000B
 #define CDERR_REGISTERMSGFAIL  0x000C
 
-BOOL16  ChooseColor(LPCHOOSECOLOR lpChCol);
-DWORD CommDlgExtendedError(void);
-HWND16 FindText( SEGPTR find);
-INT16 GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf);
-INT16 GetFileTitle32A(LPCSTR lpFile, LPSTR lpTitle, UINT32 cbBuf);
-INT16 GetFileTitle32W(LPCWSTR lpFile, LPWSTR lpTitle, UINT32 cbBuf);
+BOOL16  WINAPI ChooseColor(LPCHOOSECOLOR lpChCol);
+DWORD   WINAPI CommDlgExtendedError(void);
+HWND16  WINAPI FindText( SEGPTR find);
+INT16   WINAPI GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf);
+INT16   WINAPI GetFileTitle32A(LPCSTR lpFile, LPSTR lpTitle, UINT32 cbBuf);
+INT16   WINAPI 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);
+BOOL16  WINAPI GetOpenFileName16(SEGPTR ofn);
+BOOL32  WINAPI GetOpenFileName32A(LPOPENFILENAME32A ofn);
+BOOL32  WINAPI GetOpenFileName32W(LPOPENFILENAME32W ofn);
 #define GetOpenFileName WINELIB_NAME_AW(GetOpenFileName)
-BOOL16  GetSaveFileName16(SEGPTR ofn);
-BOOL32  GetSaveFileName32A(LPOPENFILENAME32A ofn);
-BOOL32  GetSaveFileName32W(LPOPENFILENAME32W ofn);
+BOOL16  WINAPI GetSaveFileName16(SEGPTR ofn);
+BOOL32  WINAPI GetSaveFileName32A(LPOPENFILENAME32A ofn);
+BOOL32  WINAPI GetSaveFileName32W(LPOPENFILENAME32W ofn);
 #define GetSaveFileName WINELIB_NAME_AW(GetSaveFileName)
-BOOL16  PrintDlg( SEGPTR print);
-HWND16 ReplaceText( SEGPTR find);
-BOOL16  ChooseFont(LPCHOOSEFONT lpChFont);
-
-LRESULT FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT FileSaveDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT ColorDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT FindTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT ReplaceTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT PrintDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT PrintSetupDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT FormatCharDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+BOOL16  WINAPI PrintDlg( SEGPTR print);
+HWND16  WINAPI ReplaceText( SEGPTR find);
+BOOL16  WINAPI ChooseFont(LPCHOOSEFONT lpChFont);
+LRESULT WINAPI FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT WINAPI FileSaveDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT WINAPI ColorDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT WINAPI FindTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT WINAPI ReplaceTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT WINAPI PrintDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT WINAPI PrintSetupDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT WINAPI FormatCharDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
 
 #ifdef __cplusplus
 }
diff --git a/include/compobj.h b/include/compobj.h
index baa348f..fb0d7ad 100644
--- a/include/compobj.h
+++ b/include/compobj.h
@@ -10,7 +10,7 @@
 
 typedef struct tagCLSID CLSID;
 
-OLESTATUS StringFromCLSID(const CLSID *id, LPSTR);
-OLESTATUS CLSIDFromString(const LPCSTR, CLSID *);
+OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR);
+OLESTATUS WINAPI CLSIDFromString(const LPCSTR, CLSID *);
 
 #endif
diff --git a/include/debug.h b/include/debug.h
index 3308a57..9cc2e9a 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -80,6 +80,7 @@
 #undef DEBUG_TIMER
 #undef DEBUG_TOOLHELP
 #undef DEBUG_TWEAK
+#undef DEBUG_UPDOWN
 #undef DEBUG_VER
 #undef DEBUG_VIRTUAL
 #undef DEBUG_VXD
@@ -164,6 +165,7 @@
 #define DEBUG_TIMER
 #define DEBUG_TOOLHELP
 #define DEBUG_TWEAK
+#define DEBUG_UPDOWN
 #define DEBUG_VER
 #define DEBUG_VIRTUAL
 #define DEBUG_VXD
@@ -546,6 +548,11 @@
 #else
     0,
 #endif
+#ifdef DEBUG_UPDOWN
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_VER
     1,
 #else
@@ -1551,8 +1558,21 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_ver if(!debug_msg_enabled[74]) ; else fprintf
-#define debugging_ver debug_msg_enabled[74]
+#define dprintf_updown if(!debug_msg_enabled[74]) ; else fprintf
+#define debugging_updown debug_msg_enabled[74]
+#else
+#ifdef DEBUG_UPDOWN
+#define dprintf_updown fprintf
+#define debugging_updown 1
+#else
+#define dprintf_updown while(0) fprintf
+#define debugging_updown 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_ver if(!debug_msg_enabled[75]) ; else fprintf
+#define debugging_ver debug_msg_enabled[75]
 #else
 #ifdef DEBUG_VER
 #define dprintf_ver fprintf
@@ -1564,8 +1584,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_virtual if(!debug_msg_enabled[75]) ; else fprintf
-#define debugging_virtual debug_msg_enabled[75]
+#define dprintf_virtual if(!debug_msg_enabled[76]) ; else fprintf
+#define debugging_virtual debug_msg_enabled[76]
 #else
 #ifdef DEBUG_VIRTUAL
 #define dprintf_virtual fprintf
@@ -1577,8 +1597,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_vxd if(!debug_msg_enabled[76]) ; else fprintf
-#define debugging_vxd debug_msg_enabled[76]
+#define dprintf_vxd if(!debug_msg_enabled[77]) ; else fprintf
+#define debugging_vxd debug_msg_enabled[77]
 #else
 #ifdef DEBUG_VXD
 #define dprintf_vxd fprintf
@@ -1590,8 +1610,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win if(!debug_msg_enabled[77]) ; else fprintf
-#define debugging_win debug_msg_enabled[77]
+#define dprintf_win if(!debug_msg_enabled[78]) ; else fprintf
+#define debugging_win debug_msg_enabled[78]
 #else
 #ifdef DEBUG_WIN
 #define dprintf_win fprintf
@@ -1603,8 +1623,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win16drv if(!debug_msg_enabled[78]) ; else fprintf
-#define debugging_win16drv debug_msg_enabled[78]
+#define dprintf_win16drv if(!debug_msg_enabled[79]) ; else fprintf
+#define debugging_win16drv debug_msg_enabled[79]
 #else
 #ifdef DEBUG_WIN16DRV
 #define dprintf_win16drv fprintf
@@ -1616,8 +1636,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win32 if(!debug_msg_enabled[79]) ; else fprintf
-#define debugging_win32 debug_msg_enabled[79]
+#define dprintf_win32 if(!debug_msg_enabled[80]) ; else fprintf
+#define debugging_win32 debug_msg_enabled[80]
 #else
 #ifdef DEBUG_WIN32
 #define dprintf_win32 fprintf
@@ -1629,8 +1649,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_winsock if(!debug_msg_enabled[80]) ; else fprintf
-#define debugging_winsock debug_msg_enabled[80]
+#define dprintf_winsock if(!debug_msg_enabled[81]) ; else fprintf
+#define debugging_winsock debug_msg_enabled[81]
 #else
 #ifdef DEBUG_WINSOCK
 #define dprintf_winsock fprintf
@@ -1719,6 +1739,7 @@
     "timer",
     "toolhelp",
     "tweak",
+    "updown",
     "ver",
     "virtual",
     "vxd",
diff --git a/include/debugger.h b/include/debugger.h
index a6670ce..bf9ee7a 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -9,7 +9,7 @@
 
 #include "winnt.h"
 #include "selectors.h"
-#include "sigcontext.h"
+#include "sig_context.h"
 #include "pe_image.h"
 
 #define STEP_FLAG 0x100 /* single step flag */
diff --git a/include/desktop.h b/include/desktop.h
index 129f96e..7e8085f 100644
--- a/include/desktop.h
+++ b/include/desktop.h
@@ -18,7 +18,7 @@
 } DESKTOPINFO;
 
 extern BOOL32 DESKTOP_SetPattern( LPCSTR pattern );
-extern LRESULT DesktopWndProc( HWND32 hwnd, UINT32 message,
-                               WPARAM32 wParam, LPARAM lParam );
+extern LRESULT WINAPI DesktopWndProc( HWND32 hwnd, UINT32 message,
+                                      WPARAM32 wParam, LPARAM lParam );
 
 #endif  /* __WINE_DESKTOP_H */
diff --git a/include/driver.h b/include/driver.h
index 3eb7b7d..54fed12 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -57,14 +57,15 @@
     DRIVERPROC16          lpDrvProc;
 } DRIVERITEM, *LPDRIVERITEM;
 
-LRESULT DefDriverProc(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg, 
-                      LPARAM dwParam1, LPARAM dwParam2);
-HDRVR16 OpenDriver(LPSTR szDriverName, LPSTR szSectionName, LPARAM lParam2);
-LRESULT CloseDriver(HDRVR16 hDriver, LPARAM lParam1, LPARAM lParam2);
-LRESULT SendDriverMessage( HDRVR16 hDriver, UINT16 message, LPARAM lParam1,
-                           LPARAM lParam2 );
-HMODULE16 GetDriverModuleHandle(HDRVR16 hDriver);
-HDRVR16 GetNextDriver(HDRVR16, DWORD);
-BOOL16 GetDriverInfo(HDRVR16, DRIVERINFOSTRUCT16 *);
+LRESULT WINAPI DefDriverProc(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg, 
+                             LPARAM dwParam1, LPARAM dwParam2);
+HDRVR16 WINAPI OpenDriver(LPSTR szDriverName, LPSTR szSectionName,
+                          LPARAM lParam2);
+LRESULT WINAPI CloseDriver(HDRVR16 hDriver, LPARAM lParam1, LPARAM lParam2);
+LRESULT WINAPI SendDriverMessage( HDRVR16 hDriver, UINT16 message,
+                                  LPARAM lParam1, LPARAM lParam2 );
+HMODULE16 WINAPI GetDriverModuleHandle(HDRVR16 hDriver);
+HDRVR16 WINAPI GetNextDriver(HDRVR16, DWORD);
+BOOL16 WINAPI GetDriverInfo(HDRVR16, DRIVERINFOSTRUCT16 *);
 
 #endif  /* __WINE_DRIVER_H */
diff --git a/include/except.h b/include/except.h
index d55146b..8028060 100644
--- a/include/except.h
+++ b/include/except.h
@@ -15,7 +15,7 @@
 /* forward definition */
 struct __EXCEPTION_FRAME;
 
-typedef DWORD ( *PEXCEPTION_HANDLER)( PEXCEPTION_RECORD          pexcrec,
+typedef DWORD (CALLBACK *PEXCEPTION_HANDLER)( PEXCEPTION_RECORD pexcrec,
                                       struct __EXCEPTION_FRAME  *pestframe,
                                       PCONTEXT                   pcontext,
                                       LPVOID                     pdispatcher);
@@ -36,9 +36,9 @@
  * Function definitions  
  */
  
-void RaiseException(DWORD exccode, DWORD excflags, 
-                    DWORD nargs, const LPDWORD pargs,
-                    PCONTEXT pcontext /* Wine additional parameter */ ); 
+void WINAPI RaiseException(DWORD exccode, DWORD excflags, 
+                           DWORD nargs, const LPDWORD pargs,
+                           PCONTEXT pcontext /* Wine additional parameter */); 
                         
 /*
  *  this undocumented function is called when an exception
@@ -54,10 +54,10 @@
  *  context.   
  */
 
-void RtlUnwind( PEXCEPTION_FRAME pestframe,
-                LPVOID unusedEIP,
-                PEXCEPTION_RECORD pexcrec,
-                DWORD contextEAX,
-                PCONTEXT pcontext /* Wine additional parameter */ );
+void WINAPI RtlUnwind( PEXCEPTION_FRAME pestframe,
+                       LPVOID unusedEIP,
+                       PEXCEPTION_RECORD pexcrec,
+                       DWORD contextEAX,
+                       PCONTEXT pcontext /* Wine additional parameter */ );
 
 #endif  /* __WINE_EXCEPT_H */
diff --git a/include/gdi.h b/include/gdi.h
index 42d66cb..817fdf7 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -273,14 +273,21 @@
 
 #define GDI_HEAP_ALLOC(size) \
             LOCAL_Alloc( GDI_HeapSel, LMEM_FIXED, (size) )
+#define GDI_HEAP_ALLOC_MOVEABLE(size) \
+            LOCAL_Alloc( GDI_HeapSel, LMEM_MOVEABLE, (size) )
 #define GDI_HEAP_REALLOC(handle,size) \
             LOCAL_ReAlloc( GDI_HeapSel, (handle), (size), LMEM_FIXED )
 #define GDI_HEAP_FREE(handle) \
             LOCAL_Free( GDI_HeapSel, (handle) )
-#define GDI_HEAP_LIN_ADDR(handle)  \
-         ((handle) ? PTR_SEG_OFF_TO_LIN(GDI_HeapSel, (handle)) : NULL)
-#define GDI_HEAP_SEG_ADDR(handle)  \
-         ((handle) ? PTR_SEG_OFF_TO_SEGPTR(GDI_HeapSel, (handle)) : (SEGPTR)0)
+
+#define GDI_HEAP_LOCK(handle) \
+            LOCAL_Lock( GDI_HeapSel, (handle) )
+#define GDI_HEAP_LOCK_SEGPTR(handle) \
+            LOCAL_LockSegptr( GDI_HeapSel, (handle) )
+#define GDI_HEAP_UNLOCK(handle) \
+    ((((HGDIOBJ16)(handle) >= FIRST_STOCK_HANDLE) && \
+      ((HGDIOBJ16)(handle)<=LAST_STOCK_HANDLE)) ? \
+      0 : LOCAL_Unlock( GDI_HeapSel, (handle) ))
 
 extern BOOL32 GDI_Init(void);
 extern HGDIOBJ16 GDI_AllocObject( WORD, WORD );
diff --git a/include/listbox.h b/include/listbox.h
deleted file mode 100644
index 27cee05..0000000
--- a/include/listbox.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *   Listbox definitions
- */
-
-typedef struct tagLISTSTRUCT {
-        MEASUREITEMSTRUCT16 mis;
-        UINT16            itemState;
-        RECT16          itemRect;
-	HLOCAL16	hData;
-	char            *itemText;
-	struct tagLISTSTRUCT *lpNext;
-} LISTSTRUCT, *LPLISTSTRUCT;
-
-typedef struct {
-	WORD    FirstVisible;
-	WORD    ItemsCount;
-	WORD    ItemsVisible;
-	WORD    ColumnsVisible;
-	WORD    ItemsPerColumn;
-	short   ItemFocused;
-	short   PrevFocused;
-	WORD    StdItemHeight;
-	WORD    ColumnsWidth;
-	WORD    DrawCtlType;
-        WORD    CtlID;
-	LPLISTSTRUCT lpFirst;
-	HWND16	hSelf;
-	DWORD   dwStyle;      /* added for COMBOLBOX style faking */
-	HWND16  hParent;
-	HFONT16 hFont;
-	BOOL32  bRedrawFlag;
-        BOOL32  HasStrings;
-        BOOL32  OwnerDrawn;
-	WORD    iNumStops;
-	LPINT16 TabStops;
-        BOOL32  needMeasure;
-	HGLOBAL16 HeapSel;
-/*	MDESC   *Heap; */
-} HEADLIST,*LPHEADLIST;
-
-/* shared code between listbox and combo controls */
-extern void CreateListBoxStruct(HWND16 hwnd, WORD CtlType, LONG styles, HWND16 parent);
-extern void DestroyListBoxStruct(LPHEADLIST lphl);
-
-extern void ListBoxSendNotification(LPHEADLIST lphl, WORD code);
-
-extern LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT16 uIndex);
-extern int ListMaxFirstVisible(LPHEADLIST lphl);
-extern int ListBoxScrollToFocus(LPHEADLIST lphl);
-extern int ListBoxAddString(LPHEADLIST lphl, SEGPTR itemData);
-extern int ListBoxInsertString(LPHEADLIST lphl, UINT16 uIndex, LPCSTR newstr);
-extern int ListBoxGetText(LPHEADLIST lphl, UINT16 uIndex, LPSTR OutStr);
-extern DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT16 uIndex);
-extern int ListBoxSetItemData(LPHEADLIST lphl, UINT16 uIndex, DWORD ItemData);
-extern int ListBoxDeleteString(LPHEADLIST lphl, UINT16 uIndex);
-extern int ListBoxFindString(LPHEADLIST lphl, UINT16 nFirst, SEGPTR MatchStr);
-extern int ListBoxFindStringExact(LPHEADLIST lphl, UINT16 nFirst, SEGPTR MatchStr);
-extern int ListBoxResetContent(LPHEADLIST lphl);
-extern int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex);
-extern int ListBoxSetSel(LPHEADLIST lphl, WORD wIndex, WORD state);
-extern int ListBoxGetSel(LPHEADLIST lphl, WORD wIndex);
-extern LONG ListBoxDirectory(LPHEADLIST lphl, UINT16 attrib, LPCSTR filespec);
-extern int ListBoxGetItemRect(LPHEADLIST lphl, WORD wIndex, LPRECT16 rect);
-extern int ListBoxSetItemHeight(LPHEADLIST lphl, WORD wIndex, long height);
-extern int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar);
-
-extern void ListBoxDrawItem (HWND16 hwnd, LPHEADLIST lphl, HDC16 hdc,
-			     LPLISTSTRUCT lpls, RECT16 *rect, WORD itemAction,
-			     WORD itemState);
-extern int ListBoxFindMouse(LPHEADLIST lphl, int X, int Y);
-extern void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls);
diff --git a/include/mdi.h b/include/mdi.h
index 812580c..38e5872 100644
--- a/include/mdi.h
+++ b/include/mdi.h
@@ -20,8 +20,8 @@
 
 #define WM_MDICALCCHILDSCROLL   0x10AC /* this is exactly what Windows uses */
 
-extern LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, 
-				WPARAM16 wParam, LPARAM lParam); /* mdi.c */
+extern LRESULT WINAPI MDIClientWndProc(HWND16 hwnd, UINT16 message, 
+                                       WPARAM16 wParam, LPARAM lParam);
 
 typedef struct 
 {
diff --git a/include/menu.h b/include/menu.h
index 121c091..c270b84 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -7,7 +7,6 @@
 
 extern BOOL32 MENU_Init(void);
 extern HMENU32 MENU_GetSysMenu(HWND32 hWndOwner, HMENU32 hSysPopup);
-extern void MENU_InitSysMenuPopup(HMENU32 hmenu, DWORD style, DWORD clsStyle);
 extern UINT32 MENU_GetMenuBarHeight( HWND32 hwnd, UINT32 menubarWidth,
                                      INT32 orgX, INT32 orgY );
 extern void MENU_TrackMouseMenuBar( WND *wnd, INT32 ht, POINT32 pt );
diff --git a/include/message.h b/include/message.h
index 8a59d79..ecf33c4 100644
--- a/include/message.h
+++ b/include/message.h
@@ -26,8 +26,12 @@
 extern BOOL32 TIMER_GetTimerMsg( MSG16 *msg, HWND32 hwnd,
                                  HQUEUE16 hQueue, BOOL32 remove );
 
+#define EVENT_IO_READ		0
+#define EVENT_IO_WRITE		1
+#define EVENT_IO_EXCEPT		2
+
 /* event.c */
-extern BOOL32 EVENT_WaitXEvent( BOOL32 sleep, BOOL32 peek );
+extern BOOL32 EVENT_WaitNetEvent( BOOL32 sleep, BOOL32 peek );
 extern void EVENT_Synchronize(void);
 extern void EVENT_ProcessEvent( XEvent *event );
 extern void EVENT_RegisterWindow( WND *pWnd );
diff --git a/include/mmsystem.h b/include/mmsystem.h
index 2941b4a..4735202 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -108,7 +108,7 @@
 #define CALLBACK_TASK       0x00020000l    /* dwCallback is a HTASK */
 #define CALLBACK_FUNCTION   0x00030000l    /* dwCallback is a FARPROC */
 
-typedef void (*LPDRVCALLBACK) (HDRVR16 h, UINT16 uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
+typedef void (CALLBACK *LPDRVCALLBACK) (HDRVR16 h, UINT16 uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
 
 #define MM_MICROSOFT            1       /* Microsoft Corp. */
 
@@ -129,10 +129,8 @@
 #define MM_PC_JOYSTICK          12      /* Joystick adapter */
 
 
-WORD mmsystemGetVersion(void);
-void OutputDebugStr(LPCSTR);
-
-BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags);
+WORD WINAPI mmsystemGetVersion(void);
+BOOL16 WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags);
 
 #define SND_SYNC            0x0000  /* play synchronously (default) */
 #define SND_ASYNC           0x0001  /* play asynchronously */
@@ -237,57 +235,60 @@
     WORD        wBitsPerSample;
 } PCMWAVEFORMAT, *LPPCMWAVEFORMAT;
 
-UINT16 waveOutGetNumDevs(void);
-UINT16 waveOutGetDevCaps(UINT16 uDeviceID, WAVEOUTCAPS * lpCaps,
-    UINT16 uSize);
-UINT16 waveOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume);
-UINT16 waveOutSetVolume(UINT16 uDeviceID, DWORD dwVolume);
-UINT16 waveOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
-UINT16 waveGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
-UINT16 waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
+UINT16 WINAPI waveOutGetNumDevs(void);
+UINT16 WINAPI waveOutGetDevCaps(UINT16 uDeviceID, WAVEOUTCAPS * lpCaps,
+                                UINT16 uSize);
+UINT16 WINAPI waveOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume);
+UINT16 WINAPI waveOutSetVolume(UINT16 uDeviceID, DWORD dwVolume);
+UINT16 WINAPI waveOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 WINAPI waveGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 WINAPI waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
     const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
-UINT16 waveOutClose(HWAVEOUT16 hWaveOut);
-UINT16 waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
-     WAVEHDR * lpWaveOutHdr, UINT16 uSize);
-UINT16 waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
-    WAVEHDR * lpWaveOutHdr, UINT16 uSize);
-UINT16 waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr,
-    UINT16 uSize);
-UINT16 waveOutPause(HWAVEOUT16 hWaveOut);
-UINT16 waveOutRestart(HWAVEOUT16 hWaveOut);
-UINT16 waveOutReset(HWAVEOUT16 hWaveOut);
-UINT16 waveOutBreakLoop(HWAVEOUT16 hWaveOut);
-UINT16 waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpInfo,
-    UINT16 uSize);
-UINT16 waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch);
-UINT16 waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch);
-UINT16 waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate);
-UINT16 waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate);
-UINT16 waveOutGetID(HWAVEOUT16 hWaveOut, UINT16 * lpuDeviceID);
+UINT16 WINAPI waveOutClose(HWAVEOUT16 hWaveOut);
+UINT16 WINAPI waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
+                                   WAVEHDR *lpWaveOutHdr, UINT16 uSize);
+UINT16 WINAPI waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
+                                     WAVEHDR *lpWaveOutHdr, UINT16 uSize);
+UINT16 WINAPI waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr,
+                           UINT16 uSize);
+UINT16 WINAPI waveOutPause(HWAVEOUT16 hWaveOut);
+UINT16 WINAPI waveOutRestart(HWAVEOUT16 hWaveOut);
+UINT16 WINAPI waveOutReset(HWAVEOUT16 hWaveOut);
+UINT16 WINAPI waveOutBreakLoop(HWAVEOUT16 hWaveOut);
+UINT16 WINAPI waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpInfo,
+                                 UINT16 uSize);
+UINT16 WINAPI waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch);
+UINT16 WINAPI waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch);
+UINT16 WINAPI waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate);
+UINT16 WINAPI waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate);
+UINT16 WINAPI waveOutGetID(HWAVEOUT16 hWaveOut, UINT16 * lpuDeviceID);
 
-DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 uMessage, DWORD dw1, DWORD dw2);
+DWORD WINAPI waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 uMessage, DWORD dw1,
+                            DWORD dw2);
 
-UINT16 waveInGetNumDevs(void);
-UINT16 waveInGetDevCaps(UINT16 uDeviceID, WAVEINCAPS * lpCaps,
-    UINT16 uSize);
-UINT16 waveInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
-UINT16 waveInOpen(HWAVEIN16 * lphWaveIn, UINT16 uDeviceID,
-    const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
-UINT16 waveInClose(HWAVEIN16 hWaveIn);
-UINT16 waveInPrepareHeader(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT16 uSize);
-UINT16 waveInUnprepareHeader(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT16 uSize);
-UINT16 waveInAddBuffer(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT16 uSize);
-UINT16 waveInStart(HWAVEIN16 hWaveIn);
-UINT16 waveInStop(HWAVEIN16 hWaveIn);
-UINT16 waveInReset(HWAVEIN16 hWaveIn);
-UINT16 waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpInfo,
-    UINT16 uSize);
-UINT16 waveInGetID(HWAVEIN16 hWaveIn, UINT16 * lpuDeviceID);
+UINT16 WINAPI waveInGetNumDevs(void);
+UINT16 WINAPI waveInGetDevCaps(UINT16 uDeviceID, WAVEINCAPS * lpCaps,
+                               UINT16 uSize);
+UINT16 WINAPI waveInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 WINAPI waveInOpen(HWAVEIN16 * lphWaveIn, UINT16 uDeviceID,
+                         const LPWAVEFORMAT lpFormat, DWORD dwCallback,
+                         DWORD dwInstance, DWORD dwFlags);
+UINT16 WINAPI waveInClose(HWAVEIN16 hWaveIn);
+UINT16 WINAPI waveInPrepareHeader(HWAVEIN16 hWaveIn, WAVEHDR * lpWaveInHdr,
+                                  UINT16 uSize);
+UINT16 WINAPI waveInUnprepareHeader(HWAVEIN16 hWaveIn, WAVEHDR * lpWaveInHdr,
+                                    UINT16 uSize);
+UINT16 WINAPI waveInAddBuffer(HWAVEIN16 hWaveIn, WAVEHDR * lpWaveInHdr,
+                              UINT16 uSize);
+UINT16 WINAPI waveInStart(HWAVEIN16 hWaveIn);
+UINT16 WINAPI waveInStop(HWAVEIN16 hWaveIn);
+UINT16 WINAPI waveInReset(HWAVEIN16 hWaveIn);
+UINT16 WINAPI waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpInfo,
+                                UINT16 uSize);
+UINT16 WINAPI waveInGetID(HWAVEIN16 hWaveIn, UINT16 * lpuDeviceID);
 
-DWORD waveInMessage(HWAVEIN16 hWaveIn, UINT16 uMessage, DWORD dw1, DWORD dw2);
+DWORD WINAPI waveInMessage(HWAVEIN16 hWaveIn, UINT16 uMessage, DWORD dw1,
+                           DWORD dw2);
 
 #define MIDIERR_UNPREPARED    (MIDIERR_BASE + 0)   /* header not prepared */
 #define MIDIERR_STILLPLAYING  (MIDIERR_BASE + 1)   /* still something playing */
@@ -370,51 +371,51 @@
 #define MHDR_PREPARED   0x00000002       /* set if header prepared */
 #define MHDR_INQUEUE    0x00000004       /* reserved for driver */
 
-UINT16 midiOutGetNumDevs(void);
-UINT16 midiOutGetDevCaps(UINT16 uDeviceID,
+UINT16 WINAPI midiOutGetNumDevs(void);
+UINT16 WINAPI midiOutGetDevCaps(UINT16 uDeviceID,
     MIDIOUTCAPS * lpCaps, UINT16 uSize);
-UINT16 midiOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume);
-UINT16 midiOutSetVolume(UINT16 uDeviceID, DWORD dwVolume);
-UINT16 midiOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
-UINT16 midiGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
-UINT16 midiOutOpen(HMIDIOUT16 * lphMidiOut, UINT16 uDeviceID,
+UINT16 WINAPI midiOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume);
+UINT16 WINAPI midiOutSetVolume(UINT16 uDeviceID, DWORD dwVolume);
+UINT16 WINAPI midiOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 WINAPI midiGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 WINAPI midiOutOpen(HMIDIOUT16 * lphMidiOut, UINT16 uDeviceID,
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
-UINT16 midiOutClose(HMIDIOUT16 hMidiOut);
-UINT16 midiOutPrepareHeader(HMIDIOUT16 hMidiOut,
+UINT16 WINAPI midiOutClose(HMIDIOUT16 hMidiOut);
+UINT16 WINAPI midiOutPrepareHeader(HMIDIOUT16 hMidiOut,
     MIDIHDR * lpMidiOutHdr, UINT16 uSize);
-UINT16 midiOutUnprepareHeader(HMIDIOUT16 hMidiOut,
+UINT16 WINAPI midiOutUnprepareHeader(HMIDIOUT16 hMidiOut,
     MIDIHDR * lpMidiOutHdr, UINT16 uSize);
-UINT16 midiOutShortMsg(HMIDIOUT16 hMidiOut, DWORD dwMsg);
-UINT16 midiOutLongMsg(HMIDIOUT16 hMidiOut,
+UINT16 WINAPI midiOutShortMsg(HMIDIOUT16 hMidiOut, DWORD dwMsg);
+UINT16 WINAPI midiOutLongMsg(HMIDIOUT16 hMidiOut,
     MIDIHDR * lpMidiOutHdr, UINT16 uSize);
-UINT16 midiOutReset(HMIDIOUT16 hMidiOut);
-UINT16 midiOutCachePatches(HMIDIOUT16 hMidiOut,
+UINT16 WINAPI midiOutReset(HMIDIOUT16 hMidiOut);
+UINT16 WINAPI midiOutCachePatches(HMIDIOUT16 hMidiOut,
     UINT16 uBank, WORD * lpwPatchArray, UINT16 uFlags);
-UINT16 midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut,
+UINT16 WINAPI midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut,
     UINT16 uPatch, WORD * lpwKeyArray, UINT16 uFlags);
-UINT16 midiOutGetID(HMIDIOUT16 hMidiOut, UINT16 * lpuDeviceID);
+UINT16 WINAPI midiOutGetID(HMIDIOUT16 hMidiOut, UINT16 * lpuDeviceID);
 
-DWORD midiOutMessage(HMIDIOUT16 hMidiOut, UINT16 uMessage, DWORD dw1, DWORD dw2);
+DWORD WINAPI midiOutMessage(HMIDIOUT16 hMidiOut, UINT16 uMessage, DWORD dw1, DWORD dw2);
 
-UINT16 midiInGetNumDevs(void);
-UINT16 midiInGetDevCaps(UINT16 uDeviceID,
+UINT16 WINAPI midiInGetNumDevs(void);
+UINT16 WINAPI midiInGetDevCaps(UINT16 uDeviceID,
     LPMIDIINCAPS lpCaps, UINT16 uSize);
-UINT16 midiInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
-UINT16 midiInOpen(HMIDIIN16 * lphMidiIn, UINT16 uDeviceID,
+UINT16 WINAPI midiInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 WINAPI midiInOpen(HMIDIIN16 * lphMidiIn, UINT16 uDeviceID,
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
-UINT16 midiInClose(HMIDIIN16 hMidiIn);
-UINT16 midiInPrepareHeader(HMIDIIN16 hMidiIn,
+UINT16 WINAPI midiInClose(HMIDIIN16 hMidiIn);
+UINT16 WINAPI midiInPrepareHeader(HMIDIIN16 hMidiIn,
     MIDIHDR * lpMidiInHdr, UINT16 uSize);
-UINT16 midiInUnprepareHeader(HMIDIIN16 hMidiIn,
+UINT16 WINAPI midiInUnprepareHeader(HMIDIIN16 hMidiIn,
     MIDIHDR * lpMidiInHdr, UINT16 uSize);
-UINT16 midiInAddBuffer(HMIDIIN16 hMidiIn,
+UINT16 WINAPI midiInAddBuffer(HMIDIIN16 hMidiIn,
     MIDIHDR * lpMidiInHdr, UINT16 uSize);
-UINT16 midiInStart(HMIDIIN16 hMidiIn);
-UINT16 midiInStop(HMIDIIN16 hMidiIn);
-UINT16 midiInReset(HMIDIIN16 hMidiIn);
-UINT16 midiInGetID(HMIDIIN16 hMidiIn, UINT16 * lpuDeviceID);
+UINT16 WINAPI midiInStart(HMIDIIN16 hMidiIn);
+UINT16 WINAPI midiInStop(HMIDIIN16 hMidiIn);
+UINT16 WINAPI midiInReset(HMIDIIN16 hMidiIn);
+UINT16 WINAPI midiInGetID(HMIDIIN16 hMidiIn, UINT16 * lpuDeviceID);
 
-DWORD midiInMessage(HMIDIIN16 hMidiIn, UINT16 uMessage, DWORD dw1, DWORD dw2);
+DWORD WINAPI midiInMessage(HMIDIIN16 hMidiIn, UINT16 uMessage, DWORD dw1, DWORD dw2);
 
 #define AUX_MAPPER     (-1)
 
@@ -433,12 +434,12 @@
 #define AUXCAPS_VOLUME          0x0001  /* supports volume control */
 #define AUXCAPS_LRVOLUME        0x0002  /* separate left-right volume control */
 
-UINT16 auxGetNumDevs(void);
-UINT16 auxGetDevCaps(UINT16 uDeviceID, AUXCAPS * lpCaps, UINT16 uSize);
-UINT16 auxSetVolume(UINT16 uDeviceID, DWORD dwVolume);
-UINT16 auxGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume);
+UINT16 WINAPI auxGetNumDevs(void);
+UINT16 WINAPI auxGetDevCaps(UINT16 uDeviceID, AUXCAPS * lpCaps, UINT16 uSize);
+UINT16 WINAPI auxSetVolume(UINT16 uDeviceID, DWORD dwVolume);
+UINT16 WINAPI auxGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume);
 
-DWORD auxOutMessage(UINT16 uDeviceID, UINT16 uMessage, DWORD dw1, DWORD dw2);
+DWORD WINAPI auxOutMessage(UINT16 uDeviceID, UINT16 uMessage, DWORD dw1, DWORD dw2);
 
 #define TIMERR_NOERROR        (0)                  /* no error */
 #define TIMERR_NOCANDO        (TIMERR_BASE+1)      /* request not completed */
@@ -454,14 +455,14 @@
     UINT16    wPeriodMax;     /* maximum period supported  */
 } TIMECAPS, *LPTIMECAPS;
 
-UINT16 timeGetSystemTime(MMTIME * lpTime, UINT16 uSize);
-DWORD timeGetTime(void);
-UINT16 timeSetEvent(UINT16 uDelay, UINT16 uResolution,
+UINT16 WINAPI timeGetSystemTime(MMTIME * lpTime, UINT16 uSize);
+DWORD WINAPI timeGetTime(void);
+UINT16 WINAPI timeSetEvent(UINT16 uDelay, UINT16 uResolution,
     LPTIMECALLBACK lpFunction, DWORD dwUser, UINT16 uFlags);
-UINT16 timeKillEvent(UINT16 uTimerID);
-UINT16 timeGetDevCaps(TIMECAPS * lpTimeCaps, UINT16 uSize);
-UINT16 timeBeginPeriod(UINT16 uPeriod);
-UINT16 timeEndPeriod(UINT16 uPeriod);
+UINT16 WINAPI timeKillEvent(UINT16 uTimerID);
+UINT16 WINAPI timeGetDevCaps(TIMECAPS * lpTimeCaps, UINT16 uSize);
+UINT16 WINAPI timeBeginPeriod(UINT16 uPeriod);
+UINT16 WINAPI timeEndPeriod(UINT16 uPeriod);
 
 #define JOYERR_NOERROR        (0)                  /* no error */
 #define JOYERR_PARMS          (JOYERR_BASE+5)      /* bad parameters */
@@ -502,14 +503,14 @@
     UINT16 wButtons;              /* button states */
 } JOYINFO, *LPJOYINFO;
 
-UINT16 joyGetDevCaps(UINT16 uJoyID, JOYCAPS * lpCaps, UINT16 uSize);
-UINT16 joyGetNumDevs(void);
-UINT16 joyGetPos(UINT16 uJoyID, JOYINFO * lpInfo);
-UINT16 joyGetThreshold(UINT16 uJoyID, UINT16 * lpuThreshold);
-UINT16 joyReleaseCapture(UINT16 uJoyID);
-UINT16 joySetCapture(HWND16 hwnd, UINT16 uJoyID, UINT16 uPeriod,
+UINT16 WINAPI joyGetDevCaps(UINT16 uJoyID, JOYCAPS * lpCaps, UINT16 uSize);
+UINT16 WINAPI joyGetNumDevs(void);
+UINT16 WINAPI joyGetPos(UINT16 uJoyID, JOYINFO * lpInfo);
+UINT16 WINAPI joyGetThreshold(UINT16 uJoyID, UINT16 * lpuThreshold);
+UINT16 WINAPI joyReleaseCapture(UINT16 uJoyID);
+UINT16 WINAPI joySetCapture(HWND16 hwnd, UINT16 uJoyID, UINT16 uPeriod,
     BOOL16 bChanged);
-UINT16 joySetThreshold(UINT16 uJoyID, UINT16 uThreshold);
+UINT16 WINAPI joySetThreshold(UINT16 uJoyID, UINT16 uThreshold);
 
 #define MMIOERR_BASE            256
 #define MMIOERR_FILENOTFOUND    (MMIOERR_BASE + 1)  /* file not found */
@@ -526,8 +527,8 @@
 #define CFSEPCHAR       '+'             /* compound file name separator char. */
 
 typedef DWORD           FOURCC;         /* a four character code */
-typedef LONG (*LPMMIOPROC)(LPSTR lpmmioinfo, UINT16 uMessage,
-            LPARAM lParam1, LPARAM lParam2);
+typedef LONG (CALLBACK *LPMMIOPROC)(LPSTR lpmmioinfo, UINT16 uMessage,
+                                    LPARAM lParam1, LPARAM lParam2);
 
 typedef struct {
         DWORD           dwFlags;        /* general status flags */
@@ -622,48 +623,49 @@
                 ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |    \
                 ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
 
-FOURCC mmioStringToFOURCC(LPCSTR sz, UINT16 uFlags);
-LPMMIOPROC mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc,
+FOURCC WINAPI mmioStringToFOURCC(LPCSTR sz, UINT16 uFlags);
+LPMMIOPROC WINAPI mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc,
     DWORD dwFlags);
-HMMIO16 mmioOpen(LPSTR szFileName, MMIOINFO * lpmmioinfo,
+HMMIO16 WINAPI mmioOpen(LPSTR szFileName, MMIOINFO * lpmmioinfo,
     DWORD dwOpenFlags);
 
-UINT16 mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
+UINT16 WINAPI mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
      MMIOINFO * lpmmioinfo, DWORD dwRenameFlags);
 
-UINT16 mmioClose(HMMIO16 hmmio, UINT16 uFlags);
-LONG mmioRead(HMMIO16 hmmio, HPSTR pch, LONG cch);
-LONG mmioWrite(HMMIO16 hmmio, HPCSTR pch, LONG cch);
-LONG mmioSeek(HMMIO16 hmmio, LONG lOffset, int iOrigin);
-UINT16 mmioGetInfo(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags);
-UINT16 mmioSetInfo(HMMIO16 hmmio, const MMIOINFO * lpmmioinfo, UINT16 uFlags);
-UINT16 mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer, LONG cchBuffer,
+UINT16 WINAPI mmioClose(HMMIO16 hmmio, UINT16 uFlags);
+LONG WINAPI mmioRead(HMMIO16 hmmio, HPSTR pch, LONG cch);
+LONG WINAPI mmioWrite(HMMIO16 hmmio, HPCSTR pch, LONG cch);
+LONG WINAPI mmioSeek(HMMIO16 hmmio, LONG lOffset, int iOrigin);
+UINT16 WINAPI mmioGetInfo(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags);
+UINT16 WINAPI mmioSetInfo(HMMIO16 hmmio, const MMIOINFO * lpmmioinfo, UINT16 uFlags);
+UINT16 WINAPI mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer, LONG cchBuffer,
     UINT16 uFlags);
-UINT16 mmioFlush(HMMIO16 hmmio, UINT16 uFlags);
-UINT16 mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags);
-LONG mmioSendMessage(HMMIO16 hmmio, UINT16 uMessage,
+UINT16 WINAPI mmioFlush(HMMIO16 hmmio, UINT16 uFlags);
+UINT16 WINAPI mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags);
+LONG WINAPI mmioSendMessage(HMMIO16 hmmio, UINT16 uMessage,
     LPARAM lParam1, LPARAM lParam2);
-UINT16 mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
+UINT16 WINAPI mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
     const MMCKINFO * lpckParent, UINT16 uFlags);
-UINT16 mmioAscend(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags);
-UINT16 mmioCreateChunk(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags);
+UINT16 WINAPI mmioAscend(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags);
+UINT16 WINAPI mmioCreateChunk(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags);
 
-typedef UINT16 (*YIELDPROC) (UINT16 uDeviceID, DWORD dwYieldData);
+typedef UINT16 (CALLBACK *YIELDPROC) (UINT16 uDeviceID, DWORD dwYieldData);
 
-DWORD mciSendCommand (UINT16 uDeviceID, UINT16 uMessage,
-    DWORD dwParam1, DWORD dwParam2);
-DWORD mciSendString (LPCSTR lpstrCommand,
-    LPSTR lpstrReturnString, UINT16 uReturnLength, HWND16 hwndCallback);
-UINT16 mciGetDeviceID (LPCSTR lpstrName);
-UINT16 mciGetDeviceIDFromElementID (DWORD dwElementID,
-    LPCSTR lpstrType);
-BOOL16 mciGetErrorString (DWORD wError, LPSTR lpstrBuffer,
-    UINT16 uLength);
-BOOL16 mciSetYieldProc (UINT16 uDeviceID, YIELDPROC fpYieldProc,
-    DWORD dwYieldData);
+DWORD WINAPI mciSendCommand (UINT16 uDeviceID, UINT16 uMessage,
+                             DWORD dwParam1, DWORD dwParam2);
+DWORD WINAPI mciSendString (LPCSTR lpstrCommand,
+                            LPSTR lpstrReturnString, UINT16 uReturnLength,
+                            HWND16 hwndCallback);
+UINT16 WINAPI mciGetDeviceID (LPCSTR lpstrName);
+UINT16 WINAPI mciGetDeviceIDFromElementID (DWORD dwElementID,
+                                           LPCSTR lpstrType);
+BOOL16 WINAPI mciGetErrorString (DWORD wError, LPSTR lpstrBuffer,
+                                 UINT16 uLength);
+BOOL16 WINAPI mciSetYieldProc (UINT16 uDeviceID, YIELDPROC fpYieldProc,
+                               DWORD dwYieldData);
 
-HTASK16 mciGetCreatorTask(UINT16 uDeviceID);
-YIELDPROC mciGetYieldProc (UINT16 uDeviceID, DWORD * lpdwYieldData);
+HTASK16 WINAPI mciGetCreatorTask(UINT16 uDeviceID);
+YIELDPROC WINAPI mciGetYieldProc (UINT16 uDeviceID, DWORD * lpdwYieldData);
 
 #define MCIERR_INVALID_DEVICE_ID        (MCIERR_BASE + 1)
 #define MCIERR_UNRECOGNIZED_KEYWORD     (MCIERR_BASE + 3)
@@ -1514,14 +1516,14 @@
 									/* filled in by the driver */
 } MCI_OPEN_DRIVER_PARMS, * LPMCI_OPEN_DRIVER_PARMS;
 
-DWORD mciGetDriverData(UINT16 uDeviceID);
-BOOL16  mciSetDriverData(UINT16 uDeviceID, DWORD dwData);
-UINT16  mciDriverYield(UINT16 uDeviceID);
-BOOL16  mciDriverNotify(HWND16 hwndCallback, UINT16 uDeviceID,
-                        UINT16 uStatus);
-UINT16  mciLoadCommandResource(HINSTANCE16 hInstance,
-                               LPCSTR lpResName, UINT16 uType);
-BOOL16  mciFreeCommandResource(UINT16 uTable);
+DWORD  WINAPI mciGetDriverData(UINT16 uDeviceID);
+BOOL16 WINAPI mciSetDriverData(UINT16 uDeviceID, DWORD dwData);
+UINT16 WINAPI mciDriverYield(UINT16 uDeviceID);
+BOOL16 WINAPI mciDriverNotify(HWND16 hwndCallback, UINT16 uDeviceID,
+                              UINT16 uStatus);
+UINT16 WINAPI mciLoadCommandResource(HINSTANCE16 hInstance,
+                                     LPCSTR lpResName, UINT16 uType);
+BOOL16 WINAPI mciFreeCommandResource(UINT16 uTable);
 
 #define DCB_NULL		0x0000
 #define DCB_WINDOW		0x0001			/* dwCallback is a HWND */
@@ -1530,17 +1532,17 @@
 #define DCB_TYPEMASK	0x0007
 #define DCB_NOSWITCH	0x0008			/* don't switch stacks for callback */
 
-BOOL16 DriverCallback(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, 
-                      WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
-DWORD auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+BOOL16 WINAPI DriverCallback(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, 
+                             WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
+DWORD WINAPI auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2);
-DWORD midMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+DWORD WINAPI midMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2);
-DWORD modMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+DWORD WINAPI modMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2);
-DWORD widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+DWORD WINAPI widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2);
-DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+DWORD WINAPI wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2);
 
 #endif /* __WINE_MMSYSTEM_H */
diff --git a/include/msdos.h b/include/msdos.h
index 3eb18a6..1cc09b1 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -55,8 +55,6 @@
     DWORD  filesize;             /* 1c file size */
 } DOS_DIRENTRY_LAYOUT;
 
-#define DOSVERSION 0x1606      /* Major version in low byte: DOS 6.22 */
-#define WINDOSVER  0x0616      /* Windows reports the DOS version reversed */
 #define WINVERSION 0x0a03      /* Windows version 3.10 */
 
 #define MAX_DOS_DRIVES	26
diff --git a/include/neexe.h b/include/neexe.h
index 757b46f..ead7623 100644
--- a/include/neexe.h
+++ b/include/neexe.h
@@ -37,6 +37,7 @@
 #define	IMAGE_DOS_SIGNATURE	0x5A4D		/* MZ */
 #define	IMAGE_OS2_SIGNATURE	0x454E		/* NE */
 #define	IMAGE_OS2_SIGNATURE_LE	0x454C		/* LE */
+#define	IMAGE_OS2_SIGNATURE_LX  0x584C          /* LX */
 #define	IMAGE_VXD_SIGNATURE	0x454C		/* LE */
 #define	IMAGE_NT_SIGNATURE	0x00004550	/* PE00 */
 
diff --git a/include/ole.h b/include/ole.h
index 0692ee0..7e08b9d 100644
--- a/include/ole.h
+++ b/include/ole.h
@@ -151,8 +151,8 @@
 } OLETARGETDEVICE;
 typedef struct _OLESTREAM* LPOLESTREAM;
 typedef struct _OLESTREAMVTBL {
-	DWORD	(*Get)(LPOLESTREAM,LPSTR,DWORD);
-	DWORD	(*Put)(LPOLESTREAM,LPSTR,DWORD);
+	DWORD	(CALLBACK *Get)(LPOLESTREAM,LPSTR,DWORD);
+	DWORD	(CALLBACK *Put)(LPOLESTREAM,LPSTR,DWORD);
 } OLESTREAMVTBL;
 typedef OLESTREAMVTBL*	LPOLESTREAMVTBL;
 typedef struct _OLESTREAM {
@@ -162,15 +162,15 @@
 typedef struct _OLEOBJECT*	LPOLEOBJECT;
 typedef struct _OLECLIENT*	LPOLECLIENT;
 typedef struct _OLESERVERDOCVTBL {
-	OLESTATUS	(*Save)(LPOLESERVERDOC);
-	OLESTATUS	(*Close)(LPOLESERVERDOC);
-	OLESTATUS	(*SetHostNames)(LPOLESERVERDOC,OLE_LPCSTR,OLE_LPCSTR);
-	OLESTATUS	(*SetDocDimensions)(LPOLESERVERDOC,LPRECT16);
+	OLESTATUS	(CALLBACK *Save)(LPOLESERVERDOC);
+	OLESTATUS	(CALLBACK *Close)(LPOLESERVERDOC);
+	OLESTATUS	(CALLBACK *SetHostNames)(LPOLESERVERDOC,OLE_LPCSTR,OLE_LPCSTR);
+	OLESTATUS	(CALLBACK *SetDocDimensions)(LPOLESERVERDOC,LPRECT16);
 #undef GetObject  /* FIXME */
-	OLESTATUS	(*GetObject)(LPOLESERVERDOC,OLE_LPCSTR,LPOLEOBJECT*,LPOLECLIENT);
-	OLESTATUS	(*Release)(LPOLESERVERDOC);
-	OLESTATUS	(*SetColorScheme)(LPOLESERVERDOC,LPLOGPALETTE);
-	OLESTATUS	(*Execute)(LPOLESERVERDOC,HGLOBAL16);
+	OLESTATUS	(CALLBACK *GetObject)(LPOLESERVERDOC,OLE_LPCSTR,LPOLEOBJECT*,LPOLECLIENT);
+	OLESTATUS	(CALLBACK *Release)(LPOLESERVERDOC);
+	OLESTATUS	(CALLBACK *SetColorScheme)(LPOLESERVERDOC,LPLOGPALETTE);
+	OLESTATUS	(CALLBACK *Execute)(LPOLESERVERDOC,HGLOBAL16);
 } OLESERVERDOCVTBL;
 typedef OLESERVERDOCVTBL*	LPOLESERVERDOCVTBL;
 typedef struct _OLESERVERDOC {
@@ -180,13 +180,13 @@
 
 typedef struct _OLESERVER*	LPOLESERVER;
 typedef struct _OLESERVERVTBL {
-	OLESTATUS	(*Open)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,LPOLESERVERDOC *);
-	OLESTATUS	(*Create)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC*);
-	OLESTATUS	(*CreateFromTemplate)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC *);
-	OLESTATUS	(*Edit)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC *);
-	OLESTATUS	(*Exit)(LPOLESERVER);
-	OLESTATUS	(*Release)(LPOLESERVER); 
-	OLESTATUS	(*Execute)(LPOLESERVER); 
+	OLESTATUS	(CALLBACK *Open)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,LPOLESERVERDOC *);
+	OLESTATUS	(CALLBACK *Create)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC*);
+	OLESTATUS	(CALLBACK *CreateFromTemplate)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC *);
+	OLESTATUS	(CALLBACK *Edit)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC *);
+	OLESTATUS	(CALLBACK *Exit)(LPOLESERVER);
+	OLESTATUS	(CALLBACK *Release)(LPOLESERVER); 
+	OLESTATUS	(CALLBACK *Execute)(LPOLESERVER); 
 } OLESERVERVTBL; 
 typedef OLESERVERVTBL	*LPOLESERVERVTBL;
 typedef struct _OLESERVER {
@@ -194,7 +194,7 @@
 	/* server specific data */
 } OLESERVER;
 typedef struct _OLECLIENTVTBL {
-	int (*CallBack)(LPOLECLIENT,OLE_NOTIFICATION,LPOLEOBJECT);
+	int (CALLBACK *CallBack)(LPOLECLIENT,OLE_NOTIFICATION,LPOLEOBJECT);
 } OLECLIENTVTBL;
 typedef OLECLIENTVTBL	*LPOLECLIENTVTBL;
 
@@ -204,44 +204,44 @@
 } OLECLIENT;
 
 typedef struct _OLEOBJECTVTBL {
-        void *  	(*QueryProtocol)(LPOLEOBJECT,OLE_LPCSTR);
-	OLESTATUS	(*Release)(LPOLEOBJECT);
-	OLESTATUS	(*Show)(LPOLEOBJECT,BOOL16);
-	OLESTATUS	(*DoVerb)(LPOLEOBJECT,UINT16,BOOL16,BOOL16);
-	OLESTATUS	(*GetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE16 *);
-	OLESTATUS	(*SetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE16);
-	OLESTATUS	(*SetTargetDevice)(LPOLEOBJECT,HGLOBAL16);
-	OLESTATUS	(*SetBounds)(LPOLEOBJECT,LPRECT16);
-	OLESTATUS	(*EnumFormats)(LPOLEOBJECT,OLECLIPFORMAT);
-	OLESTATUS	(*SetColorScheme)(LPOLEOBJECT,LPLOGPALETTE);
-	OLESTATUS	(*Delete)(LPOLEOBJECT);
-	OLESTATUS	(*SetHostNames)(LPOLEOBJECT,OLE_LPCSTR,OLE_LPCSTR);
-	OLESTATUS	(*SaveToStream)(LPOLEOBJECT,LPOLESTREAM);
-	OLESTATUS	(*Clone)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT *);
-	OLESTATUS	(*CopyFromLink)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT *);
-	OLESTATUS	(*Equal)(LPOLEOBJECT,LPOLEOBJECT);
-	OLESTATUS	(*CopyToClipBoard)(LPOLEOBJECT);
-	OLESTATUS	(*Draw)(LPOLEOBJECT,HDC16,LPRECT16,LPRECT16,HDC16);
-	OLESTATUS	(*Activate)(LPOLEOBJECT,UINT16,BOOL16,BOOL16,HWND16,LPRECT16);
-	OLESTATUS	(*Execute)(LPOLEOBJECT,HGLOBAL16,UINT16);
-	OLESTATUS	(*Close)(LPOLEOBJECT);
-	OLESTATUS	(*Update)(LPOLEOBJECT);
-	OLESTATUS	(*Reconnect)(LPOLEOBJECT);
-	OLESTATUS	(*ObjectConvert)(LPOLEOBJECT,OLE_LPCSTR,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*);
-	OLESTATUS	(*GetLinkUpdateOptions)(LPOLEOBJECT,LPOLEOPT_UPDATE);
-	OLESTATUS	(*SetLinkUpdateOptions)(LPOLEOBJECT,OLEOPT_UPDATE);
-	OLESTATUS	(*Rename)(LPOLEOBJECT,OLE_LPCSTR);
-	OLESTATUS	(*QueryName)(LPOLEOBJECT,LPSTR,LPUINT16);
-	OLESTATUS	(*QueryType)(LPOLEOBJECT,LPLONG);
-	OLESTATUS	(*QueryBounds)(LPOLEOBJECT,LPRECT16);
-	OLESTATUS	(*QuerySize)(LPOLEOBJECT,LPDWORD);
-	OLESTATUS	(*QueryOpen)(LPOLEOBJECT);
-	OLESTATUS	(*QueryOutOfDate)(LPOLEOBJECT);
-	OLESTATUS	(*QueryReleaseStatus)(LPOLEOBJECT);
-	OLESTATUS	(*QueryReleaseError)(LPOLEOBJECT);
-	OLE_RELEASE_METHOD (*QueryReleaseMethod)(LPOLEOBJECT);
-	OLESTATUS	(*RequestData)(LPOLEOBJECT,OLECLIPFORMAT);
-	OLESTATUS	(*ObjectLong)(LPOLEOBJECT,UINT16,LPLONG);
+        void *  	(CALLBACK *QueryProtocol)(LPOLEOBJECT,OLE_LPCSTR);
+	OLESTATUS	(CALLBACK *Release)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *Show)(LPOLEOBJECT,BOOL16);
+	OLESTATUS	(CALLBACK *DoVerb)(LPOLEOBJECT,UINT16,BOOL16,BOOL16);
+	OLESTATUS	(CALLBACK *GetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE16 *);
+	OLESTATUS	(CALLBACK *SetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE16);
+	OLESTATUS	(CALLBACK *SetTargetDevice)(LPOLEOBJECT,HGLOBAL16);
+	OLESTATUS	(CALLBACK *SetBounds)(LPOLEOBJECT,LPRECT16);
+	OLESTATUS	(CALLBACK *EnumFormats)(LPOLEOBJECT,OLECLIPFORMAT);
+	OLESTATUS	(CALLBACK *SetColorScheme)(LPOLEOBJECT,LPLOGPALETTE);
+	OLESTATUS	(CALLBACK *Delete)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *SetHostNames)(LPOLEOBJECT,OLE_LPCSTR,OLE_LPCSTR);
+	OLESTATUS	(CALLBACK *SaveToStream)(LPOLEOBJECT,LPOLESTREAM);
+	OLESTATUS	(CALLBACK *Clone)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT *);
+	OLESTATUS	(CALLBACK *CopyFromLink)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT *);
+	OLESTATUS	(CALLBACK *Equal)(LPOLEOBJECT,LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *CopyToClipBoard)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *Draw)(LPOLEOBJECT,HDC16,LPRECT16,LPRECT16,HDC16);
+	OLESTATUS	(CALLBACK *Activate)(LPOLEOBJECT,UINT16,BOOL16,BOOL16,HWND16,LPRECT16);
+	OLESTATUS	(CALLBACK *Execute)(LPOLEOBJECT,HGLOBAL16,UINT16);
+	OLESTATUS	(CALLBACK *Close)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *Update)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *Reconnect)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *ObjectConvert)(LPOLEOBJECT,OLE_LPCSTR,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*);
+	OLESTATUS	(CALLBACK *GetLinkUpdateOptions)(LPOLEOBJECT,LPOLEOPT_UPDATE);
+	OLESTATUS	(CALLBACK *SetLinkUpdateOptions)(LPOLEOBJECT,OLEOPT_UPDATE);
+	OLESTATUS	(CALLBACK *Rename)(LPOLEOBJECT,OLE_LPCSTR);
+	OLESTATUS	(CALLBACK *QueryName)(LPOLEOBJECT,LPSTR,LPUINT16);
+	OLESTATUS	(CALLBACK *QueryType)(LPOLEOBJECT,LPLONG);
+	OLESTATUS	(CALLBACK *QueryBounds)(LPOLEOBJECT,LPRECT16);
+	OLESTATUS	(CALLBACK *QuerySize)(LPOLEOBJECT,LPDWORD);
+	OLESTATUS	(CALLBACK *QueryOpen)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *QueryOutOfDate)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *QueryReleaseStatus)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *QueryReleaseError)(LPOLEOBJECT);
+	OLE_RELEASE_METHOD (CALLBACK *QueryReleaseMethod)(LPOLEOBJECT);
+	OLESTATUS	(CALLBACK *RequestData)(LPOLEOBJECT,OLECLIPFORMAT);
+	OLESTATUS	(CALLBACK *ObjectLong)(LPOLEOBJECT,UINT16,LPLONG);
 } OLEOBJECTVTBL;
 typedef OLEOBJECTVTBL*	LPOLEOBJECTVTBL;
 
@@ -250,13 +250,13 @@
 } OLEOBJECT;
 
 
-OLESTATUS OleRegisterServer(LPCSTR,LPOLESERVER,LHSERVER *,HINSTANCE16,OLE_SERVER_USE);
-OLESTATUS OleUnblockServer(LHSERVER,BOOL16 *);
-OLESTATUS OleRegisterServerDoc(LHSERVER,LPCSTR,LPOLESERVERDOC,LHSERVERDOC *);
-OLESTATUS OleRegisterClientDoc(LPCSTR,LPCSTR,LONG,LHCLIENTDOC *);
-OLESTATUS OleRenameClientDoc(LHCLIENTDOC,LPCSTR);
-OLESTATUS OleRevokeServerDoc(LHSERVERDOC);
-OLESTATUS OleRevokeClientDoc(LHCLIENTDOC);
-OLESTATUS OleRevokeServer(LHSERVER);
+OLESTATUS WINAPI OleRegisterServer(LPCSTR,LPOLESERVER,LHSERVER *,HINSTANCE16,OLE_SERVER_USE);
+OLESTATUS WINAPI OleUnblockServer(LHSERVER,BOOL16 *);
+OLESTATUS WINAPI OleRegisterServerDoc(LHSERVER,LPCSTR,LPOLESERVERDOC,LHSERVERDOC *);
+OLESTATUS WINAPI OleRegisterClientDoc(LPCSTR,LPCSTR,LONG,LHCLIENTDOC *);
+OLESTATUS WINAPI OleRenameClientDoc(LHCLIENTDOC,LPCSTR);
+OLESTATUS WINAPI OleRevokeServerDoc(LHSERVERDOC);
+OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC);
+OLESTATUS WINAPI OleRevokeServer(LHSERVER);
 
 #endif  /* __WINE_OLE_H */
diff --git a/include/peexe.h b/include/peexe.h
index c716f61..bc13148 100644
--- a/include/peexe.h
+++ b/include/peexe.h
@@ -97,6 +97,10 @@
 	IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
 } IMAGE_OPTIONAL_HEADER,*LPIMAGE_OPTIONAL_HEADER;
 
+/* Possible Magic values */
+#define IMAGE_NT_OPTIONAL_HDR_MAGIC        0x10b
+#define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
+
 /* These are indexes into the DataDirectory array */
 #define IMAGE_FILE_EXPORT_DIRECTORY		0
 #define IMAGE_FILE_IMPORT_DIRECTORY		1
diff --git a/include/scroll.h b/include/scroll.h
index 7090245..0a70a6c 100644
--- a/include/scroll.h
+++ b/include/scroll.h
@@ -19,8 +19,8 @@
     UINT32  flags;    /* EnableScrollBar flags */
 } SCROLLBAR_INFO;
 
-extern LRESULT ScrollBarWndProc( HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam,
-                                 LPARAM lParam );
+extern LRESULT WINAPI ScrollBarWndProc( HWND32 hwnd, UINT32 uMsg,
+                                        WPARAM32 wParam, LPARAM lParam );
 extern void SCROLL_DrawScrollBar( HWND32 hwnd, HDC32 hdc, INT32 nBar,
                                   BOOL32 arrows );
 extern void SCROLL_HandleScrollEvent( HWND32 hwnd, INT32 nBar,
diff --git a/include/shell.h b/include/shell.h
index daebe80..947ec4d 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -65,10 +65,9 @@
 #define SHGFI_SHELLICONSIZE     0x000000004     /* get shell size icon */
 #define SHGFI_PIDL              0x000000008     /* pszPath is a pidl */
 #define SHGFI_USEFILEATTRIBUTES 0x000000010     /* use passed dwFileAttribute */
-
-DWORD SHGetFileInfo32A(LPCSTR,DWORD,SHFILEINFO32A*,UINT32,UINT32);
-DWORD SHGetFileInfo32W(LPCWSTR,DWORD,SHFILEINFO32W*,UINT32,UINT32);
-#define SHGetFileInfo WINELIB_NAME_AW(SHGetFileInfo)
+DWORD    WINAPI SHGetFileInfo32A(LPCSTR,DWORD,SHFILEINFO32A*,UINT32,UINT32);
+DWORD    WINAPI SHGetFileInfo32W(LPCWSTR,DWORD,SHFILEINFO32W*,UINT32,UINT32);
+#define  SHGetFileInfo WINELIB_NAME_AW(SHGetFileInfo)
 
 #define SE_ERR_SHARE            26
 #define SE_ERR_ASSOCINCOMPLETE  27
@@ -77,6 +76,4 @@
 #define SE_ERR_DDEBUSY          30
 #define SE_ERR_NOASSOC          31
 
-LRESULT AboutDlgProc(HWND32 hWnd,UINT32 msg,WPARAM16 wParam,LPARAM lParam);
-
 #endif  /* __WINE_SHELL_H */
diff --git a/include/sigcontext.h b/include/sig_context.h
similarity index 98%
rename from include/sigcontext.h
rename to include/sig_context.h
index d47b836..b971b97 100644
--- a/include/sigcontext.h
+++ b/include/sig_context.h
@@ -4,8 +4,8 @@
  * Copyright 1995 Alexandre Julliard
  */
 
-#ifndef __WINE_SIGCONTEXT_H
-#define __WINE_SIGCONTEXT_H
+#ifndef __WINE_SIG_CONTEXT_H
+#define __WINE_SIG_CONTEXT_H
 
 #ifdef WINELIB
 #error This file must not be used in Winelib
@@ -202,4 +202,4 @@
                             
 #define FL_sig(context)      (*(WORD*)&EFL_sig(context))
 
-#endif /* __WINE_SIGCONTEXT_H */
+#endif /* __WINE_SIG_CONTEXT_H */
diff --git a/include/static.h b/include/static.h
index 355359a..f29dd7b 100644
--- a/include/static.h
+++ b/include/static.h
@@ -17,7 +17,7 @@
     HICON16  hIcon;   /* Icon handle for SS_ICON controls */ 
 } STATICINFO;
 
-extern LRESULT StaticWndProc( HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam,
-                              LPARAM lParam );
+extern LRESULT WINAPI StaticWndProc( HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam,
+                                     LPARAM lParam );
 
 #endif  /* __WINE_STATIC_H */
diff --git a/include/status.h b/include/status.h
index 424394f..24a2290 100644
--- a/include/status.h
+++ b/include/status.h
@@ -7,8 +7,8 @@
 #ifndef __WINE_STATUS_H
 #define __WINE_STATUS_H
 
-LRESULT StatusWindowProc( HWND32 hwnd, UINT32 msg,
-                          WPARAM32 wParam, LPARAM lParam );
+LRESULT WINAPI StatusWindowProc( HWND32 hwnd, UINT32 msg,
+                                 WPARAM32 wParam, LPARAM lParam );
 
 typedef struct
 {
diff --git a/include/stddebug.h b/include/stddebug.h
index 71b0151..819ae53 100644
--- a/include/stddebug.h
+++ b/include/stddebug.h
@@ -150,6 +150,7 @@
 #undef DEBUG_TIMER
 #undef DEBUG_TOOLHELP
 #undef DEBUG_TWEAK
+#undef DEBUG_UPDOWN
 #undef DEBUG_VER
 #undef DEBUG_VIRTUAL
 #undef DEBUG_VXD
@@ -234,6 +235,7 @@
 #define DEBUG_TIMER
 #define DEBUG_TOOLHELP
 #define DEBUG_TWEAK
+#define DEBUG_UPDOWN
 #define DEBUG_VER
 #define DEBUG_VIRTUAL
 #define DEBUG_VXD
diff --git a/include/stress.h b/include/stress.h
index 86f718c..f38857e 100644
--- a/include/stress.h
+++ b/include/stress.h
@@ -11,17 +11,17 @@
 #define EDS_CUR		2
 #define EDS_TEMP	3
 
-BOOL16	AllocGDIMem(UINT16);
-BOOL16	AllocMem(DWORD);
-BOOL16	AllocUserMem(UINT16);
-int	AllocDiskSpace(long, UINT16);
-int	AllocFileHandles(int);
-int	GetFreeFileHandles(void);
-void	FreeAllGDIMem(void);
-void	FreeAllMem(void);
-void	FreeAllUserMem(void);
-void	UnAllocDiskSpace(UINT16);
-void	UnAllocFileHandles(void);
+BOOL16	WINAPI AllocGDIMem(UINT16);
+BOOL16	WINAPI AllocMem(DWORD);
+BOOL16	WINAPI AllocUserMem(UINT16);
+int	WINAPI AllocDiskSpace(long, UINT16);
+int	WINAPI AllocFileHandles(int);
+int	WINAPI GetFreeFileHandles(void);
+void	WINAPI FreeAllGDIMem(void);
+void	WINAPI FreeAllMem(void);
+void	WINAPI FreeAllUserMem(void);
+void	WINAPI UnAllocDiskSpace(UINT16);
+void	WINAPI UnAllocFileHandles(void);
 
 #ifdef __cplusplus
 }
diff --git a/include/task.h b/include/task.h
index 62fc59e..5712979 100644
--- a/include/task.h
+++ b/include/task.h
@@ -49,8 +49,12 @@
 #define THUNK_MAGIC  ('P' | ('T' << 8))
 
 struct _THDB;
+struct _WSINFO;
 
-  /* Task database. See 'Windows Internals' p. 226 */
+  /* Task database. See 'Windows Internals' p. 226.
+   * Note that 16-bit OLE 2 libs like to read it directly 
+   * so we have to keep entry offsets as they are. 
+   */
 typedef struct
 {
     HTASK16   hNext;                      /* 00 Selector of next TDB */
@@ -82,8 +86,9 @@
     DWORD     int75 WINE_PACKED;          /* 4a int 75 (80x87 error) handler */
     DWORD     compat_flags WINE_PACKED;   /* 4e Compatibility flags */
     BYTE      unused4[2];                 /* 52 */
-    struct _THDB *thdb;                   /* 54 Pointer to thread database */
-    BYTE      unused5[8];                 /* 58 */
+    struct _THDB   *thdb;                 /* 54 Pointer to thread database */
+    struct _WSINFO *pwsi;		  /* 58 Socket control struct */
+    BYTE      unused5[4];                 /* 5B */
     HANDLE16  hPDB;                       /* 60 Selector of PDB (i.e. PSP) */
     SEGPTR    dta WINE_PACKED;            /* 62 Current DTA */
     BYTE      curdrive;                   /* 66 Current drive */
diff --git a/include/toolhelp.h b/include/toolhelp.h
index eaf30ec..8d1cd81 100644
--- a/include/toolhelp.h
+++ b/include/toolhelp.h
@@ -76,11 +76,13 @@
 /* wFlags values */
 #define GF_PDB_OWNER        0x0100      /* Low byte is KERNEL flags */
 
-BOOL16 GlobalInfo( GLOBALINFO *pInfo );
-BOOL16 GlobalFirst( GLOBALENTRY *pGlobal, WORD wFlags );
-BOOL16 GlobalNext( GLOBALENTRY *pGlobal, WORD wFlags) ;
-BOOL16 GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem );
-BOOL16 GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule, WORD wSeg );
+WORD   WINAPI GlobalHandleToSel( HGLOBAL16 handle );
+BOOL16 WINAPI GlobalInfo( GLOBALINFO *pInfo );
+BOOL16 WINAPI GlobalFirst( GLOBALENTRY *pGlobal, WORD wFlags );
+BOOL16 WINAPI GlobalNext( GLOBALENTRY *pGlobal, WORD wFlags) ;
+BOOL16 WINAPI GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem );
+BOOL16 WINAPI GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule,
+                                 WORD wSeg );
 
 /* Local heap */
 
@@ -154,9 +156,9 @@
 #define LT_USER_HANDLETABLE         32
 #define LT_USER_MAX                 LT_USER_HANDLETABLE
 
-BOOL16 LocalInfo( LOCALINFO *pLocalInfo, HGLOBAL16 handle );
-BOOL16 LocalFirst( LOCALENTRY *pLocalEntry, HGLOBAL16 handle );
-BOOL16 LocalNext( LOCALENTRY *pLocalEntry );
+BOOL16 WINAPI LocalInfo( LOCALINFO *pLocalInfo, HGLOBAL16 handle );
+BOOL16 WINAPI LocalFirst( LOCALENTRY *pLocalEntry, HGLOBAL16 handle );
+BOOL16 WINAPI LocalNext( LOCALENTRY *pLocalEntry );
 
 
 /* modules */
@@ -171,10 +173,10 @@
     HANDLE16   wNext;
 } MODULEENTRY, *LPMODULEENTRY;
 
-BOOL16 ModuleFirst(MODULEENTRY *lpModule);
-BOOL16 ModuleNext(MODULEENTRY *lpModule);
-BOOL16 ModuleFindName(MODULEENTRY *lpModule, LPCSTR lpstrName);
-BOOL16 ModuleFindHandle(MODULEENTRY *lpModule, HMODULE16 hModule);
+BOOL16 WINAPI ModuleFirst(MODULEENTRY *lpModule);
+BOOL16 WINAPI ModuleNext(MODULEENTRY *lpModule);
+BOOL16 WINAPI ModuleFindName(MODULEENTRY *lpModule, LPCSTR lpstrName);
+BOOL16 WINAPI ModuleFindHandle(MODULEENTRY *lpModule, HMODULE16 hModule);
 
 /* tasks */
 
@@ -197,12 +199,12 @@
     HANDLE16     hNext;
 } TASKENTRY, *LPTASKENTRY;
 
-BOOL16 TaskFirst(LPTASKENTRY lpTask);
-BOOL16 TaskNext(LPTASKENTRY lpTask);
-BOOL16 TaskFindHandle(LPTASKENTRY lpTask, HTASK16 hTask);
-DWORD TaskSetCSIP(HTASK16 hTask, WORD wCS, WORD wIP);
-DWORD TaskGetCSIP(HTASK16 hTask);
-BOOL16 TaskSwitch(HTASK16 hTask, DWORD dwNewCSIP);
+BOOL16 WINAPI TaskFirst(LPTASKENTRY lpTask);
+BOOL16 WINAPI TaskNext(LPTASKENTRY lpTask);
+BOOL16 WINAPI TaskFindHandle(LPTASKENTRY lpTask, HTASK16 hTask);
+DWORD  WINAPI TaskSetCSIP(HTASK16 hTask, WORD wCS, WORD wIP);
+DWORD  WINAPI TaskGetCSIP(HTASK16 hTask);
+BOOL16 WINAPI TaskSwitch(HTASK16 hTask, DWORD dwNewCSIP);
 
 /* mem info */
 
@@ -230,8 +232,8 @@
     HGLOBAL16 hGDISegment;
 } SYSHEAPINFO;
 
-BOOL16 MemManInfo(LPMEMMANINFO lpEnhMode);
-BOOL16 SystemHeapInfo( SYSHEAPINFO *pHeapInfo );
+BOOL16 WINAPI MemManInfo(LPMEMMANINFO lpEnhMode);
+BOOL16 WINAPI SystemHeapInfo( SYSHEAPINFO *pHeapInfo );
 
 /* timer info */
 
@@ -241,7 +243,7 @@
 	DWORD dwmsThisVM;
 } TIMERINFO;
 
-BOOL16 TimerCount( TIMERINFO *pTimerInfo );
+BOOL16 WINAPI TimerCount( TIMERINFO *pTimerInfo );
 
 /* Window classes */
 
@@ -253,14 +255,14 @@
     HANDLE16  wNext;
 } CLASSENTRY;
 
-BOOL16 ClassFirst( CLASSENTRY *pClassEntry );
-BOOL16 ClassNext( CLASSENTRY *pClassEntry );
+BOOL16 WINAPI ClassFirst( CLASSENTRY *pClassEntry );
+BOOL16 WINAPI ClassNext( CLASSENTRY *pClassEntry );
 
 
 /* Memory read/write */
 
-DWORD MemoryRead( WORD sel, DWORD offset, void *buffer, DWORD count );
-DWORD MemoryWrite( WORD sel, DWORD offset, void *buffer, DWORD count );
+DWORD WINAPI MemoryRead( WORD sel, DWORD offset, void *buffer, DWORD count );
+DWORD WINAPI MemoryWrite( WORD sel, DWORD offset, void *buffer, DWORD count );
 
 /* flags to NotifyRegister() */
 #define NF_NORMAL	0	/* everything except taskswitches, debugerrors,
@@ -269,7 +271,7 @@
 #define NF_TASKSWITCH	1	/* get taskswitch information */
 #define NF_RIP		2	/* get debugerrors of system */
 
-BOOL16 NotifyRegister(HTASK16 htask,FARPROC16 lpfnCallback,WORD wFlags);
+BOOL16 WINAPI NotifyRegister(HTASK16 htask,FARPROC16 lpfnCallback,WORD wFlags);
 
 #define NFY_UNKNOWN	0
 #define NFY_LOADSEG	1
diff --git a/include/updown.h b/include/updown.h
new file mode 100644
index 0000000..07b132e
--- /dev/null
+++ b/include/updown.h
@@ -0,0 +1,28 @@
+/*
+ * Up-down class extra info
+ *
+ * Copyright 1997 Dimitrie O. Paun
+ */
+
+#ifndef __WINE_UPDOWN_H
+#define __WINE_UPDOWN_H
+
+#include "windows.h"
+#include "commctrl.h"
+
+typedef struct
+{
+  UINT32      AccelCount;   /* Number of elements in AccelVect */
+  UDACCEL*    AccelVect;    /* Vector containing AccelCount elements */
+  INT32       Base;         /* Base to display nr in the buddy window */
+  INT32       CurVal;       /* Current up-down value */
+  INT32       MinVal;       /* Minimum up-down value */
+  INT32       MaxVal;       /* Maximum up-down value */
+  HWND32      Buddy;        /* Handle to the buddy window */
+  INT32       Flags;        /* Internal Flags FLAG_* */
+} UPDOWN_INFO;
+
+LRESULT WINAPI UpDownWindowProc( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
+                                 LPARAM lParam);
+
+#endif  /* __WINE_UPDOWN_H */
diff --git a/include/ver.h b/include/ver.h
index 05342f2..60d0dee 100644
--- a/include/ver.h
+++ b/include/ver.h
@@ -127,15 +127,6 @@
 	DWORD   dwFileDateLS;
 } VS_FIXEDFILEINFO;
 
-/* following two aren't in version.dll */
-DWORD
-GetFileResourceSize(LPCSTR filename,SEGPTR restype,SEGPTR resid,LPDWORD off);
-
-DWORD
-GetFileResource(LPCSTR filename,SEGPTR restype,SEGPTR resid,
-		DWORD off,DWORD reslen,LPVOID data
-);
-
 
 /* 20 GETFILEVERSIONINFORAW */
 
diff --git a/include/win.h b/include/win.h
index 139e919..c952000 100644
--- a/include/win.h
+++ b/include/win.h
@@ -74,7 +74,7 @@
     HWND32         hwndLastActive;/* Last active popup hwnd */
     DWORD          dwStyle;       /* Window style (from CreateWindow) */
     DWORD          dwExStyle;     /* Extended style (from CreateWindowEx) */
-    UINT16         wIDmenu;       /* ID or hmenu (from CreateWindow) */
+    UINT32         wIDmenu;       /* ID or hmenu (from CreateWindow) */
     WORD           flags;         /* Misc. flags (see below) */
     Window         window;        /* X window (only for top-level windows) */
     HMENU16        hSysMenu;      /* window's copy of System Menu */
@@ -124,6 +124,7 @@
 extern void   WIN_ResetQueueWindows( WND* wnd, HQUEUE16 hQueue, HQUEUE16 hNew );
 extern BOOL32 WIN_CreateDesktopWindow(void);
 extern HWND32 WIN_GetTopParent( HWND32 hwnd );
+extern WND*   WIN_GetTopParentPtr( WND* pWnd );
 extern BOOL32 WIN_IsWindowDrawable(WND*, BOOL32 );
 extern HINSTANCE16 WIN_GetWindowInstance( HWND32 hwnd );
 extern WND**  WIN_BuildWinArray( WND *wndPtr, UINT32 bwa, UINT32* pnum );
diff --git a/include/winbase.h b/include/winbase.h
index e860418..46aaa97 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -57,7 +57,6 @@
 #define FS_CASE_IS_PRESERVED            FILE_CASE_PRESERVED_NAMES
 #define FS_UNICODE_STORED_ON_DISK       FILE_UNICODE_ON_DISK
 
-/*WINAPI int  SetErrorMode(int);*/
 
 #define STATUS_SUCCESS                   0x00000000
 #define STATUS_WAIT_0                    0x00000000    
@@ -156,19 +155,17 @@
 #define VER_PLATFORM_WIN32_NT           2
 
 /*DWORD WINAPI GetVersion( void );*/
-BOOL32 GetVersionEx32A(OSVERSIONINFO32A*);
-BOOL32 GetVersionEx32W(OSVERSIONINFO32W*);
+BOOL32 WINAPI GetVersionEx32A(OSVERSIONINFO32A*);
+BOOL32 WINAPI GetVersionEx32W(OSVERSIONINFO32W*);
 #define GetVersionEx WINELIB_NAME_AW(GetVersionEx)
 
 /*int WinMain(HINSTANCE, HINSTANCE prev, char *cmd, int show);*/
 
-HACCEL32 LoadAcceleratorsA(   HINSTANCE32, const char *);
-
-void     DeleteCriticalSection(CRITICAL_SECTION *lpCrit);
-void     EnterCriticalSection(CRITICAL_SECTION *lpCrit);
-void     InitializeCriticalSection(CRITICAL_SECTION *lpCrit);
-void     LeaveCriticalSection(CRITICAL_SECTION *lpCrit);
-HANDLE32 OpenProcess(DWORD access, BOOL32 inherit, DWORD id);
-int      TerminateProcess(HANDLE32 h, int ret);
+void      WINAPI DeleteCriticalSection(CRITICAL_SECTION *lpCrit);
+void      WINAPI EnterCriticalSection(CRITICAL_SECTION *lpCrit);
+void      WINAPI InitializeCriticalSection(CRITICAL_SECTION *lpCrit);
+void      WINAPI LeaveCriticalSection(CRITICAL_SECTION *lpCrit);
+HANDLE32  WINAPI OpenProcess(DWORD access, BOOL32 inherit, DWORD id);
+int       WINAPI TerminateProcess(HANDLE32 h, int ret);
 
 #endif  /* __WINE_WINBASE_H */
diff --git a/include/windows.h b/include/windows.h
index 06814ac..139c33b 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1100,6 +1100,14 @@
 
 typedef struct 
 {
+  UINT32	ciCharset;
+  UINT32	ciACP;
+  FONTSIGNATURE	fs;
+} CHARSETINFO,*LPCHARSETINFO;
+
+
+typedef struct 
+{
     INT16  txfHeight;
     INT16  txfWidth;
     INT16  txfEscapement;
@@ -2787,6 +2795,7 @@
 #define SWP_NOSENDCHANGING  0x0400
 #define SWP_DEFERERASE      0x2000
 
+#define HWND_DESKTOP        ((HWND32)0)
 #define HWND_BROADCAST      ((HWND32)0xffff)
 
 /* SetWindowPos() hwndInsertAfter field values */
@@ -2840,8 +2849,10 @@
 #define MF_BYCOMMAND       0x0000
 #define MF_BYPOSITION      0x0400
 #define MF_SEPARATOR       0x0800
+#define MF_DEFAULT         0x1000
 #define MF_SYSMENU         0x2000
 #define MF_HELP            0x4000
+#define MF_RIGHTJUSTIFY    0x4000
 #define MF_MOUSESELECT     0x8000
 
 /* Flags for extended menu item types.  */
@@ -2865,6 +2876,21 @@
 #define MFS_UNHILITE        MF_UNHILITE
 #define MFS_DEFAULT         MF_DEFAULT
 
+/* FIXME: not sure this one is correct */
+typedef struct {
+  UINT16    cbSize;
+  UINT16    fMask;
+  UINT16    fType;
+  UINT16    fState;
+  UINT16    wID;
+  HMENU16   hSubMenu;
+  HBITMAP16 hbmpChecked;
+  HBITMAP16 hbmpUnchecked;
+  DWORD     dwItemData;
+  LPSTR     dwTypeData;
+  UINT16    cch;
+} MENUITEMINFO16, *LPMENUITEMINFO16;
+
 typedef struct {
   UINT32    cbSize;
   UINT32    fMask;
@@ -3035,6 +3061,23 @@
 #define DFCS_FLAT               0x4000
 #define DFCS_MONO               0x8000
 
+/* DrawState defines ... */
+typedef BOOL32 (CALLBACK *DRAWSTATEPROC)(HDC32,LPARAM,WPARAM32,INT32,INT32);
+
+/* Image type */
+#define	DST_COMPLEX	0x0000
+#define	DST_TEXT	0x0001
+#define	DST_PREFIXTEXT	0x0002
+#define	DST_ICON	0x0003
+#define	DST_BITMAP	0x0004
+
+/* State type */
+#define	DSS_NORMAL	0x0000
+#define	DSS_UNION	0x0010  /* Gray string appearance */
+#define	DSS_DISABLED	0x0020
+#define	DSS_MONO	0x0080
+#define	DSS_RIGHT	0x8000
+
 /* Window Styles */
 #define WS_OVERLAPPED    0x00000000L
 #define WS_POPUP         0x80000000L
@@ -5118,2521 +5161,2591 @@
 DECL_WINELIB_TYPE_AW(NONCLIENTMETRICS);
 DECL_WINELIB_TYPE_AW(LPNONCLIENTMETRICS);
 
+typedef struct tagNMHDR
+{
+    HWND32  hwndFrom;
+    UINT32  idFrom;
+    UINT32  code;
+} NMHDR, *LPNMHDR;
+
 #pragma pack(4)
 
 /* Declarations for functions that exist only in Win16 */
 
-WORD       AllocCStoDSAlias(WORD);
-WORD       AllocDStoCSAlias(WORD);
-WORD       AllocSelector(WORD);
-WORD       AllocSelectorArray(WORD);
-VOID       CalcChildScroll(HWND16,WORD);
-INT16      Catch(LPCATCHBUF);
-WORD       ChangeSelector(WORD,WORD);
-INT16      CloseComm(INT16);
-HGLOBAL16  CreateCursorIconIndirect(HINSTANCE16,CURSORICONINFO*,LPCVOID,LPCVOID);
-WORD       CreateSystemTimer(WORD,FARPROC16);
-BOOL16     DCHook(HDC16,WORD,DWORD,LPARAM);
-VOID       DirectedYield(HTASK16);
-HGLOBAL16  DirectResAlloc(HINSTANCE16,WORD,UINT16);
-VOID       DisableSystemTimers(void);
-BOOL16     DlgDirSelect(HWND16,LPSTR,INT16);
-BOOL16     DlgDirSelectComboBox(HWND16,LPSTR,INT16);
-DWORD      DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
-BOOL16     EnableCommNotification(INT16,HWND16,INT16,INT16);
-BOOL16     EnableHardwareInput(BOOL16);
-VOID       EnableSystemTimers(void);
-INT16      ExcludeVisRect(HDC16,INT16,INT16,INT16,INT16);
-HANDLE16   FarGetOwner(HGLOBAL16);
-VOID       FarSetOwner(HGLOBAL16,HANDLE16);
-BOOL16     FastWindowFrame(HDC16,const RECT16*,INT16,INT16,DWORD);
-VOID       FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
-INT16      FlushComm(INT16,INT16);
-WORD       FreeSelector(WORD);
-UINT16     GDIRealizePalette(HDC16);
-HPALETTE16 GDISelectPalette(HDC16,HPALETTE16,WORD);
-HANDLE16   GetAtomHandle(ATOM);
-DWORD      GetBitmapDimension(HBITMAP16);
-DWORD      GetBrushOrg(HDC16);
-HANDLE16   GetCodeHandle(FARPROC16);
-INT16      GetCommError(INT16,LPCOMSTAT);
-UINT16     GetCommEventMask(INT16,UINT16);
-HBRUSH16   GetControlBrush(HWND16,HDC16,UINT16);
-VOID       GetCodeInfo(FARPROC16,LPVOID);
-HANDLE16   GetCurrentPDB(void);
-DWORD      GetCurrentPosition(HDC16);
-HTASK16    GetCurrentTask(void);
-DWORD      GetDCHook(HDC16,FARPROC16*);
-DWORD      GetDCOrg(HDC16);
-HDC16      GetDCState(HDC16);
-HWND16     GetDesktopHwnd(void);
-SEGPTR     GetDOSEnvironment(void);
-INT16      GetEnvironment(LPCSTR,LPSTR,UINT16);
-HMODULE16  GetExePtr(HANDLE16);
-WORD       GetExeVersion(void);
-DWORD      GetHeapSpaces(HMODULE16);
-INT16      GetKbCodePage(VOID);
-INT16      GetInstanceData(HINSTANCE16,WORD,INT16);
-HGLOBAL16  GetMetaFileBits(HMETAFILE16);
-BOOL16     GetModuleName(HINSTANCE16,LPSTR,INT16);
-INT16      GetModuleUsage(HINSTANCE16);
-FARPROC16  GetMouseEventProc(void);
-UINT16     GetNumTasks(void);
-DWORD      GetSelectorBase(WORD);
-DWORD      GetSelectorLimit(WORD);
-HINSTANCE16 GetTaskDS(void);
-HQUEUE16   GetTaskQueue(HTASK16);
-BYTE       GetTempDrive(BYTE);
-DWORD      GetTextExtent(HDC16,LPCSTR,INT16);
-DWORD      GetViewportExt(HDC16);
-DWORD      GetViewportOrg(HDC16);
-BOOL16     GetWinDebugInfo(LPWINDEBUGINFO,UINT16);
-DWORD      GetWindowExt(HDC16);
-DWORD      GetWindowOrg(HDC16);
-DWORD      GetWinFlags(void);
-DWORD      GlobalDOSAlloc(DWORD);
-WORD       GlobalDOSFree(WORD);
-void       GlobalFreeAll(HGLOBAL16);
-HGLOBAL16  GlobalLRUNewest(HGLOBAL16);
-HGLOBAL16  GlobalLRUOldest(HGLOBAL16);
-VOID       GlobalNotify(FARPROC16);
-WORD       GlobalPageLock(HGLOBAL16);
-WORD       GlobalPageUnlock(HGLOBAL16);
-INT16      InitApp(HINSTANCE16);
-HRGN16     InquireVisRgn(HDC16);
-INT16      IntersectVisRect(HDC16,INT16,INT16,INT16,INT16);
-BOOL16     IsDCCurrentPalette(HDC16);
-BOOL16     IsGDIObject(HGDIOBJ16);
-BOOL16     IsSharedSelector(HANDLE16);
-BOOL16     IsTask(HTASK16);
-HTASK16    IsTaskLocked(void);
-BOOL16     IsValidMetaFile(HMETAFILE16);
-VOID       LogError(UINT16, LPVOID);
-VOID       LogParamError(UINT16,FARPROC16,LPVOID);
-BOOL16     LocalInit(HANDLE16,WORD,WORD);
-FARPROC16  LocalNotify(FARPROC16);
-HTASK16    LockCurrentTask(BOOL16);
-HMENU16    LookupMenuHandle(HMENU16,INT16);
-DWORD      MoveTo(HDC16,INT16,INT16);
-DWORD      OffsetViewportOrg(HDC16,INT16,INT16);
-INT16      OffsetVisRgn(HDC16,INT16,INT16);
-DWORD      OffsetWindowOrg(HDC16,INT16,INT16);
-VOID       OldYield(void);
-INT16      OpenComm(LPCSTR,UINT16,UINT16);
-VOID       PaintRect(HWND16,HWND16,HDC16,HBRUSH16,const RECT16*);
-VOID       PostEvent(HTASK16);
-WORD       PrestoChangoSelector(WORD,WORD);
-INT16      ReadComm(INT16,LPSTR,INT16);
-UINT16     RealizeDefaultPalette(HDC16);
-BOOL32     RegisterShellHook(HWND16,UINT16);
-INT16      RestoreVisRgn(HDC16);
-HRGN16     SaveVisRgn(HDC16);
-DWORD      ScaleViewportExt(HDC16,INT16,INT16,INT16,INT16);
-DWORD      ScaleWindowExt(HDC16,INT16,INT16,INT16,INT16);
-WORD       SelectorAccessRights(WORD,WORD,WORD);
-INT16      SelectVisRgn(HDC16,HRGN16);
-DWORD      SetBitmapDimension(HBITMAP16,INT16,INT16);
-DWORD      SetBrushOrg(HDC16,INT16,INT16);
-UINT16*    SetCommEventMask(INT16,UINT16);
-BOOL16     SetDCHook(HDC16,FARPROC16,DWORD);
-DWORD      SetDCOrg(HDC16,INT16,INT16);
-VOID       SetDCState(HDC16,HDC16);
-BOOL16     SetDeskPattern(void);
-INT16      SetEnvironment(LPCSTR,LPCSTR,UINT16);
-WORD       SetHookFlags(HDC16,WORD);
-HMETAFILE16 SetMetaFileBits(HGLOBAL16);
-VOID       SetPriority(HTASK16,INT16);
-FARPROC16  SetResourceHandler(HINSTANCE16,SEGPTR,FARPROC16);
-WORD       SetSelectorBase(WORD,DWORD);
-WORD       SetSelectorLimit(WORD,DWORD);
-LONG       SetSwapAreaSize(WORD);
-HQUEUE16   SetTaskQueue(HTASK16,HQUEUE16);
-FARPROC16  SetTaskSignalProc(HTASK16,FARPROC16);
-DWORD      SetViewportExt(HDC16,INT16,INT16);
-DWORD      SetViewportOrg(HDC16,INT16,INT16);
-BOOL16     SetWinDebugInfo(LPWINDEBUGINFO);
-DWORD      SetWindowExt(HDC16,INT16,INT16);
-DWORD      SetWindowOrg(HDC16,INT16,INT16);
-VOID       SwitchStackBack(void);
-VOID       SwitchStackTo(WORD,WORD,WORD);
-INT16      Throw(LPCATCHBUF,INT16);
-INT16      UngetCommChar(INT16,CHAR);
-VOID       UserYield(void);
-BOOL16     WaitEvent(HTASK16);
-INT16      WriteComm(INT16,LPSTR,INT16);
-VOID       WriteOutProfiles(VOID);
-VOID       hmemcpy(LPVOID,LPCVOID,LONG);
-VOID       Yield(void);
+WORD        WINAPI AllocCStoDSAlias(WORD);
+WORD        WINAPI AllocDStoCSAlias(WORD);
+WORD        WINAPI AllocSelector(WORD);
+WORD        WINAPI AllocSelectorArray(WORD);
+VOID        WINAPI CalcChildScroll(HWND16,WORD);
+INT16       WINAPI Catch(LPCATCHBUF);
+VOID        WINAPI CascadeChildWindows(HWND16,WORD);
+INT16       WINAPI CloseComm(INT16);
+HGLOBAL16   WINAPI CreateCursorIconIndirect(HINSTANCE16,CURSORICONINFO*,
+                                            LPCVOID,LPCVOID);
+WORD        WINAPI CreateSystemTimer(WORD,FARPROC16);
+BOOL16      WINAPI DCHook(HDC16,WORD,DWORD,LPARAM);
+VOID        WINAPI DirectedYield(HTASK16);
+HGLOBAL16   WINAPI DirectResAlloc(HINSTANCE16,WORD,UINT16);
+VOID        WINAPI DisableSystemTimers(void);
+BOOL16      WINAPI DlgDirSelect(HWND16,LPSTR,INT16);
+BOOL16      WINAPI DlgDirSelectComboBox(HWND16,LPSTR,INT16);
+DWORD       WINAPI DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
+BOOL16      WINAPI EnableCommNotification(INT16,HWND16,INT16,INT16);
+BOOL16      WINAPI EnableHardwareInput(BOOL16);
+VOID        WINAPI EnableSystemTimers(void);
+INT16       WINAPI ExcludeVisRect(HDC16,INT16,INT16,INT16,INT16);
+HANDLE16    WINAPI FarGetOwner(HGLOBAL16);
+VOID        WINAPI FarSetOwner(HGLOBAL16,HANDLE16);
+BOOL16      WINAPI FastWindowFrame(HDC16,const RECT16*,INT16,INT16,DWORD);
+VOID        WINAPI FileCDR(FARPROC16);
+VOID        WINAPI FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
+INT16       WINAPI FlushComm(INT16,INT16);
+WORD        WINAPI FreeSelector(WORD);
+UINT16      WINAPI GDIRealizePalette(HDC16);
+HPALETTE16  WINAPI GDISelectPalette(HDC16,HPALETTE16,WORD);
+HANDLE16    WINAPI GetAtomHandle(ATOM);
+DWORD       WINAPI GetBitmapDimension(HBITMAP16);
+DWORD       WINAPI GetBrushOrg(HDC16);
+HANDLE16    WINAPI GetCodeHandle(FARPROC16);
+INT16       WINAPI GetCommError(INT16,LPCOMSTAT);
+UINT16      WINAPI GetCommEventMask(INT16,UINT16);
+HBRUSH16    WINAPI GetControlBrush(HWND16,HDC16,UINT16);
+VOID        WINAPI GetCodeInfo(FARPROC16,LPVOID);
+HANDLE16    WINAPI GetCurrentPDB(void);
+DWORD       WINAPI GetCurrentPosition(HDC16);
+HTASK16     WINAPI GetCurrentTask(void);
+DWORD       WINAPI GetDCHook(HDC16,FARPROC16*);
+DWORD       WINAPI GetDCOrg(HDC16);
+HDC16       WINAPI GetDCState(HDC16);
+HWND16      WINAPI GetDesktopHwnd(void);
+SEGPTR      WINAPI GetDOSEnvironment(void);
+INT16       WINAPI GetEnvironment(LPCSTR,LPSTR,UINT16);
+HMODULE16   WINAPI GetExePtr(HANDLE16);
+WORD        WINAPI GetExeVersion(void);
+WORD        WINAPI GetExpWinVer(HMODULE16);
+DWORD       WINAPI GetFileResourceSize(LPCSTR,SEGPTR,SEGPTR,LPDWORD);
+DWORD       WINAPI GetFileResource(LPCSTR,SEGPTR,SEGPTR,DWORD,DWORD,LPVOID);
+DWORD       WINAPI GetHeapSpaces(HMODULE16);
+INT16       WINAPI GetInstanceData(HINSTANCE16,WORD,INT16);
+HGLOBAL16   WINAPI GetMetaFileBits(HMETAFILE16);
+BOOL16      WINAPI GetModuleName(HINSTANCE16,LPSTR,INT16);
+INT16       WINAPI GetModuleUsage(HINSTANCE16);
+FARPROC16   WINAPI GetMouseEventProc(void);
+UINT16      WINAPI GetNumTasks(void);
+DWORD       WINAPI GetSelectorBase(WORD);
+DWORD       WINAPI GetSelectorLimit(WORD);
+HINSTANCE16 WINAPI GetTaskDS(void);
+HQUEUE16    WINAPI GetTaskQueue(HTASK16);
+BYTE        WINAPI GetTempDrive(BYTE);
+DWORD       WINAPI GetTextExtent(HDC16,LPCSTR,INT16);
+DWORD       WINAPI GetViewportExt(HDC16);
+DWORD       WINAPI GetViewportOrg(HDC16);
+BOOL16      WINAPI GetWinDebugInfo(LPWINDEBUGINFO,UINT16);
+DWORD       WINAPI GetWindowExt(HDC16);
+DWORD       WINAPI GetWindowOrg(HDC16);
+DWORD       WINAPI GetWinFlags(void);
+DWORD       WINAPI GlobalDOSAlloc(DWORD);
+WORD        WINAPI GlobalDOSFree(WORD);
+void        WINAPI GlobalFreeAll(HGLOBAL16);
+HGLOBAL16   WINAPI GlobalLRUNewest(HGLOBAL16);
+HGLOBAL16   WINAPI GlobalLRUOldest(HGLOBAL16);
+VOID        WINAPI GlobalNotify(FARPROC16);
+WORD        WINAPI GlobalPageLock(HGLOBAL16);
+WORD        WINAPI GlobalPageUnlock(HGLOBAL16);
+INT16       WINAPI InitApp(HINSTANCE16);
+HRGN16      WINAPI InquireVisRgn(HDC16);
+INT16       WINAPI IntersectVisRect(HDC16,INT16,INT16,INT16,INT16);
+BOOL16      WINAPI IsDCCurrentPalette(HDC16);
+BOOL16      WINAPI IsGDIObject(HGDIOBJ16);
+BOOL16      WINAPI IsSharedSelector(HANDLE16);
+BOOL16      WINAPI IsTask(HTASK16);
+HTASK16     WINAPI IsTaskLocked(void);
+BOOL16      WINAPI IsValidMetaFile(HMETAFILE16);
+VOID        WINAPI LogError(UINT16, LPVOID);
+VOID        WINAPI LogParamError(UINT16,FARPROC16,LPVOID);
+WORD        WINAPI LocalCountFree(void);
+WORD        WINAPI LocalHandleDelta(WORD);
+WORD        WINAPI LocalHeapSize(void);
+BOOL16      WINAPI LocalInit(HANDLE16,WORD,WORD);
+FARPROC16   WINAPI LocalNotify(FARPROC16);
+HTASK16     WINAPI LockCurrentTask(BOOL16);
+HMENU16     WINAPI LookupMenuHandle(HMENU16,INT16);
+DWORD       WINAPI MoveTo(HDC16,INT16,INT16);
+DWORD       WINAPI OffsetViewportOrg(HDC16,INT16,INT16);
+INT16       WINAPI OffsetVisRgn(HDC16,INT16,INT16);
+DWORD       WINAPI OffsetWindowOrg(HDC16,INT16,INT16);
+VOID        WINAPI OldYield(void);
+INT16       WINAPI OpenComm(LPCSTR,UINT16,UINT16);
+VOID        WINAPI PaintRect(HWND16,HWND16,HDC16,HBRUSH16,const RECT16*);
+VOID        WINAPI PostEvent(HTASK16);
+WORD        WINAPI PrestoChangoSelector(WORD,WORD);
+INT16       WINAPI ReadComm(INT16,LPSTR,INT16);
+UINT16      WINAPI RealizeDefaultPalette(HDC16);
+BOOL32      WINAPI RegisterShellHook(HWND16,UINT16);
+INT16       WINAPI RestoreVisRgn(HDC16);
+HRGN16      WINAPI SaveVisRgn(HDC16);
+DWORD       WINAPI ScaleViewportExt(HDC16,INT16,INT16,INT16,INT16);
+DWORD       WINAPI ScaleWindowExt(HDC16,INT16,INT16,INT16,INT16);
+WORD        WINAPI SelectorAccessRights(WORD,WORD,WORD);
+INT16       WINAPI SelectVisRgn(HDC16,HRGN16);
+DWORD       WINAPI SetBitmapDimension(HBITMAP16,INT16,INT16);
+DWORD       WINAPI SetBrushOrg(HDC16,INT16,INT16);
+UINT16*     WINAPI SetCommEventMask(INT16,UINT16);
+BOOL16      WINAPI SetDCHook(HDC16,FARPROC16,DWORD);
+DWORD       WINAPI SetDCOrg(HDC16,INT16,INT16);
+VOID        WINAPI SetDCState(HDC16,HDC16);
+BOOL16      WINAPI SetDeskPattern(void);
+INT16       WINAPI SetEnvironment(LPCSTR,LPCSTR,UINT16);
+WORD        WINAPI SetHookFlags(HDC16,WORD);
+HMETAFILE16 WINAPI SetMetaFileBits(HGLOBAL16);
+VOID        WINAPI SetPriority(HTASK16,INT16);
+FARPROC16   WINAPI SetResourceHandler(HINSTANCE16,SEGPTR,FARPROC16);
+WORD        WINAPI SetSelectorBase(WORD,DWORD);
+WORD        WINAPI SetSelectorLimit(WORD,DWORD);
+LONG        WINAPI SetSwapAreaSize(WORD);
+HQUEUE16    WINAPI SetTaskQueue(HTASK16,HQUEUE16);
+FARPROC16   WINAPI SetTaskSignalProc(HTASK16,FARPROC16);
+DWORD       WINAPI SetViewportExt(HDC16,INT16,INT16);
+DWORD       WINAPI SetViewportOrg(HDC16,INT16,INT16);
+BOOL16      WINAPI SetWinDebugInfo(LPWINDEBUGINFO);
+DWORD       WINAPI SetWindowExt(HDC16,INT16,INT16);
+DWORD       WINAPI SetWindowOrg(HDC16,INT16,INT16);
+VOID        WINAPI SwitchStackBack(void);
+VOID        WINAPI SwitchStackTo(WORD,WORD,WORD);
+VOID        WINAPI TileChildWindows(HWND16,WORD);
+INT16       WINAPI Throw(LPCATCHBUF,INT16);
+INT16       WINAPI UngetCommChar(INT16,CHAR);
+VOID        WINAPI UserYield(void);
+BOOL16      WINAPI WaitEvent(HTASK16);
+INT16       WINAPI WriteComm(INT16,LPSTR,INT16);
+VOID        WINAPI WriteOutProfiles(VOID);
+VOID        WINAPI hmemcpy(LPVOID,LPCVOID,LONG);
+VOID        WINAPI Yield(void);
+
 
 /* Declarations for functions that exist only in Win32 */
-BOOL32     Beep(DWORD,DWORD);
-BOOL32     ClearCommError(INT32,LPDWORD,LPCOMSTAT);
-BOOL32     CloseHandle(HANDLE32);
-BOOL32     CopyFile32A(LPCSTR,LPCSTR,BOOL32);
-BOOL32     CopyFile32W(LPCWSTR,LPCWSTR,BOOL32);
-#define    CopyFile WINELIB_NAME_AW(CopyFile)
-INT32      CompareFileTime(LPFILETIME,LPFILETIME);
-HANDLE32   CreateEvent32A(LPSECURITY_ATTRIBUTES,BOOL32,BOOL32,LPCSTR);
-HANDLE32   CreateEvent32W(LPSECURITY_ATTRIBUTES,BOOL32,BOOL32,LPCWSTR);
-#define    CreateEvent WINELIB_NAME_AW(CreateEvent)
-HFILE32    CreateFile32A(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE32);
-HFILE32    CreateFile32W(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE32);
-#define    CreateFile WINELIB_NAME_AW(CreateFile)
-HANDLE32   CreateFileMapping32A(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR);
-HANDLE32   CreateFileMapping32W(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR);
-#define    CreateFileMapping WINELIB_NAME_AW(CreateFileMapping)
-HANDLE32   CreateMutex32A(LPSECURITY_ATTRIBUTES,BOOL32,LPCSTR);
-HANDLE32   CreateMutex32W(LPSECURITY_ATTRIBUTES,BOOL32,LPCWSTR);
-#define    CreateMutex WINELIB_NAME_AW(CreateMutex)
-HANDLE32   CreateSemaphore32A(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCSTR);
-HANDLE32   CreateSemaphore32W(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR);
-#define    CreateSemaphore WINELIB_NAME_AW(CreateSemaphore)
-BOOL32     DosDateTimeToFileTime(WORD,WORD,LPFILETIME);
-INT32      EnumPropsEx32A(HWND32,PROPENUMPROCEX32A,LPARAM);
-INT32      EnumPropsEx32W(HWND32,PROPENUMPROCEX32W,LPARAM);
-#define    EnumPropsEx WINELIB_NAME_AW(EnumPropsEx)
-BOOL32     EnumResourceLanguages32A(HMODULE32,LPCSTR,LPCSTR,ENUMRESLANGPROC32A,LONG);
-BOOL32     EnumResourceLanguages32W(HMODULE32,LPCWSTR,LPCWSTR,ENUMRESLANGPROC32W,LONG);
-#define    EnumResourceLanguages WINELIB_NAME_AW(EnumResourceLanguages)
-BOOL32     EnumResourceNames32A(HMODULE32,LPCSTR,ENUMRESNAMEPROC32A,LONG);
-BOOL32     EnumResourceNames32W(HMODULE32,LPCWSTR,ENUMRESNAMEPROC32W,LONG);
-#define    EnumResourceNames WINELIB_NAME_AW(EnumResourceNames)
-BOOL32     EnumResourceTypes32A(HMODULE32,ENUMRESTYPEPROC32A,LONG);
-BOOL32     EnumResourceTypes32W(HMODULE32,ENUMRESTYPEPROC32W,LONG);
-#define    EnumResourceTypes WINELIB_NAME_AW(EnumResourceTypes)
-BOOL32     EnumSystemCodePages32A(CODEPAGE_ENUMPROC32A,DWORD);
-BOOL32     EnumSystemCodePages32W(CODEPAGE_ENUMPROC32W,DWORD);
-#define    EnumSystemCodePages WINELIB_NAME_AW(EnumSystemCodePages)
-BOOL32     EnumSystemLocales32A(LOCALE_ENUMPROC32A,DWORD);
-BOOL32     EnumSystemLocales32W(LOCALE_ENUMPROC32W,DWORD);
-#define    EnumSystemLocales WINELIB_NAME_AW(EnumSystemLocales)
-BOOL32     EnumThreadWindows(DWORD,WNDENUMPROC32,LPARAM);
-void       ExitProcess(DWORD);
-BOOL32     ExitWindowsEx(UINT32,DWORD);
-DWORD      ExpandEnvironmentStrings32A(LPCSTR,LPSTR,DWORD);
-DWORD      ExpandEnvironmentStrings32W(LPCWSTR,LPWSTR,DWORD);
-#define    ExpandEnvironmentStrings WINELIB_NAME_AW(ExpandEnvironmentStrings)
-BOOL32     FileTimeToDosDateTime(const FILETIME*,LPWORD,LPWORD);
-BOOL32     FileTimeToLocalFileTime(const FILETIME*,LPFILETIME);
-BOOL32     FileTimeToSystemTime(const FILETIME*,LPSYSTEMTIME);
-HRSRC32    FindResourceEx32A(HINSTANCE32,LPCSTR,LPCSTR,WORD);
-HRSRC32    FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD);
-#define    FindResourceEx WINELIB_NAME_AW(FindResourceEx)
-BOOL32     FlushFileBuffers(HFILE32);
-BOOL32     FreeEnvironmentStrings32A(LPSTR);
-BOOL32     FreeEnvironmentStrings32W(LPWSTR);
-#define    FreeEnvironmentStrings WINELIB_NAME_AW(FreeEnvironmentStrings)
-UINT32     GetACP(void);
-LPCSTR     GetCommandLine32A();
-LPCWSTR    GetCommandLine32W();
-#define    GetCommandLine WINELIB_NAME_AW(GetCommandLine)
-BOOL32     GetCommTimeouts(INT32,LPCOMMTIMEOUTS);
-BOOL32     GetCPInfo(UINT32,LPCPINFO);
-HANDLE32   GetCurrentProcess(void);
-DWORD      GetCurrentProcessId(void);
-HANDLE32   GetCurrentThread(void);
-DWORD      GetCurrentThreadId(void);
-BOOL32     GetDCOrgEx(HDC32,LPPOINT32);
-LPSTR      GetEnvironmentStrings32A(void);
-LPWSTR     GetEnvironmentStrings32W(void);
-#define    GetEnvironmentStrings WINELIB_NAME_AW(GetEnvironmentStrings)
-DWORD      GetEnvironmentVariable32A(LPCSTR,LPSTR,DWORD);
-DWORD      GetEnvironmentVariable32W(LPCWSTR,LPWSTR,DWORD);
-#define    GetEnvironmentVariable WINELIB_NAME_AW(GetEnvironmentVariable)
-DWORD      GetFileInformationByHandle(HFILE32,BY_HANDLE_FILE_INFORMATION*);
-DWORD      GetFileSize(HFILE32,LPDWORD);
-BOOL32     GetFileTime(HFILE32,LPFILETIME,LPFILETIME,LPFILETIME);
-DWORD      GetFileType(HFILE32);
-DWORD      GetFullPathName32A(LPCSTR,DWORD,LPSTR,LPSTR*);
-DWORD      GetFullPathName32W(LPCWSTR,DWORD,LPWSTR,LPWSTR*);
-#define    GetFullPathName WINELIB_NAME_AW(GetFullPathName)
-VOID       GetLocalTime(LPSYSTEMTIME);
-DWORD      GetLogicalDrives(void);
-BOOL32     GetMenuItemInfo32A(HMENU32,UINT32,BOOL32,MENUITEMINFO32A*);
-BOOL32     GetMenuItemInfo32W(HMENU32,UINT32,BOOL32,MENUITEMINFO32W*);
-#define    GetMenuItemInfo WINELIB_NAME_AW(GetMenuItemInfo)
-UINT32     GetOEMCP(void);
-DWORD      GetPriorityClass(HANDLE32);
-HANDLE32   GetProcessHeap(void);
-DWORD      GetShortPathName32A(LPCSTR,LPSTR,DWORD);
-DWORD      GetShortPathName32W(LPCWSTR,LPWSTR,DWORD);
-#define    GetShortPathName WINELIB_NAME_AW(GetShortPathName)
-HFILE32    GetStdHandle(DWORD);
-BOOL32     GetStringTypeEx32A(LCID,DWORD,LPCSTR,INT32,LPWORD);
-BOOL32     GetStringTypeEx32W(LCID,DWORD,LPCWSTR,INT32,LPWORD);
-#define    GetStringTypeEx WINELIB_NAME_AW(GetStringTypeEx)
-VOID       GetSystemInfo(LPSYSTEM_INFO);
-BOOL32     GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
-VOID       GetSystemTime(LPSYSTEMTIME);
-LCID       GetThreadLocale();
-INT32      GetThreadPriority(HANDLE32);
-DWORD      GetWindowThreadProcessId(HWND32,LPDWORD);
-VOID       GlobalMemoryStatus(LPMEMORYSTATUS);
-LPVOID     HeapAlloc(HANDLE32,DWORD,DWORD);
-DWORD      HeapCompact(HANDLE32,DWORD);
-HANDLE32   HeapCreate(DWORD,DWORD,DWORD);
-BOOL32     HeapDestroy(HANDLE32);
-BOOL32     HeapFree(HANDLE32,DWORD,LPVOID);
-BOOL32     HeapLock(HANDLE32);
-LPVOID     HeapReAlloc(HANDLE32,DWORD,LPVOID,DWORD);
-DWORD      HeapSize(HANDLE32,DWORD,LPVOID);
-BOOL32     HeapUnlock(HANDLE32);
-BOOL32     HeapValidate(HANDLE32,DWORD,LPVOID);
-BOOL32     IsDBCSLeadByteEx(UINT32,BYTE);
-BOOL32     IsWindowUnicode(HWND32);
-BOOL32     IsValidLocale(DWORD,DWORD);
-BOOL32     LocalFileTimeToFileTime(const FILETIME*,LPFILETIME);
-BOOL32     LockFile(HFILE32,DWORD,DWORD,DWORD,DWORD);
-SEGPTR     MapLS(LPVOID);
-LPVOID     MapSL(SEGPTR);
-LPVOID     MapViewOfFile(HANDLE32,DWORD,DWORD,DWORD,DWORD);
-LPVOID     MapViewOfFileEx(HANDLE32,DWORD,DWORD,DWORD,DWORD,LPVOID);
-INT32      MessageBoxEx32A(HWND32,LPCSTR,LPCSTR,UINT32,WORD);
-INT32      MessageBoxEx32W(HWND32,LPCWSTR,LPCWSTR,UINT32,WORD);
-#define    MessageBoxEx WINELIB_NAME_AW(MessageBoxEx)
-BOOL32     MoveFile32A(LPCSTR,LPCSTR);
-BOOL32     MoveFile32W(LPCWSTR,LPCWSTR);
-#define    MoveFile WINELIB_NAME_AW(MoveFile)
-HANDLE32   OpenEvent32A(DWORD,BOOL32,LPCSTR);
-HANDLE32   OpenEvent32W(DWORD,BOOL32,LPCWSTR);
-#define    OpenEvent WINELIB_NAME_AW(OpenEvent)
-HANDLE32   OpenFileMapping32A(DWORD,BOOL32,LPCSTR);
-HANDLE32   OpenFileMapping32W(DWORD,BOOL32,LPCWSTR);
-#define    OpenFileMapping WINELIB_NAME_AW(OpenFileMapping)
-HANDLE32   OpenMutex32A(DWORD,BOOL32,LPCSTR);
-HANDLE32   OpenMutex32W(DWORD,BOOL32,LPCWSTR);
-#define    OpenMutex WINELIB_NAME_AW(OpenMutex)
-HANDLE32   OpenSemaphore32A(DWORD,BOOL32,LPCSTR);
-HANDLE32   OpenSemaphore32W(DWORD,BOOL32,LPCWSTR);
-#define    OpenSemaphore WINELIB_NAME_AW(OpenSemaphore)
-DWORD      QueryDosDevice32A(LPCSTR,LPSTR,DWORD);
-DWORD      QueryDosDevice32W(LPCWSTR,LPWSTR,DWORD);
-#define    QueryDosDevice WINELIB_NAME_AW(QueryDosDevice)
-BOOL32     QueryPerformanceCounter(LPLARGE_INTEGER);
-BOOL32     ReadConsole32A(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
-BOOL32     ReadConsole32W(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
-#define    ReadConsole WINELIB_NAME_AW(ReadConsole)
-BOOL32     ReadFile(HFILE32,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
-DWORD      RegCreateKeyEx32A(HKEY,LPCSTR,DWORD,LPSTR,DWORD,REGSAM,
-                             LPSECURITY_ATTRIBUTES,LPHKEY,LPDWORD);
-DWORD      RegCreateKeyEx32W(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,
-                             LPSECURITY_ATTRIBUTES,LPHKEY,LPDWORD);
-#define    RegCreateKeyEx WINELIB_NAME_AW(RegCreateKeyEx)
-DWORD      RegEnumKeyEx32A(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPSTR,LPDWORD,LPFILETIME);
-DWORD      RegEnumKeyEx32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPWSTR,LPDWORD,LPFILETIME);
-#define    RegEnumKeyEx WINELIB_NAME_AW(RegEnumKeyEx)
-DWORD      RegOpenKeyEx32W(HKEY,LPCWSTR,DWORD,REGSAM,LPHKEY);
-DWORD      RegOpenKeyEx32A(HKEY,LPCSTR,DWORD,REGSAM,LPHKEY);
-#define    RegOpenKeyEx WINELIB_NAME_AW(RegOpenKeyEx)
-DWORD      RegQueryInfoKey32W(HKEY,LPWSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,
-                            LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPFILETIME);
-DWORD      RegQueryInfoKey32A(HKEY,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,
-                            LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPFILETIME);
-#define    RegQueryInfoKey WINELIB_NAME_AW(RegQueryInfoKey)
-BOOL32     ReleaseSemaphore(HANDLE32,LONG,LPLONG);
-VOID       RtlFillMemory(LPVOID,UINT32,UINT32);
-VOID       RtlMoveMemory(LPVOID,LPCVOID,UINT32);
-VOID       RtlZeroMemory(LPVOID,UINT32);
-DWORD      SearchPath32A(LPCSTR,LPCSTR,LPCSTR,DWORD,LPSTR,LPSTR*);
-DWORD      SearchPath32W(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*);
-#define    SearchPath WINELIB_NAME(SearchPath)
-BOOL32     SetBrushOrgEx(HDC32,INT32,INT32,LPPOINT32);
-BOOL32     SetCommMask(INT32,DWORD);
-BOOL32     SetCommTimeouts(INT32,LPCOMMTIMEOUTS);
-BOOL32     SetConsoleTitle32A(LPCSTR);
-BOOL32     SetConsoleTitle32W(LPCWSTR);
-#define    SetConsoleTitle WINELIB_NAME_AW(SetConsoleTitle)
-BOOL32     SetEndOfFile(HFILE32);
-BOOL32     SetEnvironmentVariable32A(LPCSTR,LPCSTR);
-BOOL32     SetEnvironmentVariable32W(LPCWSTR,LPCWSTR);
-#define    SetEnvironmentVariable WINELIB_NAME_AW(SetEnvironmentVariable)
-DWORD      SetFilePointer(HFILE32,LONG,LPLONG,DWORD);
-BOOL32     SetFileTime(HFILE32,const FILETIME*,const FILETIME*,const FILETIME*);
-VOID       SetLastErrorEx(DWORD,DWORD);
-BOOL32     SetPriorityClass(HANDLE32,DWORD);
-BOOL32     SetStdHandle(DWORD,HANDLE32);
-BOOL32     SetSystemPowerState(BOOL32,BOOL32);
-BOOL32     SetSystemTime(const SYSTEMTIME*);
-BOOL32     SetThreadPriority(HANDLE32,INT32);
-BOOL32     SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION);
-VOID       Sleep(DWORD);
-BOOL32     SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME);
-BOOL32     TrackPopupMenuEx(HMENU32,UINT32,INT32,INT32,HWND32,LPTPMPARAMS);
-DWORD      TlsAlloc(void);
-BOOL32     TlsFree(DWORD);
-LPVOID     TlsGetValue(DWORD);
-BOOL32     TlsSetValue(DWORD,LPVOID);
-VOID       UnMapLS(SEGPTR);
-BOOL32     UnlockFile(HFILE32,DWORD,DWORD,DWORD,DWORD);
-BOOL32     UnmapViewOfFile(LPVOID);
-LPVOID     VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
-BOOL32     VirtualFree(LPVOID,DWORD,DWORD);
-BOOL32     VirtualLock(LPVOID,DWORD);
-BOOL32     VirtualProtect(LPVOID,DWORD,DWORD,LPDWORD);
-BOOL32     VirtualProtectEx(HANDLE32,LPVOID,DWORD,DWORD,LPDWORD);
-BOOL32     VirtualQuery(LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
-BOOL32     VirtualQueryEx(HANDLE32,LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
-BOOL32     VirtualUnlock(LPVOID,DWORD);
-BOOL32     WriteConsole32A(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
-BOOL32     WriteConsole32W(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
-#define    WriteConsole WINELIB_NAME_AW(WriteConsole)
-BOOL32     WriteFile(HFILE32,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
+
+BOOL32      WINAPI AreFileApisANSI(void);
+BOOL32      WINAPI Beep(DWORD,DWORD);
+BOOL32      WINAPI ClearCommError(INT32,LPDWORD,LPCOMSTAT);
+BOOL32      WINAPI CloseHandle(HANDLE32);
+BOOL32      WINAPI CopyFile32A(LPCSTR,LPCSTR,BOOL32);
+BOOL32      WINAPI CopyFile32W(LPCWSTR,LPCWSTR,BOOL32);
+#define     CopyFile WINELIB_NAME_AW(CopyFile)
+INT32       WINAPI CompareFileTime(LPFILETIME,LPFILETIME);
+HANDLE32    WINAPI CreateEvent32A(LPSECURITY_ATTRIBUTES,BOOL32,BOOL32,LPCSTR);
+HANDLE32    WINAPI CreateEvent32W(LPSECURITY_ATTRIBUTES,BOOL32,BOOL32,LPCWSTR);
+#define     CreateEvent WINELIB_NAME_AW(CreateEvent)
+HFILE32     WINAPI CreateFile32A(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,
+                                 DWORD,DWORD,HANDLE32);
+HFILE32     WINAPI CreateFile32W(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,
+                                 DWORD,DWORD,HANDLE32);
+#define     CreateFile WINELIB_NAME_AW(CreateFile)
+HANDLE32    WINAPI CreateFileMapping32A(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,
+                                        DWORD,DWORD,LPCSTR);
+HANDLE32    WINAPI CreateFileMapping32W(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,
+                                        DWORD,DWORD,LPCWSTR);
+#define     CreateFileMapping WINELIB_NAME_AW(CreateFileMapping)
+HANDLE32    WINAPI CreateMutex32A(LPSECURITY_ATTRIBUTES,BOOL32,LPCSTR);
+HANDLE32    WINAPI CreateMutex32W(LPSECURITY_ATTRIBUTES,BOOL32,LPCWSTR);
+#define     CreateMutex WINELIB_NAME_AW(CreateMutex)
+HANDLE32    WINAPI CreateSemaphore32A(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCSTR);
+HANDLE32    WINAPI CreateSemaphore32W(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR);
+#define     CreateSemaphore WINELIB_NAME_AW(CreateSemaphore)
+BOOL32      WINAPI DisableThreadLibraryCalls(HMODULE32);
+BOOL32      WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME);
+INT32       WINAPI EnumPropsEx32A(HWND32,PROPENUMPROCEX32A,LPARAM);
+INT32       WINAPI EnumPropsEx32W(HWND32,PROPENUMPROCEX32W,LPARAM);
+#define     EnumPropsEx WINELIB_NAME_AW(EnumPropsEx)
+BOOL32      WINAPI EnumResourceLanguages32A(HMODULE32,LPCSTR,LPCSTR,
+                                            ENUMRESLANGPROC32A,LONG);
+BOOL32      WINAPI EnumResourceLanguages32W(HMODULE32,LPCWSTR,LPCWSTR,
+                                            ENUMRESLANGPROC32W,LONG);
+#define     EnumResourceLanguages WINELIB_NAME_AW(EnumResourceLanguages)
+BOOL32      WINAPI EnumResourceNames32A(HMODULE32,LPCSTR,ENUMRESNAMEPROC32A,
+                                        LONG);
+BOOL32      WINAPI EnumResourceNames32W(HMODULE32,LPCWSTR,ENUMRESNAMEPROC32W,
+                                        LONG);
+#define     EnumResourceNames WINELIB_NAME_AW(EnumResourceNames)
+BOOL32      WINAPI EnumResourceTypes32A(HMODULE32,ENUMRESTYPEPROC32A,LONG);
+BOOL32      WINAPI EnumResourceTypes32W(HMODULE32,ENUMRESTYPEPROC32W,LONG);
+#define     EnumResourceTypes WINELIB_NAME_AW(EnumResourceTypes)
+BOOL32      WINAPI EnumSystemCodePages32A(CODEPAGE_ENUMPROC32A,DWORD);
+BOOL32      WINAPI EnumSystemCodePages32W(CODEPAGE_ENUMPROC32W,DWORD);
+#define     EnumSystemCodePages WINELIB_NAME_AW(EnumSystemCodePages)
+BOOL32      WINAPI EnumSystemLocales32A(LOCALE_ENUMPROC32A,DWORD);
+BOOL32      WINAPI EnumSystemLocales32W(LOCALE_ENUMPROC32W,DWORD);
+#define     EnumSystemLocales WINELIB_NAME_AW(EnumSystemLocales)
+BOOL32      WINAPI EnumThreadWindows(DWORD,WNDENUMPROC32,LPARAM);
+void        WINAPI ExitProcess(DWORD);
+BOOL32      WINAPI ExitWindowsEx(UINT32,DWORD);
+DWORD       WINAPI ExpandEnvironmentStrings32A(LPCSTR,LPSTR,DWORD);
+DWORD       WINAPI ExpandEnvironmentStrings32W(LPCWSTR,LPWSTR,DWORD);
+#define     ExpandEnvironmentStrings WINELIB_NAME_AW(ExpandEnvironmentStrings)
+BOOL32      WINAPI FileTimeToDosDateTime(const FILETIME*,LPWORD,LPWORD);
+BOOL32      WINAPI FileTimeToLocalFileTime(const FILETIME*,LPFILETIME);
+BOOL32      WINAPI FileTimeToSystemTime(const FILETIME*,LPSYSTEMTIME);
+HRSRC32     WINAPI FindResourceEx32A(HINSTANCE32,LPCSTR,LPCSTR,WORD);
+HRSRC32     WINAPI FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD);
+#define     FindResourceEx WINELIB_NAME_AW(FindResourceEx)
+BOOL32      WINAPI FlushFileBuffers(HFILE32);
+BOOL32      WINAPI FreeEnvironmentStrings32A(LPSTR);
+BOOL32      WINAPI FreeEnvironmentStrings32W(LPWSTR);
+#define     FreeEnvironmentStrings WINELIB_NAME_AW(FreeEnvironmentStrings)
+UINT32      WINAPI GetACP(void);
+LPCSTR      WINAPI GetCommandLine32A();
+LPCWSTR     WINAPI GetCommandLine32W();
+#define     GetCommandLine WINELIB_NAME_AW(GetCommandLine)
+BOOL32      WINAPI GetCommTimeouts(INT32,LPCOMMTIMEOUTS);
+BOOL32      WINAPI GetComputerName32A(LPSTR,LPDWORD);
+BOOL32      WINAPI GetComputerName32W(LPWSTR,LPDWORD);
+#define     GetComputerName WINELIB_NAME_AW(GetComputerName)
+BOOL32      WINAPI GetCPInfo(UINT32,LPCPINFO);
+HANDLE32    WINAPI GetCurrentProcess(void);
+DWORD       WINAPI GetCurrentProcessId(void);
+HANDLE32    WINAPI GetCurrentThread(void);
+DWORD       WINAPI GetCurrentThreadId(void);
+BOOL32      WINAPI GetDCOrgEx(HDC32,LPPOINT32);
+LPSTR       WINAPI GetEnvironmentStrings32A(void);
+LPWSTR      WINAPI GetEnvironmentStrings32W(void);
+#define     GetEnvironmentStrings WINELIB_NAME_AW(GetEnvironmentStrings)
+DWORD       WINAPI GetEnvironmentVariable32A(LPCSTR,LPSTR,DWORD);
+DWORD       WINAPI GetEnvironmentVariable32W(LPCWSTR,LPWSTR,DWORD);
+#define     GetEnvironmentVariable WINELIB_NAME_AW(GetEnvironmentVariable)
+DWORD       WINAPI GetFileInformationByHandle(HFILE32,BY_HANDLE_FILE_INFORMATION*);
+DWORD       WINAPI GetFileSize(HFILE32,LPDWORD);
+BOOL32      WINAPI GetFileTime(HFILE32,LPFILETIME,LPFILETIME,LPFILETIME);
+DWORD       WINAPI GetFileType(HFILE32);
+DWORD       WINAPI GetFullPathName32A(LPCSTR,DWORD,LPSTR,LPSTR*);
+DWORD       WINAPI GetFullPathName32W(LPCWSTR,DWORD,LPWSTR,LPWSTR*);
+#define     GetFullPathName WINELIB_NAME_AW(GetFullPathName)
+VOID        WINAPI GetLocalTime(LPSYSTEMTIME);
+DWORD       WINAPI GetLogicalDrives(void);
+BOOL32      WINAPI GetMenuItemInfo32A(HMENU32,UINT32,BOOL32,MENUITEMINFO32A*);
+BOOL32      WINAPI GetMenuItemInfo32W(HMENU32,UINT32,BOOL32,MENUITEMINFO32W*);
+#define     GetMenuItemInfo WINELIB_NAME_AW(GetMenuItemInfo)
+UINT32      WINAPI GetOEMCP(void);
+DWORD       WINAPI GetPriorityClass(HANDLE32);
+HANDLE32    WINAPI GetProcessHeap(void);
+DWORD       WINAPI GetShortPathName32A(LPCSTR,LPSTR,DWORD);
+DWORD       WINAPI GetShortPathName32W(LPCWSTR,LPWSTR,DWORD);
+#define     GetShortPathName WINELIB_NAME_AW(GetShortPathName)
+HFILE32     WINAPI GetStdHandle(DWORD);
+BOOL32      WINAPI GetStringTypeEx32A(LCID,DWORD,LPCSTR,INT32,LPWORD);
+BOOL32      WINAPI GetStringTypeEx32W(LCID,DWORD,LPCWSTR,INT32,LPWORD);
+#define     GetStringTypeEx WINELIB_NAME_AW(GetStringTypeEx)
+VOID        WINAPI GetSystemInfo(LPSYSTEM_INFO);
+BOOL32      WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
+VOID        WINAPI GetSystemTime(LPSYSTEMTIME);
+BOOL32      WINAPI GetTextExtentExPoint32A(HDC32,LPCSTR,INT32,INT32,
+                                           LPINT32,LPINT32,LPSIZE32);
+BOOL32      WINAPI GetTextExtentExPoint32W(HDC32,LPCWSTR,INT32,INT32,
+                                           LPINT32,LPINT32,LPSIZE32);
+#define     GetTextExtentExPoint WINELIB_NAME_AW(GetTextExtentExPoint)
+LCID        WINAPI GetThreadLocale();
+INT32       WINAPI GetThreadPriority(HANDLE32);
+BOOL32      WINAPI GetUserName32A(LPSTR,LPDWORD);
+BOOL32      WINAPI GetUserName32W(LPWSTR,LPDWORD);
+#define     GetUserName WINELIB_NAME_AW(GetUserName)
+DWORD       WINAPI GetWindowThreadProcessId(HWND32,LPDWORD);
+VOID        WINAPI GlobalMemoryStatus(LPMEMORYSTATUS);
+LPVOID      WINAPI HeapAlloc(HANDLE32,DWORD,DWORD);
+DWORD       WINAPI HeapCompact(HANDLE32,DWORD);
+HANDLE32    WINAPI HeapCreate(DWORD,DWORD,DWORD);
+BOOL32      WINAPI HeapDestroy(HANDLE32);
+BOOL32      WINAPI HeapFree(HANDLE32,DWORD,LPVOID);
+BOOL32      WINAPI HeapLock(HANDLE32);
+LPVOID      WINAPI HeapReAlloc(HANDLE32,DWORD,LPVOID,DWORD);
+DWORD       WINAPI HeapSize(HANDLE32,DWORD,LPVOID);
+BOOL32      WINAPI HeapUnlock(HANDLE32);
+BOOL32      WINAPI HeapValidate(HANDLE32,DWORD,LPVOID);
+BOOL32      WINAPI IsDBCSLeadByteEx(UINT32,BYTE);
+BOOL32      WINAPI IsWindowUnicode(HWND32);
+BOOL32      WINAPI IsValidLocale(DWORD,DWORD);
+BOOL32      WINAPI LocalFileTimeToFileTime(const FILETIME*,LPFILETIME);
+BOOL32      WINAPI LockFile(HFILE32,DWORD,DWORD,DWORD,DWORD);
+SEGPTR      WINAPI MapLS(LPVOID);
+LPVOID      WINAPI MapSL(SEGPTR);
+LPVOID      WINAPI MapViewOfFile(HANDLE32,DWORD,DWORD,DWORD,DWORD);
+LPVOID      WINAPI MapViewOfFileEx(HANDLE32,DWORD,DWORD,DWORD,DWORD,LPVOID);
+INT32       WINAPI MessageBoxEx32A(HWND32,LPCSTR,LPCSTR,UINT32,WORD);
+INT32       WINAPI MessageBoxEx32W(HWND32,LPCWSTR,LPCWSTR,UINT32,WORD);
+#define     MessageBoxEx WINELIB_NAME_AW(MessageBoxEx)
+BOOL32      WINAPI MoveFile32A(LPCSTR,LPCSTR);
+BOOL32      WINAPI MoveFile32W(LPCWSTR,LPCWSTR);
+#define     MoveFile WINELIB_NAME_AW(MoveFile)
+HANDLE32    WINAPI OpenEvent32A(DWORD,BOOL32,LPCSTR);
+HANDLE32    WINAPI OpenEvent32W(DWORD,BOOL32,LPCWSTR);
+#define     OpenEvent WINELIB_NAME_AW(OpenEvent)
+HANDLE32    WINAPI OpenFileMapping32A(DWORD,BOOL32,LPCSTR);
+HANDLE32    WINAPI OpenFileMapping32W(DWORD,BOOL32,LPCWSTR);
+#define     OpenFileMapping WINELIB_NAME_AW(OpenFileMapping)
+HANDLE32    WINAPI OpenMutex32A(DWORD,BOOL32,LPCSTR);
+HANDLE32    WINAPI OpenMutex32W(DWORD,BOOL32,LPCWSTR);
+#define     OpenMutex WINELIB_NAME_AW(OpenMutex)
+HANDLE32    WINAPI OpenSemaphore32A(DWORD,BOOL32,LPCSTR);
+HANDLE32    WINAPI OpenSemaphore32W(DWORD,BOOL32,LPCWSTR);
+#define     OpenSemaphore WINELIB_NAME_AW(OpenSemaphore)
+DWORD       WINAPI QueryDosDevice32A(LPCSTR,LPSTR,DWORD);
+DWORD       WINAPI QueryDosDevice32W(LPCWSTR,LPWSTR,DWORD);
+#define     QueryDosDevice WINELIB_NAME_AW(QueryDosDevice)
+BOOL32      WINAPI QueryPerformanceCounter(LPLARGE_INTEGER);
+BOOL32      WINAPI ReadConsole32A(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
+BOOL32      WINAPI ReadConsole32W(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
+#define     ReadConsole WINELIB_NAME_AW(ReadConsole)
+BOOL32      WINAPI ReadFile(HFILE32,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
+DWORD       WINAPI RegCreateKeyEx32A(HKEY,LPCSTR,DWORD,LPSTR,DWORD,REGSAM,
+                                     LPSECURITY_ATTRIBUTES,LPHKEY,LPDWORD);
+DWORD       WINAPI RegCreateKeyEx32W(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,
+                                     LPSECURITY_ATTRIBUTES,LPHKEY,LPDWORD);
+#define     RegCreateKeyEx WINELIB_NAME_AW(RegCreateKeyEx)
+DWORD       WINAPI RegEnumKeyEx32A(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPSTR,
+                                   LPDWORD,LPFILETIME);
+DWORD       WINAPI RegEnumKeyEx32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPWSTR,
+                                   LPDWORD,LPFILETIME);
+#define     RegEnumKeyEx WINELIB_NAME_AW(RegEnumKeyEx)
+DWORD       WINAPI RegOpenKeyEx32W(HKEY,LPCWSTR,DWORD,REGSAM,LPHKEY);
+DWORD       WINAPI RegOpenKeyEx32A(HKEY,LPCSTR,DWORD,REGSAM,LPHKEY);
+#define     RegOpenKeyEx WINELIB_NAME_AW(RegOpenKeyEx)
+DWORD       WINAPI RegQueryInfoKey32W(HKEY,LPWSTR,LPDWORD,LPDWORD,LPDWORD,
+                                      LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,
+                                      LPDWORD,LPFILETIME);
+DWORD       WINAPI RegQueryInfoKey32A(HKEY,LPSTR,LPDWORD,LPDWORD,LPDWORD,
+                                      LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,
+                                      LPDWORD,LPFILETIME);
+#define     RegQueryInfoKey WINELIB_NAME_AW(RegQueryInfoKey)
+BOOL32      WINAPI ReleaseSemaphore(HANDLE32,LONG,LPLONG);
+VOID        WINAPI RtlFillMemory(LPVOID,UINT32,UINT32);
+VOID        WINAPI RtlMoveMemory(LPVOID,LPCVOID,UINT32);
+VOID        WINAPI RtlZeroMemory(LPVOID,UINT32);
+DWORD       WINAPI SearchPath32A(LPCSTR,LPCSTR,LPCSTR,DWORD,LPSTR,LPSTR*);
+DWORD       WINAPI SearchPath32W(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*);
+#define     SearchPath WINELIB_NAME(SearchPath)
+BOOL32      WINAPI SetBrushOrgEx(HDC32,INT32,INT32,LPPOINT32);
+BOOL32      WINAPI SetCommMask(INT32,DWORD);
+BOOL32      WINAPI SetCommTimeouts(INT32,LPCOMMTIMEOUTS);
+BOOL32      WINAPI SetConsoleTitle32A(LPCSTR);
+BOOL32      WINAPI SetConsoleTitle32W(LPCWSTR);
+#define     SetConsoleTitle WINELIB_NAME_AW(SetConsoleTitle)
+BOOL32      WINAPI SetEndOfFile(HFILE32);
+BOOL32      WINAPI SetEnvironmentVariable32A(LPCSTR,LPCSTR);
+BOOL32      WINAPI SetEnvironmentVariable32W(LPCWSTR,LPCWSTR);
+#define     SetEnvironmentVariable WINELIB_NAME_AW(SetEnvironmentVariable)
+VOID        WINAPI SetFileApisToANSI(void);
+VOID        WINAPI SetFileApisToOEM(void);
+DWORD       WINAPI SetFilePointer(HFILE32,LONG,LPLONG,DWORD);
+BOOL32      WINAPI SetFileTime(HFILE32,const FILETIME*,const FILETIME*,
+                               const FILETIME*);
+VOID        WINAPI SetLastErrorEx(DWORD,DWORD);
+BOOL32      WINAPI SetMenuItemInfo32A(HMENU32,UINT32,BOOL32,const MENUITEMINFO32A*);
+BOOL32      WINAPI SetMenuItemInfo32W(HMENU32,UINT32,BOOL32,const MENUITEMINFO32W*);
+#define     SetMenuItemInfo WINELIB_NAME_AW(SetMenuItemInfo)
+BOOL32      WINAPI SetPriorityClass(HANDLE32,DWORD);
+BOOL32      WINAPI SetStdHandle(DWORD,HANDLE32);
+BOOL32      WINAPI SetSystemPowerState(BOOL32,BOOL32);
+BOOL32      WINAPI SetSystemTime(const SYSTEMTIME*);
+BOOL32      WINAPI SetThreadPriority(HANDLE32,INT32);
+BOOL32      WINAPI SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION);
+VOID        WINAPI Sleep(DWORD);
+BOOL32      WINAPI SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME);
+BOOL32      WINAPI TrackPopupMenuEx(HMENU32,UINT32,INT32,INT32,HWND32,
+                                    LPTPMPARAMS);
+DWORD       WINAPI TlsAlloc(void);
+BOOL32      WINAPI TlsFree(DWORD);
+LPVOID      WINAPI TlsGetValue(DWORD);
+BOOL32      WINAPI TlsSetValue(DWORD,LPVOID);
+VOID        WINAPI UnMapLS(SEGPTR);
+BOOL32      WINAPI UnlockFile(HFILE32,DWORD,DWORD,DWORD,DWORD);
+BOOL32      WINAPI UnmapViewOfFile(LPVOID);
+LPVOID      WINAPI VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
+BOOL32      WINAPI VirtualFree(LPVOID,DWORD,DWORD);
+BOOL32      WINAPI VirtualLock(LPVOID,DWORD);
+BOOL32      WINAPI VirtualProtect(LPVOID,DWORD,DWORD,LPDWORD);
+BOOL32      WINAPI VirtualProtectEx(HANDLE32,LPVOID,DWORD,DWORD,LPDWORD);
+BOOL32      WINAPI VirtualQuery(LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
+BOOL32      WINAPI VirtualQueryEx(HANDLE32,LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
+BOOL32      WINAPI VirtualUnlock(LPVOID,DWORD);
+BOOL32      WINAPI WriteConsole32A(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
+BOOL32      WINAPI WriteConsole32W(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
+#define     WriteConsole WINELIB_NAME_AW(WriteConsole)
+BOOL32      WINAPI WriteFile(HFILE32,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
 
 
 /* Declarations for functions that are the same in Win16 and Win32 */
 
-VOID       CloseSound(VOID);
-DWORD      GetDialogBaseUnits(void);
-VOID       GetKeyboardState(LPBYTE);
-DWORD      GetLastError(void);
-DWORD      GetMenuCheckMarkDimensions(void);
-LONG       GetMessageExtraInfo(void);
-DWORD      GetMessagePos(void);
-LONG       GetMessageTime(void);
-DWORD      GetTickCount(void);
-ATOM       GlobalDeleteAtom(ATOM);
-VOID       LZDone(void);
-DWORD      OemKeyScan(WORD);
-DWORD      RegCloseKey(HKEY);
-DWORD      RegFlushKey(HKEY);
-VOID       ReleaseCapture(void);
-VOID       SetKeyboardState(LPBYTE);
-VOID       SetLastError(DWORD);
-VOID       WaitMessage(VOID);
+VOID        WINAPI CloseSound(VOID);
+VOID        WINAPI EndMenu(void);
+DWORD       WINAPI GetDialogBaseUnits(void);
+VOID        WINAPI GetKeyboardState(LPBYTE);
+DWORD       WINAPI GetLastError(void);
+DWORD       WINAPI GetMenuCheckMarkDimensions(void);
+LONG        WINAPI GetMessageExtraInfo(void);
+DWORD       WINAPI GetMessagePos(void);
+LONG        WINAPI GetMessageTime(void);
+DWORD       WINAPI GetTickCount(void);
+ATOM        WINAPI GlobalDeleteAtom(ATOM);
+VOID        WINAPI LZDone(void);
+DWORD       WINAPI OemKeyScan(WORD);
+DWORD       WINAPI RegCloseKey(HKEY);
+DWORD       WINAPI RegFlushKey(HKEY);
+VOID        WINAPI ReleaseCapture(void);
+VOID        WINAPI SetKeyboardState(LPBYTE);
+VOID        WINAPI SetLastError(DWORD);
+VOID        WINAPI WaitMessage(VOID);
 
 
 /* Declarations for functions that change between Win16 and Win32 */
 
-INT16      AccessResource16(HINSTANCE16,HRSRC16);
-INT32      AccessResource32(HINSTANCE32,HRSRC32);
-#define    AccessResource WINELIB_NAME(AccessResource)
-ATOM       AddAtom16(SEGPTR);
-ATOM       AddAtom32A(LPCSTR);
-ATOM       AddAtom32W(LPCWSTR);
-#define    AddAtom WINELIB_NAME_AW(AddAtom)
-INT16      AddFontResource16(LPCSTR);
-INT32      AddFontResource32A(LPCSTR);
-INT32      AddFontResource32W(LPCWSTR);
-#define    AddFontResource WINELIB_NAME_AW(AddFontResource)
-BOOL16     AdjustWindowRect16(LPRECT16,DWORD,BOOL16);
-BOOL32     AdjustWindowRect32(LPRECT32,DWORD,BOOL32);
-#define    AdjustWindowRect WINELIB_NAME(AdjustWindowRect)
-BOOL16     AdjustWindowRectEx16(LPRECT16,DWORD,BOOL16,DWORD);
-BOOL32     AdjustWindowRectEx32(LPRECT32,DWORD,BOOL32,DWORD);
-#define    AdjustWindowRectEx WINELIB_NAME(AdjustWindowRectEx)
-HGLOBAL16  AllocResource16(HINSTANCE16,HRSRC16,DWORD);
-HGLOBAL32  AllocResource32(HINSTANCE32,HRSRC32,DWORD);
-#define    AllocResource WINELIB_NAME(AllocResource)
-BOOL16     AnimatePalette16(HPALETTE16,UINT16,UINT16,LPPALETTEENTRY);
-BOOL32     AnimatePalette32(HPALETTE32,UINT32,UINT32,LPPALETTEENTRY);
-#define    AnimatePalette WINELIB_NAME(AnimatePalette)
-SEGPTR     AnsiLower16(SEGPTR);
-#define    AnsiLower32A CharLower32A
-#define    AnsiLower32W CharLower32W
-#define    AnsiLower WINELIB_NAME_AW(AnsiLower)
-UINT16     AnsiLowerBuff16(LPSTR,UINT16);
-#define    AnsiLowerBuff32A CharLowerBuff32A
-#define    AnsiLowerBuff32W CharLowerBuff32W
-#define    AnsiLowerBuff WINELIB_NAME_AW(AnsiLowerBuff)
-SEGPTR     AnsiNext16(SEGPTR);
-#define    AnsiNext32A CharNext32A
-#define    AnsiNext32W CharNext32W
-#define    AnsiNext WINELIB_NAME_AW(AnsiNext)
-SEGPTR     AnsiPrev16(SEGPTR,SEGPTR);
-#define    AnsiPrev32A CharPrev32A
-#define    AnsiPrev32W CharPrev32W
-#define    AnsiPrev WINELIB_NAME_AW(AnsiPrev)
-INT16      AnsiToOem16(LPCSTR,LPSTR);
-#define    AnsiToOem32A CharToOem32A
-#define    AnsiToOem32W CharToOem32W
-#define    AnsiToOem WINELIB_NAME_AW(AnsiToOem)
-VOID       AnsiToOemBuff16(LPCSTR,LPSTR,UINT16);
-#define    AnsiToOemBuff32A CharToOemBuff32A
-#define    AnsiToOemBuff32W CharToOemBuff32W
-#define    AnsiToOemBuff WINELIB_NAME_AW(AnsiToOemBuff)
-SEGPTR     AnsiUpper16(SEGPTR);
-#define    AnsiUpper32A CharUpper32A
-#define    AnsiUpper32W CharUpper32W
-#define    AnsiUpper WINELIB_NAME_AW(AnsiUpper)
-UINT16     AnsiUpperBuff16(LPSTR,UINT16);
-#define    AnsiUpperBuff32A CharUpperBuff32A
-#define    AnsiUpperBuff32W CharUpperBuff32W
-#define    AnsiUpperBuff WINELIB_NAME_AW(AnsiUpperBuff)
-BOOL16     AnyPopup16(void);
-BOOL32     AnyPopup32(void);
-#define    AnyPopup WINELIB_NAME(AnyPopup)
-BOOL16     AppendMenu16(HMENU16,UINT16,UINT16,SEGPTR);
-BOOL32     AppendMenu32A(HMENU32,UINT32,UINT32,LPCSTR);
-BOOL32     AppendMenu32W(HMENU32,UINT32,UINT32,LPCWSTR);
-#define    AppendMenu WINELIB_NAME_AW(AppendMenu)
-BOOL16     Arc16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16);
-BOOL32     Arc32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32);
-#define    Arc WINELIB_NAME(Arc)
-UINT16     ArrangeIconicWindows16(HWND16);
-UINT32     ArrangeIconicWindows32(HWND32);
-#define    ArrangeIconicWindows WINELIB_NAME(ArrangeIconicWindows)
-HDWP16     BeginDeferWindowPos16(INT16);
-HDWP32     BeginDeferWindowPos32(INT32);
-#define    BeginDeferWindowPos WINELIB_NAME(BeginDeferWindowPos)
-HDC16      BeginPaint16(HWND16,LPPAINTSTRUCT16);
-HDC32      BeginPaint32(HWND32,LPPAINTSTRUCT32);
-#define    BeginPaint WINELIB_NAME(BeginPaint)
-BOOL16     BitBlt16(HDC16,INT16,INT16,INT16,INT16,HDC16,INT16,INT16,DWORD);
-BOOL32     BitBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,INT32,DWORD);
-#define    BitBlt WINELIB_NAME(BitBlt)
-BOOL16     BringWindowToTop16(HWND16);
-BOOL32     BringWindowToTop32(HWND32);
-#define    BringWindowToTop WINELIB_NAME(BringWindowToTop)
-BOOL16     BuildCommDCB16(LPCSTR,LPDCB16);
-BOOL32     BuildCommDCB32A(LPCSTR,LPDCB32);
-BOOL32     BuildCommDCB32W(LPCWSTR,LPDCB32);
-#define    BuildCommDCB WINELIB_NAME_AW(BuildCommDCB)
-BOOL32     BuildCommDCBAndTimeouts32A(LPCSTR,LPDCB32,LPCOMMTIMEOUTS);
-BOOL32     BuildCommDCBAndTimeouts32W(LPCWSTR,LPDCB32,LPCOMMTIMEOUTS);
-#define    BuildCommDCBAndTimeouts WINELIB_NAME_AW(BuildCommDCBAndTimeouts)
-BOOL16     CallMsgFilter16(SEGPTR,INT16);
-BOOL32     CallMsgFilter32A(LPMSG32,INT32);
-BOOL32     CallMsgFilter32W(LPMSG32,INT32);
-#define    CallMsgFilter WINELIB_NAME_AW(CallMsgFilter)
-LRESULT    CallNextHookEx16(HHOOK,INT16,WPARAM16,LPARAM);
-LRESULT    CallNextHookEx32(HHOOK,INT32,WPARAM32,LPARAM);
-#define    CallNextHookEx WINELIB_NAME(CallNextHookEx)
-LRESULT    CallWindowProc16(WNDPROC16,HWND16,UINT16,WPARAM16,LPARAM);
-LRESULT    CallWindowProc32A(WNDPROC32,HWND32,UINT32,WPARAM32,LPARAM);
-LRESULT    CallWindowProc32W(WNDPROC32,HWND32,UINT32,WPARAM32,LPARAM);
-#define    CallWindowProc WINELIB_NAME_AW(CallWindowProc)
-BOOL16     ChangeClipboardChain16(HWND16,HWND16);
-BOOL32     ChangeClipboardChain32(HWND32,HWND32);
-#define    ChangeClipboardChain WINELIB_NAME(ChangeClipboardChain)
-BOOL16     ChangeMenu16(HMENU16,UINT16,SEGPTR,UINT16,UINT16);
-BOOL32     ChangeMenu32A(HMENU32,UINT32,LPCSTR,UINT32,UINT32);
-BOOL32     ChangeMenu32W(HMENU32,UINT32,LPCWSTR,UINT32,UINT32);
-#define    ChangeMenu WINELIB_NAME_AW(ChangeMenu)
-LPSTR      CharLower32A(LPSTR);
-LPWSTR     CharLower32W(LPWSTR);
-#define    CharLower WINELIB_NAME_AW(CharLower)
-DWORD      CharLowerBuff32A(LPSTR,DWORD);
-DWORD      CharLowerBuff32W(LPWSTR,DWORD);
-#define    CharLowerBuff WINELIB_NAME_AW(CharLowerBuff)
-LPSTR      CharNext32A(LPCSTR);
-LPWSTR     CharNext32W(LPCWSTR);
-#define    CharNext WINELIB_NAME_AW(CharNext)
-LPSTR      CharNextEx32A(WORD,LPCSTR,DWORD);
-LPWSTR     CharNextEx32W(WORD,LPCWSTR,DWORD);
-#define    CharNextEx WINELIB_NAME_AW(CharNextEx)
-LPSTR      CharPrev32A(LPCSTR,LPCSTR);
-LPWSTR     CharPrev32W(LPCWSTR,LPCWSTR);
-#define    CharPrev WINELIB_NAME_AW(CharPrev)
-LPSTR      CharPrevEx32A(WORD,LPCSTR,LPCSTR,DWORD);
-LPWSTR     CharPrevEx32W(WORD,LPCWSTR,LPCWSTR,DWORD);
-#define    CharPrevEx WINELIB_NAME_AW(CharPrevEx)
-LPSTR      CharUpper32A(LPSTR);
-LPWSTR     CharUpper32W(LPWSTR);
-#define    CharUpper WINELIB_NAME_AW(CharUpper)
-DWORD      CharUpperBuff32A(LPSTR,DWORD);
-DWORD      CharUpperBuff32W(LPWSTR,DWORD);
-#define    CharUpperBuff WINELIB_NAME_AW(CharUpperBuff)
-BOOL32     CharToOem32A(LPCSTR,LPSTR);
-BOOL32     CharToOem32W(LPCWSTR,LPSTR);
-#define    CharToOem WINELIB_NAME_AW(CharToOem)
-BOOL32     CharToOemBuff32A(LPCSTR,LPSTR,DWORD);
-BOOL32     CharToOemBuff32W(LPCWSTR,LPSTR,DWORD);
-#define    CharToOemBuff WINELIB_NAME_AW(CharToOemBuff)
-BOOL16     CheckDlgButton16(HWND16,INT16,UINT16);
-BOOL32     CheckDlgButton32(HWND32,INT32,UINT32);
-#define    CheckDlgButton WINELIB_NAME(CheckDlgButton)
-BOOL16     CheckMenuItem16(HMENU16,UINT16,UINT16);
-DWORD      CheckMenuItem32(HMENU32,UINT32,UINT32);
-#define    CheckMenuItem WINELIB_NAME(CheckMenuItem)
-BOOL16     CheckRadioButton16(HWND16,UINT16,UINT16,UINT16);
-BOOL32     CheckRadioButton32(HWND32,UINT32,UINT32,UINT32);
-#define    CheckRadioButton WINELIB_NAME(CheckRadioButton)
-HWND16     ChildWindowFromPoint16(HWND16,POINT16);
-HWND32     ChildWindowFromPoint32(HWND32,POINT32);
-#define    ChildWindowFromPoint WINELIB_NAME(ChildWindowFromPoint)
-BOOL16     Chord16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16);
-BOOL32     Chord32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32);
-#define    Chord WINELIB_NAME(Chord)
-INT16      ClearCommBreak16(INT16);
-BOOL32     ClearCommBreak32(INT32);
-#define    ClearCommBreak WINELIB_NAME(ClearCommBreak)
-BOOL16     ClientToScreen16(HWND16,LPPOINT16);
-BOOL32     ClientToScreen32(HWND32,LPPOINT32);
-#define    ClientToScreen WINELIB_NAME(ClientToScreen)
-BOOL16     ClipCursor16(const RECT16*);
-BOOL32     ClipCursor32(const RECT32*);
-#define    ClipCursor WINELIB_NAME(ClipCursor)
-BOOL16     CloseClipboard16(void);
-BOOL32     CloseClipboard32(void);
-#define    CloseClipboard WINELIB_NAME(CloseClipboard)
-HMETAFILE16 CloseMetaFile16(HDC16);
-HMETAFILE32 CloseMetaFile32(HDC32);
-#define    CloseMetaFile WINELIB_NAME(CloseMetaFile)
-BOOL16     CloseWindow16(HWND16);
-BOOL32     CloseWindow32(HWND32);
-#define    CloseWindow WINELIB_NAME(CloseWindow)
-INT16      CombineRgn16(HRGN16,HRGN16,HRGN16,INT16);
-INT32      CombineRgn32(HRGN32,HRGN32,HRGN32,INT32);
-#define    CombineRgn WINELIB_NAME(CombineRgn)
-UINT16     CompareString16(DWORD,DWORD,LPCSTR,DWORD,LPCSTR,DWORD);
-UINT32     CompareString32A(DWORD,DWORD,LPCSTR,DWORD,LPCSTR,DWORD);
-UINT32     CompareString32W(DWORD,DWORD,LPCWSTR,DWORD,LPCWSTR,DWORD);
-#define    CompareString WINELIB_NAME_AW(CompareString)
-HCURSOR16  CopyCursor16(HINSTANCE16,HCURSOR16);
-#define    CopyCursor32(cur) ((HCURSOR32)CopyIcon32((HICON32)(cur)))
-#define    CopyCursor WINELIB_NAME(CopyCursor)
-HICON16    CopyIcon16(HINSTANCE16,HICON16);
-HICON32    CopyIcon32(HICON32);
-#define    CopyIcon WINELIB_NAME(CopyIcon)
-LONG       CopyLZFile16(HFILE16,HFILE16);
-LONG       CopyLZFile32(HFILE32,HFILE32);
-#define    CopyLZFile WINELIB_NAME(CopyLZFile)
-HMETAFILE16 CopyMetaFile16(HMETAFILE16,LPCSTR);
-HMETAFILE32 CopyMetaFile32A(HMETAFILE32,LPCSTR);
-HMETAFILE32 CopyMetaFile32W(HMETAFILE32,LPCWSTR);
-#define    CopyMetaFile WINELIB_NAME_AW(CopyMetaFile)
-BOOL16     CopyRect16(RECT16*,const RECT16*);
-BOOL32     CopyRect32(RECT32*,const RECT32*);
-#define    CopyRect WINELIB_NAME(CopyRect)
-INT16      CountClipboardFormats16(void);
-INT32      CountClipboardFormats32(void);
-#define    CountClipboardFormats WINELIB_NAME(CountClipboardFormats)
-INT16      CountVoiceNotes16(INT16);
-DWORD      CountVoiceNotes32(DWORD);
-#define    CountVoiceNotes WINELIB_NAME(CountVoiceNotes)
-HBITMAP16  CreateBitmap16(INT16,INT16,UINT16,UINT16,LPCVOID);
-HBITMAP32  CreateBitmap32(INT32,INT32,UINT32,UINT32,LPCVOID);
-#define    CreateBitmap WINELIB_NAME(CreateBitmap)
-HBITMAP16  CreateBitmapIndirect16(const BITMAP16*);
-HBITMAP32  CreateBitmapIndirect32(const BITMAP32*);
-#define    CreateBitmapIndirect WINELIB_NAME(CreateBitmapIndirect)
-HBRUSH16   CreateBrushIndirect16(const LOGBRUSH16*);
-HBRUSH32   CreateBrushIndirect32(const LOGBRUSH32*);
-#define    CreateBrushIndirect WINELIB_NAME(CreateBrushIndirect)
-VOID       CreateCaret16(HWND16,HBITMAP16,INT16,INT16);
-BOOL32     CreateCaret32(HWND32,HBITMAP32,INT32,INT32);
-#define    CreateCaret WINELIB_NAME(CreateCaret)
-HBITMAP16  CreateCompatibleBitmap16(HDC16,INT16,INT16);
-HBITMAP32  CreateCompatibleBitmap32(HDC32,INT32,INT32);
-#define    CreateCompatibleBitmap WINELIB_NAME(CreateCompatibleBitmap)
-HDC16      CreateCompatibleDC16(HDC16);
-HDC32      CreateCompatibleDC32(HDC32);
-#define    CreateCompatibleDC WINELIB_NAME(CreateCompatibleDC)
-HCURSOR16  CreateCursor16(HINSTANCE16,INT16,INT16,INT16,INT16,LPCVOID,LPCVOID);
-HCURSOR32  CreateCursor32(HINSTANCE32,INT32,INT32,INT32,INT32,LPCVOID,LPCVOID);
-#define    CreateCursor WINELIB_NAME(CreateCursor)
-HDC16      CreateDC16(LPCSTR,LPCSTR,LPCSTR,const DEVMODE16*);
-HDC32      CreateDC32A(LPCSTR,LPCSTR,LPCSTR,const DEVMODE32A*);
-HDC32      CreateDC32W(LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODE32W*);
-#define    CreateDC WINELIB_NAME_AW(CreateDC)
-HWND16     CreateDialog16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16);
-#define    CreateDialog32A(inst,ptr,hwnd,dlg) \
+LRESULT     WINAPI AboutDlgProc16(HWND16,UINT16,WPARAM16,LPARAM);
+LRESULT     WINAPI AboutDlgProc32(HWND32,UINT32,WPARAM32,LPARAM);
+#define     AboutDlgProc WINELIB_NAME(AboutDlgProc)
+INT16       WINAPI AccessResource16(HINSTANCE16,HRSRC16);
+INT32       WINAPI AccessResource32(HINSTANCE32,HRSRC32);
+#define     AccessResource WINELIB_NAME(AccessResource)
+ATOM        WINAPI AddAtom16(SEGPTR);
+ATOM        WINAPI AddAtom32A(LPCSTR);
+ATOM        WINAPI AddAtom32W(LPCWSTR);
+#define     AddAtom WINELIB_NAME_AW(AddAtom)
+INT16       WINAPI AddFontResource16(LPCSTR);
+INT32       WINAPI AddFontResource32A(LPCSTR);
+INT32       WINAPI AddFontResource32W(LPCWSTR);
+#define     AddFontResource WINELIB_NAME_AW(AddFontResource)
+BOOL16      WINAPI AdjustWindowRect16(LPRECT16,DWORD,BOOL16);
+BOOL32      WINAPI AdjustWindowRect32(LPRECT32,DWORD,BOOL32);
+#define     AdjustWindowRect WINELIB_NAME(AdjustWindowRect)
+BOOL16      WINAPI AdjustWindowRectEx16(LPRECT16,DWORD,BOOL16,DWORD);
+BOOL32      WINAPI AdjustWindowRectEx32(LPRECT32,DWORD,BOOL32,DWORD);
+#define     AdjustWindowRectEx WINELIB_NAME(AdjustWindowRectEx)
+HGLOBAL16   WINAPI AllocResource16(HINSTANCE16,HRSRC16,DWORD);
+HGLOBAL32   WINAPI AllocResource32(HINSTANCE32,HRSRC32,DWORD);
+#define     AllocResource WINELIB_NAME(AllocResource)
+void        WINAPI AnimatePalette16(HPALETTE16,UINT16,UINT16,LPPALETTEENTRY);
+BOOL32      WINAPI AnimatePalette32(HPALETTE32,UINT32,UINT32,LPPALETTEENTRY);
+#define     AnimatePalette WINELIB_NAME(AnimatePalette)
+SEGPTR      WINAPI AnsiLower16(SEGPTR);
+#define     AnsiLower32A CharLower32A
+#define     AnsiLower32W CharLower32W
+#define     AnsiLower WINELIB_NAME_AW(AnsiLower)
+UINT16      WINAPI AnsiLowerBuff16(LPSTR,UINT16);
+#define     AnsiLowerBuff32A CharLowerBuff32A
+#define     AnsiLowerBuff32W CharLowerBuff32W
+#define     AnsiLowerBuff WINELIB_NAME_AW(AnsiLowerBuff)
+SEGPTR      WINAPI AnsiNext16(SEGPTR);
+#define     AnsiNext32A CharNext32A
+#define     AnsiNext32W CharNext32W
+#define     AnsiNext WINELIB_NAME_AW(AnsiNext)
+SEGPTR      WINAPI AnsiPrev16(SEGPTR,SEGPTR);
+#define     AnsiPrev32A CharPrev32A
+#define     AnsiPrev32W CharPrev32W
+#define     AnsiPrev WINELIB_NAME_AW(AnsiPrev)
+INT16       WINAPI AnsiToOem16(LPCSTR,LPSTR);
+#define     AnsiToOem32A CharToOem32A
+#define     AnsiToOem32W CharToOem32W
+#define     AnsiToOem WINELIB_NAME_AW(AnsiToOem)
+VOID        WINAPI AnsiToOemBuff16(LPCSTR,LPSTR,UINT16);
+#define     AnsiToOemBuff32A CharToOemBuff32A
+#define     AnsiToOemBuff32W CharToOemBuff32W
+#define     AnsiToOemBuff WINELIB_NAME_AW(AnsiToOemBuff)
+SEGPTR      WINAPI AnsiUpper16(SEGPTR);
+#define     AnsiUpper32A CharUpper32A
+#define     AnsiUpper32W CharUpper32W
+#define     AnsiUpper WINELIB_NAME_AW(AnsiUpper)
+UINT16      WINAPI AnsiUpperBuff16(LPSTR,UINT16);
+#define     AnsiUpperBuff32A CharUpperBuff32A
+#define     AnsiUpperBuff32W CharUpperBuff32W
+#define     AnsiUpperBuff WINELIB_NAME_AW(AnsiUpperBuff)
+BOOL16      WINAPI AnyPopup16(void);
+BOOL32      WINAPI AnyPopup32(void);
+#define     AnyPopup WINELIB_NAME(AnyPopup)
+BOOL16      WINAPI AppendMenu16(HMENU16,UINT16,UINT16,SEGPTR);
+BOOL32      WINAPI AppendMenu32A(HMENU32,UINT32,UINT32,LPCSTR);
+BOOL32      WINAPI AppendMenu32W(HMENU32,UINT32,UINT32,LPCWSTR);
+#define     AppendMenu WINELIB_NAME_AW(AppendMenu)
+BOOL16      WINAPI Arc16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16);
+BOOL32      WINAPI Arc32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32);
+#define     Arc WINELIB_NAME(Arc)
+UINT16      WINAPI ArrangeIconicWindows16(HWND16);
+UINT32      WINAPI ArrangeIconicWindows32(HWND32);
+#define     ArrangeIconicWindows WINELIB_NAME(ArrangeIconicWindows)
+HDWP16      WINAPI BeginDeferWindowPos16(INT16);
+HDWP32      WINAPI BeginDeferWindowPos32(INT32);
+#define     BeginDeferWindowPos WINELIB_NAME(BeginDeferWindowPos)
+HDC16       WINAPI BeginPaint16(HWND16,LPPAINTSTRUCT16);
+HDC32       WINAPI BeginPaint32(HWND32,LPPAINTSTRUCT32);
+#define     BeginPaint WINELIB_NAME(BeginPaint)
+BOOL16      WINAPI BitBlt16(HDC16,INT16,INT16,INT16,INT16,HDC16,INT16,INT16,DWORD);
+BOOL32      WINAPI BitBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,INT32,DWORD);
+#define     BitBlt WINELIB_NAME(BitBlt)
+BOOL16      WINAPI BringWindowToTop16(HWND16);
+BOOL32      WINAPI BringWindowToTop32(HWND32);
+#define     BringWindowToTop WINELIB_NAME(BringWindowToTop)
+BOOL16      WINAPI BuildCommDCB16(LPCSTR,LPDCB16);
+BOOL32      WINAPI BuildCommDCB32A(LPCSTR,LPDCB32);
+BOOL32      WINAPI BuildCommDCB32W(LPCWSTR,LPDCB32);
+#define     BuildCommDCB WINELIB_NAME_AW(BuildCommDCB)
+BOOL32      WINAPI BuildCommDCBAndTimeouts32A(LPCSTR,LPDCB32,LPCOMMTIMEOUTS);
+BOOL32      WINAPI BuildCommDCBAndTimeouts32W(LPCWSTR,LPDCB32,LPCOMMTIMEOUTS);
+#define     BuildCommDCBAndTimeouts WINELIB_NAME_AW(BuildCommDCBAndTimeouts)
+BOOL16      WINAPI CallMsgFilter16(SEGPTR,INT16);
+BOOL32      WINAPI CallMsgFilter32A(LPMSG32,INT32);
+BOOL32      WINAPI CallMsgFilter32W(LPMSG32,INT32);
+#define     CallMsgFilter WINELIB_NAME_AW(CallMsgFilter)
+LRESULT     WINAPI CallNextHookEx16(HHOOK,INT16,WPARAM16,LPARAM);
+LRESULT     WINAPI CallNextHookEx32(HHOOK,INT32,WPARAM32,LPARAM);
+#define     CallNextHookEx WINELIB_NAME(CallNextHookEx)
+LRESULT     WINAPI CallWindowProc16(WNDPROC16,HWND16,UINT16,WPARAM16,LPARAM);
+LRESULT     WINAPI CallWindowProc32A(WNDPROC32,HWND32,UINT32,WPARAM32,LPARAM);
+LRESULT     WINAPI CallWindowProc32W(WNDPROC32,HWND32,UINT32,WPARAM32,LPARAM);
+#define     CallWindowProc WINELIB_NAME_AW(CallWindowProc)
+BOOL16      WINAPI ChangeClipboardChain16(HWND16,HWND16);
+BOOL32      WINAPI ChangeClipboardChain32(HWND32,HWND32);
+#define     ChangeClipboardChain WINELIB_NAME(ChangeClipboardChain)
+BOOL16      WINAPI ChangeMenu16(HMENU16,UINT16,SEGPTR,UINT16,UINT16);
+BOOL32      WINAPI ChangeMenu32A(HMENU32,UINT32,LPCSTR,UINT32,UINT32);
+BOOL32      WINAPI ChangeMenu32W(HMENU32,UINT32,LPCWSTR,UINT32,UINT32);
+#define     ChangeMenu WINELIB_NAME_AW(ChangeMenu)
+LPSTR       WINAPI CharLower32A(LPSTR);
+LPWSTR      WINAPI CharLower32W(LPWSTR);
+#define     CharLower WINELIB_NAME_AW(CharLower)
+DWORD       WINAPI CharLowerBuff32A(LPSTR,DWORD);
+DWORD       WINAPI CharLowerBuff32W(LPWSTR,DWORD);
+#define     CharLowerBuff WINELIB_NAME_AW(CharLowerBuff)
+LPSTR       WINAPI CharNext32A(LPCSTR);
+LPWSTR      WINAPI CharNext32W(LPCWSTR);
+#define     CharNext WINELIB_NAME_AW(CharNext)
+LPSTR       WINAPI CharNextEx32A(WORD,LPCSTR,DWORD);
+LPWSTR      WINAPI CharNextEx32W(WORD,LPCWSTR,DWORD);
+#define     CharNextEx WINELIB_NAME_AW(CharNextEx)
+LPSTR       WINAPI CharPrev32A(LPCSTR,LPCSTR);
+LPWSTR      WINAPI CharPrev32W(LPCWSTR,LPCWSTR);
+#define     CharPrev WINELIB_NAME_AW(CharPrev)
+LPSTR       WINAPI CharPrevEx32A(WORD,LPCSTR,LPCSTR,DWORD);
+LPWSTR      WINAPI CharPrevEx32W(WORD,LPCWSTR,LPCWSTR,DWORD);
+#define     CharPrevEx WINELIB_NAME_AW(CharPrevEx)
+LPSTR       WINAPI CharUpper32A(LPSTR);
+LPWSTR      WINAPI CharUpper32W(LPWSTR);
+#define     CharUpper WINELIB_NAME_AW(CharUpper)
+DWORD       WINAPI CharUpperBuff32A(LPSTR,DWORD);
+DWORD       WINAPI CharUpperBuff32W(LPWSTR,DWORD);
+#define     CharUpperBuff WINELIB_NAME_AW(CharUpperBuff)
+BOOL32      WINAPI CharToOem32A(LPCSTR,LPSTR);
+BOOL32      WINAPI CharToOem32W(LPCWSTR,LPSTR);
+#define     CharToOem WINELIB_NAME_AW(CharToOem)
+BOOL32      WINAPI CharToOemBuff32A(LPCSTR,LPSTR,DWORD);
+BOOL32      WINAPI CharToOemBuff32W(LPCWSTR,LPSTR,DWORD);
+#define     CharToOemBuff WINELIB_NAME_AW(CharToOemBuff)
+BOOL16      WINAPI CheckDlgButton16(HWND16,INT16,UINT16);
+BOOL32      WINAPI CheckDlgButton32(HWND32,INT32,UINT32);
+#define     CheckDlgButton WINELIB_NAME(CheckDlgButton)
+BOOL16      WINAPI CheckMenuItem16(HMENU16,UINT16,UINT16);
+DWORD       WINAPI CheckMenuItem32(HMENU32,UINT32,UINT32);
+#define     CheckMenuItem WINELIB_NAME(CheckMenuItem)
+BOOL16      WINAPI CheckRadioButton16(HWND16,UINT16,UINT16,UINT16);
+BOOL32      WINAPI CheckRadioButton32(HWND32,UINT32,UINT32,UINT32);
+#define     CheckRadioButton WINELIB_NAME(CheckRadioButton)
+HWND16      WINAPI ChildWindowFromPoint16(HWND16,POINT16);
+HWND32      WINAPI ChildWindowFromPoint32(HWND32,POINT32);
+#define     ChildWindowFromPoint WINELIB_NAME(ChildWindowFromPoint)
+BOOL16      WINAPI Chord16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16);
+BOOL32      WINAPI Chord32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32);
+#define     Chord WINELIB_NAME(Chord)
+INT16       WINAPI ClearCommBreak16(INT16);
+BOOL32      WINAPI ClearCommBreak32(INT32);
+#define     ClearCommBreak WINELIB_NAME(ClearCommBreak)
+BOOL16      WINAPI ClientToScreen16(HWND16,LPPOINT16);
+BOOL32      WINAPI ClientToScreen32(HWND32,LPPOINT32);
+#define     ClientToScreen WINELIB_NAME(ClientToScreen)
+BOOL16      WINAPI ClipCursor16(const RECT16*);
+BOOL32      WINAPI ClipCursor32(const RECT32*);
+#define     ClipCursor WINELIB_NAME(ClipCursor)
+BOOL16      WINAPI CloseClipboard16(void);
+BOOL32      WINAPI CloseClipboard32(void);
+#define     CloseClipboard WINELIB_NAME(CloseClipboard)
+HMETAFILE16 WINAPI CloseMetaFile16(HDC16);
+HMETAFILE32 WINAPI CloseMetaFile32(HDC32);
+#define     CloseMetaFile WINELIB_NAME(CloseMetaFile)
+BOOL16      WINAPI CloseWindow16(HWND16);
+BOOL32      WINAPI CloseWindow32(HWND32);
+#define     CloseWindow WINELIB_NAME(CloseWindow)
+INT16       WINAPI CombineRgn16(HRGN16,HRGN16,HRGN16,INT16);
+INT32       WINAPI CombineRgn32(HRGN32,HRGN32,HRGN32,INT32);
+#define     CombineRgn WINELIB_NAME(CombineRgn)
+UINT16      WINAPI CompareString16(DWORD,DWORD,LPCSTR,DWORD,LPCSTR,DWORD);
+UINT32      WINAPI CompareString32A(DWORD,DWORD,LPCSTR,DWORD,LPCSTR,DWORD);
+UINT32      WINAPI CompareString32W(DWORD,DWORD,LPCWSTR,DWORD,LPCWSTR,DWORD);
+#define     CompareString WINELIB_NAME_AW(CompareString)
+HCURSOR16   WINAPI CopyCursor16(HINSTANCE16,HCURSOR16);
+#define     CopyCursor32(cur) ((HCURSOR32)CopyIcon32((HICON32)(cur)))
+#define     CopyCursor WINELIB_NAME(CopyCursor)
+HICON16     WINAPI CopyIcon16(HINSTANCE16,HICON16);
+HICON32     WINAPI CopyIcon32(HICON32);
+#define     CopyIcon WINELIB_NAME(CopyIcon)
+LONG        WINAPI CopyLZFile16(HFILE16,HFILE16);
+LONG        WINAPI CopyLZFile32(HFILE32,HFILE32);
+#define     CopyLZFile WINELIB_NAME(CopyLZFile)
+HMETAFILE16 WINAPI CopyMetaFile16(HMETAFILE16,LPCSTR);
+HMETAFILE32 WINAPI CopyMetaFile32A(HMETAFILE32,LPCSTR);
+HMETAFILE32 WINAPI CopyMetaFile32W(HMETAFILE32,LPCWSTR);
+#define     CopyMetaFile WINELIB_NAME_AW(CopyMetaFile)
+BOOL16      WINAPI CopyRect16(RECT16*,const RECT16*);
+BOOL32      WINAPI CopyRect32(RECT32*,const RECT32*);
+#define     CopyRect WINELIB_NAME(CopyRect)
+INT16       WINAPI CountClipboardFormats16(void);
+INT32       WINAPI CountClipboardFormats32(void);
+#define     CountClipboardFormats WINELIB_NAME(CountClipboardFormats)
+INT16       WINAPI CountVoiceNotes16(INT16);
+DWORD       WINAPI CountVoiceNotes32(DWORD);
+#define     CountVoiceNotes WINELIB_NAME(CountVoiceNotes)
+HBITMAP16   WINAPI CreateBitmap16(INT16,INT16,UINT16,UINT16,LPCVOID);
+HBITMAP32   WINAPI CreateBitmap32(INT32,INT32,UINT32,UINT32,LPCVOID);
+#define     CreateBitmap WINELIB_NAME(CreateBitmap)
+HBITMAP16   WINAPI CreateBitmapIndirect16(const BITMAP16*);
+HBITMAP32   WINAPI CreateBitmapIndirect32(const BITMAP32*);
+#define     CreateBitmapIndirect WINELIB_NAME(CreateBitmapIndirect)
+HBRUSH16    WINAPI CreateBrushIndirect16(const LOGBRUSH16*);
+HBRUSH32    WINAPI CreateBrushIndirect32(const LOGBRUSH32*);
+#define     CreateBrushIndirect WINELIB_NAME(CreateBrushIndirect)
+VOID        WINAPI CreateCaret16(HWND16,HBITMAP16,INT16,INT16);
+BOOL32      WINAPI CreateCaret32(HWND32,HBITMAP32,INT32,INT32);
+#define     CreateCaret WINELIB_NAME(CreateCaret)
+HBITMAP16   WINAPI CreateCompatibleBitmap16(HDC16,INT16,INT16);
+HBITMAP32   WINAPI CreateCompatibleBitmap32(HDC32,INT32,INT32);
+#define     CreateCompatibleBitmap WINELIB_NAME(CreateCompatibleBitmap)
+HDC16       WINAPI CreateCompatibleDC16(HDC16);
+HDC32       WINAPI CreateCompatibleDC32(HDC32);
+#define     CreateCompatibleDC WINELIB_NAME(CreateCompatibleDC)
+HCURSOR16   WINAPI CreateCursor16(HINSTANCE16,INT16,INT16,INT16,INT16,LPCVOID,LPCVOID);
+HCURSOR32   WINAPI CreateCursor32(HINSTANCE32,INT32,INT32,INT32,INT32,LPCVOID,LPCVOID);
+#define     CreateCursor WINELIB_NAME(CreateCursor)
+HDC16       WINAPI CreateDC16(LPCSTR,LPCSTR,LPCSTR,const DEVMODE16*);
+HDC32       WINAPI CreateDC32A(LPCSTR,LPCSTR,LPCSTR,const DEVMODE32A*);
+HDC32       WINAPI CreateDC32W(LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODE32W*);
+#define     CreateDC WINELIB_NAME_AW(CreateDC)
+HWND16      WINAPI CreateDialog16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16);
+#define     CreateDialog32A(inst,ptr,hwnd,dlg) \
            CreateDialogParam32A(inst,ptr,hwnd,dlg,0)
-#define    CreateDialog32W(inst,ptr,hwnd,dlg) \
+#define     CreateDialog32W(inst,ptr,hwnd,dlg) \
            CreateDialogParam32W(inst,ptr,hwnd,dlg,0)
-#define    CreateDialog WINELIB_NAME_AW(CreateDialog)
-HWND16     CreateDialogIndirect16(HINSTANCE16,LPCVOID,HWND16,DLGPROC16);
-#define    CreateDialogIndirect32A(inst,ptr,hwnd,dlg) \
+#define     CreateDialog WINELIB_NAME_AW(CreateDialog)
+HWND16      WINAPI CreateDialogIndirect16(HINSTANCE16,LPCVOID,HWND16,DLGPROC16);
+#define     CreateDialogIndirect32A(inst,ptr,hwnd,dlg) \
            CreateDialogIndirectParam32A(inst,ptr,hwnd,dlg,0)
-#define    CreateDialogIndirect32W(inst,ptr,hwnd,dlg) \
+#define     CreateDialogIndirect32W(inst,ptr,hwnd,dlg) \
            CreateDialogIndirectParam32W(inst,ptr,hwnd,dlg,0)
-#define    CreateDialogIndirect WINELIB_NAME_AW(CreateDialogIndirect)
-HWND16     CreateDialogIndirectParam16(HINSTANCE16,LPCVOID,HWND16,DLGPROC16,LPARAM);
-HWND32     CreateDialogIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
-HWND32     CreateDialogIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
-#define    CreateDialogIndirectParam WINELIB_NAME_AW(CreateDialogIndirectParam)
-HWND16     CreateDialogParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16,LPARAM);
-HWND32     CreateDialogParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC32,LPARAM);
-HWND32     CreateDialogParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC32,LPARAM);
-#define    CreateDialogParam WINELIB_NAME_AW(CreateDialogParam)
-HBITMAP16  CreateDIBitmap16(HDC16,const BITMAPINFOHEADER*,DWORD,LPCVOID,
-                            const BITMAPINFO*,UINT16);
-HBITMAP32  CreateDIBitmap32(HDC32,const BITMAPINFOHEADER*,DWORD,LPCVOID,
-                            const BITMAPINFO*,UINT32);
-#define    CreateDIBitmap WINELIB_NAME(CreateDIBitmap)
-HBRUSH16   CreateDIBPatternBrush16(HGLOBAL16,UINT16);
-HBRUSH32   CreateDIBPatternBrush32(HGLOBAL32,UINT32);
-#define    CreateDIBPatternBrush WINELIB_NAME(CreateDIBPatternBrush)
-BOOL16     CreateDirectory16(LPCSTR,LPVOID);
-BOOL32     CreateDirectory32A(LPCSTR,LPSECURITY_ATTRIBUTES);
-BOOL32     CreateDirectory32W(LPCWSTR,LPSECURITY_ATTRIBUTES);
-#define    CreateDirectory WINELIB_NAME_AW(CreateDirectory)
-BOOL32     CreateDirectoryEx32A(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES);
-BOOL32     CreateDirectoryEx32W(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES);
-#define    CreateDirectoryEx WINELIB_NAME_AW(CreateDirectoryEx)
-HBITMAP16  CreateDiscardableBitmap16(HDC16,INT16,INT16);
-HBITMAP32  CreateDiscardableBitmap32(HDC32,INT32,INT32);
-#define    CreateDiscardableBitmap WINELIB_NAME(CreateDiscardableBitmap)
-HRGN16     CreateEllipticRgn16(INT16,INT16,INT16,INT16);
-HRGN32     CreateEllipticRgn32(INT32,INT32,INT32,INT32);
-#define    CreateEllipticRgn WINELIB_NAME(CreateEllipticRgn)
-HRGN16     CreateEllipticRgnIndirect16(const RECT16 *);
-HRGN32     CreateEllipticRgnIndirect32(const RECT32 *);
-#define    CreateEllipticRgnIndirect WINELIB_NAME(CreateEllipticRgnIndirect)
-HFONT16    CreateFont16(INT16,INT16,INT16,INT16,INT16,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
-HFONT32    CreateFont32A(INT32,INT32,INT32,INT32,INT32,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCSTR);
-HFONT32    CreateFont32W(INT32,INT32,INT32,INT32,INT32,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCWSTR);
-#define    CreateFont WINELIB_NAME_AW(CreateFont)
-HFONT16    CreateFontIndirect16(const LOGFONT16*);
-HFONT32    CreateFontIndirect32A(const LOGFONT32A*);
-HFONT32    CreateFontIndirect32W(const LOGFONT32W*);
-#define    CreateFontIndirect WINELIB_NAME_AW(CreateFontIndirect)
-HBRUSH16   CreateHatchBrush16(INT16,COLORREF);
-HBRUSH32   CreateHatchBrush32(INT32,COLORREF);
-#define    CreateHatchBrush WINELIB_NAME(CreateHatchBrush)
-HDC16      CreateIC16(LPCSTR,LPCSTR,LPCSTR,const DEVMODE16*);
-HDC32      CreateIC32A(LPCSTR,LPCSTR,LPCSTR,const DEVMODE32A*);
-HDC32      CreateIC32W(LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODE32W*);
-#define    CreateIC WINELIB_NAME_AW(CreateIC)
-HICON16    CreateIcon16(HINSTANCE16,INT16,INT16,BYTE,BYTE,LPCVOID,LPCVOID);
-HICON32    CreateIcon32(HINSTANCE32,INT32,INT32,BYTE,BYTE,LPCVOID,LPCVOID);
-#define    CreateIcon WINELIB_NAME(CreateIcon)
-HMENU16    CreateMenu16(void);
-HMENU32    CreateMenu32(void);
-#define    CreateMenu WINELIB_NAME(CreateMenu)
-HDC16      CreateMetaFile16(LPCSTR);
-HDC32      CreateMetaFile32A(LPCSTR);
-HDC32      CreateMetaFile32W(LPCWSTR);
-#define    CreateMetaFile WINELIB_NAME_AW(CreateMetaFile)
-HPALETTE16 CreatePalette16(const LOGPALETTE*);
-HPALETTE32 CreatePalette32(const LOGPALETTE*);
-#define    CreatePalette WINELIB_NAME(CreatePalette)
-HBRUSH16   CreatePatternBrush16(HBITMAP16);
-HBRUSH32   CreatePatternBrush32(HBITMAP32);
-#define    CreatePatternBrush WINELIB_NAME(CreatePatternBrush)
-HPEN16     CreatePen16(INT16,INT16,COLORREF);
-HPEN32     CreatePen32(INT32,INT32,COLORREF);
-#define    CreatePen WINELIB_NAME(CreatePen)
-HPEN16     CreatePenIndirect16(const LOGPEN16*);
-HPEN32     CreatePenIndirect32(const LOGPEN32*);
-#define    CreatePenIndirect WINELIB_NAME(CreatePenIndirect)
-HRGN16     CreatePolyPolygonRgn16(const POINT16*,const INT16*,INT16,INT16);
-HRGN32     CreatePolyPolygonRgn32(const POINT32*,const INT32*,INT32,INT32);
-#define    CreatePolyPolygonRgn WINELIB_NAME(CreatePolyPolygonRgn)
-HRGN16     CreatePolygonRgn16(const POINT16*,INT16,INT16);
-HRGN32     CreatePolygonRgn32(const POINT32*,INT32,INT32);
-#define    CreatePolygonRgn WINELIB_NAME(CreatePolygonRgn)
-HMENU16    CreatePopupMenu16(void);
-HMENU32    CreatePopupMenu32(void);
-#define    CreatePopupMenu WINELIB_NAME(CreatePopupMenu)
-HRGN16     CreateRectRgn16(INT16,INT16,INT16,INT16);
-HRGN32     CreateRectRgn32(INT32,INT32,INT32,INT32);
-#define    CreateRectRgn WINELIB_NAME(CreateRectRgn)
-HRGN16     CreateRectRgnIndirect16(const RECT16*);
-HRGN32     CreateRectRgnIndirect32(const RECT32*);
-#define    CreateRectRgnIndirect WINELIB_NAME(CreateRectRgnIndirect)
-HRGN16     CreateRoundRectRgn16(INT16,INT16,INT16,INT16,INT16,INT16);
-HRGN32     CreateRoundRectRgn32(INT32,INT32,INT32,INT32,INT32,INT32);
-#define    CreateRoundRectRgn WINELIB_NAME(CreateRoundRectRgn)
-BOOL16     CreateScalableFontResource16(UINT16,LPCSTR,LPCSTR,LPCSTR);
-BOOL32     CreateScalableFontResource32A(DWORD,LPCSTR,LPCSTR,LPCSTR);
-BOOL32     CreateScalableFontResource32W(DWORD,LPCWSTR,LPCWSTR,LPCWSTR);
-#define    CreateScalableFontResource WINELIB_NAME_AW(CreateScalableFontResource)
-HBRUSH16   CreateSolidBrush16(COLORREF);
-HBRUSH32   CreateSolidBrush32(COLORREF);
-#define    CreateSolidBrush WINELIB_NAME(CreateSolidBrush)
-HWND16     CreateWindow16(LPCSTR,LPCSTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,LPVOID);
-#define    CreateWindow32A(className,titleName,style,x,y,width,height,\
-                           parent,menu,instance,param) \
-           CreateWindowEx32A(0,className,titleName,style,x,y,width,height,\
-                           parent,menu,instance,param)
-#define    CreateWindow32W(className,titleName,style,x,y,width,height,\
-                           parent,menu,instance,param) \
-           CreateWindowEx32W(0,className,titleName,style,x,y,width,height,\
-                           parent,menu,instance,param)
-#define    CreateWindow WINELIB_NAME_AW(CreateWindow)
-HWND16     CreateWindowEx16(DWORD,LPCSTR,LPCSTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,LPVOID);
-HWND32     CreateWindowEx32A(DWORD,LPCSTR,LPCSTR,DWORD,INT32,INT32,INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
-HWND32     CreateWindowEx32W(DWORD,LPCWSTR,LPCWSTR,DWORD,INT32,INT32,INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
-#define    CreateWindowEx WINELIB_NAME_AW(CreateWindowEx)
-LRESULT    DefDlgProc16(HWND16,UINT16,WPARAM16,LPARAM);
-LRESULT    DefDlgProc32A(HWND32,UINT32,WPARAM32,LPARAM);
-LRESULT    DefDlgProc32W(HWND32,UINT32,WPARAM32,LPARAM);
-#define    DefDlgProc WINELIB_NAME_AW(DefDlgProc)
-HDWP16     DeferWindowPos16(HDWP16,HWND16,HWND16,INT16,INT16,INT16,INT16,UINT16);
-HDWP32     DeferWindowPos32(HDWP32,HWND32,HWND32,INT32,INT32,INT32,INT32,UINT32);
-#define    DeferWindowPos WINELIB_NAME(DeferWindowPos)
-LRESULT    DefFrameProc16(HWND16,HWND16,UINT16,WPARAM16,LPARAM);
-LRESULT    DefFrameProc32A(HWND32,HWND32,UINT32,WPARAM32,LPARAM);
-LRESULT    DefFrameProc32W(HWND32,HWND32,UINT32,WPARAM32,LPARAM);
-#define    DefFrameProc WINELIB_NAME_AW(DefFrameProc)
-LRESULT    DefHookProc16(INT16,WPARAM16,LPARAM,HHOOK*);
-#define    DefHookProc32(code,wparam,lparam,phhook) \
-           CallNextHookEx32(*(phhook),code,wparam,lparam)
-#define    DefHookProc WINELIB_NAME(DefHookProc)
-LRESULT    DefMDIChildProc16(HWND16,UINT16,WPARAM16,LPARAM);
-LRESULT    DefMDIChildProc32A(HWND32,UINT32,WPARAM32,LPARAM);
-LRESULT    DefMDIChildProc32W(HWND32,UINT32,WPARAM32,LPARAM);
-#define    DefMDIChildProc WINELIB_NAME_AW(DefMDIChildProc)
-LRESULT    DefWindowProc16(HWND16,UINT16,WPARAM16,LPARAM);
-LRESULT    DefWindowProc32A(HWND32,UINT32,WPARAM32,LPARAM);
-LRESULT    DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM);
-#define    DefWindowProc WINELIB_NAME_AW(DefWindowProc)
-ATOM       DeleteAtom16(ATOM);
-ATOM       DeleteAtom32(ATOM);
-#define    DeleteAtom WINELIB_NAME(DeleteAtom)
-BOOL16     DeleteDC16(HDC16);
-BOOL32     DeleteDC32(HDC32);
-#define    DeleteDC WINELIB_NAME(DeleteDC)
-BOOL16     DeleteFile16(LPCSTR);
-BOOL32     DeleteFile32A(LPCSTR);
-BOOL32     DeleteFile32W(LPCWSTR);
-#define    DeleteFile WINELIB_NAME_AW(DeleteFile)
-BOOL16     DeleteMenu16(HMENU16,UINT16,UINT16);
-BOOL32     DeleteMenu32(HMENU32,UINT32,UINT32);
-#define    DeleteMenu WINELIB_NAME(DeleteMenu)
-BOOL16     DeleteMetaFile16(HMETAFILE16);
-BOOL32     DeleteMetaFile32(HMETAFILE32);
-#define    DeleteMetaFile WINELIB_NAME(DeleteMetaFile)
-BOOL16     DeleteObject16(HGDIOBJ16);
-BOOL32     DeleteObject32(HGDIOBJ32);
-#define    DeleteObject WINELIB_NAME(DeleteObject)
-VOID       DestroyCaret16(void);
-BOOL32     DestroyCaret32(void);
-#define    DestroyCaret WINELIB_NAME(DestroyCaret)
-BOOL16     DestroyCursor16(HCURSOR16);
-BOOL32     DestroyCursor32(HCURSOR32);
-#define    DestroyCursor WINELIB_NAME(DestroyCursor)
-BOOL16     DestroyIcon16(HICON16);
-BOOL32     DestroyIcon32(HICON32);
-#define    DestroyIcon WINELIB_NAME(DestroyIcon)
-BOOL16     DestroyMenu16(HMENU16);
-BOOL32     DestroyMenu32(HMENU32);
-#define    DestroyMenu WINELIB_NAME(DestroyMenu)
-BOOL16     DestroyWindow16(HWND16);
-BOOL32     DestroyWindow32(HWND32);
-#define    DestroyWindow WINELIB_NAME(DestroyWindow)
-INT16      DialogBox16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16);
-#define    DialogBox32A(inst,template,owner,func) \
-           DialogBoxParam32A(inst,template,owner,func,0)
-#define    DialogBox32W(inst,template,owner,func) \
-           DialogBoxParam32W(inst,template,owner,func,0)
-#define    DialogBox WINELIB_NAME_AW(DialogBox)
-INT16      DialogBoxIndirect16(HINSTANCE16,HANDLE16,HWND16,DLGPROC16);
-#define    DialogBoxIndirect32A(inst,template,owner,func) \
-           DialogBoxIndirectParam32A(inst,template,owner,func,0)
-#define    DialogBoxIndirect32W(inst,template,owner,func) \
-           DialogBoxIndirectParam32W(inst,template,owner,func,0)
-#define    DialogBoxIndirect WINELIB_NAME_AW(DialogBoxIndirect)
-INT16      DialogBoxIndirectParam16(HINSTANCE16,HANDLE16,HWND16,DLGPROC16,LPARAM);
-INT32      DialogBoxIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
-INT32      DialogBoxIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
-#define    DialogBoxIndirectParam WINELIB_NAME_AW(DialogBoxIndirectParam)
-INT16      DialogBoxParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16,LPARAM);
-INT32      DialogBoxParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC32,LPARAM);
-INT32      DialogBoxParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC32,LPARAM);
-#define    DialogBoxParam WINELIB_NAME_AW(DialogBoxParam)
-LONG       DispatchMessage16(const MSG16*);
-LONG       DispatchMessage32A(const MSG32*);
-LONG       DispatchMessage32W(const MSG32*);
-#define    DispatchMessage WINELIB_NAME_AW(DispatchMessage)
-INT16      DlgDirList16(HWND16,LPSTR,INT16,INT16,UINT16);
-INT32      DlgDirList32A(HWND32,LPSTR,INT32,INT32,UINT32);
-INT32      DlgDirList32W(HWND32,LPWSTR,INT32,INT32,UINT32);
-#define    DlgDirList WINELIB_NAME_AW(DlgDirList)
-INT16      DlgDirListComboBox16(HWND16,LPSTR,INT16,INT16,UINT16);
-INT32      DlgDirListComboBox32A(HWND32,LPSTR,INT32,INT32,UINT32);
-INT32      DlgDirListComboBox32W(HWND32,LPWSTR,INT32,INT32,UINT32);
-#define    DlgDirListComboBox WINELIB_NAME_AW(DlgDirListComboBox)
-BOOL16     DlgDirSelectComboBoxEx16(HWND16,LPSTR,INT16,INT16);
-BOOL32     DlgDirSelectComboBoxEx32A(HWND32,LPSTR,INT32,INT32);
-BOOL32     DlgDirSelectComboBoxEx32W(HWND32,LPWSTR,INT32,INT32);
-#define    DlgDirSelectComboBoxEx WINELIB_NAME_AW(DlgDirSelectComboBoxEx)
-BOOL16     DlgDirSelectEx16(HWND16,LPSTR,INT16,INT16);
-BOOL32     DlgDirSelectEx32A(HWND32,LPSTR,INT32,INT32);
-BOOL32     DlgDirSelectEx32W(HWND32,LPWSTR,INT32,INT32);
-#define    DlgDirSelectEx WINELIB_NAME_AW(DlgDirSelectEx)
-BOOL16     DPtoLP16(HDC16,LPPOINT16,INT16);
-BOOL32     DPtoLP32(HDC32,LPPOINT32,INT32);
-#define    DPtoLP WINELIB_NAME(DPtoLP)
-BOOL16     DragDetect16(HWND16,POINT16);
-BOOL32     DragDetect32(HWND32,POINT32);
-#define    DragDetect WINELIB_NAME(DragDetect)
-DWORD      DragObject16(HWND16,HWND16,UINT16,HANDLE16,WORD,HCURSOR16);
-DWORD      DragObject32(HWND32,HWND32,UINT32,DWORD,HCURSOR32);
-#define    DragObject WINELIB_NAME(DragObject)
-BOOL16     DrawEdge16(HDC16,LPRECT16,UINT16,UINT16);
-BOOL32     DrawEdge32(HDC32,LPRECT32,UINT32,UINT32);
-#define    DrawEdge WINELIB_NAME(DrawEdge)
-void       DrawFocusRect16(HDC16,const RECT16*);
-void       DrawFocusRect32(HDC32,const RECT32*);
-#define    DrawFocusRect WINELIB_NAME(DrawFocusRect)
-BOOL16     DrawFrameControl16(HDC16,LPRECT16,UINT16,UINT16);
-BOOL32     DrawFrameControl32(HDC32,LPRECT32,UINT32,UINT32);
-#define    DrawFrameControl WINELIB_NAME(DrawFrameControl)
-BOOL16     DrawIcon16(HDC16,INT16,INT16,HICON16);
-BOOL32     DrawIcon32(HDC32,INT32,INT32,HICON32);
-#define    DrawIcon WINELIB_NAME(DrawIcon)
-VOID       DrawMenuBar16(HWND16);
-BOOL32     DrawMenuBar32(HWND32);
-#define    DrawMenuBar WINELIB_NAME(DrawMenuBar)
-INT16      DrawText16(HDC16,LPCSTR,INT16,LPRECT16,UINT16);
-INT32      DrawText32A(HDC32,LPCSTR,INT32,LPRECT32,UINT32);
-INT32      DrawText32W(HDC32,LPCWSTR,INT32,LPRECT32,UINT32);
-#define    DrawText WINELIB_NAME_AW(DrawText)
-BOOL16     Ellipse16(HDC16,INT16,INT16,INT16,INT16);
-BOOL32     Ellipse32(HDC32,INT32,INT32,INT32,INT32);
-#define    Ellipse WINELIB_NAME(Ellipse)
-BOOL16     EmptyClipboard16(void);
-BOOL32     EmptyClipboard32(void);
-#define    EmptyClipboard WINELIB_NAME(EmptyClipboard)
-BOOL16     EnableMenuItem16(HMENU16,UINT16,UINT16);
-BOOL32     EnableMenuItem32(HMENU32,UINT32,UINT32);
-#define    EnableMenuItem WINELIB_NAME(EnableMenuItem)
-BOOL16     EnableScrollBar16(HWND16,INT16,UINT16);
-BOOL32     EnableScrollBar32(HWND32,INT32,UINT32);
-#define    EnableScrollBar WINELIB_NAME(EnableScrollBar)
-BOOL16     EnableWindow16(HWND16,BOOL16);
-BOOL32     EnableWindow32(HWND32,BOOL32);
-#define    EnableWindow WINELIB_NAME(EnableWindow)
-BOOL16     EndDeferWindowPos16(HDWP16);
-BOOL32     EndDeferWindowPos32(HDWP32);
-#define    EndDeferWindowPos WINELIB_NAME(EndDeferWindowPos)
-BOOL16     EndDialog16(HWND16,INT16);
-BOOL32     EndDialog32(HWND32,INT32);
-#define    EndDialog WINELIB_NAME(EndDialog)
-INT16      EndDoc16(HDC16);
-INT32      EndDoc32(HDC32);
-#define    EndDoc WINELIB_NAME(EndDoc)
-BOOL16     EndPaint16(HWND16,const PAINTSTRUCT16*);
-BOOL32     EndPaint32(HWND32,const PAINTSTRUCT32*);
-#define    EndPaint WINELIB_NAME(EndPaint)
-BOOL16     EnumChildWindows16(HWND16,WNDENUMPROC16,LPARAM);
-BOOL32     EnumChildWindows32(HWND32,WNDENUMPROC32,LPARAM);
-#define    EnumChildWindows WINELIB_NAME(EnumChildWindows)
-UINT16     EnumClipboardFormats16(UINT16);
-UINT32     EnumClipboardFormats32(UINT32);
-#define    EnumClipboardFormats WINELIB_NAME(EnumClipboardFormats)
-INT16      EnumFontFamilies16(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
-INT32      EnumFontFamilies32A(HDC32,LPCSTR,FONTENUMPROC32A,LPARAM);
-INT32      EnumFontFamilies32W(HDC32,LPCWSTR,FONTENUMPROC32W,LPARAM);
-#define    EnumFontFamilies WINELIB_NAME_AW(EnumFontFamilies)
-INT16      EnumFontFamiliesEx16(HDC16,LPLOGFONT16,FONTENUMPROCEX16,LPARAM,DWORD);
-INT32      EnumFontFamiliesEx32A(HDC32,LPLOGFONT32A,FONTENUMPROCEX32A,LPARAM,DWORD);
-INT32      EnumFontFamiliesEx32W(HDC32,LPLOGFONT32W,FONTENUMPROCEX32W,LPARAM,DWORD);
-#define    EnumFontFamiliesEx WINELIB_NAME_AW(EnumFontFamiliesEx)
-INT16      EnumFonts16(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
-INT32      EnumFonts32A(HDC32,LPCSTR,FONTENUMPROC32A,LPARAM);
-INT32      EnumFonts32W(HDC32,LPCWSTR,FONTENUMPROC32W,LPARAM);
-#define    EnumFonts WINELIB_NAME_AW(EnumFonts)
-BOOL16     EnumMetaFile16(HDC16,HMETAFILE16,MFENUMPROC16,LPARAM);
-BOOL32     EnumMetaFile32(HDC32,HMETAFILE32,MFENUMPROC32,LPARAM);
-#define    EnumMetaFile WINELIB_NAME(EnumMetaFile)
-INT16      EnumObjects16(HDC16,INT16,GOBJENUMPROC16,LPARAM);
-INT32      EnumObjects32(HDC32,INT32,GOBJENUMPROC32,LPARAM);
-#define    EnumObjects WINELIB_NAME(EnumObjects)
-INT16      EnumProps16(HWND16,PROPENUMPROC16);
-INT32      EnumProps32A(HWND32,PROPENUMPROC32A);
-INT32      EnumProps32W(HWND32,PROPENUMPROC32W);
-#define    EnumProps WINELIB_NAME_AW(EnumProps)
-BOOL16     EnumTaskWindows16(HTASK16,WNDENUMPROC16,LPARAM);
-#define    EnumTaskWindows32(handle,proc,lparam) \
-           EnumThreadWindows(handle,proc,lparam)
-#define    EnumTaskWindows WINELIB_NAME(EnumTaskWindows)
-BOOL16     EnumWindows16(WNDENUMPROC16,LPARAM);
-BOOL32     EnumWindows32(WNDENUMPROC32,LPARAM);
-#define    EnumWindows WINELIB_NAME(EnumWindows)
-BOOL16     EqualRect16(const RECT16*,const RECT16*);
-BOOL32     EqualRect32(const RECT32*,const RECT32*);
-#define    EqualRect WINELIB_NAME(EqualRect)
-BOOL16     EqualRgn16(HRGN16,HRGN16);
-BOOL32     EqualRgn32(HRGN32,HRGN32);
-#define    EqualRgn WINELIB_NAME(EqualRgn)
-INT16      Escape16(HDC16,INT16,INT16,SEGPTR,SEGPTR);
-INT32      Escape32(HDC32,INT32,INT32,LPVOID,LPVOID);
-#define    Escape WINELIB_NAME(Escape)
-LONG       EscapeCommFunction16(UINT16,UINT16);
-BOOL32     EscapeCommFunction32(INT32,UINT32);
-#define    EscapeCommFunction WINELIB_NAME(EscapeCommFunction)
-INT16      ExcludeClipRect16(HDC16,INT16,INT16,INT16,INT16);
-INT32      ExcludeClipRect32(HDC32,INT32,INT32,INT32,INT32);
-#define    ExcludeClipRect WINELIB_NAME(ExcludeClipRect)
-INT16      ExcludeUpdateRgn16(HDC16,HWND16);
-INT32      ExcludeUpdateRgn32(HDC32,HWND32);
-#define    ExcludeUpdateRgn WINELIB_NAME(ExcludeUpdateRgn)
-BOOL16     ExitWindows16(DWORD,UINT16);
-#define    ExitWindows32(a,b) ExitWindowsEx(EWX_LOGOFF,0xffffffff)
-#define    ExitWindows WINELIB_NAME(ExitWindows)
-BOOL16     ExtFloodFill16(HDC16,INT16,INT16,COLORREF,UINT16);
-BOOL32     ExtFloodFill32(HDC32,INT32,INT32,COLORREF,UINT32);
-#define    ExtFloodFill WINELIB_NAME(ExtFloodFill)
-HICON16    ExtractIcon16(HINSTANCE16,LPCSTR,UINT16);
-HICON32    ExtractIcon32A(HINSTANCE32,LPCSTR,UINT32);
-HICON32    ExtractIcon32W(HINSTANCE32,LPCWSTR,UINT32);
-#define    ExtractIcon WINELIB_NAME_AW(ExtractIcon)
-BOOL16     ExtTextOut16(HDC16,INT16,INT16,UINT16,const RECT16*,LPCSTR,UINT16,const INT16*);
-BOOL32     ExtTextOut32A(HDC32,INT32,INT32,UINT32,const RECT32*,LPCSTR,UINT32,const INT32*);
-BOOL32     ExtTextOut32W(HDC32,INT32,INT32,UINT32,const RECT32*,LPCWSTR,UINT32,const INT32*);
-#define    ExtTextOut WINELIB_NAME_AW(ExtTextOut)
-void       FatalAppExit16(UINT16,LPCSTR);
-void       FatalAppExit32A(UINT32,LPCSTR);
-void       FatalAppExit32W(UINT32,LPCWSTR);
-#define    FatalAppExit WINELIB_NAME_AW(FatalAppExit)
-INT16      FillRect16(HDC16,const RECT16*,HBRUSH16);
-INT32      FillRect32(HDC32,const RECT32*,HBRUSH32);
-#define    FillRect WINELIB_NAME(FillRect)
-BOOL16     FillRgn16(HDC16,HRGN16,HBRUSH16);
-BOOL32     FillRgn32(HDC32,HRGN32,HBRUSH32);
-#define    FillRgn WINELIB_NAME(FillRgn)
-ATOM       FindAtom16(SEGPTR);
-ATOM       FindAtom32A(LPCSTR);
-ATOM       FindAtom32W(LPCWSTR);
-#define    FindAtom WINELIB_NAME_AW(FindAtom)
-BOOL16     FindClose16(HANDLE16);
-BOOL32     FindClose32(HANDLE32);
-#define    FindClose WINELIB_NAME(FindClose)
-HINSTANCE16 FindExecutable16(LPCSTR,LPCSTR,LPSTR);
-HINSTANCE32 FindExecutable32A(LPCSTR,LPCSTR,LPSTR);
-HINSTANCE32 FindExecutable32W(LPCWSTR,LPCWSTR,LPWSTR);
-#define    FindExecutable WINELIB_NAME_AW(FindExecutable)
-HANDLE16   FindFirstFile16(LPCSTR,LPWIN32_FIND_DATA32A);
-HANDLE32   FindFirstFile32A(LPCSTR,LPWIN32_FIND_DATA32A);
-HANDLE32   FindFirstFile32W(LPCWSTR,LPWIN32_FIND_DATA32W);
-#define    FindFirst WINELIB_NAME_AW(FindFirst)
-BOOL16     FindNextFile16(HANDLE16,LPWIN32_FIND_DATA32A);
-BOOL32     FindNextFile32A(HANDLE32,LPWIN32_FIND_DATA32A);
-BOOL32     FindNextFile32W(HANDLE32,LPWIN32_FIND_DATA32W);
-#define    FindNext WINELIB_NAME_AW(FindNext)
-HRSRC16    FindResource16(HINSTANCE16,SEGPTR,SEGPTR);
-HRSRC32    FindResource32A(HINSTANCE32,LPCSTR,LPCSTR);
-HRSRC32    FindResource32W(HINSTANCE32,LPCWSTR,LPCWSTR);
-#define    FindResource WINELIB_NAME_AW(FindResource)
-HWND16     FindWindow16(SEGPTR,LPCSTR);
-HWND32     FindWindow32A(LPCSTR,LPCSTR);
-HWND32     FindWindow32W(LPCWSTR,LPCWSTR);
-#define    FindWindow WINELIB_NAME_AW(FindWindow)
-HWND16     FindWindowEx16(HWND16,HWND16,SEGPTR,LPCSTR);
-HWND32     FindWindowEx32A(HWND32,HWND32,LPCSTR,LPCSTR);
-HWND32     FindWindowEx32W(HWND32,HWND32,LPCWSTR,LPCWSTR);
-#define    FindWindowEx WINELIB_NAME_AW(FindWindowEx)
-BOOL16     FlashWindow16(HWND16,BOOL16);
-BOOL32     FlashWindow32(HWND32,BOOL32);
-#define    FlashWindow WINELIB_NAME(FlashWindow)
-BOOL16     FloodFill16(HDC16,INT16,INT16,COLORREF);
-BOOL32     FloodFill32(HDC32,INT32,INT32,COLORREF);
-#define    FloodFill WINELIB_NAME(FloodFill)
-INT16      FrameRect16(HDC16,const RECT16*,HBRUSH16);
-INT32      FrameRect32(HDC32,const RECT32*,HBRUSH32);
-#define    FrameRect WINELIB_NAME(FrameRect)
-BOOL16     FrameRgn16(HDC16,HRGN16,HBRUSH16,INT16,INT16);
-BOOL32     FrameRgn32(HDC32,HRGN32,HBRUSH32,INT32,INT32);
-#define    FrameRgn WINELIB_NAME(FrameRgn)
-VOID       FreeLibrary16(HINSTANCE16);
-BOOL32     FreeLibrary32(HMODULE32);
-#define    FreeLibrary WINELIB_NAME(FreeLibrary)
-BOOL16     FreeModule16(HMODULE16);
-#define    FreeModule32(handle) FreeLibrary32(handle)
-#define    FreeModule WINELIB_NAME(FreeModule)
-void       FreeProcInstance16(FARPROC16);
-#define    FreeProcInstance32(proc) /*nothing*/
-#define    FreeProcInstance WINELIB_NAME(FreeProcInstance)
-BOOL16     FreeResource16(HGLOBAL16);
-BOOL32     FreeResource32(HGLOBAL32);
-#define    FreeResource WINELIB_NAME(FreeResource)
-HWND16     GetActiveWindow16(void);
-HWND32     GetActiveWindow32(void);
-#define    GetActiveWindow WINELIB_NAME(GetActiveWindow)
-DWORD      GetAppCompatFlags16(HTASK16);
-DWORD      GetAppCompatFlags32(HTASK32);
-#define    GetAppCompatFlags WINELIB_NAME(GetAppCompatFlags)
-WORD       GetAsyncKeyState16(INT16);
-WORD       GetAsyncKeyState32(INT32);
-#define    GetAsyncKeyState WINELIB_NAME(GetAsyncKeyState)
-UINT16     GetAtomName16(ATOM,LPSTR,INT16);
-UINT32     GetAtomName32A(ATOM,LPSTR,INT32);
-UINT32     GetAtomName32W(ATOM,LPWSTR,INT32);
-#define    GetAtomName WINELIB_NAME_AW(GetAtomName)
-LONG       GetBitmapBits16(HBITMAP16,LONG,LPVOID);
-LONG       GetBitmapBits32(HBITMAP32,LONG,LPVOID);
-#define    GetBitmapBits WINELIB_NAME(GetBitmapBits)
-BOOL16     GetBitmapDimensionEx16(HBITMAP16,LPSIZE16);
-BOOL32     GetBitmapDimensionEx32(HBITMAP32,LPSIZE32);
-#define    GetBitmapDimensionEx WINELIB_NAME(GetBitmapDimensionEx)
-BOOL16     GetBrushOrgEx16(HDC16,LPPOINT16);
-BOOL32     GetBrushOrgEx32(HDC32,LPPOINT32);
-#define    GetBrushOrgEx WINELIB_NAME(GetBrushOrgEx)
-COLORREF   GetBkColor16(HDC16);
-COLORREF   GetBkColor32(HDC32);
-#define    GetBkColor WINELIB_NAME(GetBkColor)
-INT16      GetBkMode16(HDC16);
-INT32      GetBkMode32(HDC32);
-#define    GetBkMode WINELIB_NAME(GetBkMode)
-HWND16     GetCapture16(void);
-HWND32     GetCapture32(void);
-#define    GetCapture WINELIB_NAME(GetCapture)
-UINT16     GetCaretBlinkTime16(void);
-UINT32     GetCaretBlinkTime32(void);
-#define    GetCaretBlinkTime WINELIB_NAME(GetCaretBlinkTime)
-VOID       GetCaretPos16(LPPOINT16);
-BOOL32     GetCaretPos32(LPPOINT32);
-#define    GetCaretPos WINELIB_NAME(GetCaretPos)
-BOOL16     GetCharABCWidths16(HDC16,UINT16,UINT16,LPABC16);
-BOOL32     GetCharABCWidths32A(HDC32,UINT32,UINT32,LPABC32);
-BOOL32     GetCharABCWidths32W(HDC32,UINT32,UINT32,LPABC32);
-#define    GetCharABCWidths WINELIB_NAME_AW(GetCharABCWidths)
-BOOL16     GetCharWidth16(HDC16,UINT16,UINT16,LPINT16);
-BOOL32     GetCharWidth32A(HDC32,UINT32,UINT32,LPINT32);
-BOOL32     GetCharWidth32W(HDC32,UINT32,UINT32,LPINT32);
-#define    GetCharWidth WINELIB_NAME_AW(GetCharWidth)
-BOOL16     GetClassInfo16(HINSTANCE16,SEGPTR,WNDCLASS16 *);
-BOOL32     GetClassInfo32A(HINSTANCE32,LPCSTR,WNDCLASS32A *);
-BOOL32     GetClassInfo32W(HINSTANCE32,LPCWSTR,WNDCLASS32W *);
-#define    GetClassInfo WINELIB_NAME_AW(GetClassInfo)
-BOOL16     GetClassInfoEx16(HINSTANCE16,SEGPTR,WNDCLASSEX16 *);
-BOOL32     GetClassInfoEx32A(HINSTANCE32,LPCSTR,WNDCLASSEX32A *);
-BOOL32     GetClassInfoEx32W(HINSTANCE32,LPCWSTR,WNDCLASSEX32W *);
-#define    GetClassInfoEx WINELIB_NAME_AW(GetClassInfoEx)
-LONG       GetClassLong16(HWND16,INT16);
-LONG       GetClassLong32A(HWND32,INT32);
-LONG       GetClassLong32W(HWND32,INT32);
-#define    GetClassLong WINELIB_NAME_AW(GetClassLong)
-INT16      GetClassName16(HWND16,LPSTR,INT16);
-INT32      GetClassName32A(HWND32,LPSTR,INT32);
-INT32      GetClassName32W(HWND32,LPWSTR,INT32);
-#define    GetClassName WINELIB_NAME_AW(GetClassName)
-WORD       GetClassWord16(HWND16,INT16);
-WORD       GetClassWord32(HWND32,INT32);
-#define    GetClassWord WINELIB_NAME(GetClassWord)
-void       GetClientRect16(HWND16,LPRECT16);
-void       GetClientRect32(HWND32,LPRECT32);
-#define    GetClientRect WINELIB_NAME(GetClientRect)
-HANDLE16   GetClipboardData16(UINT16);
-HANDLE32   GetClipboardData32(UINT32);
-#define    GetClipboardData WINELIB_NAME(GetClipboardData)
-INT16      GetClipboardFormatName16(UINT16,LPSTR,INT16);
-INT32      GetClipboardFormatName32A(UINT32,LPSTR,INT32);
-INT32      GetClipboardFormatName32W(UINT32,LPWSTR,INT32);
-#define    GetClipboardFormatName WINELIB_NAME_AW(GetClipboardFormatName)
-HWND16     GetClipboardOwner16(void);
-HWND32     GetClipboardOwner32(void);
-#define    GetClipboardOwner WINELIB_NAME(GetClipboardOwner)
-HWND16     GetClipboardViewer16(void);
-HWND32     GetClipboardViewer32(void);
-#define    GetClipboardViewer WINELIB_NAME(GetClipboardViewer)
-INT16      GetClipBox16(HDC16,LPRECT16);
-INT32      GetClipBox32(HDC32,LPRECT32);
-#define    GetClipBox WINELIB_NAME(GetClipBox)
-void       GetClipCursor16(LPRECT16);
-void       GetClipCursor32(LPRECT32);
-#define    GetClipCursor WINELIB_NAME(GetClipCursor)
-HRGN16     GetClipRgn16(HDC16);
-INT32      GetClipRgn32(HDC32,HRGN32);
-#define    GetClipRgn WINELIB_NAME(GetClipRgn)
-INT16      GetCommState16(INT16,LPDCB16);
-BOOL32     GetCommState32(INT32,LPDCB32);
-#define    GetCommState WINELIB_NAME(GetCommState)
-UINT16     GetCurrentDirectory16(UINT16,LPSTR);
-UINT32     GetCurrentDirectory32A(UINT32,LPSTR);
-UINT32     GetCurrentDirectory32W(UINT32,LPWSTR);
-#define    GetCurrentDirectory WINELIB_NAME_AW(GetCurrentDirectory)
-BOOL16     GetCurrentPositionEx16(HDC16,LPPOINT16);
-BOOL32     GetCurrentPositionEx32(HDC32,LPPOINT32);
-#define    GetCurrentPositionEx WINELIB_NAME(GetCurrentPositionEx)
-DWORD      GetCurrentTime16(void);
-#define    GetCurrentTime32() GetTickCount()
-#define    GetCurrentTime WINELIB_NAME(GetCurrentTime)
-HCURSOR16  GetCursor16(void);
-HCURSOR32  GetCursor32(void);
-#define    GetCursor WINELIB_NAME(GetCursor)
-void       GetCursorPos16(LPPOINT16);
-void       GetCursorPos32(LPPOINT32);
-#define    GetCursorPos WINELIB_NAME(GetCursorPos)
-HDC16      GetDC16(HWND16);
-HDC32      GetDC32(HWND32);
-#define    GetDC WINELIB_NAME(GetDC)
-HDC16      GetDCEx16(HWND16,HRGN16,DWORD);
-HDC32      GetDCEx32(HWND32,HRGN32,DWORD);
-#define    GetDCEx WINELIB_NAME(GetDCEx)
-HWND16     GetDesktopWindow16(void);
-HWND32     GetDesktopWindow32(void);
-#define    GetDesktopWindow WINELIB_NAME(GetDesktopWindow)
-INT16      GetDeviceCaps16(HDC16,INT16);
-INT32      GetDeviceCaps32(HDC32,INT32);
-#define    GetDeviceCaps WINELIB_NAME(GetDeviceCaps)
-INT16      GetDIBits16(HDC16,HBITMAP16,UINT16,UINT16,LPSTR,LPBITMAPINFO,UINT16);
-INT32      GetDIBits32(HDC32,HBITMAP32,UINT32,UINT32,LPSTR,LPBITMAPINFO,UINT32);
-#define    GetDIBits WINELIB_NAME(GetDIBits)
-BOOL16     GetDiskFreeSpace16(LPCSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
-BOOL32     GetDiskFreeSpace32A(LPCSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
-BOOL32     GetDiskFreeSpace32W(LPCWSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
-#define    GetDiskFreeSpace WINELIB_NAME_AW(GetDiskFreeSpace)
-INT16      GetDlgCtrlID16(HWND16);
-INT32      GetDlgCtrlID32(HWND32);
-#define    GetDlgCtrlID WINELIB_NAME(GetDlgCtrlID)
-HWND16     GetDlgItem16(HWND16,INT16);
-HWND32     GetDlgItem32(HWND32,INT32);
-#define    GetDlgItem WINELIB_NAME(GetDlgItem)
-UINT16     GetDlgItemInt16(HWND16,INT16,BOOL16*,BOOL16);
-UINT32     GetDlgItemInt32(HWND32,INT32,BOOL32*,BOOL32);
-#define    GetDlgItemInt WINELIB_NAME(GetDlgItemInt)
-INT16      GetDlgItemText16(HWND16,INT16,SEGPTR,UINT16);
-INT32      GetDlgItemText32A(HWND32,INT32,LPSTR,UINT32);
-INT32      GetDlgItemText32W(HWND32,INT32,LPWSTR,UINT32);
-#define    GetDlgItemText WINELIB_NAME_AW(GetDlgItemText)
-UINT16     GetDoubleClickTime16(void);
-UINT32     GetDoubleClickTime32(void);
-#define    GetDoubleClickTime WINELIB_NAME(GetDoubleClickTime)
-UINT16     GetDriveType16(UINT16); /* yes, the arguments differ */
-UINT32     GetDriveType32A(LPCSTR);
-UINT32     GetDriveType32W(LPCWSTR);
-#define    GetDriveType WINELIB_NAME_AW(GetDriveType)
-INT16      GetExpandedName16(LPCSTR,LPSTR);
-INT32      GetExpandedName32A(LPCSTR,LPSTR);
-INT32      GetExpandedName32W(LPCWSTR,LPWSTR);
-#define    GetExpandedName WINELIB_NAME_AW(GetExpandedName)
-DWORD      GetFileAttributes16(LPCSTR);
-DWORD      GetFileAttributes32A(LPCSTR);
-DWORD      GetFileAttributes32W(LPCWSTR);
-#define    GetFileAttributes WINELIB_NAME_AW(GetFileAttributes)
-DWORD      GetFileVersionInfoSize16(LPCSTR,LPDWORD);
-DWORD      GetFileVersionInfoSize32A(LPCSTR,LPDWORD);
-DWORD      GetFileVersionInfoSize32W(LPCWSTR,LPDWORD);
-#define    GetFileVersionInfoSize WINELIB_NAME_AW(GetFileVersionInfoSize)
-DWORD      GetFileVersionInfo16(LPCSTR,DWORD,DWORD,LPVOID);
-DWORD      GetFileVersionInfo32A(LPCSTR,DWORD,DWORD,LPVOID);
-DWORD      GetFileVersionInfo32W(LPCWSTR,DWORD,DWORD,LPVOID);
-#define    GetFileVersionInfo WINELIB_NAME_AW(GetFileVersionInfo)
-HWND16     GetFocus16(void);
-HWND32     GetFocus32(void);
-#define    GetFocus WINELIB_NAME(GetFocus)
-DWORD      GetFreeSpace16(UINT16);
-#define    GetFreeSpace32(w) (0x100000L)
-#define    GetFreeSpace WINELIB_NAME(GetFreeSpace)
-DWORD      GetGlyphOutLine16(HDC16,UINT16,UINT16,LPGLYPHMETRICS16,DWORD,LPVOID,const MAT2*);
-DWORD      GetGlyphOutLine32A(HDC32,UINT32,UINT32,LPGLYPHMETRICS32,DWORD,LPVOID,const MAT2*);
-DWORD      GetGlyphOutLine32W(HDC32,UINT32,UINT32,LPGLYPHMETRICS32,DWORD,LPVOID,const MAT2*);
-#define    GetGlyphOutLine WINELIB_NAME_AW(GetGlyphOutLine)
-BOOL16     GetInputState16(void);
-BOOL32     GetInputState32(void);
-#define    GetInputState WINELIB_NAME(GetInputState)
-UINT16     GetInternalWindowPos16(HWND16,LPRECT16,LPPOINT16);
-UINT32     GetInternalWindowPos32(HWND32,LPRECT32,LPPOINT32);
-#define    GetInternalWindowPos WINELIB_NAME(GetInternalWindowPos)
-INT16      GetKBCodePage16(void);
-UINT32     GetKBCodePage32(void);
-#define    GetKBCodePage WINELIB_NAME(GetKBCodePage)
-INT16      GetKerningPairs16(HDC16,INT16,LPKERNINGPAIR16);
-DWORD      GetKerningPairs32A(HDC32,DWORD,LPKERNINGPAIR32);
-DWORD      GetKerningPairs32W(HDC32,DWORD,LPKERNINGPAIR32);
-#define    GetKerningPairs WINELIB_NAME_AW(GetKerningPairs)
-INT16      GetKeyboardType16(INT16);
-INT32      GetKeyboardType32(INT32);
-#define    GetKeyboardType WINELIB_NAME(GetKeyboardType)
-INT16      GetKeyNameText16(LONG,LPSTR,INT16);
-INT32      GetKeyNameText32A(LONG,LPSTR,INT32);
-INT32      GetKeyNameText32W(LONG,LPWSTR,INT32);
-#define    GetKeyNameText WINELIB_NAME_AW(GetKeyNameText)
-WORD       GetKeyState16(INT16);
-WORD       GetKeyState32(INT32);
-#define    GetKeyState WINELIB_NAME(GetKeyState)
-HWND16     GetLastActivePopup16(HWND16);
-HWND32     GetLastActivePopup32(HWND32);
-#define    GetLastActivePopup WINELIB_NAME(GetLastActivePopup)
-UINT32     GetLogicalDriveStrings32A(UINT32,LPSTR);
-UINT32     GetLogicalDriveStrings32W(UINT32,LPWSTR);
-#define    GetLogicalDriveStrings WINELIB_NAME_AW(GetLogicalDriveStrings)
-INT16      GetLocaleInfo16(LCID,LCTYPE,LPSTR,INT16);
-INT32      GetLocaleInfo32A(LCID,LCTYPE,LPSTR,INT32);
-INT32      GetLocaleInfo32W(LCID,LCTYPE,LPWSTR,INT32);
-#define    GetLocaleInfo WINELIB_NAME_AW(GetLocaleInfo)
-INT16      GetMapMode16(HDC16);
-INT32      GetMapMode32(HDC32);
-#define    GetMapMode WINELIB_NAME(GetMapMode)
-HMENU16    GetMenu16(HWND16);
-HMENU32    GetMenu32(HWND32);
-#define    GetMenu WINELIB_NAME(GetMenu)
-INT16      GetMenuItemCount16(HMENU16);
-INT32      GetMenuItemCount32(HMENU32);
-#define    GetMenuItemCount WINELIB_NAME(GetMenuItemCount)
-UINT16     GetMenuItemID16(HMENU16,INT16);
-UINT32     GetMenuItemID32(HMENU32,INT32);
-#define    GetMenuItemID WINELIB_NAME(GetMenuItemID)
-UINT16     GetMenuState16(HMENU16,UINT16,UINT16);
-UINT32     GetMenuState32(HMENU32,UINT32,UINT32);
-#define    GetMenuState WINELIB_NAME(GetMenuState)
-INT16      GetMenuString16(HMENU16,UINT16,LPSTR,INT16,UINT16);
-INT32      GetMenuString32A(HMENU32,UINT32,LPSTR,INT32,UINT32);
-INT32      GetMenuString32W(HMENU32,UINT32,LPWSTR,INT32,UINT32);
-#define    GetMenuString WINELIB_NAME_AW(GetMenuString)
-BOOL16     GetMessage16(SEGPTR,HWND16,UINT16,UINT16);
-BOOL32     GetMessage32A(LPMSG32,HWND32,UINT32,UINT32);
-BOOL32     GetMessage32W(LPMSG32,HWND32,UINT32,UINT32);
-#define    GetMessage WINELIB_NAME_AW(GetMessage)
-HMETAFILE16 GetMetaFile16(LPCSTR);
-HMETAFILE32 GetMetaFile32A(LPCSTR);
-HMETAFILE32 GetMetaFile32W(LPCWSTR);
-#define    GetMetaFile WINELIB_NAME_AW(GetMetaFile)
-INT16      GetModuleFileName16(HINSTANCE16,LPSTR,INT16);
-DWORD      GetModuleFileName32A(HMODULE32,LPSTR,DWORD);
-DWORD      GetModuleFileName32W(HMODULE32,LPWSTR,DWORD);
-#define    GetModuleFileName WINELIB_NAME_AW(GetModuleFileName)
-HMODULE16  GetModuleHandle16(LPCSTR);
-HMODULE32  GetModuleHandle32A(LPCSTR);
-HMODULE32  GetModuleHandle32W(LPCSTR);
-#define    GetModuleHandle WINELIB_NAME_AW(GetModuleHandle)
-DWORD      GetNearestColor16(HDC16,DWORD);
-DWORD      GetNearestColor32(HDC32,DWORD);
-#define    GetNearestColor WINELIB_NAME(GetNearestColor)
-UINT16     GetNearestPaletteIndex16(HPALETTE16,COLORREF);
-UINT32     GetNearestPaletteIndex32(HPALETTE32,COLORREF);
-#define    GetNearestPaletteIndex WINELIB_NAME(GetNearestPaletteIndex)
-HWND16     GetNextDlgGroupItem16(HWND16,HWND16,BOOL16);
-HWND32     GetNextDlgGroupItem32(HWND32,HWND32,BOOL32);
-#define    GetNextDlgGroupItem WINELIB_NAME(GetNextDlgGroupItem)
-HWND16     GetNextDlgTabItem16(HWND16,HWND16,BOOL16);
-HWND32     GetNextDlgTabItem32(HWND32,HWND32,BOOL32);
-#define    GetNextDlgTabItem WINELIB_NAME(GetNextDlgTabItem)
-HWND16     GetNextWindow16(HWND16,WORD);
-#define    GetNextWindow32 GetWindow32
-#define    GetNextWindow WINELIB_NAME(GetNextWindow)
-INT16      GetObject16(HANDLE16,INT16,LPVOID);
-INT32      GetObject32A(HANDLE32,INT32,LPVOID);
-INT32      GetObject32W(HANDLE32,INT32,LPVOID);
-#define    GetObject WINELIB_NAME_AW(GetObject)
-HWND16     GetOpenClipboardWindow16(void);
-HWND32     GetOpenClipboardWindow32(void);
-#define    GetOpenClipboardWindow WINELIB_NAME(GetOpenClipboardWindow)
-UINT16     GetPaletteEntries16(HPALETTE16,UINT16,UINT16,LPPALETTEENTRY);
-UINT32     GetPaletteEntries32(HPALETTE32,UINT32,UINT32,LPPALETTEENTRY);
-#define    GetPaletteEntries WINELIB_NAME(GetPaletteEntries)
-HWND16     GetParent16(HWND16);
-HWND32     GetParent32(HWND32);
-#define    GetParent WINELIB_NAME(GetParent)
-COLORREF   GetPixel16(HDC16,INT16,INT16);
-COLORREF   GetPixel32(HDC32,INT32,INT32);
-#define    GetPixel WINELIB_NAME(GetPixel)
-INT16      GetPolyFillMode16(HDC16);
-INT32      GetPolyFillMode32(HDC32);
-#define    GetPolyFillMode WINELIB_NAME(GetPolyFillMode)
-INT16      GetPriorityClipboardFormat16(UINT16*,INT16);
-INT32      GetPriorityClipboardFormat32(UINT32*,INT32);
-#define    GetPriorityClipboardFormat WINELIB_NAME(GetPriorityClipboardFormat)
-UINT16     GetPrivateProfileInt16(LPCSTR,LPCSTR,INT16,LPCSTR);
-UINT32     GetPrivateProfileInt32A(LPCSTR,LPCSTR,INT32,LPCSTR);
-UINT32     GetPrivateProfileInt32W(LPCWSTR,LPCWSTR,INT32,LPCWSTR);
-#define    GetPrivateProfileInt WINELIB_NAME_AW(GetPrivateProfileInt)
-INT16      GetPrivateProfileString16(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT16,LPCSTR);
-INT32      GetPrivateProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT32,LPCSTR);
-INT32      GetPrivateProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,INT32,LPCWSTR);
-#define    GetPrivateProfileString WINELIB_NAME_AW(GetPrivateProfileString)
-FARPROC16  GetProcAddress16(HMODULE16,SEGPTR);
-FARPROC32  GetProcAddress32(HMODULE32,LPCSTR);
-#define    GetProcAddress WINELIB_NAME(GetProcAddress)
-UINT16     GetProfileInt16(LPCSTR,LPCSTR,INT16);
-UINT32     GetProfileInt32A(LPCSTR,LPCSTR,INT32);
-UINT32     GetProfileInt32W(LPCWSTR,LPCWSTR,INT32);
-#define    GetProfileInt WINELIB_NAME_AW(GetProfileInt)
-INT16      GetProfileString16(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT16);
-INT32      GetProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT32);
-INT32      GetProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,INT32);
-#define    GetProfileString WINELIB_NAME_AW(GetProfileString)
-HANDLE16   GetProp16(HWND16,LPCSTR);
-HANDLE32   GetProp32A(HWND32,LPCSTR);
-HANDLE32   GetProp32W(HWND32,LPCWSTR);
-#define    GetProp WINELIB_NAME_AW(GetProp)
-DWORD      GetQueueStatus16(UINT16);
-DWORD      GetQueueStatus32(UINT32);
-#define    GetQueueStatus WINELIB_NAME(GetQueueStatus)
-BOOL16     GetRasterizerCaps16(LPRASTERIZER_STATUS,UINT16);
-BOOL32     GetRasterizerCaps32(LPRASTERIZER_STATUS,UINT32);
-#define    GetRasterizerCaps WINELIB_NAME(GetRasterizerCaps)
-INT16      GetRelAbs16(HDC16);
-INT32      GetRelAbs32(HDC32);
-#define    GetRelAbs WINELIB_NAME(GetRelAbs)
-INT16      GetRgnBox16(HRGN16,LPRECT16);
-INT32      GetRgnBox32(HRGN32,LPRECT32);
-#define    GetRgnBox WINELIB_NAME(GetRgnBox)
-INT16      GetROP216(HDC16);
-INT32      GetROP232(HDC32);
-#define    GetROP2 WINELIB_NAME(GetROP2)
-BOOL16     GetScrollInfo16(HWND16,INT16,LPSCROLLINFO);
-BOOL32     GetScrollInfo32(HWND32,INT32,LPSCROLLINFO);
-#define    GetScrollInfo WINELIB_NAME(GetScrollInfo)
-INT16      GetScrollPos16(HWND16,INT16);
-INT32      GetScrollPos32(HWND32,INT32);
-#define    GetScrollPos WINELIB_NAME(GetScrollPos)
-BOOL16     GetScrollRange16(HWND16,INT16,LPINT16,LPINT16);
-BOOL32     GetScrollRange32(HWND32,INT32,LPINT32,LPINT32);
-#define    GetScrollRange WINELIB_NAME(GetScrollRange)
-HGDIOBJ16  GetStockObject16(INT16);
-HGDIOBJ32  GetStockObject32(INT32);
-#define    GetStockObject WINELIB_NAME(GetStockObject)
-INT16      GetStretchBltMode16(HDC16);
-INT32      GetStretchBltMode32(HDC32);
-#define    GetStretchBltMode WINELIB_NAME(GetStretchBltMode)
-BOOL16     GetStringType16(LCID,DWORD,LPCSTR,INT16,LPWORD);
-BOOL32     GetStringType32A(LCID,DWORD,LPCSTR,INT32,LPWORD);
-BOOL32     GetStringType32W(DWORD,LPCWSTR,INT32,LPWORD);
-#define    GetStringType WINELIB_NAME_AW(GetStringType)
-HMENU16    GetSubMenu16(HMENU16,INT16);
-HMENU32    GetSubMenu32(HMENU32,INT32);
-#define    GetSubMenu WINELIB_NAME(GetSubMenu)
-COLORREF   GetSysColor16(INT16);
-COLORREF   GetSysColor32(INT32);
-#define    GetSysColor WINELIB_NAME(GetSysColor)
-HBRUSH16   GetSysColorBrush16(INT16);
-HBRUSH32   GetSysColorBrush32(INT32);
-#define    GetSysColorBrush WINELIB_NAME(GetSysColorBrush)
-HWND16     GetSysModalWindow16(void);
-#define    GetSysModalWindow32() ((HWND32)0)
-#define    GetSysModalWindow WINELIB_NAME(GetSysModalWindow)
-UINT16     GetSystemDirectory16(LPSTR,UINT16);
-UINT32     GetSystemDirectory32A(LPSTR,UINT32);
-UINT32     GetSystemDirectory32W(LPWSTR,UINT32);
-#define    GetSystemDirectory WINELIB_NAME_AW(GetSystemDirectory)
-HMENU16    GetSystemMenu16(HWND16,BOOL16);
-HMENU32    GetSystemMenu32(HWND32,BOOL32);
-#define    GetSystemMenu WINELIB_NAME(GetSystemMenu)
-INT16      GetSystemMetrics16(INT16);
-INT32      GetSystemMetrics32(INT32);
-#define    GetSystemMetrics WINELIB_NAME(GetSystemMetrics)
-UINT16     GetSystemPaletteEntries16(HDC16,UINT16,UINT16,LPPALETTEENTRY);
-UINT32     GetSystemPaletteEntries32(HDC32,UINT32,UINT32,LPPALETTEENTRY);
-#define    GetSystemPaletteEntries WINELIB_NAME(GetSystemPaletteEntries)
-UINT16     GetSystemPaletteUse16(HDC16);
-UINT32     GetSystemPaletteUse32(HDC32);
-#define    GetSystemPaletteUse WINELIB_NAME(GetSystemPaletteUse)
-DWORD      GetTabbedTextExtent16(HDC16,LPCSTR,INT16,INT16,const INT16*);
-DWORD      GetTabbedTextExtent32A(HDC32,LPCSTR,INT32,INT32,const INT32*);
-DWORD      GetTabbedTextExtent32W(HDC32,LPCWSTR,INT32,INT32,const INT32*);
-#define    GetTabbedTextExtent WINELIB_NAME_AW(GetTabbedTextExtent)
-UINT16     GetTempFileName16(BYTE,LPCSTR,UINT16,LPSTR);
-UINT32     GetTempFileName32A(LPCSTR,LPCSTR,UINT32,LPSTR);
-UINT32     GetTempFileName32W(LPCWSTR,LPCWSTR,UINT32,LPWSTR);
-#define    GetTempFileName WINELIB_NAME_AW(GetTempFileName)
-UINT32     GetTempPath32A(UINT32,LPSTR);
-UINT32     GetTempPath32W(UINT32,LPWSTR);
-#define    GetTempPath WINELIB_NAME_AW(GetTempPath)
-UINT16     GetTextAlign16(HDC16);
-UINT32     GetTextAlign32(HDC32);
-#define    GetTextAlign WINELIB_NAME(GetTextAlign)
-INT16      GetTextCharacterExtra16(HDC16);
-INT32      GetTextCharacterExtra32(HDC32);
-#define    GetTextCharacterExtra WINELIB_NAME(GetTextCharacterExtra)
-COLORREF   GetTextColor16(HDC16);
-COLORREF   GetTextColor32(HDC32);
-#define    GetTextColor WINELIB_NAME(GetTextColor)
-BOOL16     GetTextExtentPoint16(HDC16,LPCSTR,INT16,LPSIZE16);
-BOOL32     GetTextExtentPoint32A(HDC32,LPCSTR,INT32,LPSIZE32);
-BOOL32     GetTextExtentPoint32W(HDC32,LPCWSTR,INT32,LPSIZE32);
-#define    GetTextExtentPoint WINELIB_NAME_AW(GetTextExtentPoint)
-INT16      GetTextFace16(HDC16,INT16,LPSTR);
-INT32      GetTextFace32A(HDC32,INT32,LPSTR);
-INT32      GetTextFace32W(HDC32,INT32,LPWSTR);
-#define    GetTextFace WINELIB_NAME_AW(GetTextFace)
-BOOL16     GetTextMetrics16(HDC16,LPTEXTMETRIC16);
-BOOL32     GetTextMetrics32A(HDC32,LPTEXTMETRIC32A);
-BOOL32     GetTextMetrics32W(HDC32,LPTEXTMETRIC32W);
-#define    GetTextMetrics WINELIB_NAME_AW(GetTextMetrics)
-LPINT16    GetThresholdEvent16(void);
-LPDWORD    GetThresholdEvent32(void);
-#define    GetThresholdEvent WINELIB_NAME(GetThresholdEvent)
-INT16      GetThresholdStatus16(void);
-DWORD      GetThresholdStatus32(void);
-#define    GetThresholdStatus WINELIB_NAME(GetThresholdStatus)
-HWND16     GetTopWindow16(HWND16);
-HWND32     GetTopWindow32(HWND32);
-#define    GetTopWindow WINELIB_NAME(GetTopWindow)
-BOOL16     GetUpdateRect16(HWND16,LPRECT16,BOOL16);
-BOOL32     GetUpdateRect32(HWND32,LPRECT32,BOOL32);
-#define    GetUpdateRect WINELIB_NAME(GetUpdateRect)
-INT16      GetUpdateRgn16(HWND16,HRGN16,BOOL16);
-INT32      GetUpdateRgn32(HWND32,HRGN32,BOOL32);
-#define    GetUpdateRgn WINELIB_NAME(GetUpdateRgn)
-LONG       GetVersion16(void);
-LONG       GetVersion32(void);
-#define    GetVersion WINELIB_NAME(GetVersion)
-BOOL16     GetViewportExtEx16(HDC16,LPPOINT16);
-BOOL32     GetViewportExtEx32(HDC32,LPPOINT32);
-#define    GetViewportExtEx WINELIB_NAME(GetViewportExtEx)
-BOOL16     GetViewportOrgEx16(HDC16,LPPOINT16);
-BOOL32     GetViewportOrgEx32(HDC32,LPPOINT32);
-#define    GetViewportOrgEx WINELIB_NAME(GetViewportOrgEx)
-BOOL32     GetVolumeInformation32A(LPCSTR,LPSTR,DWORD,LPDWORD,LPDWORD,LPDWORD,LPSTR,DWORD);
-BOOL32     GetVolumeInformation32W(LPCWSTR,LPWSTR,DWORD,LPDWORD,LPDWORD,LPDWORD,LPWSTR,DWORD);
-#define    GetVolumeInformation WINELIB_NAME_AW(GetVolumeInformation)
-HWND16     GetWindow16(HWND16,WORD);
-HWND32     GetWindow32(HWND32,WORD);
-#define    GetWindow WINELIB_NAME(GetWindow)
-HDC16      GetWindowDC16(HWND16);
-HDC32      GetWindowDC32(HWND32);
-#define    GetWindowDC WINELIB_NAME(GetWindowDC)
-BOOL16     GetWindowExtEx16(HDC16,LPPOINT16);
-BOOL32     GetWindowExtEx32(HDC32,LPPOINT32);
-#define    GetWindowExtEx WINELIB_NAME(GetWindowExtEx)
-LONG       GetWindowLong16(HWND16,INT16);
-LONG       GetWindowLong32A(HWND32,INT32);
-LONG       GetWindowLong32W(HWND32,INT32);
-#define    GetWindowLong WINELIB_NAME_AW(GetWindowLong)
-BOOL16     GetWindowOrgEx16(HDC16,LPPOINT16);
-BOOL32     GetWindowOrgEx32(HDC32,LPPOINT32);
-#define    GetWindowOrgEx WINELIB_NAME(GetWindowOrgEx)
-BOOL16     GetWindowPlacement16(HWND16,LPWINDOWPLACEMENT16);
-BOOL32     GetWindowPlacement32(HWND32,LPWINDOWPLACEMENT32);
-#define    GetWindowPlacement WINELIB_NAME(GetWindowPlacement)
-void       GetWindowRect16(HWND16,LPRECT16);
-void       GetWindowRect32(HWND32,LPRECT32);
-#define    GetWindowRect WINELIB_NAME(GetWindowRect)
-UINT16     GetWindowsDirectory16(LPSTR,UINT16);
-UINT32     GetWindowsDirectory32A(LPSTR,UINT32);
-UINT32     GetWindowsDirectory32W(LPWSTR,UINT32);
-#define    GetWindowsDirectory WINELIB_NAME_AW(GetWindowsDirectory)
-HTASK16    GetWindowTask16(HWND16);
-#define    GetWindowTask32(hwnd) ((HTASK32)GetWindowThreadProcessId(hwnd,NULL))
-#define    GetWindowTask WINELIB_NAME(GetWindowTask)
-INT16      GetWindowText16(HWND16,SEGPTR,INT16);
-INT32      GetWindowText32A(HWND32,LPSTR,INT32);
-INT32      GetWindowText32W(HWND32,LPWSTR,INT32);
-#define    GetWindowText WINELIB_NAME_AW(GetWindowText)
-INT16      GetWindowTextLength16(HWND16);
-INT32      GetWindowTextLength32A(HWND32);
-INT32      GetWindowTextLength32W(HWND32);
-#define    GetWindowTextLength WINELIB_NAME_AW(GetWindowTextLength)
-WORD       GetWindowWord16(HWND16,INT16);
-WORD       GetWindowWord32(HWND32,INT32);
-#define    GetWindowWord WINELIB_NAME(GetWindowWord)
-ATOM       GlobalAddAtom16(SEGPTR);
-ATOM       GlobalAddAtom32A(LPCSTR);
-ATOM       GlobalAddAtom32W(LPCWSTR);
-#define    GlobalAddAtom WINELIB_NAME_AW(GlobalAddAtom)
-HGLOBAL16  GlobalAlloc16(UINT16,DWORD);
-HGLOBAL32  GlobalAlloc32(UINT32,DWORD);
-#define    GlobalAlloc WINELIB_NAME(GlobalAlloc)
-DWORD      GlobalCompact16(DWORD);
-DWORD      GlobalCompact32(DWORD);
-#define    GlobalCompact WINELIB_NAME(GlobalCompact)
-UINT16     GlobalFlags16(HGLOBAL16);
-UINT32     GlobalFlags32(HGLOBAL32);
-#define    GlobalFlags WINELIB_NAME(GlobalFlags)
-ATOM       GlobalFindAtom16(SEGPTR);
-ATOM       GlobalFindAtom32A(LPCSTR);
-ATOM       GlobalFindAtom32W(LPCWSTR);
-#define    GlobalFindAtom WINELIB_NAME_AW(GlobalFindAtom)
-HGLOBAL16  GlobalFree16(HGLOBAL16);
-HGLOBAL32  GlobalFree32(HGLOBAL32);
-#define    GlobalFree WINELIB_NAME(GlobalFree)
-UINT16     GlobalGetAtomName16(ATOM,LPSTR,INT16);
-UINT32     GlobalGetAtomName32A(ATOM,LPSTR,INT32);
-UINT32     GlobalGetAtomName32W(ATOM,LPWSTR,INT32);
-#define    GlobalGetAtomName WINELIB_NAME_AW(GlobalGetAtomName)
-DWORD      GlobalHandle16(WORD);
-HGLOBAL32  GlobalHandle32(LPCVOID);
-#define    GlobalHandle WINELIB_NAME(GlobalHandle)
-VOID       GlobalFix16(HGLOBAL16);
-VOID       GlobalFix32(HGLOBAL32);
-#define    GlobalFix WINELIB_NAME(GlobalFix)
-LPVOID     GlobalLock16(HGLOBAL16);
-LPVOID     GlobalLock32(HGLOBAL32);
-#define    GlobalLock WINELIB_NAME(GlobalLock)
-HGLOBAL16  GlobalReAlloc16(HGLOBAL16,DWORD,UINT16);
-HGLOBAL32  GlobalReAlloc32(HGLOBAL32,DWORD,UINT32);
-#define    GlobalReAlloc WINELIB_NAME(GlobalReAlloc)
-DWORD      GlobalSize16(HGLOBAL16);
-DWORD      GlobalSize32(HGLOBAL32);
-#define    GlobalSize WINELIB_NAME(GlobalSize)
-VOID       GlobalUnfix16(HGLOBAL16);
-VOID       GlobalUnfix32(HGLOBAL32);
-#define    GlobalUnfix WINELIB_NAME(GlobalUnfix)
-BOOL16     GlobalUnlock16(HGLOBAL16);
-BOOL32     GlobalUnlock32(HGLOBAL32);
-#define    GlobalUnlock WINELIB_NAME(GlobalUnlock)
-BOOL16     GlobalUnWire16(HGLOBAL16);
-BOOL32     GlobalUnWire32(HGLOBAL32);
-#define    GlobalUnWire WINELIB_NAME(GlobalUnWire)
-SEGPTR     GlobalWire16(HGLOBAL16);
-LPVOID     GlobalWire32(HGLOBAL32);
-#define    GlobalWire WINELIB_NAME(GlobalWire)
-BOOL16     GrayString16(HDC16,HBRUSH16,GRAYSTRINGPROC16,LPARAM,
-                        INT16,INT16,INT16,INT16,INT16);
-BOOL32     GrayString32A(HDC32,HBRUSH32,GRAYSTRINGPROC32,LPARAM,
-                         INT32,INT32,INT32,INT32,INT32);
-BOOL32     GrayString32W(HDC32,HBRUSH32,GRAYSTRINGPROC32,LPARAM,
-                         INT32,INT32,INT32,INT32,INT32);
-#define    GrayString WINELIB_NAME_AW(GrayString)
-VOID       HideCaret16(HWND16);
-BOOL32     HideCaret32(HWND32);
-#define    HideCaret WINELIB_NAME(HideCaret)
-BOOL16     HiliteMenuItem16(HWND16,HMENU16,UINT16,UINT16);
-BOOL32     HiliteMenuItem32(HWND32,HMENU32,UINT32,UINT32);
-#define    HiliteMenuItem WINELIB_NAME(HiliteMenuItem)
-void       InflateRect16(LPRECT16,INT16,INT16);
-void       InflateRect32(LPRECT32,INT32,INT32);
-#define    InflateRect WINELIB_NAME(InflateRect)
-WORD       InitAtomTable16(WORD);
-BOOL32     InitAtomTable32(DWORD);
-#define    InitAtomTable WINELIB_NAME(InitAtomTable)
-BOOL16     InSendMessage16(void);
-BOOL32     InSendMessage32(void);
-#define    InSendMessage WINELIB_NAME(InSendMessage)
-BOOL16     InsertMenu16(HMENU16,UINT16,UINT16,UINT16,SEGPTR);
-BOOL32     InsertMenu32A(HMENU32,UINT32,UINT32,UINT32,LPCSTR);
-BOOL32     InsertMenu32W(HMENU32,UINT32,UINT32,UINT32,LPCWSTR);
-#define    InsertMenu WINELIB_NAME_AW(InsertMenu)
-INT16      IntersectClipRect16(HDC16,INT16,INT16,INT16,INT16);
-INT32      IntersectClipRect32(HDC32,INT32,INT32,INT32,INT32);
-#define    IntersectClipRect WINELIB_NAME(IntersectClipRect)
-BOOL16     IntersectRect16(LPRECT16,const RECT16*,const RECT16*);
-BOOL32     IntersectRect32(LPRECT32,const RECT32*,const RECT32*);
-#define    IntersectRect WINELIB_NAME(IntersectRect)
-void       InvalidateRect16(HWND16,const RECT16*,BOOL16);
-void       InvalidateRect32(HWND32,const RECT32*,BOOL32);
-#define    InvalidateRect WINELIB_NAME(InvalidateRect)
-void       InvalidateRgn16(HWND16,HRGN16,BOOL16);
-void       InvalidateRgn32(HWND32,HRGN32,BOOL32);
-#define    InvalidateRgn WINELIB_NAME(InvalidateRgn)
-void       InvertRect16(HDC16,const RECT16*);
-void       InvertRect32(HDC32,const RECT32*);
-#define    InvertRect WINELIB_NAME(InvertRect)
-BOOL16     InvertRgn16(HDC16,HRGN16);
-BOOL32     InvertRgn32(HDC32,HRGN32);
-#define    InvertRgn WINELIB_NAME(InvertRgn)
-BOOL16     IsBadCodePtr16(SEGPTR);
-BOOL32     IsBadCodePtr32(FARPROC32);
-#define    IsBadCodePtr WINELIB_NAME(IsBadCodePtr)
-BOOL16     IsBadHugeReadPtr16(SEGPTR,DWORD);
-BOOL32     IsBadHugeReadPtr32(LPCVOID,UINT32);
-#define    IsBadHugeReadPtr WINELIB_NAME(IsBadHugeReadPtr)
-BOOL16     IsBadHugeWritePtr16(SEGPTR,DWORD);
-BOOL32     IsBadHugeWritePtr32(LPVOID,UINT32);
-#define    IsBadHugeWritePtr WINELIB_NAME(IsBadHugeWritePtr)
-BOOL16     IsBadReadPtr16(SEGPTR,UINT16);
-BOOL32     IsBadReadPtr32(LPCVOID,UINT32);
-#define    IsBadReadPtr WINELIB_NAME(IsBadReadPtr)
-BOOL16     IsBadStringPtr16(SEGPTR,UINT16);
-BOOL32     IsBadStringPtr32A(LPCSTR,UINT32);
-BOOL32     IsBadStringPtr32W(LPCWSTR,UINT32);
-#define    IsBadStringPtr WINELIB_NAME_AW(IsBadStringPtr)
-BOOL16     IsBadWritePtr16(SEGPTR,UINT16);
-BOOL32     IsBadWritePtr32(LPVOID,UINT32);
-#define    IsBadWritePtr WINELIB_NAME(IsBadWritePtr)
-BOOL16     IsCharAlpha16(CHAR);
-BOOL32     IsCharAlpha32A(CHAR);
-BOOL32     IsCharAlpha32W(WCHAR);
-#define    IsCharAlpha WINELIB_NAME_AW(IsCharAlpha)
-BOOL16     IsCharAlphaNumeric16(CHAR);
-BOOL32     IsCharAlphaNumeric32A(CHAR);
-BOOL32     IsCharAlphaNumeric32W(WCHAR);
-#define    IsCharAlphaNumeric WINELIB_NAME_AW(IsCharAlphaNumeric)
-BOOL16     IsCharLower16(CHAR);
-BOOL32     IsCharLower32A(CHAR);
-BOOL32     IsCharLower32W(WCHAR);
-#define    IsCharLower WINELIB_NAME_AW(IsCharLower)
-BOOL16     IsCharUpper16(CHAR);
-BOOL32     IsCharUpper32A(CHAR);
-BOOL32     IsCharUpper32W(WCHAR);
-#define    IsCharUpper WINELIB_NAME_AW(IsCharUpper)
-BOOL16     IsChild16(HWND16,HWND16);
-BOOL32     IsChild32(HWND32,HWND32);
-#define    IsChild WINELIB_NAME(IsChild)
-BOOL16     IsClipboardFormatAvailable16(UINT16);
-BOOL32     IsClipboardFormatAvailable32(UINT32);
-#define    IsClipboardFormatAvailable WINELIB_NAME(IsClipboardFormatAvailable)
-BOOL16     IsDBCSLeadByte16(BYTE);
-BOOL32     IsDBCSLeadByte32(BYTE);
-#define    IsDBCSLeadByte WINELIB_NAME(IsDBCSLeadByte)
-BOOL16     IsDialogMessage16(HWND16,LPMSG16);
-BOOL32     IsDialogMessage32A(HWND32,LPMSG32);
-BOOL32     IsDialogMessage32W(HWND32,LPMSG32);
-#define    IsDialogMessage WINELIB_NAME(IsDialogMessage)
-UINT16     IsDlgButtonChecked16(HWND16,UINT16);
-UINT32     IsDlgButtonChecked32(HWND32,UINT32);
-#define    IsDlgButtonChecked WINELIB_NAME(IsDlgButtonChecked)
-BOOL16     IsIconic16(HWND16);
-BOOL32     IsIconic32(HWND32);
-#define    IsIconic WINELIB_NAME(IsIconic)
-BOOL16     IsMenu16(HMENU16);
-BOOL32     IsMenu32(HMENU32);
-#define    IsMenu WINELIB_NAME(IsMenu)
-BOOL16     IsRectEmpty16(const RECT16*);
-BOOL32     IsRectEmpty32(const RECT32*);
-#define    IsRectEmpty WINELIB_NAME(IsRectEmpty)
-BOOL16     IsWindow16(HWND16);
-BOOL32     IsWindow32(HWND32);
-#define    IsWindow WINELIB_NAME(IsWindow)
-BOOL16     IsWindowEnabled16(HWND16);
-BOOL32     IsWindowEnabled32(HWND32);
-#define    IsWindowEnabled WINELIB_NAME(IsWindowEnabled)
-BOOL16     IsWindowVisible16(HWND16);
-BOOL32     IsWindowVisible32(HWND32);
-#define    IsWindowVisible WINELIB_NAME(IsWindowVisible)
-BOOL16     IsZoomed16(HWND16);
-BOOL32     IsZoomed32(HWND32);
-#define    IsZoomed WINELIB_NAME(IsZoomed)
-BOOL16     KillSystemTimer16(HWND16,UINT16);
-BOOL32     KillSystemTimer32(HWND32,UINT32);
-#define    KillSystemTimer WINELIB_NAME(KillSystemTimer)
-BOOL16     KillTimer16(HWND16,UINT16);
-BOOL32     KillTimer32(HWND32,UINT32);
-#define    KillTimer WINELIB_NAME(KillTimer)
-HFILE16    LZOpenFile16(LPCSTR,LPOFSTRUCT,UINT16);
-HFILE32    LZOpenFile32A(LPCSTR,LPOFSTRUCT,UINT32);
-HFILE32    LZOpenFile32W(LPCWSTR,LPOFSTRUCT,UINT32);
-#define    LZOpenFile WINELIB_NAME_AW(LZOpenFile)
-INT16      LZRead16(HFILE16,LPVOID,UINT16); 
-INT32      LZRead32(HFILE32,LPVOID,UINT32); 
-#define    LZRead WINELIB_NAME(LZRead)
-INT16      LZStart16(void);
-INT32      LZStart32(void);
-#define    LZStart WINELIB_NAME(LZStart)
-VOID       LineDDA16(INT16,INT16,INT16,INT16,LINEDDAPROC16,LPARAM);
-BOOL32     LineDDA32(INT32,INT32,INT32,INT32,LINEDDAPROC32,LPARAM);
-#define    LineDDA WINELIB_NAME(LineDDA)
-BOOL16     LineTo16(HDC16,INT16,INT16);
-BOOL32     LineTo32(HDC32,INT32,INT32);
-#define    LineTo WINELIB_NAME(LineTo)
-HACCEL16   LoadAccelerators16(HINSTANCE16,SEGPTR);
-HACCEL32   LoadAccelerators32A(HINSTANCE32,LPCSTR);
-HACCEL32   LoadAccelerators32W(HINSTANCE32,LPCWSTR);
-#define    LoadAccelerators WINELIB_NAME_AW(LoadAccelerators)
-HBITMAP16  LoadBitmap16(HANDLE16,SEGPTR);
-HBITMAP32  LoadBitmap32A(HANDLE32,LPCSTR);
-HBITMAP32  LoadBitmap32W(HANDLE32,LPCWSTR);
-#define    LoadBitmap WINELIB_NAME(LoadBitmap)
-HCURSOR16  LoadCursor16(HINSTANCE16,SEGPTR);
-HCURSOR32  LoadCursor32A(HINSTANCE32,LPCSTR);
-HCURSOR32  LoadCursor32W(HINSTANCE32,LPCWSTR);
-#define    LoadCursor WINELIB_NAME_AW(LoadCursor)
-HICON16    LoadIcon16(HINSTANCE16,SEGPTR);
-HICON32    LoadIcon32A(HINSTANCE32,LPCSTR);
-HICON32    LoadIcon32W(HINSTANCE32,LPCWSTR);
-#define    LoadIcon WINELIB_NAME_AW(LoadIcon)
-HINSTANCE16 LoadLibrary16(LPCSTR);
-HINSTANCE32 LoadLibrary32A(LPCSTR);
-HINSTANCE32 LoadLibrary32W(LPCWSTR);
-#define    LoadLibrary WINELIB_NAME_AW(LoadLibrary)
-HMENU16    LoadMenu16(HINSTANCE16,SEGPTR);
-HMENU32    LoadMenu32A(HINSTANCE32,LPCSTR);
-HMENU32    LoadMenu32W(HINSTANCE32,LPCWSTR);
-#define    LoadMenu WINELIB_NAME_AW(LoadMenu)
-HMENU16    LoadMenuIndirect16(LPCVOID);
-HMENU32    LoadMenuIndirect32A(LPCVOID);
-HMENU32    LoadMenuIndirect32W(LPCVOID);
-#define    LoadMenuIndirect WINELIB_NAME_AW(LoadMenuIndirect)
-HINSTANCE16 LoadModule16(LPCSTR,LPVOID);
-DWORD      LoadModule32(LPCSTR,LPVOID);
-#define    LoadModule WINELIB_NAME(LoadModule)
-HGLOBAL16  LoadResource16(HINSTANCE16,HRSRC16);
-HGLOBAL32  LoadResource32(HINSTANCE32,HRSRC32);
-#define    LoadResource WINELIB_NAME(LoadResource)
-INT16      LoadString16(HINSTANCE16,UINT16,LPSTR,INT16);
-INT32      LoadString32A(HINSTANCE32,UINT32,LPSTR,INT32);
-INT32      LoadString32W(HINSTANCE32,UINT32,LPWSTR,INT32);
-#define    LoadString WINELIB_NAME_AW(LoadString)
-HLOCAL16   LocalAlloc16(UINT16,WORD);
-HLOCAL32   LocalAlloc32(UINT32,DWORD);
-#define    LocalAlloc WINELIB_NAME(LocalAlloc)
-UINT16     LocalCompact16(UINT16);
-UINT32     LocalCompact32(UINT32);
-#define    LocalCompact WINELIB_NAME(LocalCompact)
-UINT16     LocalFlags16(HLOCAL16);
-UINT32     LocalFlags32(HLOCAL32);
-#define    LocalFlags WINELIB_NAME(LocalFlags)
-HLOCAL16   LocalFree16(HLOCAL16);
-HLOCAL32   LocalFree32(HLOCAL32);
-#define    LocalFree WINELIB_NAME(LocalFree)
-HLOCAL16   LocalHandle16(WORD);
-HLOCAL32   LocalHandle32(LPCVOID);
-#define    LocalHandle WINELIB_NAME(LocalHandle)
-SEGPTR     LocalLock16(HLOCAL16);
-LPVOID     LocalLock32(HLOCAL32);
-#define    LocalLock WINELIB_NAME(LocalLock)
-HLOCAL16   LocalReAlloc16(HLOCAL16,WORD,UINT16);
-HLOCAL32   LocalReAlloc32(HLOCAL32,DWORD,UINT32);
-#define    LocalReAlloc WINELIB_NAME(LocalReAlloc)
-UINT16     LocalShrink16(HGLOBAL16,UINT16);
-UINT32     LocalShrink32(HGLOBAL32,UINT32);
-#define    LocalShrink WINELIB_NAME(LocalShrink)
-UINT16     LocalSize16(HLOCAL16);
-UINT32     LocalSize32(HLOCAL32);
-#define    LocalSize WINELIB_NAME(LocalSize)
-BOOL16     LocalUnlock16(HLOCAL16);
-BOOL32     LocalUnlock32(HLOCAL32);
-#define    LocalUnlock WINELIB_NAME(LocalUnlock)
-LPVOID     LockResource16(HGLOBAL16);
-LPVOID     LockResource32(HGLOBAL32);
-#define    LockResource WINELIB_NAME(LockResource)
-HGLOBAL16  LockSegment16(HGLOBAL16);
-#define    LockSegment32(handle) GlobalFix32((HANDLE32)(handle))
-#define    LockSegment WINELIB_NAME(LockSegment)
-BOOL16     LockWindowUpdate16(HWND16);
-BOOL32     LockWindowUpdate32(HWND32);
-#define    LockWindowUpdate WINELIB_NAME(LockWindowUpdate)
-BOOL16     LPtoDP16(HDC16,LPPOINT16,INT16);
-BOOL32     LPtoDP32(HDC32,LPPOINT32,INT32);
-#define    LPtoDP WINELIB_NAME(LPtoDP)
-void       LZClose16(HFILE16);
-void       LZClose32(HFILE32);
-#define    LZClose WINELIB_NAME(LZClose)
-LONG       LZCopy16(HFILE16,HFILE16);
-LONG       LZCopy32(HFILE32,HFILE32);
-#define    LZCopy WINELIB_NAME(LZCopy)
-HFILE16    LZInit16(HFILE16);
-HFILE32    LZInit32(HFILE32);
-#define    LZInit WINELIB_NAME(LZInit)
-LONG       LZSeek16(HFILE16,LONG,INT16);
-LONG       LZSeek32(HFILE32,LONG,INT32);
-#define    LZSeek WINELIB_NAME(LZSeek)
-UINT16     MapVirtualKey16(UINT16,UINT16);
-UINT32     MapVirtualKey32A(UINT32,UINT32);
-UINT32     MapVirtualKey32W(UINT32,UINT32);
-#define    MapVirtualKey WINELIB_NAME_AW(MapVirtualKey)
-FARPROC16  MakeProcInstance16(FARPROC16,HANDLE16);
-#define    MakeProcInstance32(proc,inst) (proc)
-#define    MakeProcInstance WINELIB_NAME(MakeProcInstance)
-void       MapDialogRect16(HWND16,LPRECT16);
-void       MapDialogRect32(HWND32,LPRECT32);
-#define    MapDialogRect WINELIB_NAME(MapDialogRect)
-void       MapWindowPoints16(HWND16,HWND16,LPPOINT16,UINT16);
-void       MapWindowPoints32(HWND32,HWND32,LPPOINT32,UINT32);
-#define    MapWindowPoints WINELIB_NAME(MapWindowPoints)
-VOID       MessageBeep16(UINT16);
-BOOL32     MessageBeep32(UINT32);
-#define    MessageBeep WINELIB_NAME(MessageBeep)
-INT16      MessageBox16(HWND16,LPCSTR,LPCSTR,UINT16);
-INT32      MessageBox32A(HWND32,LPCSTR,LPCSTR,UINT32);
-INT32      MessageBox32W(HWND32,LPCWSTR,LPCWSTR,UINT32);
-#define    MessageBox WINELIB_NAME_AW(MessageBox)
-BOOL16     ModifyMenu16(HMENU16,UINT16,UINT16,UINT16,SEGPTR);
-BOOL32     ModifyMenu32A(HMENU32,UINT32,UINT32,UINT32,LPCSTR);
-BOOL32     ModifyMenu32W(HMENU32,UINT32,UINT32,UINT32,LPCWSTR);
-#define    ModifyMenu WINELIB_NAME_AW(ModifyMenu)
-BOOL16     MoveToEx16(HDC16,INT16,INT16,LPPOINT16);
-BOOL32     MoveToEx32(HDC32,INT32,INT32,LPPOINT32);
-#define    MoveToEx WINELIB_NAME(MoveToEx)
-BOOL16     MoveWindow16(HWND16,INT16,INT16,INT16,INT16,BOOL16);
-BOOL32     MoveWindow32(HWND32,INT32,INT32,INT32,INT32,BOOL32);
-#define    MoveWindow WINELIB_NAME(MoveWindow)
-INT16      MulDiv16(INT16,INT16,INT16);
-INT32      MulDiv32(INT32,INT32,INT32);
-#define    MulDiv WINELIB_NAME(MulDiv)
-INT16      OemToAnsi16(LPCSTR,LPSTR);
-#define    OemToAnsi32A OemToChar32A
-#define    OemToAnsi32W OemToChar32W
-#define    OemToAnsi WINELIB_NAME_AW(OemToAnsi)
-VOID       OemToAnsiBuff16(LPCSTR,LPSTR,UINT16);
-#define    OemToAnsiBuff32A OemToCharBuff32A
-#define    OemToAnsiBuff32W OemToCharBuff32W
-#define    OemToAnsiBuff WINELIB_NAME_AW(OemToAnsiBuff)
-BOOL32     OemToChar32A(LPCSTR,LPSTR);
-BOOL32     OemToChar32W(LPCSTR,LPWSTR);
-#define    OemToChar WINELIB_NAME_AW(OemToChar)
-BOOL32     OemToCharBuff32A(LPCSTR,LPSTR,DWORD);
-BOOL32     OemToCharBuff32W(LPCSTR,LPWSTR,DWORD);
-#define    OemToCharBuff WINELIB_NAME_AW(OemToCharBuff)
-INT16      OffsetClipRgn16(HDC16,INT16,INT16);
-INT32      OffsetClipRgn32(HDC32,INT32,INT32);
-#define    OffsetClipRgn WINELIB_NAME(OffsetClipRgn)
-void       OffsetRect16(LPRECT16,INT16,INT16);
-void       OffsetRect32(LPRECT32,INT32,INT32);
-#define    OffsetRect WINELIB_NAME(OffsetRect)
-INT16      OffsetRgn16(HRGN16,INT16,INT16);
-INT32      OffsetRgn32(HRGN32,INT32,INT32);
-#define    OffsetRgn WINELIB_NAME(OffsetRgn)
-BOOL16     OffsetViewportOrgEx16(HDC16,INT16,INT16,LPPOINT16);
-BOOL32     OffsetViewportOrgEx32(HDC32,INT32,INT32,LPPOINT32);
-#define    OffsetViewportOrgEx WINELIB_NAME(OffsetViewportOrgEx)
-BOOL16     OffsetWindowOrgEx16(HDC16,INT16,INT16,LPPOINT16);
-BOOL32     OffsetWindowOrgEx32(HDC32,INT32,INT32,LPPOINT32);
-#define    OffsetWindowOrgEx WINELIB_NAME(OffsetWindowOrgEx)
-BOOL16     OpenClipboard16(HWND16);
-BOOL32     OpenClipboard32(HWND32);
-#define    OpenClipboard WINELIB_NAME(OpenClipboard)
-HFILE16    OpenFile16(LPCSTR,OFSTRUCT*,UINT16);
-HFILE32    OpenFile32(LPCSTR,OFSTRUCT*,UINT32);
-#define    OpenFile WINELIB_NAME(OpenFile)
-BOOL16     OpenIcon16(HWND16);
-BOOL32     OpenIcon32(HWND32);
-#define    OpenIcon WINELIB_NAME(OpenIcon)
-INT16      OpenSound16(void);
-VOID       OpenSound32(void);
-#define    OpenSound WINELIB_NAME(OpenSound)
-VOID       OutputDebugString16(LPCSTR);
-VOID       OutputDebugString32A(LPCSTR);
-VOID       OutputDebugString32W(LPCWSTR);
-#define    OutputDebugString WINELIB_NAME_AW(OutputDebugString)
-BOOL16     PaintRgn16(HDC16,HRGN16);
-BOOL32     PaintRgn32(HDC32,HRGN32);
-#define    PaintRgn WINELIB_NAME(PaintRgn)
-BOOL16     PatBlt16(HDC16,INT16,INT16,INT16,INT16,DWORD);
-BOOL32     PatBlt32(HDC32,INT32,INT32,INT32,INT32,DWORD);
-#define    PatBlt WINELIB_NAME(PatBlt)
-BOOL16     PeekMessage16(LPMSG16,HWND16,UINT16,UINT16,UINT16);
-BOOL32     PeekMessage32A(LPMSG32,HWND32,UINT32,UINT32,UINT32);
-BOOL32     PeekMessage32W(LPMSG32,HWND32,UINT32,UINT32,UINT32);
-#define    PeekMessage WINELIB_NAME_AW(PeekMessage)
-BOOL16     Pie16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16);
-BOOL32     Pie32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32);
-#define    Pie WINELIB_NAME(Pie)
-BOOL16     PlayMetaFile16(HDC16,HMETAFILE16);
-BOOL32     PlayMetaFile32(HDC32,HMETAFILE32);
-#define    PlayMetaFile WINELIB_NAME(PlayMetaFile)
-VOID       PlayMetaFileRecord16(HDC16,LPHANDLETABLE16,LPMETARECORD,UINT16);
-BOOL32     PlayMetaFileRecord32(HDC32,LPHANDLETABLE32,LPMETARECORD,UINT32);
-#define    PlayMetaFileRecord WINELIB_NAME(PlayMetaFileRecord)
-BOOL16     PolyPolygon16(HDC16,LPPOINT16,LPINT16,UINT16);
-BOOL32     PolyPolygon32(HDC32,LPPOINT32,LPINT32,UINT32);
-#define    PolyPolygon WINELIB_NAME(PolyPolygon)
-BOOL16     Polygon16(HDC16,LPPOINT16,INT16);
-BOOL32     Polygon32(HDC32,LPPOINT32,INT32);
-#define    Polygon WINELIB_NAME(Polygon)
-BOOL16     Polyline16(HDC16,LPPOINT16,INT16);
-BOOL32     Polyline32(HDC32,LPPOINT32,INT32);
-#define    Polyline WINELIB_NAME(Polyline)
-BOOL16     PostAppMessage16(HTASK16,UINT16,WPARAM16,LPARAM);
-#define    PostAppMessage32A(thread,msg,wparam,lparam) \
-           PostThreadMessage32A((DWORD)(thread),msg,wparam,lparam)
-#define    PostAppMessage32W(thread,msg,wparam,lparam) \
-           PostThreadMessage32W((DWORD)(thread),msg,wparam,lparam)
-#define    PostAppMessage WINELIB_NAME_AW(PostAppMessage)
-BOOL16     PostMessage16(HWND16,UINT16,WPARAM16,LPARAM);
-BOOL32     PostMessage32A(HWND32,UINT32,WPARAM32,LPARAM);
-BOOL32     PostMessage32W(HWND32,UINT32,WPARAM32,LPARAM);
-#define    PostMessage WINELIB_NAME_AW(PostMessage)
-void       PostQuitMessage16(INT16);
-void       PostQuitMessage32(INT32);
-#define    PostQuitMessage WINELIB_NAME(PostQuitMessage)
-BOOL16     PtInRect16(const RECT16*,POINT16);
-BOOL32     PtInRect32(const RECT32*,POINT32);
-#define    PtInRect WINELIB_NAME(PtInRect)
-BOOL16     PtInRegion16(HRGN16,INT16,INT16);
-BOOL32     PtInRegion32(HRGN32,INT32,INT32);
-#define    PtInRegion WINELIB_NAME(PtInRegion)
-BOOL16     PtVisible16(HDC16,INT16,INT16);
-BOOL32     PtVisible32(HDC32,INT32,INT32);
-#define    PtVisible WINELIB_NAME(PtVisible)
-UINT16     RealizePalette16(HDC16);
-UINT32     RealizePalette32(HDC32);
-#define    RealizePalette WINELIB_NAME(RealizePalette)
-BOOL16     Rectangle16(HDC16,INT16,INT16,INT16,INT16);
-BOOL32     Rectangle32(HDC32,INT32,INT32,INT32,INT32);
-#define    Rectangle WINELIB_NAME(Rectangle)
-BOOL16     RectInRegion16(HRGN16,const RECT16 *);
-BOOL32     RectInRegion32(HRGN32,const RECT32 *);
-#define    RectInRegion WINELIB_NAME(RectInRegion)
-BOOL16     RectVisible16(HDC16,LPRECT16);
-BOOL32     RectVisible32(HDC32,LPRECT32);
-#define    RectVisible WINELIB_NAME(RectVisible)
-BOOL16     RedrawWindow16(HWND16,const RECT16*,HRGN16,UINT16);
-BOOL32     RedrawWindow32(HWND32,const RECT32*,HRGN32,UINT32);
-#define    RedrawWindow WINELIB_NAME(RedrawWindow)
-DWORD      RegCreateKey16(HKEY,LPCSTR,LPHKEY);
-DWORD      RegCreateKey32A(HKEY,LPCSTR,LPHKEY);
-DWORD      RegCreateKey32W(HKEY,LPCWSTR,LPHKEY);
-#define    RegCreateKey WINELIB_NAME_AW(RegCreateKey)
-DWORD      RegDeleteKey16(HKEY,LPCSTR);
-DWORD      RegDeleteKey32A(HKEY,LPCSTR);
-DWORD      RegDeleteKey32W(HKEY,LPWSTR);
-#define    RegDeleteKey WINELIB_NAME_AW(RegDeleteKey)
-DWORD      RegDeleteValue16(HKEY,LPSTR);
-DWORD      RegDeleteValue32A(HKEY,LPSTR);
-DWORD      RegDeleteValue32W(HKEY,LPWSTR);
-#define    RegDeleteValue WINELIB_NAME_AW(RegDeleteValue)
-DWORD      RegEnumKey16(HKEY,DWORD,LPSTR,DWORD);
-DWORD      RegEnumKey32A(HKEY,DWORD,LPSTR,DWORD);
-DWORD      RegEnumKey32W(HKEY,DWORD,LPWSTR,DWORD);
-#define    RegEnumKey WINELIB_NAME_AW(RegEnumKey)
-DWORD      RegEnumValue16(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
-DWORD      RegEnumValue32A(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
-DWORD      RegEnumValue32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
-#define    RegEnumValue WINELIB_NAME_AW(RegEnumValue)
-ATOM       RegisterClass16(const WNDCLASS16*);
-ATOM       RegisterClass32A(const WNDCLASS32A *);
-ATOM       RegisterClass32W(const WNDCLASS32W *);
-#define    RegisterClass WINELIB_NAME_AW(RegisterClass)
-ATOM       RegisterClassEx16(const WNDCLASSEX16*);
-ATOM       RegisterClassEx32A(const WNDCLASSEX32A *);
-ATOM       RegisterClassEx32W(const WNDCLASSEX32W *);
-#define    RegisterClassEx WINELIB_NAME_AW(RegisterClassEx)
-UINT16     RegisterClipboardFormat16(LPCSTR);
-UINT32     RegisterClipboardFormat32A(LPCSTR);
-UINT32     RegisterClipboardFormat32W(LPCWSTR);
-#define    RegisterClipboardFormat WINELIB_NAME_AW(RegisterClipboardFormat)
-WORD       RegisterWindowMessage16(SEGPTR);
-WORD       RegisterWindowMessage32A(LPCSTR);
-WORD       RegisterWindowMessage32W(LPCWSTR);
-#define    RegisterWindowMessage WINELIB_NAME_AW(RegisterWindowMessage)
-DWORD      RegOpenKey16(HKEY,LPCSTR,LPHKEY);
-DWORD      RegOpenKey32A(HKEY,LPCSTR,LPHKEY);
-DWORD      RegOpenKey32W(HKEY,LPCWSTR,LPHKEY);
-#define    RegOpenKey WINELIB_NAME_AW(RegOpenKey)
-DWORD      RegQueryValue16(HKEY,LPSTR,LPSTR,LPDWORD);
-DWORD      RegQueryValue32A(HKEY,LPSTR,LPSTR,LPDWORD);
-DWORD      RegQueryValue32W(HKEY,LPWSTR,LPWSTR,LPDWORD);
-#define    RegQueryValue WINELIB_NAME_AW(RegQueryValue)
-DWORD      RegQueryValueEx16(HKEY,LPSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
-DWORD      RegQueryValueEx32A(HKEY,LPSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
-DWORD      RegQueryValueEx32W(HKEY,LPWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
-#define    RegQueryValueEx WINELIB_NAME_AW(RegQueryValueEx)
-DWORD      RegSetValue16(HKEY,LPCSTR,DWORD,LPCSTR,DWORD);
-DWORD      RegSetValue32A(HKEY,LPCSTR,DWORD,LPCSTR,DWORD);
-DWORD      RegSetValue32W(HKEY,LPCWSTR,DWORD,LPCWSTR,DWORD);
-#define    RegSetValue WINELIB_NAME_AW(RegSetValue)
-DWORD      RegSetValueEx16(HKEY,LPSTR,DWORD,DWORD,LPBYTE,DWORD);
-DWORD      RegSetValueEx32A(HKEY,LPSTR,DWORD,DWORD,LPBYTE,DWORD);
-DWORD      RegSetValueEx32W(HKEY,LPWSTR,DWORD,DWORD,LPBYTE,DWORD);
-#define    RegSetValueEx WINELIB_NAME_AW(RegSetValueEx)
-INT16      ReleaseDC16(HWND16,HDC16);
-INT32      ReleaseDC32(HWND32,HDC32);
-#define    ReleaseDC WINELIB_NAME(ReleaseDC)
-BOOL16     RemoveDirectory16(LPCSTR);
-BOOL32     RemoveDirectory32A(LPCSTR);
-BOOL32     RemoveDirectory32W(LPCWSTR);
-#define    RemoveDirectory WINELIB_NAME_AW(RemoveDirectory)
-BOOL16     RemoveFontResource16(SEGPTR);
-BOOL32     RemoveFontResource32A(LPCSTR);
-BOOL32     RemoveFontResource32W(LPCWSTR);
-#define    RemoveFontResource WINELIB_NAME_AW(RemoveFontResource)
-BOOL16     RemoveMenu16(HMENU16,UINT16,UINT16);
-BOOL32     RemoveMenu32(HMENU32,UINT32,UINT32);
-#define    RemoveMenu WINELIB_NAME(RemoveMenu)
-HANDLE16   RemoveProp16(HWND16,LPCSTR);
-HANDLE32   RemoveProp32A(HWND32,LPCSTR);
-HANDLE32   RemoveProp32W(HWND32,LPCWSTR);
-#define    RemoveProp WINELIB_NAME_AW(RemoveProp)
-VOID       ReplyMessage16(LRESULT);
-BOOL32     ReplyMessage32(LRESULT);
-#define    ReplyMessage WINELIB_NAME(ReplyMessage)
-HDC16      ResetDC16(HDC16,const DEVMODE16 *);
-HDC32      ResetDC32A(HDC32,const DEVMODE32A *);
-HDC32      ResetDC32W(HDC32,const DEVMODE32W *);
-#define    ResetDC WINELIB_NAME_AW(ResetDC)
-BOOL16     ResizePalette16(HPALETTE16,UINT16);
-BOOL32     ResizePalette32(HPALETTE32,UINT32);
-#define    ResizePalette WINELIB_NAME(ResizePalette)
-BOOL16     RestoreDC16(HDC16,INT16);
-BOOL32     RestoreDC32(HDC32,INT32);
-#define    RestoreDC WINELIB_NAME(RestoreDC)
-BOOL16     RoundRect16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16);
-BOOL32     RoundRect32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32);
-#define    RoundRect WINELIB_NAME(RoundRect)
-INT16      SaveDC16(HDC16);
-INT32      SaveDC32(HDC32);
-#define    SaveDC WINELIB_NAME(SaveDC)
-BOOL16     ScaleViewportExtEx16(HDC16,INT16,INT16,INT16,INT16,LPSIZE16);
-BOOL32     ScaleViewportExtEx32(HDC32,INT32,INT32,INT32,INT32,LPSIZE32);
-#define    ScaleViewportExtEx WINELIB_NAME(ScaleViewportExtEx)
-BOOL16     ScaleWindowExtEx16(HDC16,INT16,INT16,INT16,INT16,LPSIZE16);
-BOOL32     ScaleWindowExtEx32(HDC32,INT32,INT32,INT32,INT32,LPSIZE32);
-#define    ScaleWindowExtEx WINELIB_NAME(ScaleWindowExtEx)
-void       ScreenToClient16(HWND16,LPPOINT16);
-void       ScreenToClient32(HWND32,LPPOINT32);
-#define    ScreenToClient WINELIB_NAME(ScreenToClient)
-VOID       ScrollChildren16(HWND16,UINT16,WPARAM16,LPARAM);
-VOID       ScrollChildren32(HWND32,UINT32,WPARAM32,LPARAM);
-#define    ScrollChildren WINELIB_NAME(ScrollChildren)
-BOOL16     ScrollDC16(HDC16,INT16,INT16,const RECT16*,const RECT16*,
+#define     CreateDialogIndirect WINELIB_NAME_AW(CreateDialogIndirect)
+HWND16      WINAPI CreateDialogIndirectParam16(HINSTANCE16,LPCVOID,HWND16,
+                                               DLGPROC16,LPARAM);
+HWND32      WINAPI CreateDialogIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,
+                                                DLGPROC32,LPARAM);
+HWND32      WINAPI CreateDialogIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,
+                                                DLGPROC32,LPARAM);
+#define     CreateDialogIndirectParam WINELIB_NAME_AW(CreateDialogIndirectParam)
+HWND16      WINAPI CreateDialogParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16,LPARAM);
+HWND32      WINAPI CreateDialogParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC32,LPARAM);
+HWND32      WINAPI CreateDialogParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC32,LPARAM);
+#define     CreateDialogParam WINELIB_NAME_AW(CreateDialogParam)
+HBITMAP16   WINAPI CreateDIBitmap16(HDC16,const BITMAPINFOHEADER*,DWORD,
+                                    LPCVOID,const BITMAPINFO*,UINT16);
+HBITMAP32   WINAPI CreateDIBitmap32(HDC32,const BITMAPINFOHEADER*,DWORD,
+                                    LPCVOID,const BITMAPINFO*,UINT32);
+#define     CreateDIBitmap WINELIB_NAME(CreateDIBitmap)
+HBRUSH16    WINAPI CreateDIBPatternBrush16(HGLOBAL16,UINT16);
+HBRUSH32    WINAPI CreateDIBPatternBrush32(HGLOBAL32,UINT32);
+#define     CreateDIBPatternBrush WINELIB_NAME(CreateDIBPatternBrush)
+BOOL16      WINAPI CreateDirectory16(LPCSTR,LPVOID);
+BOOL32      WINAPI CreateDirectory32A(LPCSTR,LPSECURITY_ATTRIBUTES);
+BOOL32      WINAPI CreateDirectory32W(LPCWSTR,LPSECURITY_ATTRIBUTES);
+#define     CreateDirectory WINELIB_NAME_AW(CreateDirectory)
+BOOL32      WINAPI CreateDirectoryEx32A(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES);
+BOOL32      WINAPI CreateDirectoryEx32W(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES);
+#define     CreateDirectoryEx WINELIB_NAME_AW(CreateDirectoryEx)
+HBITMAP16   WINAPI CreateDiscardableBitmap16(HDC16,INT16,INT16);
+HBITMAP32   WINAPI CreateDiscardableBitmap32(HDC32,INT32,INT32);
+#define     CreateDiscardableBitmap WINELIB_NAME(CreateDiscardableBitmap)
+HRGN16      WINAPI CreateEllipticRgn16(INT16,INT16,INT16,INT16);
+HRGN32      WINAPI CreateEllipticRgn32(INT32,INT32,INT32,INT32);
+#define     CreateEllipticRgn WINELIB_NAME(CreateEllipticRgn)
+HRGN16      WINAPI CreateEllipticRgnIndirect16(const RECT16 *);
+HRGN32      WINAPI CreateEllipticRgnIndirect32(const RECT32 *);
+#define     CreateEllipticRgnIndirect WINELIB_NAME(CreateEllipticRgnIndirect)
+HFONT16     WINAPI CreateFont16(INT16,INT16,INT16,INT16,INT16,BYTE,BYTE,BYTE,
+                                BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
+HFONT32     WINAPI CreateFont32A(INT32,INT32,INT32,INT32,INT32,DWORD,DWORD,
+                                 DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCSTR);
+HFONT32     WINAPI CreateFont32W(INT32,INT32,INT32,INT32,INT32,DWORD,DWORD,
+                                 DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCWSTR);
+#define     CreateFont WINELIB_NAME_AW(CreateFont)
+HFONT16     WINAPI CreateFontIndirect16(const LOGFONT16*);
+HFONT32     WINAPI CreateFontIndirect32A(const LOGFONT32A*);
+HFONT32     WINAPI CreateFontIndirect32W(const LOGFONT32W*);
+#define     CreateFontIndirect WINELIB_NAME_AW(CreateFontIndirect)
+HBRUSH16    WINAPI CreateHatchBrush16(INT16,COLORREF);
+HBRUSH32    WINAPI CreateHatchBrush32(INT32,COLORREF);
+#define     CreateHatchBrush WINELIB_NAME(CreateHatchBrush)
+HDC16       WINAPI CreateIC16(LPCSTR,LPCSTR,LPCSTR,const DEVMODE16*);
+HDC32       WINAPI CreateIC32A(LPCSTR,LPCSTR,LPCSTR,const DEVMODE32A*);
+HDC32       WINAPI CreateIC32W(LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODE32W*);
+#define     CreateIC WINELIB_NAME_AW(CreateIC)
+HICON16     WINAPI CreateIcon16(HINSTANCE16,INT16,INT16,BYTE,BYTE,LPCVOID,LPCVOID);
+HICON32     WINAPI CreateIcon32(HINSTANCE32,INT32,INT32,BYTE,BYTE,LPCVOID,LPCVOID);
+#define     CreateIcon WINELIB_NAME(CreateIcon)
+HMENU16     WINAPI CreateMenu16(void);
+HMENU32     WINAPI CreateMenu32(void);
+#define     CreateMenu WINELIB_NAME(CreateMenu)
+HDC16       WINAPI CreateMetaFile16(LPCSTR);
+HDC32       WINAPI CreateMetaFile32A(LPCSTR);
+HDC32       WINAPI CreateMetaFile32W(LPCWSTR);
+#define     CreateMetaFile WINELIB_NAME_AW(CreateMetaFile)
+HPALETTE16  WINAPI CreatePalette16(const LOGPALETTE*);
+HPALETTE32  WINAPI CreatePalette32(const LOGPALETTE*);
+#define     CreatePalette WINELIB_NAME(CreatePalette)
+HBRUSH16    WINAPI CreatePatternBrush16(HBITMAP16);
+HBRUSH32    WINAPI CreatePatternBrush32(HBITMAP32);
+#define     CreatePatternBrush WINELIB_NAME(CreatePatternBrush)
+HPEN16      WINAPI CreatePen16(INT16,INT16,COLORREF);
+HPEN32      WINAPI CreatePen32(INT32,INT32,COLORREF);
+#define     CreatePen WINELIB_NAME(CreatePen)
+HPEN16      WINAPI CreatePenIndirect16(const LOGPEN16*);
+HPEN32      WINAPI CreatePenIndirect32(const LOGPEN32*);
+#define     CreatePenIndirect WINELIB_NAME(CreatePenIndirect)
+HRGN16      WINAPI CreatePolyPolygonRgn16(const POINT16*,const INT16*,INT16,INT16);
+HRGN32      WINAPI CreatePolyPolygonRgn32(const POINT32*,const INT32*,INT32,INT32);
+#define     CreatePolyPolygonRgn WINELIB_NAME(CreatePolyPolygonRgn)
+HRGN16      WINAPI CreatePolygonRgn16(const POINT16*,INT16,INT16);
+HRGN32      WINAPI CreatePolygonRgn32(const POINT32*,INT32,INT32);
+#define     CreatePolygonRgn WINELIB_NAME(CreatePolygonRgn)
+HMENU16     WINAPI CreatePopupMenu16(void);
+HMENU32     WINAPI CreatePopupMenu32(void);
+#define     CreatePopupMenu WINELIB_NAME(CreatePopupMenu)
+HRGN16      WINAPI CreateRectRgn16(INT16,INT16,INT16,INT16);
+HRGN32      WINAPI CreateRectRgn32(INT32,INT32,INT32,INT32);
+#define     CreateRectRgn WINELIB_NAME(CreateRectRgn)
+HRGN16      WINAPI CreateRectRgnIndirect16(const RECT16*);
+HRGN32      WINAPI CreateRectRgnIndirect32(const RECT32*);
+#define     CreateRectRgnIndirect WINELIB_NAME(CreateRectRgnIndirect)
+HRGN16      WINAPI CreateRoundRectRgn16(INT16,INT16,INT16,INT16,INT16,INT16);
+HRGN32      WINAPI CreateRoundRectRgn32(INT32,INT32,INT32,INT32,INT32,INT32);
+#define     CreateRoundRectRgn WINELIB_NAME(CreateRoundRectRgn)
+BOOL16      WINAPI CreateScalableFontResource16(UINT16,LPCSTR,LPCSTR,LPCSTR);
+BOOL32      WINAPI CreateScalableFontResource32A(DWORD,LPCSTR,LPCSTR,LPCSTR);
+BOOL32      WINAPI CreateScalableFontResource32W(DWORD,LPCWSTR,LPCWSTR,LPCWSTR);
+#define     CreateScalableFontResource WINELIB_NAME_AW(CreateScalableFontResource)
+HBRUSH16    WINAPI CreateSolidBrush16(COLORREF);
+HBRUSH32    WINAPI CreateSolidBrush32(COLORREF);
+#define     CreateSolidBrush WINELIB_NAME(CreateSolidBrush)
+HWND16      WINAPI CreateWindow16(LPCSTR,LPCSTR,DWORD,INT16,INT16,INT16,INT16,
+                                  HWND16,HMENU16,HINSTANCE16,LPVOID);
+#define     CreateWindow32A(className,titleName,style,x,y,width,height,\
+                            parent,menu,instance,param) \
+            CreateWindowEx32A(0,className,titleName,style,x,y,width,height,\
+                              parent,menu,instance,param)
+#define     CreateWindow32W(className,titleName,style,x,y,width,height,\
+                            parent,menu,instance,param) \
+            CreateWindowEx32W(0,className,titleName,style,x,y,width,height,\
+                              parent,menu,instance,param)
+#define     CreateWindow WINELIB_NAME_AW(CreateWindow)
+HWND16      WINAPI CreateWindowEx16(DWORD,LPCSTR,LPCSTR,DWORD,INT16,INT16,
+                                INT16,INT16,HWND16,HMENU16,HINSTANCE16,LPVOID);
+HWND32      WINAPI CreateWindowEx32A(DWORD,LPCSTR,LPCSTR,DWORD,INT32,INT32,
+                                INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
+HWND32      WINAPI CreateWindowEx32W(DWORD,LPCWSTR,LPCWSTR,DWORD,INT32,INT32,
+                                INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
+#define     CreateWindowEx WINELIB_NAME_AW(CreateWindowEx)
+LRESULT     WINAPI DefDlgProc16(HWND16,UINT16,WPARAM16,LPARAM);
+LRESULT     WINAPI DefDlgProc32A(HWND32,UINT32,WPARAM32,LPARAM);
+LRESULT     WINAPI DefDlgProc32W(HWND32,UINT32,WPARAM32,LPARAM);
+#define     DefDlgProc WINELIB_NAME_AW(DefDlgProc)
+HDWP16      WINAPI DeferWindowPos16(HDWP16,HWND16,HWND16,INT16,INT16,INT16,INT16,UINT16);
+HDWP32      WINAPI DeferWindowPos32(HDWP32,HWND32,HWND32,INT32,INT32,INT32,INT32,UINT32);
+#define     DeferWindowPos WINELIB_NAME(DeferWindowPos)
+LRESULT     WINAPI DefFrameProc16(HWND16,HWND16,UINT16,WPARAM16,LPARAM);
+LRESULT     WINAPI DefFrameProc32A(HWND32,HWND32,UINT32,WPARAM32,LPARAM);
+LRESULT     WINAPI DefFrameProc32W(HWND32,HWND32,UINT32,WPARAM32,LPARAM);
+#define     DefFrameProc WINELIB_NAME_AW(DefFrameProc)
+LRESULT     WINAPI DefHookProc16(INT16,WPARAM16,LPARAM,HHOOK*);
+#define     DefHookProc32(code,wparam,lparam,phhook) \
+            CallNextHookEx32(*(phhook),code,wparam,lparam)
+#define     DefHookProc WINELIB_NAME(DefHookProc)
+LRESULT     WINAPI DefMDIChildProc16(HWND16,UINT16,WPARAM16,LPARAM);
+LRESULT     WINAPI DefMDIChildProc32A(HWND32,UINT32,WPARAM32,LPARAM);
+LRESULT     WINAPI DefMDIChildProc32W(HWND32,UINT32,WPARAM32,LPARAM);
+#define     DefMDIChildProc WINELIB_NAME_AW(DefMDIChildProc)
+LRESULT     WINAPI DefWindowProc16(HWND16,UINT16,WPARAM16,LPARAM);
+LRESULT     WINAPI DefWindowProc32A(HWND32,UINT32,WPARAM32,LPARAM);
+LRESULT     WINAPI DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM);
+#define     DefWindowProc WINELIB_NAME_AW(DefWindowProc)
+ATOM        WINAPI DeleteAtom16(ATOM);
+ATOM        WINAPI DeleteAtom32(ATOM);
+#define     DeleteAtom WINELIB_NAME(DeleteAtom)
+BOOL16      WINAPI DeleteDC16(HDC16);
+BOOL32      WINAPI DeleteDC32(HDC32);
+#define     DeleteDC WINELIB_NAME(DeleteDC)
+BOOL16      WINAPI DeleteFile16(LPCSTR);
+BOOL32      WINAPI DeleteFile32A(LPCSTR);
+BOOL32      WINAPI DeleteFile32W(LPCWSTR);
+#define     DeleteFile WINELIB_NAME_AW(DeleteFile)
+BOOL16      WINAPI DeleteMenu16(HMENU16,UINT16,UINT16);
+BOOL32      WINAPI DeleteMenu32(HMENU32,UINT32,UINT32);
+#define     DeleteMenu WINELIB_NAME(DeleteMenu)
+BOOL16      WINAPI DeleteMetaFile16(HMETAFILE16);
+BOOL32      WINAPI DeleteMetaFile32(HMETAFILE32);
+#define     DeleteMetaFile WINELIB_NAME(DeleteMetaFile)
+BOOL16      WINAPI DeleteObject16(HGDIOBJ16);
+BOOL32      WINAPI DeleteObject32(HGDIOBJ32);
+#define     DeleteObject WINELIB_NAME(DeleteObject)
+VOID        WINAPI DestroyCaret16(void);
+BOOL32      WINAPI DestroyCaret32(void);
+#define     DestroyCaret WINELIB_NAME(DestroyCaret)
+BOOL16      WINAPI DestroyCursor16(HCURSOR16);
+BOOL32      WINAPI DestroyCursor32(HCURSOR32);
+#define     DestroyCursor WINELIB_NAME(DestroyCursor)
+BOOL16      WINAPI DestroyIcon16(HICON16);
+BOOL32      WINAPI DestroyIcon32(HICON32);
+#define     DestroyIcon WINELIB_NAME(DestroyIcon)
+BOOL16      WINAPI DestroyMenu16(HMENU16);
+BOOL32      WINAPI DestroyMenu32(HMENU32);
+#define     DestroyMenu WINELIB_NAME(DestroyMenu)
+BOOL16      WINAPI DestroyWindow16(HWND16);
+BOOL32      WINAPI DestroyWindow32(HWND32);
+#define     DestroyWindow WINELIB_NAME(DestroyWindow)
+INT16       WINAPI DialogBox16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16);
+#define     DialogBox32A(inst,template,owner,func) \
+            DialogBoxParam32A(inst,template,owner,func,0)
+#define     DialogBox32W(inst,template,owner,func) \
+            DialogBoxParam32W(inst,template,owner,func,0)
+#define     DialogBox WINELIB_NAME_AW(DialogBox)
+INT16       WINAPI DialogBoxIndirect16(HINSTANCE16,HANDLE16,HWND16,DLGPROC16);
+#define     DialogBoxIndirect32A(inst,template,owner,func) \
+            DialogBoxIndirectParam32A(inst,template,owner,func,0)
+#define     DialogBoxIndirect32W(inst,template,owner,func) \
+            DialogBoxIndirectParam32W(inst,template,owner,func,0)
+#define     DialogBoxIndirect WINELIB_NAME_AW(DialogBoxIndirect)
+INT16       WINAPI DialogBoxIndirectParam16(HINSTANCE16,HANDLE16,HWND16,DLGPROC16,LPARAM);
+INT32       WINAPI DialogBoxIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
+INT32       WINAPI DialogBoxIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
+#define     DialogBoxIndirectParam WINELIB_NAME_AW(DialogBoxIndirectParam)
+INT16       WINAPI DialogBoxParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16,LPARAM);
+INT32       WINAPI DialogBoxParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC32,LPARAM);
+INT32       WINAPI DialogBoxParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC32,LPARAM);
+#define     DialogBoxParam WINELIB_NAME_AW(DialogBoxParam)
+LONG        WINAPI DispatchMessage16(const MSG16*);
+LONG        WINAPI DispatchMessage32A(const MSG32*);
+LONG        WINAPI DispatchMessage32W(const MSG32*);
+#define     DispatchMessage WINELIB_NAME_AW(DispatchMessage)
+INT16       WINAPI DlgDirList16(HWND16,LPSTR,INT16,INT16,UINT16);
+INT32       WINAPI DlgDirList32A(HWND32,LPSTR,INT32,INT32,UINT32);
+INT32       WINAPI DlgDirList32W(HWND32,LPWSTR,INT32,INT32,UINT32);
+#define     DlgDirList WINELIB_NAME_AW(DlgDirList)
+INT16       WINAPI DlgDirListComboBox16(HWND16,LPSTR,INT16,INT16,UINT16);
+INT32       WINAPI DlgDirListComboBox32A(HWND32,LPSTR,INT32,INT32,UINT32);
+INT32       WINAPI DlgDirListComboBox32W(HWND32,LPWSTR,INT32,INT32,UINT32);
+#define     DlgDirListComboBox WINELIB_NAME_AW(DlgDirListComboBox)
+BOOL16      WINAPI DlgDirSelectComboBoxEx16(HWND16,LPSTR,INT16,INT16);
+BOOL32      WINAPI DlgDirSelectComboBoxEx32A(HWND32,LPSTR,INT32,INT32);
+BOOL32      WINAPI DlgDirSelectComboBoxEx32W(HWND32,LPWSTR,INT32,INT32);
+#define     DlgDirSelectComboBoxEx WINELIB_NAME_AW(DlgDirSelectComboBoxEx)
+BOOL16      WINAPI DlgDirSelectEx16(HWND16,LPSTR,INT16,INT16);
+BOOL32      WINAPI DlgDirSelectEx32A(HWND32,LPSTR,INT32,INT32);
+BOOL32      WINAPI DlgDirSelectEx32W(HWND32,LPWSTR,INT32,INT32);
+#define     DlgDirSelectEx WINELIB_NAME_AW(DlgDirSelectEx)
+BOOL16      WINAPI DPtoLP16(HDC16,LPPOINT16,INT16);
+BOOL32      WINAPI DPtoLP32(HDC32,LPPOINT32,INT32);
+#define     DPtoLP WINELIB_NAME(DPtoLP)
+BOOL16      WINAPI DragDetect16(HWND16,POINT16);
+BOOL32      WINAPI DragDetect32(HWND32,POINT32);
+#define     DragDetect WINELIB_NAME(DragDetect)
+DWORD       WINAPI DragObject16(HWND16,HWND16,UINT16,HANDLE16,WORD,HCURSOR16);
+DWORD       WINAPI DragObject32(HWND32,HWND32,UINT32,DWORD,HCURSOR32);
+#define     DragObject WINELIB_NAME(DragObject)
+BOOL16      WINAPI DrawEdge16(HDC16,LPRECT16,UINT16,UINT16);
+BOOL32      WINAPI DrawEdge32(HDC32,LPRECT32,UINT32,UINT32);
+#define     DrawEdge WINELIB_NAME(DrawEdge)
+void        WINAPI DrawFocusRect16(HDC16,const RECT16*);
+void        WINAPI DrawFocusRect32(HDC32,const RECT32*);
+#define     DrawFocusRect WINELIB_NAME(DrawFocusRect)
+BOOL16      WINAPI DrawFrameControl16(HDC16,LPRECT16,UINT16,UINT16);
+BOOL32      WINAPI DrawFrameControl32(HDC32,LPRECT32,UINT32,UINT32);
+#define     DrawFrameControl WINELIB_NAME(DrawFrameControl)
+BOOL16      WINAPI DrawIcon16(HDC16,INT16,INT16,HICON16);
+BOOL32      WINAPI DrawIcon32(HDC32,INT32,INT32,HICON32);
+#define     DrawIcon WINELIB_NAME(DrawIcon)
+VOID        WINAPI DrawMenuBar16(HWND16);
+BOOL32      WINAPI DrawMenuBar32(HWND32);
+#define     DrawMenuBar WINELIB_NAME(DrawMenuBar)
+INT16       WINAPI DrawText16(HDC16,LPCSTR,INT16,LPRECT16,UINT16);
+INT32       WINAPI DrawText32A(HDC32,LPCSTR,INT32,LPRECT32,UINT32);
+INT32       WINAPI DrawText32W(HDC32,LPCWSTR,INT32,LPRECT32,UINT32);
+#define     DrawText WINELIB_NAME_AW(DrawText)
+BOOL16      WINAPI Ellipse16(HDC16,INT16,INT16,INT16,INT16);
+BOOL32      WINAPI Ellipse32(HDC32,INT32,INT32,INT32,INT32);
+#define     Ellipse WINELIB_NAME(Ellipse)
+BOOL16      WINAPI EmptyClipboard16(void);
+BOOL32      WINAPI EmptyClipboard32(void);
+#define     EmptyClipboard WINELIB_NAME(EmptyClipboard)
+BOOL16      WINAPI EnableMenuItem16(HMENU16,UINT16,UINT16);
+BOOL32      WINAPI EnableMenuItem32(HMENU32,UINT32,UINT32);
+#define     EnableMenuItem WINELIB_NAME(EnableMenuItem)
+BOOL16      WINAPI EnableScrollBar16(HWND16,INT16,UINT16);
+BOOL32      WINAPI EnableScrollBar32(HWND32,INT32,UINT32);
+#define     EnableScrollBar WINELIB_NAME(EnableScrollBar)
+BOOL16      WINAPI EnableWindow16(HWND16,BOOL16);
+BOOL32      WINAPI EnableWindow32(HWND32,BOOL32);
+#define     EnableWindow WINELIB_NAME(EnableWindow)
+BOOL16      WINAPI EndDeferWindowPos16(HDWP16);
+BOOL32      WINAPI EndDeferWindowPos32(HDWP32);
+#define     EndDeferWindowPos WINELIB_NAME(EndDeferWindowPos)
+BOOL16      WINAPI EndDialog16(HWND16,INT16);
+BOOL32      WINAPI EndDialog32(HWND32,INT32);
+#define     EndDialog WINELIB_NAME(EndDialog)
+INT16       WINAPI EndDoc16(HDC16);
+INT32       WINAPI EndDoc32(HDC32);
+#define     EndDoc WINELIB_NAME(EndDoc)
+BOOL16      WINAPI EndPaint16(HWND16,const PAINTSTRUCT16*);
+BOOL32      WINAPI EndPaint32(HWND32,const PAINTSTRUCT32*);
+#define     EndPaint WINELIB_NAME(EndPaint)
+BOOL16      WINAPI EnumChildWindows16(HWND16,WNDENUMPROC16,LPARAM);
+BOOL32      WINAPI EnumChildWindows32(HWND32,WNDENUMPROC32,LPARAM);
+#define     EnumChildWindows WINELIB_NAME(EnumChildWindows)
+UINT16      WINAPI EnumClipboardFormats16(UINT16);
+UINT32      WINAPI EnumClipboardFormats32(UINT32);
+#define     EnumClipboardFormats WINELIB_NAME(EnumClipboardFormats)
+INT16       WINAPI EnumFontFamilies16(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
+INT32       WINAPI EnumFontFamilies32A(HDC32,LPCSTR,FONTENUMPROC32A,LPARAM);
+INT32       WINAPI EnumFontFamilies32W(HDC32,LPCWSTR,FONTENUMPROC32W,LPARAM);
+#define     EnumFontFamilies WINELIB_NAME_AW(EnumFontFamilies)
+INT16       WINAPI EnumFontFamiliesEx16(HDC16,LPLOGFONT16,FONTENUMPROCEX16,LPARAM,DWORD);
+INT32       WINAPI EnumFontFamiliesEx32A(HDC32,LPLOGFONT32A,FONTENUMPROCEX32A,LPARAM,DWORD);
+INT32       WINAPI EnumFontFamiliesEx32W(HDC32,LPLOGFONT32W,FONTENUMPROCEX32W,LPARAM,DWORD);
+#define     EnumFontFamiliesEx WINELIB_NAME_AW(EnumFontFamiliesEx)
+INT16       WINAPI EnumFonts16(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
+INT32       WINAPI EnumFonts32A(HDC32,LPCSTR,FONTENUMPROC32A,LPARAM);
+INT32       WINAPI EnumFonts32W(HDC32,LPCWSTR,FONTENUMPROC32W,LPARAM);
+#define     EnumFonts WINELIB_NAME_AW(EnumFonts)
+BOOL16      WINAPI EnumMetaFile16(HDC16,HMETAFILE16,MFENUMPROC16,LPARAM);
+BOOL32      WINAPI EnumMetaFile32(HDC32,HMETAFILE32,MFENUMPROC32,LPARAM);
+#define     EnumMetaFile WINELIB_NAME(EnumMetaFile)
+INT16       WINAPI EnumObjects16(HDC16,INT16,GOBJENUMPROC16,LPARAM);
+INT32       WINAPI EnumObjects32(HDC32,INT32,GOBJENUMPROC32,LPARAM);
+#define     EnumObjects WINELIB_NAME(EnumObjects)
+INT16       WINAPI EnumProps16(HWND16,PROPENUMPROC16);
+INT32       WINAPI EnumProps32A(HWND32,PROPENUMPROC32A);
+INT32       WINAPI EnumProps32W(HWND32,PROPENUMPROC32W);
+#define     EnumProps WINELIB_NAME_AW(EnumProps)
+BOOL16      WINAPI EnumTaskWindows16(HTASK16,WNDENUMPROC16,LPARAM);
+#define     EnumTaskWindows32(handle,proc,lparam) \
+            EnumThreadWindows(handle,proc,lparam)
+#define     EnumTaskWindows WINELIB_NAME(EnumTaskWindows)
+BOOL16      WINAPI EnumWindows16(WNDENUMPROC16,LPARAM);
+BOOL32      WINAPI EnumWindows32(WNDENUMPROC32,LPARAM);
+#define     EnumWindows WINELIB_NAME(EnumWindows)
+BOOL16      WINAPI EqualRect16(const RECT16*,const RECT16*);
+BOOL32      WINAPI EqualRect32(const RECT32*,const RECT32*);
+#define     EqualRect WINELIB_NAME(EqualRect)
+BOOL16      WINAPI EqualRgn16(HRGN16,HRGN16);
+BOOL32      WINAPI EqualRgn32(HRGN32,HRGN32);
+#define     EqualRgn WINELIB_NAME(EqualRgn)
+INT16       WINAPI Escape16(HDC16,INT16,INT16,SEGPTR,SEGPTR);
+INT32       WINAPI Escape32(HDC32,INT32,INT32,LPVOID,LPVOID);
+#define     Escape WINELIB_NAME(Escape)
+LONG        WINAPI EscapeCommFunction16(UINT16,UINT16);
+BOOL32      WINAPI EscapeCommFunction32(INT32,UINT32);
+#define     EscapeCommFunction WINELIB_NAME(EscapeCommFunction)
+INT16       WINAPI ExcludeClipRect16(HDC16,INT16,INT16,INT16,INT16);
+INT32       WINAPI ExcludeClipRect32(HDC32,INT32,INT32,INT32,INT32);
+#define     ExcludeClipRect WINELIB_NAME(ExcludeClipRect)
+INT16       WINAPI ExcludeUpdateRgn16(HDC16,HWND16);
+INT32       WINAPI ExcludeUpdateRgn32(HDC32,HWND32);
+#define     ExcludeUpdateRgn WINELIB_NAME(ExcludeUpdateRgn)
+BOOL16      WINAPI ExitWindows16(DWORD,UINT16);
+#define     ExitWindows32(a,b) ExitWindowsEx(EWX_LOGOFF,0xffffffff)
+#define     ExitWindows WINELIB_NAME(ExitWindows)
+BOOL16      WINAPI ExtFloodFill16(HDC16,INT16,INT16,COLORREF,UINT16);
+BOOL32      WINAPI ExtFloodFill32(HDC32,INT32,INT32,COLORREF,UINT32);
+#define     ExtFloodFill WINELIB_NAME(ExtFloodFill)
+HICON16     WINAPI ExtractIcon16(HINSTANCE16,LPCSTR,UINT16);
+HICON32     WINAPI ExtractIcon32A(HINSTANCE32,LPCSTR,UINT32);
+HICON32     WINAPI ExtractIcon32W(HINSTANCE32,LPCWSTR,UINT32);
+#define     ExtractIcon WINELIB_NAME_AW(ExtractIcon)
+BOOL16      WINAPI ExtTextOut16(HDC16,INT16,INT16,UINT16,const RECT16*,
+                                LPCSTR,UINT16,const INT16*);
+BOOL32      WINAPI ExtTextOut32A(HDC32,INT32,INT32,UINT32,const RECT32*,
+                                 LPCSTR,UINT32,const INT32*);
+BOOL32      WINAPI ExtTextOut32W(HDC32,INT32,INT32,UINT32,const RECT32*,
+                                 LPCWSTR,UINT32,const INT32*);
+#define     ExtTextOut WINELIB_NAME_AW(ExtTextOut)
+void        WINAPI FatalAppExit16(UINT16,LPCSTR);
+void        WINAPI FatalAppExit32A(UINT32,LPCSTR);
+void        WINAPI FatalAppExit32W(UINT32,LPCWSTR);
+#define     FatalAppExit WINELIB_NAME_AW(FatalAppExit)
+INT16       WINAPI FillRect16(HDC16,const RECT16*,HBRUSH16);
+INT32       WINAPI FillRect32(HDC32,const RECT32*,HBRUSH32);
+#define     FillRect WINELIB_NAME(FillRect)
+BOOL16      WINAPI FillRgn16(HDC16,HRGN16,HBRUSH16);
+BOOL32      WINAPI FillRgn32(HDC32,HRGN32,HBRUSH32);
+#define     FillRgn WINELIB_NAME(FillRgn)
+ATOM        WINAPI FindAtom16(SEGPTR);
+ATOM        WINAPI FindAtom32A(LPCSTR);
+ATOM        WINAPI FindAtom32W(LPCWSTR);
+#define     FindAtom WINELIB_NAME_AW(FindAtom)
+BOOL16      WINAPI FindClose16(HANDLE16);
+BOOL32      WINAPI FindClose32(HANDLE32);
+#define     FindClose WINELIB_NAME(FindClose)
+HINSTANCE16 WINAPI FindExecutable16(LPCSTR,LPCSTR,LPSTR);
+HINSTANCE32 WINAPI FindExecutable32A(LPCSTR,LPCSTR,LPSTR);
+HINSTANCE32 WINAPI FindExecutable32W(LPCWSTR,LPCWSTR,LPWSTR);
+#define     FindExecutable WINELIB_NAME_AW(FindExecutable)
+HANDLE16    WINAPI FindFirstFile16(LPCSTR,LPWIN32_FIND_DATA32A);
+HANDLE32    WINAPI FindFirstFile32A(LPCSTR,LPWIN32_FIND_DATA32A);
+HANDLE32    WINAPI FindFirstFile32W(LPCWSTR,LPWIN32_FIND_DATA32W);
+#define     FindFirst WINELIB_NAME_AW(FindFirst)
+BOOL16      WINAPI FindNextFile16(HANDLE16,LPWIN32_FIND_DATA32A);
+BOOL32      WINAPI FindNextFile32A(HANDLE32,LPWIN32_FIND_DATA32A);
+BOOL32      WINAPI FindNextFile32W(HANDLE32,LPWIN32_FIND_DATA32W);
+#define     FindNext WINELIB_NAME_AW(FindNext)
+HRSRC16     WINAPI FindResource16(HINSTANCE16,SEGPTR,SEGPTR);
+HRSRC32     WINAPI FindResource32A(HINSTANCE32,LPCSTR,LPCSTR);
+HRSRC32     WINAPI FindResource32W(HINSTANCE32,LPCWSTR,LPCWSTR);
+#define     FindResource WINELIB_NAME_AW(FindResource)
+HWND16      WINAPI FindWindow16(SEGPTR,LPCSTR);
+HWND32      WINAPI FindWindow32A(LPCSTR,LPCSTR);
+HWND32      WINAPI FindWindow32W(LPCWSTR,LPCWSTR);
+#define     FindWindow WINELIB_NAME_AW(FindWindow)
+HWND16      WINAPI FindWindowEx16(HWND16,HWND16,SEGPTR,LPCSTR);
+HWND32      WINAPI FindWindowEx32A(HWND32,HWND32,LPCSTR,LPCSTR);
+HWND32      WINAPI FindWindowEx32W(HWND32,HWND32,LPCWSTR,LPCWSTR);
+#define     FindWindowEx WINELIB_NAME_AW(FindWindowEx)
+BOOL16      WINAPI FlashWindow16(HWND16,BOOL16);
+BOOL32      WINAPI FlashWindow32(HWND32,BOOL32);
+#define     FlashWindow WINELIB_NAME(FlashWindow)
+BOOL16      WINAPI FloodFill16(HDC16,INT16,INT16,COLORREF);
+BOOL32      WINAPI FloodFill32(HDC32,INT32,INT32,COLORREF);
+#define     FloodFill WINELIB_NAME(FloodFill)
+INT16       WINAPI FrameRect16(HDC16,const RECT16*,HBRUSH16);
+INT32       WINAPI FrameRect32(HDC32,const RECT32*,HBRUSH32);
+#define     FrameRect WINELIB_NAME(FrameRect)
+BOOL16      WINAPI FrameRgn16(HDC16,HRGN16,HBRUSH16,INT16,INT16);
+BOOL32      WINAPI FrameRgn32(HDC32,HRGN32,HBRUSH32,INT32,INT32);
+#define     FrameRgn WINELIB_NAME(FrameRgn)
+VOID        WINAPI FreeLibrary16(HINSTANCE16);
+BOOL32      WINAPI FreeLibrary32(HMODULE32);
+#define     FreeLibrary WINELIB_NAME(FreeLibrary)
+BOOL16      WINAPI FreeModule16(HMODULE16);
+#define     FreeModule32(handle) FreeLibrary32(handle)
+#define     FreeModule WINELIB_NAME(FreeModule)
+void        WINAPI FreeProcInstance16(FARPROC16);
+#define     FreeProcInstance32(proc) /*nothing*/
+#define     FreeProcInstance WINELIB_NAME(FreeProcInstance)
+BOOL16      WINAPI FreeResource16(HGLOBAL16);
+BOOL32      WINAPI FreeResource32(HGLOBAL32);
+#define     FreeResource WINELIB_NAME(FreeResource)
+HWND16      WINAPI GetActiveWindow16(void);
+HWND32      WINAPI GetActiveWindow32(void);
+#define     GetActiveWindow WINELIB_NAME(GetActiveWindow)
+DWORD       WINAPI GetAppCompatFlags16(HTASK16);
+DWORD       WINAPI GetAppCompatFlags32(HTASK32);
+#define     GetAppCompatFlags WINELIB_NAME(GetAppCompatFlags)
+WORD        WINAPI GetAsyncKeyState16(INT16);
+WORD        WINAPI GetAsyncKeyState32(INT32);
+#define     GetAsyncKeyState WINELIB_NAME(GetAsyncKeyState)
+UINT16      WINAPI GetAtomName16(ATOM,LPSTR,INT16);
+UINT32      WINAPI GetAtomName32A(ATOM,LPSTR,INT32);
+UINT32      WINAPI GetAtomName32W(ATOM,LPWSTR,INT32);
+#define     GetAtomName WINELIB_NAME_AW(GetAtomName)
+LONG        WINAPI GetBitmapBits16(HBITMAP16,LONG,LPVOID);
+LONG        WINAPI GetBitmapBits32(HBITMAP32,LONG,LPVOID);
+#define     GetBitmapBits WINELIB_NAME(GetBitmapBits)
+BOOL16      WINAPI GetBitmapDimensionEx16(HBITMAP16,LPSIZE16);
+BOOL32      WINAPI GetBitmapDimensionEx32(HBITMAP32,LPSIZE32);
+#define     GetBitmapDimensionEx WINELIB_NAME(GetBitmapDimensionEx)
+BOOL16      WINAPI GetBrushOrgEx16(HDC16,LPPOINT16);
+BOOL32      WINAPI GetBrushOrgEx32(HDC32,LPPOINT32);
+#define     GetBrushOrgEx WINELIB_NAME(GetBrushOrgEx)
+COLORREF    WINAPI GetBkColor16(HDC16);
+COLORREF    WINAPI GetBkColor32(HDC32);
+#define     GetBkColor WINELIB_NAME(GetBkColor)
+INT16       WINAPI GetBkMode16(HDC16);
+INT32       WINAPI GetBkMode32(HDC32);
+#define     GetBkMode WINELIB_NAME(GetBkMode)
+HWND16      WINAPI GetCapture16(void);
+HWND32      WINAPI GetCapture32(void);
+#define     GetCapture WINELIB_NAME(GetCapture)
+UINT16      WINAPI GetCaretBlinkTime16(void);
+UINT32      WINAPI GetCaretBlinkTime32(void);
+#define     GetCaretBlinkTime WINELIB_NAME(GetCaretBlinkTime)
+VOID        WINAPI GetCaretPos16(LPPOINT16);
+BOOL32      WINAPI GetCaretPos32(LPPOINT32);
+#define     GetCaretPos WINELIB_NAME(GetCaretPos)
+BOOL16      WINAPI GetCharABCWidths16(HDC16,UINT16,UINT16,LPABC16);
+BOOL32      WINAPI GetCharABCWidths32A(HDC32,UINT32,UINT32,LPABC32);
+BOOL32      WINAPI GetCharABCWidths32W(HDC32,UINT32,UINT32,LPABC32);
+#define     GetCharABCWidths WINELIB_NAME_AW(GetCharABCWidths)
+BOOL16      WINAPI GetCharWidth16(HDC16,UINT16,UINT16,LPINT16);
+BOOL32      WINAPI GetCharWidth32A(HDC32,UINT32,UINT32,LPINT32);
+BOOL32      WINAPI GetCharWidth32W(HDC32,UINT32,UINT32,LPINT32);
+#define     GetCharWidth WINELIB_NAME_AW(GetCharWidth)
+BOOL16      WINAPI GetClassInfo16(HINSTANCE16,SEGPTR,WNDCLASS16 *);
+BOOL32      WINAPI GetClassInfo32A(HINSTANCE32,LPCSTR,WNDCLASS32A *);
+BOOL32      WINAPI GetClassInfo32W(HINSTANCE32,LPCWSTR,WNDCLASS32W *);
+#define     GetClassInfo WINELIB_NAME_AW(GetClassInfo)
+BOOL16      WINAPI GetClassInfoEx16(HINSTANCE16,SEGPTR,WNDCLASSEX16 *);
+BOOL32      WINAPI GetClassInfoEx32A(HINSTANCE32,LPCSTR,WNDCLASSEX32A *);
+BOOL32      WINAPI GetClassInfoEx32W(HINSTANCE32,LPCWSTR,WNDCLASSEX32W *);
+#define     GetClassInfoEx WINELIB_NAME_AW(GetClassInfoEx)
+LONG        WINAPI GetClassLong16(HWND16,INT16);
+LONG        WINAPI GetClassLong32A(HWND32,INT32);
+LONG        WINAPI GetClassLong32W(HWND32,INT32);
+#define     GetClassLong WINELIB_NAME_AW(GetClassLong)
+INT16       WINAPI GetClassName16(HWND16,LPSTR,INT16);
+INT32       WINAPI GetClassName32A(HWND32,LPSTR,INT32);
+INT32       WINAPI GetClassName32W(HWND32,LPWSTR,INT32);
+#define     GetClassName WINELIB_NAME_AW(GetClassName)
+WORD        WINAPI GetClassWord16(HWND16,INT16);
+WORD        WINAPI GetClassWord32(HWND32,INT32);
+#define     GetClassWord WINELIB_NAME(GetClassWord)
+void        WINAPI GetClientRect16(HWND16,LPRECT16);
+void        WINAPI GetClientRect32(HWND32,LPRECT32);
+#define     GetClientRect WINELIB_NAME(GetClientRect)
+HANDLE16    WINAPI GetClipboardData16(UINT16);
+HANDLE32    WINAPI GetClipboardData32(UINT32);
+#define     GetClipboardData WINELIB_NAME(GetClipboardData)
+INT16       WINAPI GetClipboardFormatName16(UINT16,LPSTR,INT16);
+INT32       WINAPI GetClipboardFormatName32A(UINT32,LPSTR,INT32);
+INT32       WINAPI GetClipboardFormatName32W(UINT32,LPWSTR,INT32);
+#define     GetClipboardFormatName WINELIB_NAME_AW(GetClipboardFormatName)
+HWND16      WINAPI GetClipboardOwner16(void);
+HWND32      WINAPI GetClipboardOwner32(void);
+#define     GetClipboardOwner WINELIB_NAME(GetClipboardOwner)
+HWND16      WINAPI GetClipboardViewer16(void);
+HWND32      WINAPI GetClipboardViewer32(void);
+#define     GetClipboardViewer WINELIB_NAME(GetClipboardViewer)
+INT16       WINAPI GetClipBox16(HDC16,LPRECT16);
+INT32       WINAPI GetClipBox32(HDC32,LPRECT32);
+#define     GetClipBox WINELIB_NAME(GetClipBox)
+void        WINAPI GetClipCursor16(LPRECT16);
+void        WINAPI GetClipCursor32(LPRECT32);
+#define     GetClipCursor WINELIB_NAME(GetClipCursor)
+HRGN16      WINAPI GetClipRgn16(HDC16);
+INT32       WINAPI GetClipRgn32(HDC32,HRGN32);
+#define     GetClipRgn WINELIB_NAME(GetClipRgn)
+INT16       WINAPI GetCommState16(INT16,LPDCB16);
+BOOL32      WINAPI GetCommState32(INT32,LPDCB32);
+#define     GetCommState WINELIB_NAME(GetCommState)
+UINT16      WINAPI GetCurrentDirectory16(UINT16,LPSTR);
+UINT32      WINAPI GetCurrentDirectory32A(UINT32,LPSTR);
+UINT32      WINAPI GetCurrentDirectory32W(UINT32,LPWSTR);
+#define     GetCurrentDirectory WINELIB_NAME_AW(GetCurrentDirectory)
+BOOL16      WINAPI GetCurrentPositionEx16(HDC16,LPPOINT16);
+BOOL32      WINAPI GetCurrentPositionEx32(HDC32,LPPOINT32);
+#define     GetCurrentPositionEx WINELIB_NAME(GetCurrentPositionEx)
+DWORD       WINAPI GetCurrentTime16(void);
+#define     GetCurrentTime32() GetTickCount()
+#define     GetCurrentTime WINELIB_NAME(GetCurrentTime)
+HCURSOR16   WINAPI GetCursor16(void);
+HCURSOR32   WINAPI GetCursor32(void);
+#define     GetCursor WINELIB_NAME(GetCursor)
+void        WINAPI GetCursorPos16(LPPOINT16);
+void        WINAPI GetCursorPos32(LPPOINT32);
+#define     GetCursorPos WINELIB_NAME(GetCursorPos)
+HDC16       WINAPI GetDC16(HWND16);
+HDC32       WINAPI GetDC32(HWND32);
+#define     GetDC WINELIB_NAME(GetDC)
+HDC16       WINAPI GetDCEx16(HWND16,HRGN16,DWORD);
+HDC32       WINAPI GetDCEx32(HWND32,HRGN32,DWORD);
+#define     GetDCEx WINELIB_NAME(GetDCEx)
+HWND16      WINAPI GetDesktopWindow16(void);
+HWND32      WINAPI GetDesktopWindow32(void);
+#define     GetDesktopWindow WINELIB_NAME(GetDesktopWindow)
+INT16       WINAPI GetDeviceCaps16(HDC16,INT16);
+INT32       WINAPI GetDeviceCaps32(HDC32,INT32);
+#define     GetDeviceCaps WINELIB_NAME(GetDeviceCaps)
+INT16       WINAPI GetDIBits16(HDC16,HBITMAP16,UINT16,UINT16,LPSTR,LPBITMAPINFO,UINT16);
+INT32       WINAPI GetDIBits32(HDC32,HBITMAP32,UINT32,UINT32,LPSTR,LPBITMAPINFO,UINT32);
+#define     GetDIBits WINELIB_NAME(GetDIBits)
+BOOL16      WINAPI GetDiskFreeSpace16(LPCSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
+BOOL32      WINAPI GetDiskFreeSpace32A(LPCSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
+BOOL32      WINAPI GetDiskFreeSpace32W(LPCWSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
+#define     GetDiskFreeSpace WINELIB_NAME_AW(GetDiskFreeSpace)
+INT16       WINAPI GetDlgCtrlID16(HWND16);
+INT32       WINAPI GetDlgCtrlID32(HWND32);
+#define     GetDlgCtrlID WINELIB_NAME(GetDlgCtrlID)
+HWND16      WINAPI GetDlgItem16(HWND16,INT16);
+HWND32      WINAPI GetDlgItem32(HWND32,INT32);
+#define     GetDlgItem WINELIB_NAME(GetDlgItem)
+UINT16      WINAPI GetDlgItemInt16(HWND16,INT16,BOOL16*,BOOL16);
+UINT32      WINAPI GetDlgItemInt32(HWND32,INT32,BOOL32*,BOOL32);
+#define     GetDlgItemInt WINELIB_NAME(GetDlgItemInt)
+INT16       WINAPI GetDlgItemText16(HWND16,INT16,SEGPTR,UINT16);
+INT32       WINAPI GetDlgItemText32A(HWND32,INT32,LPSTR,UINT32);
+INT32       WINAPI GetDlgItemText32W(HWND32,INT32,LPWSTR,UINT32);
+#define     GetDlgItemText WINELIB_NAME_AW(GetDlgItemText)
+UINT16      WINAPI GetDoubleClickTime16(void);
+UINT32      WINAPI GetDoubleClickTime32(void);
+#define     GetDoubleClickTime WINELIB_NAME(GetDoubleClickTime)
+UINT16      WINAPI GetDriveType16(UINT16); /* yes, the arguments differ */
+UINT32      WINAPI GetDriveType32A(LPCSTR);
+UINT32      WINAPI GetDriveType32W(LPCWSTR);
+#define     GetDriveType WINELIB_NAME_AW(GetDriveType)
+INT16       WINAPI GetExpandedName16(LPCSTR,LPSTR);
+INT32       WINAPI GetExpandedName32A(LPCSTR,LPSTR);
+INT32       WINAPI GetExpandedName32W(LPCWSTR,LPWSTR);
+#define     GetExpandedName WINELIB_NAME_AW(GetExpandedName)
+DWORD       WINAPI GetFileAttributes16(LPCSTR);
+DWORD       WINAPI GetFileAttributes32A(LPCSTR);
+DWORD       WINAPI GetFileAttributes32W(LPCWSTR);
+#define     GetFileAttributes WINELIB_NAME_AW(GetFileAttributes)
+DWORD       WINAPI GetFileVersionInfoSize16(LPCSTR,LPDWORD);
+DWORD       WINAPI GetFileVersionInfoSize32A(LPCSTR,LPDWORD);
+DWORD       WINAPI GetFileVersionInfoSize32W(LPCWSTR,LPDWORD);
+#define     GetFileVersionInfoSize WINELIB_NAME_AW(GetFileVersionInfoSize)
+DWORD       WINAPI GetFileVersionInfo16(LPCSTR,DWORD,DWORD,LPVOID);
+DWORD       WINAPI GetFileVersionInfo32A(LPCSTR,DWORD,DWORD,LPVOID);
+DWORD       WINAPI GetFileVersionInfo32W(LPCWSTR,DWORD,DWORD,LPVOID);
+#define     GetFileVersionInfo WINELIB_NAME_AW(GetFileVersionInfo)
+HWND16      WINAPI GetFocus16(void);
+HWND32      WINAPI GetFocus32(void);
+#define     GetFocus WINELIB_NAME(GetFocus)
+DWORD       WINAPI GetFreeSpace16(UINT16);
+#define     GetFreeSpace32(w) (0x100000L)
+#define     GetFreeSpace WINELIB_NAME(GetFreeSpace)
+DWORD       WINAPI GetGlyphOutline16(HDC16,UINT16,UINT16,LPGLYPHMETRICS16,DWORD,LPVOID,const MAT2*);
+DWORD       WINAPI GetGlyphOutline32A(HDC32,UINT32,UINT32,LPGLYPHMETRICS32,DWORD,LPVOID,const MAT2*);
+DWORD       WINAPI GetGlyphOutline32W(HDC32,UINT32,UINT32,LPGLYPHMETRICS32,DWORD,LPVOID,const MAT2*);
+#define     GetGlyphOutline WINELIB_NAME_AW(GetGlyphOutline)
+BOOL16      WINAPI GetInputState16(void);
+BOOL32      WINAPI GetInputState32(void);
+#define     GetInputState WINELIB_NAME(GetInputState)
+UINT16      WINAPI GetInternalWindowPos16(HWND16,LPRECT16,LPPOINT16);
+UINT32      WINAPI GetInternalWindowPos32(HWND32,LPRECT32,LPPOINT32);
+#define     GetInternalWindowPos WINELIB_NAME(GetInternalWindowPos)
+INT16       WINAPI GetKBCodePage16(void);
+UINT32      WINAPI GetKBCodePage32(void);
+#define     GetKBCodePage WINELIB_NAME(GetKBCodePage)
+INT16       WINAPI GetKerningPairs16(HDC16,INT16,LPKERNINGPAIR16);
+DWORD       WINAPI GetKerningPairs32A(HDC32,DWORD,LPKERNINGPAIR32);
+DWORD       WINAPI GetKerningPairs32W(HDC32,DWORD,LPKERNINGPAIR32);
+#define     GetKerningPairs WINELIB_NAME_AW(GetKerningPairs)
+INT16       WINAPI GetKeyboardType16(INT16);
+INT32       WINAPI GetKeyboardType32(INT32);
+#define     GetKeyboardType WINELIB_NAME(GetKeyboardType)
+INT16       WINAPI GetKeyNameText16(LONG,LPSTR,INT16);
+INT32       WINAPI GetKeyNameText32A(LONG,LPSTR,INT32);
+INT32       WINAPI GetKeyNameText32W(LONG,LPWSTR,INT32);
+#define     GetKeyNameText WINELIB_NAME_AW(GetKeyNameText)
+WORD        WINAPI GetKeyState16(INT16);
+WORD        WINAPI GetKeyState32(INT32);
+#define     GetKeyState WINELIB_NAME(GetKeyState)
+HWND16      WINAPI GetLastActivePopup16(HWND16);
+HWND32      WINAPI GetLastActivePopup32(HWND32);
+#define     GetLastActivePopup WINELIB_NAME(GetLastActivePopup)
+UINT32      WINAPI GetLogicalDriveStrings32A(UINT32,LPSTR);
+UINT32      WINAPI GetLogicalDriveStrings32W(UINT32,LPWSTR);
+#define     GetLogicalDriveStrings WINELIB_NAME_AW(GetLogicalDriveStrings)
+INT16       WINAPI GetLocaleInfo16(LCID,LCTYPE,LPSTR,INT16);
+INT32       WINAPI GetLocaleInfo32A(LCID,LCTYPE,LPSTR,INT32);
+INT32       WINAPI GetLocaleInfo32W(LCID,LCTYPE,LPWSTR,INT32);
+#define     GetLocaleInfo WINELIB_NAME_AW(GetLocaleInfo)
+INT16       WINAPI GetMapMode16(HDC16);
+INT32       WINAPI GetMapMode32(HDC32);
+#define     GetMapMode WINELIB_NAME(GetMapMode)
+HMENU16     WINAPI GetMenu16(HWND16);
+HMENU32     WINAPI GetMenu32(HWND32);
+#define     GetMenu WINELIB_NAME(GetMenu)
+INT16       WINAPI GetMenuItemCount16(HMENU16);
+INT32       WINAPI GetMenuItemCount32(HMENU32);
+#define     GetMenuItemCount WINELIB_NAME(GetMenuItemCount)
+UINT16      WINAPI GetMenuItemID16(HMENU16,INT16);
+UINT32      WINAPI GetMenuItemID32(HMENU32,INT32);
+#define     GetMenuItemID WINELIB_NAME(GetMenuItemID)
+UINT16      WINAPI GetMenuState16(HMENU16,UINT16,UINT16);
+UINT32      WINAPI GetMenuState32(HMENU32,UINT32,UINT32);
+#define     GetMenuState WINELIB_NAME(GetMenuState)
+INT16       WINAPI GetMenuString16(HMENU16,UINT16,LPSTR,INT16,UINT16);
+INT32       WINAPI GetMenuString32A(HMENU32,UINT32,LPSTR,INT32,UINT32);
+INT32       WINAPI GetMenuString32W(HMENU32,UINT32,LPWSTR,INT32,UINT32);
+#define     GetMenuString WINELIB_NAME_AW(GetMenuString)
+BOOL16      WINAPI GetMessage16(SEGPTR,HWND16,UINT16,UINT16);
+BOOL32      WINAPI GetMessage32A(LPMSG32,HWND32,UINT32,UINT32);
+BOOL32      WINAPI GetMessage32W(LPMSG32,HWND32,UINT32,UINT32);
+#define     GetMessage WINELIB_NAME_AW(GetMessage)
+HMETAFILE16 WINAPI GetMetaFile16(LPCSTR);
+HMETAFILE32 WINAPI GetMetaFile32A(LPCSTR);
+HMETAFILE32 WINAPI GetMetaFile32W(LPCWSTR);
+#define     GetMetaFile WINELIB_NAME_AW(GetMetaFile)
+INT16       WINAPI GetModuleFileName16(HINSTANCE16,LPSTR,INT16);
+DWORD       WINAPI GetModuleFileName32A(HMODULE32,LPSTR,DWORD);
+DWORD       WINAPI GetModuleFileName32W(HMODULE32,LPWSTR,DWORD);
+#define     GetModuleFileName WINELIB_NAME_AW(GetModuleFileName)
+HMODULE16   WINAPI GetModuleHandle16(LPCSTR);
+HMODULE32   WINAPI GetModuleHandle32A(LPCSTR);
+HMODULE32   WINAPI GetModuleHandle32W(LPCSTR);
+#define     GetModuleHandle WINELIB_NAME_AW(GetModuleHandle)
+DWORD       WINAPI GetNearestColor16(HDC16,DWORD);
+DWORD       WINAPI GetNearestColor32(HDC32,DWORD);
+#define     GetNearestColor WINELIB_NAME(GetNearestColor)
+UINT16      WINAPI GetNearestPaletteIndex16(HPALETTE16,COLORREF);
+UINT32      WINAPI GetNearestPaletteIndex32(HPALETTE32,COLORREF);
+#define     GetNearestPaletteIndex WINELIB_NAME(GetNearestPaletteIndex)
+HWND16      WINAPI GetNextDlgGroupItem16(HWND16,HWND16,BOOL16);
+HWND32      WINAPI GetNextDlgGroupItem32(HWND32,HWND32,BOOL32);
+#define     GetNextDlgGroupItem WINELIB_NAME(GetNextDlgGroupItem)
+HWND16      WINAPI GetNextDlgTabItem16(HWND16,HWND16,BOOL16);
+HWND32      WINAPI GetNextDlgTabItem32(HWND32,HWND32,BOOL32);
+#define     GetNextDlgTabItem WINELIB_NAME(GetNextDlgTabItem)
+HWND16      WINAPI GetNextWindow16(HWND16,WORD);
+#define     GetNextWindow32 GetWindow32
+#define     GetNextWindow WINELIB_NAME(GetNextWindow)
+INT16       WINAPI GetObject16(HANDLE16,INT16,LPVOID);
+INT32       WINAPI GetObject32A(HANDLE32,INT32,LPVOID);
+INT32       WINAPI GetObject32W(HANDLE32,INT32,LPVOID);
+#define     GetObject WINELIB_NAME_AW(GetObject)
+HWND16      WINAPI GetOpenClipboardWindow16(void);
+HWND32      WINAPI GetOpenClipboardWindow32(void);
+#define     GetOpenClipboardWindow WINELIB_NAME(GetOpenClipboardWindow)
+UINT16      WINAPI GetPaletteEntries16(HPALETTE16,UINT16,UINT16,LPPALETTEENTRY);
+UINT32      WINAPI GetPaletteEntries32(HPALETTE32,UINT32,UINT32,LPPALETTEENTRY);
+#define     GetPaletteEntries WINELIB_NAME(GetPaletteEntries)
+HWND16      WINAPI GetParent16(HWND16);
+HWND32      WINAPI GetParent32(HWND32);
+#define     GetParent WINELIB_NAME(GetParent)
+COLORREF    WINAPI GetPixel16(HDC16,INT16,INT16);
+COLORREF    WINAPI GetPixel32(HDC32,INT32,INT32);
+#define     GetPixel WINELIB_NAME(GetPixel)
+INT16       WINAPI GetPolyFillMode16(HDC16);
+INT32       WINAPI GetPolyFillMode32(HDC32);
+#define     GetPolyFillMode WINELIB_NAME(GetPolyFillMode)
+INT16       WINAPI GetPriorityClipboardFormat16(UINT16*,INT16);
+INT32       WINAPI GetPriorityClipboardFormat32(UINT32*,INT32);
+#define     GetPriorityClipboardFormat WINELIB_NAME(GetPriorityClipboardFormat)
+UINT16      WINAPI GetPrivateProfileInt16(LPCSTR,LPCSTR,INT16,LPCSTR);
+UINT32      WINAPI GetPrivateProfileInt32A(LPCSTR,LPCSTR,INT32,LPCSTR);
+UINT32      WINAPI GetPrivateProfileInt32W(LPCWSTR,LPCWSTR,INT32,LPCWSTR);
+#define     GetPrivateProfileInt WINELIB_NAME_AW(GetPrivateProfileInt)
+INT16       WINAPI GetPrivateProfileString16(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT16,LPCSTR);
+INT32       WINAPI GetPrivateProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT32,LPCSTR);
+INT32       WINAPI GetPrivateProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,INT32,LPCWSTR);
+#define     GetPrivateProfileString WINELIB_NAME_AW(GetPrivateProfileString)
+FARPROC16   WINAPI GetProcAddress16(HMODULE16,SEGPTR);
+FARPROC32   WINAPI GetProcAddress32(HMODULE32,LPCSTR);
+#define     GetProcAddress WINELIB_NAME(GetProcAddress)
+UINT16      WINAPI GetProfileInt16(LPCSTR,LPCSTR,INT16);
+UINT32      WINAPI GetProfileInt32A(LPCSTR,LPCSTR,INT32);
+UINT32      WINAPI GetProfileInt32W(LPCWSTR,LPCWSTR,INT32);
+#define     GetProfileInt WINELIB_NAME_AW(GetProfileInt)
+INT16       WINAPI GetProfileString16(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT16);
+INT32       WINAPI GetProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT32);
+INT32       WINAPI GetProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,INT32);
+#define     GetProfileString WINELIB_NAME_AW(GetProfileString)
+HANDLE16    WINAPI GetProp16(HWND16,LPCSTR);
+HANDLE32    WINAPI GetProp32A(HWND32,LPCSTR);
+HANDLE32    WINAPI GetProp32W(HWND32,LPCWSTR);
+#define     GetProp WINELIB_NAME_AW(GetProp)
+DWORD       WINAPI GetQueueStatus16(UINT16);
+DWORD       WINAPI GetQueueStatus32(UINT32);
+#define     GetQueueStatus WINELIB_NAME(GetQueueStatus)
+BOOL16      WINAPI GetRasterizerCaps16(LPRASTERIZER_STATUS,UINT16);
+BOOL32      WINAPI GetRasterizerCaps32(LPRASTERIZER_STATUS,UINT32);
+#define     GetRasterizerCaps WINELIB_NAME(GetRasterizerCaps)
+INT16       WINAPI GetRelAbs16(HDC16);
+INT32       WINAPI GetRelAbs32(HDC32);
+#define     GetRelAbs WINELIB_NAME(GetRelAbs)
+INT16       WINAPI GetRgnBox16(HRGN16,LPRECT16);
+INT32       WINAPI GetRgnBox32(HRGN32,LPRECT32);
+#define     GetRgnBox WINELIB_NAME(GetRgnBox)
+INT16       WINAPI GetROP216(HDC16);
+INT32       WINAPI GetROP232(HDC32);
+#define     GetROP2 WINELIB_NAME(GetROP2)
+BOOL16      WINAPI GetScrollInfo16(HWND16,INT16,LPSCROLLINFO);
+BOOL32      WINAPI GetScrollInfo32(HWND32,INT32,LPSCROLLINFO);
+#define     GetScrollInfo WINELIB_NAME(GetScrollInfo)
+INT16       WINAPI GetScrollPos16(HWND16,INT16);
+INT32       WINAPI GetScrollPos32(HWND32,INT32);
+#define     GetScrollPos WINELIB_NAME(GetScrollPos)
+BOOL16      WINAPI GetScrollRange16(HWND16,INT16,LPINT16,LPINT16);
+BOOL32      WINAPI GetScrollRange32(HWND32,INT32,LPINT32,LPINT32);
+#define     GetScrollRange WINELIB_NAME(GetScrollRange)
+HGDIOBJ16   WINAPI GetStockObject16(INT16);
+HGDIOBJ32   WINAPI GetStockObject32(INT32);
+#define     GetStockObject WINELIB_NAME(GetStockObject)
+INT16       WINAPI GetStretchBltMode16(HDC16);
+INT32       WINAPI GetStretchBltMode32(HDC32);
+#define     GetStretchBltMode WINELIB_NAME(GetStretchBltMode)
+BOOL16      WINAPI GetStringType16(LCID,DWORD,LPCSTR,INT16,LPWORD);
+BOOL32      WINAPI GetStringType32A(LCID,DWORD,LPCSTR,INT32,LPWORD);
+BOOL32      WINAPI GetStringType32W(DWORD,LPCWSTR,INT32,LPWORD);
+#define     GetStringType WINELIB_NAME_AW(GetStringType)
+HMENU16     WINAPI GetSubMenu16(HMENU16,INT16);
+HMENU32     WINAPI GetSubMenu32(HMENU32,INT32);
+#define     GetSubMenu WINELIB_NAME(GetSubMenu)
+COLORREF    WINAPI GetSysColor16(INT16);
+COLORREF    WINAPI GetSysColor32(INT32);
+#define     GetSysColor WINELIB_NAME(GetSysColor)
+HBRUSH16    WINAPI GetSysColorBrush16(INT16);
+HBRUSH32    WINAPI GetSysColorBrush32(INT32);
+#define     GetSysColorBrush WINELIB_NAME(GetSysColorBrush)
+HWND16      WINAPI GetSysModalWindow16(void);
+#define     GetSysModalWindow32() ((HWND32)0)
+#define     GetSysModalWindow WINELIB_NAME(GetSysModalWindow)
+UINT16      WINAPI GetSystemDirectory16(LPSTR,UINT16);
+UINT32      WINAPI GetSystemDirectory32A(LPSTR,UINT32);
+UINT32      WINAPI GetSystemDirectory32W(LPWSTR,UINT32);
+#define     GetSystemDirectory WINELIB_NAME_AW(GetSystemDirectory)
+HMENU16     WINAPI GetSystemMenu16(HWND16,BOOL16);
+HMENU32     WINAPI GetSystemMenu32(HWND32,BOOL32);
+#define     GetSystemMenu WINELIB_NAME(GetSystemMenu)
+INT16       WINAPI GetSystemMetrics16(INT16);
+INT32       WINAPI GetSystemMetrics32(INT32);
+#define     GetSystemMetrics WINELIB_NAME(GetSystemMetrics)
+UINT16      WINAPI GetSystemPaletteEntries16(HDC16,UINT16,UINT16,LPPALETTEENTRY);
+UINT32      WINAPI GetSystemPaletteEntries32(HDC32,UINT32,UINT32,LPPALETTEENTRY);
+#define     GetSystemPaletteEntries WINELIB_NAME(GetSystemPaletteEntries)
+UINT16      WINAPI GetSystemPaletteUse16(HDC16);
+UINT32      WINAPI GetSystemPaletteUse32(HDC32);
+#define     GetSystemPaletteUse WINELIB_NAME(GetSystemPaletteUse)
+DWORD       WINAPI GetTabbedTextExtent16(HDC16,LPCSTR,INT16,INT16,const INT16*);
+DWORD       WINAPI GetTabbedTextExtent32A(HDC32,LPCSTR,INT32,INT32,const INT32*);
+DWORD       WINAPI GetTabbedTextExtent32W(HDC32,LPCWSTR,INT32,INT32,const INT32*);
+#define     GetTabbedTextExtent WINELIB_NAME_AW(GetTabbedTextExtent)
+UINT16      WINAPI GetTempFileName16(BYTE,LPCSTR,UINT16,LPSTR);
+UINT32      WINAPI GetTempFileName32A(LPCSTR,LPCSTR,UINT32,LPSTR);
+UINT32      WINAPI GetTempFileName32W(LPCWSTR,LPCWSTR,UINT32,LPWSTR);
+#define     GetTempFileName WINELIB_NAME_AW(GetTempFileName)
+UINT32      WINAPI GetTempPath32A(UINT32,LPSTR);
+UINT32      WINAPI GetTempPath32W(UINT32,LPWSTR);
+#define     GetTempPath WINELIB_NAME_AW(GetTempPath)
+UINT16      WINAPI GetTextAlign16(HDC16);
+UINT32      WINAPI GetTextAlign32(HDC32);
+#define     GetTextAlign WINELIB_NAME(GetTextAlign)
+INT16       WINAPI GetTextCharacterExtra16(HDC16);
+INT32       WINAPI GetTextCharacterExtra32(HDC32);
+#define     GetTextCharacterExtra WINELIB_NAME(GetTextCharacterExtra)
+COLORREF    WINAPI GetTextColor16(HDC16);
+COLORREF    WINAPI GetTextColor32(HDC32);
+#define     GetTextColor WINELIB_NAME(GetTextColor)
+BOOL16      WINAPI GetTextExtentPoint16(HDC16,LPCSTR,INT16,LPSIZE16);
+BOOL32      WINAPI GetTextExtentPoint32A(HDC32,LPCSTR,INT32,LPSIZE32);
+BOOL32      WINAPI GetTextExtentPoint32W(HDC32,LPCWSTR,INT32,LPSIZE32);
+#define     GetTextExtentPoint WINELIB_NAME_AW(GetTextExtentPoint)
+INT16       WINAPI GetTextFace16(HDC16,INT16,LPSTR);
+INT32       WINAPI GetTextFace32A(HDC32,INT32,LPSTR);
+INT32       WINAPI GetTextFace32W(HDC32,INT32,LPWSTR);
+#define     GetTextFace WINELIB_NAME_AW(GetTextFace)
+BOOL16      WINAPI GetTextMetrics16(HDC16,LPTEXTMETRIC16);
+BOOL32      WINAPI GetTextMetrics32A(HDC32,LPTEXTMETRIC32A);
+BOOL32      WINAPI GetTextMetrics32W(HDC32,LPTEXTMETRIC32W);
+#define     GetTextMetrics WINELIB_NAME_AW(GetTextMetrics)
+LPINT16     WINAPI GetThresholdEvent16(void);
+LPDWORD     WINAPI GetThresholdEvent32(void);
+#define     GetThresholdEvent WINELIB_NAME(GetThresholdEvent)
+INT16       WINAPI GetThresholdStatus16(void);
+DWORD       WINAPI GetThresholdStatus32(void);
+#define     GetThresholdStatus WINELIB_NAME(GetThresholdStatus)
+HWND16      WINAPI GetTopWindow16(HWND16);
+HWND32      WINAPI GetTopWindow32(HWND32);
+#define     GetTopWindow WINELIB_NAME(GetTopWindow)
+BOOL16      WINAPI GetUpdateRect16(HWND16,LPRECT16,BOOL16);
+BOOL32      WINAPI GetUpdateRect32(HWND32,LPRECT32,BOOL32);
+#define     GetUpdateRect WINELIB_NAME(GetUpdateRect)
+INT16       WINAPI GetUpdateRgn16(HWND16,HRGN16,BOOL16);
+INT32       WINAPI GetUpdateRgn32(HWND32,HRGN32,BOOL32);
+#define     GetUpdateRgn WINELIB_NAME(GetUpdateRgn)
+LONG        WINAPI GetVersion16(void);
+LONG        WINAPI GetVersion32(void);
+#define     GetVersion WINELIB_NAME(GetVersion)
+BOOL16      WINAPI GetViewportExtEx16(HDC16,LPPOINT16);
+BOOL32      WINAPI GetViewportExtEx32(HDC32,LPPOINT32);
+#define     GetViewportExtEx WINELIB_NAME(GetViewportExtEx)
+BOOL16      WINAPI GetViewportOrgEx16(HDC16,LPPOINT16);
+BOOL32      WINAPI GetViewportOrgEx32(HDC32,LPPOINT32);
+#define     GetViewportOrgEx WINELIB_NAME(GetViewportOrgEx)
+BOOL32      WINAPI GetVolumeInformation32A(LPCSTR,LPSTR,DWORD,LPDWORD,LPDWORD,LPDWORD,LPSTR,DWORD);
+BOOL32      WINAPI GetVolumeInformation32W(LPCWSTR,LPWSTR,DWORD,LPDWORD,LPDWORD,LPDWORD,LPWSTR,DWORD);
+#define     GetVolumeInformation WINELIB_NAME_AW(GetVolumeInformation)
+HWND16      WINAPI GetWindow16(HWND16,WORD);
+HWND32      WINAPI GetWindow32(HWND32,WORD);
+#define     GetWindow WINELIB_NAME(GetWindow)
+HDC16       WINAPI GetWindowDC16(HWND16);
+HDC32       WINAPI GetWindowDC32(HWND32);
+#define     GetWindowDC WINELIB_NAME(GetWindowDC)
+BOOL16      WINAPI GetWindowExtEx16(HDC16,LPPOINT16);
+BOOL32      WINAPI GetWindowExtEx32(HDC32,LPPOINT32);
+#define     GetWindowExtEx WINELIB_NAME(GetWindowExtEx)
+LONG        WINAPI GetWindowLong16(HWND16,INT16);
+LONG        WINAPI GetWindowLong32A(HWND32,INT32);
+LONG        WINAPI GetWindowLong32W(HWND32,INT32);
+#define     GetWindowLong WINELIB_NAME_AW(GetWindowLong)
+BOOL16      WINAPI GetWindowOrgEx16(HDC16,LPPOINT16);
+BOOL32      WINAPI GetWindowOrgEx32(HDC32,LPPOINT32);
+#define     GetWindowOrgEx WINELIB_NAME(GetWindowOrgEx)
+BOOL16      WINAPI GetWindowPlacement16(HWND16,LPWINDOWPLACEMENT16);
+BOOL32      WINAPI GetWindowPlacement32(HWND32,LPWINDOWPLACEMENT32);
+#define     GetWindowPlacement WINELIB_NAME(GetWindowPlacement)
+void        WINAPI GetWindowRect16(HWND16,LPRECT16);
+void        WINAPI GetWindowRect32(HWND32,LPRECT32);
+#define     GetWindowRect WINELIB_NAME(GetWindowRect)
+UINT16      WINAPI GetWindowsDirectory16(LPSTR,UINT16);
+UINT32      WINAPI GetWindowsDirectory32A(LPSTR,UINT32);
+UINT32      WINAPI GetWindowsDirectory32W(LPWSTR,UINT32);
+#define     GetWindowsDirectory WINELIB_NAME_AW(GetWindowsDirectory)
+HTASK16     WINAPI GetWindowTask16(HWND16);
+#define     GetWindowTask32(hwnd) ((HTASK32)GetWindowThreadProcessId(hwnd,NULL))
+#define     GetWindowTask WINELIB_NAME(GetWindowTask)
+INT16       WINAPI GetWindowText16(HWND16,SEGPTR,INT16);
+INT32       WINAPI GetWindowText32A(HWND32,LPSTR,INT32);
+INT32       WINAPI GetWindowText32W(HWND32,LPWSTR,INT32);
+#define     GetWindowText WINELIB_NAME_AW(GetWindowText)
+INT16       WINAPI GetWindowTextLength16(HWND16);
+INT32       WINAPI GetWindowTextLength32A(HWND32);
+INT32       WINAPI GetWindowTextLength32W(HWND32);
+#define     GetWindowTextLength WINELIB_NAME_AW(GetWindowTextLength)
+WORD        WINAPI GetWindowWord16(HWND16,INT16);
+WORD        WINAPI GetWindowWord32(HWND32,INT32);
+#define     GetWindowWord WINELIB_NAME(GetWindowWord)
+ATOM        WINAPI GlobalAddAtom16(SEGPTR);
+ATOM        WINAPI GlobalAddAtom32A(LPCSTR);
+ATOM        WINAPI GlobalAddAtom32W(LPCWSTR);
+#define     GlobalAddAtom WINELIB_NAME_AW(GlobalAddAtom)
+HGLOBAL16   WINAPI GlobalAlloc16(UINT16,DWORD);
+HGLOBAL32   WINAPI GlobalAlloc32(UINT32,DWORD);
+#define     GlobalAlloc WINELIB_NAME(GlobalAlloc)
+DWORD       WINAPI GlobalCompact16(DWORD);
+DWORD       WINAPI GlobalCompact32(DWORD);
+#define     GlobalCompact WINELIB_NAME(GlobalCompact)
+UINT16      WINAPI GlobalFlags16(HGLOBAL16);
+UINT32      WINAPI GlobalFlags32(HGLOBAL32);
+#define     GlobalFlags WINELIB_NAME(GlobalFlags)
+ATOM        WINAPI GlobalFindAtom16(SEGPTR);
+ATOM        WINAPI GlobalFindAtom32A(LPCSTR);
+ATOM        WINAPI GlobalFindAtom32W(LPCWSTR);
+#define     GlobalFindAtom WINELIB_NAME_AW(GlobalFindAtom)
+HGLOBAL16   WINAPI GlobalFree16(HGLOBAL16);
+HGLOBAL32   WINAPI GlobalFree32(HGLOBAL32);
+#define     GlobalFree WINELIB_NAME(GlobalFree)
+UINT16      WINAPI GlobalGetAtomName16(ATOM,LPSTR,INT16);
+UINT32      WINAPI GlobalGetAtomName32A(ATOM,LPSTR,INT32);
+UINT32      WINAPI GlobalGetAtomName32W(ATOM,LPWSTR,INT32);
+#define     GlobalGetAtomName WINELIB_NAME_AW(GlobalGetAtomName)
+DWORD       WINAPI GlobalHandle16(WORD);
+HGLOBAL32   WINAPI GlobalHandle32(LPCVOID);
+#define     GlobalHandle WINELIB_NAME(GlobalHandle)
+VOID        WINAPI GlobalFix16(HGLOBAL16);
+VOID        WINAPI GlobalFix32(HGLOBAL32);
+#define     GlobalFix WINELIB_NAME(GlobalFix)
+LPVOID      WINAPI GlobalLock16(HGLOBAL16);
+LPVOID      WINAPI GlobalLock32(HGLOBAL32);
+#define     GlobalLock WINELIB_NAME(GlobalLock)
+HGLOBAL16   WINAPI GlobalReAlloc16(HGLOBAL16,DWORD,UINT16);
+HGLOBAL32   WINAPI GlobalReAlloc32(HGLOBAL32,DWORD,UINT32);
+#define     GlobalReAlloc WINELIB_NAME(GlobalReAlloc)
+DWORD       WINAPI GlobalSize16(HGLOBAL16);
+DWORD       WINAPI GlobalSize32(HGLOBAL32);
+#define     GlobalSize WINELIB_NAME(GlobalSize)
+VOID        WINAPI GlobalUnfix16(HGLOBAL16);
+VOID        WINAPI GlobalUnfix32(HGLOBAL32);
+#define     GlobalUnfix WINELIB_NAME(GlobalUnfix)
+BOOL16      WINAPI GlobalUnlock16(HGLOBAL16);
+BOOL32      WINAPI GlobalUnlock32(HGLOBAL32);
+#define     GlobalUnlock WINELIB_NAME(GlobalUnlock)
+BOOL16      WINAPI GlobalUnWire16(HGLOBAL16);
+BOOL32      WINAPI GlobalUnWire32(HGLOBAL32);
+#define     GlobalUnWire WINELIB_NAME(GlobalUnWire)
+SEGPTR      WINAPI GlobalWire16(HGLOBAL16);
+LPVOID      WINAPI GlobalWire32(HGLOBAL32);
+#define     GlobalWire WINELIB_NAME(GlobalWire)
+BOOL16      WINAPI GrayString16(HDC16,HBRUSH16,GRAYSTRINGPROC16,LPARAM,
+                                INT16,INT16,INT16,INT16,INT16);
+BOOL32      WINAPI GrayString32A(HDC32,HBRUSH32,GRAYSTRINGPROC32,LPARAM,
+                                 INT32,INT32,INT32,INT32,INT32);
+BOOL32      WINAPI GrayString32W(HDC32,HBRUSH32,GRAYSTRINGPROC32,LPARAM,
+                                 INT32,INT32,INT32,INT32,INT32);
+#define     GrayString WINELIB_NAME_AW(GrayString)
+VOID        WINAPI HideCaret16(HWND16);
+BOOL32      WINAPI HideCaret32(HWND32);
+#define     HideCaret WINELIB_NAME(HideCaret)
+BOOL16      WINAPI HiliteMenuItem16(HWND16,HMENU16,UINT16,UINT16);
+BOOL32      WINAPI HiliteMenuItem32(HWND32,HMENU32,UINT32,UINT32);
+#define     HiliteMenuItem WINELIB_NAME(HiliteMenuItem)
+void        WINAPI InflateRect16(LPRECT16,INT16,INT16);
+void        WINAPI InflateRect32(LPRECT32,INT32,INT32);
+#define     InflateRect WINELIB_NAME(InflateRect)
+WORD        WINAPI InitAtomTable16(WORD);
+BOOL32      WINAPI InitAtomTable32(DWORD);
+#define     InitAtomTable WINELIB_NAME(InitAtomTable)
+BOOL16      WINAPI InSendMessage16(void);
+BOOL32      WINAPI InSendMessage32(void);
+#define     InSendMessage WINELIB_NAME(InSendMessage)
+BOOL16      WINAPI InsertMenu16(HMENU16,UINT16,UINT16,UINT16,SEGPTR);
+BOOL32      WINAPI InsertMenu32A(HMENU32,UINT32,UINT32,UINT32,LPCSTR);
+BOOL32      WINAPI InsertMenu32W(HMENU32,UINT32,UINT32,UINT32,LPCWSTR);
+#define     InsertMenu WINELIB_NAME_AW(InsertMenu)
+BOOL16      WINAPI InsertMenuItem16(HMENU16,UINT16,BOOL16,const MENUITEMINFO16*);
+BOOL32      WINAPI InsertMenuItem32A(HMENU32,UINT32,BOOL32,const MENUITEMINFO32A*);
+BOOL32      WINAPI InsertMenuItem32W(HMENU32,UINT32,BOOL32,const MENUITEMINFO32W*);
+#define     InsertMenuItem WINELIB_NAME_AW(InsertMenuItem)
+INT16       WINAPI IntersectClipRect16(HDC16,INT16,INT16,INT16,INT16);
+INT32       WINAPI IntersectClipRect32(HDC32,INT32,INT32,INT32,INT32);
+#define     IntersectClipRect WINELIB_NAME(IntersectClipRect)
+BOOL16      WINAPI IntersectRect16(LPRECT16,const RECT16*,const RECT16*);
+BOOL32      WINAPI IntersectRect32(LPRECT32,const RECT32*,const RECT32*);
+#define     IntersectRect WINELIB_NAME(IntersectRect)
+void        WINAPI InvalidateRect16(HWND16,const RECT16*,BOOL16);
+void        WINAPI InvalidateRect32(HWND32,const RECT32*,BOOL32);
+#define     InvalidateRect WINELIB_NAME(InvalidateRect)
+void        WINAPI InvalidateRgn16(HWND16,HRGN16,BOOL16);
+void        WINAPI InvalidateRgn32(HWND32,HRGN32,BOOL32);
+#define     InvalidateRgn WINELIB_NAME(InvalidateRgn)
+void        WINAPI InvertRect16(HDC16,const RECT16*);
+void        WINAPI InvertRect32(HDC32,const RECT32*);
+#define     InvertRect WINELIB_NAME(InvertRect)
+BOOL16      WINAPI InvertRgn16(HDC16,HRGN16);
+BOOL32      WINAPI InvertRgn32(HDC32,HRGN32);
+#define     InvertRgn WINELIB_NAME(InvertRgn)
+BOOL16      WINAPI IsBadCodePtr16(SEGPTR);
+BOOL32      WINAPI IsBadCodePtr32(FARPROC32);
+#define     IsBadCodePtr WINELIB_NAME(IsBadCodePtr)
+BOOL16      WINAPI IsBadHugeReadPtr16(SEGPTR,DWORD);
+BOOL32      WINAPI IsBadHugeReadPtr32(LPCVOID,UINT32);
+#define     IsBadHugeReadPtr WINELIB_NAME(IsBadHugeReadPtr)
+BOOL16      WINAPI IsBadHugeWritePtr16(SEGPTR,DWORD);
+BOOL32      WINAPI IsBadHugeWritePtr32(LPVOID,UINT32);
+#define     IsBadHugeWritePtr WINELIB_NAME(IsBadHugeWritePtr)
+BOOL16      WINAPI IsBadReadPtr16(SEGPTR,UINT16);
+BOOL32      WINAPI IsBadReadPtr32(LPCVOID,UINT32);
+#define     IsBadReadPtr WINELIB_NAME(IsBadReadPtr)
+BOOL16      WINAPI IsBadStringPtr16(SEGPTR,UINT16);
+BOOL32      WINAPI IsBadStringPtr32A(LPCSTR,UINT32);
+BOOL32      WINAPI IsBadStringPtr32W(LPCWSTR,UINT32);
+#define     IsBadStringPtr WINELIB_NAME_AW(IsBadStringPtr)
+BOOL16      WINAPI IsBadWritePtr16(SEGPTR,UINT16);
+BOOL32      WINAPI IsBadWritePtr32(LPVOID,UINT32);
+#define     IsBadWritePtr WINELIB_NAME(IsBadWritePtr)
+BOOL16      WINAPI IsCharAlpha16(CHAR);
+BOOL32      WINAPI IsCharAlpha32A(CHAR);
+BOOL32      WINAPI IsCharAlpha32W(WCHAR);
+#define     IsCharAlpha WINELIB_NAME_AW(IsCharAlpha)
+BOOL16      WINAPI IsCharAlphaNumeric16(CHAR);
+BOOL32      WINAPI IsCharAlphaNumeric32A(CHAR);
+BOOL32      WINAPI IsCharAlphaNumeric32W(WCHAR);
+#define     IsCharAlphaNumeric WINELIB_NAME_AW(IsCharAlphaNumeric)
+BOOL16      WINAPI IsCharLower16(CHAR);
+BOOL32      WINAPI IsCharLower32A(CHAR);
+BOOL32      WINAPI IsCharLower32W(WCHAR);
+#define     IsCharLower WINELIB_NAME_AW(IsCharLower)
+BOOL16      WINAPI IsCharUpper16(CHAR);
+BOOL32      WINAPI IsCharUpper32A(CHAR);
+BOOL32      WINAPI IsCharUpper32W(WCHAR);
+#define     IsCharUpper WINELIB_NAME_AW(IsCharUpper)
+BOOL16      WINAPI IsChild16(HWND16,HWND16);
+BOOL32      WINAPI IsChild32(HWND32,HWND32);
+#define     IsChild WINELIB_NAME(IsChild)
+BOOL16      WINAPI IsClipboardFormatAvailable16(UINT16);
+BOOL32      WINAPI IsClipboardFormatAvailable32(UINT32);
+#define     IsClipboardFormatAvailable WINELIB_NAME(IsClipboardFormatAvailable)
+BOOL16      WINAPI IsDBCSLeadByte16(BYTE);
+BOOL32      WINAPI IsDBCSLeadByte32(BYTE);
+#define     IsDBCSLeadByte WINELIB_NAME(IsDBCSLeadByte)
+BOOL16      WINAPI IsDialogMessage16(HWND16,LPMSG16);
+BOOL32      WINAPI IsDialogMessage32A(HWND32,LPMSG32);
+BOOL32      WINAPI IsDialogMessage32W(HWND32,LPMSG32);
+#define     IsDialogMessage WINELIB_NAME(IsDialogMessage)
+UINT16      WINAPI IsDlgButtonChecked16(HWND16,UINT16);
+UINT32      WINAPI IsDlgButtonChecked32(HWND32,UINT32);
+#define     IsDlgButtonChecked WINELIB_NAME(IsDlgButtonChecked)
+BOOL16      WINAPI IsIconic16(HWND16);
+BOOL32      WINAPI IsIconic32(HWND32);
+#define     IsIconic WINELIB_NAME(IsIconic)
+BOOL16      WINAPI IsMenu16(HMENU16);
+BOOL32      WINAPI IsMenu32(HMENU32);
+#define     IsMenu WINELIB_NAME(IsMenu)
+BOOL16      WINAPI IsRectEmpty16(const RECT16*);
+BOOL32      WINAPI IsRectEmpty32(const RECT32*);
+#define     IsRectEmpty WINELIB_NAME(IsRectEmpty)
+BOOL16      WINAPI IsWindow16(HWND16);
+BOOL32      WINAPI IsWindow32(HWND32);
+#define     IsWindow WINELIB_NAME(IsWindow)
+BOOL16      WINAPI IsWindowEnabled16(HWND16);
+BOOL32      WINAPI IsWindowEnabled32(HWND32);
+#define     IsWindowEnabled WINELIB_NAME(IsWindowEnabled)
+BOOL16      WINAPI IsWindowVisible16(HWND16);
+BOOL32      WINAPI IsWindowVisible32(HWND32);
+#define     IsWindowVisible WINELIB_NAME(IsWindowVisible)
+BOOL16      WINAPI IsZoomed16(HWND16);
+BOOL32      WINAPI IsZoomed32(HWND32);
+#define     IsZoomed WINELIB_NAME(IsZoomed)
+BOOL16      WINAPI KillSystemTimer16(HWND16,UINT16);
+BOOL32      WINAPI KillSystemTimer32(HWND32,UINT32);
+#define     KillSystemTimer WINELIB_NAME(KillSystemTimer)
+BOOL16      WINAPI KillTimer16(HWND16,UINT16);
+BOOL32      WINAPI KillTimer32(HWND32,UINT32);
+#define     KillTimer WINELIB_NAME(KillTimer)
+HFILE16     WINAPI LZOpenFile16(LPCSTR,LPOFSTRUCT,UINT16);
+HFILE32     WINAPI LZOpenFile32A(LPCSTR,LPOFSTRUCT,UINT32);
+HFILE32     WINAPI LZOpenFile32W(LPCWSTR,LPOFSTRUCT,UINT32);
+#define     LZOpenFile WINELIB_NAME_AW(LZOpenFile)
+INT16       WINAPI LZRead16(HFILE16,LPVOID,UINT16); 
+INT32       WINAPI LZRead32(HFILE32,LPVOID,UINT32); 
+#define     LZRead WINELIB_NAME(LZRead)
+INT16       WINAPI LZStart16(void);
+INT32       WINAPI LZStart32(void);
+#define     LZStart WINELIB_NAME(LZStart)
+VOID        WINAPI LineDDA16(INT16,INT16,INT16,INT16,LINEDDAPROC16,LPARAM);
+BOOL32      WINAPI LineDDA32(INT32,INT32,INT32,INT32,LINEDDAPROC32,LPARAM);
+#define     LineDDA WINELIB_NAME(LineDDA)
+BOOL16      WINAPI LineTo16(HDC16,INT16,INT16);
+BOOL32      WINAPI LineTo32(HDC32,INT32,INT32);
+#define     LineTo WINELIB_NAME(LineTo)
+HACCEL16    WINAPI LoadAccelerators16(HINSTANCE16,SEGPTR);
+HACCEL32    WINAPI LoadAccelerators32A(HINSTANCE32,LPCSTR);
+HACCEL32    WINAPI LoadAccelerators32W(HINSTANCE32,LPCWSTR);
+#define     LoadAccelerators WINELIB_NAME_AW(LoadAccelerators)
+HBITMAP16   WINAPI LoadBitmap16(HANDLE16,SEGPTR);
+HBITMAP32   WINAPI LoadBitmap32A(HANDLE32,LPCSTR);
+HBITMAP32   WINAPI LoadBitmap32W(HANDLE32,LPCWSTR);
+#define     LoadBitmap WINELIB_NAME(LoadBitmap)
+HCURSOR16   WINAPI LoadCursor16(HINSTANCE16,SEGPTR);
+HCURSOR32   WINAPI LoadCursor32A(HINSTANCE32,LPCSTR);
+HCURSOR32   WINAPI LoadCursor32W(HINSTANCE32,LPCWSTR);
+#define     LoadCursor WINELIB_NAME_AW(LoadCursor)
+HICON16     WINAPI LoadIcon16(HINSTANCE16,SEGPTR);
+HICON32     WINAPI LoadIcon32A(HINSTANCE32,LPCSTR);
+HICON32     WINAPI LoadIcon32W(HINSTANCE32,LPCWSTR);
+#define     LoadIcon WINELIB_NAME_AW(LoadIcon)
+HINSTANCE16 WINAPI LoadLibrary16(LPCSTR);
+HINSTANCE32 WINAPI LoadLibrary32A(LPCSTR);
+HINSTANCE32 WINAPI LoadLibrary32W(LPCWSTR);
+#define     LoadLibrary WINELIB_NAME_AW(LoadLibrary)
+HMENU16     WINAPI LoadMenu16(HINSTANCE16,SEGPTR);
+HMENU32     WINAPI LoadMenu32A(HINSTANCE32,LPCSTR);
+HMENU32     WINAPI LoadMenu32W(HINSTANCE32,LPCWSTR);
+#define     LoadMenu WINELIB_NAME_AW(LoadMenu)
+HMENU16     WINAPI LoadMenuIndirect16(LPCVOID);
+HMENU32     WINAPI LoadMenuIndirect32A(LPCVOID);
+HMENU32     WINAPI LoadMenuIndirect32W(LPCVOID);
+#define     LoadMenuIndirect WINELIB_NAME_AW(LoadMenuIndirect)
+HINSTANCE16 WINAPI LoadModule16(LPCSTR,LPVOID);
+DWORD       WINAPI LoadModule32(LPCSTR,LPVOID);
+#define     LoadModule WINELIB_NAME(LoadModule)
+HGLOBAL16   WINAPI LoadResource16(HINSTANCE16,HRSRC16);
+HGLOBAL32   WINAPI LoadResource32(HINSTANCE32,HRSRC32);
+#define     LoadResource WINELIB_NAME(LoadResource)
+INT16       WINAPI LoadString16(HINSTANCE16,UINT16,LPSTR,INT16);
+INT32       WINAPI LoadString32A(HINSTANCE32,UINT32,LPSTR,INT32);
+INT32       WINAPI LoadString32W(HINSTANCE32,UINT32,LPWSTR,INT32);
+#define     LoadString WINELIB_NAME_AW(LoadString)
+HLOCAL16    WINAPI LocalAlloc16(UINT16,WORD);
+HLOCAL32    WINAPI LocalAlloc32(UINT32,DWORD);
+#define     LocalAlloc WINELIB_NAME(LocalAlloc)
+UINT16      WINAPI LocalCompact16(UINT16);
+UINT32      WINAPI LocalCompact32(UINT32);
+#define     LocalCompact WINELIB_NAME(LocalCompact)
+UINT16      WINAPI LocalFlags16(HLOCAL16);
+UINT32      WINAPI LocalFlags32(HLOCAL32);
+#define     LocalFlags WINELIB_NAME(LocalFlags)
+HLOCAL16    WINAPI LocalFree16(HLOCAL16);
+HLOCAL32    WINAPI LocalFree32(HLOCAL32);
+#define     LocalFree WINELIB_NAME(LocalFree)
+HLOCAL16    WINAPI LocalHandle16(WORD);
+HLOCAL32    WINAPI LocalHandle32(LPCVOID);
+#define     LocalHandle WINELIB_NAME(LocalHandle)
+SEGPTR      WINAPI LocalLock16(HLOCAL16);
+LPVOID      WINAPI LocalLock32(HLOCAL32);
+#define     LocalLock WINELIB_NAME(LocalLock)
+HLOCAL16    WINAPI LocalReAlloc16(HLOCAL16,WORD,UINT16);
+HLOCAL32    WINAPI LocalReAlloc32(HLOCAL32,DWORD,UINT32);
+#define     LocalReAlloc WINELIB_NAME(LocalReAlloc)
+UINT16      WINAPI LocalShrink16(HGLOBAL16,UINT16);
+UINT32      WINAPI LocalShrink32(HGLOBAL32,UINT32);
+#define     LocalShrink WINELIB_NAME(LocalShrink)
+UINT16      WINAPI LocalSize16(HLOCAL16);
+UINT32      WINAPI LocalSize32(HLOCAL32);
+#define     LocalSize WINELIB_NAME(LocalSize)
+BOOL16      WINAPI LocalUnlock16(HLOCAL16);
+BOOL32      WINAPI LocalUnlock32(HLOCAL32);
+#define     LocalUnlock WINELIB_NAME(LocalUnlock)
+LPVOID      WINAPI LockResource16(HGLOBAL16);
+LPVOID      WINAPI LockResource32(HGLOBAL32);
+#define     LockResource WINELIB_NAME(LockResource)
+HGLOBAL16   WINAPI LockSegment16(HGLOBAL16);
+#define     LockSegment32(handle) GlobalFix32((HANDLE32)(handle))
+#define     LockSegment WINELIB_NAME(LockSegment)
+BOOL16      WINAPI LockWindowUpdate16(HWND16);
+BOOL32      WINAPI LockWindowUpdate32(HWND32);
+#define     LockWindowUpdate WINELIB_NAME(LockWindowUpdate)
+BOOL16      WINAPI LPtoDP16(HDC16,LPPOINT16,INT16);
+BOOL32      WINAPI LPtoDP32(HDC32,LPPOINT32,INT32);
+#define     LPtoDP WINELIB_NAME(LPtoDP)
+void        WINAPI LZClose16(HFILE16);
+void        WINAPI LZClose32(HFILE32);
+#define     LZClose WINELIB_NAME(LZClose)
+LONG        WINAPI LZCopy16(HFILE16,HFILE16);
+LONG        WINAPI LZCopy32(HFILE32,HFILE32);
+#define     LZCopy WINELIB_NAME(LZCopy)
+HFILE16     WINAPI LZInit16(HFILE16);
+HFILE32     WINAPI LZInit32(HFILE32);
+#define     LZInit WINELIB_NAME(LZInit)
+LONG        WINAPI LZSeek16(HFILE16,LONG,INT16);
+LONG        WINAPI LZSeek32(HFILE32,LONG,INT32);
+#define     LZSeek WINELIB_NAME(LZSeek)
+UINT16      WINAPI MapVirtualKey16(UINT16,UINT16);
+UINT32      WINAPI MapVirtualKey32A(UINT32,UINT32);
+UINT32      WINAPI MapVirtualKey32W(UINT32,UINT32);
+#define     MapVirtualKey WINELIB_NAME_AW(MapVirtualKey)
+FARPROC16   WINAPI MakeProcInstance16(FARPROC16,HANDLE16);
+#define     MakeProcInstance32(proc,inst) (proc)
+#define     MakeProcInstance WINELIB_NAME(MakeProcInstance)
+void        WINAPI MapDialogRect16(HWND16,LPRECT16);
+void        WINAPI MapDialogRect32(HWND32,LPRECT32);
+#define     MapDialogRect WINELIB_NAME(MapDialogRect)
+void        WINAPI MapWindowPoints16(HWND16,HWND16,LPPOINT16,UINT16);
+void        WINAPI MapWindowPoints32(HWND32,HWND32,LPPOINT32,UINT32);
+#define     MapWindowPoints WINELIB_NAME(MapWindowPoints)
+VOID        WINAPI MessageBeep16(UINT16);
+BOOL32      WINAPI MessageBeep32(UINT32);
+#define     MessageBeep WINELIB_NAME(MessageBeep)
+INT16       WINAPI MessageBox16(HWND16,LPCSTR,LPCSTR,UINT16);
+INT32       WINAPI MessageBox32A(HWND32,LPCSTR,LPCSTR,UINT32);
+INT32       WINAPI MessageBox32W(HWND32,LPCWSTR,LPCWSTR,UINT32);
+#define     MessageBox WINELIB_NAME_AW(MessageBox)
+BOOL16      WINAPI ModifyMenu16(HMENU16,UINT16,UINT16,UINT16,SEGPTR);
+BOOL32      WINAPI ModifyMenu32A(HMENU32,UINT32,UINT32,UINT32,LPCSTR);
+BOOL32      WINAPI ModifyMenu32W(HMENU32,UINT32,UINT32,UINT32,LPCWSTR);
+#define     ModifyMenu WINELIB_NAME_AW(ModifyMenu)
+BOOL16      WINAPI MoveToEx16(HDC16,INT16,INT16,LPPOINT16);
+BOOL32      WINAPI MoveToEx32(HDC32,INT32,INT32,LPPOINT32);
+#define     MoveToEx WINELIB_NAME(MoveToEx)
+BOOL16      WINAPI MoveWindow16(HWND16,INT16,INT16,INT16,INT16,BOOL16);
+BOOL32      WINAPI MoveWindow32(HWND32,INT32,INT32,INT32,INT32,BOOL32);
+#define     MoveWindow WINELIB_NAME(MoveWindow)
+INT16       WINAPI MulDiv16(INT16,INT16,INT16);
+INT32       WINAPI MulDiv32(INT32,INT32,INT32);
+#define     MulDiv WINELIB_NAME(MulDiv)
+INT16       WINAPI OemToAnsi16(LPCSTR,LPSTR);
+#define     OemToAnsi32A OemToChar32A
+#define     OemToAnsi32W OemToChar32W
+#define     OemToAnsi WINELIB_NAME_AW(OemToAnsi)
+VOID        WINAPI OemToAnsiBuff16(LPCSTR,LPSTR,UINT16);
+#define     OemToAnsiBuff32A OemToCharBuff32A
+#define     OemToAnsiBuff32W OemToCharBuff32W
+#define     OemToAnsiBuff WINELIB_NAME_AW(OemToAnsiBuff)
+BOOL32      WINAPI OemToChar32A(LPCSTR,LPSTR);
+BOOL32      WINAPI OemToChar32W(LPCSTR,LPWSTR);
+#define     OemToChar WINELIB_NAME_AW(OemToChar)
+BOOL32      WINAPI OemToCharBuff32A(LPCSTR,LPSTR,DWORD);
+BOOL32      WINAPI OemToCharBuff32W(LPCSTR,LPWSTR,DWORD);
+#define     OemToCharBuff WINELIB_NAME_AW(OemToCharBuff)
+INT16       WINAPI OffsetClipRgn16(HDC16,INT16,INT16);
+INT32       WINAPI OffsetClipRgn32(HDC32,INT32,INT32);
+#define     OffsetClipRgn WINELIB_NAME(OffsetClipRgn)
+void        WINAPI OffsetRect16(LPRECT16,INT16,INT16);
+void        WINAPI OffsetRect32(LPRECT32,INT32,INT32);
+#define     OffsetRect WINELIB_NAME(OffsetRect)
+INT16       WINAPI OffsetRgn16(HRGN16,INT16,INT16);
+INT32       WINAPI OffsetRgn32(HRGN32,INT32,INT32);
+#define     OffsetRgn WINELIB_NAME(OffsetRgn)
+BOOL16      WINAPI OffsetViewportOrgEx16(HDC16,INT16,INT16,LPPOINT16);
+BOOL32      WINAPI OffsetViewportOrgEx32(HDC32,INT32,INT32,LPPOINT32);
+#define     OffsetViewportOrgEx WINELIB_NAME(OffsetViewportOrgEx)
+BOOL16      WINAPI OffsetWindowOrgEx16(HDC16,INT16,INT16,LPPOINT16);
+BOOL32      WINAPI OffsetWindowOrgEx32(HDC32,INT32,INT32,LPPOINT32);
+#define     OffsetWindowOrgEx WINELIB_NAME(OffsetWindowOrgEx)
+BOOL16      WINAPI OpenClipboard16(HWND16);
+BOOL32      WINAPI OpenClipboard32(HWND32);
+#define     OpenClipboard WINELIB_NAME(OpenClipboard)
+HFILE16     WINAPI OpenFile16(LPCSTR,OFSTRUCT*,UINT16);
+HFILE32     WINAPI OpenFile32(LPCSTR,OFSTRUCT*,UINT32);
+#define     OpenFile WINELIB_NAME(OpenFile)
+BOOL16      WINAPI OpenIcon16(HWND16);
+BOOL32      WINAPI OpenIcon32(HWND32);
+#define     OpenIcon WINELIB_NAME(OpenIcon)
+INT16       WINAPI OpenSound16(void);
+VOID        WINAPI OpenSound32(void);
+#define     OpenSound WINELIB_NAME(OpenSound)
+VOID        WINAPI OutputDebugString16(LPCSTR);
+VOID        WINAPI OutputDebugString32A(LPCSTR);
+VOID        WINAPI OutputDebugString32W(LPCWSTR);
+#define     OutputDebugString WINELIB_NAME_AW(OutputDebugString)
+BOOL16      WINAPI PaintRgn16(HDC16,HRGN16);
+BOOL32      WINAPI PaintRgn32(HDC32,HRGN32);
+#define     PaintRgn WINELIB_NAME(PaintRgn)
+BOOL16      WINAPI PatBlt16(HDC16,INT16,INT16,INT16,INT16,DWORD);
+BOOL32      WINAPI PatBlt32(HDC32,INT32,INT32,INT32,INT32,DWORD);
+#define     PatBlt WINELIB_NAME(PatBlt)
+BOOL16      WINAPI PeekMessage16(LPMSG16,HWND16,UINT16,UINT16,UINT16);
+BOOL32      WINAPI PeekMessage32A(LPMSG32,HWND32,UINT32,UINT32,UINT32);
+BOOL32      WINAPI PeekMessage32W(LPMSG32,HWND32,UINT32,UINT32,UINT32);
+#define     PeekMessage WINELIB_NAME_AW(PeekMessage)
+BOOL16      WINAPI Pie16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16);
+BOOL32      WINAPI Pie32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32);
+#define     Pie WINELIB_NAME(Pie)
+BOOL16      WINAPI PlayMetaFile16(HDC16,HMETAFILE16);
+BOOL32      WINAPI PlayMetaFile32(HDC32,HMETAFILE32);
+#define     PlayMetaFile WINELIB_NAME(PlayMetaFile)
+VOID        WINAPI PlayMetaFileRecord16(HDC16,LPHANDLETABLE16,LPMETARECORD,UINT16);
+BOOL32      WINAPI PlayMetaFileRecord32(HDC32,LPHANDLETABLE32,LPMETARECORD,UINT32);
+#define     PlayMetaFileRecord WINELIB_NAME(PlayMetaFileRecord)
+BOOL16      WINAPI PolyPolygon16(HDC16,LPPOINT16,LPINT16,UINT16);
+BOOL32      WINAPI PolyPolygon32(HDC32,LPPOINT32,LPINT32,UINT32);
+#define     PolyPolygon WINELIB_NAME(PolyPolygon)
+BOOL16      WINAPI Polygon16(HDC16,LPPOINT16,INT16);
+BOOL32      WINAPI Polygon32(HDC32,LPPOINT32,INT32);
+#define     Polygon WINELIB_NAME(Polygon)
+BOOL16      WINAPI Polyline16(HDC16,LPPOINT16,INT16);
+BOOL32      WINAPI Polyline32(HDC32,LPPOINT32,INT32);
+#define     Polyline WINELIB_NAME(Polyline)
+BOOL16      WINAPI PostAppMessage16(HTASK16,UINT16,WPARAM16,LPARAM);
+#define     PostAppMessage32A(thread,msg,wparam,lparam) \
+            PostThreadMessage32A((DWORD)(thread),msg,wparam,lparam)
+#define     PostAppMessage32W(thread,msg,wparam,lparam) \
+            PostThreadMessage32W((DWORD)(thread),msg,wparam,lparam)
+#define     PostAppMessage WINELIB_NAME_AW(PostAppMessage)
+BOOL16      WINAPI PostMessage16(HWND16,UINT16,WPARAM16,LPARAM);
+BOOL32      WINAPI PostMessage32A(HWND32,UINT32,WPARAM32,LPARAM);
+BOOL32      WINAPI PostMessage32W(HWND32,UINT32,WPARAM32,LPARAM);
+#define     PostMessage WINELIB_NAME_AW(PostMessage)
+void        WINAPI PostQuitMessage16(INT16);
+void        WINAPI PostQuitMessage32(INT32);
+#define     PostQuitMessage WINELIB_NAME(PostQuitMessage)
+BOOL16      WINAPI PtInRect16(const RECT16*,POINT16);
+BOOL32      WINAPI PtInRect32(const RECT32*,POINT32);
+#define     PtInRect WINELIB_NAME(PtInRect)
+BOOL16      WINAPI PtInRegion16(HRGN16,INT16,INT16);
+BOOL32      WINAPI PtInRegion32(HRGN32,INT32,INT32);
+#define     PtInRegion WINELIB_NAME(PtInRegion)
+BOOL16      WINAPI PtVisible16(HDC16,INT16,INT16);
+BOOL32      WINAPI PtVisible32(HDC32,INT32,INT32);
+#define     PtVisible WINELIB_NAME(PtVisible)
+UINT16      WINAPI RealizePalette16(HDC16);
+UINT32      WINAPI RealizePalette32(HDC32);
+#define     RealizePalette WINELIB_NAME(RealizePalette)
+BOOL16      WINAPI Rectangle16(HDC16,INT16,INT16,INT16,INT16);
+BOOL32      WINAPI Rectangle32(HDC32,INT32,INT32,INT32,INT32);
+#define     Rectangle WINELIB_NAME(Rectangle)
+BOOL16      WINAPI RectInRegion16(HRGN16,const RECT16 *);
+BOOL32      WINAPI RectInRegion32(HRGN32,const RECT32 *);
+#define     RectInRegion WINELIB_NAME(RectInRegion)
+BOOL16      WINAPI RectVisible16(HDC16,LPRECT16);
+BOOL32      WINAPI RectVisible32(HDC32,LPRECT32);
+#define     RectVisible WINELIB_NAME(RectVisible)
+BOOL16      WINAPI RedrawWindow16(HWND16,const RECT16*,HRGN16,UINT16);
+BOOL32      WINAPI RedrawWindow32(HWND32,const RECT32*,HRGN32,UINT32);
+#define     RedrawWindow WINELIB_NAME(RedrawWindow)
+DWORD       WINAPI RegCreateKey16(HKEY,LPCSTR,LPHKEY);
+DWORD       WINAPI RegCreateKey32A(HKEY,LPCSTR,LPHKEY);
+DWORD       WINAPI RegCreateKey32W(HKEY,LPCWSTR,LPHKEY);
+#define     RegCreateKey WINELIB_NAME_AW(RegCreateKey)
+DWORD       WINAPI RegDeleteKey16(HKEY,LPCSTR);
+DWORD       WINAPI RegDeleteKey32A(HKEY,LPCSTR);
+DWORD       WINAPI RegDeleteKey32W(HKEY,LPWSTR);
+#define     RegDeleteKey WINELIB_NAME_AW(RegDeleteKey)
+DWORD       WINAPI RegDeleteValue16(HKEY,LPSTR);
+DWORD       WINAPI RegDeleteValue32A(HKEY,LPSTR);
+DWORD       WINAPI RegDeleteValue32W(HKEY,LPWSTR);
+#define     RegDeleteValue WINELIB_NAME_AW(RegDeleteValue)
+DWORD       WINAPI RegEnumKey16(HKEY,DWORD,LPSTR,DWORD);
+DWORD       WINAPI RegEnumKey32A(HKEY,DWORD,LPSTR,DWORD);
+DWORD       WINAPI RegEnumKey32W(HKEY,DWORD,LPWSTR,DWORD);
+#define     RegEnumKey WINELIB_NAME_AW(RegEnumKey)
+DWORD       WINAPI RegEnumValue16(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
+DWORD       WINAPI RegEnumValue32A(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
+DWORD       WINAPI RegEnumValue32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
+#define     RegEnumValue WINELIB_NAME_AW(RegEnumValue)
+ATOM        WINAPI RegisterClass16(const WNDCLASS16*);
+ATOM        WINAPI RegisterClass32A(const WNDCLASS32A *);
+ATOM        WINAPI RegisterClass32W(const WNDCLASS32W *);
+#define     RegisterClass WINELIB_NAME_AW(RegisterClass)
+ATOM        WINAPI RegisterClassEx16(const WNDCLASSEX16*);
+ATOM        WINAPI RegisterClassEx32A(const WNDCLASSEX32A *);
+ATOM        WINAPI RegisterClassEx32W(const WNDCLASSEX32W *);
+#define     RegisterClassEx WINELIB_NAME_AW(RegisterClassEx)
+UINT16      WINAPI RegisterClipboardFormat16(LPCSTR);
+UINT32      WINAPI RegisterClipboardFormat32A(LPCSTR);
+UINT32      WINAPI RegisterClipboardFormat32W(LPCWSTR);
+#define     RegisterClipboardFormat WINELIB_NAME_AW(RegisterClipboardFormat)
+WORD        WINAPI RegisterWindowMessage16(SEGPTR);
+WORD        WINAPI RegisterWindowMessage32A(LPCSTR);
+WORD        WINAPI RegisterWindowMessage32W(LPCWSTR);
+#define     RegisterWindowMessage WINELIB_NAME_AW(RegisterWindowMessage)
+DWORD       WINAPI RegOpenKey16(HKEY,LPCSTR,LPHKEY);
+DWORD       WINAPI RegOpenKey32A(HKEY,LPCSTR,LPHKEY);
+DWORD       WINAPI RegOpenKey32W(HKEY,LPCWSTR,LPHKEY);
+#define     RegOpenKey WINELIB_NAME_AW(RegOpenKey)
+DWORD       WINAPI RegQueryValue16(HKEY,LPSTR,LPSTR,LPDWORD);
+DWORD       WINAPI RegQueryValue32A(HKEY,LPSTR,LPSTR,LPDWORD);
+DWORD       WINAPI RegQueryValue32W(HKEY,LPWSTR,LPWSTR,LPDWORD);
+#define     RegQueryValue WINELIB_NAME_AW(RegQueryValue)
+DWORD       WINAPI RegQueryValueEx16(HKEY,LPSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
+DWORD       WINAPI RegQueryValueEx32A(HKEY,LPSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
+DWORD       WINAPI RegQueryValueEx32W(HKEY,LPWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD);
+#define     RegQueryValueEx WINELIB_NAME_AW(RegQueryValueEx)
+DWORD       WINAPI RegSetValue16(HKEY,LPCSTR,DWORD,LPCSTR,DWORD);
+DWORD       WINAPI RegSetValue32A(HKEY,LPCSTR,DWORD,LPCSTR,DWORD);
+DWORD       WINAPI RegSetValue32W(HKEY,LPCWSTR,DWORD,LPCWSTR,DWORD);
+#define     RegSetValue WINELIB_NAME_AW(RegSetValue)
+DWORD       WINAPI RegSetValueEx16(HKEY,LPSTR,DWORD,DWORD,LPBYTE,DWORD);
+DWORD       WINAPI RegSetValueEx32A(HKEY,LPSTR,DWORD,DWORD,LPBYTE,DWORD);
+DWORD       WINAPI RegSetValueEx32W(HKEY,LPWSTR,DWORD,DWORD,LPBYTE,DWORD);
+#define     RegSetValueEx WINELIB_NAME_AW(RegSetValueEx)
+INT16       WINAPI ReleaseDC16(HWND16,HDC16);
+INT32       WINAPI ReleaseDC32(HWND32,HDC32);
+#define     ReleaseDC WINELIB_NAME(ReleaseDC)
+BOOL16      WINAPI RemoveDirectory16(LPCSTR);
+BOOL32      WINAPI RemoveDirectory32A(LPCSTR);
+BOOL32      WINAPI RemoveDirectory32W(LPCWSTR);
+#define     RemoveDirectory WINELIB_NAME_AW(RemoveDirectory)
+BOOL16      WINAPI RemoveFontResource16(SEGPTR);
+BOOL32      WINAPI RemoveFontResource32A(LPCSTR);
+BOOL32      WINAPI RemoveFontResource32W(LPCWSTR);
+#define     RemoveFontResource WINELIB_NAME_AW(RemoveFontResource)
+BOOL16      WINAPI RemoveMenu16(HMENU16,UINT16,UINT16);
+BOOL32      WINAPI RemoveMenu32(HMENU32,UINT32,UINT32);
+#define     RemoveMenu WINELIB_NAME(RemoveMenu)
+HANDLE16    WINAPI RemoveProp16(HWND16,LPCSTR);
+HANDLE32    WINAPI RemoveProp32A(HWND32,LPCSTR);
+HANDLE32    WINAPI RemoveProp32W(HWND32,LPCWSTR);
+#define     RemoveProp WINELIB_NAME_AW(RemoveProp)
+VOID        WINAPI ReplyMessage16(LRESULT);
+BOOL32      WINAPI ReplyMessage32(LRESULT);
+#define     ReplyMessage WINELIB_NAME(ReplyMessage)
+HDC16       WINAPI ResetDC16(HDC16,const DEVMODE16 *);
+HDC32       WINAPI ResetDC32A(HDC32,const DEVMODE32A *);
+HDC32       WINAPI ResetDC32W(HDC32,const DEVMODE32W *);
+#define     ResetDC WINELIB_NAME_AW(ResetDC)
+BOOL16      WINAPI ResizePalette16(HPALETTE16,UINT16);
+BOOL32      WINAPI ResizePalette32(HPALETTE32,UINT32);
+#define     ResizePalette WINELIB_NAME(ResizePalette)
+BOOL16      WINAPI RestoreDC16(HDC16,INT16);
+BOOL32      WINAPI RestoreDC32(HDC32,INT32);
+#define     RestoreDC WINELIB_NAME(RestoreDC)
+BOOL16      WINAPI RoundRect16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16);
+BOOL32      WINAPI RoundRect32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32);
+#define     RoundRect WINELIB_NAME(RoundRect)
+INT16       WINAPI SaveDC16(HDC16);
+INT32       WINAPI SaveDC32(HDC32);
+#define     SaveDC WINELIB_NAME(SaveDC)
+BOOL16      WINAPI ScaleViewportExtEx16(HDC16,INT16,INT16,INT16,INT16,LPSIZE16);
+BOOL32      WINAPI ScaleViewportExtEx32(HDC32,INT32,INT32,INT32,INT32,LPSIZE32);
+#define     ScaleViewportExtEx WINELIB_NAME(ScaleViewportExtEx)
+BOOL16      WINAPI ScaleWindowExtEx16(HDC16,INT16,INT16,INT16,INT16,LPSIZE16);
+BOOL32      WINAPI ScaleWindowExtEx32(HDC32,INT32,INT32,INT32,INT32,LPSIZE32);
+#define     ScaleWindowExtEx WINELIB_NAME(ScaleWindowExtEx)
+void        WINAPI ScreenToClient16(HWND16,LPPOINT16);
+void        WINAPI ScreenToClient32(HWND32,LPPOINT32);
+#define     ScreenToClient WINELIB_NAME(ScreenToClient)
+VOID        WINAPI ScrollChildren16(HWND16,UINT16,WPARAM16,LPARAM);
+VOID        WINAPI ScrollChildren32(HWND32,UINT32,WPARAM32,LPARAM);
+#define     ScrollChildren WINELIB_NAME(ScrollChildren)
+BOOL16      WINAPI ScrollDC16(HDC16,INT16,INT16,const RECT16*,const RECT16*,
                       HRGN16,LPRECT16);
-BOOL32     ScrollDC32(HDC32,INT32,INT32,const RECT32*,const RECT32*,
+BOOL32      WINAPI ScrollDC32(HDC32,INT32,INT32,const RECT32*,const RECT32*,
                       HRGN32,LPRECT32);
-#define    ScrollDC WINELIB_NAME(ScrollDC)
-void       ScrollWindow16(HWND16,INT16,INT16,const RECT16*,const RECT16*);
-BOOL32     ScrollWindow32(HWND32,INT32,INT32,const RECT32*,const RECT32*);
-#define    ScrollWindow WINELIB_NAME(ScrollWindow)
-INT16      ScrollWindowEx16(HWND16,INT16,INT16,const RECT16*,const RECT16*,
-                            HRGN16,LPRECT16,UINT16);
-INT32      ScrollWindowEx32(HWND32,INT32,INT32,const RECT32*,const RECT32*,
-                            HRGN32,LPRECT32,UINT32);
-#define    ScrollWindowEx WINELIB_NAME(ScrollWindowEx)
-INT16      SelectClipRgn16(HDC16,HRGN16);
-INT32      SelectClipRgn32(HDC32,HRGN32);
-#define    SelectClipRgn WINELIB_NAME(SelectClipRgn)
-HGDIOBJ16  SelectObject16(HDC16,HGDIOBJ16);
-HGDIOBJ32  SelectObject32(HDC32,HGDIOBJ32);
-#define    SelectObject WINELIB_NAME(SelectObject)
-HPALETTE16 SelectPalette16(HDC16,HPALETTE16,BOOL16);
-HPALETTE32 SelectPalette32(HDC32,HPALETTE32,BOOL32);
-#define    SelectPalette WINELIB_NAME(SelectPalette)
-LRESULT    SendDlgItemMessage16(HWND16,INT16,UINT16,WPARAM16,LPARAM);
-LRESULT    SendDlgItemMessage32A(HWND32,INT32,UINT32,WPARAM32,LPARAM);
-LRESULT    SendDlgItemMessage32W(HWND32,INT32,UINT32,WPARAM32,LPARAM);
-#define    SendDlgItemMessage WINELIB_NAME_AW(SendDlgItemMessage)
-LRESULT    SendMessage16(HWND16,UINT16,WPARAM16,LPARAM);
-LRESULT    SendMessage32A(HWND32,UINT32,WPARAM32,LPARAM);
-LRESULT    SendMessage32W(HWND32,UINT32,WPARAM32,LPARAM);
-#define    SendMessage WINELIB_NAME_AW(SendMessage)
-HWND16     SetActiveWindow16(HWND16);
-HWND32     SetActiveWindow32(HWND32);
-#define    SetActiveWindow WINELIB_NAME(SetActiveWindow)
-LONG       SetBitmapBits16(HBITMAP16,LONG,LPCVOID);
-LONG       SetBitmapBits32(HBITMAP32,LONG,LPCVOID);
-#define    SetBitmapBits WINELIB_NAME(SetBitmapBits)
-BOOL16     SetBitmapDimensionEx16(HBITMAP16,INT16,INT16,LPSIZE16);
-BOOL32     SetBitmapDimensionEx32(HBITMAP32,INT32,INT32,LPSIZE32);
-#define    SetBitmapDimensionEx WINELIB_NAME(SetBitmapDimensionEx)
-COLORREF   SetBkColor16(HDC16,COLORREF);
-COLORREF   SetBkColor32(HDC32,COLORREF);
-#define    SetBkColor WINELIB_NAME(SetBkColor)
-INT16      SetBkMode16(HDC16,INT16);
-INT32      SetBkMode32(HDC32,INT32);
-#define    SetBkMode WINELIB_NAME(SetBkMode)
-HWND16     SetCapture16(HWND16);
-HWND32     SetCapture32(HWND32);
-#define    SetCapture WINELIB_NAME(SetCapture)
-VOID       SetCaretBlinkTime16(UINT16);
-BOOL32     SetCaretBlinkTime32(UINT32);
-#define    SetCaretBlinkTime WINELIB_NAME(SetCaretBlinkTime)
-VOID       SetCaretPos16(INT16,INT16);
-BOOL32     SetCaretPos32(INT32,INT32);
-#define    SetCaretPos WINELIB_NAME(SetCaretPos)
-LONG       SetClassLong16(HWND16,INT16,LONG);
-LONG       SetClassLong32A(HWND32,INT32,LONG);
-LONG       SetClassLong32W(HWND32,INT32,LONG);
-#define    SetClassLong WINELIB_NAME_AW(SetClassLong)
-WORD       SetClassWord16(HWND16,INT16,WORD);
-WORD       SetClassWord32(HWND32,INT32,WORD);
-#define    SetClassWord WINELIB_NAME(SetClassWord)
-HANDLE16   SetClipboardData16(UINT16,HANDLE16);
-HANDLE32   SetClipboardData32(UINT32,HANDLE32);
-#define    SetClipboardData WINELIB_NAME(SetClipboardData)
-HWND16     SetClipboardViewer16(HWND16);
-HWND32     SetClipboardViewer32(HWND32);
-#define    SetClipboardViewer WINELIB_NAME(SetClipboardViewer)
-INT16      SetCommBreak16(INT16);
-BOOL32     SetCommBreak32(INT32);
-#define    SetCommBreak WINELIB_NAME(SetCommBreak)
-INT16      SetCommState16(LPDCB16);
-BOOL32     SetCommState32(INT32,LPDCB32);
-#define    SetCommState WINELIB_NAME(SetCommState)
-BOOL16     SetCurrentDirectory16(LPCSTR);
-BOOL32     SetCurrentDirectory32A(LPCSTR);
-BOOL32     SetCurrentDirectory32W(LPCWSTR);
-#define    SetCurrentDirectory WINELIB_NAME_AW(SetCurrentDirectory)
-HCURSOR16  SetCursor16(HCURSOR16);
-HCURSOR32  SetCursor32(HCURSOR32);
-#define    SetCursor WINELIB_NAME(SetCursor)
-void       SetCursorPos16(INT16,INT16);
-BOOL32     SetCursorPos32(INT32,INT32);
-#define    SetCursorPos WINELIB_NAME(SetCursorPos)
-BOOL16     SetDeskWallPaper16(LPCSTR);
-BOOL32     SetDeskWallPaper32(LPCSTR);
-#define    SetDeskWallPaper WINELIB_NAME(SetDeskWallPaper)
-INT16      SetDIBits16(HDC16,HBITMAP16,UINT16,UINT16,LPCVOID,const BITMAPINFO*,UINT16);
-INT32      SetDIBits32(HDC32,HBITMAP32,UINT32,UINT32,LPCVOID,const BITMAPINFO*,UINT32);
-#define    SetDIBits WINELIB_NAME(SetDIBits)
-INT16      SetDIBitsToDevice16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,
-                               UINT16,UINT16,LPCVOID,const BITMAPINFO*,UINT16);
-INT32      SetDIBitsToDevice32(HDC32,INT32,INT32,DWORD,DWORD,INT32,INT32,
-                               UINT32,UINT32,LPCVOID,const BITMAPINFO*,UINT32);
-#define    SetDIBitsToDevice WINELIB_NAME(SetDIBitsToDevice)
-void       SetDlgItemInt16(HWND16,INT16,UINT16,BOOL16);
-void       SetDlgItemInt32(HWND32,INT32,UINT32,BOOL32);
-#define    SetDlgItemInt WINELIB_NAME(SetDlgItemInt)
-void       SetDlgItemText16(HWND16,INT16,SEGPTR);
-void       SetDlgItemText32A(HWND32,INT32,LPCSTR);
-void       SetDlgItemText32W(HWND32,INT32,LPCWSTR);
-#define    SetDlgItemText WINELIB_NAME_AW(SetDlgItemText)
-VOID       SetDoubleClickTime16(UINT16);
-BOOL32     SetDoubleClickTime32(UINT32);
-#define    SetDoubleClickTime WINELIB_NAME(SetDoubleClickTime)
-UINT16     SetErrorMode16(UINT16);
-UINT32     SetErrorMode32(UINT32);
-#define    SetErrorMode WINELIB_NAME(SetErrorMode)
-BOOL16     SetFileAttributes16(LPCSTR,DWORD);
-BOOL32     SetFileAttributes32A(LPCSTR,DWORD);
-BOOL32     SetFileAttributes32W(LPCWSTR,DWORD);
-#define    SetFileAttributes WINELIB_NAME_AW(SetFileAttributes)
-HWND16     SetFocus16(HWND16);
-HWND32     SetFocus32(HWND32);
-#define    SetFocus WINELIB_NAME(SetFocus)
-UINT16     SetHandleCount16(UINT16);
-UINT32     SetHandleCount32(UINT32);
-#define    SetHandleCount WINELIB_NAME(SetHandleCount)
-void       SetInternalWindowPos16(HWND16,UINT16,LPRECT16,LPPOINT16);
-void       SetInternalWindowPos32(HWND32,UINT32,LPRECT32,LPPOINT32);
-#define    SetInternalWindowPos WINELIB_NAME(SetInternalWindowPos)
-INT16      SetMapMode16(HDC16,INT16);
-INT32      SetMapMode32(HDC32,INT32);
-#define    SetMapMode WINELIB_NAME(SetMapMode)
-DWORD      SetMapperFlags16(HDC16,DWORD);
-DWORD      SetMapperFlags32(HDC32,DWORD);
-#define    SetMapperFlags WINELIB_NAME(SetMapperFlags)
-BOOL16     SetMenu16(HWND16,HMENU16);
-BOOL32     SetMenu32(HWND32,HMENU32);
-#define    SetMenu WINELIB_NAME(SetMenu)
-BOOL16     SetMenuItemBitmaps16(HMENU16,UINT16,UINT16,HBITMAP16,HBITMAP16);
-BOOL32     SetMenuItemBitmaps32(HMENU32,UINT32,UINT32,HBITMAP32,HBITMAP32);
-#define    SetMenuItemBitmaps WINELIB_NAME(SetMenuItemBitmaps)
-BOOL16     SetMessageQueue16(INT16);
-BOOL32     SetMessageQueue32(INT32);
-#define    SetMessageQueue WINELIB_NAME(SetMessageQueue)
-UINT16     SetPaletteEntries16(HPALETTE16,UINT16,UINT16,LPPALETTEENTRY);
-UINT32     SetPaletteEntries32(HPALETTE32,UINT32,UINT32,LPPALETTEENTRY);
-#define    SetPaletteEntries WINELIB_NAME(SetPaletteEntries)
-HWND16     SetParent16(HWND16,HWND16);
-HWND32     SetParent32(HWND32,HWND32);
-#define    SetParent WINELIB_NAME(SetParent)
-COLORREF   SetPixel16(HDC16,INT16,INT16,COLORREF);
-COLORREF   SetPixel32(HDC32,INT32,INT32,COLORREF);
-#define    SetPixel WINELIB_NAME(SetPixel)
-INT16      SetPolyFillMode16(HDC16,INT16);
-INT32      SetPolyFillMode32(HDC32,INT32);
-#define    SetPolyFillMode WINELIB_NAME(SetPolyFillMode)
-BOOL16     SetProp16(HWND16,LPCSTR,HANDLE16);
-BOOL32     SetProp32A(HWND32,LPCSTR,HANDLE32);
-BOOL32     SetProp32W(HWND32,LPCWSTR,HANDLE32);
-#define    SetProp WINELIB_NAME_AW(SetProp)
-void       SetRect16(LPRECT16,INT16,INT16,INT16,INT16);
-void       SetRect32(LPRECT32,INT32,INT32,INT32,INT32);
-#define    SetRect WINELIB_NAME(SetRect)
-void       SetRectEmpty16(LPRECT16);
-void       SetRectEmpty32(LPRECT32);
-#define    SetRectEmpty WINELIB_NAME(SetRectEmpty)
-VOID       SetRectRgn16(HRGN16,INT16,INT16,INT16,INT16);
-VOID       SetRectRgn32(HRGN32,INT32,INT32,INT32,INT32);
-#define    SetRectRgn WINELIB_NAME(SetRectRgn)
-INT16      SetRelAbs16(HDC16,INT16);
-INT32      SetRelAbs32(HDC32,INT32);
-#define    SetRelAbs WINELIB_NAME(SetRelAbs)
-INT16      SetROP216(HDC16,INT16);
-INT32      SetROP232(HDC32,INT32);
-#define    SetROP2 WINELIB_NAME(SetROP2)
-INT16      SetScrollInfo16(HWND16,INT16,const SCROLLINFO*,BOOL16);
-INT32      SetScrollInfo32(HWND32,INT32,const SCROLLINFO*,BOOL32);
-#define    SetScrollInfo WINELIB_NAME(SetScrollInfo)
-INT16      SetScrollPos16(HWND16,INT16,INT16,BOOL16);
-INT32      SetScrollPos32(HWND32,INT32,INT32,BOOL32);
-#define    SetScrollPos WINELIB_NAME(SetScrollPos)
-void       SetScrollRange16(HWND16,INT16,INT16,INT16,BOOL16);
-BOOL32     SetScrollRange32(HWND32,INT32,INT32,INT32,BOOL32);
-#define    SetScrollRange WINELIB_NAME(SetScrollRange)
-INT16      SetSoundNoise16(INT16,INT16);
-DWORD      SetSoundNoise32(DWORD,DWORD);
-#define    SetSoundNoise WINELIB_NAME(SetSoundNoise)
-INT16      SetStretchBltMode16(HDC16,INT16);
-INT32      SetStretchBltMode32(HDC32,INT32);
-#define    SetStretchBltMode WINELIB_NAME(SetStretchBltMode)
-VOID       SetSysColors16(INT16,const INT16*,const COLORREF*);
-BOOL32     SetSysColors32(INT32,const INT32*,const COLORREF*);
-#define    SetSysColors WINELIB_NAME(SetSysColors)
-HWND16     SetSysModalWindow16(HWND16);
-#define    SetSysModalWindow32(hwnd) ((HWND32)0)
-#define    SetSysModalWindow WINELIB_NAME(SetSysModalWindow)
-BOOL16     SetSystemMenu16(HWND16,HMENU16);
-BOOL32     SetSystemMenu32(HWND32,HMENU32);
-#define    SetSystemMenu WINELIB_NAME(SetSystemMenu)
-UINT16     SetSystemPaletteUse16(HDC16,UINT16);
-UINT32     SetSystemPaletteUse32(HDC32,UINT32);
-#define    SetSystemPaletteUse WINELIB_NAME(SetSystemPaletteUse)
-UINT16     SetSystemTimer16(HWND16,UINT16,UINT16,TIMERPROC16);
-UINT32     SetSystemTimer32(HWND32,UINT32,UINT32,TIMERPROC32);
-#define    SetSystemTimer WINELIB_NAME(SetSystemTimer)
-UINT16     SetTextAlign16(HDC16,UINT16);
-UINT32     SetTextAlign32(HDC32,UINT32);
-#define    SetTextAlign WINELIB_NAME(SetTextAlign)
-INT16      SetTextCharacterExtra16(HDC16,INT16);
-INT32      SetTextCharacterExtra32(HDC32,INT32);
-#define    SetTextCharacterExtra WINELIB_NAME(SetTextCharacterExtra)
-COLORREF   SetTextColor16(HDC16,COLORREF);
-COLORREF   SetTextColor32(HDC32,COLORREF);
-#define    SetTextColor WINELIB_NAME(SetTextColor)
-INT16      SetTextJustification16(HDC16,INT16,INT16);
-BOOL32     SetTextJustification32(HDC32,INT32,INT32);
-#define    SetTextJustification WINELIB_NAME(SetTextJustification)
-UINT16     SetTimer16(HWND16,UINT16,UINT16,TIMERPROC16);
-UINT32     SetTimer32(HWND32,UINT32,UINT32,TIMERPROC32);
-#define    SetTimer WINELIB_NAME(SetTimer)
-BOOL16     SetViewportExtEx16(HDC16,INT16,INT16,LPSIZE16);
-BOOL32     SetViewportExtEx32(HDC32,INT32,INT32,LPSIZE32);
-#define    SetViewportExtEx WINELIB_NAME(SetViewportExtEx)
-BOOL16     SetViewportOrgEx16(HDC16,INT16,INT16,LPPOINT16);
-BOOL32     SetViewportOrgEx32(HDC32,INT32,INT32,LPPOINT32);
-#define    SetViewportOrgEx WINELIB_NAME(SetViewportOrgEx)
-INT16      SetVoiceAccent16(INT16,INT16,INT16,INT16,INT16);
-DWORD      SetVoiceAccent32(DWORD,DWORD,DWORD,DWORD,DWORD);
-#define    SetVoiceAccent WINELIB_NAME(SetVoiceAccent)
-INT16      SetVoiceEnvelope16(INT16,INT16,INT16);
-DWORD      SetVoiceEnvelope32(DWORD,DWORD,DWORD);
-#define    SetVoiceEnvelope WINELIB_NAME(SetVoiceEnvelope)
-INT16      SetVoiceNote16(INT16,INT16,INT16,INT16);
-DWORD      SetVoiceNote32(DWORD,DWORD,DWORD,DWORD);
-#define    SetVoiceNote WINELIB_NAME(SetVoiceNote)
-INT16      SetVoiceQueueSize16(INT16,INT16);
-DWORD      SetVoiceQueueSize32(DWORD,DWORD);
-#define    SetVoiceQueueSize WINELIB_NAME(SetVoiceQueueSize)
-INT16      SetVoiceSound16(INT16,DWORD,INT16);
-DWORD      SetVoiceSound32(DWORD,DWORD,DWORD);
-#define    SetVoiceSound WINELIB_NAME(SetVoiceSound)
-INT16      SetVoiceThreshold16(INT16,INT16);
-DWORD      SetVoiceThreshold32(DWORD,DWORD);
-#define    SetVoiceThreshold WINELIB_NAME(SetVoiceThreshold)
-BOOL16     SetWindowExtEx16(HDC16,INT16,INT16,LPSIZE16);
-BOOL32     SetWindowExtEx32(HDC32,INT32,INT32,LPSIZE32);
-#define    SetWindowExtEx WINELIB_NAME(SetWindowExtEx)
-LONG       SetWindowLong16(HWND16,INT16,LONG);
-LONG       SetWindowLong32A(HWND32,INT32,LONG);
-LONG       SetWindowLong32W(HWND32,INT32,LONG);
-#define    SetWindowLong WINELIB_NAME_AW(SetWindowLong)
-BOOL16     SetWindowOrgEx16(HDC16,INT16,INT16,LPPOINT16);
-BOOL32     SetWindowOrgEx32(HDC32,INT32,INT32,LPPOINT32);
-#define    SetWindowOrgEx WINELIB_NAME(SetWindowOrgEx)
-BOOL16     SetWindowPlacement16(HWND16,const WINDOWPLACEMENT16*);
-BOOL32     SetWindowPlacement32(HWND32,const WINDOWPLACEMENT32*);
-#define    SetWindowPlacement WINELIB_NAME(SetWindowPlacement)
-FARPROC16  SetWindowsHook16(INT16,HOOKPROC16);
-HHOOK      SetWindowsHook32A(INT32,HOOKPROC32);
-HHOOK      SetWindowsHook32W(INT32,HOOKPROC32);
-#define    SetWindowsHook WINELIB_NAME_AW(SetWindowsHook)
-HHOOK      SetWindowsHookEx16(INT16,HOOKPROC16,HINSTANCE16,HTASK16);
-HHOOK      SetWindowsHookEx32A(INT32,HOOKPROC32,HINSTANCE32,DWORD);
-HHOOK      SetWindowsHookEx32W(INT32,HOOKPROC32,HINSTANCE32,DWORD);
-#define    SetWindowsHookEx WINELIB_NAME_AW(SetWindowsHookEx)
-BOOL16     SetWindowPos16(HWND16,HWND16,INT16,INT16,INT16,INT16,WORD);
-BOOL32     SetWindowPos32(HWND32,HWND32,INT32,INT32,INT32,INT32,WORD);
-#define    SetWindowPos WINELIB_NAME(SetWindowPos)
-void       SetWindowText16(HWND16,SEGPTR);
-void       SetWindowText32A(HWND32,LPCSTR);
-void       SetWindowText32W(HWND32,LPCWSTR);
-#define    SetWindowText WINELIB_NAME_AW(SetWindowText)
-WORD       SetWindowWord16(HWND16,INT16,WORD);
-WORD       SetWindowWord32(HWND32,INT32,WORD);
-#define    SetWindowWord WINELIB_NAME(SetWindowWord)
-BOOL16     ShellAbout16(HWND16,LPCSTR,LPCSTR,HICON16);
-BOOL32     ShellAbout32A(HWND32,LPCSTR,LPCSTR,HICON32);
-BOOL32     ShellAbout32W(HWND32,LPCWSTR,LPCWSTR,HICON32);
-#define    ShellAbout WINELIB_NAME_AW(ShellAbout)
-HINSTANCE16 ShellExecute16(HWND16,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT16);
-HINSTANCE32 ShellExecute32A(HWND32,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT32);
-HINSTANCE32 ShellExecute32W(HWND32,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,INT32);
-#define    ShellExecute WINELIB_NAME_AW(ShellExecute)
-VOID       ShowCaret16(HWND16);
-BOOL32     ShowCaret32(HWND32);
-#define    ShowCaret WINELIB_NAME(ShowCaret)
-INT16      ShowCursor16(BOOL16);
-INT32      ShowCursor32(BOOL32);
-#define    ShowCursor WINELIB_NAME(ShowCursor)
-void       ShowScrollBar16(HWND16,INT16,BOOL16);
-BOOL32     ShowScrollBar32(HWND32,INT32,BOOL32);
-#define    ShowScrollBar WINELIB_NAME(ShowScrollBar)
-VOID       ShowOwnedPopups16(HWND16,BOOL16);
-BOOL32     ShowOwnedPopups32(HWND32,BOOL32);
-#define    ShowOwnedPopups WINELIB_NAME(ShowOwnedPopups)
-BOOL16     ShowWindow16(HWND16,INT16);
-BOOL32     ShowWindow32(HWND32,INT32);
-#define    ShowWindow WINELIB_NAME(ShowWindow)
-DWORD      SizeofResource16(HMODULE16,HRSRC16);
-DWORD      SizeofResource32(HMODULE32,HRSRC32);
-#define    SizeofResource WINELIB_NAME(SizeofResource)
-INT16      StartDoc16(HDC16,const DOCINFO16*);
-INT32      StartDoc32A(HDC32,const DOCINFO32A*);
-INT32      StartDoc32W(HDC32,const DOCINFO32W*);
-#define    StartDoc WINELIB_NAME_AW(StartDoc)
-INT16      StartSound16(void);
-VOID       StartSound32(void);
-#define    StartSound WINELIB_NAME(StartSound)
-INT16      StopSound16(void);
-VOID       StopSound32(void);
-#define    StopSound WINELIB_NAME(StopSound)
-BOOL16     StretchBlt16(HDC16,INT16,INT16,INT16,INT16,HDC16,INT16,INT16,
-                        INT16,INT16,DWORD);
-BOOL32     StretchBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,INT32,
-                        INT32,INT32,DWORD);
-#define    StretchBlt WINELIB_NAME(StretchBlt)
-INT16      StretchDIBits16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,
-                           INT16,const VOID*,const BITMAPINFO*,UINT16,DWORD);
-INT32      StretchDIBits32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,
-                           INT32,const VOID*,const BITMAPINFO*,UINT32,DWORD);
-#define    StretchDIBits WINELIB_NAME(StretchDIBits)
-BOOL16     SubtractRect16(LPRECT16,const RECT16*,const RECT16*);
-BOOL32     SubtractRect32(LPRECT32,const RECT32*,const RECT32*);
-#define    SubtractRect WINELIB_NAME(SubtractRect)
-BOOL16     SwapMouseButton16(BOOL16);
-BOOL32     SwapMouseButton32(BOOL32);
-#define    SwapMouseButton WINELIB_NAME(SwapMouseButton)
-VOID       SwitchToThisWindow16(HWND16,BOOL16);
-VOID       SwitchToThisWindow32(HWND32,BOOL32);
-#define    SwitchToThisWindow WINELIB_NAME(SwitchToThisWindow)
-INT16      SyncAllVoices16(void);
-DWORD      SyncAllVoices32(void);
-#define    SyncAllVoices WINELIB_NAME(SyncAllVoices)
-BOOL16     SystemParametersInfo16(UINT16,UINT16,LPVOID,UINT16);
-BOOL32     SystemParametersInfo32A(UINT32,UINT32,LPVOID,UINT32);
-BOOL32     SystemParametersInfo32W(UINT32,UINT32,LPVOID,UINT32);
-#define    SystemParametersInfo WINELIB_NAME_AW(SystemParametersInfo)
-LONG       TabbedTextOut16(HDC16,INT16,INT16,LPCSTR,INT16,INT16,const INT16*,INT16);
-LONG       TabbedTextOut32A(HDC32,INT32,INT32,LPCSTR,INT32,INT32,const INT32*,INT32);
-LONG       TabbedTextOut32W(HDC32,INT32,INT32,LPCWSTR,INT32,INT32,const INT32*,INT32);
-#define    TabbedTextOut WINELIB_NAME_AW(TabbedTextOut)
-BOOL16     TextOut16(HDC16,INT16,INT16,LPCSTR,INT16);
-BOOL32     TextOut32A(HDC32,INT32,INT32,LPCSTR,INT32);
-BOOL32     TextOut32W(HDC32,INT32,INT32,LPCWSTR,INT32);
-#define    TextOut WINELIB_NAME_AW(TextOut)
-INT16      ToAscii16(UINT16,UINT16,LPBYTE,LPVOID,UINT16);
-INT32      ToAscii32(UINT32,UINT32,LPBYTE,LPWORD,UINT32);
-#define    ToAscii WINELIB_NAME(ToAscii)
-BOOL16     TrackPopupMenu16(HMENU16,UINT16,INT16,INT16,INT16,HWND16,const RECT16*);
-BOOL32     TrackPopupMenu32(HMENU32,UINT32,INT32,INT32,INT32,HWND32,const RECT32*);
-#define    TrackPopupMenu WINELIB_NAME(TrackPopupMenu)
-INT16      TranslateAccelerator16(HWND16,HACCEL16,LPMSG16);
-INT32      TranslateAccelerator32(HWND32,HACCEL32,LPMSG32);
-#define    TranslateAccelerator WINELIB_NAME(TranslateAccelerator)
-BOOL16     TranslateMDISysAccel16(HWND16,LPMSG16);
-BOOL32     TranslateMDISysAccel32(HWND32,LPMSG32);
-#define    TranslateMDISysAccel WINELIB_NAME(TranslateMDISysAccel)
-BOOL16     TranslateMessage16(const MSG16*);
-BOOL32     TranslateMessage32(const MSG32*);
-#define    TranslateMessage WINELIB_NAME(TranslateMessage)
-INT16      TransmitCommChar16(INT16,CHAR);
-BOOL32     TransmitCommChar32(INT32,CHAR);
-#define    TransmitCommChar WINELIB_NAME(TransmitCommChar)
-BOOL16     UnhookWindowsHook16(INT16,HOOKPROC16);
-BOOL32     UnhookWindowsHook32(INT32,HOOKPROC32);
-#define    UnhookWindowsHook WINELIB_NAME(UnhookWindowsHook)
-BOOL16     UnhookWindowsHookEx16(HHOOK);
-BOOL32     UnhookWindowsHookEx32(HHOOK);
-#define    UnhookWindowsHookEx WINELIB_NAME(UnhookWindowsHookEx)
-BOOL16     UnionRect16(LPRECT16,const RECT16*,const RECT16*);
-BOOL32     UnionRect32(LPRECT32,const RECT32*,const RECT32*);
-#define    UnionRect WINELIB_NAME(UnionRect)
-void       UnlockSegment16(HGLOBAL16);
-#define    UnlockSegment32(handle) GlobalUnfix((HANDLE32)(handle))
-#define    UnlockSegment WINELIB_NAME(UnlockSegment)
-BOOL16     UnrealizeObject16(HGDIOBJ16);
-BOOL32     UnrealizeObject32(HGDIOBJ32);
-#define    UnrealizeObject WINELIB_NAME(UnrealizeObject)
-BOOL16     UnregisterClass16(SEGPTR,HINSTANCE16);
-BOOL32     UnregisterClass32A(LPCSTR,HINSTANCE32);
-BOOL32     UnregisterClass32W(LPCWSTR,HINSTANCE32);
-#define    UnregisterClass WINELIB_NAME_AW(UnregisterClass)
-INT16      UpdateColors16(HDC16);
-BOOL32     UpdateColors32(HDC32);
-#define    UpdateColors WINELIB_NAME(UpdateColors)
-VOID       UpdateWindow16(HWND16);
-VOID       UpdateWindow32(HWND32);
-#define    UpdateWindow WINELIB_NAME(UpdateWindow)
-VOID       ValidateRect16(HWND16,const RECT16*);
-VOID       ValidateRect32(HWND32,const RECT32*);
-#define    ValidateRect WINELIB_NAME(ValidateRect)
-VOID       ValidateRgn16(HWND16,HRGN16);
-VOID       ValidateRgn32(HWND32,HRGN32);
-#define    ValidateRgn WINELIB_NAME(ValidateRgn)
-DWORD      VerFindFile16(UINT16,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT16*,LPSTR,UINT16*);
-DWORD      VerFindFile32A(UINT32,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT32*,LPSTR,UINT32*);
-DWORD      VerFindFile32W(UINT32,LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,UINT32*,LPWSTR,UINT32*);
-#define    VerFindFile WINELIB_NAME_AW(VerFindFile)
-DWORD      VerInstallFile16(UINT16,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT16*);
-DWORD      VerInstallFile32A(UINT32,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT32*);
-DWORD      VerInstallFile32W(UINT32,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,UINT32*);
-#define    VerInstallFile WINELIB_NAME_AW(VerInstallFile)
-DWORD      VerLanguageName16(UINT16,LPSTR,UINT16);
-DWORD      VerLanguageName32A(UINT32,LPSTR,UINT32);
-DWORD      VerLanguageName32W(UINT32,LPWSTR,UINT32);
-#define    VerLanguageName WINELIB_NAME_AW(VerLanguageName)
-DWORD      VerQueryValue16(SEGPTR,LPCSTR,SEGPTR*,UINT16*);
-DWORD      VerQueryValue32A(LPVOID,LPCSTR,LPVOID*,UINT32*);
-DWORD      VerQueryValue32W(LPVOID,LPCWSTR,LPVOID*,UINT32*);
-#define    VerQueryValue WINELIB_NAME_AW(VerQueryValue)
-WORD       VkKeyScan16(CHAR);
-WORD       VkKeyScan32A(CHAR);
-WORD       VkKeyScan32W(WCHAR);
-#define    VkKeyScan WINELIB_NAME_AW(VkKeyScan)
-INT16      WaitSoundState16(INT16);
-DWORD      WaitSoundState32(DWORD);
-#define    WaitSoundState WINELIB_NAME(WaitSoundState)
-HWND16     WindowFromDC16(HDC16);
-HWND32     WindowFromDC32(HDC32);
-#define    WindowFromDC WINELIB_NAME(WindowFromDC)
-HWND16     WindowFromPoint16(POINT16);
-HWND32     WindowFromPoint32(POINT32);
-#define    WindowFromPoint WINELIB_NAME(WindowFromPoint)
-BOOL16     WritePrivateProfileString16(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
-BOOL32     WritePrivateProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
-BOOL32     WritePrivateProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);
-#define    WritePrivateProfileString WINELIB_NAME_AW(WritePrivateProfileString)
-BOOL16     WriteProfileString16(LPCSTR,LPCSTR,LPCSTR);
-BOOL32     WriteProfileString32A(LPCSTR,LPCSTR,LPCSTR);
-BOOL32     WriteProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR);
-#define    WriteProfileString WINELIB_NAME_AW(WriteProfileString)
-SEGPTR     lstrcat16(SEGPTR,LPCSTR);
-LPSTR      lstrcat32A(LPSTR,LPCSTR);
-LPWSTR     lstrcat32W(LPWSTR,LPCWSTR);
-#define    lstrcat WINELIB_NAME_AW(lstrcat)
-SEGPTR     lstrcatn16(SEGPTR,LPCSTR,INT16);
-LPSTR      lstrcatn32A(LPSTR,LPCSTR,INT32);
-LPWSTR     lstrcatn32W(LPWSTR,LPCWSTR,INT32);
-#define    lstrcatn WINELIB_NAME_AW(lstrcatn)
-INT16      lstrcmp16(LPCSTR,LPCSTR);
-INT32      lstrcmp32A(LPCSTR,LPCSTR);
-INT32      lstrcmp32W(LPCWSTR,LPCWSTR);
-#define    lstrcmp WINELIB_NAME_AW(lstrcmp)
-INT16      lstrcmpi16(LPCSTR,LPCSTR);
-INT32      lstrcmpi32A(LPCSTR,LPCSTR);
-INT32      lstrcmpi32W(LPCWSTR,LPCWSTR);
-#define    lstrcmpi WINELIB_NAME_AW(lstrcmpi)
-SEGPTR     lstrcpy16(SEGPTR,LPCSTR);
-LPSTR      lstrcpy32A(LPSTR,LPCSTR);
-LPWSTR     lstrcpy32W(LPWSTR,LPCWSTR);
-#define    lstrcpy WINELIB_NAME_AW(lstrcpy)
-SEGPTR     lstrcpyn16(SEGPTR,LPCSTR,INT16);
-LPSTR      lstrcpyn32A(LPSTR,LPCSTR,INT32);
-LPWSTR     lstrcpyn32W(LPWSTR,LPCWSTR,INT32);
-#define    lstrcpyn WINELIB_NAME_AW(lstrcpyn)
-INT16      lstrlen16(LPCSTR);
-INT32      lstrlen32A(LPCSTR);
-INT32      lstrlen32W(LPCWSTR);
-#define    lstrlen WINELIB_NAME_AW(lstrlen)
-HINSTANCE16 WinExec16(LPCSTR,UINT16);
-HINSTANCE32 WinExec32(LPCSTR,UINT32);
-#define    WinExec WINELIB_NAME(WinExec)
-BOOL16     WinHelp16(HWND16,LPCSTR,UINT16,DWORD);
-BOOL32     WinHelp32A(HWND32,LPCSTR,UINT32,DWORD);
-BOOL32     WinHelp32W(HWND32,LPCWSTR,UINT32,DWORD);
-#define    WinHelp WINELIB_NAME_AW(WinHelp)
-INT16      wsnprintf16(LPSTR,UINT16,LPCSTR,...);
-INT32      wsnprintf32A(LPSTR,UINT32,LPCSTR,...);
-INT32      wsnprintf32W(LPWSTR,UINT32,LPCWSTR,...);
-#define    wsnprintf WINELIB_NAME_AW(wsnprintf)
-INT16      wsprintf16(LPSTR,LPCSTR,...);
-INT32      wsprintf32A(LPSTR,LPCSTR,...);
-INT32      wsprintf32W(LPWSTR,LPCWSTR,...);
-#define    wsprintf WINELIB_NAME_AW(wsprintf)
-INT16      wvsnprintf16(LPSTR,UINT16,LPCSTR,LPCVOID);
-INT32      wvsnprintf32A(LPSTR,UINT32,LPCSTR,LPCVOID);
-INT32      wvsnprintf32W(LPWSTR,UINT32,LPCWSTR,LPCVOID);
-#define    wvsnprintf WINELIB_NAME_AW(wvsnprintf)
-INT16      wvsprintf16(LPSTR,LPCSTR,LPCVOID);
-INT32      wvsprintf32A(LPSTR,LPCSTR,LPCVOID);
-INT32      wvsprintf32W(LPWSTR,LPCWSTR,LPCVOID);
-#define    wvsprintf WINELIB_NAME_AW(wvsprintf)
-LONG       _hread16(HFILE16,LPVOID,LONG);
-LONG       _hread32(HFILE32,LPVOID,LONG);
-#define    _hread WINELIB_NAME(_hread)
-LONG       _hwrite16(HFILE16,LPCSTR,LONG);
-LONG       _hwrite32(HFILE32,LPCSTR,LONG);
-#define    _hwrite WINELIB_NAME(_hwrite)
-HFILE16    _lcreat16(LPCSTR,INT16);
-HFILE32    _lcreat32(LPCSTR,INT32);
-#define    _lcreat WINELIB_NAME(_lcreat)
-HFILE16    _lclose16(HFILE16);
-HFILE32    _lclose32(HFILE32);
-#define    _lclose WINELIB_NAME(_lclose)
-LONG       _llseek16(HFILE16,LONG,INT16);
-LONG       _llseek32(HFILE32,LONG,INT32);
-#define    _llseek WINELIB_NAME(_llseek)
-HFILE16    _lopen16(LPCSTR,INT16);
-HFILE32    _lopen32(LPCSTR,INT32);
-#define    _lopen WINELIB_NAME(_lopen)
-UINT16     _lread16(HFILE16,LPVOID,UINT16);
-UINT32     _lread32(HFILE32,LPVOID,UINT32);
-#define    _lread WINELIB_NAME(_lread)
-UINT16     _lwrite16(HFILE16,LPCSTR,UINT16);
-UINT32     _lwrite32(HFILE32,LPCSTR,UINT32);
-#define    _lwrite WINELIB_NAME(_lwrite)
+#define     ScrollDC WINELIB_NAME(ScrollDC)
+void        WINAPI ScrollWindow16(HWND16,INT16,INT16,const RECT16*,const RECT16*);
+BOOL32      WINAPI ScrollWindow32(HWND32,INT32,INT32,const RECT32*,const RECT32*);
+#define     ScrollWindow WINELIB_NAME(ScrollWindow)
+INT16       WINAPI ScrollWindowEx16(HWND16,INT16,INT16,const RECT16*,
+                                    const RECT16*,HRGN16,LPRECT16,UINT16);
+INT32       WINAPI ScrollWindowEx32(HWND32,INT32,INT32,const RECT32*,
+                                    const RECT32*,HRGN32,LPRECT32,UINT32);
+#define     ScrollWindowEx WINELIB_NAME(ScrollWindowEx)
+INT16       WINAPI SelectClipRgn16(HDC16,HRGN16);
+INT32       WINAPI SelectClipRgn32(HDC32,HRGN32);
+#define     SelectClipRgn WINELIB_NAME(SelectClipRgn)
+HGDIOBJ16   WINAPI SelectObject16(HDC16,HGDIOBJ16);
+HGDIOBJ32   WINAPI SelectObject32(HDC32,HGDIOBJ32);
+#define     SelectObject WINELIB_NAME(SelectObject)
+HPALETTE16  WINAPI SelectPalette16(HDC16,HPALETTE16,BOOL16);
+HPALETTE32  WINAPI SelectPalette32(HDC32,HPALETTE32,BOOL32);
+#define     SelectPalette WINELIB_NAME(SelectPalette)
+LRESULT     WINAPI SendDlgItemMessage16(HWND16,INT16,UINT16,WPARAM16,LPARAM);
+LRESULT     WINAPI SendDlgItemMessage32A(HWND32,INT32,UINT32,WPARAM32,LPARAM);
+LRESULT     WINAPI SendDlgItemMessage32W(HWND32,INT32,UINT32,WPARAM32,LPARAM);
+#define     SendDlgItemMessage WINELIB_NAME_AW(SendDlgItemMessage)
+LRESULT     WINAPI SendMessage16(HWND16,UINT16,WPARAM16,LPARAM);
+LRESULT     WINAPI SendMessage32A(HWND32,UINT32,WPARAM32,LPARAM);
+LRESULT     WINAPI SendMessage32W(HWND32,UINT32,WPARAM32,LPARAM);
+#define     SendMessage WINELIB_NAME_AW(SendMessage)
+HWND16      WINAPI SetActiveWindow16(HWND16);
+HWND32      WINAPI SetActiveWindow32(HWND32);
+#define     SetActiveWindow WINELIB_NAME(SetActiveWindow)
+LONG        WINAPI SetBitmapBits16(HBITMAP16,LONG,LPCVOID);
+LONG        WINAPI SetBitmapBits32(HBITMAP32,LONG,LPCVOID);
+#define     SetBitmapBits WINELIB_NAME(SetBitmapBits)
+BOOL16      WINAPI SetBitmapDimensionEx16(HBITMAP16,INT16,INT16,LPSIZE16);
+BOOL32      WINAPI SetBitmapDimensionEx32(HBITMAP32,INT32,INT32,LPSIZE32);
+#define     SetBitmapDimensionEx WINELIB_NAME(SetBitmapDimensionEx)
+COLORREF    WINAPI SetBkColor16(HDC16,COLORREF);
+COLORREF    WINAPI SetBkColor32(HDC32,COLORREF);
+#define     SetBkColor WINELIB_NAME(SetBkColor)
+INT16       WINAPI SetBkMode16(HDC16,INT16);
+INT32       WINAPI SetBkMode32(HDC32,INT32);
+#define     SetBkMode WINELIB_NAME(SetBkMode)
+HWND16      WINAPI SetCapture16(HWND16);
+HWND32      WINAPI SetCapture32(HWND32);
+#define     SetCapture WINELIB_NAME(SetCapture)
+VOID        WINAPI SetCaretBlinkTime16(UINT16);
+BOOL32      WINAPI SetCaretBlinkTime32(UINT32);
+#define     SetCaretBlinkTime WINELIB_NAME(SetCaretBlinkTime)
+VOID        WINAPI SetCaretPos16(INT16,INT16);
+BOOL32      WINAPI SetCaretPos32(INT32,INT32);
+#define     SetCaretPos WINELIB_NAME(SetCaretPos)
+LONG        WINAPI SetClassLong16(HWND16,INT16,LONG);
+LONG        WINAPI SetClassLong32A(HWND32,INT32,LONG);
+LONG        WINAPI SetClassLong32W(HWND32,INT32,LONG);
+#define     SetClassLong WINELIB_NAME_AW(SetClassLong)
+WORD        WINAPI SetClassWord16(HWND16,INT16,WORD);
+WORD        WINAPI SetClassWord32(HWND32,INT32,WORD);
+#define     SetClassWord WINELIB_NAME(SetClassWord)
+HANDLE16    WINAPI SetClipboardData16(UINT16,HANDLE16);
+HANDLE32    WINAPI SetClipboardData32(UINT32,HANDLE32);
+#define     SetClipboardData WINELIB_NAME(SetClipboardData)
+HWND16      WINAPI SetClipboardViewer16(HWND16);
+HWND32      WINAPI SetClipboardViewer32(HWND32);
+#define     SetClipboardViewer WINELIB_NAME(SetClipboardViewer)
+INT16       WINAPI SetCommBreak16(INT16);
+BOOL32      WINAPI SetCommBreak32(INT32);
+#define     SetCommBreak WINELIB_NAME(SetCommBreak)
+INT16       WINAPI SetCommState16(LPDCB16);
+BOOL32      WINAPI SetCommState32(INT32,LPDCB32);
+#define     SetCommState WINELIB_NAME(SetCommState)
+BOOL16      WINAPI SetCurrentDirectory16(LPCSTR);
+BOOL32      WINAPI SetCurrentDirectory32A(LPCSTR);
+BOOL32      WINAPI SetCurrentDirectory32W(LPCWSTR);
+#define     SetCurrentDirectory WINELIB_NAME_AW(SetCurrentDirectory)
+HCURSOR16   WINAPI SetCursor16(HCURSOR16);
+HCURSOR32   WINAPI SetCursor32(HCURSOR32);
+#define     SetCursor WINELIB_NAME(SetCursor)
+void        WINAPI SetCursorPos16(INT16,INT16);
+BOOL32      WINAPI SetCursorPos32(INT32,INT32);
+#define     SetCursorPos WINELIB_NAME(SetCursorPos)
+BOOL16      WINAPI SetDeskWallPaper16(LPCSTR);
+BOOL32      WINAPI SetDeskWallPaper32(LPCSTR);
+#define     SetDeskWallPaper WINELIB_NAME(SetDeskWallPaper)
+INT16       WINAPI SetDIBits16(HDC16,HBITMAP16,UINT16,UINT16,LPCVOID,const BITMAPINFO*,UINT16);
+INT32       WINAPI SetDIBits32(HDC32,HBITMAP32,UINT32,UINT32,LPCVOID,const BITMAPINFO*,UINT32);
+#define     SetDIBits WINELIB_NAME(SetDIBits)
+INT16       WINAPI SetDIBitsToDevice16(HDC16,INT16,INT16,INT16,INT16,INT16,
+                         INT16,UINT16,UINT16,LPCVOID,const BITMAPINFO*,UINT16);
+INT32       WINAPI SetDIBitsToDevice32(HDC32,INT32,INT32,DWORD,DWORD,INT32,
+                         INT32,UINT32,UINT32,LPCVOID,const BITMAPINFO*,UINT32);
+#define     SetDIBitsToDevice WINELIB_NAME(SetDIBitsToDevice)
+void        WINAPI SetDlgItemInt16(HWND16,INT16,UINT16,BOOL16);
+void        WINAPI SetDlgItemInt32(HWND32,INT32,UINT32,BOOL32);
+#define     SetDlgItemInt WINELIB_NAME(SetDlgItemInt)
+void        WINAPI SetDlgItemText16(HWND16,INT16,SEGPTR);
+void        WINAPI SetDlgItemText32A(HWND32,INT32,LPCSTR);
+void        WINAPI SetDlgItemText32W(HWND32,INT32,LPCWSTR);
+#define     SetDlgItemText WINELIB_NAME_AW(SetDlgItemText)
+VOID        WINAPI SetDoubleClickTime16(UINT16);
+BOOL32      WINAPI SetDoubleClickTime32(UINT32);
+#define     SetDoubleClickTime WINELIB_NAME(SetDoubleClickTime)
+UINT16      WINAPI SetErrorMode16(UINT16);
+UINT32      WINAPI SetErrorMode32(UINT32);
+#define     SetErrorMode WINELIB_NAME(SetErrorMode)
+BOOL16      WINAPI SetFileAttributes16(LPCSTR,DWORD);
+BOOL32      WINAPI SetFileAttributes32A(LPCSTR,DWORD);
+BOOL32      WINAPI SetFileAttributes32W(LPCWSTR,DWORD);
+#define     SetFileAttributes WINELIB_NAME_AW(SetFileAttributes)
+HWND16      WINAPI SetFocus16(HWND16);
+HWND32      WINAPI SetFocus32(HWND32);
+#define     SetFocus WINELIB_NAME(SetFocus)
+UINT16      WINAPI SetHandleCount16(UINT16);
+UINT32      WINAPI SetHandleCount32(UINT32);
+#define     SetHandleCount WINELIB_NAME(SetHandleCount)
+void        WINAPI SetInternalWindowPos16(HWND16,UINT16,LPRECT16,LPPOINT16);
+void        WINAPI SetInternalWindowPos32(HWND32,UINT32,LPRECT32,LPPOINT32);
+#define     SetInternalWindowPos WINELIB_NAME(SetInternalWindowPos)
+INT16       WINAPI SetMapMode16(HDC16,INT16);
+INT32       WINAPI SetMapMode32(HDC32,INT32);
+#define     SetMapMode WINELIB_NAME(SetMapMode)
+DWORD       WINAPI SetMapperFlags16(HDC16,DWORD);
+DWORD       WINAPI SetMapperFlags32(HDC32,DWORD);
+#define     SetMapperFlags WINELIB_NAME(SetMapperFlags)
+BOOL16      WINAPI SetMenu16(HWND16,HMENU16);
+BOOL32      WINAPI SetMenu32(HWND32,HMENU32);
+#define     SetMenu WINELIB_NAME(SetMenu)
+BOOL16      WINAPI SetMenuItemBitmaps16(HMENU16,UINT16,UINT16,HBITMAP16,HBITMAP16);
+BOOL32      WINAPI SetMenuItemBitmaps32(HMENU32,UINT32,UINT32,HBITMAP32,HBITMAP32);
+#define     SetMenuItemBitmaps WINELIB_NAME(SetMenuItemBitmaps)
+BOOL16      WINAPI SetMessageQueue16(INT16);
+BOOL32      WINAPI SetMessageQueue32(INT32);
+#define     SetMessageQueue WINELIB_NAME(SetMessageQueue)
+UINT16      WINAPI SetPaletteEntries16(HPALETTE16,UINT16,UINT16,LPPALETTEENTRY);
+UINT32      WINAPI SetPaletteEntries32(HPALETTE32,UINT32,UINT32,LPPALETTEENTRY);
+#define     SetPaletteEntries WINELIB_NAME(SetPaletteEntries)
+HWND16      WINAPI SetParent16(HWND16,HWND16);
+HWND32      WINAPI SetParent32(HWND32,HWND32);
+#define     SetParent WINELIB_NAME(SetParent)
+COLORREF    WINAPI SetPixel16(HDC16,INT16,INT16,COLORREF);
+COLORREF    WINAPI SetPixel32(HDC32,INT32,INT32,COLORREF);
+#define     SetPixel WINELIB_NAME(SetPixel)
+INT16       WINAPI SetPolyFillMode16(HDC16,INT16);
+INT32       WINAPI SetPolyFillMode32(HDC32,INT32);
+#define     SetPolyFillMode WINELIB_NAME(SetPolyFillMode)
+BOOL16      WINAPI SetProp16(HWND16,LPCSTR,HANDLE16);
+BOOL32      WINAPI SetProp32A(HWND32,LPCSTR,HANDLE32);
+BOOL32      WINAPI SetProp32W(HWND32,LPCWSTR,HANDLE32);
+#define     SetProp WINELIB_NAME_AW(SetProp)
+void        WINAPI SetRect16(LPRECT16,INT16,INT16,INT16,INT16);
+void        WINAPI SetRect32(LPRECT32,INT32,INT32,INT32,INT32);
+#define     SetRect WINELIB_NAME(SetRect)
+void        WINAPI SetRectEmpty16(LPRECT16);
+void        WINAPI SetRectEmpty32(LPRECT32);
+#define     SetRectEmpty WINELIB_NAME(SetRectEmpty)
+VOID        WINAPI SetRectRgn16(HRGN16,INT16,INT16,INT16,INT16);
+VOID        WINAPI SetRectRgn32(HRGN32,INT32,INT32,INT32,INT32);
+#define     SetRectRgn WINELIB_NAME(SetRectRgn)
+INT16       WINAPI SetRelAbs16(HDC16,INT16);
+INT32       WINAPI SetRelAbs32(HDC32,INT32);
+#define     SetRelAbs WINELIB_NAME(SetRelAbs)
+INT16       WINAPI SetROP216(HDC16,INT16);
+INT32       WINAPI SetROP232(HDC32,INT32);
+#define     SetROP2 WINELIB_NAME(SetROP2)
+INT16       WINAPI SetScrollInfo16(HWND16,INT16,const SCROLLINFO*,BOOL16);
+INT32       WINAPI SetScrollInfo32(HWND32,INT32,const SCROLLINFO*,BOOL32);
+#define     SetScrollInfo WINELIB_NAME(SetScrollInfo)
+INT16       WINAPI SetScrollPos16(HWND16,INT16,INT16,BOOL16);
+INT32       WINAPI SetScrollPos32(HWND32,INT32,INT32,BOOL32);
+#define     SetScrollPos WINELIB_NAME(SetScrollPos)
+void        WINAPI SetScrollRange16(HWND16,INT16,INT16,INT16,BOOL16);
+BOOL32      WINAPI SetScrollRange32(HWND32,INT32,INT32,INT32,BOOL32);
+#define     SetScrollRange WINELIB_NAME(SetScrollRange)
+INT16       WINAPI SetSoundNoise16(INT16,INT16);
+DWORD       WINAPI SetSoundNoise32(DWORD,DWORD);
+#define     SetSoundNoise WINELIB_NAME(SetSoundNoise)
+INT16       WINAPI SetStretchBltMode16(HDC16,INT16);
+INT32       WINAPI SetStretchBltMode32(HDC32,INT32);
+#define     SetStretchBltMode WINELIB_NAME(SetStretchBltMode)
+VOID        WINAPI SetSysColors16(INT16,const INT16*,const COLORREF*);
+BOOL32      WINAPI SetSysColors32(INT32,const INT32*,const COLORREF*);
+#define     SetSysColors WINELIB_NAME(SetSysColors)
+HWND16      WINAPI SetSysModalWindow16(HWND16);
+#define     SetSysModalWindow32(hwnd) ((HWND32)0)
+#define     SetSysModalWindow WINELIB_NAME(SetSysModalWindow)
+BOOL16      WINAPI SetSystemMenu16(HWND16,HMENU16);
+BOOL32      WINAPI SetSystemMenu32(HWND32,HMENU32);
+#define     SetSystemMenu WINELIB_NAME(SetSystemMenu)
+UINT16      WINAPI SetSystemPaletteUse16(HDC16,UINT16);
+UINT32      WINAPI SetSystemPaletteUse32(HDC32,UINT32);
+#define     SetSystemPaletteUse WINELIB_NAME(SetSystemPaletteUse)
+UINT16      WINAPI SetSystemTimer16(HWND16,UINT16,UINT16,TIMERPROC16);
+UINT32      WINAPI SetSystemTimer32(HWND32,UINT32,UINT32,TIMERPROC32);
+#define     SetSystemTimer WINELIB_NAME(SetSystemTimer)
+UINT16      WINAPI SetTextAlign16(HDC16,UINT16);
+UINT32      WINAPI SetTextAlign32(HDC32,UINT32);
+#define     SetTextAlign WINELIB_NAME(SetTextAlign)
+INT16       WINAPI SetTextCharacterExtra16(HDC16,INT16);
+INT32       WINAPI SetTextCharacterExtra32(HDC32,INT32);
+#define     SetTextCharacterExtra WINELIB_NAME(SetTextCharacterExtra)
+COLORREF    WINAPI SetTextColor16(HDC16,COLORREF);
+COLORREF    WINAPI SetTextColor32(HDC32,COLORREF);
+#define     SetTextColor WINELIB_NAME(SetTextColor)
+INT16       WINAPI SetTextJustification16(HDC16,INT16,INT16);
+BOOL32      WINAPI SetTextJustification32(HDC32,INT32,INT32);
+#define     SetTextJustification WINELIB_NAME(SetTextJustification)
+UINT16      WINAPI SetTimer16(HWND16,UINT16,UINT16,TIMERPROC16);
+UINT32      WINAPI SetTimer32(HWND32,UINT32,UINT32,TIMERPROC32);
+#define     SetTimer WINELIB_NAME(SetTimer)
+BOOL16      WINAPI SetViewportExtEx16(HDC16,INT16,INT16,LPSIZE16);
+BOOL32      WINAPI SetViewportExtEx32(HDC32,INT32,INT32,LPSIZE32);
+#define     SetViewportExtEx WINELIB_NAME(SetViewportExtEx)
+BOOL16      WINAPI SetViewportOrgEx16(HDC16,INT16,INT16,LPPOINT16);
+BOOL32      WINAPI SetViewportOrgEx32(HDC32,INT32,INT32,LPPOINT32);
+#define     SetViewportOrgEx WINELIB_NAME(SetViewportOrgEx)
+INT16       WINAPI SetVoiceAccent16(INT16,INT16,INT16,INT16,INT16);
+DWORD       WINAPI SetVoiceAccent32(DWORD,DWORD,DWORD,DWORD,DWORD);
+#define     SetVoiceAccent WINELIB_NAME(SetVoiceAccent)
+INT16       WINAPI SetVoiceEnvelope16(INT16,INT16,INT16);
+DWORD       WINAPI SetVoiceEnvelope32(DWORD,DWORD,DWORD);
+#define     SetVoiceEnvelope WINELIB_NAME(SetVoiceEnvelope)
+INT16       WINAPI SetVoiceNote16(INT16,INT16,INT16,INT16);
+DWORD       WINAPI SetVoiceNote32(DWORD,DWORD,DWORD,DWORD);
+#define     SetVoiceNote WINELIB_NAME(SetVoiceNote)
+INT16       WINAPI SetVoiceQueueSize16(INT16,INT16);
+DWORD       WINAPI SetVoiceQueueSize32(DWORD,DWORD);
+#define     SetVoiceQueueSize WINELIB_NAME(SetVoiceQueueSize)
+INT16       WINAPI SetVoiceSound16(INT16,DWORD,INT16);
+DWORD       WINAPI SetVoiceSound32(DWORD,DWORD,DWORD);
+#define     SetVoiceSound WINELIB_NAME(SetVoiceSound)
+INT16       WINAPI SetVoiceThreshold16(INT16,INT16);
+DWORD       WINAPI SetVoiceThreshold32(DWORD,DWORD);
+#define     SetVoiceThreshold WINELIB_NAME(SetVoiceThreshold)
+BOOL16      WINAPI SetWindowExtEx16(HDC16,INT16,INT16,LPSIZE16);
+BOOL32      WINAPI SetWindowExtEx32(HDC32,INT32,INT32,LPSIZE32);
+#define     SetWindowExtEx WINELIB_NAME(SetWindowExtEx)
+LONG        WINAPI SetWindowLong16(HWND16,INT16,LONG);
+LONG        WINAPI SetWindowLong32A(HWND32,INT32,LONG);
+LONG        WINAPI SetWindowLong32W(HWND32,INT32,LONG);
+#define     SetWindowLong WINELIB_NAME_AW(SetWindowLong)
+BOOL16      WINAPI SetWindowOrgEx16(HDC16,INT16,INT16,LPPOINT16);
+BOOL32      WINAPI SetWindowOrgEx32(HDC32,INT32,INT32,LPPOINT32);
+#define     SetWindowOrgEx WINELIB_NAME(SetWindowOrgEx)
+BOOL16      WINAPI SetWindowPlacement16(HWND16,const WINDOWPLACEMENT16*);
+BOOL32      WINAPI SetWindowPlacement32(HWND32,const WINDOWPLACEMENT32*);
+#define     SetWindowPlacement WINELIB_NAME(SetWindowPlacement)
+FARPROC16   WINAPI SetWindowsHook16(INT16,HOOKPROC16);
+HHOOK       WINAPI SetWindowsHook32A(INT32,HOOKPROC32);
+HHOOK       WINAPI SetWindowsHook32W(INT32,HOOKPROC32);
+#define     SetWindowsHook WINELIB_NAME_AW(SetWindowsHook)
+HHOOK       WINAPI SetWindowsHookEx16(INT16,HOOKPROC16,HINSTANCE16,HTASK16);
+HHOOK       WINAPI SetWindowsHookEx32A(INT32,HOOKPROC32,HINSTANCE32,DWORD);
+HHOOK       WINAPI SetWindowsHookEx32W(INT32,HOOKPROC32,HINSTANCE32,DWORD);
+#define     SetWindowsHookEx WINELIB_NAME_AW(SetWindowsHookEx)
+BOOL16      WINAPI SetWindowPos16(HWND16,HWND16,INT16,INT16,INT16,INT16,WORD);
+BOOL32      WINAPI SetWindowPos32(HWND32,HWND32,INT32,INT32,INT32,INT32,WORD);
+#define     SetWindowPos WINELIB_NAME(SetWindowPos)
+void        WINAPI SetWindowText16(HWND16,SEGPTR);
+void        WINAPI SetWindowText32A(HWND32,LPCSTR);
+void        WINAPI SetWindowText32W(HWND32,LPCWSTR);
+#define     SetWindowText WINELIB_NAME_AW(SetWindowText)
+WORD        WINAPI SetWindowWord16(HWND16,INT16,WORD);
+WORD        WINAPI SetWindowWord32(HWND32,INT32,WORD);
+#define     SetWindowWord WINELIB_NAME(SetWindowWord)
+BOOL16      WINAPI ShellAbout16(HWND16,LPCSTR,LPCSTR,HICON16);
+BOOL32      WINAPI ShellAbout32A(HWND32,LPCSTR,LPCSTR,HICON32);
+BOOL32      WINAPI ShellAbout32W(HWND32,LPCWSTR,LPCWSTR,HICON32);
+#define     ShellAbout WINELIB_NAME_AW(ShellAbout)
+HINSTANCE16 WINAPI ShellExecute16(HWND16,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT16);
+HINSTANCE32 WINAPI ShellExecute32A(HWND32,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT32);
+HINSTANCE32 WINAPI ShellExecute32W(HWND32,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,INT32);
+#define     ShellExecute WINELIB_NAME_AW(ShellExecute)
+VOID        WINAPI ShowCaret16(HWND16);
+BOOL32      WINAPI ShowCaret32(HWND32);
+#define     ShowCaret WINELIB_NAME(ShowCaret)
+INT16       WINAPI ShowCursor16(BOOL16);
+INT32       WINAPI ShowCursor32(BOOL32);
+#define     ShowCursor WINELIB_NAME(ShowCursor)
+void        WINAPI ShowScrollBar16(HWND16,INT16,BOOL16);
+BOOL32      WINAPI ShowScrollBar32(HWND32,INT32,BOOL32);
+#define     ShowScrollBar WINELIB_NAME(ShowScrollBar)
+VOID        WINAPI ShowOwnedPopups16(HWND16,BOOL16);
+BOOL32      WINAPI ShowOwnedPopups32(HWND32,BOOL32);
+#define     ShowOwnedPopups WINELIB_NAME(ShowOwnedPopups)
+BOOL16      WINAPI ShowWindow16(HWND16,INT16);
+BOOL32      WINAPI ShowWindow32(HWND32,INT32);
+#define     ShowWindow WINELIB_NAME(ShowWindow)
+DWORD       WINAPI SizeofResource16(HMODULE16,HRSRC16);
+DWORD       WINAPI SizeofResource32(HMODULE32,HRSRC32);
+#define     SizeofResource WINELIB_NAME(SizeofResource)
+INT16       WINAPI StartDoc16(HDC16,const DOCINFO16*);
+INT32       WINAPI StartDoc32A(HDC32,const DOCINFO32A*);
+INT32       WINAPI StartDoc32W(HDC32,const DOCINFO32W*);
+#define     StartDoc WINELIB_NAME_AW(StartDoc)
+INT16       WINAPI StartSound16(void);
+VOID        WINAPI StartSound32(void);
+#define     StartSound WINELIB_NAME(StartSound)
+INT16       WINAPI StopSound16(void);
+VOID        WINAPI StopSound32(void);
+#define     StopSound WINELIB_NAME(StopSound)
+BOOL16      WINAPI StretchBlt16(HDC16,INT16,INT16,INT16,INT16,HDC16,INT16,
+                                INT16,INT16,INT16,DWORD);
+BOOL32      WINAPI StretchBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,
+                                INT32,INT32,INT32,DWORD);
+#define     StretchBlt WINELIB_NAME(StretchBlt)
+INT16       WINAPI StretchDIBits16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,
+                       INT16,INT16,const VOID*,const BITMAPINFO*,UINT16,DWORD);
+INT32       WINAPI StretchDIBits32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,
+                       INT32,INT32,const VOID*,const BITMAPINFO*,UINT32,DWORD);
+#define     StretchDIBits WINELIB_NAME(StretchDIBits)
+BOOL16      WINAPI SubtractRect16(LPRECT16,const RECT16*,const RECT16*);
+BOOL32      WINAPI SubtractRect32(LPRECT32,const RECT32*,const RECT32*);
+#define     SubtractRect WINELIB_NAME(SubtractRect)
+BOOL16      WINAPI SwapMouseButton16(BOOL16);
+BOOL32      WINAPI SwapMouseButton32(BOOL32);
+#define     SwapMouseButton WINELIB_NAME(SwapMouseButton)
+VOID        WINAPI SwitchToThisWindow16(HWND16,BOOL16);
+VOID        WINAPI SwitchToThisWindow32(HWND32,BOOL32);
+#define     SwitchToThisWindow WINELIB_NAME(SwitchToThisWindow)
+INT16       WINAPI SyncAllVoices16(void);
+DWORD       WINAPI SyncAllVoices32(void);
+#define     SyncAllVoices WINELIB_NAME(SyncAllVoices)
+BOOL16      WINAPI SystemParametersInfo16(UINT16,UINT16,LPVOID,UINT16);
+BOOL32      WINAPI SystemParametersInfo32A(UINT32,UINT32,LPVOID,UINT32);
+BOOL32      WINAPI SystemParametersInfo32W(UINT32,UINT32,LPVOID,UINT32);
+#define     SystemParametersInfo WINELIB_NAME_AW(SystemParametersInfo)
+LONG        WINAPI TabbedTextOut16(HDC16,INT16,INT16,LPCSTR,INT16,INT16,const INT16*,INT16);
+LONG        WINAPI TabbedTextOut32A(HDC32,INT32,INT32,LPCSTR,INT32,INT32,const INT32*,INT32);
+LONG        WINAPI TabbedTextOut32W(HDC32,INT32,INT32,LPCWSTR,INT32,INT32,const INT32*,INT32);
+#define     TabbedTextOut WINELIB_NAME_AW(TabbedTextOut)
+BOOL16      WINAPI TextOut16(HDC16,INT16,INT16,LPCSTR,INT16);
+BOOL32      WINAPI TextOut32A(HDC32,INT32,INT32,LPCSTR,INT32);
+BOOL32      WINAPI TextOut32W(HDC32,INT32,INT32,LPCWSTR,INT32);
+#define     TextOut WINELIB_NAME_AW(TextOut)
+INT16       WINAPI ToAscii16(UINT16,UINT16,LPBYTE,LPVOID,UINT16);
+INT32       WINAPI ToAscii32(UINT32,UINT32,LPBYTE,LPWORD,UINT32);
+#define     ToAscii WINELIB_NAME(ToAscii)
+BOOL16      WINAPI TrackPopupMenu16(HMENU16,UINT16,INT16,INT16,INT16,HWND16,const RECT16*);
+BOOL32      WINAPI TrackPopupMenu32(HMENU32,UINT32,INT32,INT32,INT32,HWND32,const RECT32*);
+#define     TrackPopupMenu WINELIB_NAME(TrackPopupMenu)
+INT16       WINAPI TranslateAccelerator16(HWND16,HACCEL16,LPMSG16);
+INT32       WINAPI TranslateAccelerator32(HWND32,HACCEL32,LPMSG32);
+#define     TranslateAccelerator WINELIB_NAME(TranslateAccelerator)
+BOOL16      WINAPI TranslateMDISysAccel16(HWND16,LPMSG16);
+BOOL32      WINAPI TranslateMDISysAccel32(HWND32,LPMSG32);
+#define     TranslateMDISysAccel WINELIB_NAME(TranslateMDISysAccel)
+BOOL16      WINAPI TranslateMessage16(const MSG16*);
+BOOL32      WINAPI TranslateMessage32(const MSG32*);
+#define     TranslateMessage WINELIB_NAME(TranslateMessage)
+INT16       WINAPI TransmitCommChar16(INT16,CHAR);
+BOOL32      WINAPI TransmitCommChar32(INT32,CHAR);
+#define     TransmitCommChar WINELIB_NAME(TransmitCommChar)
+BOOL16      WINAPI UnhookWindowsHook16(INT16,HOOKPROC16);
+BOOL32      WINAPI UnhookWindowsHook32(INT32,HOOKPROC32);
+#define     UnhookWindowsHook WINELIB_NAME(UnhookWindowsHook)
+BOOL16      WINAPI UnhookWindowsHookEx16(HHOOK);
+BOOL32      WINAPI UnhookWindowsHookEx32(HHOOK);
+#define     UnhookWindowsHookEx WINELIB_NAME(UnhookWindowsHookEx)
+BOOL16      WINAPI UnionRect16(LPRECT16,const RECT16*,const RECT16*);
+BOOL32      WINAPI UnionRect32(LPRECT32,const RECT32*,const RECT32*);
+#define     UnionRect WINELIB_NAME(UnionRect)
+void        WINAPI UnlockSegment16(HGLOBAL16);
+#define     UnlockSegment32(handle) GlobalUnfix((HANDLE32)(handle))
+#define     UnlockSegment WINELIB_NAME(UnlockSegment)
+BOOL16      WINAPI UnrealizeObject16(HGDIOBJ16);
+BOOL32      WINAPI UnrealizeObject32(HGDIOBJ32);
+#define     UnrealizeObject WINELIB_NAME(UnrealizeObject)
+BOOL16      WINAPI UnregisterClass16(SEGPTR,HINSTANCE16);
+BOOL32      WINAPI UnregisterClass32A(LPCSTR,HINSTANCE32);
+BOOL32      WINAPI UnregisterClass32W(LPCWSTR,HINSTANCE32);
+#define     UnregisterClass WINELIB_NAME_AW(UnregisterClass)
+INT16       WINAPI UpdateColors16(HDC16);
+BOOL32      WINAPI UpdateColors32(HDC32);
+#define     UpdateColors WINELIB_NAME(UpdateColors)
+VOID        WINAPI UpdateWindow16(HWND16);
+VOID        WINAPI UpdateWindow32(HWND32);
+#define     UpdateWindow WINELIB_NAME(UpdateWindow)
+VOID        WINAPI ValidateRect16(HWND16,const RECT16*);
+VOID        WINAPI ValidateRect32(HWND32,const RECT32*);
+#define     ValidateRect WINELIB_NAME(ValidateRect)
+VOID        WINAPI ValidateRgn16(HWND16,HRGN16);
+VOID        WINAPI ValidateRgn32(HWND32,HRGN32);
+#define     ValidateRgn WINELIB_NAME(ValidateRgn)
+DWORD       WINAPI VerFindFile16(UINT16,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT16*,LPSTR,UINT16*);
+DWORD       WINAPI VerFindFile32A(UINT32,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT32*,LPSTR,UINT32*);
+DWORD       WINAPI VerFindFile32W(UINT32,LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,UINT32*,LPWSTR,UINT32*);
+#define     VerFindFile WINELIB_NAME_AW(VerFindFile)
+DWORD       WINAPI VerInstallFile16(UINT16,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT16*);
+DWORD       WINAPI VerInstallFile32A(UINT32,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT32*);
+DWORD       WINAPI VerInstallFile32W(UINT32,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,UINT32*);
+#define     VerInstallFile WINELIB_NAME_AW(VerInstallFile)
+DWORD       WINAPI VerLanguageName16(UINT16,LPSTR,UINT16);
+DWORD       WINAPI VerLanguageName32A(UINT32,LPSTR,UINT32);
+DWORD       WINAPI VerLanguageName32W(UINT32,LPWSTR,UINT32);
+#define     VerLanguageName WINELIB_NAME_AW(VerLanguageName)
+DWORD       WINAPI VerQueryValue16(SEGPTR,LPCSTR,SEGPTR*,UINT16*);
+DWORD       WINAPI VerQueryValue32A(LPVOID,LPCSTR,LPVOID*,UINT32*);
+DWORD       WINAPI VerQueryValue32W(LPVOID,LPCWSTR,LPVOID*,UINT32*);
+#define     VerQueryValue WINELIB_NAME_AW(VerQueryValue)
+WORD        WINAPI VkKeyScan16(CHAR);
+WORD        WINAPI VkKeyScan32A(CHAR);
+WORD        WINAPI VkKeyScan32W(WCHAR);
+#define     VkKeyScan WINELIB_NAME_AW(VkKeyScan)
+INT16       WINAPI WaitSoundState16(INT16);
+DWORD       WINAPI WaitSoundState32(DWORD);
+#define     WaitSoundState WINELIB_NAME(WaitSoundState)
+HWND16      WINAPI WindowFromDC16(HDC16);
+HWND32      WINAPI WindowFromDC32(HDC32);
+#define     WindowFromDC WINELIB_NAME(WindowFromDC)
+HWND16      WINAPI WindowFromPoint16(POINT16);
+HWND32      WINAPI WindowFromPoint32(POINT32);
+#define     WindowFromPoint WINELIB_NAME(WindowFromPoint)
+BOOL16      WINAPI WritePrivateProfileString16(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
+BOOL32      WINAPI WritePrivateProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
+BOOL32      WINAPI WritePrivateProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);
+#define     WritePrivateProfileString WINELIB_NAME_AW(WritePrivateProfileString)
+BOOL16      WINAPI WriteProfileString16(LPCSTR,LPCSTR,LPCSTR);
+BOOL32      WINAPI WriteProfileString32A(LPCSTR,LPCSTR,LPCSTR);
+BOOL32      WINAPI WriteProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR);
+#define     WriteProfileString WINELIB_NAME_AW(WriteProfileString)
+SEGPTR      WINAPI lstrcat16(SEGPTR,LPCSTR);
+LPSTR       WINAPI lstrcat32A(LPSTR,LPCSTR);
+LPWSTR      WINAPI lstrcat32W(LPWSTR,LPCWSTR);
+#define     lstrcat WINELIB_NAME_AW(lstrcat)
+SEGPTR      WINAPI lstrcatn16(SEGPTR,LPCSTR,INT16);
+LPSTR       WINAPI lstrcatn32A(LPSTR,LPCSTR,INT32);
+LPWSTR      WINAPI lstrcatn32W(LPWSTR,LPCWSTR,INT32);
+#define     lstrcatn WINELIB_NAME_AW(lstrcatn)
+INT16       WINAPI lstrcmp16(LPCSTR,LPCSTR);
+INT32       WINAPI lstrcmp32A(LPCSTR,LPCSTR);
+INT32       WINAPI lstrcmp32W(LPCWSTR,LPCWSTR);
+#define     lstrcmp WINELIB_NAME_AW(lstrcmp)
+INT16       WINAPI lstrcmpi16(LPCSTR,LPCSTR);
+INT32       WINAPI lstrcmpi32A(LPCSTR,LPCSTR);
+INT32       WINAPI lstrcmpi32W(LPCWSTR,LPCWSTR);
+#define     lstrcmpi WINELIB_NAME_AW(lstrcmpi)
+SEGPTR      WINAPI lstrcpy16(SEGPTR,LPCSTR);
+LPSTR       WINAPI lstrcpy32A(LPSTR,LPCSTR);
+LPWSTR      WINAPI lstrcpy32W(LPWSTR,LPCWSTR);
+#define     lstrcpy WINELIB_NAME_AW(lstrcpy)
+SEGPTR      WINAPI lstrcpyn16(SEGPTR,LPCSTR,INT16);
+LPSTR       WINAPI lstrcpyn32A(LPSTR,LPCSTR,INT32);
+LPWSTR      WINAPI lstrcpyn32W(LPWSTR,LPCWSTR,INT32);
+#define     lstrcpyn WINELIB_NAME_AW(lstrcpyn)
+INT16       WINAPI lstrlen16(LPCSTR);
+INT32       WINAPI lstrlen32A(LPCSTR);
+INT32       WINAPI lstrlen32W(LPCWSTR);
+#define     lstrlen WINELIB_NAME_AW(lstrlen)
+HINSTANCE16 WINAPI WinExec16(LPCSTR,UINT16);
+HINSTANCE32 WINAPI WinExec32(LPCSTR,UINT32);
+#define     WinExec WINELIB_NAME(WinExec)
+BOOL16      WINAPI WinHelp16(HWND16,LPCSTR,UINT16,DWORD);
+BOOL32      WINAPI WinHelp32A(HWND32,LPCSTR,UINT32,DWORD);
+BOOL32      WINAPI WinHelp32W(HWND32,LPCWSTR,UINT32,DWORD);
+#define     WinHelp WINELIB_NAME_AW(WinHelp)
+INT16       WINAPIV wsnprintf16(LPSTR,UINT16,LPCSTR,...);
+INT32       WINAPIV wsnprintf32A(LPSTR,UINT32,LPCSTR,...);
+INT32       WINAPIV wsnprintf32W(LPWSTR,UINT32,LPCWSTR,...);
+#define     wsnprintf WINELIB_NAME_AW(wsnprintf)
+INT16       WINAPIV wsprintf16(LPSTR,LPCSTR,...);
+INT32       WINAPIV wsprintf32A(LPSTR,LPCSTR,...);
+INT32       WINAPIV wsprintf32W(LPWSTR,LPCWSTR,...);
+#define     wsprintf WINELIB_NAME_AW(wsprintf)
+INT16       WINAPI wvsnprintf16(LPSTR,UINT16,LPCSTR,LPCVOID);
+INT32       WINAPI wvsnprintf32A(LPSTR,UINT32,LPCSTR,LPCVOID);
+INT32       WINAPI wvsnprintf32W(LPWSTR,UINT32,LPCWSTR,LPCVOID);
+#define     wvsnprintf WINELIB_NAME_AW(wvsnprintf)
+INT16       WINAPI wvsprintf16(LPSTR,LPCSTR,LPCVOID);
+INT32       WINAPI wvsprintf32A(LPSTR,LPCSTR,LPCVOID);
+INT32       WINAPI wvsprintf32W(LPWSTR,LPCWSTR,LPCVOID);
+#define     wvsprintf WINELIB_NAME_AW(wvsprintf)
+LONG        WINAPI _hread16(HFILE16,LPVOID,LONG);
+LONG        WINAPI _hread32(HFILE32,LPVOID,LONG);
+#define     _hread WINELIB_NAME(_hread)
+LONG        WINAPI _hwrite16(HFILE16,LPCSTR,LONG);
+LONG        WINAPI _hwrite32(HFILE32,LPCSTR,LONG);
+#define     _hwrite WINELIB_NAME(_hwrite)
+HFILE16     WINAPI _lcreat16(LPCSTR,INT16);
+HFILE32     WINAPI _lcreat32(LPCSTR,INT32);
+#define     _lcreat WINELIB_NAME(_lcreat)
+HFILE16     WINAPI _lclose16(HFILE16);
+HFILE32     WINAPI _lclose32(HFILE32);
+#define     _lclose WINELIB_NAME(_lclose)
+LONG        WINAPI _llseek16(HFILE16,LONG,INT16);
+LONG        WINAPI _llseek32(HFILE32,LONG,INT32);
+#define     _llseek WINELIB_NAME(_llseek)
+HFILE16     WINAPI _lopen16(LPCSTR,INT16);
+HFILE32     WINAPI _lopen32(LPCSTR,INT32);
+#define     _lopen WINELIB_NAME(_lopen)
+UINT16      WINAPI _lread16(HFILE16,LPVOID,UINT16);
+UINT32      WINAPI _lread32(HFILE32,LPVOID,UINT32);
+#define     _lread WINELIB_NAME(_lread)
+UINT16      WINAPI _lwrite16(HFILE16,LPCSTR,UINT16);
+UINT32      WINAPI _lwrite32(HFILE32,LPCSTR,UINT32);
+#define     _lwrite WINELIB_NAME(_lwrite)
 
 /* Extra functions that don't exist in the Windows API */
 
-INT32      LoadMessage32A(HINSTANCE32,UINT32,WORD,LPSTR,INT32);
-INT32      LoadMessage32W(HINSTANCE32,UINT32,WORD,LPWSTR,INT32);
-SEGPTR     WIN16_GlobalLock16(HGLOBAL16);
-SEGPTR     WIN16_LockResource(HGLOBAL16);
-LONG       WIN16_hread(HFILE16,SEGPTR,LONG);
-INT32      lstrncmp32A(LPCSTR,LPCSTR,INT32);
-INT32      lstrncmp32W(LPCWSTR,LPCWSTR,INT32);
-INT32      lstrncmpi32A(LPCSTR,LPCSTR,INT32);
-INT32      lstrncmpi32W(LPCWSTR,LPCWSTR,INT32);
-LPWSTR     lstrcpyAtoW(LPWSTR,LPCSTR);
-LPSTR      lstrcpyWtoA(LPSTR,LPCWSTR);
-LPWSTR     lstrcpynAtoW(LPWSTR,LPCSTR,INT32);
-LPSTR      lstrcpynWtoA(LPSTR,LPCWSTR,INT32);
+INT32       WINAPI LoadMessage32A(HINSTANCE32,UINT32,WORD,LPSTR,INT32);
+INT32       WINAPI LoadMessage32W(HINSTANCE32,UINT32,WORD,LPWSTR,INT32);
+SEGPTR      WINAPI WIN16_GlobalLock16(HGLOBAL16);
+SEGPTR      WINAPI WIN16_LockResource(HGLOBAL16);
+LONG        WINAPI WIN16_hread(HFILE16,SEGPTR,LONG);
+INT32       WINAPI lstrncmp32A(LPCSTR,LPCSTR,INT32);
+INT32       WINAPI lstrncmp32W(LPCWSTR,LPCWSTR,INT32);
+INT32       WINAPI lstrncmpi32A(LPCSTR,LPCSTR,INT32);
+INT32       WINAPI lstrncmpi32W(LPCWSTR,LPCWSTR,INT32);
+LPWSTR      WINAPI lstrcpyAtoW(LPWSTR,LPCSTR);
+LPSTR       WINAPI lstrcpyWtoA(LPSTR,LPCWSTR);
+LPWSTR      WINAPI lstrcpynAtoW(LPWSTR,LPCSTR,INT32);
+LPSTR       WINAPI lstrcpynWtoA(LPSTR,LPCWSTR,INT32);
 
 #ifdef __cplusplus
 }
diff --git a/include/winnls.h b/include/winnls.h
index 04c92d4..b0bb86b 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -118,4 +118,15 @@
 #define WC_SEPCHARS					0x00000020
 #define WC_DEFAULTCHAR				0x00000040
 
+#define MAKELCID(l, s)    (MAKELONG(l, s))
+#define MAKELANGID(p, s)  ((((WORD)(s))<<10) | (WORD)(p))
+
+#define SORT_DEFAULT      0
+#define SUBLANG_DEFAULT   1
+
+#define LANG_SYSTEM_DEFAULT   (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
+#define LANG_USER_DEFAULT     (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
+#define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))
+#define LOCALE_USER_DEFAULT   (MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT)) 
+
 #endif  /* __WINE_WINNLS_H */
diff --git a/include/winnt.h b/include/winnt.h
index 4bd7387..dc6b7cd 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -139,6 +139,32 @@
 
 #endif  /* __WINE__ */
 
+/* ifdef _x86_ ... */
+typedef struct _LDT_ENTRY {
+    WORD	LimitLow;
+    WORD	BaseLow;
+    union {
+	struct {
+	    BYTE	BaseMid;
+	    BYTE	Flags1;/*Declare as bytes to avoid alignment problems */
+	    BYTE	Flags2; 
+	    BYTE	BaseHi;
+	} Bytes;
+	struct {
+	    DWORD	BaseMid		: 8;
+	    DWORD	Type		: 5;
+	    DWORD	Dpl		: 2;
+	    DWORD	Pres		: 1;
+	    DWORD	LimitHi		: 4;
+	    DWORD	Sys		: 1;
+	    DWORD	Reserved_0	: 1;
+	    DWORD	Default_Big	: 1;
+	    DWORD	Granularity	: 1;
+	    DWORD	BaseHi		: 8;
+	} Bits;
+    } HighWord;
+} LDT_ENTRY, *LPLDT_ENTRY;
+
 /*
  * Exception codes
  */
@@ -255,9 +281,9 @@
 typedef LONG (*PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
 
-DWORD UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
+DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
 LPTOP_LEVEL_EXCEPTION_FILTER
-SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
+WINAPI SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
 
 /* Language IDs */
 
diff --git a/include/winsock.h b/include/winsock.h
index ed813b7..cfd1ce5 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -21,6 +21,7 @@
 /* Win16 socket-related types */
 
 typedef UINT16		SOCKET16;
+typedef UINT32		SOCKET32;
 
 typedef struct ws_hostent
 {
@@ -64,7 +65,9 @@
 
 /* ws_fd_set operations */
 
-INT16   __WSAFDIsSet( SOCKET16, ws_fd_set * );
+INT16 WINAPI __WSAFDIsSet16( SOCKET16, ws_fd_set * );
+INT32 WINAPI __WSAFDIsSet32( SOCKET32, ws_fd_set * );
+#define __WSAFDIsSet WINELIB_NAME(__WSAFDIsSet);
 
 #define WS_FD_CLR(fd, set) do { \
     UINT16 __i; \
@@ -141,8 +144,12 @@
  * This is used instead of -1, since the
  * SOCKET type is unsigned.
  */
-#define INVALID_SOCKET  (SOCKET16)(~0)
-#define SOCKET_ERROR              (-1)
+#define INVALID_SOCKET16 	   (~0)
+#define INVALID_SOCKET32 	   (~0)
+#define SOCKET_ERROR               (-1)
+
+DECL_WINELIB_TYPE(INVALID_SOCKET);
+DECL_WINELIB_TYPE(SOCKET);
 
 /*
  * Types
@@ -221,16 +228,17 @@
 /*
  * Define flags to be used with the WSAAsyncSelect() call.
  */
-#define WS_FD_READ         0x01
-#define WS_FD_WRITE        0x02
-#define WS_FD_OOB          0x04
-#define WS_FD_ACCEPT       0x08
-#define WS_FD_CONNECT      0x10
-#define WS_FD_CLOSE        0x20
+#define WS_FD_READ         0x0001
+#define WS_FD_WRITE        0x0002
+#define WS_FD_OOB          0x0004
+#define WS_FD_ACCEPT       0x0008
+#define WS_FD_CONNECT      0x0010
+#define WS_FD_CLOSE        0x0020
 
 #define WS_FD_NONBLOCK	   0x10000000	/* internal per-socket flags */
 #define WS_FD_INACTIVE	   0x20000000
 #define WS_FD_CONNECTED	   0x40000000
+#define WS_FD_RAW	   0x80000000
 #define WS_FD_INTERNAL	   0xFFFF0000
 
 /*
@@ -332,35 +340,43 @@
 
 /* Microsoft Windows Extension function prototypes */
 
-INT16 	  WSAStartup(UINT16 wVersionRequired, LPWSADATA lpWSAData);
-INT16 	  WSACleanup(void);
-void 	  WSASetLastError(INT16 iError);
-INT16 	  WSAGetLastError(void);
-BOOL16 	  WSAIsBlocking(void);
-INT16 	  WSAUnhookBlockingHook(void);
-FARPROC16 WSASetBlockingHook(FARPROC16 lpBlockFunc);
-INT16 	  WSACancelBlockingCall(void);
-HANDLE16  WSAAsyncGetServByName(HWND16 hWnd, UINT16 wMsg,
-                                LPCSTR name, LPCSTR proto,
-                                SEGPTR buf, INT16 buflen);
+INT16     WINAPI WSAStartup16(UINT16 wVersionRequired, LPWSADATA lpWSAData);
+INT32     WINAPI WSAStartup32(UINT32 wVersionRequired, LPWSADATA lpWSAData);
+#define   WSAStartup WINELIB_NAME(WSAStartup);
+void      WINAPI WSASetLastError16(INT16 iError);
+void      WINAPI WSASetLastError32(INT32 iError);
+#define   WSASetLastError WINELIB_NAME(WSASetLastError);
+INT32     WINAPI WSACleanup(void);
+INT32     WINAPI WSAGetLastError(void);
+BOOL32    WINAPI WSAIsBlocking(void);
+INT32     WINAPI WSACancelBlockingCall(void);
+INT16     WINAPI WSAUnhookBlockingHook16(void);
+INT32     WINAPI WSAUnhookBlockingHook32(void);
+#define   WSAUnhookBlockingHook WINELIB_NAME(WSAUnhookBlockingHook)
+FARPROC16 WINAPI WSASetBlockingHook16(FARPROC16 lpBlockFunc);
+FARPROC32 WINAPI WSASetBlockingHook32(FARPROC32 lpBlockFunc);
+#define   WSASetBlockingHook WINELIB_NAME(WSASetBlockingHook)
+HANDLE16  WINAPI WSAAsyncGetServByName(HWND16 hWnd, UINT16 wMsg,
+                                       LPCSTR name, LPCSTR proto,
+                                       SEGPTR buf, INT16 buflen);
 
-HANDLE16  WSAAsyncGetServByPort(HWND16 hWnd, UINT16 wMsg, INT16 port,
-                                LPCSTR proto, SEGPTR buf, INT16 buflen);
+HANDLE16  WINAPI WSAAsyncGetServByPort(HWND16 hWnd, UINT16 wMsg, INT16 port,
+                                       LPCSTR proto, SEGPTR buf, INT16 buflen);
 
-HANDLE16  WSAAsyncGetProtoByName(HWND16 hWnd, UINT16 wMsg,
-                                 LPCSTR name, SEGPTR buf, INT16 buflen);
+HANDLE16  WINAPI WSAAsyncGetProtoByName(HWND16 hWnd, UINT16 wMsg,
+                                        LPCSTR name, SEGPTR buf, INT16 buflen);
 
-HANDLE16  WSAAsyncGetProtoByNumber(HWND16 hWnd, UINT16 wMsg,
-                                   INT16 number, SEGPTR buf, INT16 buflen);
+HANDLE16  WINAPI WSAAsyncGetProtoByNumber(HWND16 hWnd, UINT16 wMsg,
+                                       INT16 number, SEGPTR buf, INT16 buflen);
 
-HANDLE16  WSAAsyncGetHostByName(HWND16 hWnd, UINT16 wMsg,
-                                LPCSTR name, SEGPTR buf, INT16 buflen);
+HANDLE16  WINAPI WSAAsyncGetHostByName(HWND16 hWnd, UINT16 wMsg,
+                                       LPCSTR name, SEGPTR buf, INT16 buflen);
 
-HANDLE16  WSAAsyncGetHostByAddr(HWND16 hWnd, UINT16 wMsg, LPCSTR addr, INT16 len,
-                                INT16 type, SEGPTR buf, INT16 buflen);
-
-INT16 	  WSACancelAsyncRequest(HANDLE16 hAsyncTaskHandle);
-INT16     WSAAsyncSelect(SOCKET16 s, HWND16 hWnd, UINT16 wMsg, UINT32 lEvent);
+HANDLE16  WINAPI WSAAsyncGetHostByAddr(HWND16 hWnd, UINT16 wMsg, LPCSTR addr,
+                              INT16 len, INT16 type, SEGPTR buf, INT16 buflen);
+INT16 	  WINAPI WSACancelAsyncRequest(HANDLE16 hAsyncTaskHandle);
+INT16     WINAPI WSAAsyncSelect(SOCKET16 s, HWND16 hWnd, UINT16 wMsg,
+                                UINT32 lEvent);
 
 #ifdef __cplusplus
 }
@@ -417,9 +433,13 @@
 
 /* ----------------------------------- internal structures */
 
-#define WS_DUP_NATIVE           0x0
-#define WS_DUP_OFFSET           0x2
-#define WS_DUP_SEGPTR           0x4
+/* ws_... struct conversion flags */
+
+#define WS_DUP_NATIVE           0x0001		/* native structure format (not ws_..) */
+#define WS_DUP_OFFSET           0x0002		/* internal pointers are offsets */
+#define WS_DUP_SEGPTR           0x0004		/* internal pointers are SEGPTRs */
+						/* by default, internal pointers are linear */
+/* async DNS op flags */
 
 #define AOP_IO                  0x0000001	/* aop_control paramaters */
 
@@ -437,80 +457,60 @@
 
   /* custom data */
 
-  HWND16        hWnd;
-  UINT16        uMsg;
+  HWND16        hWnd;				/* hWnd to post */ 
+  UINT16        uMsg;				/* uMsg message to. */
 
-  unsigned	flags;
-  SEGPTR	buffer_base;
-  int           buflen;
+  SEGPTR	buffer_base;			/* buffer to copy result to */
+  UINT16        buflen;
+  UINT16	flags;				/* WSMSG_ASYNC_... */
 } ws_async_op;
 
-#define WSMSG_ASYNC_SELECT      0x0000001
-#define WSMSG_ASYNC_HOSTBYNAME  0x0000010
-#define WSMSG_ASYNC_HOSTBYADDR  0x0000020
-#define WSMSG_ASYNC_PROTOBYNAME 0x0000100
-#define WSMSG_ASYNC_PROTOBYNUM  0x0000200
-#define WSMSG_ASYNC_SERVBYNAME  0x0001000
-#define WSMSG_ASYNC_SERVBYPORT  0x0002000
+#define WSMSG_ASYNC_HOSTBYNAME  0x0001
+#define WSMSG_ASYNC_HOSTBYADDR  0x0002
+#define WSMSG_ASYNC_PROTOBYNAME 0x0010
+#define WSMSG_ASYNC_PROTOBYNUM  0x0020
+#define WSMSG_ASYNC_SERVBYNAME  0x0100
+#define WSMSG_ASYNC_SERVBYPORT  0x0200
+#define WSMSG_DEAD_AOP		0x8000
 
-#define MTYPE_PARENT            0x50505357
-#define MTYPE_CLIENT            0x50435357
-
-#pragma pack(1)
-typedef struct
+typedef struct __sop	/* WSAAsyncSelect() control struct */
 {
-  long          mtype;          /* WSMSG_... */
+  struct __sop *next, *prev;
 
-  UINT32        lParam;		/* WS_FD_... event */
-  UINT16        wParam;         /* socket handle - used only for MTYPE_CLIENT messages */
-} ipc_packet;
+  struct __ws*  pws;
+  HWND16        hWnd;
+  UINT16        uMsg;
+} ws_select_op;
 
-#define MTYPE_PARENT_SIZE \
-        (sizeof(UINT32))
-#define MTYPE_CLIENT_SIZE \
-        (sizeof(ipc_packet) - sizeof(long))
-#pragma pack(4)
-
-typedef struct
+typedef struct	__ws	/* socket */
 {
-  int                   fd;
-  unsigned              flags;
-  ws_async_op*          p_aop;	/* AsyncSelect() handler */
+  int		fd;
+  unsigned	flags;
+  ws_select_op*	psop;
 } ws_socket;
 
-typedef struct
-{
-  ws_async_op*  ws_aop;         /* init'ed for getXbyY */
-  ws_socket*    ws_sock;        /* init'ed for AsyncSelect */
-  int           lEvent;
-  int           lLength;
-  char*		buffer;
-  char*		init;
-  ipc_packet    ip;
-} ws_async_ctl;
-
 #define WS_MAX_SOCKETS_PER_THREAD       16
 #define WS_MAX_UDP_DATAGRAM             1024
 
 #define WSI_BLOCKINGCALL	0x00000001	/* per-thread info flags */
+#define WSI_BLOCKINGHOOK32	0x00000002	/* 32-bit callback */
 
-typedef struct __WSINFO
+typedef struct _WSINFO
 {
-  struct __WSINFO*      prev,*next;
+  struct _WSINFO*       prev,*next;
 
   unsigned		flags;
-  int			err;
-  INT16			num_startup;
+  INT32			err;			/* WSAGetLastError() return value */
+  INT16			num_startup;		/* reference counter */
   INT16			num_async_rq;
-  INT16			last_free;
+  INT16			last_free;		/* entry in the socket table */
   UINT16		buflen;
   char*			buffer;			/* allocated from SEGPTR heap */
   char*			dbuffer;		/* buffer for dummies (32 bytes) */
 
   ws_socket		sock[WS_MAX_SOCKETS_PER_THREAD];
-  FARPROC16		blocking_hook;
-  HTASK16               tid;    		/* owning thread id - better switch
-                                 		 * to TLS when it gets fixed */
+  DWORD			blocking_hook;
+  HTASK16               tid;    		/* owning task id - process might be better */
 } WSINFO, *LPWSINFO;
 
 int WS_dup_he(LPWSINFO pwsi, struct hostent* p_he, int flag);
@@ -527,10 +527,12 @@
 int  WINSOCK_check_async_op(ws_async_op* p_aop);
 void WINSOCK_link_async_op(ws_async_op* p_aop);
 void WINSOCK_unlink_async_op(ws_async_op* p_aop);
-void WINSOCK_cancel_async_op(HTASK16 tid);
-void WINSOCK_do_async_select(void);
-void WINSOCK_Shutdown(void);
+int  WINSOCK_cancel_async_op(ws_async_op* p_aop);
 
+void WINSOCK_cancel_task_aops(HTASK16, void (*__memfree)(void*) );
+
+BOOL32 WINSOCK_HandleIO(int* fd_max, int num_pending, fd_set io_set[3] );
+void   WINSOCK_Shutdown(void);
 UINT16 wsaErrno(void);
 UINT16 wsaHerrno(void);
 
diff --git a/include/wintypes.h b/include/wintypes.h
index 05d3869..2626921 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -63,6 +63,40 @@
 # define DECL_WINELIB_TYPE_AW(type)  typedef WINELIB_NAME_AW(type) type
 #endif  /* __WINE__ */
 
+
+/* Calling conventions definitions */
+
+#ifdef not_used_yet
+
+#ifdef __i386__
+# if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)
+#  define __stdcall __attribute__((__stdcall__))
+#  define __cdecl   __attribute__((__cdecl__))
+# else
+#  error You need gcc >= 2.7 to build Wine on a 386
+# endif  /* __GNUC__ */
+#else  /* __i386__ */
+#  define __stdcall /* nothing */
+#  define __cdecl   /* nothing */
+#endif  /* __i386__ */
+
+#else  /* not_used_yet */
+
+# define __stdcall /* nothing */
+# define __cdecl   /* nothing */
+
+#endif  /* not_used_yet */
+
+#define CALLBACK    __stdcall
+#define WINAPI      __stdcall
+#define APIPRIVATE  __stdcall
+#define PASCAL      __stdcall
+#define _pascal     __stdcall
+#define __export    __stdcall
+#define WINAPIV     __cdecl
+#define APIENTRY    WINAPI
+
+
 /* Standard data types. These are the same for emulator and library. */
 
 typedef void            VOID;
@@ -165,46 +199,46 @@
 
 /* Callback function pointers types */
 
-typedef LRESULT (*DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
-typedef LRESULT (*DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
+typedef LRESULT (CALLBACK *DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
+typedef LRESULT (CALLBACK *DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
 DECL_WINELIB_TYPE(DLGPROC);
-typedef LRESULT (*DRIVERPROC16)(DWORD,HDRVR16,UINT16,LPARAM,LPARAM);
-typedef LRESULT (*DRIVERPROC32)(DWORD,HDRVR32,UINT32,LPARAM,LPARAM);
+typedef LRESULT (CALLBACK *DRIVERPROC16)(DWORD,HDRVR16,UINT16,LPARAM,LPARAM);
+typedef LRESULT (CALLBACK *DRIVERPROC32)(DWORD,HDRVR32,UINT32,LPARAM,LPARAM);
 DECL_WINELIB_TYPE(DRIVERPROC);
-typedef INT16   (*EDITWORDBREAKPROC16)(LPSTR,INT16,INT16,INT16);
-typedef INT32   (*EDITWORDBREAKPROC32A)(LPSTR,INT32,INT32,INT32);
-typedef INT32   (*EDITWORDBREAKPROC32W)(LPWSTR,INT32,INT32,INT32);
+typedef INT16   (CALLBACK *EDITWORDBREAKPROC16)(LPSTR,INT16,INT16,INT16);
+typedef INT32   (CALLBACK *EDITWORDBREAKPROC32A)(LPSTR,INT32,INT32,INT32);
+typedef INT32   (CALLBACK *EDITWORDBREAKPROC32W)(LPWSTR,INT32,INT32,INT32);
 DECL_WINELIB_TYPE_AW(EDITWORDBREAKPROC);
-typedef LRESULT (*FARPROC16)();
-typedef LRESULT (*FARPROC32)();
+typedef LRESULT (CALLBACK *FARPROC16)();
+typedef LRESULT (CALLBACK *FARPROC32)();
 DECL_WINELIB_TYPE(FARPROC);
-typedef INT16   (*GOBJENUMPROC16)(SEGPTR,LPARAM);
-typedef INT32   (*GOBJENUMPROC32)(LPVOID,LPARAM);
+typedef INT16   (CALLBACK *GOBJENUMPROC16)(SEGPTR,LPARAM);
+typedef INT32   (CALLBACK *GOBJENUMPROC32)(LPVOID,LPARAM);
 DECL_WINELIB_TYPE(GOBJENUMPROC);
-typedef BOOL16  (*GRAYSTRINGPROC16)(HDC16,LPARAM,INT16);
-typedef BOOL32  (*GRAYSTRINGPROC32)(HDC32,LPARAM,INT32);
+typedef BOOL16  (CALLBACK *GRAYSTRINGPROC16)(HDC16,LPARAM,INT16);
+typedef BOOL32  (CALLBACK *GRAYSTRINGPROC32)(HDC32,LPARAM,INT32);
 DECL_WINELIB_TYPE(GRAYSTRINGPROC);
-typedef LRESULT (*HOOKPROC16)(INT16,WPARAM16,LPARAM);
-typedef LRESULT (*HOOKPROC32)(INT32,WPARAM32,LPARAM);
+typedef LRESULT (CALLBACK *HOOKPROC16)(INT16,WPARAM16,LPARAM);
+typedef LRESULT (CALLBACK *HOOKPROC32)(INT32,WPARAM32,LPARAM);
 DECL_WINELIB_TYPE(HOOKPROC);
-typedef VOID    (*LINEDDAPROC16)(INT16,INT16,LPARAM);
-typedef VOID    (*LINEDDAPROC32)(INT32,INT32,LPARAM);
+typedef VOID    (CALLBACK *LINEDDAPROC16)(INT16,INT16,LPARAM);
+typedef VOID    (CALLBACK *LINEDDAPROC32)(INT32,INT32,LPARAM);
 DECL_WINELIB_TYPE(LINEDDAPROC);
-typedef BOOL16  (*PROPENUMPROC16)(HWND16,SEGPTR,HANDLE16);
-typedef BOOL32  (*PROPENUMPROC32A)(HWND32,LPCSTR,HANDLE32);
-typedef BOOL32  (*PROPENUMPROC32W)(HWND32,LPCWSTR,HANDLE32);
+typedef BOOL16  (CALLBACK *PROPENUMPROC16)(HWND16,SEGPTR,HANDLE16);
+typedef BOOL32  (CALLBACK *PROPENUMPROC32A)(HWND32,LPCSTR,HANDLE32);
+typedef BOOL32  (CALLBACK *PROPENUMPROC32W)(HWND32,LPCWSTR,HANDLE32);
 DECL_WINELIB_TYPE_AW(PROPENUMPROC);
-typedef BOOL32  (*PROPENUMPROCEX32A)(HWND32,LPCSTR,HANDLE32,LPARAM);
-typedef BOOL32  (*PROPENUMPROCEX32W)(HWND32,LPCWSTR,HANDLE32,LPARAM);
+typedef BOOL32  (CALLBACK *PROPENUMPROCEX32A)(HWND32,LPCSTR,HANDLE32,LPARAM);
+typedef BOOL32  (CALLBACK *PROPENUMPROCEX32W)(HWND32,LPCWSTR,HANDLE32,LPARAM);
 DECL_WINELIB_TYPE_AW(PROPENUMPROCEX);
-typedef VOID    (*TIMERPROC16)(HWND16,UINT16,UINT16,DWORD);
-typedef VOID    (*TIMERPROC32)(HWND32,UINT32,UINT32,DWORD);
+typedef VOID    (CALLBACK *TIMERPROC16)(HWND16,UINT16,UINT16,DWORD);
+typedef VOID    (CALLBACK *TIMERPROC32)(HWND32,UINT32,UINT32,DWORD);
 DECL_WINELIB_TYPE(TIMERPROC);
-typedef LRESULT (*WNDENUMPROC16)(HWND16,LPARAM);
-typedef LRESULT (*WNDENUMPROC32)(HWND32,LPARAM);
+typedef LRESULT (CALLBACK *WNDENUMPROC16)(HWND16,LPARAM);
+typedef LRESULT (CALLBACK *WNDENUMPROC32)(HWND32,LPARAM);
 DECL_WINELIB_TYPE(WNDENUMPROC);
-typedef LRESULT (*WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
-typedef LRESULT (*WNDPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
+typedef LRESULT (CALLBACK *WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
+typedef LRESULT (CALLBACK *WNDPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
 DECL_WINELIB_TYPE(WNDPROC);
 
 /* TCHAR data types definitions for Winelib. */
@@ -286,15 +320,10 @@
 /* Define some empty macros for compatibility with Windows code. */
 
 #ifndef __WINE__
-#define CALLBACK
 #define NEAR
 #define FAR
-#define PASCAL
-#define WINAPI
 #define _far
 #define _near
-#define _pascal
-#define __export
 #endif  /* __WINE__ */
 
 /* Macro for structure packing. */
diff --git a/include/x11font.h b/include/x11font.h
index c87064e..aed042c 100644
--- a/include/x11font.h
+++ b/include/x11font.h
@@ -55,9 +55,10 @@
 #define FI_VARIABLEPITCH    0x0040
 #define FI_FIXEDPITCH       0x0080
 
-#define FI_ENC_ISO8859	    0x0100
-#define FI_ENC_ISO646	    0x0200
-#define FI_ENC_ANSI	    0x0400
+#define FI_ENC_ISO8859	    0x0100	/* iso8859-* 	*/
+#define FI_ENC_ISO646	    0x0200	/* iso646* 	*/
+#define FI_ENC_ANSI	    0x0400	/* ansi-0 	*/
+#define FI_ENC_MSCODEPAGE   0x0800	/* cp125-* 	*/
 
 #define FI_FIXEDEX	    0x1000
 #define FI_NORMAL	    0x2000
diff --git a/library/miscstubs.c b/library/miscstubs.c
index 045f25a..c472441 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -17,34 +17,6 @@
 void CallFrom16_long_wwwll(void) {}
 void CallFrom32_stdcall_5(void) {}
 
-int CallTo32_LargeStack( int (*func)(), int nbargs, ...)
-{
-  va_list arglist;
-  int i,a[32];
-
-  va_start(arglist,nbargs);
-
-  for(i=0; i<nbargs; i++) a[i]=va_arg(arglist,int);
-
-  switch(nbargs) /* Ewww... Icky.  But what can I do? */
-  {
-  case 5: return func(a[0],a[1],a[2],a[3],a[4]);
-  case 6: return func(a[0],a[1],a[2],a[3],a[4],a[5]);
-  case 8: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
-  case 10: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],
-                a[7],a[8],a[9]);
-  case 11: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],
-                a[7],a[8],a[9],a[10]);
-  case 14: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],
-                a[7],a[8],a[9],a[10],a[11],a[12],a[13]);
-  case 16: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],
-                a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15]);
-  default: fprintf(stderr,"JBP: CallTo32_LargeStack called with unsupported "
-                          "number of arguments (%d).  Ignored.\n",nbargs);
-           return 0;
-  }
-}
-
 extern LRESULT ColorDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
 extern LRESULT FileOpenDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
 extern LRESULT FileSaveDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
diff --git a/library/winestub.c b/library/winestub.c
index d1c53e6..39946b3 100644
--- a/library/winestub.c
+++ b/library/winestub.c
@@ -4,16 +4,23 @@
 #include "windows.h"
 #include "xmalloc.h"
 
-extern int WinMain(HINSTANCE32,HINSTANCE32,LPSTR,int);
+extern int PASCAL WinMain(HINSTANCE32,HINSTANCE32,LPSTR,int);
 extern int MAIN_Init(void);
 extern BOOL32 MAIN_WineInit( int *argc, char *argv[] );
 extern void TASK_Reschedule(void);
 
+/* Most Windows C/C++ compilers use something like this to */
+/* access argc and argv globally: */
+int _ARGC;
+char **_ARGV;
+
 int main( int argc, char *argv [] )
 {
   HINSTANCE16 hInstance;
   LPSTR lpszCmdParam;
   int i, len = 0;
+  _ARGC = argc;
+  _ARGV = (char **)argv;
 
   MAIN_WineInit( &argc, argv );
 
@@ -35,51 +42,3 @@
 		  lpszCmdParam, /* lpszCmdParam */
 		  SW_NORMAL);   /* nCmdShow */
 }
-
-#if 0
-
-extern int WinMain(HINSTANCE32,HINSTANCE32,LPSTR,int);
-/* This is the renamed main() subroutine in misc/main.c. */
-/* Note that the libdll `init()' won't work: */
-extern HINSTANCE32 _wine_main(int, char *[]);
-
-int main (int argc, char *argv [])
-{
-  HINSTANCE32 hInstance;
-  char szCmdParam[256] = {0};
-  int index, buffer_pos;
-  char *arg_holder;
-  /* "Wired-in" command-line options for Wine: */
-  /*char *wine_argv[] = {argv[0], "-managed", "-dll", "+commdlg",
-  			"-dll", "+shell", ""};*/
-  char *wine_argv[] = {argv[0], ""};
-
-  /* Initialize the library dll: */
-  hInstance = (HINSTANCE32)_wine_main((sizeof(wine_argv)/sizeof(char *))-1, wine_argv);
-
-#ifdef WIN_DEBUG
-  fprintf(stderr,"In winestub, reporting hInstance = %d\n", hInstance);
-#endif
-
-  /* Move things from argv to the szCmdParam that WinMain expects: */
-    for (index = 1, buffer_pos = 0;
-  	(index < argc) && (buffer_pos < 255);
-  	index++, buffer_pos++)
-  	{
-	for (arg_holder = argv[index]; ; buffer_pos++, arg_holder++)
-	 if ((szCmdParam[buffer_pos] = *arg_holder) == '\0') break;
-	szCmdParam[buffer_pos] = ' ';
-	};
-  szCmdParam[buffer_pos] = '\0';
-
-#ifdef WIN_DEBUG
-  fprintf(stderr,"In winestub, Program Name: %s, Parameters: %s\n",
-  	progname, szCmdParam);
-#endif
-
-  return WinMain (hInstance,		/* hInstance */
-		  0,			/* hPrevInstance */
-		  (LPSTR)szCmdParam,	/* lpszCmdParam */
-		  SW_NORMAL);		/* nCmdShow */
-}
-#endif
diff --git a/libtest/expand.c b/libtest/expand.c
index 656a3d6..cb2e31a 100644
--- a/libtest/expand.c
+++ b/libtest/expand.c
@@ -11,34 +11,29 @@
 {
   OFSTRUCT SourceOpenStruct1, SourceOpenStruct2;
   char OriginalName[256], WriteBuf[256];
-  char FAR *lpzDestFile,
-  			FAR *lpzHolder = lpCmdLine,
-  			FAR *arrgv[2] = {0};
-  int wargs;
+  char FAR *lpzDestFile;
   DWORD dwreturn;
   HFILE hSourceFile, hDestFile;
+  /* Most Windows compilers have something like this: */
+  extern int _ARGC;
+  extern char **_ARGV;
 
-  for (wargs = 1; wargs < 3; wargs++)
-  {arrgv[wargs] = lpzHolder;
-  for (; *lpzHolder != '\0'; lpzHolder++)
-	if (*lpzHolder == ' ') {*lpzHolder++ = '\0'; break;};
-	};
 
-MessageBox((HWND)NULL, (LPCSTR)arrgv[1], (LPCSTR)"arrgv[1]:", MB_OK);
-MessageBox((HWND)NULL, (LPCSTR)arrgv[2], (LPCSTR)"arrgv[2]:", MB_OK);
+MessageBox((HWND)NULL, (LPCSTR)_ARGV[1], (LPCSTR)"_ARGV[1]:", MB_OK);
+MessageBox((HWND)NULL, (LPCSTR)_ARGV[2], (LPCSTR)"_ARGV[2]:", MB_OK);
 
-  hSourceFile = LZOpenFile(arrgv[1], (LPOFSTRUCT) &SourceOpenStruct1,
+  hSourceFile = LZOpenFile(_ARGV[1], (LPOFSTRUCT) &SourceOpenStruct1,
 			OF_READ);
 
 wsprintf(WriteBuf, "Source File Handle: %d\nNo. of args: %d",
-	   hSourceFile, wargs);
+	   hSourceFile, _ARGC);
 MessageBox((HWND)NULL, (LPCSTR)WriteBuf, (LPCSTR)NULL, MB_OK);
 
-  if ((wargs == 3) && (arrgv[2] != NULL)) lpzDestFile = arrgv[2];
+  if ((_ARGC == 3) && (_ARGV[2] != NULL)) lpzDestFile = _ARGV[2];
   else
   {
   lpzDestFile = OriginalName;
-  GetExpandedName(arrgv[1], lpzDestFile);
+  GetExpandedName(_ARGV[1], lpzDestFile);
   };
 
  MessageBox((HWND)NULL, (LPCSTR)lpzDestFile, (LPCSTR)"Destination File",
@@ -47,7 +42,7 @@
   hDestFile = LZOpenFile(lpzDestFile, (LPOFSTRUCT) &SourceOpenStruct2,
 			OF_CREATE | OF_WRITE);
 wsprintf(WriteBuf, "Destination File Handle: %d\nNo. of args: %d",
-	   hDestFile, wargs-1);
+	   hDestFile, _ARGC-1);
 MessageBox((HWND)NULL, (LPCSTR)WriteBuf, (LPCSTR)NULL, MB_OK);
 
   dwreturn = LZCopy(hSourceFile, hDestFile);
@@ -68,7 +63,7 @@
   	MessageBox((HWND)NULL,  (LPCSTR)"LZERROR_WRITE\n", (LPCSTR)NULL, MB_OK);
   if ((long)dwreturn > 0L)
    {wsprintf((LPSTR)WriteBuf, (LPCSTR)"Successful decompression from %s to %s\n",
-    			   arrgv[1], lpzDestFile);
+    			   _ARGV[1], lpzDestFile);
 	MessageBox((HWND)NULL, (LPSTR)WriteBuf, (LPCSTR)NULL, MB_OK);
 	};
   LZClose(hSourceFile); LZClose(hDestFile);
diff --git a/loader/main.c b/loader/main.c
index 4ac8026..b3e4f8b 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -54,6 +54,7 @@
  */
 int MAIN_Init(void)
 {
+    extern BOOL32 EVENT_Init(void);
     extern BOOL32 RELAY_Init(void);
     extern BOOL32 WIN16DRV_Init(void);
     extern BOOL32 VIRTUAL_Init(void);
@@ -77,6 +78,9 @@
       /* Initialize signal handling */
     if (!SIGNAL_Init()) return 0;
 
+      /* Initialize event handling */
+    if (!EVENT_Init()) return 0;
+
 #ifdef WINELIB
     /* Create USER and GDI heap */
     USER_HeapSel = GlobalAlloc16( GMEM_FIXED, 0x10000 );
diff --git a/loader/module.c b/loader/module.c
index bd12830..a41ce37 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -265,7 +265,7 @@
  *           MODULE_AllocateSegment (WPROCS.26)
  */
 
-DWORD MODULE_AllocateSegment(WORD wFlags, WORD wSize, WORD wElem)
+DWORD WINAPI MODULE_AllocateSegment(WORD wFlags, WORD wSize, WORD wElem)
 {
     WORD size = wSize << wElem;
     HANDLE16 hMem = GlobalAlloc16( MODULE_Ne2MemFlags(wFlags), size);
@@ -478,6 +478,10 @@
     if (ne_header.ne_magic == IMAGE_NT_SIGNATURE) return (HMODULE16)21;  /* win32 exe */
     if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return (HMODULE16)11;  /* invalid exe */
 
+    if (ne_header.ne_magic == IMAGE_OS2_SIGNATURE_LX) {
+      fprintf(stderr, "Sorry, this is an OS/2 linear executable (LX) file !\n");
+      return (HMODULE16)11;
+    }
     /* We now have a valid NE header */
 
     size = sizeof(NE_MODULE) +
@@ -805,6 +809,15 @@
 
 
 /***********************************************************************
+ *           EntryAddrProc   (WPROCS.27)
+ */
+FARPROC16 WINAPI EntryAddrProc( HMODULE16 hModule, WORD ordinal )
+{
+    return MODULE_GetEntryPoint( hModule, ordinal );
+}
+
+
+/***********************************************************************
  *           MODULE_SetEntryPoint
  *
  * Change the value of an entry point. Use with caution!
@@ -1286,7 +1299,7 @@
 /**********************************************************************
  *	    FreeModule16    (KERNEL.46)
  */
-BOOL16 FreeModule16( HMODULE16 hModule )
+BOOL16 WINAPI FreeModule16( HMODULE16 hModule )
 {
     NE_MODULE *pModule;
 
@@ -1303,13 +1316,13 @@
 /**********************************************************************
  *	    GetModuleHandle16    (KERNEL.47)
  */
-HMODULE16 WIN16_GetModuleHandle( SEGPTR name )
+HMODULE16 WINAPI WIN16_GetModuleHandle( SEGPTR name )
 {
     if (HIWORD(name) == 0) return GetExePtr( (HINSTANCE16)name );
     return MODULE_FindModule( PTR_SEG_TO_LIN(name) );
 }
 
-HMODULE16 GetModuleHandle16( LPCSTR name )
+HMODULE16 WINAPI GetModuleHandle16( LPCSTR name )
 {
     return MODULE_FindModule( name );
 }
@@ -1318,7 +1331,7 @@
 /**********************************************************************
  *	    GetModuleUsage    (KERNEL.48)
  */
-INT16 GetModuleUsage( HINSTANCE16 hModule )
+INT16 WINAPI GetModuleUsage( HINSTANCE16 hModule )
 {
     NE_MODULE *pModule;
 
@@ -1333,7 +1346,8 @@
 /**********************************************************************
  *	    GetModuleFileName16    (KERNEL.49)
  */
-INT16 GetModuleFileName16( HINSTANCE16 hModule, LPSTR lpFileName, INT16 nSize )
+INT16 WINAPI GetModuleFileName16( HINSTANCE16 hModule, LPSTR lpFileName,
+                                  INT16 nSize )
 {
     NE_MODULE *pModule;
 
@@ -1349,7 +1363,8 @@
 /***********************************************************************
  *              GetModuleFileName32A      (KERNEL32.235)
  */
-DWORD GetModuleFileName32A( HMODULE32 hModule, LPSTR lpFileName, DWORD size )
+DWORD WINAPI GetModuleFileName32A( HMODULE32 hModule, LPSTR lpFileName,
+                                   DWORD size )
 {                   
     NE_MODULE *pModule;
            
@@ -1369,7 +1384,8 @@
 /***********************************************************************
  *              GetModuleFileName32W      (KERNEL32.236)
  */
-DWORD GetModuleFileName32W( HMODULE32 hModule, LPWSTR lpFileName, DWORD size )
+DWORD WINAPI GetModuleFileName32W( HMODULE32 hModule, LPWSTR lpFileName,
+                                   DWORD size )
 {
     LPSTR fnA = (char*)HeapAlloc( GetProcessHeap(), 0, size );
     DWORD res = GetModuleFileName32A( hModule, fnA, size );
@@ -1382,7 +1398,7 @@
 /**********************************************************************
  *	    GetModuleName    (KERNEL.27)
  */
-BOOL16 GetModuleName( HINSTANCE16 hinst, LPSTR buf, INT16 nSize )
+BOOL16 WINAPI GetModuleName( HINSTANCE16 hinst, LPSTR buf, INT16 nSize )
 {
     LPSTR name = MODULE_GetModuleName(hinst);
 
@@ -1395,7 +1411,8 @@
 /***********************************************************************
  *           LoadLibraryEx32W   (KERNEL.513)
  */
-HINSTANCE16 LoadLibraryEx32W16( LPCSTR libname, HANDLE16 hf, DWORD flags )
+HINSTANCE16 WINAPI LoadLibraryEx32W16( LPCSTR libname, HANDLE16 hf,
+                                       DWORD flags )
 {
     fprintf(stderr,"LoadLibraryEx32W(%s,%d,%08lx)\n",libname,hf,flags);
     if (!flags && !hf)
@@ -1406,7 +1423,7 @@
 /***********************************************************************
  *           LoadLibrary   (KERNEL.95)
  */
-HINSTANCE16 LoadLibrary16( LPCSTR libname )
+HINSTANCE16 WINAPI LoadLibrary16( LPCSTR libname )
 {
     HINSTANCE16 handle;
 
@@ -1436,7 +1453,7 @@
 /***********************************************************************
  *           FreeLibrary16   (KERNEL.96)
  */
-void FreeLibrary16( HINSTANCE16 handle )
+void WINAPI FreeLibrary16( HINSTANCE16 handle )
 {
     dprintf_module( stddeb,"FreeLibrary: %04x\n", handle );
     FreeModule16( handle );
@@ -1446,7 +1463,7 @@
 /***********************************************************************
  *           WinExec16   (KERNEL.166)
  */
-HINSTANCE16 WinExec16( LPCSTR lpCmdLine, UINT16 nCmdShow )
+HINSTANCE16 WINAPI WinExec16( LPCSTR lpCmdLine, UINT16 nCmdShow )
 {
     return WinExec32( lpCmdLine, nCmdShow );
 }
@@ -1455,7 +1472,7 @@
 /***********************************************************************
  *           WinExec32   (KERNEL32.566)
  */
-HINSTANCE32 WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
+HINSTANCE32 WINAPI WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
 {
     LOADPARAMS params;
     HGLOBAL16 cmdShowHandle, cmdLineHandle;
@@ -1581,7 +1598,7 @@
 		    argptr = argv;
 		    if (iconic) *argptr++ = "-iconic";
 		    *argptr++ = unixfilename;
-		    p = cmdline;
+		    p = cmdline + 1;
 		    while (1)
 		    {
 			while (*p && (*p == ' ' || *p == '\t')) *p++ = '\0';
@@ -1628,7 +1645,7 @@
  *           WIN32_GetProcAddress16   (KERNEL32.36)
  * Get procaddress in 16bit module from win32... (kernel32 undoc. ordinal func)
  */
-FARPROC16 WIN32_GetProcAddress16( HMODULE16 hModule, LPSTR name )
+FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE16 hModule, LPSTR name )
 {
     WORD	ordinal;
     FARPROC16	ret;
@@ -1656,7 +1673,7 @@
 /***********************************************************************
  *           GetProcAddress16   (KERNEL.50)
  */
-FARPROC16 GetProcAddress16( HMODULE16 hModule, SEGPTR name )
+FARPROC16 WINAPI GetProcAddress16( HMODULE16 hModule, SEGPTR name )
 {
     WORD ordinal;
     FARPROC16 ret;
@@ -1688,7 +1705,7 @@
 /***********************************************************************
  *           GetProcAddress32   (KERNEL32.257)
  */
-FARPROC32 GetProcAddress32( HMODULE32 hModule, LPCSTR function )
+FARPROC32 WINAPI GetProcAddress32( HMODULE32 hModule, LPCSTR function )
 {
 #ifndef WINELIB
     NE_MODULE *pModule;
@@ -1713,8 +1730,7 @@
 /***********************************************************************
  *           RtlImageNtHeaders   (NTDLL)
  */
-LPIMAGE_NT_HEADERS
-RtlImageNtHeader(HMODULE32 hModule)
+LPIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE32 hModule)
 {
 #ifndef WINELIB
     NE_MODULE *pModule;
@@ -1734,7 +1750,7 @@
 /**********************************************************************
  *	    GetExpWinVer    (KERNEL.167)
  */
-WORD GetExpWinVer( HMODULE16 hModule )
+WORD WINAPI GetExpWinVer( HMODULE16 hModule )
 {
     NE_MODULE *pModule = MODULE_GetPtr( hModule );
     return pModule ? pModule->expected_version : 0;
@@ -1744,7 +1760,7 @@
 /**********************************************************************
  *	    IsSharedSelector    (KERNEL.345)
  */
-BOOL16 IsSharedSelector( HANDLE16 selector )
+BOOL16 WINAPI IsSharedSelector( HANDLE16 selector )
 {
     /* Check whether the selector belongs to a DLL */
     NE_MODULE *pModule = MODULE_GetPtr( GetExePtr( selector ));
@@ -1756,7 +1772,7 @@
 /**********************************************************************
  *	    ModuleFirst    (TOOLHELP.59)
  */
-BOOL16 ModuleFirst( MODULEENTRY *lpme )
+BOOL16 WINAPI ModuleFirst( MODULEENTRY *lpme )
 {
     lpme->wNext = hFirstModule;
     return ModuleNext( lpme );
@@ -1766,7 +1782,7 @@
 /**********************************************************************
  *	    ModuleNext    (TOOLHELP.60)
  */
-BOOL16 ModuleNext( MODULEENTRY *lpme )
+BOOL16 WINAPI ModuleNext( MODULEENTRY *lpme )
 {
     NE_MODULE *pModule;
 
@@ -1787,7 +1803,7 @@
 /**********************************************************************
  *	    ModuleFindName    (TOOLHELP.61)
  */
-BOOL16 ModuleFindName( MODULEENTRY *lpme, LPCSTR name )
+BOOL16 WINAPI ModuleFindName( MODULEENTRY *lpme, LPCSTR name )
 {
     lpme->wNext = GetModuleHandle16( name );
     return ModuleNext( lpme );
@@ -1797,7 +1813,7 @@
 /**********************************************************************
  *	    ModuleFindHandle    (TOOLHELP.62)
  */
-BOOL16 ModuleFindHandle( MODULEENTRY *lpme, HMODULE16 hModule )
+BOOL16 WINAPI ModuleFindHandle( MODULEENTRY *lpme, HMODULE16 hModule )
 {
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     lpme->wNext = hModule;
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 3536206..dd0ff09 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -550,7 +550,7 @@
  */
 
 /* It does nothing */
-void PatchCodeHandle(HANDLE16 hSel)
+void WINAPI PatchCodeHandle(HANDLE16 hSel)
 {
 }
 #endif /* WINELIB */
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 5f7660b..223348b 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -27,6 +27,7 @@
 #include "global.h"
 #include "task.h"
 #include "ldt.h"
+#include "options.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "debugger.h"
@@ -189,6 +190,8 @@
 	Module = (char *) RVA(pe_imp->Name);
 	dprintf_win32 (stddeb, "%s\n", Module);
 
+	/* FIXME: forwarder entries ... */
+
 	if (pe_imp->u.OriginalFirstThunk != 0) { /* original MS style */
 	    dprintf_win32 (stddeb, "Microsoft style imports used\n");
 	    import_list =(LPIMAGE_THUNK_DATA) RVA(pe_imp->u.OriginalFirstThunk);
@@ -402,16 +405,14 @@
 		fprintf(stderr,")\n");
 		return;
 	}
-
 /* FIXME: this is a *horrible* hack to make COMDLG32.DLL load OK. The
-problem needs to be fixed properly at some stage */
-
+ * problem needs to be fixed properly at some stage 
+ */
 	if (pe->pe_header->OptionalHeader.NumberOfRvaAndSizes != 16) {
 		printf("Short PE Header!!!\n");
 		lseek( fd, -(16 - pe->pe_header->OptionalHeader.NumberOfRvaAndSizes) * sizeof(IMAGE_DATA_DIRECTORY), SEEK_CUR);
 	}
 
-/* horrible hack ends !!! */
 	/* read sections */
 	pe->pe_seg = xmalloc(sizeof(IMAGE_SECTION_HEADER) * 
 				   pe->pe_header->FileHeader.NumberOfSections);
@@ -423,19 +424,8 @@
 	pe->vma_size=0;
 	dprintf_win32(stddeb, "Load addr is %x\n",load_addr);
 	calc_vma_size(pe);
-
-#if 0
-	/* We use malloc here, while a huge part of that address space does
-	   not be supported by actual memory. It has to be contiguous, though.
-	   I don't know if mmap("/dev/null"); would do any better.
-	   What I'd really like to do is a Win32 style VirtualAlloc/MapViewOfFile
-	   sequence */
-	load_addr = pe->load_addr = (int)xmalloc(pe->vma_size);
-	memset( load_addr, 0, pe->vma_size);
-#else
 	load_addr = (int) VirtualAlloc( (void*)pe->base_addr, pe->vma_size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
         pe->load_addr = load_addr;
-#endif
 
 	dprintf_win32(stddeb, "Load addr is really %x, range %x\n",
 		pe->load_addr, pe->vma_size);
@@ -476,7 +466,6 @@
 
 		if(strcmp(pe->pe_seg[i].Name, ".reloc") == 0)
 			pe->pe_reloc = (LPIMAGE_BASE_RELOCATION) result;
-
 	}
 
 	/* There is word that the actual loader does not care about the
@@ -538,11 +527,9 @@
 		[IMAGE_DIRECTORY_ENTRY_GLOBALPTR].Size)
 		dprintf_win32(stdnimp,"Global Pointer (MIPS) ignored\n");
 
-#ifdef NOT	/* we initialize this later */
 	if(pe->pe_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_TLS].Size)
-		 dprintf_win32(stdnimp,"Thread local storage ignored\n");
-#endif
+		 fprintf(stdnimp,"Thread local storage ignored\n");
 
 	if(pe->pe_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].Size)
@@ -658,6 +645,16 @@
     if (!(pModule->flags & NE_FFLAGS_WIN32) || !(pe = pModule->pe_module))
         return;
 
+    load_addr = pe->load_addr;
+
+#ifndef WINELIB
+    if (Options.debug) {
+            DBG_ADDR addr = { NULL, 0, RVA(pe->pe_header->OptionalHeader.AddressOfEntryPoint) };
+            DEBUG_AddBreakpoint( &addr );
+	    DEBUG_SetBreakpoints(TRUE);
+    }
+#endif
+
     /*  DLL_ATTACH_PROCESS:
      *		lpreserved is NULL for dynamic loads, not-NULL for static loads
      *  DLL_DETACH_PROCESS:
@@ -669,7 +666,6 @@
     if (	(pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
 		(pe->pe_header->OptionalHeader.AddressOfEntryPoint)
     ) {
-        load_addr = pe->load_addr;
 	printf("InitPEDLL() called!\n");
 	CallDLLEntryProc32( 
 	    (FARPROC32)RVA(pe->pe_header->OptionalHeader.AddressOfEntryPoint),
diff --git a/loader/resource.c b/loader/resource.c
index 6e4ac03..31c6453 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -36,7 +36,7 @@
 /**********************************************************************
  *	    FindResource16    (KERNEL.60)
  */
-HRSRC16 FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
+HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
 {
     NE_MODULE *pModule;
 
@@ -70,7 +70,7 @@
 /**********************************************************************
  *	    FindResource32A    (KERNEL32.128)
  */
-HANDLE32 FindResource32A( HINSTANCE32 hModule, LPCSTR name, LPCSTR type )
+HANDLE32 WINAPI FindResource32A( HINSTANCE32 hModule, LPCSTR name, LPCSTR type)
 {
     return FindResourceEx32A(hModule,name,type,WINE_LanguageId);
 }
@@ -78,9 +78,9 @@
 /**********************************************************************
  *	    FindResourceEx32A    (KERNEL32.129)
  */
-HANDLE32 FindResourceEx32A(
-	HINSTANCE32 hModule,LPCSTR name,LPCSTR type,WORD lang
-) {
+HANDLE32 WINAPI FindResourceEx32A( HINSTANCE32 hModule, LPCSTR name,
+                                   LPCSTR type, WORD lang )
+{
     LPWSTR xname,xtype;
     HANDLE32 ret;
 
@@ -102,9 +102,9 @@
 /**********************************************************************
  *	    FindResourceEx32W    (KERNEL32.130)
  */
-HRSRC32 FindResourceEx32W(
-	HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type, WORD lang
-) {
+HRSRC32 WINAPI FindResourceEx32W( HINSTANCE32 hModule, LPCWSTR name,
+                                  LPCWSTR type, WORD lang )
+{
 #ifndef WINELIB
     NE_MODULE *pModule;
 
@@ -132,7 +132,7 @@
 /**********************************************************************
  *	    FindResource32W    (KERNEL32.131)
  */
-HRSRC32 FindResource32W( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type )
+HRSRC32 WINAPI FindResource32W(HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type)
 {
     return FindResourceEx32W(hModule,name,type,WINE_LanguageId);
 }
@@ -141,7 +141,7 @@
 /**********************************************************************
  *	    LoadResource16    (KERNEL.61)
  */
-HGLOBAL16 LoadResource16( HMODULE16 hModule, HRSRC16 hRsrc )
+HGLOBAL16 WINAPI LoadResource16( HMODULE16 hModule, HRSRC16 hRsrc )
 {
     NE_MODULE *pModule;
 
@@ -165,7 +165,7 @@
 /**********************************************************************
  *	    LoadResource32    (KERNEL32.370)
  */
-HGLOBAL32 LoadResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
+HGLOBAL32 WINAPI LoadResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
 #ifndef WINELIB
     NE_MODULE *pModule;
@@ -193,7 +193,7 @@
  *	    LockResource    (KERNEL.62)
  */
 /* 16-bit version */
-SEGPTR WIN16_LockResource16(HGLOBAL16 handle)
+SEGPTR WINAPI WIN16_LockResource16(HGLOBAL16 handle)
 {
 #ifndef WINELIB
     HMODULE16 hModule;
@@ -215,7 +215,7 @@
 }
 
 /* WINELIB 16-bit version */
-LPVOID LockResource16( HGLOBAL16 handle )
+LPVOID WINAPI LockResource16( HGLOBAL16 handle )
 {
 #ifndef WINELIB
     HMODULE16 hModule;
@@ -240,7 +240,7 @@
 /**********************************************************************
  *	    LockResource32    (KERNEL32.384)
  */
-LPVOID LockResource32( HGLOBAL32 handle )
+LPVOID WINAPI LockResource32( HGLOBAL32 handle )
 {
     return (LPVOID)handle;
 }
@@ -249,7 +249,7 @@
 /**********************************************************************
  *	    FreeResource16    (KERNEL.63)
  */
-BOOL16 FreeResource16( HGLOBAL16 handle )
+BOOL16 WINAPI FreeResource16( HGLOBAL16 handle )
 {
 #ifndef WINELIB
     HMODULE16 hModule;
@@ -273,7 +273,7 @@
 /**********************************************************************
  *	    FreeResource32    (KERNEL32.145)
  */
-BOOL32 FreeResource32( HGLOBAL32 handle )
+BOOL32 WINAPI FreeResource32( HGLOBAL32 handle )
 {
     /* no longer used in Win32 */
     return TRUE;
@@ -283,7 +283,7 @@
 /**********************************************************************
  *	    AccessResource16    (KERNEL.64)
  */
-INT16 AccessResource16( HINSTANCE16 hModule, HRSRC16 hRsrc )
+INT16 WINAPI AccessResource16( HINSTANCE16 hModule, HRSRC16 hRsrc )
 {
     NE_MODULE *pModule;
 
@@ -308,7 +308,7 @@
 /**********************************************************************
  *	    AccessResource32    (KERNEL32.64)
  */
-INT32 AccessResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
+INT32 WINAPI AccessResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     dprintf_resource(stddeb, "AccessResource: module=%04x res=%04x\n",
@@ -322,7 +322,7 @@
 /**********************************************************************
  *	    SizeofResource16    (KERNEL.65)
  */
-DWORD SizeofResource16( HMODULE16 hModule, HRSRC16 hRsrc )
+DWORD WINAPI SizeofResource16( HMODULE16 hModule, HRSRC16 hRsrc )
 {
     NE_MODULE *pModule;
 
@@ -346,7 +346,7 @@
 /**********************************************************************
  *	    SizeofResource32    (KERNEL32.522)
  */
-DWORD SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
+DWORD WINAPI SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     dprintf_resource(stddeb, "SizeofResource32: module=%04x res=%04x\n",
@@ -363,7 +363,7 @@
 /**********************************************************************
  *	    AllocResource16    (KERNEL.66)
  */
-HGLOBAL16 AllocResource16( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size )
+HGLOBAL16 WINAPI AllocResource16( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size)
 {
     NE_MODULE *pModule;
 
@@ -389,7 +389,8 @@
  *
  * Check Schulman, p. 232 for details
  */
-HGLOBAL16 DirectResAlloc( HINSTANCE16 hInstance, WORD wType, UINT16 wSize )
+HGLOBAL16 WINAPI DirectResAlloc( HINSTANCE16 hInstance, WORD wType,
+                                 UINT16 wSize )
 {
     dprintf_resource(stddeb,"DirectResAlloc(%04x,%04x,%04x)\n",
                      hInstance, wType, wSize );
@@ -405,7 +406,7 @@
 /**********************************************************************
  *			LoadAccelerators16	[USER.177]
  */
-HACCEL16 LoadAccelerators16(HINSTANCE16 instance, SEGPTR lpTableName)
+HACCEL16 WINAPI LoadAccelerators16(HINSTANCE16 instance, SEGPTR lpTableName)
 {
     HACCEL16 	hAccel;
     HGLOBAL16 	rsc_mem;
@@ -458,7 +459,7 @@
  * 04:	WORD	IDval		
  * 06:	WORD	pad		(to DWORD boundary)
  */
-HACCEL32 LoadAccelerators32W(HINSTANCE32 instance,LPCWSTR lpTableName)
+HACCEL32 WINAPI LoadAccelerators32W(HINSTANCE32 instance,LPCWSTR lpTableName)
 {
     HACCEL32 	hAccel;
     HGLOBAL32 	rsc_mem;
@@ -504,7 +505,7 @@
     return hAccel;
 }
 
-HACCEL32 LoadAccelerators32A(HINSTANCE32 instance,LPCSTR lpTableName)
+HACCEL32 WINAPI LoadAccelerators32A(HINSTANCE32 instance,LPCSTR lpTableName)
 {
 	LPWSTR	 uni;
 	HACCEL32 result;
@@ -521,8 +522,8 @@
 /**********************************************************************
  *					LoadString16
  */
-INT16
-LoadString16(HINSTANCE16 instance,UINT16 resource_id,LPSTR buffer,INT16 buflen)
+INT16 WINAPI LoadString16( HINSTANCE16 instance, UINT16 resource_id,
+                           LPSTR buffer, INT16 buflen )
 {
     HGLOBAL16 hmem;
     HRSRC16 hrsrc;
@@ -568,8 +569,8 @@
 /**********************************************************************
  *	LoadString32W		(USER32.375)
  */
-INT32
-LoadString32W(HINSTANCE32 instance,UINT32 resource_id,LPWSTR buffer,int buflen)
+INT32 WINAPI LoadString32W( HINSTANCE32 instance, UINT32 resource_id,
+                            LPWSTR buffer, int buflen )
 {
     HGLOBAL32 hmem;
     HRSRC32 hrsrc;
@@ -618,8 +619,8 @@
 /**********************************************************************
  *	LoadString32A	(USER32.374)
  */
-INT32
-LoadString32A(HINSTANCE32 instance,UINT32 resource_id,LPSTR buffer,int buflen)
+INT32 WINAPI LoadString32A( HINSTANCE32 instance, UINT32 resource_id,
+                            LPSTR buffer,int buflen )
 {
     INT32 retval;
     LPWSTR buffer2 = NULL;
@@ -659,10 +660,9 @@
 /**********************************************************************
  *	LoadMessage32A		(internal)
  */
-INT32
-LoadMessage32A(
-	HINSTANCE32 instance,UINT32 id,WORD lang,LPSTR buffer,int buflen
-) {
+INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang,
+                      LPSTR buffer, int buflen )
+{
     HGLOBAL32	hmem;
     HRSRC32	hrsrc;
     BYTE	*p;
@@ -747,8 +747,8 @@
 /**********************************************************************
  *	SetResourceHandler	(KERNEL.43)
  */
-FARPROC16
-SetResourceHandler(HINSTANCE16 instance,SEGPTR s,FARPROC16 farproc)
+FARPROC16 WINAPI SetResourceHandler( HINSTANCE16 instance, SEGPTR s,
+                                     FARPROC16 farproc )
 {
     if (HIWORD(s))
 	fprintf(stderr,"SetResourceHandler(%04x,%s,%p), empty STUB!\n",
@@ -763,46 +763,54 @@
 /**********************************************************************
  *	EnumResourceTypesA	(KERNEL32.90)
  */
-BOOL32
-EnumResourceTypes32A(HMODULE32 hmodule,ENUMRESTYPEPROC32A lpfun,LONG lParam) {
+BOOL32 WINAPI EnumResourceTypes32A( HMODULE32 hmodule,ENUMRESTYPEPROC32A lpfun,
+                                    LONG lParam)
+{
     return PE_EnumResourceTypes32A(hmodule,lpfun,lParam);
 }
 
 /**********************************************************************
  *	EnumResourceTypesW	(KERNEL32.91)
  */
-BOOL32
-EnumResourceTypes32W(HMODULE32 hmodule,ENUMRESTYPEPROC32W lpfun,LONG lParam) {
+BOOL32 WINAPI EnumResourceTypes32W( HMODULE32 hmodule,ENUMRESTYPEPROC32W lpfun,
+                                    LONG lParam)
+{
     return PE_EnumResourceTypes32W(hmodule,lpfun,lParam);
 }
 
 /**********************************************************************
  *	EnumResourceNamesA	(KERNEL32.88)
  */
-BOOL32
-EnumResourceNames32A(HMODULE32 hmodule,LPCSTR type,ENUMRESNAMEPROC32A lpfun,LONG lParam) {
+BOOL32 WINAPI EnumResourceNames32A( HMODULE32 hmodule, LPCSTR type,
+                                    ENUMRESNAMEPROC32A lpfun, LONG lParam )
+{
     return PE_EnumResourceNames32A(hmodule,type,lpfun,lParam);
 }
 /**********************************************************************
  *	EnumResourceNamesW	(KERNEL32.89)
  */
-BOOL32
-EnumResourceNames32W(HMODULE32 hmodule,LPCWSTR type,ENUMRESNAMEPROC32W lpfun,LONG lParam) {
+BOOL32 WINAPI EnumResourceNames32W( HMODULE32 hmodule, LPCWSTR type,
+                                    ENUMRESNAMEPROC32W lpfun, LONG lParam )
+{
     return PE_EnumResourceNames32W(hmodule,type,lpfun,lParam);
 }
 
 /**********************************************************************
  *	EnumResourceLanguagesA	(KERNEL32.86)
  */
-BOOL32
-EnumResourceLanguages32A(HMODULE32 hmodule,LPCSTR type,LPCSTR name,ENUMRESLANGPROC32A lpfun,LONG lParam) {
+BOOL32 WINAPI EnumResourceLanguages32A( HMODULE32 hmodule, LPCSTR type,
+                                        LPCSTR name, ENUMRESLANGPROC32A lpfun,
+                                        LONG lParam)
+{
     return PE_EnumResourceLanguages32A(hmodule,type,name,lpfun,lParam);
 }
 /**********************************************************************
  *	EnumResourceLanguagesW	(KERNEL32.87)
  */
-BOOL32
-EnumResourceLanguages32W(HMODULE32 hmodule,LPCWSTR type,LPCWSTR name,ENUMRESLANGPROC32W lpfun,LONG lParam) {
+BOOL32 WINAPI EnumResourceLanguages32W( HMODULE32 hmodule, LPCWSTR type,
+                                        LPCWSTR name, ENUMRESLANGPROC32W lpfun,
+                                        LONG lParam)
+{
     return PE_EnumResourceLanguages32W(hmodule,type,name,lpfun,lParam);
 }
 #endif  /* WINELIB */
diff --git a/loader/signal.c b/loader/signal.c
index 1257e33..d99dedc 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -46,12 +46,24 @@
 static __inline__ int wine_sigaction( int sig, struct kernel_sigaction *new,
                                       struct kernel_sigaction *old )
 {
+#ifdef __PIC__
+    __asm__ __volatile__( "pushl %%ebx\n\t"
+                          "movl %2,%%ebx\n\t"
+                          "int $0x80\n\t"
+                          "popl %%ebx"
+                          : "=a" (sig)
+                          : "0" (SYS_sigaction),
+                            "g" (sig),
+                            "c" (new),
+                            "d" (old) );
+#else
     __asm__ __volatile__( "int $0x80"
                           : "=a" (sig)
                           : "0" (SYS_sigaction),
                             "b" (sig),
                             "c" (new),
                             "d" (old) );
+#endif  /* __PIC__ */
     if (sig>=0)
         return 0;
     errno = -sig;
@@ -62,15 +74,7 @@
 
 /* Signal stack */
 
-#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
-# define SIGNAL_STACK_SIZE  MINSIGSTKSZ
-#elif defined (__svr4__) || defined(_SCO_DS)
-# define SIGNAL_STACK_SIZE  SIGSTKSZ
-#else
-# define SIGNAL_STACK_SIZE  4096
-#endif
-
-static char SIGNAL_Stack[SIGNAL_STACK_SIZE];
+static char SIGNAL_Stack[16384];
 
 
 /**********************************************************************
@@ -102,7 +106,8 @@
 
     struct kernel_sigaction sig_act;
     sig_act.sa_handler = func;
-    sig_act.sa_flags = SA_RESTART | (flags) ? SA_NOMASK : 0;
+    sig_act.sa_flags   = SA_RESTART | (flags) ? SA_NOMASK : 0;
+    sig_act.sa_mask    = 0;
     /* Point to the top of the stack, minus 4 just in case, and make
        it aligned  */
     sig_act.sa_restorer = 
@@ -112,10 +117,8 @@
 #else  /* linux && __i386__ */
 
     struct sigaction sig_act;
-    sigset_t sig_mask;
-    sigemptyset(&sig_mask);
     sig_act.sa_handler = func;
-    sig_act.sa_mask = sig_mask;
+    sigemptyset( &sig_act.sa_mask );
 
 # if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     sig_act.sa_flags = SA_ONSTACK;
@@ -179,7 +182,6 @@
 #ifdef SIGIO
   sigaddset(&set, SIGIO);
 #endif
-  sigaddset(&set, SIGUSR1);
 #ifdef CONFIG_IPC
   sigaddset(&set, SIGUSR2);
 #endif
diff --git a/loader/task.c b/loader/task.c
index 4094ee9..467548c 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -40,8 +40,9 @@
   /* Min. number of thunks allocated when creating a new segment */
 #define MIN_THUNKS  32
 
-extern void USER_AppExit( HTASK16, HINSTANCE16, HQUEUE16 );
-extern void PE_InitTls( PE_MODULE *module );
+extern INT32 WINSOCK_DeleteTaskWSI( TDB* pTask, struct _WSINFO* pwsi );
+extern void  USER_AppExit( HTASK16, HINSTANCE16, HQUEUE16 );
+extern void  PE_InitTls( PE_MODULE *module );
 
   /* Saved 16-bit stack for current process (Win16 only) */
 DWORD IF1632_Saved16_ss_sp = 0;
@@ -50,7 +51,10 @@
 DWORD IF1632_Saved32_esp = 0;
 
   /* Original Unix stack */
-DWORD IF1632_Original32_esp;
+DWORD IF1632_Original32_esp = 0;
+
+  /* Pointer to function to switch to a larger stack */
+int (*IF1632_CallLargeStack)( int (*func)(), void *arg ) = NULL;
 
 static HTASK16 hFirstTask = 0;
 static HTASK16 hCurrentTask = 0;
@@ -685,6 +689,16 @@
     TDB* pTask = (TDB*) GlobalLock16( hCurrentTask );
     if (!pTask) USER_ExitWindows();  /* No current task yet */
 
+    dprintf_task(stddeb, "Killing task %04x\n", hCurrentTask );
+
+    /* Clean up sockets */
+
+    if( pTask->pwsi ) 
+    {
+	dprintf_task(stddeb, "\tremoving socket table\n");
+	WINSOCK_DeleteTaskWSI( pTask, pTask->pwsi );
+    }
+
     /* Perform USER cleanup */
 
     USER_AppExit( hCurrentTask, pTask->hInstance, pTask->hQueue );
@@ -698,7 +712,7 @@
 
     if (nTaskCount <= 1)
     {
-        dprintf_task( stddeb, "Killing the last task, exiting\n" );
+        dprintf_task( stddeb, "\nthis is the last task, exiting\n" );
         USER_ExitWindows();
     }
 
@@ -767,7 +781,7 @@
 
     /* extract hardware events only! */
 
-    if (!hTask) EVENT_WaitXEvent( FALSE, TRUE );
+    if (!hTask) EVENT_WaitNetEvent( FALSE, TRUE );
 
     while (!hTask)
     {
@@ -788,7 +802,7 @@
 
         /* No task found, wait for some events to come in */
 
-        EVENT_WaitXEvent( TRUE, TRUE );
+        EVENT_WaitNetEvent( TRUE, TRUE );
     }
 
     if (hTask == hCurrentTask) 
@@ -845,7 +859,7 @@
 	    !(pQ->wakeBits & (QS_SENDMESSAGE | QS_SMRESULT)) )
     {
       pQ->flags &= ~QUEUE_FLAG_XEVENT;
-      EVENT_WaitXEvent( FALSE, FALSE );
+      EVENT_WaitNetEvent( FALSE, FALSE );
     }
   }
 }
@@ -854,7 +868,7 @@
 /***********************************************************************
  *           InitTask  (KERNEL.91)
  */
-void InitTask( CONTEXT *context )
+void WINAPI InitTask( CONTEXT *context )
 {
     TDB *pTask;
     NE_MODULE *pModule;
@@ -912,7 +926,7 @@
 /***********************************************************************
  *           WaitEvent  (KERNEL.30)
  */
-BOOL16 WaitEvent( HTASK16 hTask )
+BOOL16 WINAPI WaitEvent( HTASK16 hTask )
 {
     TDB *pTask;
 
@@ -935,7 +949,7 @@
 /***********************************************************************
  *           PostEvent  (KERNEL.31)
  */
-void PostEvent( HTASK16 hTask )
+void WINAPI PostEvent( HTASK16 hTask )
 {
     TDB *pTask;
 
@@ -948,7 +962,7 @@
 /***********************************************************************
  *           SetPriority  (KERNEL.32)
  */
-void SetPriority( HTASK16 hTask, INT16 delta )
+void WINAPI SetPriority( HTASK16 hTask, INT16 delta )
 {
     TDB *pTask;
     INT16 newpriority;
@@ -969,7 +983,7 @@
 /***********************************************************************
  *           LockCurrentTask  (KERNEL.33)
  */
-HTASK16 LockCurrentTask( BOOL16 bLock )
+HTASK16 WINAPI LockCurrentTask( BOOL16 bLock )
 {
     if (bLock) hLockedTask = hCurrentTask;
     else hLockedTask = 0;
@@ -980,7 +994,7 @@
 /***********************************************************************
  *           IsTaskLocked  (KERNEL.122)
  */
-HTASK16 IsTaskLocked(void)
+HTASK16 WINAPI IsTaskLocked(void)
 {
     return hLockedTask;
 }
@@ -989,7 +1003,7 @@
 /***********************************************************************
  *           OldYield  (KERNEL.117)
  */
-void OldYield(void)
+void WINAPI OldYield(void)
 {
     TDB *pCurTask;
 
@@ -1003,7 +1017,7 @@
 /***********************************************************************
  *           DirectedYield  (KERNEL.150)
  */
-void DirectedYield( HTASK16 hTask )
+void WINAPI DirectedYield( HTASK16 hTask )
 {
     TDB *pCurTask = (TDB *)GlobalLock16( hCurrentTask );
     pCurTask->hYieldTo = hTask;
@@ -1014,7 +1028,7 @@
 /***********************************************************************
  *           UserYield  (USER.332)
  */
-void UserYield(void)
+void WINAPI UserYield(void)
 {
     TDB *pCurTask = (TDB *)GlobalLock16( hCurrentTask );
     MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( pCurTask->hQueue );
@@ -1033,7 +1047,7 @@
 /***********************************************************************
  *           Yield  (KERNEL.29)
  */
-void Yield(void)
+void WINAPI Yield(void)
 {
     TDB *pCurTask = (TDB *)GlobalLock16( hCurrentTask );
     if (pCurTask) pCurTask->hYieldTo = 0;
@@ -1045,7 +1059,7 @@
 /***********************************************************************
  *           MakeProcInstance16  (KERNEL.51)
  */
-FARPROC16 MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance )
+FARPROC16 WINAPI MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance )
 {
     BYTE *thunk;
     SEGPTR thunkaddr;
@@ -1070,7 +1084,7 @@
 /***********************************************************************
  *           FreeProcInstance16  (KERNEL.52)
  */
-void FreeProcInstance16( FARPROC16 func )
+void WINAPI FreeProcInstance16( FARPROC16 func )
 {
     dprintf_task( stddeb, "FreeProcInstance(%08lx)\n", (DWORD)func );
     if (!__winelib) TASK_FreeThunk( hCurrentTask, (SEGPTR)func );
@@ -1080,7 +1094,7 @@
 /**********************************************************************
  *	    GetCodeHandle    (KERNEL.93)
  */
-HANDLE16 GetCodeHandle( FARPROC16 proc )
+HANDLE16 WINAPI GetCodeHandle( FARPROC16 proc )
 {
     HANDLE16 handle;
     BYTE *thunk = (BYTE *)PTR_SEG_TO_LIN( proc );
@@ -1103,7 +1117,7 @@
 /***********************************************************************
  *           SetTaskQueue  (KERNEL.34)
  */
-HQUEUE16 SetTaskQueue( HTASK16 hTask, HQUEUE16 hQueue )
+HQUEUE16 WINAPI SetTaskQueue( HTASK16 hTask, HQUEUE16 hQueue )
 {
     HQUEUE16 hPrev;
     TDB *pTask;
@@ -1123,7 +1137,7 @@
 /***********************************************************************
  *           GetTaskQueue  (KERNEL.35)
  */
-HQUEUE16 GetTaskQueue( HTASK16 hTask )
+HQUEUE16 WINAPI GetTaskQueue( HTASK16 hTask )
 {
     TDB *pTask;
 
@@ -1136,7 +1150,7 @@
 /***********************************************************************
  *           SwitchStackTo   (KERNEL.108)
  */
-void SwitchStackTo( WORD seg, WORD ptr, WORD top )
+void WINAPI SwitchStackTo( WORD seg, WORD ptr, WORD top )
 {
     TDB *pTask;
     STACK16FRAME *oldFrame, *newFrame;
@@ -1177,7 +1191,7 @@
  * to make sure all registers are preserved, but we don't use them in any
  * way, so we don't need a CONTEXT* argument.
  */
-void SwitchStackBack(void)
+void WINAPI SwitchStackBack(void)
 {
     TDB *pTask;
     STACK16FRAME *oldFrame, *newFrame;
@@ -1216,7 +1230,7 @@
 /***********************************************************************
  *           GetTaskQueueDS  (KERNEL.118)
  */
-void GetTaskQueueDS( CONTEXT *context )
+void WINAPI GetTaskQueueDS( CONTEXT *context )
 {
     DS_reg(context) = GlobalHandleToSel( GetTaskQueue(0) );
 }
@@ -1225,7 +1239,7 @@
 /***********************************************************************
  *           GetTaskQueueES  (KERNEL.119)
  */
-void GetTaskQueueES( CONTEXT *context )
+void WINAPI GetTaskQueueES( CONTEXT *context )
 {
     ES_reg(context) = GlobalHandleToSel( GetTaskQueue(0) );
 }
@@ -1234,12 +1248,12 @@
 /***********************************************************************
  *           GetCurrentTask   (KERNEL.36)
  */
-HTASK16 GetCurrentTask(void)
+HTASK16 WINAPI GetCurrentTask(void)
 {
     return hCurrentTask;
 }
 
-DWORD WIN16_GetCurrentTask(void)
+DWORD WINAPI WIN16_GetCurrentTask(void)
 {
     /* This is the version used by relay code; the first task is */
     /* returned in the high word of the result */
@@ -1250,7 +1264,7 @@
 /***********************************************************************
  *           GetCurrentPDB   (KERNEL.37)
  */
-HANDLE16 GetCurrentPDB(void)
+HANDLE16 WINAPI GetCurrentPDB(void)
 {
     TDB *pTask;
 
@@ -1262,7 +1276,7 @@
 /***********************************************************************
  *           GetInstanceData   (KERNEL.54)
  */
-INT16 GetInstanceData( HINSTANCE16 instance, WORD buffer, INT16 len )
+INT16 WINAPI GetInstanceData( HINSTANCE16 instance, WORD buffer, INT16 len )
 {
     char *ptr = (char *)GlobalLock16( instance );
     if (!ptr || !len) return 0;
@@ -1275,7 +1289,7 @@
 /***********************************************************************
  *           GetExeVersion   (KERNEL.105)
  */
-WORD GetExeVersion(void)
+WORD WINAPI GetExeVersion(void)
 {
     TDB *pTask;
 
@@ -1287,7 +1301,7 @@
 /***********************************************************************
  *           SetErrorMode16   (KERNEL.107)
  */
-UINT16 SetErrorMode16( UINT16 mode )
+UINT16 WINAPI SetErrorMode16( UINT16 mode )
 {
     TDB *pTask;
     UINT16 oldMode;
@@ -1303,7 +1317,7 @@
 /***********************************************************************
  *           SetErrorMode32   (KERNEL32.486)
  */
-UINT32 SetErrorMode32( UINT32 mode )
+UINT32 WINAPI SetErrorMode32( UINT32 mode )
 {
     return SetErrorMode16( (UINT16)mode );
 }
@@ -1312,7 +1326,7 @@
 /***********************************************************************
  *           GetDOSEnvironment   (KERNEL.131)
  */
-SEGPTR GetDOSEnvironment(void)
+SEGPTR WINAPI GetDOSEnvironment(void)
 {
     TDB *pTask;
 
@@ -1324,7 +1338,7 @@
 /***********************************************************************
  *           GetNumTasks   (KERNEL.152)
  */
-UINT16 GetNumTasks(void)
+UINT16 WINAPI GetNumTasks(void)
 {
     return nTaskCount;
 }
@@ -1336,7 +1350,7 @@
  * Note: this function apparently returns a DWORD with LOWORD == HIWORD.
  * I don't think we need to bother with this.
  */
-HINSTANCE16 GetTaskDS(void)
+HINSTANCE16 WINAPI GetTaskDS(void)
 {
     TDB *pTask;
 
@@ -1348,7 +1362,7 @@
 /***********************************************************************
  *           IsTask   (KERNEL.320)
  */
-BOOL16 IsTask( HTASK16 hTask )
+BOOL16 WINAPI IsTask( HTASK16 hTask )
 {
     TDB *pTask;
 
@@ -1361,7 +1375,7 @@
 /***********************************************************************
  *           SetTaskSignalProc   (KERNEL.38)
  */
-FARPROC16 SetTaskSignalProc( HTASK16 hTask, FARPROC16 proc )
+FARPROC16 WINAPI SetTaskSignalProc( HTASK16 hTask, FARPROC16 proc )
 {
     TDB *pTask;
     FARPROC16 oldProc;
@@ -1377,8 +1391,8 @@
 /***********************************************************************
  *           SetSigHandler   (KERNEL.140)
  */
-WORD SetSigHandler( FARPROC16 newhandler, FARPROC16* oldhandler,
-                    UINT16 *oldmode, UINT16 newmode, UINT16 flag )
+WORD WINAPI SetSigHandler( FARPROC16 newhandler, FARPROC16* oldhandler,
+                           UINT16 *oldmode, UINT16 newmode, UINT16 flag )
 {
     fprintf(stdnimp,"SetSigHandler(%p,%p,%p,%d,%d), unimplemented.\n",
             newhandler,oldhandler,oldmode,newmode,flag );
@@ -1402,7 +1416,7 @@
 /***********************************************************************
  *           GlobalNotify   (KERNEL.154)
  */
-VOID GlobalNotify( FARPROC16 proc )
+VOID WINAPI GlobalNotify( FARPROC16 proc )
 {
     TDB *pTask;
 
@@ -1414,7 +1428,7 @@
 /***********************************************************************
  *           GetExePtr   (KERNEL.133)
  */
-HMODULE16 GetExePtr( HANDLE16 handle )
+HMODULE16 WINAPI GetExePtr( HANDLE16 handle )
 {
     char *ptr;
     HTASK16 hTask;
@@ -1454,7 +1468,7 @@
 /***********************************************************************
  *           TaskFirst   (TOOLHELP.63)
  */
-BOOL16 TaskFirst( TASKENTRY *lpte )
+BOOL16 WINAPI TaskFirst( TASKENTRY *lpte )
 {
     lpte->hNext = hFirstTask;
     return TaskNext( lpte );
@@ -1464,7 +1478,7 @@
 /***********************************************************************
  *           TaskNext   (TOOLHELP.64)
  */
-BOOL16 TaskNext( TASKENTRY *lpte )
+BOOL16 WINAPI TaskNext( TASKENTRY *lpte )
 {
     TDB *pTask;
     INSTANCEDATA *pInstData;
@@ -1496,7 +1510,7 @@
 /***********************************************************************
  *           TaskFindHandle   (TOOLHELP.65)
  */
-BOOL16 TaskFindHandle( TASKENTRY *lpte, HTASK16 hTask )
+BOOL16 WINAPI TaskFindHandle( TASKENTRY *lpte, HTASK16 hTask )
 {
     lpte->hNext = hTask;
     return TaskNext( lpte );
@@ -1506,7 +1520,7 @@
 /***********************************************************************
  *           GetAppCompatFlags16   (KERNEL.354)
  */
-DWORD GetAppCompatFlags16( HTASK16 hTask )
+DWORD WINAPI GetAppCompatFlags16( HTASK16 hTask )
 {
     return GetAppCompatFlags32( hTask );
 }
@@ -1515,7 +1529,7 @@
 /***********************************************************************
  *           GetAppCompatFlags32   (USER32.205)
  */
-DWORD GetAppCompatFlags32( HTASK32 hTask )
+DWORD WINAPI GetAppCompatFlags32( HTASK32 hTask )
 {
     TDB *pTask;
 
diff --git a/memory/atom.c b/memory/atom.c
index 598c267..83d7a4c 100644
--- a/memory/atom.c
+++ b/memory/atom.c
@@ -263,7 +263,7 @@
 /***********************************************************************
  *           InitAtomTable16   (KERNEL.68)
  */
-WORD InitAtomTable16( WORD entries )
+WORD WINAPI InitAtomTable16( WORD entries )
 {
     return ATOM_InitTable( CURRENT_DS, entries );
 }
@@ -272,7 +272,7 @@
 /***********************************************************************
  *           GetAtomHandle   (KERNEL.73)
  */
-HANDLE16 GetAtomHandle( ATOM atom )
+HANDLE16 WINAPI GetAtomHandle( ATOM atom )
 {
     if (atom < MIN_STR_ATOM) return 0;
     return ATOMTOHANDLE( atom );
@@ -282,7 +282,7 @@
 /***********************************************************************
  *           AddAtom16   (KERNEL.70)
  */
-ATOM AddAtom16( SEGPTR str )
+ATOM WINAPI AddAtom16( SEGPTR str )
 {
     ATOM atom;
     HANDLE16 ds = CURRENT_DS;
@@ -304,7 +304,7 @@
 /***********************************************************************
  *           AddAtom32A   (KERNEL32.0)
  */
-ATOM AddAtom32A( LPCSTR str )
+ATOM WINAPI AddAtom32A( LPCSTR str )
 {
     return GlobalAddAtom32A( str );  /* FIXME */
 }
@@ -313,7 +313,7 @@
 /***********************************************************************
  *           AddAtom32W   (KERNEL32.1)
  */
-ATOM AddAtom32W( LPCWSTR str )
+ATOM WINAPI AddAtom32W( LPCWSTR str )
 {
     return GlobalAddAtom32W( str );  /* FIXME */
 }
@@ -322,7 +322,7 @@
 /***********************************************************************
  *           DeleteAtom16   (KERNEL.71)
  */
-ATOM DeleteAtom16( ATOM atom )
+ATOM WINAPI DeleteAtom16( ATOM atom )
 {
     return ATOM_DeleteAtom( CURRENT_DS, atom );
 }
@@ -331,7 +331,7 @@
 /***********************************************************************
  *           DeleteAtom32   (KERNEL32.69)
  */
-ATOM DeleteAtom32( ATOM atom )
+ATOM WINAPI DeleteAtom32( ATOM atom )
 {
     return GlobalDeleteAtom( atom );  /* FIXME */
 }
@@ -340,7 +340,7 @@
 /***********************************************************************
  *           FindAtom16   (KERNEL.69)
  */
-ATOM FindAtom16( SEGPTR str )
+ATOM WINAPI FindAtom16( SEGPTR str )
 {
     if (!HIWORD(str)) return (ATOM)LOWORD(str);  /* Integer atom */
     return ATOM_FindAtom( CURRENT_DS, (LPCSTR)PTR_SEG_TO_LIN(str) );
@@ -350,7 +350,7 @@
 /***********************************************************************
  *           FindAtom32A   (KERNEL32.117)
  */
-ATOM FindAtom32A( LPCSTR str )
+ATOM WINAPI FindAtom32A( LPCSTR str )
 {
     return GlobalFindAtom32A( str );  /* FIXME */
 }
@@ -359,7 +359,7 @@
 /***********************************************************************
  *           FindAtom32W   (KERNEL32.118)
  */
-ATOM FindAtom32W( LPCWSTR str )
+ATOM WINAPI FindAtom32W( LPCWSTR str )
 {
     return GlobalFindAtom32W( str );  /* FIXME */
 }
@@ -368,7 +368,7 @@
 /***********************************************************************
  *           GetAtomName16   (KERNEL.72)
  */
-UINT16 GetAtomName16( ATOM atom, LPSTR buffer, INT16 count )
+UINT16 WINAPI GetAtomName16( ATOM atom, LPSTR buffer, INT16 count )
 {
     return (UINT16)ATOM_GetAtomName( CURRENT_DS, atom, buffer, count );
 }
@@ -377,7 +377,7 @@
 /***********************************************************************
  *           GetAtomName32A   (KERNEL32.149)
  */
-UINT32 GetAtomName32A( ATOM atom, LPSTR buffer, INT32 count )
+UINT32 WINAPI GetAtomName32A( ATOM atom, LPSTR buffer, INT32 count )
 {
     return GlobalGetAtomName32A( atom, buffer, count );  /* FIXME */
 }
@@ -386,7 +386,7 @@
 /***********************************************************************
  *           GetAtomName32W   (KERNEL32.150)
  */
-UINT32 GetAtomName32W( ATOM atom, LPWSTR buffer, INT32 count )
+UINT32 WINAPI GetAtomName32W( ATOM atom, LPWSTR buffer, INT32 count )
 {
     return GlobalGetAtomName32W( atom, buffer, count );  /* FIXME */
 }
@@ -395,7 +395,7 @@
 /***********************************************************************
  *           GlobalAddAtom16   (USER.268)
  */
-ATOM GlobalAddAtom16( SEGPTR str )
+ATOM WINAPI GlobalAddAtom16( SEGPTR str )
 {
     if (!HIWORD(str)) return (ATOM)LOWORD(str);  /* Integer atom */
 #ifdef CONFIG_IPC
@@ -408,7 +408,7 @@
 /***********************************************************************
  *           GlobalAddAtom32A   (KERNEL32.313)
  */
-ATOM GlobalAddAtom32A( LPCSTR str )
+ATOM WINAPI GlobalAddAtom32A( LPCSTR str )
 {
     if (!HIWORD(str)) return (ATOM)LOWORD(str);  /* Integer atom */
     return ATOM_AddAtom( USER_HeapSel, str );
@@ -418,7 +418,7 @@
 /***********************************************************************
  *           GlobalAddAtom32W   (KERNEL32.314)
  */
-ATOM GlobalAddAtom32W( LPCWSTR str )
+ATOM WINAPI GlobalAddAtom32W( LPCWSTR str )
 {
     char buffer[MAX_ATOM_LEN+1];
     if (!HIWORD(str)) return (ATOM)LOWORD(str);  /* Integer atom */
@@ -430,7 +430,7 @@
 /***********************************************************************
  *           GlobalDeleteAtom   (USER.269) (KERNEL32.317)
  */
-ATOM GlobalDeleteAtom( ATOM atom )
+ATOM WINAPI GlobalDeleteAtom( ATOM atom )
 {
 #ifdef CONFIG_IPC
     if (Options.ipc) return DDE_GlobalDeleteAtom( atom );
@@ -442,7 +442,7 @@
 /***********************************************************************
  *           GlobalFindAtom16   (USER.270)
  */
-ATOM GlobalFindAtom16( SEGPTR str )
+ATOM WINAPI GlobalFindAtom16( SEGPTR str )
 {
     if (!HIWORD(str)) return (ATOM)LOWORD(str);  /* Integer atom */
 #ifdef CONFIG_IPC
@@ -455,7 +455,7 @@
 /***********************************************************************
  *           GlobalFindAtom32A   (KERNEL32.318)
  */
-ATOM GlobalFindAtom32A( LPCSTR str )
+ATOM WINAPI GlobalFindAtom32A( LPCSTR str )
 {
     if (!HIWORD(str)) return (ATOM)LOWORD(str);  /* Integer atom */
     return ATOM_FindAtom( USER_HeapSel, str );
@@ -465,7 +465,7 @@
 /***********************************************************************
  *           GlobalFindAtom32W   (KERNEL32.319)
  */
-ATOM GlobalFindAtom32W( LPCWSTR str )
+ATOM WINAPI GlobalFindAtom32W( LPCWSTR str )
 {
     char buffer[MAX_ATOM_LEN+1];
     if (!HIWORD(str)) return (ATOM)LOWORD(str);  /* Integer atom */
@@ -477,7 +477,7 @@
 /***********************************************************************
  *           GlobalGetAtomName16   (USER.271)
  */
-UINT16 GlobalGetAtomName16( ATOM atom, LPSTR buffer, INT16 count )
+UINT16 WINAPI GlobalGetAtomName16( ATOM atom, LPSTR buffer, INT16 count )
 {
 #ifdef CONFIG_IPC
     if (Options.ipc) return DDE_GlobalGetAtomName( atom, buffer, count );
@@ -489,7 +489,7 @@
 /***********************************************************************
  *           GlobalGetAtomName32A   (KERNEL32.323)
  */
-UINT32 GlobalGetAtomName32A( ATOM atom, LPSTR buffer, INT32 count )
+UINT32 WINAPI GlobalGetAtomName32A( ATOM atom, LPSTR buffer, INT32 count )
 {
     return ATOM_GetAtomName( USER_HeapSel, atom, buffer, count );
 }
@@ -497,7 +497,7 @@
 /***********************************************************************
  *           GlobalGetAtomName32W   (KERNEL32.324)
  */
-UINT32 GlobalGetAtomName32W( ATOM atom, LPWSTR buffer, INT32 count )
+UINT32 WINAPI GlobalGetAtomName32W( ATOM atom, LPWSTR buffer, INT32 count )
 {
     char tmp[MAX_ATOM_LEN+1];
     ATOM_GetAtomName( USER_HeapSel, atom, tmp, sizeof(tmp) );
diff --git a/memory/global.c b/memory/global.c
index 749d284..45088c2 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -269,7 +269,7 @@
 /***********************************************************************
  *           GlobalAlloc16   (KERNEL.15)
  */
-HGLOBAL16 GlobalAlloc16( UINT16 flags, DWORD size )
+HGLOBAL16 WINAPI GlobalAlloc16( UINT16 flags, DWORD size )
 {
     HANDLE16 owner = GetCurrentPDB();
 
@@ -282,7 +282,7 @@
 /***********************************************************************
  *           GlobalReAlloc16   (KERNEL.16)
  */
-HGLOBAL16 GlobalReAlloc16( HGLOBAL16 handle, DWORD size, UINT16 flags )
+HGLOBAL16 WINAPI GlobalReAlloc16( HGLOBAL16 handle, DWORD size, UINT16 flags )
 {
     WORD selcount;
     DWORD oldsize;
@@ -388,7 +388,7 @@
 /***********************************************************************
  *           GlobalFree16   (KERNEL.17)
  */
-HGLOBAL16 GlobalFree16( HGLOBAL16 handle )
+HGLOBAL16 WINAPI GlobalFree16( HGLOBAL16 handle )
 {
     void *ptr = GlobalLock16( handle );
 
@@ -407,7 +407,7 @@
  *
  * This is the GlobalLock16() function used by 16-bit code.
  */
-SEGPTR WIN16_GlobalLock16( HGLOBAL16 handle )
+SEGPTR WINAPI WIN16_GlobalLock16( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "WIN16_GlobalLock16(%04x) -> %08lx\n",
                     handle, MAKELONG( 0, GlobalHandleToSel(handle)) );
@@ -428,7 +428,7 @@
  *
  * This is the GlobalLock16() function used by 32-bit code.
  */
-LPVOID GlobalLock16( HGLOBAL16 handle )
+LPVOID WINAPI GlobalLock16( HGLOBAL16 handle )
 {
     if (!handle) return 0;
 #ifdef CONFIG_IPC
@@ -441,7 +441,7 @@
 /***********************************************************************
  *           GlobalUnlock16   (KERNEL.19)
  */
-BOOL16 GlobalUnlock16( HGLOBAL16 handle )
+BOOL16 WINAPI GlobalUnlock16( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalUnlock16: %04x\n", handle );
     return 0;
@@ -451,7 +451,7 @@
 /***********************************************************************
  *           GlobalSize16   (KERNEL.20)
  */
-DWORD GlobalSize16( HGLOBAL16 handle )
+DWORD WINAPI GlobalSize16( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalSize16: %04x\n", handle );
     if (!handle) return 0;
@@ -462,7 +462,7 @@
 /***********************************************************************
  *           GlobalHandle16   (KERNEL.21)
  */
-DWORD GlobalHandle16( WORD sel )
+DWORD WINAPI GlobalHandle16( WORD sel )
 {
     dprintf_global( stddeb, "GlobalHandle16: %04x\n", sel );
     return MAKELONG( GET_ARENA_PTR(sel)->handle, GlobalHandleToSel(sel) );
@@ -472,7 +472,7 @@
 /***********************************************************************
  *           GlobalFlags16   (KERNEL.22)
  */
-UINT16 GlobalFlags16( HGLOBAL16 handle )
+UINT16 WINAPI GlobalFlags16( HGLOBAL16 handle )
 {
     GLOBALARENA *pArena;
 
@@ -487,7 +487,7 @@
 /***********************************************************************
  *           LockSegment16   (KERNEL.23)
  */
-HGLOBAL16 LockSegment16( HGLOBAL16 handle )
+HGLOBAL16 WINAPI LockSegment16( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "LockSegment: %04x\n", handle );
     if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
@@ -499,7 +499,7 @@
 /***********************************************************************
  *           UnlockSegment16   (KERNEL.24)
  */
-void UnlockSegment16( HGLOBAL16 handle )
+void WINAPI UnlockSegment16( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "UnlockSegment: %04x\n", handle );
     if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
@@ -511,7 +511,7 @@
 /***********************************************************************
  *           GlobalCompact16   (KERNEL.25)
  */
-DWORD GlobalCompact16( DWORD desired )
+DWORD WINAPI GlobalCompact16( DWORD desired )
 {
     return GLOBAL_MAX_ALLOC_SIZE;
 }
@@ -520,7 +520,7 @@
 /***********************************************************************
  *           GlobalFreeAll   (KERNEL.26)
  */
-void GlobalFreeAll( HGLOBAL16 owner )
+void WINAPI GlobalFreeAll( HGLOBAL16 owner )
 {
     DWORD i;
     GLOBALARENA *pArena;
@@ -537,7 +537,7 @@
 /***********************************************************************
  *           GlobalWire16   (KERNEL.111)
  */
-SEGPTR GlobalWire16( HGLOBAL16 handle )
+SEGPTR WINAPI GlobalWire16( HGLOBAL16 handle )
 {
     return WIN16_GlobalLock16( handle );
 }
@@ -546,7 +546,7 @@
 /***********************************************************************
  *           GlobalUnWire16   (KERNEL.112)
  */
-BOOL16 GlobalUnWire16( HGLOBAL16 handle )
+BOOL16 WINAPI GlobalUnWire16( HGLOBAL16 handle )
 {
     return GlobalUnlock16( handle );
 }
@@ -555,7 +555,7 @@
 /***********************************************************************
  *           SetSwapAreaSize   (KERNEL.106)
  */
-LONG SetSwapAreaSize( WORD size )
+LONG WINAPI SetSwapAreaSize( WORD size )
 {
     dprintf_global(stdnimp, "STUB: SetSwapAreaSize(%d)\n", size );
     return MAKELONG( size, 0xffff );
@@ -565,7 +565,7 @@
 /***********************************************************************
  *           GlobalLRUOldest   (KERNEL.163)
  */
-HGLOBAL16 GlobalLRUOldest( HGLOBAL16 handle )
+HGLOBAL16 WINAPI GlobalLRUOldest( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalLRUOldest: %04x\n", handle );
     if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
@@ -576,7 +576,7 @@
 /***********************************************************************
  *           GlobalLRUNewest   (KERNEL.164)
  */
-HGLOBAL16 GlobalLRUNewest( HGLOBAL16 handle )
+HGLOBAL16 WINAPI GlobalLRUNewest( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalLRUNewest: %04x\n", handle );
     if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
@@ -587,7 +587,7 @@
 /***********************************************************************
  *           GetFreeSpace16   (KERNEL.169)
  */
-DWORD GetFreeSpace16( UINT16 wFlags )
+DWORD WINAPI GetFreeSpace16( UINT16 wFlags )
 {
     MEMORYSTATUS ms;
     GlobalMemoryStatus( &ms );
@@ -597,7 +597,7 @@
 /***********************************************************************
  *           GlobalDOSAlloc   (KERNEL.184)
  */
-DWORD GlobalDOSAlloc(DWORD size)
+DWORD WINAPI GlobalDOSAlloc(DWORD size)
 {
    UINT16    uParagraph;
    LPVOID    lpBlock = DOSMEM_GetBlock( size, &uParagraph );
@@ -617,7 +617,7 @@
 /***********************************************************************
  *           GlobalDOSFree      (KERNEL.185)
  */
-WORD GlobalDOSFree(WORD sel)
+WORD WINAPI GlobalDOSFree(WORD sel)
 {
    DWORD   block = GetSelectorBase(sel);
 
@@ -634,7 +634,7 @@
 /***********************************************************************
  *           GlobalPageLock   (KERNEL.191)
  */
-WORD GlobalPageLock( HGLOBAL16 handle )
+WORD WINAPI GlobalPageLock( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalPageLock: %04x\n", handle );
     return ++(GET_ARENA_PTR(handle)->pageLockCount);
@@ -644,7 +644,7 @@
 /***********************************************************************
  *           GlobalPageUnlock   (KERNEL.192)
  */
-WORD GlobalPageUnlock( HGLOBAL16 handle )
+WORD WINAPI GlobalPageUnlock( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalPageUnlock: %04x\n", handle );
     return --(GET_ARENA_PTR(handle)->pageLockCount);
@@ -654,7 +654,7 @@
 /***********************************************************************
  *           GlobalFix16   (KERNEL.197)
  */
-void GlobalFix16( HGLOBAL16 handle )
+void WINAPI GlobalFix16( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalFix16: %04x\n", handle );
     GET_ARENA_PTR(handle)->lockCount++;
@@ -664,7 +664,7 @@
 /***********************************************************************
  *           GlobalUnfix16   (KERNEL.198)
  */
-void GlobalUnfix16( HGLOBAL16 handle )
+void WINAPI GlobalUnfix16( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalUnfix16: %04x\n", handle );
     GET_ARENA_PTR(handle)->lockCount--;
@@ -674,7 +674,7 @@
 /***********************************************************************
  *           FarSetOwner   (KERNEL.403)
  */
-void FarSetOwner( HGLOBAL16 handle, HANDLE16 hOwner )
+void WINAPI FarSetOwner( HGLOBAL16 handle, HANDLE16 hOwner )
 {
     GET_ARENA_PTR(handle)->hOwner = hOwner;
 }
@@ -683,7 +683,7 @@
 /***********************************************************************
  *           FarGetOwner   (KERNEL.404)
  */
-HANDLE16 FarGetOwner( HGLOBAL16 handle )
+HANDLE16 WINAPI FarGetOwner( HGLOBAL16 handle )
 {
     return GET_ARENA_PTR(handle)->hOwner;
 }
@@ -692,7 +692,7 @@
 /***********************************************************************
  *           GlobalHandleToSel   (TOOLHELP.50)
  */
-WORD GlobalHandleToSel( HGLOBAL16 handle )
+WORD WINAPI GlobalHandleToSel( HGLOBAL16 handle )
 {
     dprintf_toolhelp( stddeb, "GlobalHandleToSel: %04x\n", handle );
     if (!handle) return 0;
@@ -711,7 +711,7 @@
 /***********************************************************************
  *           GlobalFirst   (TOOLHELP.51)
  */
-BOOL16 GlobalFirst( GLOBALENTRY *pGlobal, WORD wFlags )
+BOOL16 WINAPI GlobalFirst( GLOBALENTRY *pGlobal, WORD wFlags )
 {
     if (wFlags == GLOBAL_LRU) return FALSE;
     pGlobal->dwNext = 0;
@@ -722,7 +722,7 @@
 /***********************************************************************
  *           GlobalNext   (TOOLHELP.52)
  */
-BOOL16 GlobalNext( GLOBALENTRY *pGlobal, WORD wFlags)
+BOOL16 WINAPI GlobalNext( GLOBALENTRY *pGlobal, WORD wFlags)
 {
     GLOBALARENA *pArena;
 
@@ -755,7 +755,7 @@
 /***********************************************************************
  *           GlobalInfo   (TOOLHELP.53)
  */
-BOOL16 GlobalInfo( GLOBALINFO *pInfo )
+BOOL16 WINAPI GlobalInfo( GLOBALINFO *pInfo )
 {
     int i;
     GLOBALARENA *pArena;
@@ -772,7 +772,7 @@
 /***********************************************************************
  *           GlobalEntryHandle   (TOOLHELP.54)
  */
-BOOL16 GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem )
+BOOL16 WINAPI GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem )
 {
     return FALSE;
 }
@@ -781,7 +781,8 @@
 /***********************************************************************
  *           GlobalEntryModule   (TOOLHELP.55)
  */
-BOOL16 GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule, WORD wSeg )
+BOOL16 WINAPI GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule,
+                                 WORD wSeg )
 {
     return FALSE;
 }
@@ -790,7 +791,7 @@
 /***********************************************************************
  *           MemManInfo   (TOOLHELP.72)
  */
-BOOL16 MemManInfo( MEMMANINFO *info )
+BOOL16 WINAPI MemManInfo( MEMMANINFO *info )
 {
     MEMORYSTATUS status;
 
@@ -849,7 +850,7 @@
 /***********************************************************************
  *           GlobalAlloc32   (KERNEL32.315)
  */
-HGLOBAL32 GlobalAlloc32(UINT32 flags, DWORD size)
+HGLOBAL32 WINAPI GlobalAlloc32(UINT32 flags, DWORD size)
 {
    PGLOBAL32_INTERN     pintern;
    DWORD		hpflags;
@@ -892,7 +893,7 @@
 /***********************************************************************
  *           GlobalLock32   (KERNEL32.326)
  */
-LPVOID  GlobalLock32(HGLOBAL32 hmem)
+LPVOID WINAPI GlobalLock32(HGLOBAL32 hmem)
 {
    PGLOBAL32_INTERN pintern;
    LPVOID           palloc;
@@ -922,7 +923,7 @@
 /***********************************************************************
  *           GlobalUnlock32   (KERNEL32.332)
  */
-BOOL32 GlobalUnlock32(HGLOBAL32 hmem)
+BOOL32 WINAPI GlobalUnlock32(HGLOBAL32 hmem)
 {
    PGLOBAL32_INTERN       pintern;
    BOOL32                 locked;
@@ -953,7 +954,7 @@
 /***********************************************************************
  *           GlobalHandle32   (KERNEL32.325)
  */
-HGLOBAL32 GlobalHandle32(LPCVOID pmem)
+HGLOBAL32 WINAPI GlobalHandle32(LPCVOID pmem)
 {
    return (HGLOBAL32) POINTER_TO_HANDLE(pmem);
 }
@@ -962,7 +963,7 @@
 /***********************************************************************
  *           GlobalReAlloc32   (KERNEL32.328)
  */
-HGLOBAL32 GlobalReAlloc32(HGLOBAL32 hmem, DWORD size, UINT32 flags)
+HGLOBAL32 WINAPI GlobalReAlloc32(HGLOBAL32 hmem, DWORD size, UINT32 flags)
 {
    LPVOID               palloc;
    HGLOBAL32            hnew;
@@ -1045,7 +1046,7 @@
 /***********************************************************************
  *           GlobalFree32   (KERNEL32.322)
  */
-HGLOBAL32 GlobalFree32(HGLOBAL32 hmem)
+HGLOBAL32 WINAPI GlobalFree32(HGLOBAL32 hmem)
 {
    PGLOBAL32_INTERN pintern;
    HGLOBAL32        hreturned=NULL;
@@ -1080,7 +1081,7 @@
 /***********************************************************************
  *           GlobalSize32   (KERNEL32.329)
  */
-DWORD  GlobalSize32(HGLOBAL32 hmem)
+DWORD WINAPI GlobalSize32(HGLOBAL32 hmem)
 {
    DWORD                retval;
    PGLOBAL32_INTERN     pintern;
@@ -1113,7 +1114,7 @@
 /***********************************************************************
  *           GlobalWire32   (KERNEL32.333)
  */
-LPVOID  GlobalWire32(HGLOBAL32 hmem)
+LPVOID WINAPI GlobalWire32(HGLOBAL32 hmem)
 {
    return GlobalLock32( hmem );
 }
@@ -1122,7 +1123,7 @@
 /***********************************************************************
  *           GlobalUnWire32   (KERNEL32.330)
  */
-BOOL32  GlobalUnWire32(HGLOBAL32 hmem)
+BOOL32 WINAPI GlobalUnWire32(HGLOBAL32 hmem)
 {
    return GlobalUnlock32( hmem);
 }
@@ -1131,7 +1132,7 @@
 /***********************************************************************
  *           GlobalFix32   (KERNEL32.320)
  */
-VOID  GlobalFix32(HGLOBAL32 hmem)
+VOID WINAPI GlobalFix32(HGLOBAL32 hmem)
 {
     GlobalLock32( hmem );
 }
@@ -1140,7 +1141,7 @@
 /***********************************************************************
  *           GlobalUnfix32   (KERNEL32.331)
  */
-VOID  GlobalUnfix32(HGLOBAL32 hmem)
+VOID WINAPI GlobalUnfix32(HGLOBAL32 hmem)
 {
    GlobalUnlock32( hmem);
 }
@@ -1149,7 +1150,7 @@
 /***********************************************************************
  *           GlobalFlags32   (KERNEL32.321)
  */
-UINT32  GlobalFlags32(HGLOBAL32 hmem)
+UINT32 WINAPI GlobalFlags32(HGLOBAL32 hmem)
 {
    DWORD                retval;
    PGLOBAL32_INTERN     pintern;
@@ -1182,7 +1183,7 @@
 /***********************************************************************
  *           GlobalCompact32   (KERNEL32.316)
  */
-DWORD GlobalCompact32( DWORD minfree )
+DWORD WINAPI GlobalCompact32( DWORD minfree )
 {
     return 0;  /* GlobalCompact does nothing in Win32 */
 }
@@ -1191,7 +1192,7 @@
 /***********************************************************************
  *           GlobalMemoryStatus   (KERNEL32.327)
  */
-VOID GlobalMemoryStatus( LPMEMORYSTATUS lpmem )
+VOID WINAPI GlobalMemoryStatus( LPMEMORYSTATUS lpmem )
 {
 #ifdef linux
     FILE *f = fopen( "/proc/meminfo", "r" );
@@ -1204,16 +1205,27 @@
         lpmem->dwTotalPageFile = lpmem->dwAvailPageFile = 0;
         while (fgets( buffer, sizeof(buffer), f ))
         {
+	    /* old style /proc/meminfo ... */
             if (sscanf( buffer, "Mem: %d %d %d", &total, &used, &free ))
             {
                 lpmem->dwTotalPhys += total;
                 lpmem->dwAvailPhys += free;
             }
-            else if (sscanf( buffer, "Swap: %d %d %d", &total, &used, &free ))
+            if (sscanf( buffer, "Swap: %d %d %d", &total, &used, &free ))
             {
                 lpmem->dwTotalPageFile += total;
                 lpmem->dwAvailPageFile += free;
             }
+
+	    /* new style /proc/meminfo ... */
+	    if (sscanf(buffer, "MemTotal: %d", &total))
+	    	lpmem->dwTotalPhys = total*1024;
+	    if (sscanf(buffer, "MemFree: %d", &free))
+	    	lpmem->dwAvailPhys = free*1024;
+	    if (sscanf(buffer, "SwapTotal: %d", &total))
+	        lpmem->dwTotalPageFile = total*1024;
+	    if (sscanf(buffer, "SwapFree: %d", &free))
+	        lpmem->dwAvailPageFile = free*1024;
         }
         fclose( f );
 
@@ -1236,3 +1248,16 @@
     lpmem->dwTotalVirtual  = 32*1024*1024;
     lpmem->dwAvailVirtual  = 32*1024*1024;
 }
+
+/**********************************************************************
+ *           WOWGlobalAllocLock (KERNEL32.62)
+ *
+ * Combined GlobalAlloc and GlobalLock.
+ */
+SEGPTR WINAPI WOWGlobalAllocLock16(DWORD flags,DWORD cb,HGLOBAL16 *hmem)
+{
+    HGLOBAL16 xhmem;
+    xhmem = GlobalAlloc16(flags,cb);
+    if (hmem) *hmem = xhmem;
+    return WIN16_GlobalLock16(xhmem);
+}
diff --git a/memory/heap.c b/memory/heap.c
index 75e5adc..990ebb9 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -780,7 +780,7 @@
 /***********************************************************************
  *           HeapCreate   (KERNEL32.336)
  */
-HANDLE32 HeapCreate( DWORD flags, DWORD initialSize, DWORD maxSize )
+HANDLE32 WINAPI HeapCreate( DWORD flags, DWORD initialSize, DWORD maxSize )
 {
     int i;
     HEAP *heap;
@@ -838,7 +838,7 @@
 /***********************************************************************
  *           HeapDestroy   (KERNEL32.337)
  */
-BOOL32 HeapDestroy( HANDLE32 heap )
+BOOL32 WINAPI HeapDestroy( HANDLE32 heap )
 {
     HEAP *heapPtr = HEAP_GetPtr( heap );
     SUBHEAP *subheap;
@@ -862,7 +862,7 @@
 /***********************************************************************
  *           HeapAlloc   (KERNEL32.334)
  */
-LPVOID HeapAlloc( HANDLE32 heap, DWORD flags, DWORD size )
+LPVOID WINAPI HeapAlloc( HANDLE32 heap, DWORD flags, DWORD size )
 {
     ARENA_FREE *pArena;
     ARENA_INUSE *pInUse;
@@ -922,7 +922,7 @@
 /***********************************************************************
  *           HeapFree   (KERNEL32.338)
  */
-BOOL32 HeapFree( HANDLE32 heap, DWORD flags, LPVOID ptr )
+BOOL32 WINAPI HeapFree( HANDLE32 heap, DWORD flags, LPVOID ptr )
 {
     ARENA_INUSE *pInUse;
     SUBHEAP *subheap;
@@ -961,7 +961,7 @@
 /***********************************************************************
  *           HeapReAlloc   (KERNEL32.340)
  */
-LPVOID HeapReAlloc( HANDLE32 heap, DWORD flags, LPVOID ptr, DWORD size )
+LPVOID WINAPI HeapReAlloc( HANDLE32 heap, DWORD flags, LPVOID ptr, DWORD size )
 {
     ARENA_INUSE *pArena;
     DWORD oldSize;
@@ -1077,7 +1077,7 @@
 /***********************************************************************
  *           HeapCompact   (KERNEL32.335)
  */
-DWORD HeapCompact( HANDLE32 heap, DWORD flags )
+DWORD WINAPI HeapCompact( HANDLE32 heap, DWORD flags )
 {
     return 0;
 }
@@ -1086,7 +1086,7 @@
 /***********************************************************************
  *           HeapLock   (KERNEL32.339)
  */
-BOOL32 HeapLock( HANDLE32 heap )
+BOOL32 WINAPI HeapLock( HANDLE32 heap )
 {
     HEAP *heapPtr = HEAP_GetPtr( heap );
 
@@ -1099,7 +1099,7 @@
 /***********************************************************************
  *           HeapUnlock   (KERNEL32.342)
  */
-BOOL32 HeapUnlock( HANDLE32 heap )
+BOOL32 WINAPI HeapUnlock( HANDLE32 heap )
 {
     HEAP *heapPtr = HEAP_GetPtr( heap );
 
@@ -1112,7 +1112,7 @@
 /***********************************************************************
  *           HeapSize   (KERNEL32.341)
  */
-DWORD HeapSize( HANDLE32 heap, DWORD flags, LPVOID ptr )
+DWORD WINAPI HeapSize( HANDLE32 heap, DWORD flags, LPVOID ptr )
 {
     DWORD ret;
     HEAP *heapPtr = HEAP_GetPtr( heap );
@@ -1142,7 +1142,7 @@
 /***********************************************************************
  *           HeapValidate   (KERNEL32.343)
  */
-BOOL32 HeapValidate( HANDLE32 heap, DWORD flags, LPVOID block )
+BOOL32 WINAPI HeapValidate( HANDLE32 heap, DWORD flags, LPVOID block )
 {
     SUBHEAP *subheap;
     HEAP *heapPtr = (HEAP *)heap;
@@ -1194,7 +1194,7 @@
 /***********************************************************************
  *           HeapWalk   (KERNEL32.344)
  */
-BOOL32 HeapWalk( HANDLE32 heap, void *entry )
+BOOL32 WINAPI HeapWalk( HANDLE32 heap, void *entry )
 {
     fprintf( stderr, "HeapWalk(%08x): not implemented\n", heap );
     return FALSE;
diff --git a/memory/ldt.c b/memory/ldt.c
index de1cad0..36da4e1 100644
--- a/memory/ldt.c
+++ b/memory/ldt.c
@@ -34,12 +34,24 @@
                                   unsigned long count )
 {
     int res;
+#ifdef __PIC__
+    __asm__ __volatile__( "pushl %%ebx\n\t"
+                          "movl %2,%%ebx\n\t"
+                          "int $0x80\n\t"
+                          "popl %%ebx"
+                          : "=a" (res)
+                          : "0" (SYS_modify_ldt),
+                            "g" (func),
+                            "c" (ptr),
+                            "d" (count) );
+#else
     __asm__ __volatile__("int $0x80"
                          : "=a" (res)
                          : "0" (SYS_modify_ldt),
                            "b" (func),
                            "c" (ptr),
                            "d" (count) );
+#endif  /* __PIC__ */
     if (res >= 0) return res;
     errno = -res;
     return -1;
diff --git a/memory/local.c b/memory/local.c
index e54c03a..894beba 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -302,7 +302,7 @@
 /***********************************************************************
  *           LocalInit   (KERNEL.4)
  */
-BOOL16 LocalInit( HANDLE16 selector, WORD start, WORD end )
+BOOL16 WINAPI LocalInit( HANDLE16 selector, WORD start, WORD end )
 {
     char *ptr;
     WORD heapInfoArena, freeArena, lastArena;
@@ -1460,7 +1460,7 @@
 /***********************************************************************
  *           LocalAlloc16   (KERNEL.5)
  */
-HLOCAL16 LocalAlloc16( UINT16 flags, WORD size )
+HLOCAL16 WINAPI LocalAlloc16( UINT16 flags, WORD size )
 {
     return LOCAL_Alloc( CURRENT_DS, flags, size );
 }
@@ -1469,7 +1469,7 @@
 /***********************************************************************
  *           LocalReAlloc16   (KERNEL.6)
  */
-HLOCAL16 LocalReAlloc16( HLOCAL16 handle, WORD size, UINT16 flags )
+HLOCAL16 WINAPI LocalReAlloc16( HLOCAL16 handle, WORD size, UINT16 flags )
 {
     return LOCAL_ReAlloc( CURRENT_DS, handle, size, flags );
 }
@@ -1478,7 +1478,7 @@
 /***********************************************************************
  *           LocalFree16   (KERNEL.7)
  */
-HLOCAL16 LocalFree16( HLOCAL16 handle )
+HLOCAL16 WINAPI LocalFree16( HLOCAL16 handle )
 {
     return LOCAL_Free( CURRENT_DS, handle );
 }
@@ -1489,7 +1489,7 @@
  *
  * Note: only the offset part of the pointer is returned by the relay code.
  */
-SEGPTR LocalLock16( HLOCAL16 handle )
+SEGPTR WINAPI LocalLock16( HLOCAL16 handle )
 {
     return LOCAL_LockSegptr( CURRENT_DS, handle );
 }
@@ -1498,7 +1498,7 @@
 /***********************************************************************
  *           LocalUnlock16   (KERNEL.9)
  */
-BOOL16 LocalUnlock16( HLOCAL16 handle )
+BOOL16 WINAPI LocalUnlock16( HLOCAL16 handle )
 {
     return LOCAL_Unlock( CURRENT_DS, handle );
 }
@@ -1507,7 +1507,7 @@
 /***********************************************************************
  *           LocalSize16   (KERNEL.10)
  */
-UINT16 LocalSize16( HLOCAL16 handle )
+UINT16 WINAPI LocalSize16( HLOCAL16 handle )
 {
     return LOCAL_Size( CURRENT_DS, handle );
 }
@@ -1516,7 +1516,7 @@
 /***********************************************************************
  *           LocalHandle16   (KERNEL.11)
  */
-HLOCAL16 LocalHandle16( WORD addr )
+HLOCAL16 WINAPI LocalHandle16( WORD addr )
 { 
     return LOCAL_Handle( CURRENT_DS, addr );
 }
@@ -1525,7 +1525,7 @@
 /***********************************************************************
  *           LocalFlags16   (KERNEL.12)
  */
-UINT16 LocalFlags16( HLOCAL16 handle )
+UINT16 WINAPI LocalFlags16( HLOCAL16 handle )
 {
     return LOCAL_Flags( CURRENT_DS, handle );
 }
@@ -1534,7 +1534,7 @@
 /***********************************************************************
  *           LocalCompact16   (KERNEL.13)
  */
-UINT16 LocalCompact16( UINT16 minfree )
+UINT16 WINAPI LocalCompact16( UINT16 minfree )
 {
     dprintf_local( stddeb, "LocalCompact: %04x\n", minfree );
     return LOCAL_Compact( CURRENT_DS, minfree, 0 );
@@ -1544,7 +1544,7 @@
 /***********************************************************************
  *           LocalNotify   (KERNEL.14)
  */
-FARPROC16 LocalNotify( FARPROC16 func )
+FARPROC16 WINAPI LocalNotify( FARPROC16 func )
 {
     LOCALHEAPINFO *pInfo;
     FARPROC16 oldNotify;
@@ -1567,7 +1567,7 @@
 /***********************************************************************
  *           LocalShrink16   (KERNEL.121)
  */
-UINT16 LocalShrink16( HGLOBAL16 handle, UINT16 newsize )
+UINT16 WINAPI LocalShrink16( HGLOBAL16 handle, UINT16 newsize )
 {
     dprintf_local( stddeb, "LocalShrink: %04x %04x\n", handle, newsize );
     return 0;
@@ -1577,7 +1577,7 @@
 /***********************************************************************
  *           GetHeapSpaces   (KERNEL.138)
  */
-DWORD GetHeapSpaces( HMODULE16 module )
+DWORD WINAPI GetHeapSpaces( HMODULE16 module )
 {
     NE_MODULE *pModule;
     WORD ds;
@@ -1592,7 +1592,7 @@
 /***********************************************************************
  *           LocalCountFree   (KERNEL.161)
  */
-WORD LocalCountFree(void)
+WORD WINAPI LocalCountFree(void)
 {
     return LOCAL_CountFree( CURRENT_DS );
 }
@@ -1601,7 +1601,7 @@
 /***********************************************************************
  *           LocalHeapSize   (KERNEL.162)
  */
-WORD LocalHeapSize()
+WORD WINAPI LocalHeapSize(void)
 {
     dprintf_local( stddeb, "LocalHeapSize:\n" );
     return LOCAL_HeapSize( CURRENT_DS );
@@ -1611,7 +1611,7 @@
 /***********************************************************************
  *           LocalHandleDelta   (KERNEL.310)
  */
-WORD LocalHandleDelta( WORD delta )
+WORD WINAPI LocalHandleDelta( WORD delta )
 {
     LOCALHEAPINFO *pInfo;
 
@@ -1630,7 +1630,7 @@
 /***********************************************************************
  *           LocalInfo   (TOOLHELP.56)
  */
-BOOL16 LocalInfo( LOCALINFO *pLocalInfo, HGLOBAL16 handle )
+BOOL16 WINAPI LocalInfo( LOCALINFO *pLocalInfo, HGLOBAL16 handle )
 {
     LOCALHEAPINFO *pInfo = LOCAL_GetHeap(SELECTOROF(WIN16_GlobalLock16(handle)));
     if (!pInfo) return FALSE;
@@ -1642,7 +1642,7 @@
 /***********************************************************************
  *           LocalFirst   (TOOLHELP.57)
  */
-BOOL16 LocalFirst( LOCALENTRY *pLocalEntry, HGLOBAL16 handle )
+BOOL16 WINAPI LocalFirst( LOCALENTRY *pLocalEntry, HGLOBAL16 handle )
 {
     WORD ds = GlobalHandleToSel( handle );
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
@@ -1665,7 +1665,7 @@
 /***********************************************************************
  *           LocalNext   (TOOLHELP.58)
  */
-BOOL16 LocalNext( LOCALENTRY *pLocalEntry )
+BOOL16 WINAPI LocalNext( LOCALENTRY *pLocalEntry )
 {
     WORD ds = GlobalHandleToSel( pLocalEntry->hHeap );
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
@@ -1692,7 +1692,7 @@
 /***********************************************************************
  *           LocalAlloc32   (KERNEL32.371)
  */
-HLOCAL32 LocalAlloc32( UINT32 flags, DWORD size )
+HLOCAL32 WINAPI LocalAlloc32( UINT32 flags, DWORD size )
 {
     return (HLOCAL32)GlobalAlloc32( flags, size );
 }
@@ -1701,7 +1701,7 @@
 /***********************************************************************
  *           LocalCompact32   (KERNEL32.372)
  */
-UINT32 LocalCompact32( UINT32 minfree )
+UINT32 WINAPI LocalCompact32( UINT32 minfree )
 {
     return 0;  /* LocalCompact does nothing in Win32 */
 }
@@ -1710,7 +1710,7 @@
 /***********************************************************************
  *           LocalFlags32   (KERNEL32.374)
  */
-UINT32 LocalFlags32( HLOCAL32 handle )
+UINT32 WINAPI LocalFlags32( HLOCAL32 handle )
 {
     return GlobalFlags32( (HGLOBAL32)handle );
 }
@@ -1719,7 +1719,7 @@
 /***********************************************************************
  *           LocalFree32   (KERNEL32.375)
  */
-HLOCAL32 LocalFree32( HLOCAL32 handle )
+HLOCAL32 WINAPI LocalFree32( HLOCAL32 handle )
 {
     return (HLOCAL32)GlobalFree32( (HGLOBAL32)handle );
 }
@@ -1728,7 +1728,7 @@
 /***********************************************************************
  *           LocalHandle32   (KERNEL32.376)
  */
-HLOCAL32 LocalHandle32( LPCVOID ptr )
+HLOCAL32 WINAPI LocalHandle32( LPCVOID ptr )
 {
     return (HLOCAL32)GlobalHandle32( ptr );
 }
@@ -1737,7 +1737,7 @@
 /***********************************************************************
  *           LocalLock32   (KERNEL32.377)
  */
-LPVOID LocalLock32( HLOCAL32 handle )
+LPVOID WINAPI LocalLock32( HLOCAL32 handle )
 {
     return GlobalLock32( (HGLOBAL32)handle );
 }
@@ -1746,7 +1746,7 @@
 /***********************************************************************
  *           LocalReAlloc32   (KERNEL32.378)
  */
-HLOCAL32 LocalReAlloc32( HLOCAL32 handle, DWORD size, UINT32 flags )
+HLOCAL32 WINAPI LocalReAlloc32( HLOCAL32 handle, DWORD size, UINT32 flags )
 {
     return (HLOCAL32)GlobalReAlloc32( (HGLOBAL32)handle, size, flags );
 }
@@ -1755,7 +1755,7 @@
 /***********************************************************************
  *           LocalShrink32   (KERNEL32.379)
  */
-UINT32 LocalShrink32( HGLOBAL32 handle, UINT32 newsize )
+UINT32 WINAPI LocalShrink32( HGLOBAL32 handle, UINT32 newsize )
 {
     return 0;  /* LocalShrink does nothing in Win32 */
 }
@@ -1764,7 +1764,7 @@
 /***********************************************************************
  *           LocalSize32   (KERNEL32.380)
  */
-UINT32 LocalSize32( HLOCAL32 handle )
+UINT32 WINAPI LocalSize32( HLOCAL32 handle )
 {
     return GlobalSize32( (HGLOBAL32)handle );
 }
@@ -1773,7 +1773,7 @@
 /***********************************************************************
  *           LocalUnlock32   (KERNEL32.381)
  */
-BOOL32 LocalUnlock32( HLOCAL32 handle )
+BOOL32 WINAPI LocalUnlock32( HLOCAL32 handle )
 {
     return GlobalUnlock32( (HGLOBAL32)handle );
 }
diff --git a/memory/selector.c b/memory/selector.c
index 06ed3ef..421cd99 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -20,7 +20,7 @@
 /***********************************************************************
  *           AllocSelectorArray   (KERNEL.206)
  */
-WORD AllocSelectorArray( WORD count )
+WORD WINAPI AllocSelectorArray( WORD count )
 {
     WORD i, size = 0;
 
@@ -40,7 +40,7 @@
 /***********************************************************************
  *           AllocSelector   (KERNEL.175)
  */
-WORD AllocSelector( WORD sel )
+WORD WINAPI AllocSelector( WORD sel )
 {
     WORD newsel, count, i;
 
@@ -63,7 +63,7 @@
 /***********************************************************************
  *           FreeSelector   (KERNEL.176)
  */
-WORD FreeSelector( WORD sel )
+WORD WINAPI FreeSelector( WORD sel )
 {
     if (IS_SELECTOR_FREE(sel)) return sel;  /* error */
     SELECTOR_FreeBlock( sel, 1 );
@@ -202,7 +202,7 @@
 /***********************************************************************
  *           PrestoChangoSelector   (KERNEL.177)
  */
-WORD PrestoChangoSelector( WORD selSrc, WORD selDst )
+WORD WINAPI PrestoChangoSelector( WORD selSrc, WORD selDst )
 {
     ldt_entry entry;
     LDT_GetEntry( SELECTOR_TO_ENTRY( selSrc ), &entry );
@@ -215,7 +215,7 @@
 /***********************************************************************
  *           AllocCStoDSAlias   (KERNEL.170)
  */
-WORD AllocCStoDSAlias( WORD sel )
+WORD WINAPI AllocCStoDSAlias( WORD sel )
 {
     WORD newsel;
     ldt_entry entry;
@@ -234,7 +234,7 @@
 /***********************************************************************
  *           AllocDStoCSAlias   (KERNEL.171)
  */
-WORD AllocDStoCSAlias( WORD sel )
+WORD WINAPI AllocDStoCSAlias( WORD sel )
 {
     WORD newsel;
     ldt_entry entry;
@@ -253,7 +253,7 @@
 /***********************************************************************
  *           LongPtrAdd   (KERNEL.180)
  */
-void LongPtrAdd( DWORD ptr, DWORD add )
+void WINAPI LongPtrAdd( DWORD ptr, DWORD add )
 {
     ldt_entry entry;
     LDT_GetEntry( SELECTOR_TO_ENTRY(SELECTOROF(ptr)), &entry );
@@ -265,7 +265,7 @@
 /***********************************************************************
  *           GetSelectorBase   (KERNEL.186)
  */
-DWORD GetSelectorBase( WORD sel )
+DWORD WINAPI GetSelectorBase( WORD sel )
 {
     DWORD base = GET_SEL_BASE(sel);
 
@@ -279,7 +279,7 @@
 /***********************************************************************
  *           SetSelectorBase   (KERNEL.187)
  */
-WORD SetSelectorBase( WORD sel, DWORD base )
+WORD WINAPI SetSelectorBase( WORD sel, DWORD base )
 {
     ldt_entry entry;
 
@@ -295,7 +295,7 @@
 /***********************************************************************
  *           GetSelectorLimit   (KERNEL.188)
  */
-DWORD GetSelectorLimit( WORD sel )
+DWORD WINAPI GetSelectorLimit( WORD sel )
 {
     return GET_SEL_LIMIT(sel);
 }
@@ -304,7 +304,7 @@
 /***********************************************************************
  *           SetSelectorLimit   (KERNEL.189)
  */
-WORD SetSelectorLimit( WORD sel, DWORD limit )
+WORD WINAPI SetSelectorLimit( WORD sel, DWORD limit )
 {
     ldt_entry entry;
     LDT_GetEntry( SELECTOR_TO_ENTRY(sel), &entry );
@@ -319,7 +319,7 @@
 /***********************************************************************
  *           SelectorAccessRights   (KERNEL.196)
  */
-WORD SelectorAccessRights( WORD sel, WORD op, WORD val )
+WORD WINAPI SelectorAccessRights( WORD sel, WORD op, WORD val )
 {
     ldt_entry entry;
     LDT_GetEntry( SELECTOR_TO_ENTRY(sel), &entry );
@@ -349,7 +349,7 @@
 /***********************************************************************
  *           IsBadCodePtr16   (KERNEL.336)
  */
-BOOL16 IsBadCodePtr16( SEGPTR lpfn )
+BOOL16 WINAPI IsBadCodePtr16( SEGPTR lpfn )
 {
     WORD sel;
     ldt_entry entry;
@@ -367,7 +367,7 @@
 /***********************************************************************
  *           IsBadStringPtr16   (KERNEL.337)
  */
-BOOL16 IsBadStringPtr16( SEGPTR ptr, UINT16 size )
+BOOL16 WINAPI IsBadStringPtr16( SEGPTR ptr, UINT16 size )
 {
     WORD sel;
     ldt_entry entry;
@@ -386,7 +386,7 @@
 /***********************************************************************
  *           IsBadHugeReadPtr16   (KERNEL.346)
  */
-BOOL16 IsBadHugeReadPtr16( SEGPTR ptr, DWORD size )
+BOOL16 WINAPI IsBadHugeReadPtr16( SEGPTR ptr, DWORD size )
 {
     WORD sel;
     ldt_entry entry;
@@ -404,7 +404,7 @@
 /***********************************************************************
  *           IsBadHugeWritePtr16   (KERNEL.347)
  */
-BOOL16 IsBadHugeWritePtr16( SEGPTR ptr, DWORD size )
+BOOL16 WINAPI IsBadHugeWritePtr16( SEGPTR ptr, DWORD size )
 {
     WORD sel;
     ldt_entry entry;
@@ -421,7 +421,7 @@
 /***********************************************************************
  *           IsBadReadPtr16   (KERNEL.334)
  */
-BOOL16 IsBadReadPtr16( SEGPTR ptr, UINT16 size )
+BOOL16 WINAPI IsBadReadPtr16( SEGPTR ptr, UINT16 size )
 {
     return IsBadHugeReadPtr16( ptr, size );
 }
@@ -430,7 +430,7 @@
 /***********************************************************************
  *           IsBadWritePtr16   (KERNEL.335)
  */
-BOOL16 IsBadWritePtr16( SEGPTR ptr, UINT16 size )
+BOOL16 WINAPI IsBadWritePtr16( SEGPTR ptr, UINT16 size )
 {
     return IsBadHugeWritePtr16( ptr, size );
 }
@@ -439,7 +439,7 @@
 /***********************************************************************
  *           MemoryRead   (TOOLHELP.78)
  */
-DWORD MemoryRead( WORD sel, DWORD offset, void *buffer, DWORD count )
+DWORD WINAPI MemoryRead( WORD sel, DWORD offset, void *buffer, DWORD count )
 {
     if (IS_SELECTOR_FREE(sel)) return 0;
     if (offset > GET_SEL_LIMIT(sel)) return 0;
@@ -453,7 +453,7 @@
 /***********************************************************************
  *           MemoryWrite   (TOOLHELP.79)
  */
-DWORD MemoryWrite( WORD sel, DWORD offset, void *buffer, DWORD count )
+DWORD WINAPI MemoryWrite( WORD sel, DWORD offset, void *buffer, DWORD count )
 {
     if (IS_SELECTOR_FREE(sel)) return 0;
     if (offset > GET_SEL_LIMIT(sel)) return 0;
@@ -475,7 +475,7 @@
  *
  * Maps fixed segmented pointer to linear.
  */
-LPVOID MapSL( SEGPTR sptr )
+LPVOID WINAPI MapSL( SEGPTR sptr )
 {
     return (LPVOID)PTR_SEG_TO_LIN(sptr);
 }
@@ -486,7 +486,7 @@
  *
  * Maps linear pointer to segmented.
  */
-SEGPTR MapLS( LPVOID ptr )
+SEGPTR WINAPI MapLS( LPVOID ptr )
 {
     WORD sel = SELECTOR_AllocBlock( ptr, 0x10000, SEGMENT_DATA, FALSE, FALSE );
     return PTR_SEG_OFF_TO_SEGPTR( sel, 0 );
@@ -498,7 +498,120 @@
  *
  * Free mapped selector.
  */
-void UnMapLS( SEGPTR sptr )
+void WINAPI UnMapLS( SEGPTR sptr )
 {
     if (!__winelib) SELECTOR_FreeBlock( SELECTOROF(sptr), 1 );
 }
+
+/***********************************************************************
+ *           GetThreadSelectorEntry   (KERNEL32)
+ * FIXME: add #ifdef i386 for non x86
+ */
+BOOL32 WINAPI GetThreadSelectorEntry( HANDLE32 hthread, DWORD sel,
+                                      LPLDT_ENTRY ldtent)
+{
+    ldt_entry	ldtentry;
+
+    LDT_GetEntry(SELECTOR_TO_ENTRY(sel),&ldtentry);
+    ldtent->BaseLow = ldtentry.base & 0x0000ffff;
+    ldtent->HighWord.Bits.BaseMid = (ldtentry.base & 0x00ff0000) >> 16;
+    ldtent->HighWord.Bits.BaseHi = (ldtentry.base & 0xff000000) >> 24;
+    ldtent->LimitLow = ldtentry.limit & 0x0000ffff;
+    ldtent->HighWord.Bits.LimitHi = (ldtentry.limit & 0x00ff0000) >> 16;
+    ldtent->HighWord.Bits.Dpl = 3;
+    ldtent->HighWord.Bits.Sys = 0;
+    ldtent->HighWord.Bits.Pres = 1;
+    ldtent->HighWord.Bits.Type = 0x10|(ldtentry.type << 2);
+    if (ldtentry.read_only)
+    	ldtent->HighWord.Bits.Type|=0x2;
+    ldtent->HighWord.Bits.Granularity = ldtentry.limit_in_pages;
+    ldtent->HighWord.Bits.Default_Big = ldtentry.seg_32bit;
+    return TRUE;
+}
+
+
+/**********************************************************************
+ * 		SMapLS*		(KERNEL32)
+ * These functions map linear pointers at [EBP+xxx] to segmented pointers
+ * and return them.
+ * Win95 uses some kind of alias structs, which it stores in [EBP+x] to
+ * unravel them at SUnMapLS. We just store the segmented pointer there.
+ */
+static void
+x_SMapLS_IP_EBP_x(CONTEXT *context,int argoff) {
+    DWORD	val,ptr; 
+
+    val =*(DWORD*)(EBP_reg(context)+argoff);
+    if (val<0x10000) {
+	ptr=val;
+	*(DWORD*)(EBP_reg(context)+argoff) = 0;
+    } else {
+    	ptr = MapLS((LPVOID)val);
+	*(DWORD*)(EBP_reg(context)+argoff) = ptr;
+    }
+    fprintf(stderr,"[EBP+%d] %08lx => %08lx\n",argoff,val,ptr);
+    EAX_reg(context) = ptr;
+}
+
+void WINAPI SMapLS_IP_EBP_8(CONTEXT *context)  {x_SMapLS_IP_EBP_x(context,8);}
+void WINAPI SMapLS_IP_EBP_12(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,12);}
+void WINAPI SMapLS_IP_EBP_16(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,16);}
+void WINAPI SMapLS_IP_EBP_20(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,20);}
+void WINAPI SMapLS_IP_EBP_24(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,24);}
+void WINAPI SMapLS_IP_EBP_28(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,28);}
+void WINAPI SMapLS_IP_EBP_32(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,32);}
+void WINAPI SMapLS_IP_EBP_36(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,36);}
+void WINAPI SMapLS_IP_EBP_40(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,40);}
+
+void WINAPI SMapLS(CONTEXT *context,int argoff)
+{
+    if (EAX_reg(context)>=0x10000) {
+	EAX_reg(context) = MapLS((LPVOID)EAX_reg(context));
+	EDX_reg(context) = EAX_reg(context);
+    } else {
+	EDX_reg(context) = 0;
+    }
+}
+
+/**********************************************************************
+ *           WOWGetVDMPointer	(KERNEL32.55)
+ * Get linear from segmented pointer. (MSDN lib)
+ */
+LPVOID WINAPI WOWGetVDMPointer(DWORD vp,DWORD nrofbytes,BOOL32 protected)
+{
+    /* FIXME: add size check too */
+    fprintf(stdnimp,"WOWGetVDMPointer(%08lx,%ld,%d)\n",vp,nrofbytes,protected);
+    if (protected)
+	return PTR_SEG_TO_LIN(vp);
+    else
+	return DOSMEM_MapRealToLinear(vp);
+}
+
+/**********************************************************************
+ *           GetVDMPointer32W   (KERNEL.516)
+ */
+LPVOID WINAPI GetVDMPointer32W(DWORD vp,DWORD mode)
+{
+    return WOWGetVDMPointer(vp,0,mode);
+}
+
+/**********************************************************************
+ *           WOWGetVDMPointerFix (KERNEL32.55)
+ * Dito, but fix heapsegment (MSDN lib)
+ */
+LPVOID WINAPI WOWGetVDMPointerFix(DWORD vp,DWORD nrofbytes,BOOL32 protected)
+{
+    /* FIXME: fix heapsegment */
+    fprintf(stdnimp,"WOWGetVDMPointerFix(%08lx,%ld,%d)\n",vp,nrofbytes,protected);
+    return WOWGetVDMPointer(vp,nrofbytes,protected);
+}
+
+/**********************************************************************
+ *           WOWGetVDMPointerUnFix (KERNEL32.56)
+ */
+void WINAPI WOWGetVDMPointerUnfix(DWORD vp)
+{
+    fprintf(stdnimp,"WOWGetVDMPointerUnfix(%08lx), STUB\n",vp);
+    /* FIXME: unfix heapsegment */
+}
+
diff --git a/memory/string.c b/memory/string.c
index 05beae1..72efb86 100644
--- a/memory/string.c
+++ b/memory/string.c
@@ -55,7 +55,7 @@
 /***********************************************************************
  *           hmemcpy   (KERNEL.348)
  */
-void hmemcpy( LPVOID dst, LPCVOID src, LONG count )
+void WINAPI hmemcpy( LPVOID dst, LPCVOID src, LONG count )
 {
     memcpy( dst, src, count );
 }
@@ -64,7 +64,7 @@
 /***********************************************************************
  *           lstrcat16   (KERNEL.89)
  */
-SEGPTR lstrcat16( SEGPTR dst, LPCSTR src )
+SEGPTR WINAPI lstrcat16( SEGPTR dst, LPCSTR src )
 {
     lstrcat32A( (LPSTR)PTR_SEG_TO_LIN(dst), src );
     return dst;
@@ -74,7 +74,7 @@
 /***********************************************************************
  *           lstrcat32A   (KERNEL32.599)
  */
-LPSTR lstrcat32A( LPSTR dst, LPCSTR src )
+LPSTR WINAPI lstrcat32A( LPSTR dst, LPCSTR src )
 {
     dprintf_string(stddeb,"strcat: Append '%s' to '%s'\n",
 		 (src)?src:"NULL",(dst)?dst:"NULL");
@@ -86,7 +86,7 @@
 /***********************************************************************
  *           lstrcat32W   (KERNEL32.600)
  */
-LPWSTR lstrcat32W( LPWSTR dst, LPCWSTR src )
+LPWSTR WINAPI lstrcat32W( LPWSTR dst, LPCWSTR src )
 {
     register LPWSTR p = dst;
     while (*p) p++;
@@ -98,7 +98,7 @@
 /***********************************************************************
  *           lstrcatn16   (KERNEL.352)
  */
-SEGPTR lstrcatn16( SEGPTR dst, LPCSTR src, INT16 n )
+SEGPTR WINAPI lstrcatn16( SEGPTR dst, LPCSTR src, INT16 n )
 {
     lstrcatn32A( (LPSTR)PTR_SEG_TO_LIN(dst), src, n );
     return dst;
@@ -108,7 +108,7 @@
 /***********************************************************************
  *           lstrcatn32A   (Not a Windows API)
  */
-LPSTR lstrcatn32A( LPSTR dst, LPCSTR src, INT32 n )
+LPSTR WINAPI lstrcatn32A( LPSTR dst, LPCSTR src, INT32 n )
 {
     register LPSTR p = dst;
     dprintf_string(stddeb,"strcatn add %d chars from '%s' to '%s'\n",
@@ -123,7 +123,7 @@
 /***********************************************************************
  *           lstrcatn32W   (Not a Windows API)
  */
-LPWSTR lstrcatn32W( LPWSTR dst, LPCWSTR src, INT32 n )
+LPWSTR WINAPI lstrcatn32W( LPWSTR dst, LPCWSTR src, INT32 n )
 {
     register LPWSTR p = dst;
     while (*p) p++;
@@ -136,7 +136,7 @@
 /***********************************************************************
  *           lstrcmp16   (USER.430)
  */
-INT16 lstrcmp16( LPCSTR str1, LPCSTR str2 )
+INT16 WINAPI lstrcmp16( LPCSTR str1, LPCSTR str2 )
 {
     return (INT16)lstrcmp32A( str1, str2 );
 }
@@ -145,7 +145,7 @@
 /***********************************************************************
  *           lstrcmp32A   (KERNEL.602)
  */
-INT32 lstrcmp32A( LPCSTR str1, LPCSTR str2 )
+INT32 WINAPI lstrcmp32A( LPCSTR str1, LPCSTR str2 )
 {
     dprintf_string(stddeb,"strcmp: '%s' and '%s'\n",
 		 (str1)?str1:"NULL",(str2)?str2:"NULL");
@@ -156,7 +156,7 @@
 /***********************************************************************
  *           lstrcmp32W   (KERNEL.603)
  */
-INT32 lstrcmp32W( LPCWSTR str1, LPCWSTR str2 )
+INT32 WINAPI lstrcmp32W( LPCWSTR str1, LPCWSTR str2 )
 {
     while (*str1 && (*str1 == *str2)) { str1++; str2++; }
     return (INT32)(*str1 - *str2);
@@ -166,7 +166,7 @@
 /***********************************************************************
  *           lstrcmpi16   (USER.471)
  */
-INT16 lstrcmpi16( LPCSTR str1, LPCSTR str2 )
+INT16 WINAPI lstrcmpi16( LPCSTR str1, LPCSTR str2 )
 {
     return (INT16)lstrcmpi32A( str1, str2 );
 }
@@ -175,7 +175,7 @@
 /***********************************************************************
  *           lstrcmpi32A   (KERNEL32.605)
  */
-INT32 lstrcmpi32A( LPCSTR str1, LPCSTR str2 )
+INT32 WINAPI lstrcmpi32A( LPCSTR str1, LPCSTR str2 )
 {
     INT32 res;
 
@@ -194,7 +194,7 @@
 /***********************************************************************
  *           lstrcmpi32W   (KERNEL32.606)
  */
-INT32 lstrcmpi32W( LPCWSTR str1, LPCWSTR str2 )
+INT32 WINAPI lstrcmpi32W( LPCWSTR str1, LPCWSTR str2 )
 {
     INT32 res;
 
@@ -212,7 +212,7 @@
 /***********************************************************************
  *           lstrcpy16   (KERNEL.88)
  */
-SEGPTR lstrcpy16( SEGPTR dst, LPCSTR src )
+SEGPTR WINAPI lstrcpy16( SEGPTR dst, LPCSTR src )
 {
     lstrcpy32A( (LPSTR)PTR_SEG_TO_LIN(dst), src );
     return dst;
@@ -222,7 +222,7 @@
 /***********************************************************************
  *           lstrcpy32A   (KERNEL32.608)
  */
-LPSTR lstrcpy32A( LPSTR dst, LPCSTR src )
+LPSTR WINAPI lstrcpy32A( LPSTR dst, LPCSTR src )
 {
     dprintf_string(stddeb,"strcpy '%s'\n",
 		 (src)?src:"NULL");
@@ -235,7 +235,7 @@
 /***********************************************************************
  *           lstrcpy32W   (KERNEL32.609)
  */
-LPWSTR lstrcpy32W( LPWSTR dst, LPCWSTR src )
+LPWSTR WINAPI lstrcpy32W( LPWSTR dst, LPCWSTR src )
 {
     register LPWSTR p = dst;
     while ((*p++ = *src++));
@@ -246,7 +246,7 @@
 /***********************************************************************
  *           lstrcpyn16   (KERNEL.353)
  */
-SEGPTR lstrcpyn16( SEGPTR dst, LPCSTR src, INT16 n )
+SEGPTR WINAPI lstrcpyn16( SEGPTR dst, LPCSTR src, INT16 n )
 {
     lstrcpyn32A( (LPSTR)PTR_SEG_TO_LIN(dst), src, n );
     return dst;
@@ -256,7 +256,7 @@
 /***********************************************************************
  *           lstrcpyn32A   (KERNEL32.611)
  */
-LPSTR lstrcpyn32A( LPSTR dst, LPCSTR src, INT32 n )
+LPSTR WINAPI lstrcpyn32A( LPSTR dst, LPCSTR src, INT32 n )
 {
     LPSTR p = dst;
     dprintf_string(stddeb,"strcpyn '%s' for %d chars\n",
@@ -270,7 +270,7 @@
 /***********************************************************************
  *           lstrcpyn32W   (KERNEL32.612)
  */
-LPWSTR lstrcpyn32W( LPWSTR dst, LPCWSTR src, INT32 n )
+LPWSTR WINAPI lstrcpyn32W( LPWSTR dst, LPCWSTR src, INT32 n )
 {
     LPWSTR p = dst;
     while ((n-- > 1) && *src) *p++ = *src++;
@@ -282,7 +282,7 @@
 /***********************************************************************
  *           lstrlen16   (KERNEL.90)
  */
-INT16 lstrlen16( LPCSTR str )
+INT16 WINAPI lstrlen16( LPCSTR str )
 {
     return (INT16)lstrlen32A( str );
 }
@@ -291,7 +291,7 @@
 /***********************************************************************
  *           lstrlen32A   (KERNEL32.614)
  */
-INT32 lstrlen32A( LPCSTR str )
+INT32 WINAPI lstrlen32A( LPCSTR str )
 {
     /* looks weird, but win3.1 KERNEL got a GeneralProtection handler
      * in lstrlen() ... we check only for NULL pointer reference.
@@ -306,7 +306,7 @@
 /***********************************************************************
  *           lstrlen32W   (KERNEL32.615)
  */
-INT32 lstrlen32W( LPCWSTR str )
+INT32 WINAPI lstrlen32W( LPCWSTR str )
 {
     INT32 len = 0;
     if (!str) return 0;
@@ -318,7 +318,7 @@
 /***********************************************************************
  *           lstrncmp32A   (Not a Windows API)
  */
-INT32 lstrncmp32A( LPCSTR str1, LPCSTR str2, INT32 n )
+INT32 WINAPI lstrncmp32A( LPCSTR str1, LPCSTR str2, INT32 n )
 {
     dprintf_string(stddeb,"strncmp '%s' and '%s' for %d chars\n",
 		 (str1)?str1:"NULL",(str2)?str2:"NULL",n);
@@ -329,7 +329,7 @@
 /***********************************************************************
  *           lstrncmp32W   (Not a Windows API)
  */
-INT32 lstrncmp32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
+INT32 WINAPI lstrncmp32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
 {
     if (!n) return 0;
     while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; }
@@ -340,7 +340,7 @@
 /***********************************************************************
  *           lstrncmpi32A   (Not a Windows API)
  */
-INT32 lstrncmpi32A( LPCSTR str1, LPCSTR str2, INT32 n )
+INT32 WINAPI lstrncmpi32A( LPCSTR str1, LPCSTR str2, INT32 n )
 {
     INT32 res;
 
@@ -357,7 +357,7 @@
 /***********************************************************************
  *           lstrncmpi32W   (Not a Windows API)
  */
-INT32 lstrncmpi32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
+INT32 WINAPI lstrncmpi32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
 {
     INT32 res;
 
@@ -376,7 +376,7 @@
 /***********************************************************************
  *           lstrcpyAtoW   (Not a Windows API)
  */
-LPWSTR lstrcpyAtoW( LPWSTR dst, LPCSTR src )
+LPWSTR WINAPI lstrcpyAtoW( LPWSTR dst, LPCSTR src )
 {
     register LPWSTR p = dst;
     while ((*p++ = (WCHAR)(unsigned char)*src++));
@@ -387,7 +387,7 @@
 /***********************************************************************
  *           lstrcpyWtoA   (Not a Windows API)
  */
-LPSTR lstrcpyWtoA( LPSTR dst, LPCWSTR src )
+LPSTR WINAPI lstrcpyWtoA( LPSTR dst, LPCWSTR src )
 {
     register LPSTR p = dst;
     while ((*p++ = (CHAR)*src++));
@@ -398,7 +398,7 @@
 /***********************************************************************
  *           lstrcpynAtoW   (Not a Windows API)
  */
-LPWSTR lstrcpynAtoW( LPWSTR dst, LPCSTR src, INT32 n )
+LPWSTR WINAPI lstrcpynAtoW( LPWSTR dst, LPCSTR src, INT32 n )
 {
     LPWSTR p = dst;
     while ((n-- > 1) && *src) *p++ = (WCHAR)(unsigned char)*src++;
@@ -410,7 +410,7 @@
 /***********************************************************************
  *           lstrcpynWtoA   (Not a Windows API)
  */
-LPSTR lstrcpynWtoA( LPSTR dst, LPCWSTR src, INT32 n )
+LPSTR WINAPI lstrcpynWtoA( LPSTR dst, LPCWSTR src, INT32 n )
 {
     LPSTR p = dst;
     while ((n-- > 1) && *src) *p++ = (CHAR)*src++;
@@ -422,7 +422,7 @@
 /***********************************************************************
  *           Copy   (GDI.250)
  */
-void Copy( LPVOID src, LPVOID dst, WORD size )
+void WINAPI Copy( LPVOID src, LPVOID dst, WORD size )
 {
     memcpy( dst, src, size );
 }
@@ -431,7 +431,7 @@
 /***********************************************************************
  *           RtlFillMemory   (KERNEL32.441)
  */
-VOID RtlFillMemory( LPVOID ptr, UINT32 len, UINT32 fill )
+VOID WINAPI RtlFillMemory( LPVOID ptr, UINT32 len, UINT32 fill )
 {
     memset( ptr, fill, len );
 }
@@ -440,7 +440,7 @@
 /***********************************************************************
  *           RtlMoveMemory   (KERNEL32.442)
  */
-VOID RtlMoveMemory( LPVOID dst, LPCVOID src, UINT32 len )
+VOID WINAPI RtlMoveMemory( LPVOID dst, LPCVOID src, UINT32 len )
 {
     memmove( dst, src, len );
 }
@@ -449,7 +449,7 @@
 /***********************************************************************
  *           RtlZeroMemory   (KERNEL32.444)
  */
-VOID RtlZeroMemory( LPVOID ptr, UINT32 len )
+VOID WINAPI RtlZeroMemory( LPVOID ptr, UINT32 len )
 {
     memset( ptr, 0, len );
 }
@@ -458,7 +458,7 @@
 /***********************************************************************
  *           AnsiToOem16   (KEYBOARD.5)
  */
-INT16 AnsiToOem16( LPCSTR s, LPSTR d )
+INT16 WINAPI AnsiToOem16( LPCSTR s, LPSTR d )
 {
     CharToOem32A( s, d );
     return -1;
@@ -468,7 +468,7 @@
 /***********************************************************************
  *           OemToAnsi16   (KEYBOARD.6)
  */
-INT16 OemToAnsi16( LPCSTR s, LPSTR d )
+INT16 WINAPI OemToAnsi16( LPCSTR s, LPSTR d )
 {
     OemToChar32A( s, d );
     return -1;
@@ -478,7 +478,7 @@
 /***********************************************************************
  *           AnsiToOemBuff16   (KEYBOARD.134)
  */
-void AnsiToOemBuff16( LPCSTR s, LPSTR d, UINT16 len )
+void WINAPI AnsiToOemBuff16( LPCSTR s, LPSTR d, UINT16 len )
 {
     CharToOemBuff32A( s, d, len ? len : 65536 );
 }
@@ -487,7 +487,7 @@
 /***********************************************************************
  *           OemToAnsiBuff16   (KEYBOARD.135)
  */
-void OemToAnsiBuff16( LPCSTR s, LPSTR d, UINT16 len )
+void WINAPI OemToAnsiBuff16( LPCSTR s, LPSTR d, UINT16 len )
 {
     OemToCharBuff32A( s, d, len ? len : 65536 );
 }
@@ -496,7 +496,7 @@
 /***********************************************************************
  *           CharToOem32A   (USER32.36)
  */
-BOOL32 CharToOem32A( LPCSTR s, LPSTR d )
+BOOL32 WINAPI CharToOem32A( LPCSTR s, LPSTR d )
 {
     if (!s || !d) return TRUE;
     dprintf_string(stddeb,"CharToOem '%s'\n", (s)?s:"NULL");
@@ -509,7 +509,7 @@
 /***********************************************************************
  *           CharToOemBuff32A   (USER32.37)
  */
-BOOL32 CharToOemBuff32A( LPCSTR s, LPSTR d, DWORD len )
+BOOL32 WINAPI CharToOemBuff32A( LPCSTR s, LPSTR d, DWORD len )
 {
     while (len--) *d++ = ANSI_TO_OEM(*s++);
     return TRUE;
@@ -519,7 +519,7 @@
 /***********************************************************************
  *           CharToOemBuff32W   (USER32.38)
  */
-BOOL32 CharToOemBuff32W( LPCWSTR s, LPSTR d, DWORD len )
+BOOL32 WINAPI CharToOemBuff32W( LPCWSTR s, LPSTR d, DWORD len )
 {
     while (len--) *d++ = ANSI_TO_OEM(*s++);
     return TRUE;
@@ -529,7 +529,7 @@
 /***********************************************************************
  *           CharToOem32W   (USER32.39)
  */
-BOOL32 CharToOem32W( LPCWSTR s, LPSTR d )
+BOOL32 WINAPI CharToOem32W( LPCWSTR s, LPSTR d )
 {
     while ((*d++ = ANSI_TO_OEM(*s++)));
     return TRUE;
@@ -539,7 +539,7 @@
 /***********************************************************************
  *           OemToChar32A   (USER32.401)
  */
-BOOL32 OemToChar32A( LPCSTR s, LPSTR d )
+BOOL32 WINAPI OemToChar32A( LPCSTR s, LPSTR d )
 {
     dprintf_string(stddeb,"OemToChar '%s'\n", (s)?s:"NULL");
     while ((*d++ = OEM_TO_ANSI(*s++)));
@@ -551,7 +551,7 @@
 /***********************************************************************
  *           OemToCharBuff32A   (USER32.402)
  */
-BOOL32 OemToCharBuff32A( LPCSTR s, LPSTR d, DWORD len )
+BOOL32 WINAPI OemToCharBuff32A( LPCSTR s, LPSTR d, DWORD len )
 {
     dprintf_string(stddeb,"OemToCharBuff '%s' for %ld chars\n", (s)?s:"NULL",len);
     while (len--) *d++ = OEM_TO_ANSI(*s++);
@@ -562,7 +562,7 @@
 /***********************************************************************
  *           OemToCharBuff32W   (USER32.403)
  */
-BOOL32 OemToCharBuff32W( LPCSTR s, LPWSTR d, DWORD len )
+BOOL32 WINAPI OemToCharBuff32W( LPCSTR s, LPWSTR d, DWORD len )
 {
     while (len--) *d++ = (WCHAR)OEM_TO_ANSI(*s++);
     return TRUE;
@@ -572,7 +572,7 @@
 /***********************************************************************
  *           OemToChar32W   (USER32.404)
  */
-BOOL32 OemToChar32W( LPCSTR s, LPWSTR d )
+BOOL32 WINAPI OemToChar32W( LPCSTR s, LPWSTR d )
 {
     while ((*d++ = (WCHAR)OEM_TO_ANSI(*s++)));
     return TRUE;
diff --git a/memory/virtual.c b/memory/virtual.c
index 2aa42ba..f3765b2 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -416,7 +416,7 @@
 /***********************************************************************
  *             VirtualAlloc   (KERNEL32.548)
  */
-LPVOID VirtualAlloc( LPVOID addr, DWORD size, DWORD type, DWORD protect )
+LPVOID WINAPI VirtualAlloc( LPVOID addr, DWORD size, DWORD type, DWORD protect)
 {
     FILE_VIEW *view;
     UINT32 base, ptr, view_size;
@@ -517,7 +517,7 @@
 /***********************************************************************
  *             VirtualFree   (KERNEL32.550)
  */
-BOOL32 VirtualFree( LPVOID addr, DWORD size, DWORD type )
+BOOL32 WINAPI VirtualFree( LPVOID addr, DWORD size, DWORD type )
 {
     FILE_VIEW *view;
     UINT32 base;
@@ -567,7 +567,7 @@
 /***********************************************************************
  *             VirtualLock   (KERNEL32.551)
  */
-BOOL32 VirtualLock( LPVOID addr, DWORD size )
+BOOL32 WINAPI VirtualLock( LPVOID addr, DWORD size )
 {
     return TRUE;
 }
@@ -576,7 +576,7 @@
 /***********************************************************************
  *             VirtualUnlock   (KERNEL32.556)
  */
-BOOL32 VirtualUnlock( LPVOID addr, DWORD size )
+BOOL32 WINAPI VirtualUnlock( LPVOID addr, DWORD size )
 {
     return TRUE;
 }
@@ -585,8 +585,8 @@
 /***********************************************************************
  *             VirtualProtect   (KERNEL32.552)
  */
-BOOL32 VirtualProtect( LPVOID addr, DWORD size, DWORD new_prot,
-                       LPDWORD old_prot )
+BOOL32 WINAPI VirtualProtect( LPVOID addr, DWORD size, DWORD new_prot,
+                              LPDWORD old_prot )
 {
     FILE_VIEW *view;
     UINT32 base, i;
@@ -628,8 +628,8 @@
 /***********************************************************************
  *             VirtualProtectEx   (KERNEL32.553)
  */
-BOOL32 VirtualProtectEx( HANDLE32 handle, LPVOID addr, DWORD size,
-                         DWORD new_prot, LPDWORD old_prot )
+BOOL32 WINAPI VirtualProtectEx( HANDLE32 handle, LPVOID addr, DWORD size,
+                                DWORD new_prot, LPDWORD old_prot )
 {
     BOOL32 ret = FALSE;
 
@@ -649,7 +649,8 @@
 /***********************************************************************
  *             VirtualQuery   (KERNEL32.554)
  */
-BOOL32 VirtualQuery( LPCVOID addr, LPMEMORY_BASIC_INFORMATION info, DWORD len )
+BOOL32 WINAPI VirtualQuery( LPCVOID addr, LPMEMORY_BASIC_INFORMATION info,
+                            DWORD len )
 {
     FILE_VIEW *view = VIRTUAL_FirstView;
     UINT32 base = ROUND_ADDR( addr );
@@ -710,8 +711,8 @@
 /***********************************************************************
  *             VirtualQueryEx   (KERNEL32.555)
  */
-BOOL32 VirtualQueryEx( HANDLE32 handle, LPCVOID addr,
-                       LPMEMORY_BASIC_INFORMATION info, DWORD len )
+BOOL32 WINAPI VirtualQueryEx( HANDLE32 handle, LPCVOID addr,
+                              LPMEMORY_BASIC_INFORMATION info, DWORD len )
 {
     BOOL32 ret = FALSE;
 
@@ -731,7 +732,7 @@
 /***********************************************************************
  *             IsBadReadPtr32   (KERNEL32.354)
  */
-BOOL32 IsBadReadPtr32( LPCVOID ptr, UINT32 size )
+BOOL32 WINAPI IsBadReadPtr32( LPCVOID ptr, UINT32 size )
 {
     return !VIRTUAL_CheckFlags( (UINT32)ptr, size,
                                 VPROT_READ | VPROT_COMMITTED );
@@ -741,7 +742,7 @@
 /***********************************************************************
  *             IsBadWritePtr32   (KERNEL32.357)
  */
-BOOL32 IsBadWritePtr32( LPVOID ptr, UINT32 size )
+BOOL32 WINAPI IsBadWritePtr32( LPVOID ptr, UINT32 size )
 {
     return !VIRTUAL_CheckFlags( (UINT32)ptr, size,
                                 VPROT_WRITE | VPROT_COMMITTED );
@@ -751,7 +752,7 @@
 /***********************************************************************
  *             IsBadHugeReadPtr32   (KERNEL32.352)
  */
-BOOL32 IsBadHugeReadPtr32( LPCVOID ptr, UINT32 size )
+BOOL32 WINAPI IsBadHugeReadPtr32( LPCVOID ptr, UINT32 size )
 {
     return IsBadReadPtr32( ptr, size );
 }
@@ -760,7 +761,7 @@
 /***********************************************************************
  *             IsBadHugeWritePtr32   (KERNEL32.353)
  */
-BOOL32 IsBadHugeWritePtr32( LPVOID ptr, UINT32 size )
+BOOL32 WINAPI IsBadHugeWritePtr32( LPVOID ptr, UINT32 size )
 {
     return IsBadWritePtr32( ptr, size );
 }
@@ -769,7 +770,7 @@
 /***********************************************************************
  *             IsBadCodePtr32   (KERNEL32.351)
  */
-BOOL32 IsBadCodePtr32( FARPROC32 ptr )
+BOOL32 WINAPI IsBadCodePtr32( FARPROC32 ptr )
 {
     return !VIRTUAL_CheckFlags( (UINT32)ptr, 1, VPROT_EXEC | VPROT_COMMITTED );
 }
@@ -778,7 +779,7 @@
 /***********************************************************************
  *             IsBadStringPtr32A   (KERNEL32.355)
  */
-BOOL32 IsBadStringPtr32A( LPCSTR str, UINT32 max )
+BOOL32 WINAPI IsBadStringPtr32A( LPCSTR str, UINT32 max )
 {
     FILE_VIEW *view;
     UINT32 page, count;
@@ -806,7 +807,7 @@
 /***********************************************************************
  *             IsBadStringPtr32W   (KERNEL32.356)
  */
-BOOL32 IsBadStringPtr32W( LPCWSTR str, UINT32 max )
+BOOL32 WINAPI IsBadStringPtr32W( LPCWSTR str, UINT32 max )
 {
     FILE_VIEW *view;
     UINT32 page, count;
@@ -834,9 +835,9 @@
 /***********************************************************************
  *             CreateFileMapping32A   (KERNEL32.46)
  */
-HANDLE32 CreateFileMapping32A( HFILE32 hFile, LPSECURITY_ATTRIBUTES attr,
-                               DWORD protect, DWORD size_high, DWORD size_low,
-                               LPCSTR name )
+HANDLE32 WINAPI CreateFileMapping32A(HFILE32 hFile, LPSECURITY_ATTRIBUTES attr,
+                                     DWORD protect, DWORD size_high,
+                                     DWORD size_low, LPCSTR name )
 {
     FILE_MAPPING *mapping = NULL;
     HANDLE32 handle;
@@ -930,9 +931,9 @@
 /***********************************************************************
  *             CreateFileMapping32W   (KERNEL32.47)
  */
-HANDLE32 CreateFileMapping32W( HFILE32 hFile, LPSECURITY_ATTRIBUTES attr,
-                               DWORD protect, DWORD size_high, DWORD size_low,
-                               LPCWSTR name )
+HANDLE32 WINAPI CreateFileMapping32W(HFILE32 hFile, LPSECURITY_ATTRIBUTES attr,
+                                     DWORD protect, DWORD size_high,
+                                     DWORD size_low, LPCWSTR name )
 {
     LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
     HANDLE32 ret = CreateFileMapping32A( hFile, attr, protect,
@@ -945,7 +946,7 @@
 /***********************************************************************
  *             OpenFileMapping32A   (KERNEL32.397)
  */
-HANDLE32 OpenFileMapping32A( DWORD access, BOOL32 inherit, LPCSTR name )
+HANDLE32 WINAPI OpenFileMapping32A( DWORD access, BOOL32 inherit, LPCSTR name )
 {
     K32OBJ *obj = K32OBJ_FindNameType( name, K32OBJ_MEM_MAPPED_FILE );
     if (!obj) return 0;
@@ -956,7 +957,7 @@
 /***********************************************************************
  *             OpenFileMapping32W   (KERNEL32.398)
  */
-HANDLE32 OpenFileMapping32W( DWORD access, BOOL32 inherit, LPCWSTR name )
+HANDLE32 WINAPI OpenFileMapping32W( DWORD access, BOOL32 inherit, LPCWSTR name)
 {
     LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
     HANDLE32 ret = OpenFileMapping32A( access, inherit, nameA );
@@ -984,8 +985,8 @@
 /***********************************************************************
  *             MapViewOfFile   (KERNEL32.385)
  */
-LPVOID MapViewOfFile( HANDLE32 mapping, DWORD access, DWORD offset_high,
-                      DWORD offset_low, DWORD count )
+LPVOID WINAPI MapViewOfFile( HANDLE32 mapping, DWORD access, DWORD offset_high,
+                             DWORD offset_low, DWORD count )
 {
     return MapViewOfFileEx( mapping, access, offset_high,
                             offset_low, count, NULL );
@@ -995,8 +996,8 @@
 /***********************************************************************
  *             MapViewOfFileEx   (KERNEL32.386)
  */
-LPVOID MapViewOfFileEx( HANDLE32 handle, DWORD access, DWORD offset_high,
-                        DWORD offset_low, DWORD count, LPVOID addr )
+LPVOID WINAPI MapViewOfFileEx(HANDLE32 handle, DWORD access, DWORD offset_high,
+                              DWORD offset_low, DWORD count, LPVOID addr )
 {
     FILE_MAPPING *mapping;
     FILE_VIEW *view;
@@ -1082,7 +1083,7 @@
 /***********************************************************************
  *             UnmapViewOfFile   (KERNEL32.540)
  */
-BOOL32 UnmapViewOfFile( LPVOID addr )
+BOOL32 WINAPI UnmapViewOfFile( LPVOID addr )
 {
     FILE_VIEW *view;
     UINT32 base = ROUND_ADDR( addr );
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 8677044..92dc1c3 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -36,7 +36,7 @@
 	ver.c \
 	w32sys.c \
 	winsock.c \
-	winsock_async.c \
+	winsock_dns.c \
 	wsprintf.c \
 	xmalloc.c
 
diff --git a/misc/comm.c b/misc/comm.c
index d119200..f23666f 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -21,7 +21,7 @@
 #include <errno.h>
 #include <ctype.h>
 #include <sys/stat.h>
-#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__svr4__)
 #include <sys/filio.h>
 #endif
 #include <sys/ioctl.h>
@@ -148,7 +148,7 @@
 /**************************************************************************
  *         BuildCommDCB		(USER.213)
  */
-BOOL16 BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb)
+BOOL16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb)
 {
 	/* "COM1:9600,n,8,1"	*/
 	/*  012345		*/
@@ -173,6 +173,8 @@
 			return -1;
 		}
 		
+		memset(lpdcb, 0, sizeof(DCB16)); /* initialize */
+
 		if (!COM[port].fd) {
 		    OpenComm(device, 0, 0);
 		}
@@ -243,14 +245,17 @@
 /**************************************************************************
  *         BuildCommDCBA		(KERNEL32.14)
  */
-BOOL32 BuildCommDCB32A(LPCSTR device,LPDCB32 lpdcb) {
+BOOL32 WINAPI BuildCommDCB32A(LPCSTR device,LPDCB32 lpdcb)
+{
 	return BuildCommDCBAndTimeouts32A(device,lpdcb,NULL);
 }
 
 /**************************************************************************
  *         BuildCommDCBAndTimeoutsA	(KERNEL32.15)
  */
-BOOL32 BuildCommDCBAndTimeouts32A(LPCSTR device, LPDCB32 lpdcb,LPCOMMTIMEOUTS lptimeouts) {
+BOOL32 WINAPI BuildCommDCBAndTimeouts32A(LPCSTR device, LPDCB32 lpdcb,
+                                         LPCOMMTIMEOUTS lptimeouts)
+{
 	int	port;
 	char	*ptr,*temp;
 
@@ -270,6 +275,9 @@
 		temp=(LPSTR)(device+5);
 	} else
 		temp=(LPSTR)device;
+
+	memset(lpdcb, 0, sizeof(DCB32)); /* initialize */
+
 	lpdcb->DCBlength	= sizeof(DCB32);
 	if (strchr(temp,',')) {	/* old style */
 		DCB16	dcb16;
@@ -372,9 +380,9 @@
 /**************************************************************************
  *         BuildCommDCBAndTimeoutsW		(KERNEL32.16)
  */
-BOOL32 BuildCommDCBAndTimeouts32W(
-	LPCWSTR devid,LPDCB32 lpdcb,LPCOMMTIMEOUTS lptimeouts
-) {
+BOOL32 WINAPI BuildCommDCBAndTimeouts32W( LPCWSTR devid, LPDCB32 lpdcb,
+                                          LPCOMMTIMEOUTS lptimeouts )
+{
 	LPSTR	devidA;
 	BOOL32	ret;
 
@@ -388,14 +396,15 @@
 /**************************************************************************
  *         BuildCommDCBW		(KERNEL32.17)
  */
-BOOL32 BuildCommDCB32W(LPCWSTR devid,LPDCB32 lpdcb) {
+BOOL32 WINAPI BuildCommDCB32W(LPCWSTR devid,LPDCB32 lpdcb)
+{
 	return BuildCommDCBAndTimeouts32W(devid,lpdcb,NULL);
 }
 
 /*****************************************************************************
  *	OpenComm		(USER.200)
  */
-INT16 OpenComm(LPCSTR device,UINT16 cbInQueue,UINT16 cbOutQueue)
+INT16 WINAPI OpenComm(LPCSTR device,UINT16 cbInQueue,UINT16 cbOutQueue)
 {
 	int port,fd;
 
@@ -459,7 +468,7 @@
 /*****************************************************************************
  *	CloseComm		(USER.207)
  */
-INT16 CloseComm(INT16 fd)
+INT16 WINAPI CloseComm(INT16 fd)
 {
 	struct DosDeviceStruct *ptr;
 
@@ -483,7 +492,7 @@
 /*****************************************************************************
  *	SetCommBreak		(USER.210)
  */
-INT16 SetCommBreak16(INT16 fd)
+INT16 WINAPI SetCommBreak16(INT16 fd)
 {
 	struct DosDeviceStruct *ptr;
 
@@ -501,7 +510,7 @@
 /*****************************************************************************
  *	SetCommBreak		(KERNEL32.449)
  */
-BOOL32 SetCommBreak32(INT32 fd)
+BOOL32 WINAPI SetCommBreak32(INT32 fd)
 {
 
 	struct DosDeviceStruct *ptr;
@@ -520,7 +529,7 @@
 /*****************************************************************************
  *	ClearCommBreak		(USER.211)
  */
-INT16 ClearCommBreak16(INT16 fd)
+INT16 WINAPI ClearCommBreak16(INT16 fd)
 {
 	struct DosDeviceStruct *ptr;
 
@@ -538,7 +547,7 @@
 /*****************************************************************************
  *	ClearCommBreak		(KERNEL32.20)
  */
-BOOL32 ClearCommBreak32(INT32 fd)
+BOOL32 WINAPI ClearCommBreak32(INT32 fd)
 {
 	struct DosDeviceStruct *ptr;
 
@@ -556,7 +565,7 @@
 /*****************************************************************************
  *	EscapeCommFunction	(USER.214)
  */
-LONG EscapeCommFunction16(UINT16 fd,UINT16 nFunction)
+LONG WINAPI EscapeCommFunction16(UINT16 fd,UINT16 nFunction)
 {
 	int	max;
 	struct termios port;
@@ -632,7 +641,7 @@
 /*****************************************************************************
  *	EscapeCommFunction	(KERNEL32.214)
  */
-BOOL32 EscapeCommFunction32(INT32 fd,UINT32 nFunction)
+BOOL32 WINAPI EscapeCommFunction32(INT32 fd,UINT32 nFunction)
 {
 	struct termios	port;
 	struct DosDeviceStruct *ptr;
@@ -705,7 +714,7 @@
 /*****************************************************************************
  *	FlushComm	(USER.215)
  */
-INT16 FlushComm(INT16 fd,INT16 fnQueue)
+INT16 WINAPI FlushComm(INT16 fd,INT16 fnQueue)
 {
 	int queue;
 
@@ -720,7 +729,7 @@
 				fd, fnQueue);
 			return -1;
 		}
-	if (tcflush(fd, fnQueue)) {
+	if (tcflush(fd, queue)) {
 		commerror = WinError();
 		return -1;	
 	} else {
@@ -732,7 +741,7 @@
 /*****************************************************************************
  *	GetCommError	(USER.203)
  */
-INT16 GetCommError(INT16 fd,LPCOMSTAT lpStat)
+INT16 WINAPI GetCommError(INT16 fd,LPCOMSTAT lpStat)
 {
 	int		temperror;
 	unsigned long	cnt;
@@ -771,7 +780,7 @@
 /*****************************************************************************
  *	ClearCommError	(KERNEL32.21)
  */
-BOOL32 ClearCommError(INT32 fd,LPDWORD errors,LPCOMSTAT lpStat)
+BOOL32 WINAPI ClearCommError(INT32 fd,LPDWORD errors,LPCOMSTAT lpStat)
 {
 	int temperror;
 
@@ -785,7 +794,7 @@
 /*****************************************************************************
  *	SetCommEventMask	(USER.208)
  */
-UINT16	*SetCommEventMask(INT16 fd,UINT16 fuEvtMask)
+UINT16* WINAPI SetCommEventMask(INT16 fd,UINT16 fuEvtMask)
 {
     	dprintf_comm(stddeb,"SetCommEventMask:fd %d,mask %d\n",fd,fuEvtMask);
 	eventmask |= fuEvtMask;
@@ -795,7 +804,7 @@
 /*****************************************************************************
  *	GetCommEventMask	(USER.209)
  */
-UINT16 GetCommEventMask(INT16 fd,UINT16 fnEvtClear)
+UINT16 WINAPI GetCommEventMask(INT16 fd,UINT16 fnEvtClear)
 {
 	int	events = 0;
 
@@ -839,7 +848,7 @@
 /*****************************************************************************
  *	GetCommMask	(KERNEL32.156)
  */
-BOOL32 GetCommMask(INT32 fd,LPDWORD evtmask)
+BOOL32 WINAPI GetCommMask(INT32 fd,LPDWORD evtmask)
 {
     	dprintf_comm(stddeb,
 		"GetCommMask: fd %d, mask %p\n", fd, evtmask);
@@ -850,7 +859,7 @@
 /*****************************************************************************
  *	SetCommMask	(KERNEL32.451)
  */
-BOOL32 SetCommMask(INT32 fd,DWORD evtmask)
+BOOL32 WINAPI SetCommMask(INT32 fd,DWORD evtmask)
 {
     	dprintf_comm(stddeb,
 		"SetCommMask: fd %d, mask %lx\n", fd, evtmask);
@@ -861,7 +870,7 @@
 /*****************************************************************************
  *	SetCommState16	(USER.201)
  */
-INT16 SetCommState16(LPDCB16 lpdcb)
+INT16 WINAPI SetCommState16(LPDCB16 lpdcb)
 {
 	struct termios port;
 	struct DosDeviceStruct *ptr;
@@ -1048,8 +1057,12 @@
 #endif	
 	if (lpdcb->fInX)
 		port.c_iflag |= IXON;
+	else
+		port.c_iflag &= ~IXON;
 	if (lpdcb->fOutX)
 		port.c_iflag |= IXOFF;
+	else
+		port.c_iflag &= ~IXOFF;
 
 	if (tcsetattr(lpdcb->Id, TCSADRAIN, &port) == -1) {
 		commerror = WinError();	
@@ -1063,7 +1076,7 @@
 /*****************************************************************************
  *	SetCommState32	(KERNEL32.452)
  */
-BOOL32 SetCommState32(INT32 fd,LPDCB32 lpdcb)
+BOOL32 WINAPI SetCommState32(INT32 fd,LPDCB32 lpdcb)
 {
 	struct termios port;
 	struct DosDeviceStruct *ptr;
@@ -1251,8 +1264,12 @@
 #endif	
 	if (lpdcb->fInX)
 		port.c_iflag |= IXON;
+	else
+		port.c_iflag &= ~IXON;
 	if (lpdcb->fOutX)
 		port.c_iflag |= IXOFF;
+	else
+		port.c_iflag &= ~IXOFF;
 
 	if (tcsetattr(fd,TCSADRAIN,&port)==-1) {
 		commerror = WinError();	
@@ -1267,7 +1284,7 @@
 /*****************************************************************************
  *	GetCommState	(USER.202)
  */
-INT16 GetCommState16(INT16 fd, LPDCB16 lpdcb)
+INT16 WINAPI GetCommState16(INT16 fd, LPDCB16 lpdcb)
 {
 	struct termios port;
 
@@ -1386,7 +1403,7 @@
 /*****************************************************************************
  *	GetCommState	(KERNEL32.159)
  */
-BOOL32 GetCommState32(INT32 fd, LPDCB32 lpdcb)
+BOOL32 WINAPI GetCommState32(INT32 fd, LPDCB32 lpdcb)
 {
 	struct termios	port;
 
@@ -1502,7 +1519,7 @@
 /*****************************************************************************
  *	TransmitCommChar	(USER.206)
  */
-INT16 TransmitCommChar16(INT16 fd,CHAR chTransmit)
+INT16 WINAPI TransmitCommChar16(INT16 fd,CHAR chTransmit)
 {
 	struct DosDeviceStruct *ptr;
 
@@ -1530,7 +1547,7 @@
 /*****************************************************************************
  *	TransmitCommChar	(KERNEL32.535)
  */
-BOOL32 TransmitCommChar32(INT32 fd,CHAR chTransmit)
+BOOL32 WINAPI TransmitCommChar32(INT32 fd,CHAR chTransmit)
 {
 	struct DosDeviceStruct *ptr;
 
@@ -1556,7 +1573,7 @@
 /*****************************************************************************
  *	UngetCommChar	(USER.212)
  */
-INT16 UngetCommChar(INT16 fd,CHAR chUnget)
+INT16 WINAPI UngetCommChar(INT16 fd,CHAR chUnget)
 {
 	struct DosDeviceStruct *ptr;
 
@@ -1580,7 +1597,7 @@
 /*****************************************************************************
  *	ReadComm	(USER.204)
  */
-INT16 ReadComm(INT16 fd,LPSTR lpvBuf,INT16 cbRead)
+INT16 WINAPI ReadComm(INT16 fd,LPSTR lpvBuf,INT16 cbRead)
 {
 	int status, length;
 	struct DosDeviceStruct *ptr;
@@ -1625,7 +1642,7 @@
 /*****************************************************************************
  *	WriteComm	(USER.205)
  */
-INT16 WriteComm(INT16 fd, LPSTR lpvBuf, INT16 cbWrite)
+INT16 WINAPI WriteComm(INT16 fd, LPSTR lpvBuf, INT16 cbWrite)
 {
 	int x, length;
 	struct DosDeviceStruct *ptr;
@@ -1660,7 +1677,8 @@
 /*****************************************************************************
  *	GetCommTimeouts		(KERNEL32.160)
  */
-BOOL32 GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
+BOOL32 WINAPI GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts)
+{
 	fprintf(stderr,"GetCommTimeouts(%x,%p), empty stub.\n",
 		fd,lptimeouts
 	);
@@ -1670,7 +1688,7 @@
 /*****************************************************************************
  *	SetCommTimeouts		(KERNEL32.453)
  */
-BOOL32 SetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
+BOOL32 WINAPI SetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
 	fprintf(stderr,"SetCommTimeouts(%x,%p), empty stub.\n",
 		fd,lptimeouts
 	);
@@ -1680,8 +1698,8 @@
 /***********************************************************************
  *           EnableCommNotification   (USER.246)
  */
-BOOL16 EnableCommNotification( INT16 fd, HWND16 hwnd, INT16 cbWriteNotify,
-                               INT16 cbOutQueue )
+BOOL16 WINAPI EnableCommNotification( INT16 fd, HWND16 hwnd,
+                                      INT16 cbWriteNotify, INT16 cbOutQueue )
 {
 	fprintf(stderr, "EnableCommNotification(%d, %x, %d, %d), empty stub.\n", fd, hwnd, cbWriteNotify, cbOutQueue);
 	return TRUE;
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 4a4af0b..34f91a7 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -56,7 +56,7 @@
 /***********************************************************************
  *           GetOpenFileName   (COMMDLG.1)
  */
-BOOL16 GetOpenFileName16( SEGPTR ofn )
+BOOL16 WINAPI GetOpenFileName16( SEGPTR ofn )
 {
     HINSTANCE16 hInst;
     HANDLE32 hDlgTmpl = 0, hResInfo;
@@ -146,7 +146,7 @@
 /***********************************************************************
  *           GetSaveFileName   (COMMDLG.2)
  */
-BOOL16 GetSaveFileName16( SEGPTR ofn)
+BOOL16 WINAPI GetSaveFileName16( SEGPTR ofn)
 {
     HINSTANCE16 hInst;
     HANDLE32 hDlgTmpl = 0;
@@ -296,7 +296,7 @@
 	  return fptr;
 	fptr += strlen(fptr) + 1;
     }
-  return NULL;
+  return "*.*"; /* FIXME */
 }
 
 /***********************************************************************
@@ -417,22 +417,51 @@
  return 0;   
 } 
 
+/***********************************************************************
+ *                              FILEDLG_CallWindowProc             [internal]
+ *
+ * Adapt the structures back for win32 calls so the callee can read lpCustData
+ */
 static BOOL32 FILEDLG_CallWindowProc(LPOPENFILENAME16 lpofn,HWND32 hwnd,
 	UINT32 wMsg,WPARAM32 wParam,LPARAM lParam
+
 ) {
+	BOOL32	needstruct;
+
+	needstruct = (PTR_SEG_TO_LIN(lParam) == lpofn);
+
 	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(
+	if (lpofn->Flags & OFN_UNICODE) {
+		if (needstruct) {
+		    OPENFILENAME32W ofnw;
+
+		    /* FIXME: probably needs more converted */
+		    ofnw.lCustData = lpofn->lCustData;
+		    return (BOOL32)CallWindowProc32W(
+			    (WNDPROC32)lpofn->lpfnHook,hwnd,wMsg,wParam,(LPARAM)&ofnw
+		    );
+		} else
+		    return (BOOL32)CallWindowProc32W(
+			    (WNDPROC32)lpofn->lpfnHook,hwnd,wMsg,wParam,lParam
+		    );
+	}
+	/* ! |OFN_UNICODE */
+	if (needstruct) {
+		OPENFILENAME32A ofna;
+
+		/* FIXME: probably needs more converted */
+		ofna.lCustData = lpofn->lCustData;
+		return (BOOL32)CallWindowProc32A(
+			(WNDPROC32)lpofn->lpfnHook,hwnd,wMsg,wParam,(LPARAM)&ofna
+		);
+	} else
+		return (BOOL32)CallWindowProc32A(
 			(WNDPROC32)lpofn->lpfnHook,hwnd,wMsg,wParam,lParam
 		);
-	/* ! |OFN_UNICODE */
-	return (BOOL32)CallWindowProc32A(
-		(WNDPROC32)lpofn->lpfnHook,hwnd,wMsg,wParam,lParam
-	);
 
 }
 
@@ -718,7 +747,8 @@
 /***********************************************************************
  *           FileOpenDlgProc   (COMMDLG.6)
  */
-LRESULT FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+                               LPARAM lParam)
 {  
  LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
  
@@ -761,7 +791,8 @@
 /***********************************************************************
  *           FileSaveDlgProc   (COMMDLG.7)
  */
-LRESULT FileSaveDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI FileSaveDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+                               LPARAM lParam)
 {
  LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
  
@@ -808,7 +839,7 @@
 /***********************************************************************
  *           FindTextDlg   (COMMDLG.11)
  */
-HWND16 FindText( SEGPTR find )
+HWND16 WINAPI FindText( SEGPTR find )
 {
     HANDLE16 hInst;
     LPCVOID ptr;
@@ -833,7 +864,7 @@
 /***********************************************************************
  *           ReplaceText   (COMMDLG.12)
  */
-HWND16 ReplaceText( SEGPTR find )
+HWND16 WINAPI ReplaceText( SEGPTR find )
 {
     HANDLE16 hInst;
     LPCVOID ptr;
@@ -946,7 +977,8 @@
 /***********************************************************************
  *           FindTextDlgProc   (COMMDLG.13)
  */
-LRESULT FindTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI FindTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+                               LPARAM lParam)
 {
     switch (wMsg) {
 	case WM_INITDIALOG:
@@ -1066,7 +1098,8 @@
 /***********************************************************************
  *           ReplaceTextDlgProc   (COMMDLG.14)
  */
-LRESULT ReplaceTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI ReplaceTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+                                  LPARAM lParam)
 {
     switch (wMsg) {
 	case WM_INITDIALOG:
@@ -1081,7 +1114,7 @@
 /***********************************************************************
  *           PrintDlg   (COMMDLG.20)
  */
-BOOL16 PrintDlg( SEGPTR printdlg )
+BOOL16 WINAPI PrintDlg( SEGPTR printdlg )
 {
     HANDLE16 hInst;
     BOOL16 bRet = FALSE;
@@ -1115,7 +1148,8 @@
 /***********************************************************************
  *           PrintDlgProc   (COMMDLG.21)
  */
-LRESULT PrintDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI PrintDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+                            LPARAM lParam)
 {
   switch (wMsg)
     {
@@ -1142,7 +1176,8 @@
 /***********************************************************************
  *           PrintSetupDlgProc   (COMMDLG.22)
  */
-LRESULT PrintSetupDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI PrintSetupDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+                                 LPARAM lParam)
 {
   switch (wMsg)
     {
@@ -1168,7 +1203,7 @@
 /***********************************************************************
  *           CommDlgExtendedError   (COMMDLG.26)
  */
-DWORD CommDlgExtendedError(void)
+DWORD WINAPI CommDlgExtendedError(void)
 {
   return CommDlgLastError;
 }
@@ -1176,7 +1211,7 @@
 /***********************************************************************
  *           GetFileTitleA   (COMDLG32.8)
  */
-short GetFileTitle32A(LPCSTR lpFile, LPSTR lpTitle, UINT32 cbBuf)
+short WINAPI GetFileTitle32A(LPCSTR lpFile, LPSTR lpTitle, UINT32 cbBuf)
 {
     int i, len;
     dprintf_commdlg(stddeb,"GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf);
@@ -1210,7 +1245,7 @@
 /***********************************************************************
  *           GetFileTitleA   (COMDLG32.8)
  */
-short GetFileTitle32W(LPCWSTR lpFile, LPWSTR lpTitle, UINT32 cbBuf)
+short WINAPI GetFileTitle32W(LPCWSTR lpFile, LPWSTR lpTitle, UINT32 cbBuf)
 {
 	LPSTR file = HEAP_strdupWtoA(GetProcessHeap(),0,lpFile);
 	LPSTR title = HeapAlloc(GetProcessHeap(),0,cbBuf);
@@ -1226,7 +1261,8 @@
 /***********************************************************************
  *           GetFileTitle   (COMMDLG.27)
  */
-short GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf) {
+short WINAPI GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf)
+{
     return GetFileTitle32A(lpFile,lpTitle,cbBuf);
 }
 
@@ -1236,7 +1272,7 @@
 /***********************************************************************
  *           ChooseColor   (COMMDLG.5)
  */
-BOOL16 ChooseColor(LPCHOOSECOLOR lpChCol)
+BOOL16 WINAPI ChooseColor(LPCHOOSECOLOR lpChCol)
 {
     HINSTANCE16 hInst;
     HANDLE16 hDlgTmpl = 0;
@@ -2272,8 +2308,8 @@
 /***********************************************************************
  *           ColorDlgProc   (COMMDLG.8)
  */
-LRESULT ColorDlgProc(HWND16 hDlg, UINT16 message,
-                     WPARAM16 wParam, LONG lParam)
+LRESULT WINAPI ColorDlgProc(HWND16 hDlg, UINT16 message,
+                            WPARAM16 wParam, LONG lParam)
 {
  int res;
  struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
@@ -2331,7 +2367,7 @@
 /***********************************************************************
  *                        ChooseFont   (COMMDLG.15)     
  */
-BOOL16 ChooseFont(LPCHOOSEFONT lpChFont)
+BOOL16 WINAPI ChooseFont(LPCHOOSEFONT lpChFont)
 {
     HINSTANCE16 hInst;
     HANDLE16 hDlgTmpl = 0;
@@ -2411,8 +2447,8 @@
 /***********************************************************************
  *                FontFamilyEnumProc                       (COMMDLG.19)
  */
-INT16 FontFamilyEnumProc( SEGPTR logfont, SEGPTR metrics,
-                          UINT16 nFontType, LPARAM lParam )
+INT16 WINAPI FontFamilyEnumProc( SEGPTR logfont, SEGPTR metrics,
+                                 UINT16 nFontType, LPARAM lParam )
 {
   int i;
   WORD w;
@@ -2529,8 +2565,8 @@
 /***********************************************************************
  *                 FontStyleEnumProc                     (COMMDLG.18)
  */
-INT16 FontStyleEnumProc( SEGPTR logfont, SEGPTR metrics,
-                         UINT16 nFontType, LPARAM lParam )
+INT16 WINAPI FontStyleEnumProc( SEGPTR logfont, SEGPTR metrics,
+                                UINT16 nFontType, LPARAM lParam )
 {
   HWND16 hcmb2=LOWORD(lParam);
   HWND16 hcmb3=HIWORD(lParam);
@@ -2947,7 +2983,8 @@
                     2. some CF_.. flags are not supported
                     3. some TType extensions
  */
-LRESULT FormatCharDlgProc(HWND16 hDlg, UINT16 message, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI FormatCharDlgProc(HWND16 hDlg, UINT16 message, WPARAM16 wParam,
+                                 LPARAM lParam)
 {
   LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);  
   if (message!=WM_INITDIALOG)
@@ -2983,7 +3020,7 @@
 
 
 #define GET_XXX_FILENAME(xxx) 						\
-BOOL32 xxx##32A( LPOPENFILENAME32A ofn )				\
+BOOL32 WINAPI xxx##32A( LPOPENFILENAME32A ofn )				\
 {									\
 	BOOL16 ret;							\
 	LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));	\
@@ -3062,7 +3099,7 @@
 	return ret;							\
 }									\
 									\
-BOOL32 xxx##32W( LPOPENFILENAME32W ofn )				\
+BOOL32 WINAPI xxx##32W( LPOPENFILENAME32W ofn )				\
 {									\
 	BOOL16 ret;							\
 	LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));	\
diff --git a/misc/compobj.c b/misc/compobj.c
index 45decf8..6fa4010 100644
--- a/misc/compobj.c
+++ b/misc/compobj.c
@@ -21,7 +21,7 @@
 /***********************************************************************
  *           CoBuildVersion [COMPOBJ.1]
  */
-DWORD CoBuildVersion()
+DWORD WINAPI CoBuildVersion()
 {
 	dprintf_ole(stddeb,"CoBuildVersion()\n");
 	return (rmm<<16)+rup;
@@ -31,7 +31,7 @@
  *           CoInitialize	[COMPOBJ.2]
  * lpReserved is an IMalloc pointer in 16bit OLE. We just stored it as-is.
  */
-HRESULT CoInitialize(DWORD lpReserved)
+HRESULT WINAPI CoInitialize(DWORD lpReserved)
 {
 	dprintf_ole(stdnimp,"CoInitialize\n");
 	/* remember the LPMALLOC, maybe somebody wants to read it later on */
@@ -42,7 +42,7 @@
 /***********************************************************************
  *           CoUnitialize   [COMPOBJ.3]
  */
-void CoUnitialize()
+void WINAPI CoUnitialize()
 {
 	dprintf_ole(stdnimp,"CoUnitialize()\n");
 }
@@ -50,7 +50,7 @@
 /***********************************************************************
  *           CoGetMalloc    [COMPOBJ.4]
  */
-HRESULT CoGetMalloc(DWORD dwMemContext, DWORD * lpMalloc)
+HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, DWORD * lpMalloc)
 {
 	if(currentMalloc)
 	{
@@ -65,7 +65,7 @@
 /***********************************************************************
  *           CoDisconnectObject
  */
-OLESTATUS CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved )
+OLESTATUS WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved )
 {
     dprintf_ole(stdnimp,"CoDisconnectObject:%p %lx\n",lpUnk,reserved);
     return OLE_OK;
@@ -77,8 +77,7 @@
 
 /* Class id: DWORD-WORD-WORD-BYTES[2]-BYTES[6] */
 
-OLESTATUS
-CLSIDFromString(const LPCSTR idstr, CLSID *id)
+OLESTATUS WINAPI CLSIDFromString(const LPCSTR idstr, CLSID *id)
 {
   BYTE *s = (BYTE *) idstr;
   BYTE *p;
@@ -146,8 +145,7 @@
  *           CLSIDFromString [COMPOBJ.19]
  */
 
-OLESTATUS
-StringFromCLSID(const CLSID *id, LPSTR idstr)
+OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR idstr)
 {
   static const char *hex = "0123456789ABCDEF";
   char *s;
diff --git a/misc/cpu.c b/misc/cpu.c
index d30032f..9fd96cb 100644
--- a/misc/cpu.c
+++ b/misc/cpu.c
@@ -10,8 +10,7 @@
 #include <string.h>
 #include "windows.h"
 
-VOID
-GetSystemInfo(LPSYSTEM_INFO si)
+VOID WINAPI GetSystemInfo(LPSYSTEM_INFO si)
 {
 	static int cache = 0;
 	static SYSTEM_INFO cachedsi;
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 0015d92..707e479 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -284,6 +284,7 @@
  */
 INT32 CRTDLL_atoi(LPCSTR x)
 {
+    if (!x) return 0;
     return atoi(x);
 }
 
@@ -293,6 +294,7 @@
  */
 LONG CRTDLL_atol(LPCSTR x)
 {
+    if (!x) return 0;
     return atol(x);
 }
 
@@ -498,7 +500,7 @@
 /*********************************************************************
  *                  sqrt          (CRTDLL.459)
  */
-float CRTDLL_sqrt(float x)
+double CRTDLL_sqrt(double x)
 {
     return sqrt(x);
 }
diff --git a/misc/error.c b/misc/error.c
index f4f2837..fc2e124 100644
--- a/misc/error.c
+++ b/misc/error.c
@@ -147,7 +147,8 @@
 /***********************************************************************
 *	LogError (KERNEL.324)
 */
-VOID LogError(UINT16 uErr, LPVOID lpvInfo) {
+VOID WINAPI LogError(UINT16 uErr, LPVOID lpvInfo)
+{
 	fprintf(stddeb, "LogError(%s, %p)\n", 
 		GetErrorString(uErr), lpvInfo);
 }
@@ -156,7 +157,8 @@
 /***********************************************************************
 *	LogParamError (KERNEL.325)
 */
-void LogParamError(UINT16 uErr, FARPROC16 lpfn, LPVOID lpvParam) {
+void WINAPI LogParamError(UINT16 uErr, FARPROC16 lpfn, LPVOID lpvParam)
+{
 	/* FIXME: is it possible to get the module name/function
 	 * from the lpfn param?
 	 */
diff --git a/misc/lstr.c b/misc/lstr.c
index 7228e67..64190c3 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -26,25 +26,25 @@
 /* Funny to divide them between user and kernel. */
 
 /* IsCharAlpha USER 433 */
-BOOL16 IsCharAlpha16(CHAR ch)
+BOOL16 WINAPI IsCharAlpha16(CHAR ch)
 {
   return isalpha(ch);   /* This is probably not right for NLS */
 }
 
 /* IsCharAlphanumeric USER 434 */
-BOOL16 IsCharAlphanumeric16(CHAR ch)
+BOOL16 WINAPI IsCharAlphaNumeric16(CHAR ch)
 {
     return isalnum(ch);
 }
 
 /* IsCharUpper USER 435 */
-BOOL16 IsCharUpper16(CHAR ch)
+BOOL16 WINAPI IsCharUpper16(CHAR ch)
 {
   return isupper(ch);
 }
 
 /* IsCharLower USER 436 */
-BOOL16 IsCharLower16(CHAR ch)
+BOOL16 WINAPI IsCharLower16(CHAR ch)
 {
   return islower(ch);
 }
@@ -52,7 +52,7 @@
 /***********************************************************************
  *           AnsiUpper16   (USER.431)
  */
-SEGPTR AnsiUpper16( SEGPTR strOrChar )
+SEGPTR WINAPI AnsiUpper16( SEGPTR strOrChar )
 {
   /* I am not sure if the locale stuff works with toupper, but then again 
      I am not sure if the Linux libc locale stuffs works at all */
@@ -71,7 +71,7 @@
 /***********************************************************************
  *           AnsiUpperBuff16   (USER.437)
  */
-UINT16 AnsiUpperBuff16( LPSTR str, UINT16 len )
+UINT16 WINAPI AnsiUpperBuff16( LPSTR str, UINT16 len )
 {
     UINT32 count = len ? len : 65536;
     for (; count; count--, str++) *str = toupper(*str);
@@ -81,7 +81,7 @@
 /***********************************************************************
  *           AnsiLower16   (USER.432)
  */
-SEGPTR AnsiLower16( SEGPTR strOrChar )
+SEGPTR WINAPI AnsiLower16( SEGPTR strOrChar )
 {
   /* I am not sure if the locale stuff works with toupper, but then again 
      I am not sure if the Linux libc locale stuffs works at all */
@@ -100,7 +100,7 @@
 /***********************************************************************
  *           AnsiLowerBuff16   (USER.438)
  */
-UINT16 AnsiLowerBuff16( LPSTR str, UINT16 len )
+UINT16 WINAPI AnsiLowerBuff16( LPSTR str, UINT16 len )
 {
     UINT32 count = len ? len : 65536;
     for (; count; count--, str++) *str = tolower(*str);
@@ -111,7 +111,7 @@
 /***********************************************************************
  *           AnsiNext16   (USER.472)
  */
-SEGPTR AnsiNext16(SEGPTR current)
+SEGPTR WINAPI AnsiNext16(SEGPTR current)
 {
     return (*(char *)PTR_SEG_TO_LIN(current)) ? current + 1 : current;
 }
@@ -120,7 +120,7 @@
 /***********************************************************************
  *           AnsiPrev16   (USER.473)
  */
-SEGPTR AnsiPrev16( SEGPTR start, SEGPTR current )
+SEGPTR WINAPI AnsiPrev16( SEGPTR start, SEGPTR current )
 {
     return (current == start) ? start : current - 1;
 }
@@ -129,7 +129,7 @@
 /***********************************************************************
  *           OutputDebugString16   (KERNEL.115)
  */
-void OutputDebugString16( LPCSTR str )
+void WINAPI OutputDebugString16( LPCSTR str )
 {
     char *module;
     char *p, *buffer = HeapAlloc( GetProcessHeap(), 0, strlen(str)+1 );
@@ -147,7 +147,7 @@
 /***********************************************************************
  *           OutputDebugString32A   (KERNEL32
  */
-void OutputDebugString32A( LPCSTR str )
+void WINAPI OutputDebugString32A( LPCSTR str )
 {
     OutputDebugString16( str );
 }
@@ -157,7 +157,7 @@
 /***********************************************************************
  *           OutputDebugString32W   (KERNEL32
  */
-void OutputDebugString32W( LPCWSTR str )
+void WINAPI OutputDebugString32W( LPCWSTR str )
 {
     LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
     OutputDebugString32A( p );
@@ -169,7 +169,7 @@
 /***********************************************************************
  *           CharNext32A   (USER32.28)
  */
-LPSTR CharNext32A( LPCSTR ptr )
+LPSTR WINAPI CharNext32A( LPCSTR ptr )
 {
     if (!*ptr) return (LPSTR)ptr;
     if (IsDBCSLeadByte32( *ptr )) return (LPSTR)(ptr + 2);
@@ -180,7 +180,7 @@
 /***********************************************************************
  *           CharNextEx32A   (USER32.29)
  */
-LPSTR CharNextEx32A( WORD codepage, LPCSTR ptr, DWORD flags )
+LPSTR WINAPI CharNextEx32A( WORD codepage, LPCSTR ptr, DWORD flags )
 {
     if (!*ptr) return (LPSTR)ptr;
     if (IsDBCSLeadByteEx( codepage, *ptr )) return (LPSTR)(ptr + 2);
@@ -191,7 +191,7 @@
 /***********************************************************************
  *           CharNextExW   (USER32.30)
  */
-LPWSTR CharNextEx32W(WORD codepage,LPCWSTR x,DWORD flags)
+LPWSTR WINAPI CharNextEx32W(WORD codepage,LPCWSTR x,DWORD flags)
 {
     /* FIXME: add DBCS / codepage stuff */
     if (*x) return (LPWSTR)(x+1);
@@ -201,7 +201,7 @@
 /***********************************************************************
  *           CharNextW   (USER32.31)
  */
-LPWSTR CharNext32W(LPCWSTR x)
+LPWSTR WINAPI CharNext32W(LPCWSTR x)
 {
     if (*x) return (LPWSTR)(x+1);
     else return (LPWSTR)x;
@@ -210,7 +210,7 @@
 /***********************************************************************
  *           CharPrev32A   (USER32.32)
  */
-LPSTR CharPrev32A( LPCSTR start, LPCSTR ptr )
+LPSTR WINAPI CharPrev32A( LPCSTR start, LPCSTR ptr )
 {
     while (*start && (start < ptr))
     {
@@ -225,7 +225,7 @@
 /***********************************************************************
  *           CharPrevEx32A   (USER32.33)
  */
-LPSTR CharPrevEx32A( WORD codepage, LPCSTR start, LPCSTR ptr, DWORD flags )
+LPSTR WINAPI CharPrevEx32A( WORD codepage, LPCSTR start, LPCSTR ptr, DWORD flags )
 {
     while (*start && (start < ptr))
     {
@@ -240,7 +240,7 @@
 /***********************************************************************
  *           CharPrevExW   (USER32.34)
  */
-LPWSTR CharPrevEx32W(WORD codepage,LPCWSTR start,LPCWSTR x,DWORD flags)
+LPWSTR WINAPI CharPrevEx32W(WORD codepage,LPCWSTR start,LPCWSTR x,DWORD flags)
 {
     /* FIXME: add DBCS / codepage stuff */
     if (x>start) return (LPWSTR)(x-1);
@@ -250,7 +250,7 @@
 /***********************************************************************
  *           CharPrevW   (USER32.35)
  */
-LPWSTR CharPrev32W(LPCWSTR start,LPCWSTR x)
+LPWSTR WINAPI CharPrev32W(LPCWSTR start,LPCWSTR x)
 {
     if (x>start) return (LPWSTR)(x-1);
     else return (LPWSTR)x;
@@ -260,7 +260,7 @@
  *           CharLowerA   (USER32.24)
  * FIXME: handle current locale
  */
-LPSTR CharLower32A(LPSTR x)
+LPSTR WINAPI CharLower32A(LPSTR x)
 {
     LPSTR	s;
 
@@ -281,7 +281,7 @@
  *           CharLowerBuffA   (USER32.25)
  * FIXME: handle current locale
  */
-DWORD CharLowerBuff32A(LPSTR x,DWORD buflen)
+DWORD WINAPI CharLowerBuff32A(LPSTR x,DWORD buflen)
 {
     DWORD done=0;
 
@@ -298,7 +298,7 @@
  *           CharLowerBuffW   (USER32.26)
  * FIXME: handle current locale
  */
-DWORD CharLowerBuff32W(LPWSTR x,DWORD buflen)
+DWORD WINAPI CharLowerBuff32W(LPWSTR x,DWORD buflen)
 {
     DWORD done=0;
 
@@ -315,7 +315,7 @@
  *           CharLowerW   (USER32.27)
  * FIXME: handle current locale
  */
-LPWSTR CharLower32W(LPWSTR x)
+LPWSTR WINAPI CharLower32W(LPWSTR x)
 {
     if (HIWORD(x))
     {
@@ -334,7 +334,7 @@
  *           CharUpper32A   (USER32.40)
  * FIXME: handle current locale
  */
-LPSTR CharUpper32A(LPSTR x)
+LPSTR WINAPI CharUpper32A(LPSTR x)
 {
     if (HIWORD(x))
     {
@@ -353,7 +353,7 @@
  *           CharUpperBuffA   (USER32.41)
  * FIXME: handle current locale
  */
-DWORD CharUpperBuff32A(LPSTR x,DWORD buflen)
+DWORD WINAPI CharUpperBuff32A(LPSTR x,DWORD buflen)
 {
     DWORD done=0;
 
@@ -370,7 +370,7 @@
  *           CharUpperBuffW   (USER32.42)
  * FIXME: handle current locale
  */
-DWORD CharUpperBuff32W(LPWSTR x,DWORD buflen)
+DWORD WINAPI CharUpperBuff32W(LPWSTR x,DWORD buflen)
 {
     DWORD done=0;
 
@@ -387,7 +387,7 @@
  *           CharUpperW   (USER32.43)
  * FIXME: handle current locale
  */
-LPWSTR CharUpper32W(LPWSTR x)
+LPWSTR WINAPI CharUpper32W(LPWSTR x)
 {
     if (HIWORD(x))
     {
@@ -406,7 +406,7 @@
  *           IsCharAlphaA   (USER32.330)
  * FIXME: handle current locale
  */
-BOOL32 IsCharAlpha32A(CHAR x)
+BOOL32 WINAPI IsCharAlpha32A(CHAR x)
 {
     return isalpha(x);
 }
@@ -415,7 +415,7 @@
  *           IsCharAlphaNumericA   (USER32.331)
  * FIXME: handle current locale
  */
-BOOL32 IsCharAlphaNumeric32A(CHAR x)
+BOOL32 WINAPI IsCharAlphaNumeric32A(CHAR x)
 {
     return isalnum(x);
 }
@@ -424,7 +424,7 @@
  *           IsCharAlphaNumericW   (USER32.332)
  * FIXME: handle current locale
  */
-BOOL32 IsCharAlphaNumeric32W(WCHAR x)
+BOOL32 WINAPI IsCharAlphaNumeric32W(WCHAR x)
 {
     return isalnum(x);
 }
@@ -433,7 +433,7 @@
  *           IsCharAlphaW   (USER32.333)
  * FIXME: handle current locale
  */
-BOOL32 IsCharAlpha32W(WCHAR x)
+BOOL32 WINAPI IsCharAlpha32W(WCHAR x)
 {
     return isalpha(x);
 }
@@ -442,7 +442,7 @@
  *           IsCharLower32A   (USER32.334)
  * FIXME: handle current locale
  */
-BOOL32 IsCharLower32A(CHAR x)
+BOOL32 WINAPI IsCharLower32A(CHAR x)
 {
     return islower(x);
 }
@@ -451,7 +451,7 @@
  *           IsCharLower32W   (USER32.335)
  * FIXME: handle current locale
  */
-BOOL32 IsCharLower32W(WCHAR x)
+BOOL32 WINAPI IsCharLower32W(WCHAR x)
 {
     return islower(x);
 }
@@ -460,7 +460,7 @@
  *           IsCharUpper32A   (USER32.336)
  * FIXME: handle current locale
  */
-BOOL32 IsCharUpper32A(CHAR x)
+BOOL32 WINAPI IsCharUpper32A(CHAR x)
 {
     return isupper(x);
 }
@@ -469,7 +469,7 @@
  *           IsCharUpper32W   (USER32.337)
  * FIXME: handle current locale
  */
-BOOL32 IsCharUpper32W(WCHAR x)
+BOOL32 WINAPI IsCharUpper32W(WCHAR x)
 {
     return isupper(x);
 }
@@ -478,8 +478,7 @@
  *           FormatMessageA   (KERNEL32.138) Library Version
  * FIXME: missing wrap,FROM_SYSTEM message-loading,
  */
-DWORD
-FormatMessage32A(
+DWORD WINAPI FormatMessage32A(
 	DWORD	dwFlags,
 	LPCVOID	lpSource,
 	DWORD	dwMessageId,
@@ -647,8 +646,8 @@
 /***********************************************************************
  *           FormatMessageA   (KERNEL32.138) Emulator Version
  */
-DWORD
-WIN32_FormatMessage32A(DWORD *args) {
+DWORD WINAPI WIN32_FormatMessage32A(DWORD *args)
+{
 	DWORD	dwFlags		= args[0];
 	LPCVOID	lpSource	= (LPCVOID)args[1];
 	DWORD	dwMessageId	= args[2];
@@ -682,8 +681,7 @@
 	);
 }
 
-DWORD
-FormatMessage32W(
+DWORD WINAPI FormatMessage32W(
 	DWORD	dwFlags,
 	LPCVOID	lpSource,
 	DWORD	dwMessageId,
@@ -851,10 +849,10 @@
 #undef ADD_TO_T
 
 /***********************************************************************
- *           FormatMessageA   (KERNEL32.138) Emulator Version
+ *           FormatMessageW   (KERNEL32.138) Emulator Version
  */
-DWORD
-WIN32_FormatMessage32W(DWORD *args) {
+DWORD WINAPI WIN32_FormatMessage32W(DWORD *args)
+{
 	DWORD	dwFlags		= args[0];
 	LPCVOID	lpSource	= (LPCVOID)args[1];
 	DWORD	dwMessageId	= args[2];
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index 384096e..ba2b02d 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -118,7 +118,7 @@
 /***********************************************************************
  *           LZStart16   (LZEXPAND.7)
  */
-INT16 LZStart16(void)
+INT16 WINAPI LZStart16(void)
 {
     dprintf_file(stddeb,"LZStart16(void)\n");
     return 1;
@@ -128,7 +128,7 @@
 /***********************************************************************
  *           LZStart32   (LZ32.6)
  */
-INT32 LZStart32(void)
+INT32 WINAPI LZStart32(void)
 {
     dprintf_file(stddeb,"LZStart32(void)\n");
     return 1;
@@ -138,7 +138,7 @@
 /***********************************************************************
  *           LZInit16   (LZEXPAND.3)
  */
-HFILE16 LZInit16( HFILE16 hfSrc )
+HFILE16 WINAPI LZInit16( HFILE16 hfSrc )
 {
     return LZInit32( hfSrc );
 }
@@ -156,7 +156,7 @@
  * since _llseek uses the same types as libc.lseek, we just use the macros of 
  *  libc
  */
-HFILE32 LZInit32( HFILE32 hfSrc )
+HFILE32 WINAPI LZInit32( HFILE32 hfSrc )
 {
 
 	struct	lzfileheader	head;
@@ -193,7 +193,7 @@
 /***********************************************************************
  *           LZDone   (LZEXPAND.9) (LZ32.8)
  */
-void LZDone(void)
+void WINAPI LZDone(void)
 {
     dprintf_file(stddeb,"LZDone()\n");
 }
@@ -202,7 +202,7 @@
 /***********************************************************************
  *           GetExpandedName16   (LZEXPAND.10)
  */
-INT16 GetExpandedName16( LPCSTR in, LPSTR out )
+INT16 WINAPI GetExpandedName16( LPCSTR in, LPSTR out )
 {
     return (INT16)GetExpandedName32A( in, out );
 }
@@ -219,7 +219,7 @@
  * "FILE.BL_" (with lastchar 'a') is being translated to "FILE.BLA"
  */
 
-INT32 GetExpandedName32A( LPCSTR in, LPSTR out )
+INT32 WINAPI GetExpandedName32A( LPCSTR in, LPSTR out )
 {
 	struct lzfileheader	head;
 	HFILE32		fd;
@@ -289,7 +289,7 @@
 /***********************************************************************
  *           GetExpandedName32W   (LZ32.11)
  */
-INT32 GetExpandedName32W( LPCWSTR in, LPWSTR out )
+INT32 WINAPI GetExpandedName32W( LPCWSTR in, LPWSTR out )
 {
 	char	*xin,*xout;
 	INT32	ret;
@@ -307,7 +307,7 @@
 /***********************************************************************
  *           LZRead16   (LZEXPAND.5)
  */
-INT16 LZRead16( HFILE16 fd, LPVOID buf, UINT16 toread )
+INT16 WINAPI LZRead16( HFILE16 fd, LPVOID buf, UINT16 toread )
 {
     return LZRead32(fd,buf,toread);
 }
@@ -316,7 +316,7 @@
 /***********************************************************************
  *           LZRead32   (LZ32.4)
  */
-INT32 LZRead32( HFILE32 fd, LPVOID vbuf, UINT32 toread )
+INT32 WINAPI LZRead32( HFILE32 fd, LPVOID vbuf, UINT32 toread )
 {
 	int	i,howmuch;
 	BYTE	b,*buf;
@@ -412,7 +412,7 @@
 /***********************************************************************
  *           LZSeek16   (LZEXPAND.4)
  */
-LONG LZSeek16( HFILE16 fd, LONG off, INT16 type )
+LONG WINAPI LZSeek16( HFILE16 fd, LONG off, INT16 type )
 {
     return LZSeek32( fd, off, type );
 }
@@ -421,7 +421,7 @@
 /***********************************************************************
  *           LZSeek32   (LZ32.3)
  */
-LONG LZSeek32( HFILE32 fd, LONG off, INT32 type )
+LONG WINAPI LZSeek32( HFILE32 fd, LONG off, INT32 type )
 {
 	int	i;
 	struct	lzstate	*lzs;
@@ -459,7 +459,7 @@
 /***********************************************************************
  *           LZCopy16   (LZEXPAND.1)
  */
-LONG LZCopy16( HFILE16 src, HFILE16 dest )
+LONG WINAPI LZCopy16( HFILE16 src, HFILE16 dest )
 {
     return LZCopy32( src, dest );
 }
@@ -472,7 +472,7 @@
  * if src is a LZ compressed file, it will be uncompressed.
  * will return the number of bytes written to dest or errors.
  */
-LONG LZCopy32( HFILE32 src, HFILE32 dest )
+LONG WINAPI LZCopy32( HFILE32 src, HFILE32 dest )
 {
 	int	i,ret,wret;
 	LONG	len;
@@ -530,7 +530,7 @@
 /***********************************************************************
  *           LZOpenFile16   (LZEXPAND.2)
  */
-HFILE16 LZOpenFile16( LPCSTR fn, LPOFSTRUCT ofs, UINT16 mode )
+HFILE16 WINAPI LZOpenFile16( LPCSTR fn, LPOFSTRUCT ofs, UINT16 mode )
 {
     return LZOpenFile32A( fn, ofs, mode );
 }
@@ -541,7 +541,7 @@
  *
  * Opens a file. If not compressed, open it as a normal file.
  */
-HFILE32 LZOpenFile32A( LPCSTR fn, LPOFSTRUCT ofs, UINT32 mode )
+HFILE32 WINAPI LZOpenFile32A( LPCSTR fn, LPOFSTRUCT ofs, UINT32 mode )
 {
 	HFILE32	fd,cfd;
 
@@ -568,7 +568,7 @@
 /***********************************************************************
  *           LZOpenFile32W   (LZ32.10)
  */
-HFILE32 LZOpenFile32W( LPCWSTR fn, LPOFSTRUCT ofs, UINT32 mode )
+HFILE32 WINAPI LZOpenFile32W( LPCWSTR fn, LPOFSTRUCT ofs, UINT32 mode )
 {
 	LPSTR	xfn;
 	LPWSTR	yfn;
@@ -590,7 +590,7 @@
 /***********************************************************************
  *           LZClose16   (LZEXPAND.6)
  */
-void LZClose16( HFILE16 fd )
+void WINAPI LZClose16( HFILE16 fd )
 {
     return LZClose32( fd );
 }
@@ -599,7 +599,7 @@
 /***********************************************************************
  *           LZClose32   (LZ32.5)
  */
-void LZClose32( HFILE32 fd )
+void WINAPI LZClose32( HFILE32 fd )
 {
 	int	i;
 
@@ -622,7 +622,7 @@
 /***********************************************************************
  *           CopyLZFile16   (LZEXPAND.8)
  */
-LONG CopyLZFile16( HFILE16 src, HFILE16 dest )
+LONG WINAPI CopyLZFile16( HFILE16 src, HFILE16 dest )
 {
     dprintf_file(stddeb,"CopyLZFile16(%d,%d)\n",src,dest);
     return LZCopy32(src,dest);
@@ -635,7 +635,7 @@
  * Copy src to dest (including uncompressing src).
  * NOTE: Yes. This is exactly the same function as LZCopy.
  */
-LONG CopyLZFile32( HFILE32 src, HFILE32 dest )
+LONG WINAPI CopyLZFile32( HFILE32 src, HFILE32 dest )
 {
     dprintf_file(stddeb,"CopyLZFile32(%d,%d)\n",src,dest);
     return LZCopy32(src,dest);
diff --git a/misc/main.c b/misc/main.c
index 01cc321..3ef3384 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -102,9 +102,12 @@
 int screenWidth = 0, screenHeight = 0;  /* Desktop window dimensions */
 int screenDepth = 0;  /* Screen depth to use */
 int desktopX = 0, desktopY = 0;  /* Desktop window position (if any) */
-int getVersion16 = 0;
-int getVersion32 = 0;
-OSVERSIONINFO32A getVersionEx;
+
+/* Default version is the same as -winver win31 */
+static LONG getVersion16 = MAKELONG( WINVERSION, 0x0616 ); /* DOS 6.22 */
+static LONG getVersion32 = MAKELONG( 4, 0x1606 ); /* DOS 6.22 */
+static OSVERSIONINFO32A getVersionEx = { sizeof(OSVERSIONINFO32A), 3, 10, 0,
+                                         VER_PLATFORM_WIN32s, "Win32s 1.3" };
 
 struct options Options =
 {  /* default options */
@@ -692,7 +695,7 @@
 /***********************************************************************
  *           MessageBeep16   (USER.104)
  */
-void MessageBeep16( UINT16 i )
+void WINAPI MessageBeep16( UINT16 i )
 {
     MessageBeep32( i );
 }
@@ -701,7 +704,7 @@
 /***********************************************************************
  *           MessageBeep32   (USER32.389)
  */
-BOOL32 MessageBeep32( UINT32 i )
+BOOL32 WINAPI MessageBeep32( UINT32 i )
 {
     XBell( display, 100 );
     return TRUE;
@@ -711,7 +714,7 @@
 /***********************************************************************
  *           Beep   (KERNEL32.11)
  */
-BOOL32 Beep( DWORD dwFreq, DWORD dwDur )
+BOOL32 WINAPI Beep( DWORD dwFreq, DWORD dwDur )
 {
     /* dwFreq and dwDur are ignored by Win95 */
     XBell(display, 100);
@@ -722,43 +725,31 @@
 /***********************************************************************
  *      GetVersion16   (KERNEL.3)
  */
-LONG GetVersion16(void)
+LONG WINAPI GetVersion16(void)
 {
-    if (getVersion16) return getVersion16;
-    return MAKELONG( WINVERSION, WINDOSVER );
+    return getVersion16;
 }
 
 
 /***********************************************************************
  *      GetVersion32
  */
-LONG GetVersion32(void)
+LONG WINAPI GetVersion32(void)
 {
-    if (getVersion32) return getVersion32;
-    return MAKELONG( 4, DOSVERSION);
+    return getVersion32;
 }
 
 
 /***********************************************************************
  *      GetVersionExA
  */
-BOOL32 GetVersionEx32A(OSVERSIONINFO32A *v)
+BOOL32 WINAPI GetVersionEx32A(OSVERSIONINFO32A *v)
 {
     if(v->dwOSVersionInfoSize!=sizeof(OSVERSIONINFO32A))
     {
         fprintf(stddeb,"wrong OSVERSIONINFO size from app");
         return FALSE;
     }
-    if(!getVersion32)
-    {
-        /* Return something like NT 3.5 */
-        v->dwMajorVersion = 3;
-        v->dwMinorVersion = 5;
-        v->dwBuildNumber = 42;
-        v->dwPlatformId = VER_PLATFORM_WIN32_NT;
-        strcpy(v->szCSDVersion, "Wine is not an emulator");
-        return TRUE;
-    }
     v->dwMajorVersion = getVersionEx.dwMajorVersion;
     v->dwMinorVersion = getVersionEx.dwMinorVersion;
     v->dwBuildNumber = getVersionEx.dwBuildNumber;
@@ -771,7 +762,7 @@
 /***********************************************************************
  *     GetVersionExW
  */
-BOOL32 GetVersionEx32W(OSVERSIONINFO32W *v)
+BOOL32 WINAPI GetVersionEx32W(OSVERSIONINFO32W *v)
 {
 	OSVERSIONINFO32A v1;
 	if(v->dwOSVersionInfoSize!=sizeof(OSVERSIONINFO32W))
@@ -792,7 +783,7 @@
 /***********************************************************************
  *	GetWinFlags (KERNEL.132)
  */
-DWORD GetWinFlags(void)
+DWORD WINAPI GetWinFlags(void)
 {
   static const long cpuflags[5] =
     { WF_CPU086, WF_CPU186, WF_CPU286, WF_CPU386, WF_CPU486 };
@@ -827,7 +818,7 @@
 /***********************************************************************
  *          SetEnvironment   (GDI.132)
  */
-INT16 SetEnvironment( LPCSTR lpPortName, LPCSTR lpEnviron, UINT16 nCount )
+INT16 WINAPI SetEnvironment(LPCSTR lpPortName, LPCSTR lpEnviron, UINT16 nCount)
 {
     LPENVENTRY	lpNewEnv;
     LPENVENTRY	lpEnv = lpEnvList;
@@ -896,7 +887,7 @@
 /***********************************************************************
  *           GetEnvironment   (GDI.134)
  */
-INT16 GetEnvironment( LPCSTR lpPortName, LPSTR lpEnviron, UINT16 nMaxSiz )
+INT16 WINAPI GetEnvironment(LPCSTR lpPortName, LPSTR lpEnviron, UINT16 nMaxSiz)
 {
     WORD       nCount;
     LPENVENTRY lpEnv = lpEnvList;
@@ -921,7 +912,7 @@
 /***********************************************************************
  *	GetTimerResolution (USER.14)
  */
-LONG GetTimerResolution(void)
+LONG WINAPI GetTimerResolution(void)
 {
 	return (1000);
 }
@@ -929,8 +920,8 @@
 /***********************************************************************
  *	SystemParametersInfo32A   (USER32.539)
  */
-BOOL32 SystemParametersInfo32A( UINT32 uAction, UINT32 uParam,
-                                LPVOID lpvParam, UINT32 fuWinIni )
+BOOL32 WINAPI SystemParametersInfo32A( UINT32 uAction, UINT32 uParam,
+                                       LPVOID lpvParam, UINT32 fuWinIni )
 {
 	int timeout, temp;
 	XKeyboardState		keyboard_state;
@@ -1007,7 +998,9 @@
 	case SPI_GETICONTITLELOGFONT: {
 		LPLOGFONT32A lpLogFont = (LPLOGFONT32A)lpvParam;
 
-		GetProfileString32A("Desktop", "IconTitleFaceName", "Helvetica", 
+		/* from now on we always have an alias for MS Sans Serif */
+
+		GetProfileString32A("Desktop", "IconTitleFaceName", "MS Sans Serif", 
 			lpLogFont->lfFaceName, LF_FACESIZE );
 		lpLogFont->lfHeight = -GetProfileInt32A("Desktop","IconTitleSize", 8);
 
@@ -1029,16 +1022,26 @@
 			GetSystemMetrics32( SM_CYSCREEN )
 		);
 		break;
-	case SPI_GETNONCLIENTMETRICS: {
-		/* FIXME: implement correctly */
-		LPNONCLIENTMETRICS32A	lpnm=(LPNONCLIENTMETRICS32A)lpvParam;
+	case SPI_GETNONCLIENTMETRICS: 
 
-		SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfCaptionFont),0);
-		SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMenuFont),0);
-		SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfStatusFont),0);
-		SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMessageFont),0);
+#define lpnm ((LPNONCLIENTMETRICS32A)lpvParam)
+		
+		if( lpnm->cbSize == sizeof(NONCLIENTMETRICS32A) )
+		{
+		    /* FIXME: initialize geometry entries */
+
+		    SystemParametersInfo32A(SPI_GETICONTITLELOGFONT, 0,
+							(LPVOID)&(lpnm->lfCaptionFont),0);
+		    SystemParametersInfo32A(SPI_GETICONTITLELOGFONT, 0,
+							(LPVOID)&(lpnm->lfMenuFont),0);
+		    SystemParametersInfo32A(SPI_GETICONTITLELOGFONT, 0,
+							(LPVOID)&(lpnm->lfStatusFont),0);
+		    SystemParametersInfo32A(SPI_GETICONTITLELOGFONT, 0,
+							(LPVOID)&(lpnm->lfMessageFont),0);
+		}
+#undef lpnm
 		break;
-	}
+
 	default:
 		return SystemParametersInfo16(uAction,uParam,lpvParam,fuWinIni);
 	}
@@ -1049,8 +1052,8 @@
 /***********************************************************************
  *	SystemParametersInfo16   (USER.483)
  */
-BOOL16 SystemParametersInfo16( UINT16 uAction, UINT16 uParam,
-                               LPVOID lpvParam, UINT16 fuWinIni )
+BOOL16 WINAPI SystemParametersInfo16( UINT16 uAction, UINT16 uParam,
+                                      LPVOID lpvParam, UINT16 fuWinIni )
 {
 	int timeout, temp;
 	char buffer[256];
@@ -1174,7 +1177,7 @@
 	        {
                     LPLOGFONT16 lpLogFont = (LPLOGFONT16)lpvParam;
 
-		    GetProfileString32A("Desktop", "IconTitleFaceName", "Helvetica", 
+		    GetProfileString32A("Desktop", "IconTitleFaceName", "MS Sans Serif", 
 					lpLogFont->lfFaceName, LF_FACESIZE );
                     lpLogFont->lfHeight = -GetProfileInt32A("Desktop","IconTitleSize", 8);
 
@@ -1190,16 +1193,25 @@
                     lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
                     break;
                 }
-		case SPI_GETNONCLIENTMETRICS: {
-		/* FIXME: implement correctly */
-			LPNONCLIENTMETRICS16	lpnm=(LPNONCLIENTMETRICS16)lpvParam;
+		case SPI_GETNONCLIENTMETRICS:
 
-			SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfCaptionFont),0);
-			SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMenuFont),0);
-			SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfStatusFont),0);
-			SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMessageFont),0);
-			break;
-		}
+#define lpnm ((LPNONCLIENTMETRICS16)lpvParam)
+		    if( lpnm->cbSize == sizeof(NONCLIENTMETRICS16) )
+		    {
+			/* FIXME: initialize geometry entries */
+			SystemParametersInfo16( SPI_GETICONTITLELOGFONT, 0, 
+							(LPVOID)&(lpnm->lfCaptionFont),0);
+			SystemParametersInfo16( SPI_GETICONTITLELOGFONT, 0,
+							(LPVOID)&(lpnm->lfMenuFont),0);
+			SystemParametersInfo16( SPI_GETICONTITLELOGFONT, 0,
+							(LPVOID)&(lpnm->lfStatusFont),0);
+			SystemParametersInfo16( SPI_GETICONTITLELOGFONT, 0,
+							(LPVOID)&(lpnm->lfMessageFont),0);
+		    }
+		    else /* winfile 95 sets sbSize to 340 */
+		        SystemParametersInfo32A( uAction, uParam, lpvParam, fuWinIni );
+#undef lpnm
+		    break;
 
 		case SPI_LANGDRIVER:
 		case SPI_SETBORDER:
@@ -1228,8 +1240,8 @@
 /***********************************************************************
  *	SystemParametersInfo32W   (USER32.540)
  */
-BOOL32 SystemParametersInfo32W( UINT32 uAction, UINT32 uParam,
-                                LPVOID lpvParam, UINT32 fuWinIni )
+BOOL32 WINAPI SystemParametersInfo32W( UINT32 uAction, UINT32 uParam,
+                                       LPVOID lpvParam, UINT32 fuWinIni )
 {
     char buffer[256];
 
@@ -1295,7 +1307,7 @@
 /***********************************************************************
 *	FileCDR (KERNEL.130)
 */
-void FileCDR(FARPROC16 x)
+void WINAPI FileCDR(FARPROC16 x)
 {
 	printf("FileCDR(%8x)\n", (int) x);
 }
@@ -1303,7 +1315,7 @@
 /***********************************************************************
 *	GetWinDebugInfo (KERNEL.355)
 */
-BOOL16 GetWinDebugInfo(WINDEBUGINFO *lpwdi, UINT16 flags)
+BOOL16 WINAPI GetWinDebugInfo(WINDEBUGINFO *lpwdi, UINT16 flags)
 {
 	printf("GetWinDebugInfo(%8lx,%d) stub returning 0\n", (unsigned long)lpwdi, flags);
 	/* 0 means not in debugging mode/version */
@@ -1315,7 +1327,7 @@
 /***********************************************************************
 *	GetWinDebugInfo (KERNEL.355)
 */
-BOOL16 SetWinDebugInfo(WINDEBUGINFO *lpwdi)
+BOOL16 WINAPI SetWinDebugInfo(WINDEBUGINFO *lpwdi)
 {
 	printf("SetWinDebugInfo(%8lx) stub returning 0\n", (unsigned long)lpwdi);
 	/* 0 means not in debugging mode/version */
diff --git a/misc/mpr.c b/misc/mpr.c
index 6c7b674..3679aff 100644
--- a/misc/mpr.c
+++ b/misc/mpr.c
@@ -8,8 +8,7 @@
 #include "stddebug.h"
 #include "debug.h"
 
-DWORD
-WNetGetCachedPassword(
+DWORD WINAPI WNetGetCachedPassword(
 	LPSTR	pbResource,
 	WORD	cbResource,
 	LPSTR	pbPassword,
@@ -22,8 +21,7 @@
 	return 0;
 }
 
-DWORD
-MultinetGetConnectionPerformance32A(
+DWORD WINAPI MultinetGetConnectionPerformance32A(
 	LPNETRESOURCE32A lpNetResource,
 	LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct
 ) {
diff --git a/misc/network.c b/misc/network.c
index 5c1eace..3768fc9 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -35,7 +35,7 @@
 /**************************************************************************
  *              WNetErrorText       [USER.499]
  */
-int WNetErrorText(WORD nError,LPSTR lpszText,WORD cbText)
+int WINAPI WNetErrorText(WORD nError,LPSTR lpszText,WORD cbText)
 {
 	printf("EMPTY STUB !!! WNetErrorText(%x,%p,%x)\n",
 		nError,lpszText,cbText);
@@ -45,7 +45,7 @@
 /**************************************************************************
  *              WNetOpenJob       [USER.501]
  */
-int WNetOpenJob(LPSTR szQueue,LPSTR szJobTitle,WORD nCopies,LPWORD pfh)
+int WINAPI WNetOpenJob(LPSTR szQueue,LPSTR szJobTitle,WORD nCopies,LPWORD pfh)
 {
 	printf("EMPTY STUB !!! WNetOpenJob('%s','%s',%x,%p)\n",
 		szQueue,szJobTitle,nCopies,pfh);
@@ -55,7 +55,7 @@
 /**************************************************************************
  *              WNetCloseJob       [USER.502]
  */
-int WNetCloseJob(WORD fh,LPWORD pidJob,LPSTR szQueue)
+int WINAPI WNetCloseJob(WORD fh,LPWORD pidJob,LPSTR szQueue)
 {
 	printf("EMPTY STUB !!! WNetCloseJob(%x,%p,'%s')\n",
 		fh,pidJob,szQueue);
@@ -65,7 +65,7 @@
 /**************************************************************************
  *              WNetAbortJob       [USER.503]
  */
-int WNetAbortJob(LPSTR szQueue,WORD wJobId)
+int WINAPI WNetAbortJob(LPSTR szQueue,WORD wJobId)
 {
 	printf("EMPTY STUB !!! WNetAbortJob('%s',%x)\n",
 		szQueue,wJobId);
@@ -75,7 +75,7 @@
 /**************************************************************************
  *              WNetHoldJob       [USER.504]
  */
-int WNetHoldJob(LPSTR szQueue,WORD wJobId)
+int WINAPI WNetHoldJob(LPSTR szQueue,WORD wJobId)
 {
 	printf("EMPTY STUB !!! WNetHoldJob('%s',%x)\n",
 		szQueue,wJobId);
@@ -85,7 +85,7 @@
 /**************************************************************************
  *              WNetReleaseJob       [USER.505]
  */
-int WNetReleaseJob(LPSTR szQueue,WORD wJobId)
+int WINAPI WNetReleaseJob(LPSTR szQueue,WORD wJobId)
 {
 	printf("EMPTY STUB !!! WNetReleaseJob('%s',%x)\n",
 		szQueue,wJobId);
@@ -95,7 +95,7 @@
 /**************************************************************************
  *              WNetCancelJob       [USER.506]
  */
-int WNetCancelJob(LPSTR szQueue,WORD wJobId)
+int WINAPI WNetCancelJob(LPSTR szQueue,WORD wJobId)
 {
 	printf("EMPTY STUB !!! WNetCancelJob('%s',%x)\n",
 		szQueue,wJobId);
@@ -105,7 +105,7 @@
 /**************************************************************************
  *              WNetSetJobCopies       [USER.507]
  */
-int WNetSetJobCopies(LPSTR szQueue,WORD wJobId,WORD nCopies)
+int WINAPI WNetSetJobCopies(LPSTR szQueue,WORD wJobId,WORD nCopies)
 {
 	printf("EMPTY STUB !!! WNetSetJobCopies('%s',%x,%x)\n",
 		szQueue,wJobId,nCopies);
@@ -115,7 +115,7 @@
 /**************************************************************************
  *              WNetWatchQueue       [USER.508]
  */
-int WNetWatchQueue(HWND16 hWnd,LPSTR szLocal,LPSTR szUser,WORD nQueue)
+int WINAPI WNetWatchQueue(HWND16 hWnd,LPSTR szLocal,LPSTR szUser,WORD nQueue)
 {
 	printf("EMPTY STUB !!! WNetWatchQueue(%04x,'%s','%s',%x)\n",
 		hWnd,szLocal,szUser,nQueue);
@@ -125,7 +125,7 @@
 /**************************************************************************
  *              WNetUnwatchQueue       [USER.509]
  */
-int WNetUnwatchQueue(LPSTR szQueue)
+int WINAPI WNetUnwatchQueue(LPSTR szQueue)
 {
 	printf("EMPTY STUB !!! WNetUnwatchQueue('%s')\n", szQueue);
 	return WN_NET_ERROR;
@@ -134,7 +134,7 @@
 /**************************************************************************
  *              WNetLockQueueData       [USER.510]
  */
-int WNetLockQueueData(LPSTR szQueue,LPSTR szUser,void *lplpQueueStruct)
+int WINAPI WNetLockQueueData(LPSTR szQueue,LPSTR szUser,void *lplpQueueStruct)
 {
 	printf("EMPTY STUB !!! WNetLockQueueData('%s','%s',%p)\n",
 		szQueue,szUser,lplpQueueStruct);
@@ -144,7 +144,7 @@
 /**************************************************************************
  *              WNetUnlockQueueData       [USER.511]
  */
-int WNetUnlockQueueData(LPSTR szQueue)
+int WINAPI WNetUnlockQueueData(LPSTR szQueue)
 {
 	printf("EMPTY STUB !!! WNetUnlockQueueData('%s')\n",szQueue);
 	return WN_NET_ERROR;
@@ -153,8 +153,8 @@
 /**************************************************************************
  *				WNetGetConnection	[USER.512]
  */
-int WNetGetConnection(LPSTR lpLocalName, 
-	LPSTR lpRemoteName, UINT16 *cbRemoteName)
+int WINAPI WNetGetConnection(LPSTR lpLocalName, 
+                             LPSTR lpRemoteName, UINT16 *cbRemoteName)
 {
     const char *path;
 
@@ -183,7 +183,7 @@
 /**************************************************************************
  *				WNetGetCaps		[USER.513]
  */
-int WNetGetCaps(WORD capability)
+int WINAPI WNetGetCaps(WORD capability)
 {
 	return 0;
 }
@@ -191,7 +191,7 @@
 /**************************************************************************
  *              WNetDeviceMode       [USER.514]
  */
-int WNetDeviceMode(HWND16 hWndOwner)
+int WINAPI WNetDeviceMode(HWND16 hWndOwner)
 {
 	printf("EMPTY STUB !!! WNetDeviceMode(%04x)\n",hWndOwner);
 	return WN_NET_ERROR;
@@ -200,7 +200,7 @@
 /**************************************************************************
  *              WNetBrowseDialog       [USER.515]
  */
-int WNetBrowseDialog(HWND16 hParent,WORD nType,LPSTR szPath)
+int WINAPI WNetBrowseDialog(HWND16 hParent,WORD nType,LPSTR szPath)
 {
 	printf("EMPTY STUB !!! WNetBrowseDialog(%04x,%x,'%s')\n",
 		hParent,nType,szPath);
@@ -210,7 +210,7 @@
 /**************************************************************************
  *				WNetGetUser			[USER.516]
  */
-UINT16 WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
+UINT16 WINAPI WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
 {
 	printf("EMPTY STUB !!! WNetGetUser(%p, %p, %p);\n", 
 							lpLocalName, lpUserName, lpSize);
@@ -220,7 +220,8 @@
 /**************************************************************************
  *				WNetAddConnection	[USER.517]
  */
-UINT16 WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord, LPSTR lpLocalName)
+UINT16 WINAPI WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord,
+                                LPSTR lpLocalName)
 {
 	printf("EMPTY STUB !!! WNetAddConnection('%s', %p, '%s');\n",
 							lpNetPath, lpPassWord, lpLocalName);
@@ -231,7 +232,7 @@
 /**************************************************************************
  *				WNetCancelConnection	[USER.518]
  */
-UINT16 WNetCancelConnection(LPSTR lpName, BOOL16 bForce)
+UINT16 WINAPI WNetCancelConnection(LPSTR lpName, BOOL16 bForce)
 {
     printf("EMPTY STUB !!! WNetCancelConnection('%s', %04X);\n",
            lpName, bForce);
@@ -241,7 +242,7 @@
 /**************************************************************************
  *              WNetGetError       [USER.519]
  */
-int WNetGetError(LPWORD nError)
+int WINAPI WNetGetError(LPWORD nError)
 {
 	printf("EMPTY STUB !!! WNetGetError(%p)\n",nError);
 	return WN_NET_ERROR;
@@ -250,7 +251,7 @@
 /**************************************************************************
  *              WNetGetErrorText       [USER.520]
  */
-int WNetGetErrorText(WORD nError, LPSTR lpBuffer, LPWORD nBufferSize)
+int WINAPI WNetGetErrorText(WORD nError, LPSTR lpBuffer, LPWORD nBufferSize)
 {
 	printf("EMPTY STUB !!! WNetGetErrorText(%x,%p,%p)\n",
 		nError,lpBuffer,nBufferSize);
@@ -260,7 +261,7 @@
 /**************************************************************************
  *              WNetRestoreConnection       [USER.523]
  */
-int WNetRestoreConnection(HWND16 hwndOwner,LPSTR lpszDevice)
+int WINAPI WNetRestoreConnection(HWND16 hwndOwner,LPSTR lpszDevice)
 {
 	printf("EMPTY STUB !!! WNetRestoreConnection(%04x,'%s')\n",
 		hwndOwner,lpszDevice);
@@ -270,7 +271,7 @@
 /**************************************************************************
  *              WNetWriteJob       [USER.524]
  */
-int WNetWriteJob(HANDLE16 hJob,void *lpData,LPWORD lpcbData)
+int WINAPI WNetWriteJob(HANDLE16 hJob,void *lpData,LPWORD lpcbData)
 {
 	printf("EMPTY STUB !!! WNetWriteJob(%04x,%p,%p)\n",
 		hJob,lpData,lpcbData);
@@ -280,7 +281,7 @@
 /**************************************************************************
  *              WnetConnectDialog       [USER.525]
  */
-UINT16 WNetConnectDialog(HWND16 hWndParent, WORD iType)
+UINT16 WINAPI WNetConnectDialog(HWND16 hWndParent, WORD iType)
 {
 	printf("EMPTY STUB !!! WNetConnectDialog(%04x, %4X)\n", hWndParent, iType);
 	return WN_SUCCESS;
@@ -289,7 +290,7 @@
 /**************************************************************************
  *              WNetDisconnectDialog       [USER.526]
  */
-int WNetDisconnectDialog(HWND16 hwndOwner, WORD iType)
+int WINAPI WNetDisconnectDialog(HWND16 hwndOwner, WORD iType)
 {
 	printf("EMPTY STUB !!! WNetDisconnectDialog(%04x,%x)\n",
 		hwndOwner,iType);
@@ -299,7 +300,7 @@
 /**************************************************************************
  *              WnetConnectionDialog     [USER.527]
  */
-UINT16 WNetConnectionDialog(HWND16 hWndParent, WORD iType)
+UINT16 WINAPI WNetConnectionDialog(HWND16 hWndParent, WORD iType)
 {
 	printf("EMPTY STUB !!! WNetConnectionDialog(%04x, %4X)\n", 
 		hWndParent, iType);
@@ -309,7 +310,7 @@
 /**************************************************************************
  *              WNetViewQueueDialog       [USER.528]
  */
-int WNetViewQueueDialog(HWND16 hwndOwner,LPSTR lpszQueue)
+int WINAPI WNetViewQueueDialog(HWND16 hwndOwner,LPSTR lpszQueue)
 {
 	printf("EMPTY STUB !!! WNetViewQueueDialog(%04x,'%s')\n",
 		hwndOwner,lpszQueue);
@@ -319,8 +320,8 @@
 /**************************************************************************
  *              WNetPropertyDialog       [USER.529]
  */
-int WNetPropertyDialog(HWND16 hwndParent,WORD iButton,
-	WORD nPropSel,LPSTR lpszName,WORD nType)
+int WINAPI WNetPropertyDialog(HWND16 hwndParent,WORD iButton,
+                              WORD nPropSel,LPSTR lpszName,WORD nType)
 {
 	printf("EMPTY STUB !!! WNetPropertyDialog(%04x,%x,%x,'%s',%x)\n",
 		hwndParent,iButton,nPropSel,lpszName,nType);
@@ -330,7 +331,7 @@
 /**************************************************************************
  *              WNetGetDirectoryType       [USER.530]
  */
-int WNetGetDirectoryType(LPSTR lpName,void *lpType)
+int WINAPI WNetGetDirectoryType(LPSTR lpName,void *lpType)
 {
 	printf("EMPTY STUB !!! WNetGetDirectoryType('%s',%p)\n",
 		lpName,lpType);
@@ -340,7 +341,7 @@
 /**************************************************************************
  *              WNetDirectoryNotify       [USER.531]
  */
-int WNetDirectoryNotify(HWND16 hwndOwner,void *lpDir,WORD wOper)
+int WINAPI WNetDirectoryNotify(HWND16 hwndOwner,void *lpDir,WORD wOper)
 {
 	printf("EMPTY STUB !!! WNetDirectoryNotify(%04x,%p,%x)\n",
 		hwndOwner,lpDir,wOper);
@@ -350,8 +351,8 @@
 /**************************************************************************
  *              WNetGetPropertyText       [USER.532]
  */
-int WNetGetPropertyText(HWND16 hwndParent,WORD iButton,WORD nPropSel,
-	LPSTR lpszName,WORD nType)
+int WINAPI WNetGetPropertyText(HWND16 hwndParent,WORD iButton,WORD nPropSel,
+                               LPSTR lpszName,WORD nType)
 {
 	printf("EMPTY STUB !!! WNetGetPropertyText(%04x,%x,%x,'%s',%x)\n",
 		hwndParent,iButton,nPropSel,lpszName,nType);
@@ -361,8 +362,8 @@
 /**************************************************************************
  *				WNetAddConnection2	[USER.???]
  */
-UINT16 WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord, 
-		LPSTR lpLocalName, LPSTR lpUserName)
+UINT16 WINAPI WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord, 
+                                 LPSTR lpLocalName, LPSTR lpUserName)
 {
 	printf("EMPTY STUB !!! WNetAddConnection2('%s', %p, '%s', '%s');\n",
 					lpNetPath, lpPassWord, lpLocalName, lpUserName);
@@ -372,7 +373,7 @@
 /**************************************************************************
  *				WNetCloseEnum		[USER.???]
  */
-UINT16 WNetCloseEnum(HANDLE16 hEnum)
+UINT16 WINAPI WNetCloseEnum(HANDLE16 hEnum)
 {
 	printf("EMPTY STUB !!! WNetCloseEnum(%04x);\n", hEnum);
 	return WN_NET_ERROR;
@@ -381,8 +382,8 @@
 /**************************************************************************
  *				WNetEnumResource	[USER.???]
  */
-UINT16 WNetEnumResource(HANDLE16 hEnum, DWORD cRequ, 
-				DWORD *lpCount, LPVOID lpBuf)
+UINT16 WINAPI WNetEnumResource(HANDLE16 hEnum, DWORD cRequ, 
+                               DWORD *lpCount, LPVOID lpBuf)
 {
 	printf("EMPTY STUB !!! WNetEnumResource(%04x, %08lX, %p, %p);\n", 
 							hEnum, cRequ, lpCount, lpBuf);
@@ -392,8 +393,8 @@
 /**************************************************************************
  *				WNetOpenEnum		[USER.???]
  */
-UINT16 WNetOpenEnum(DWORD dwScope, DWORD dwType, 
-                    LPNETRESOURCE lpNet, HANDLE16 *lphEnum)
+UINT16 WINAPI WNetOpenEnum(DWORD dwScope, DWORD dwType, 
+                           LPNETRESOURCE lpNet, HANDLE16 *lphEnum)
 {
 	printf("EMPTY STUB !!! WNetOpenEnum(%08lX, %08lX, %p, %p);\n",
                dwScope, dwType, lpNet, lphEnum);
diff --git a/misc/ntdll.c b/misc/ntdll.c
index cd430dc..43b6a5d 100644
--- a/misc/ntdll.c
+++ b/misc/ntdll.c
@@ -22,24 +22,24 @@
 /**************************************************************************
  *                 RtlLengthRequiredSid			[NTDLL]
  */
-DWORD
-RtlLengthRequiredSid(DWORD nrofsubauths) {
+DWORD WINAPI RtlLengthRequiredSid(DWORD nrofsubauths)
+{
 	return sizeof(DWORD)*nrofsubauths+sizeof(SID);
 }
 
 /**************************************************************************
  *                 RtlLengthSid				[NTDLL]
  */
-DWORD
-RtlLengthSid(LPSID sid) {
+DWORD WINAPI RtlLengthSid(LPSID sid)
+{
 	return sizeof(DWORD)*sid->SubAuthorityCount+sizeof(SID);
 }
 
 /**************************************************************************
  *                 RtlCreateAcl				[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlCreateAcl(LPACL acl,DWORD size,DWORD rev) {
+DWORD /* NTSTATUS */ WINAPI RtlCreateAcl(LPACL acl,DWORD size,DWORD rev)
+{
 	if (rev!=ACL_REVISION)
 		return STATUS_INVALID_PARAMETER;
 	if (size<sizeof(ACL))
@@ -59,8 +59,8 @@
  * looks for the AceCount+1 ACE, and if it is still within the alloced
  * ACL, return a pointer to it
  */
-BOOL32
-RtlFirstFreeAce(LPACL acl,LPACE_HEADER *x) {
+BOOL32 WINAPI RtlFirstFreeAce(LPACL acl,LPACE_HEADER *x)
+{
 	LPACE_HEADER	ace;
 	int		i;
 
@@ -80,8 +80,9 @@
 /**************************************************************************
  *                 RtlAddAce				[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlAddAce(LPACL acl,DWORD rev,DWORD xnrofaces,LPACE_HEADER acestart,DWORD acelen){
+DWORD /* NTSTATUS */  WINAPI RtlAddAce(LPACL acl,DWORD rev,DWORD xnrofaces,
+                                       LPACE_HEADER acestart,DWORD acelen)
+{
 	LPACE_HEADER	ace,targetace;
 	int		nrofaces;
 
@@ -104,8 +105,8 @@
 /**************************************************************************
  *                 RtlCreateSecurityDescriptor		[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlCreateSecurityDescriptor(LPSECURITY_DESCRIPTOR lpsd,DWORD rev) {
+DWORD /* NTSTATUS */ WINAPI RtlCreateSecurityDescriptor(LPSECURITY_DESCRIPTOR lpsd,DWORD rev)
+{
 	if (rev!=SECURITY_DESCRIPTOR_REVISION)
 		return STATUS_UNKNOWN_REVISION;
 	memset(lpsd,'\0',sizeof(*lpsd));
@@ -116,10 +117,8 @@
 /**************************************************************************
  *                 RtlSetDaclSecurityDescriptor		[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlSetDaclSecurityDescriptor (
-LPSECURITY_DESCRIPTOR lpsd,BOOL32 daclpresent,LPACL dacl,BOOL32 dacldefaulted
-) {
+DWORD /* NTSTATUS */ WINAPI RtlSetDaclSecurityDescriptor ( LPSECURITY_DESCRIPTOR lpsd,BOOL32 daclpresent,LPACL dacl,BOOL32 dacldefaulted )
+{
 	if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
 		return STATUS_UNKNOWN_REVISION;
 	if (lpsd->Control & SE_SELF_RELATIVE)
@@ -140,10 +139,10 @@
 /**************************************************************************
  *                 RtlSetSaclSecurityDescriptor		[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlSetSaclSecurityDescriptor (
+DWORD /* NTSTATUS */ WINAPI RtlSetSaclSecurityDescriptor (
 LPSECURITY_DESCRIPTOR lpsd,BOOL32 saclpresent,LPACL sacl,BOOL32 sacldefaulted
-) {
+)
+{
 	if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
 		return STATUS_UNKNOWN_REVISION;
 	if (lpsd->Control & SE_SELF_RELATIVE)
@@ -164,8 +163,8 @@
 /**************************************************************************
  *                 RtlSetOwnerSecurityDescriptor		[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlSetOwnerSecurityDescriptor (LPSECURITY_DESCRIPTOR lpsd,LPSID owner,BOOL32 ownerdefaulted) {
+DWORD /* NTSTATUS */ WINAPI RtlSetOwnerSecurityDescriptor (LPSECURITY_DESCRIPTOR lpsd,LPSID owner,BOOL32 ownerdefaulted)
+{
 	if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
 		return STATUS_UNKNOWN_REVISION;
 	if (lpsd->Control & SE_SELF_RELATIVE)
@@ -182,8 +181,8 @@
 /**************************************************************************
  *                 RtlSetOwnerSecurityDescriptor		[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlSetGroupSecurityDescriptor (LPSECURITY_DESCRIPTOR lpsd,LPSID group,BOOL32 groupdefaulted) {
+DWORD /* NTSTATUS */ WINAPI RtlSetGroupSecurityDescriptor (LPSECURITY_DESCRIPTOR lpsd,LPSID group,BOOL32 groupdefaulted)
+{
 	if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
 		return STATUS_UNKNOWN_REVISION;
 	if (lpsd->Control & SE_SELF_RELATIVE)
@@ -201,8 +200,7 @@
 /**************************************************************************
  *                 RtlNormalizeProcessParams		[NTDLL]
  */
-LPVOID
-RtlNormalizeProcessParams(LPVOID x)
+LPVOID WINAPI RtlNormalizeProcessParams(LPVOID x)
 {
     fprintf(stdnimp,"RtlNormalizeProcessParams(%p), stub.\n",x);
     return x;
@@ -211,8 +209,9 @@
 /**************************************************************************
  *                 RtlInitializeSid			[NTDLL]
  */
-DWORD
-RtlInitializeSid(LPSID lpsid,LPSID_IDENTIFIER_AUTHORITY lpsidauth,DWORD c) {
+DWORD WINAPI RtlInitializeSid(LPSID lpsid,LPSID_IDENTIFIER_AUTHORITY lpsidauth,
+                              DWORD c)
+{
 	BYTE	a = c&0xff;
 
 	if (a>=SID_MAX_SUB_AUTHORITIES)
@@ -226,24 +225,24 @@
 /**************************************************************************
  *                 RtlSubAuthoritySid			[NTDLL]
  */
-LPDWORD
-RtlSubAuthoritySid(LPSID lpsid,DWORD nr) {
+LPDWORD WINAPI RtlSubAuthoritySid(LPSID lpsid,DWORD nr)
+{
 	return &(lpsid->SubAuthority[nr]);
 }
 
 /**************************************************************************
  *                 RtlSubAuthorityCountSid		[NTDLL]
  */
-LPBYTE
-RtlSubAuthorityCountSid(LPSID lpsid) {
+LPBYTE WINAPI RtlSubAuthorityCountSid(LPSID lpsid)
+{
 	return ((LPBYTE)lpsid)+1;
 }
 
 /**************************************************************************
  *                 RtlCopySid				[NTDLL]
  */
-DWORD
-RtlCopySid(DWORD len,LPSID to,LPSID from) {
+DWORD WINAPI RtlCopySid(DWORD len,LPSID to,LPSID from)
+{
 	if (len<(from->SubAuthorityCount*4+8))
 		return STATUS_BUFFER_TOO_SMALL;
 	memmove(to,from,from->SubAuthorityCount*4+8);
@@ -253,8 +252,8 @@
 /**************************************************************************
  *                 RtlAnsiStringToUnicodeString		[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlAnsiStringToUnicodeString(LPUNICODE_STRING uni,LPANSI_STRING ansi,BOOL32 doalloc) {
+DWORD /* NTSTATUS */ WINAPI RtlAnsiStringToUnicodeString(LPUNICODE_STRING uni,LPANSI_STRING ansi,BOOL32 doalloc)
+{
 	DWORD	unilen = (ansi->Length+1)*sizeof(WCHAR);
 
 	if (unilen>0xFFFF)
@@ -275,8 +274,8 @@
 /**************************************************************************
  *                 RtlOemStringToUnicodeString		[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlOemStringToUnicodeString(LPUNICODE_STRING uni,LPSTRING ansi,BOOL32 doalloc) {
+DWORD /* NTSTATUS */ WINAPI RtlOemStringToUnicodeString(LPUNICODE_STRING uni,LPSTRING ansi,BOOL32 doalloc)
+{
 	DWORD	unilen = (ansi->Length+1)*sizeof(WCHAR);
 
 	if (unilen>0xFFFF)
@@ -297,8 +296,8 @@
  *                 RtlMultiByteToUnicodeN		[NTDLL]
  * FIXME: multibyte support
  */
-DWORD /* NTSTATUS */
-RtlMultiByteToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen) {
+DWORD /* NTSTATUS */ WINAPI RtlMultiByteToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen)
+{
 	DWORD	len;
 	LPWSTR	x;
 
@@ -315,8 +314,8 @@
 /**************************************************************************
  *                 RtlOemToUnicodeN			[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlOemToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen) {
+DWORD /* NTSTATUS */ WINAPI RtlOemToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen)
+{
 	DWORD	len;
 	LPWSTR	x;
 
@@ -333,8 +332,8 @@
 /**************************************************************************
  *                 RtlInitString			[NTDLL]
  */
-VOID
-RtlInitAnsiString(LPANSI_STRING target,LPCSTR source) {
+VOID WINAPI RtlInitAnsiString(LPANSI_STRING target,LPCSTR source)
+{
 	target->Length = target->MaximumLength = 0;
 	target->Buffer = (LPSTR)source;
 	if (!source)
@@ -345,8 +344,8 @@
 /**************************************************************************
  *                 RtlInitString			[NTDLL]
  */
-VOID
-RtlInitString(LPSTRING target,LPCSTR source) {
+VOID WINAPI RtlInitString(LPSTRING target,LPCSTR source)
+{
 	target->Length = target->MaximumLength = 0;
 	target->Buffer = (LPSTR)source;
 	if (!source)
@@ -358,8 +357,8 @@
 /**************************************************************************
  *                 RtlInitUnicodeString			[NTDLL]
  */
-VOID
-RtlInitUnicodeString(LPUNICODE_STRING target,LPCWSTR source) {
+VOID WINAPI RtlInitUnicodeString(LPUNICODE_STRING target,LPCWSTR source)
+{
 	target->Length = target->MaximumLength = 0;
 	target->Buffer = (LPWSTR)source;
 	if (!source)
@@ -371,8 +370,8 @@
 /**************************************************************************
  *                 RtlFreeUnicodeString			[NTDLL]
  */
-VOID
-RtlFreeUnicodeString(LPUNICODE_STRING str) {
+VOID WINAPI RtlFreeUnicodeString(LPUNICODE_STRING str)
+{
 	if (str->Buffer)
 		HeapFree(GetProcessHeap(),0,str->Buffer);
 }
@@ -380,8 +379,8 @@
 /**************************************************************************
  *                 RtlUnicodeToOemN			[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlUnicodeToOemN(LPSTR oemstr,DWORD oemlen,LPDWORD reslen,LPWSTR unistr,DWORD unilen) {
+DWORD /* NTSTATUS */ WINAPI RtlUnicodeToOemN(LPSTR oemstr,DWORD oemlen,LPDWORD reslen,LPWSTR unistr,DWORD unilen)
+{
 	DWORD	len;
 	LPSTR	x;
 
@@ -398,8 +397,7 @@
 /**************************************************************************
  *                 RtlUnicodeStringToOemString		[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlUnicodeStringToOemString(LPANSI_STRING oem,LPUNICODE_STRING uni,BOOL32 alloc)
+DWORD /* NTSTATUS */ WINAPI RtlUnicodeStringToOemString(LPANSI_STRING oem,LPUNICODE_STRING uni,BOOL32 alloc)
 {
 	if (alloc) {
 		oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,uni->Length/2)+1;
@@ -413,8 +411,7 @@
 /**************************************************************************
  *                 RtlUnicodeStringToAnsiString		[NTDLL]
  */
-DWORD /* NTSTATUS */
-RtlUnicodeStringToAnsiString(LPUNICODE_STRING uni,LPANSI_STRING oem,BOOL32 alloc)
+DWORD /* NTSTATUS */ WINAPI RtlUnicodeStringToAnsiString(LPUNICODE_STRING uni,LPANSI_STRING oem,BOOL32 alloc)
 {
 	if (alloc) {
 		oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,uni->Length/2)+1;
@@ -428,8 +425,8 @@
 /**************************************************************************
  *                 RtlNtStatusToDosErro			[NTDLL]
  */
-DWORD
-RtlNtStatusToDosError(DWORD error) {
+DWORD WINAPI RtlNtStatusToDosError(DWORD error)
+{
 	/* FIXME: map STATUS_ to ERROR_ */
 	return error;
 }
@@ -437,8 +434,8 @@
 /**************************************************************************
  *                 RtlGetNtProductType			[NTDLL]
  */
-DWORD
-RtlGetNtProductType(LPVOID x) {
+DWORD WINAPI RtlGetNtProductType(LPVOID x)
+{
 	/* FIXME : find documentation for this one */
 	return 0;
 }
@@ -446,8 +443,8 @@
 /**************************************************************************
  *                 RtlUpcaseUnicodeString		[NTDLL]
  */
-DWORD
-RtlUpcaseUnicodeString(LPUNICODE_STRING dest,LPUNICODE_STRING src,BOOL32 doalloc) {
+DWORD WINAPI RtlUpcaseUnicodeString(LPUNICODE_STRING dest,LPUNICODE_STRING src,BOOL32 doalloc)
+{
 	LPWSTR	s,t;
 	DWORD	i,len;
 
@@ -471,16 +468,16 @@
 /**************************************************************************
  *                 RtlxOemStringToUnicodeSize		[NTDLL]
  */
-UINT32
-RtlxOemStringToUnicodeSize(LPSTRING str) {
+UINT32 WINAPI RtlxOemStringToUnicodeSize(LPSTRING str)
+{
 	return str->Length*2+2;
 }
 
 /**************************************************************************
  *                 RtlxAnsiStringToUnicodeSize		[NTDLL]
  */
-UINT32
-RtlxAnsiStringToUnicodeSize(LPANSI_STRING str) {
+UINT32 WINAPI RtlxAnsiStringToUnicodeSize(LPANSI_STRING str)
+{
 	return str->Length*2+2;
 }
 
@@ -489,10 +486,9 @@
  *
  * FIXME: convert to UNC or whatever is expected here
  */
-BOOL32 
-RtlDosPathNameToNtPathName_U(
-	LPWSTR from,LPUNICODE_STRING us,DWORD x2,DWORD x3
-) {
+BOOL32  WINAPI RtlDosPathNameToNtPathName_U(
+	LPWSTR from,LPUNICODE_STRING us,DWORD x2,DWORD x3)
+{
 	LPSTR	fromA = HEAP_strdupWtoA(GetProcessHeap(),0,from);
 
 	fprintf(stderr,"RtlDosPathNameToNtPathName_U(%s,%p,%08lx,%08lx)\n",
@@ -506,8 +502,8 @@
 /**************************************************************************
  *                 NtOpenFile				[NTDLL]
  */
-DWORD
-NtOpenFile(DWORD x1,DWORD flags,DWORD x3,DWORD x4,DWORD alignment,DWORD x6) {
+DWORD WINAPI NtOpenFile(DWORD x1,DWORD flags,DWORD x3,DWORD x4,DWORD alignment,DWORD x6)
+{
 	fprintf(stderr,"NtOpenFile(%08lx,%08lx,%08lx,%08lx,%08lx,%08lx)\n",
 		x1,flags,x3,x4,alignment,x6
 	);
diff --git a/misc/ole2.c b/misc/ole2.c
index 3ca5010..5f65195 100644
--- a/misc/ole2.c
+++ b/misc/ole2.c
@@ -15,7 +15,7 @@
 /***********************************************************************
  *           OleBuildVersion     [OLE.1]
  */
-DWORD OleBuildVersion()
+DWORD WINAPI OleBuildVersion()
 {
 	dprintf_ole(stddeb,"OleBuildVersion()\n");
 	return (rmm<<16)+rup;
@@ -24,7 +24,7 @@
 /***********************************************************************
  *           OleInitialize       [OLE2.2]
  */
-HRESULT OleInitialize(LPVOID reserved)
+HRESULT WINAPI OleInitialize(LPVOID reserved)
 {
     dprintf_ole(stdnimp,"OleInitialize\n");
 	return S_OK;
@@ -33,7 +33,7 @@
 /***********************************************************************
  *           OleUnitialize       [OLE2.3]
  */
-void OleUninitialize()
+void WINAPI OleUninitialize()
 {
 	dprintf_ole(stdnimp,"OleUninitialize()\n");
 }
diff --git a/misc/ole2disp.c b/misc/ole2disp.c
index 69a08bf..76f6181 100644
--- a/misc/ole2disp.c
+++ b/misc/ole2disp.c
@@ -36,7 +36,7 @@
 /***********************************************************************
  *           SysAllocString         [OLE2DISP.2]
  */
-BSTR SysAllocString(char *in)
+BSTR WINAPI SysAllocString(char *in)
 {
 	BSTR out=BSTR_AllocBytes(strlen(in)+1);
 	if(!out)return 0;
@@ -47,7 +47,7 @@
 /***********************************************************************
  *           SysReAllocString       [OLE2DISP.3]
  */
-int SysReAllocString(BSTR *old,char *in)
+int WINAPI SysReAllocString(BSTR *old,char *in)
 {
 	BSTR new=SysAllocString(in);
 	BSTR_Free(*old);
@@ -58,7 +58,7 @@
 /***********************************************************************
  *           SysAllocStringLen      [OLE2DISP.4]
  */
-BSTR SysAllocStringLen(char *in, int len)
+BSTR WINAPI SysAllocStringLen(char *in, int len)
 {
 	BSTR out=BSTR_AllocBytes(len+1);
 	if(!out)return 0;
@@ -69,7 +69,7 @@
 /***********************************************************************
  *           SysReAllocStringLen    [OLE2DISP.5]
  */
-int SysReAllocStringLen(BSTR *old,char *in,int len)
+int WINAPI SysReAllocStringLen(BSTR *old,char *in,int len)
 {
 	BSTR new=SysAllocStringLen(in,len);
 	BSTR_Free(*old);
@@ -80,7 +80,7 @@
 /***********************************************************************
  *           SysFreeString          [OLE2DISP.6]
  */
-void SysFreeString(BSTR in)
+void WINAPI SysFreeString(BSTR in)
 {
 	BSTR_Free(in);
 }
@@ -88,7 +88,7 @@
 /***********************************************************************
  *           SysStringLen           [OLE2DISP.7]
  */
-int SysStringLen(BSTR str)
+int WINAPI SysStringLen(BSTR str)
 {
 	return strlen(BSTR_GetAddr(str));
 }
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index 53ad95ee..df08c93 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -183,7 +183,7 @@
 /***********************************************************************
  *           GetUserDefaultLCID       (OLE2NLS.1)
  */
-DWORD GetUserDefaultLCID()
+DWORD WINAPI GetUserDefaultLCID()
 {
 /* Default sorting, neutral sublanguage */
     switch(Options.language)
@@ -224,7 +224,7 @@
 /***********************************************************************
  *         GetSystemDefaultLCID       (OLE2NLS.2)
  */
-DWORD GetSystemDefaultLCID()
+DWORD WINAPI GetSystemDefaultLCID()
 {
 	return GetUserDefaultLCID();
 }
@@ -232,7 +232,7 @@
 /***********************************************************************
  *         GetUserDefaultLangID       (OLE2NLS.3)
  */
-WORD GetUserDefaultLangID()
+WORD WINAPI GetUserDefaultLangID()
 {
 	return (WORD)GetUserDefaultLCID();
 }
@@ -240,7 +240,7 @@
 /***********************************************************************
  *         GetSystemDefaultLangID     (OLE2NLS.4)
  */
-WORD GetSystemDefaultLangID()
+WORD WINAPI GetSystemDefaultLangID()
 {
 	return GetUserDefaultLangID();
 }
@@ -249,12 +249,12 @@
  *         GetLocaleInfoA             (OLE2NLS.5)
  * Is the last parameter really WORD for Win16?
  */
-INT16 GetLocaleInfo16(LCID lcid,LCTYPE LCType,LPSTR buf,INT16 len)
+INT16 WINAPI GetLocaleInfo16(LCID lcid,LCTYPE LCType,LPSTR buf,INT16 len)
 {
 	return GetLocaleInfo32A(lcid,LCType,buf,len);
 }
 
-INT32 GetLocaleInfo32A(LCID lcid,LCTYPE LCType,LPSTR buf,INT32 len)
+INT32 WINAPI GetLocaleInfo32A(LCID lcid,LCTYPE LCType,LPSTR buf,INT32 len)
 {
 	char	*retString;
 	int	found,i;
@@ -1696,7 +1696,7 @@
  *         GetLocaleInfo32W             (KERNEL32.230)
  * Is the last parameter really WORD for Win16?
  */
-INT32 GetLocaleInfo32W(LCID lcid,LCTYPE LCType,LPWSTR wbuf,INT32 len)
+INT32 WINAPI GetLocaleInfo32W(LCID lcid,LCTYPE LCType,LPWSTR wbuf,INT32 len)
 {
 	LPSTR abuf = (LPSTR)HeapAlloc(GetProcessHeap(),0,len);
 
@@ -1710,8 +1710,8 @@
 /***********************************************************************
  *           CompareString16       (OLE2NLS.8)
  */
-UINT16 CompareString16(DWORD lcid,DWORD fdwStyle,
-	LPCSTR s1,DWORD l1,LPCSTR s2,DWORD l2)
+UINT16 WINAPI CompareString16(DWORD lcid,DWORD fdwStyle,
+                              LPCSTR s1,DWORD l1,LPCSTR s2,DWORD l2)
 {
 	return (UINT16)CompareString32A(lcid,fdwStyle,s1,l1,s2,l2);
 }
@@ -1721,8 +1721,8 @@
  * This implementation ignores the locale
  * FIXME
  */
-UINT32 CompareString32A(DWORD lcid, DWORD fdwStyle, 
-	LPCSTR s1, DWORD l1, LPCSTR s2,DWORD l2)
+UINT32 WINAPI CompareString32A(DWORD lcid, DWORD fdwStyle, 
+                               LPCSTR s1, DWORD l1, LPCSTR s2,DWORD l2)
 {
 	int len,ret;
 	if(fdwStyle & NORM_IGNORENONSPACE)
@@ -1751,8 +1751,8 @@
  * This implementation ignores the locale
  * FIXME
  */
-UINT32 CompareString32W(DWORD lcid, DWORD fdwStyle, 
-	LPCWSTR s1, DWORD l1, LPCWSTR s2,DWORD l2)
+UINT32 WINAPI CompareString32W(DWORD lcid, DWORD fdwStyle, 
+                               LPCWSTR s1, DWORD l1, LPCWSTR s2,DWORD l2)
 {
 	int len,ret;
 	if(fdwStyle & NORM_IGNORENONSPACE)
@@ -1778,7 +1778,7 @@
 /***********************************************************************
  *           SetLocalInfoA       (KERNEL32.499)
  */
-BOOL16 SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data)
+BOOL16 WINAPI SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data)
 {
     fprintf(stdnimp,"SetLocaleInfoA(%ld,%ld,%s)\n",lcid,lctype,data);
     return TRUE;
@@ -1787,7 +1787,8 @@
 /***********************************************************************
  *           IsValidLocale       (KERNEL32.361)
  */
-BOOL32 IsValidLocale(LCID lcid,DWORD flags) {
+BOOL32 WINAPI IsValidLocale(LCID lcid,DWORD flags)
+{
 	/* we support ANY language. Well, at least say that...*/
 	return TRUE;
 }
@@ -1795,7 +1796,8 @@
 /***********************************************************************
  *              EnumSystemLocales32W                (KERNEL32.93)
  */
-BOOL32 EnumSystemLocales32W( LOCALE_ENUMPROC32W lpfnLocaleEnum, DWORD flags )
+BOOL32 WINAPI EnumSystemLocales32W( LOCALE_ENUMPROC32W lpfnLocaleEnum,
+                                    DWORD flags )
 {
 	int	i;
 	BOOL32	ret;
@@ -1838,8 +1840,9 @@
 /***********************************************************************
  *              EnumSystemLocales32A                (KERNEL32.92)
  */
-BOOL32
-EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum,DWORD flags) {
+BOOL32 WINAPI EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum,
+                                   DWORD flags)
+{
 	int	i;
 	CHAR	buffer[200];
 	HKEY	xhkey;
@@ -1872,22 +1875,25 @@
 /***********************************************************************
  *              GetStringTypeA                (OLE2NLS.7)
  */
-BOOL16
-GetStringType16(LCID locale,DWORD dwInfoType,LPCSTR src,INT16 cchSrc,LPWORD chartype) {
+BOOL16 WINAPI GetStringType16(LCID locale,DWORD dwInfoType,LPCSTR src,
+                              INT16 cchSrc,LPWORD chartype)
+{
 	return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
 }
 /***********************************************************************
  *              GetStringTypeA                (KERNEL32.277)
  */
-BOOL32
-GetStringType32A(LCID locale,DWORD dwInfoType,LPCSTR src,INT32 cchSrc,LPWORD chartype) {
+BOOL32 WINAPI GetStringType32A(LCID locale,DWORD dwInfoType,LPCSTR src,
+                               INT32 cchSrc,LPWORD chartype)
+{
 	return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
 }
 /***********************************************************************
  *              GetStringTypeExA                (KERNEL32.276)
  */
-BOOL32
-GetStringTypeEx32A(LCID locale,DWORD dwInfoType,LPCSTR src,INT32 cchSrc,LPWORD chartype) {
+BOOL32 WINAPI GetStringTypeEx32A(LCID locale,DWORD dwInfoType,LPCSTR src,
+                                 INT32 cchSrc,LPWORD chartype)
+{
 	int	i;
 
 	switch (dwInfoType) {
@@ -1922,8 +1928,9 @@
  *              GetStringTypeW                (KERNEL32.279)
  * Yes, this is missing LCID locale. MS fault.
  */
-BOOL32
-GetStringType32W(DWORD dwInfoType,LPCWSTR src,INT32 cchSrc,LPWORD chartype) {
+BOOL32 WINAPI GetStringType32W(DWORD dwInfoType,LPCWSTR src,INT32 cchSrc,
+                               LPWORD chartype)
+{
 	return GetStringTypeEx32W(0/*defaultlocale*/,dwInfoType,src,cchSrc,chartype);
 }
 
@@ -1931,8 +1938,9 @@
  *              GetStringTypeW                (KERNEL32.278)
  * FIXME: unicode chars are assumed chars
  */
-BOOL32
-GetStringTypeEx32W(LCID locale,DWORD dwInfoType,LPCWSTR src,INT32 cchSrc,LPWORD chartype) {
+BOOL32 WINAPI GetStringTypeEx32W(LCID locale,DWORD dwInfoType,LPCWSTR src,
+                                 INT32 cchSrc,LPWORD chartype)
+{
 	int	i;
 
 	switch (dwInfoType) {
@@ -1955,15 +1963,17 @@
 		if (isspace(src[i])) chartype[i]|=C1_SPACE;
 		if (ispunct(src[i])) chartype[i]|=C1_PUNCT;
 		if (iscntrl(src[i])) chartype[i]|=C1_CNTRL;
-		if (isblank(src[i])) chartype[i]|=C1_BLANK;
+/* FIXME: isblank() is a GNU extension */
+/*		if (isblank(src[i])) chartype[i]|=C1_BLANK; */
+                if ((src[i] == ' ') || (src[i] == '\t')) chartype[i]|=C1_BLANK;
 		/* C1_XDIGIT */
 	}
 	return TRUE;
 }
 
 /* VerLanguageName				[VER.10] */
-DWORD
-VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen) {
+DWORD WINAPI VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen)
+{
 	int	i;
 	char	*buf;
 
@@ -1987,14 +1997,16 @@
 }
 
 /* VerLanguageNameA				[VERSION.9] */
-DWORD
-VerLanguageName32A(UINT32 langid,LPSTR langname,UINT32 langnamelen) {
+DWORD WINAPI VerLanguageName32A(UINT32 langid,LPSTR langname,
+                                UINT32 langnamelen)
+{
 	return VerLanguageName16(langid,langname,langnamelen);
 }
 
 /* VerLanguageNameW				[VERSION.10] */
-DWORD
-VerLanguageName32W(UINT32 langid,LPWSTR langname,UINT32 langnamelen) {
+DWORD WINAPI VerLanguageName32W(UINT32 langid,LPWSTR langname,
+                                UINT32 langnamelen)
+{
 	int	i;
 	char	buffer[80];
 	LPWSTR	keyname;
diff --git a/misc/olecli.c b/misc/olecli.c
index 2c7ab88..bdc2aae 100644
--- a/misc/olecli.c
+++ b/misc/olecli.c
@@ -18,8 +18,8 @@
 /***********************************************************************
  *           OleRegisterClientDoc
  */
-OLESTATUS OleRegisterClientDoc(	LPCSTR classname, LPCSTR docname,
-                                LONG reserved, LHCLIENTDOC *hRet )
+OLESTATUS WINAPI OleRegisterClientDoc(	LPCSTR classname, LPCSTR docname,
+                                        LONG reserved, LHCLIENTDOC *hRet )
 {
     dprintf_ole(stdnimp,"OleRegisterClientDoc:%s %s\n",classname,docname);
     *hRet=++OLE_current_handle;
@@ -29,7 +29,7 @@
 /***********************************************************************
  *           OleRenameClientDoc
  */
-OLESTATUS OleRenameClientDoc(LHCLIENTDOC hDoc, LPCSTR newName)
+OLESTATUS WINAPI OleRenameClientDoc(LHCLIENTDOC hDoc, LPCSTR newName)
 {
     dprintf_ole(stdnimp,"OleRenameClientDoc: %ld %s\n",hDoc, newName);
     return OLE_OK;
@@ -38,7 +38,7 @@
 /***********************************************************************
  *           OleRevokeClientDoc
  */
-OLESTATUS OleRevokeClientDoc(LHCLIENTDOC hServerDoc)
+OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC hServerDoc)
 {
     dprintf_ole(stdnimp,"OleRevokeClientDoc:%ld\n",hServerDoc);
     return OLE_OK;
@@ -47,7 +47,7 @@
 /***********************************************************************
  *           OleIsDcMeta
  */
-BOOL16 OleIsDcMeta(HDC16 hdc)
+BOOL16 WINAPI OleIsDcMeta(HDC16 hdc)
 {
 	dprintf_ole(stddeb,"OleIsDCMeta(%04x)\n",hdc);
 	return GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ) != 0;
diff --git a/misc/olesvr.c b/misc/olesvr.c
index b9e41ff..0ebc3e2 100644
--- a/misc/olesvr.c
+++ b/misc/olesvr.c
@@ -17,9 +17,9 @@
 /***********************************************************************
  *           OleRegisterServer
  */
-OLESTATUS OleRegisterServer( LPCSTR name, LPOLESERVER serverStruct,
-                             LHSERVER *hRet, HINSTANCE16 hServer,
-                             OLE_SERVER_USE use )
+OLESTATUS WINAPI OleRegisterServer( LPCSTR name, LPOLESERVER serverStruct,
+                                    LHSERVER *hRet, HINSTANCE16 hServer,
+                                    OLE_SERVER_USE use )
 {
     dprintf_ole(stdnimp,"OleRegisterServer:%s\n",name);
     *hRet=++OLE_current_handle;
@@ -30,7 +30,7 @@
 /***********************************************************************
  *           OleBlockServer
  */
-OLESTATUS OleBlockServer(LHSERVER hServer)
+OLESTATUS WINAPI OleBlockServer(LHSERVER hServer)
 {
     fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
     return OLE_OK;
@@ -39,7 +39,7 @@
 /***********************************************************************
  *           OleUnblockServer
  */
-OLESTATUS OleUnblockServer(LHSERVER hServer, BOOL16 *block)
+OLESTATUS WINAPI OleUnblockServer(LHSERVER hServer, BOOL16 *block)
 {
     fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
     /* no more blocked messages :) */
@@ -50,8 +50,9 @@
 /***********************************************************************
  *           OleRegisterServerDoc
  */
-OLESTATUS OleRegisterServerDoc( LHSERVER hServer, LPCSTR docname,
-                                LPOLESERVERDOC document, LHSERVERDOC *hRet)
+OLESTATUS WINAPI OleRegisterServerDoc( LHSERVER hServer, LPCSTR docname,
+                                       LPOLESERVERDOC document,
+                                       LHSERVERDOC *hRet)
 {
     dprintf_ole(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
     *hRet=++OLE_current_handle;
@@ -61,7 +62,7 @@
 /***********************************************************************
  *           OleRevokeServerDoc
  */
-OLESTATUS OleRevokeServerDoc(LHSERVERDOC hServerDoc)
+OLESTATUS WINAPI OleRevokeServerDoc(LHSERVERDOC hServerDoc)
 {
     dprintf_ole(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
     return OLE_OK;
@@ -70,7 +71,7 @@
 /***********************************************************************
  *           OleRevokeServer
  */
-OLESTATUS OleRevokeServer(LHSERVER hServer)
+OLESTATUS WINAPI OleRevokeServer(LHSERVER hServer)
 {
     dprintf_ole(stdnimp,"OleRevokeServer:%ld\n",hServer);
     return OLE_OK;
diff --git a/misc/printdrv.c b/misc/printdrv.c
index df0bb96..2a6cc30 100644
--- a/misc/printdrv.c
+++ b/misc/printdrv.c
@@ -13,7 +13,7 @@
 #include "winerror.h"
 
 
-INT16 StartDoc16( HDC16 hdc, const DOCINFO16 *lpdoc )
+INT16 WINAPI StartDoc16( HDC16 hdc, const DOCINFO16 *lpdoc )
 {
   INT16 retVal;
   printf("In startdoc16(%p)\n", lpdoc );
@@ -28,17 +28,16 @@
   return retVal;
 }
 
-INT16
-EndDoc16(HDC16 hdc)
+INT16 WINAPI EndDoc16(HDC16 hdc)
 {
   return  Escape16(hdc, ENDDOC, 0, 0, 0);
 }
 
 
 
-DWORD
-DrvGetPrinterData(LPSTR lpPrinter, LPSTR lpProfile, LPDWORD lpType,
-                  LPBYTE lpPrinterData, int cbData, LPDWORD lpNeeded)
+DWORD WINAPI DrvGetPrinterData(LPSTR lpPrinter, LPSTR lpProfile,
+                               LPDWORD lpType, LPBYTE lpPrinterData,
+                               int cbData, LPDWORD lpNeeded)
 {
     fprintf(stderr,"In DrvGetPrinterData ");
     if (HIWORD(lpPrinter))
@@ -55,9 +54,9 @@
 
 
 
-DWORD
-DrvSetPrinterData(LPSTR lpPrinter, LPSTR lpProfile, LPDWORD lpType,
-                  LPBYTE lpPrinterData, DWORD dwSize)
+DWORD WINAPI DrvSetPrinterData(LPSTR lpPrinter, LPSTR lpProfile,
+                               LPDWORD lpType, LPBYTE lpPrinterData,
+                               DWORD dwSize)
 {
     fprintf(stderr,"In DrvSetPrinterData ");
     if (HIWORD(lpPrinter))
@@ -73,4 +72,20 @@
 }
 
 
+INT32 WINAPI DeviceCapabilities32A(LPCSTR printer,LPCSTR target,WORD z,
+                                   LPSTR a,LPDEVMODE32A b)
+{
+    fprintf(stderr,"DeviceCapabilitiesA(%s,%s,%d,%p,%p)\n",printer,target,z,a,b);
+    return 1;   	
+}
+
+LONG WINAPI DocumentProperties32A(HWND32 hWnd,HANDLE32 hPrinter,
+                                LPSTR pDeviceName, LPDEVMODE32A pDevModeOutput,
+                                  LPDEVMODE32A pDevModeInput,DWORD fMode )
+{
+    fprintf(stderr,"DocumentPropertiesA(%d,%d,%s,%p,%p,%d)\n",
+	hWnd,hPrinter,pDeviceName,pDevModeOutput,pDevModeInput,fMode
+    );
+    return 1;
+}
 
diff --git a/misc/registry.c b/misc/registry.c
index 791e5db..56dea7d 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -543,7 +543,7 @@
 	lplpkey= &(lpkey->nextsub);
 	lpxkey	= *lplpkey;
 	while (lpxkey) {
-		if (!lstrcmp32W(lpxkey->keyname,keyname))
+		if (!lstrcmpi32W(lpxkey->keyname,keyname))
 			break;
 		lplpkey	= &(lpxkey->next);
 		lpxkey	= *lplpkey;
@@ -573,7 +573,7 @@
 				break;
 		} else {
 			if (	val->name!=NULL && 
-				!lstrcmp32W(val->name,name)
+				!lstrcmpi32W(val->name,name)
 			)
 				break;
 		}
@@ -1625,7 +1625,7 @@
  */
 
 /* RegOpenKeyExW		[ADVAPI32.150] */
-DWORD RegOpenKeyEx32W(
+DWORD WINAPI RegOpenKeyEx32W(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	DWORD	dwReserved,
@@ -1654,7 +1654,7 @@
 	while (wps[i]) {
 		lpxkey=lpNextKey->nextsub;
 		while (lpxkey) {
-			if (!lstrcmp32W(wps[i],lpxkey->keyname))
+			if (!lstrcmpi32W(wps[i],lpxkey->keyname))
 				break;
 			lpxkey=lpxkey->next;
 		}
@@ -1672,7 +1672,7 @@
 }
 
 /* RegOpenKeyW			[ADVAPI32.151] */
-DWORD RegOpenKey32W(
+DWORD WINAPI RegOpenKey32W(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -1685,7 +1685,7 @@
 
 
 /* RegOpenKeyExA		[ADVAPI32.149] */
-DWORD RegOpenKeyEx32A(
+DWORD WINAPI RegOpenKeyEx32A(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	DWORD	dwReserved,
@@ -1709,7 +1709,7 @@
 }
 
 /* RegOpenKeyA			[ADVAPI32.148] */
-DWORD RegOpenKey32A(
+DWORD WINAPI RegOpenKey32A(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -1721,7 +1721,7 @@
 }
 
 /* RegOpenKey			[SHELL.1] [KERNEL.217] */
-DWORD RegOpenKey16(
+DWORD WINAPI RegOpenKey16(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -1746,7 +1746,7 @@
  */
 
 /* RegCreateKeyExW		[ADVAPI32.131] */
-DWORD RegCreateKeyEx32W(
+DWORD WINAPI RegCreateKeyEx32W(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	DWORD	dwReserved,
@@ -1790,7 +1790,7 @@
 	while (wps[i]) {
 		lpxkey=lpNextKey->nextsub;
 		while (lpxkey) {
-			if (!lstrcmp32W(wps[i],lpxkey->keyname))
+			if (!lstrcmpi32W(wps[i],lpxkey->keyname))
 				break;
 			lpxkey=lpxkey->next;
 		}
@@ -1851,7 +1851,7 @@
 }
 
 /* RegCreateKeyW		[ADVAPI32.132] */
-DWORD RegCreateKey32W(
+DWORD WINAPI RegCreateKey32W(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -1876,7 +1876,7 @@
 }
 
 /* RegCreateKeyExA		[ADVAPI32.130] */
-DWORD RegCreateKeyEx32A(
+DWORD WINAPI RegCreateKeyEx32A(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	DWORD	dwReserved,
@@ -1928,7 +1928,7 @@
 }
 
 /* RegCreateKeyA		[ADVAPI32.129] */
-DWORD RegCreateKey32A(
+DWORD WINAPI RegCreateKey32A(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -1952,7 +1952,7 @@
 }
 
 /* RegCreateKey			[SHELL.2] [KERNEL.218] */
-DWORD RegCreateKey16(
+DWORD WINAPI RegCreateKey16(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -1976,7 +1976,7 @@
  */
 
 /* RegQueryValueExW		[ADVAPI32.158] */
-DWORD RegQueryValueEx32W(
+DWORD WINAPI RegQueryValueEx32W(
 	HKEY	hkey,
 	LPWSTR	lpszValueName,
 	LPDWORD	lpdwReserved,
@@ -2002,7 +2002,7 @@
 	} else {
 		for (i=0;i<lpkey->nrofvalues;i++)
 			if (	lpkey->values[i].name &&
-				!lstrcmp32W(lpszValueName,lpkey->values[i].name)
+				!lstrcmpi32W(lpszValueName,lpkey->values[i].name)
 			)
 				break;
 	}
@@ -2038,7 +2038,7 @@
 }
 
 /* RegQueryValueW		[ADVAPI32.159] */
-DWORD RegQueryValue32W(
+DWORD WINAPI RegQueryValue32W(
 	HKEY	hkey,
 	LPWSTR	lpszSubKey,
 	LPWSTR	lpszData,
@@ -2075,7 +2075,7 @@
 }
 
 /* RegQueryValueExA		[ADVAPI32.157] */
-DWORD RegQueryValueEx32A(
+DWORD WINAPI RegQueryValueEx32A(
 	HKEY	hkey,
 	LPSTR	lpszValueName,
 	LPDWORD	lpdwReserved,
@@ -2151,7 +2151,7 @@
 }
 
 /* RegQueryValueEx		[KERNEL.225] */
-DWORD RegQueryValueEx16(
+DWORD WINAPI RegQueryValueEx16(
 	HKEY	hkey,
 	LPSTR	lpszValueName,
 	LPDWORD	lpdwReserved,
@@ -2174,7 +2174,7 @@
 }
 
 /* RegQueryValueA		[ADVAPI32.156] */
-DWORD RegQueryValue32A(
+DWORD WINAPI RegQueryValue32A(
 	HKEY	hkey,
 	LPSTR	lpszSubKey,
 	LPSTR	lpszData,
@@ -2211,7 +2211,7 @@
 }
 
 /* RegQueryValue		[SHELL.6] [KERNEL.224] */
-DWORD RegQueryValue16(
+DWORD WINAPI RegQueryValue16(
 	HKEY	hkey,
 	LPSTR	lpszSubKey,
 	LPSTR	lpszData,
@@ -2238,7 +2238,7 @@
  */
 
 /* RegSetValueExW		[ADVAPI32.170] */
-DWORD RegSetValueEx32W(
+DWORD WINAPI RegSetValueEx32W(
 	HKEY	hkey,
 	LPWSTR	lpszValueName,
 	DWORD	dwReserved,
@@ -2266,7 +2266,7 @@
 	} else {
 		for (i=0;i<lpkey->nrofvalues;i++)
 			if (	lpkey->values[i].name &&
-				!lstrcmp32W(lpszValueName,lpkey->values[i].name)
+				!lstrcmpi32W(lpszValueName,lpkey->values[i].name)
 			)
 				break;
 	}
@@ -2294,7 +2294,7 @@
 }
 
 /* RegSetValueExA		[ADVAPI32.169] */
-DWORD RegSetValueEx32A(
+DWORD WINAPI RegSetValueEx32A(
 	HKEY	hkey,
 	LPSTR	lpszValueName,
 	DWORD	dwReserved,
@@ -2327,7 +2327,7 @@
 }
 
 /* RegSetValueEx		[KERNEL.226] */
-DWORD RegSetValueEx16(
+DWORD WINAPI RegSetValueEx16(
 	HKEY	hkey,
 	LPSTR	lpszValueName,
 	DWORD	dwReserved,
@@ -2342,7 +2342,7 @@
 }
 
 /* RegSetValueW			[ADVAPI32.171] */
-DWORD RegSetValue32W(
+DWORD WINAPI RegSetValue32W(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	DWORD	dwType,
@@ -2378,7 +2378,7 @@
 
 }
 /* RegSetValueA			[ADVAPI32.168] */
-DWORD RegSetValue32A(
+DWORD WINAPI RegSetValue32A(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	DWORD	dwType,
@@ -2411,7 +2411,7 @@
 }
 
 /* RegSetValue			[KERNEL.221] [SHELL.5] */
-DWORD RegSetValue16(
+DWORD WINAPI RegSetValue16(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	DWORD	dwType,
@@ -2435,7 +2435,7 @@
  */
 
 /* RegEnumKeyExW		[ADVAPI32.139] */
-DWORD RegEnumKeyEx32W(
+DWORD WINAPI RegEnumKeyEx32W(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPWSTR	lpszName,
@@ -2475,7 +2475,7 @@
 }
 
 /* RegEnumKeyW			[ADVAPI32.140] */
-DWORD RegEnumKey32W(
+DWORD WINAPI RegEnumKey32W(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPWSTR	lpszName,
@@ -2489,7 +2489,7 @@
 	return RegEnumKeyEx32W(hkey,iSubkey,lpszName,&lpcchName,NULL,NULL,NULL,&ft);
 }
 /* RegEnumKeyExA		[ADVAPI32.138] */
-DWORD RegEnumKeyEx32A(
+DWORD WINAPI RegEnumKeyEx32A(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPSTR	lpszName,
@@ -2546,7 +2546,7 @@
 }
 
 /* RegEnumKeyA			[ADVAPI32.137] */
-DWORD RegEnumKey32A(
+DWORD WINAPI RegEnumKey32A(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPSTR	lpszName,
@@ -2570,7 +2570,7 @@
 }
 
 /* RegEnumKey			[SHELL.7] [KERNEL.216] */
-DWORD RegEnumKey16(
+DWORD WINAPI RegEnumKey16(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPSTR	lpszName,
@@ -2590,7 +2590,7 @@
  */
 
 /* RegEnumValueW		[ADVAPI32.142] */
-DWORD RegEnumValue32W(
+DWORD WINAPI RegEnumValue32W(
 	HKEY	hkey,
 	DWORD	iValue,
 	LPWSTR	lpszValue,
@@ -2636,7 +2636,7 @@
 }
 
 /* RegEnumValueA		[ADVAPI32.141] */
-DWORD RegEnumValue32A(
+DWORD WINAPI RegEnumValue32A(
 	HKEY	hkey,
 	DWORD	iValue,
 	LPSTR	lpszValue,
@@ -2693,7 +2693,7 @@
 }
 
 /* RegEnumValue			[KERNEL.223] */
-DWORD RegEnumValue16(
+DWORD WINAPI RegEnumValue16(
 	HKEY	hkey,
 	DWORD	iValue,
 	LPSTR	lpszValue,
@@ -2722,7 +2722,7 @@
  *  Close registry key
  */
 /* RegCloseKey			[SHELL.3] [KERNEL.220] [ADVAPI32.126] */
-DWORD RegCloseKey(HKEY hkey) {
+DWORD WINAPI RegCloseKey(HKEY hkey) {
 	dprintf_reg(stddeb,"RegCloseKey(%x)\n",hkey);
 	remove_handle(hkey);
 	return ERROR_SUCCESS;
@@ -2734,7 +2734,7 @@
  * RegDeleteKey16 -> RegDeleteKey32A -> RegDeleteKey32W
  */
 /* RegDeleteKeyW		[ADVAPI32.134] */
-DWORD RegDeleteKey32W(HKEY hkey,LPWSTR lpszSubKey) {
+DWORD WINAPI RegDeleteKey32W(HKEY hkey,LPWSTR lpszSubKey) {
 	LPKEYSTRUCT	*lplpPrevKey,lpNextKey,lpxkey;
 	LPWSTR		*wps;
 	int		wpc,i;
@@ -2754,7 +2754,7 @@
 	while (i<wpc-1) {
 		lpxkey=lpNextKey->nextsub;
 		while (lpxkey) {
-			if (!lstrcmp32W(wps[i],lpxkey->keyname))
+			if (!lstrcmpi32W(wps[i],lpxkey->keyname))
 				break;
 			lpxkey=lpxkey->next;
 		}
@@ -2769,7 +2769,7 @@
 	lpxkey	= lpNextKey->nextsub;
 	lplpPrevKey = &(lpNextKey->nextsub);
 	while (lpxkey) {
-		if (!lstrcmp32W(wps[i],lpxkey->keyname))
+		if (!lstrcmpi32W(wps[i],lpxkey->keyname))
 			break;
 		lplpPrevKey	= &(lpxkey->next);
 		lpxkey		= lpxkey->next;
@@ -2790,7 +2790,7 @@
 }
 
 /* RegDeleteKeyA		[ADVAPI32.133] */
-DWORD RegDeleteKey32A(HKEY hkey,LPCSTR lpszSubKey) {
+DWORD WINAPI RegDeleteKey32A(HKEY hkey,LPCSTR lpszSubKey) {
 	LPWSTR	lpszSubKeyW;
 	DWORD	ret;
 
@@ -2804,7 +2804,7 @@
 }
 
 /* RegDeleteKey			[SHELL.4] [KERNEL.219] */
-DWORD RegDeleteKey16(HKEY hkey,LPCSTR lpszSubKey) {
+DWORD WINAPI RegDeleteKey16(HKEY hkey,LPCSTR lpszSubKey) {
 	dprintf_reg(stddeb,"RegDeleteKey16(%x,%s)\n",
 		hkey,lpszSubKey
 	);
@@ -2818,7 +2818,8 @@
  * RegDeleteValue16 -> RegDeleteValue32A -> RegDeleteValue32W
  */
 /* RegDeleteValueW		[ADVAPI32.136] */
-DWORD RegDeleteValue32W(HKEY hkey,LPWSTR lpszValue) {
+DWORD WINAPI RegDeleteValue32W(HKEY hkey,LPWSTR lpszValue)
+{
 	DWORD		i;
 	LPKEYSTRUCT	lpkey;
 	LPKEYVALUE	val;
@@ -2832,7 +2833,7 @@
 	if (lpszValue) {
 		for (i=0;i<lpkey->nrofvalues;i++)
 			if (	lpkey->values[i].name &&
-				!lstrcmp32W(lpkey->values[i].name,lpszValue)
+				!lstrcmpi32W(lpkey->values[i].name,lpszValue)
 			)
 				break;
 	} else {
@@ -2859,7 +2860,8 @@
 }
 
 /* RegDeleteValueA		[ADVAPI32.135] */
-DWORD RegDeleteValue32A(HKEY hkey,LPSTR lpszValue) {
+DWORD WINAPI RegDeleteValue32A(HKEY hkey,LPSTR lpszValue)
+{
 	LPWSTR	lpszValueW;
 	DWORD	ret;
 
@@ -2871,13 +2873,15 @@
 }
 
 /* RegDeleteValue		[KERNEL.222] */
-DWORD RegDeleteValue16(HKEY hkey,LPSTR lpszValue) {
+DWORD WINAPI RegDeleteValue16(HKEY hkey,LPSTR lpszValue)
+{
 	dprintf_reg( stddeb,"RegDeleteValue16(%x,%s)\n", hkey,lpszValue );
 	return RegDeleteValue32A(hkey,lpszValue);
 }
 
 /* RegFlushKey			[ADVAPI32.143] [KERNEL.227] */
-DWORD RegFlushKey(HKEY hkey) {
+DWORD WINAPI RegFlushKey(HKEY hkey)
+{
 	dprintf_reg(stddeb,"RegFlushKey(%x), STUB.\n",hkey);
 	return SHELL_ERROR_SUCCESS;
 }
@@ -2885,7 +2889,7 @@
 /* FIXME: lpcchXXXX ... is this counting in WCHARS or in BYTEs ?? */
 
 /* RegQueryInfoKeyW		[ADVAPI32.153] */
-DWORD RegQueryInfoKey32W(
+DWORD WINAPI RegQueryInfoKey32W(
 	HKEY	hkey,
 	LPWSTR	lpszClass,
 	LPDWORD	lpcchClass,
@@ -2961,7 +2965,7 @@
 }
 
 /* RegQueryInfoKeyA		[ADVAPI32.152] */
-DWORD RegQueryInfoKey32A(
+DWORD WINAPI RegQueryInfoKey32A(
 	HKEY	hkey,
 	LPSTR	lpszClass,
 	LPDWORD	lpcchClass,
@@ -3014,7 +3018,8 @@
 	return ret;
 }
 /* RegConnectRegistryA		[ADVAPI32.127] */
-DWORD RegConnectRegistry32A(LPCSTR machine,HKEY hkey,LPHKEY reskey) {
+DWORD WINAPI RegConnectRegistry32A(LPCSTR machine,HKEY hkey,LPHKEY reskey)
+{
 	fprintf(stderr,"RegConnectRegistry32A(%s,%08x,%p), STUB.\n",
 		machine,hkey,reskey
 	);
diff --git a/misc/shell.c b/misc/shell.c
index 041fc8b..b3a9ffe 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -62,7 +62,7 @@
 /*************************************************************************
  *				DragAcceptFiles		[SHELL.9]
  */
-void DragAcceptFiles(HWND16 hWnd, BOOL16 b)
+void WINAPI DragAcceptFiles(HWND16 hWnd, BOOL16 b)
 {
     WND* wnd = WIN_FindWndPtr(hWnd);
 
@@ -75,7 +75,8 @@
 /*************************************************************************
  *				DragQueryFile		[SHELL.11]
  */
-UINT16 DragQueryFile(HDROP16 hDrop, WORD wFile, LPSTR lpszFile, WORD wLength)
+UINT16 WINAPI DragQueryFile(HDROP16 hDrop, WORD wFile, LPSTR lpszFile,
+                            WORD wLength)
 {
     /* hDrop is a global memory block allocated with GMEM_SHARE 
      * with DROPFILESTRUCT as a header and filenames following
@@ -116,7 +117,7 @@
 /*************************************************************************
  *				DragFinish		[SHELL.12]
  */
-void DragFinish(HDROP16 h)
+void WINAPI DragFinish(HDROP16 h)
 {
     GlobalFree16((HGLOBAL16)h);
 }
@@ -125,7 +126,7 @@
 /*************************************************************************
  *				DragQueryPoint		[SHELL.13]
  */
-BOOL16 DragQueryPoint(HDROP16 hDrop, POINT16 *p)
+BOOL16 WINAPI DragQueryPoint(HDROP16 hDrop, POINT16 *p)
 {
     LPDROPFILESTRUCT lpDropFileStruct;  
     BOOL16           bRet;
@@ -143,8 +144,7 @@
  *				SHELL_FindExecutable
  * Utility for code sharing between FindExecutable and ShellExecute
  */
-static HINSTANCE16 SHELL_FindExecutable( LPCSTR lpFile, 
-                                         LPCSTR lpDirectory,
+static HINSTANCE32 SHELL_FindExecutable( LPCSTR lpFile, 
                                          LPCSTR lpOperation,
                                          LPSTR lpResult)
 {
@@ -155,15 +155,13 @@
     char command[256];      /* command from registry */
     LONG commandlen=256;    /* This is the most DOS can handle :) */
     char buffer[256];       /* Used to GetProfileString */
-    HINSTANCE16 retval=31;  /* default - 'No association was found' */
+    HINSTANCE32 retval=31;  /* default - 'No association was found' */
     char *tok;              /* token pointer */
     int i;                  /* random counter */
     char xlpFile[256];      /* result of SearchPath */
 
-    dprintf_exec(stddeb, "SHELL_FindExecutable: File %s, Dir %s\n", 
-		 (lpFile != NULL?lpFile:"-"), 
-		 (lpDirectory != NULL?lpDirectory:"-"));
-
+    dprintf_exec(stddeb, "SHELL_FindExecutable: %s\n",
+                 (lpFile != NULL?lpFile:"-") );
     lpResult[0]='\0'; /* Start off with an empty return string */
 
     /* trap NULL parameters on entry */
@@ -172,7 +170,8 @@
 	/* FIXME - should throw a warning, perhaps! */
 	return 2; /* File not found. Close enough, I guess. */
     }
-    if (SearchPath32A(lpDirectory,lpFile,".exe",sizeof(xlpFile),xlpFile,NULL))
+
+    if (SearchPath32A( NULL, lpFile,".exe",sizeof(xlpFile),xlpFile,NULL))
         lpFile = xlpFile;
 
     /* First thing we need is the file's extension */
@@ -215,7 +214,7 @@
 				 * attached */
 				dprintf_exec(stddeb, "SHELL_FindExecutable: found %s\n",
 							 lpResult);
-	    return 33;
+                                return 33;
 
 		/* Greater than 32 to indicate success FIXME According to the
 		 * docs, I should be returning a handle for the
@@ -292,11 +291,12 @@
 /*************************************************************************
  *				ShellExecute16		[SHELL.20]
  */
-HINSTANCE16 ShellExecute16( HWND16 hWnd, LPCSTR lpOperation, LPCSTR lpFile,
-                            LPCSTR lpParameters, LPCSTR lpDirectory,
-                            INT16 iShowCmd )
+HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation,
+                                   LPCSTR lpFile, LPCSTR lpParameters,
+                                   LPCSTR lpDirectory, INT16 iShowCmd )
 {
     HINSTANCE16 retval=31;
+    char old_dir[1024];
     char cmd[256];
 
     dprintf_exec(stddeb, "ShellExecute(%04x,'%s','%s','%s','%s',%x)\n",
@@ -308,30 +308,36 @@
     if (lpOperation==NULL) /* default is open */
       lpOperation="open";
 
-    retval = SHELL_FindExecutable( lpFile, lpDirectory, lpOperation, cmd );
-
-    if ( retval <= 32 )
+    if (lpDirectory)
     {
-	return retval;
+        GetCurrentDirectory32A( sizeof(old_dir), old_dir );
+        SetCurrentDirectory32A( lpDirectory );
     }
 
-    if (lpParameters)
-    {
-	strcat(cmd," ");
-	strcat(cmd,lpParameters);
-    }
+    retval = SHELL_FindExecutable( lpFile, lpOperation, cmd );
 
-    dprintf_exec(stddeb,"ShellExecute:starting %s\n",cmd);
-    return WinExec32(cmd,iShowCmd);
+    if (retval > 32)  /* Found */
+    {
+        if (lpParameters)
+        {
+            strcat(cmd," ");
+            strcat(cmd,lpParameters);
+        }
+
+        dprintf_exec(stddeb,"ShellExecute:starting %s\n",cmd);
+        retval = WinExec32( cmd, iShowCmd );
+    }
+    if (lpDirectory) SetCurrentDirectory32A( old_dir );
+    return retval;
 }
 
 
 /*************************************************************************
  *             ShellExecute32A   (SHELL32.84)
  */
-HINSTANCE32 ShellExecute32A( HWND32 hWnd, LPCSTR lpOperation, LPCSTR lpFile,
-                             LPCSTR lpParameters, LPCSTR lpDirectory,
-                             INT32 iShowCmd )
+HINSTANCE32 WINAPI ShellExecute32A( HWND32 hWnd, LPCSTR lpOperation,
+                                    LPCSTR lpFile, LPCSTR lpParameters,
+                                    LPCSTR lpDirectory, INT32 iShowCmd )
 {
     return ShellExecute16( hWnd, lpOperation, lpFile, lpParameters,
                            lpDirectory, iShowCmd );
@@ -341,10 +347,20 @@
 /*************************************************************************
  *             FindExecutable16   (SHELL.21)
  */
-HINSTANCE16 FindExecutable16( LPCSTR lpFile, LPCSTR lpDirectory,
-                              LPSTR lpResult )
+HINSTANCE16 WINAPI FindExecutable16( LPCSTR lpFile, LPCSTR lpDirectory,
+                                     LPSTR lpResult )
 {
-    HINSTANCE16 retval=31;    /* default - 'No association was found' */
+    return (HINSTANCE16)FindExecutable32A( lpFile, lpDirectory, lpResult );
+}
+
+/*************************************************************************
+ *             FindExecutable32A   (SHELL32.184)
+ */
+HINSTANCE32 WINAPI FindExecutable32A( LPCSTR lpFile, LPCSTR lpDirectory,
+                                      LPSTR lpResult )
+{
+    HINSTANCE32 retval=31;    /* default - 'No association was found' */
+    char old_dir[1024];
 
     dprintf_exec(stddeb, "FindExecutable: File %s, Dir %s\n", 
 		 (lpFile != NULL?lpFile:"-"), 
@@ -359,10 +375,16 @@
 	return 2; /* File not found. Close enough, I guess. */
     }
 
-    retval = SHELL_FindExecutable( lpFile, lpDirectory, "open",
-				  lpResult );
+    if (lpDirectory)
+    {
+        GetCurrentDirectory32A( sizeof(old_dir), old_dir );
+        SetCurrentDirectory32A( lpDirectory );
+    }
+
+    retval = SHELL_FindExecutable( lpFile, "open", lpResult );
 
     dprintf_exec(stddeb, "FindExecutable: returning %s\n", lpResult);
+    if (lpDirectory) SetCurrentDirectory32A( old_dir );
     return retval;
 }
 
@@ -377,8 +399,8 @@
 /*************************************************************************
  *             AboutDlgProc32  (not an exported API function)
  */
-LRESULT AboutDlgProc32( HWND32 hWnd, UINT32 msg, WPARAM32 wParam,
-                        LPARAM lParam )
+LRESULT WINAPI AboutDlgProc32( HWND32 hWnd, UINT32 msg, WPARAM32 wParam,
+                               LPARAM lParam )
 {
     char Template[512], AppTitle[512];
 
@@ -413,8 +435,8 @@
 /*************************************************************************
  *             AboutDlgProc16   (SHELL.33)
  */
-LRESULT AboutDlgProc16( HWND16 hWnd, UINT16 msg, WPARAM16 wParam,
-                        LPARAM lParam )
+LRESULT WINAPI AboutDlgProc16( HWND16 hWnd, UINT16 msg, WPARAM16 wParam,
+                               LPARAM lParam )
 {
     return AboutDlgProc32( hWnd, msg, wParam, lParam );
 }
@@ -423,8 +445,8 @@
 /*************************************************************************
  *             ShellAbout16   (SHELL.22)
  */
-BOOL16 ShellAbout16( HWND16 hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
-                     HICON16 hIcon )
+BOOL16 WINAPI ShellAbout16( HWND16 hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
+                            HICON16 hIcon )
 {
     return ShellAbout32A( hWnd, szApp, szOtherStuff, hIcon );
 }
@@ -432,8 +454,8 @@
 /*************************************************************************
  *             ShellAbout32A   (SHELL32.82)
  */
-BOOL32 ShellAbout32A( HWND32 hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
-                      HICON32 hIcon )
+BOOL32 WINAPI ShellAbout32A( HWND32 hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
+                             HICON32 hIcon )
 {
     ABOUT_INFO info;
     info.szApp        = szApp;
@@ -449,8 +471,8 @@
 /*************************************************************************
  *             ShellAbout32W   (SHELL32.83)
  */
-BOOL32 ShellAbout32W( HWND32 hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff,
-                      HICON32 hIcon )
+BOOL32 WINAPI ShellAbout32W( HWND32 hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff,
+                             HICON32 hIcon )
 {
     BOOL32 ret;
     ABOUT_INFO info;
@@ -604,7 +626,9 @@
  *
  * This abortion is called directly by Progman
  */
-HGLOBAL16 InternalExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, UINT16 nIconIndex, WORD n )
+HGLOBAL16 WINAPI InternalExtractIcon(HINSTANCE16 hInstance,
+                                     LPCSTR lpszExeFileName, UINT16 nIconIndex,
+                                     WORD n )
 {
   HGLOBAL16 	hRet = 0;
   HGLOBAL16*	RetPtr = NULL;
@@ -706,8 +730,8 @@
 /*************************************************************************
  *             ExtractIcon16   (SHELL.34)
  */
-HICON16 ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
-                       UINT16 nIconIndex )
+HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
+                              UINT16 nIconIndex )
 {
   HGLOBAL16 handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1);
 
@@ -726,8 +750,8 @@
 /*************************************************************************
  *             ExtractIcon32A   (SHELL32.20)
  */
-HICON32 ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName,
-                        UINT32 nIconIndex )
+HICON32 WINAPI ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName,
+                               UINT32 nIconIndex )
 {
     /* FIXME */
     return ExtractIcon16( hInstance, lpszExeFileName, nIconIndex );
@@ -740,7 +764,8 @@
  * Return icon for given file (either from file itself or from associated
  * executable) and patch parameters if needed.
  */
-HICON16 ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,LPWORD lpiIcon)
+HICON16 WINAPI ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,
+                                     LPWORD lpiIcon)
 {
     HICON16 hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
 
@@ -794,7 +819,7 @@
   return NULL;
 }
 
-SEGPTR FindEnvironmentString(LPSTR str)
+SEGPTR WINAPI FindEnvironmentString(LPSTR str)
 {
  SEGPTR  spEnv = GetDOSEnvironment();
  LPSTR  lpEnv = (LPSTR)PTR_SEG_TO_LIN(spEnv);
@@ -813,7 +838,7 @@
  * Replace %KEYWORD% in the str with the value of variable KEYWORD
  * from "DOS" environment.
  */
-DWORD DoEnvironmentSubst(LPSTR str,WORD length)
+DWORD WINAPI DoEnvironmentSubst(LPSTR str,WORD length)
 {
   LPSTR   lpEnv = (LPSTR)PTR_SEG_TO_LIN(GetDOSEnvironment());
   LPSTR   lpBuffer = (LPSTR)HeapAlloc( GetProcessHeap(), 0, length);
@@ -886,7 +911,7 @@
  *				ShellHookProc		[SHELL.103]
  * System-wide WH_SHELL hook.
  */
-LRESULT ShellHookProc(INT16 code, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI ShellHookProc(INT16 code, WPARAM16 wParam, LPARAM lParam)
 {
     dprintf_reg(stddeb,"ShellHookProc: %i, %04x, %08x\n", code, wParam, 
 						      (unsigned)lParam );
@@ -907,7 +932,7 @@
 /*************************************************************************
  *				RegisterShellHook	[SHELL.102]
  */
-BOOL32 RegisterShellHook(HWND16 hWnd, UINT16 uAction)
+BOOL32 WINAPI RegisterShellHook(HWND16 hWnd, UINT16 uAction)
 {
     dprintf_reg(stddeb,"RegisterShellHook: %04x [%u]\n", hWnd, uAction );
 
@@ -948,10 +973,10 @@
 /*************************************************************************
  *				SHGetFileInfoA		[SHELL32.54]
  */
-DWORD
-SHGetFileInfo32A(LPCSTR path,DWORD dwFileAttributes,SHFILEINFO32A *psfi,
-	UINT32 sizeofpsfi,UINT32 flags
-) {
+DWORD WINAPI SHGetFileInfo32A(LPCSTR path,DWORD dwFileAttributes,
+                              SHFILEINFO32A *psfi, UINT32 sizeofpsfi,
+                              UINT32 flags )
+{
 	fprintf(stdnimp,"SHGetFileInfo32A(%s,0x%08lx,%p,%d,0x%08x)\n",
 		path,dwFileAttributes,psfi,sizeofpsfi,flags
 	);
@@ -961,8 +986,8 @@
 /*************************************************************************
  *				CommandLineToArgvW	[SHELL32.2]
  */
-LPWSTR*
-CommandLineToArgvW(LPWSTR cmdline,LPDWORD numargs) {
+LPWSTR* WINAPI CommandLineToArgvW(LPWSTR cmdline,LPDWORD numargs)
+{
 	LPWSTR	*argv,s,t;
 	int	i;
 
diff --git a/misc/sound.c b/misc/sound.c
index 7c06aea..452a6f7 100644
--- a/misc/sound.c
+++ b/misc/sound.c
@@ -7,181 +7,183 @@
 #include <stdio.h>
 #include "windows.h"
 
-INT16 OpenSound16(void)
+INT16 WINAPI OpenSound16(void)
 {
   printf("OpenSound16()\n");
   return -1;
 }
 
-void OpenSound32(void)
+void WINAPI OpenSound32(void)
 {
   printf("OpenSound32()\n");
 }
 
-void CloseSound(void)
+void WINAPI CloseSound(void)
 {
   printf("CloseSound()\n");
 }
 
-INT16 SetVoiceQueueSize16(INT16 nVoice, INT16 nBytes)
+INT16 WINAPI SetVoiceQueueSize16(INT16 nVoice, INT16 nBytes)
 {
   printf("SetVoiceQueueSize16 (%d,%d)\n",nVoice,nBytes);
   return 0;
 }
 
-DWORD SetVoiceQueueSize32(DWORD nVoice, DWORD nBytes)
+DWORD WINAPI SetVoiceQueueSize32(DWORD nVoice, DWORD nBytes)
 {
   printf("SetVoiceQueueSize32 (%ld,%ld)\n",nVoice,nBytes);
   return 0;
 }
 
-INT16 SetVoiceNote16(INT16 nVoice, INT16 nValue, INT16 nLength, INT16 nCdots)
+INT16 WINAPI SetVoiceNote16(INT16 nVoice, INT16 nValue, INT16 nLength,
+                            INT16 nCdots)
 {
   printf("SetVoiceNote16 (%d,%d,%d,%d)\n",nVoice,nValue,nLength,nCdots);
   return 0;
 }
 
-DWORD SetVoiceNote32(DWORD nVoice, DWORD nValue, DWORD nLength, DWORD nCdots)
+DWORD WINAPI SetVoiceNote32(DWORD nVoice, DWORD nValue, DWORD nLength,
+                            DWORD nCdots)
 {
   printf("SetVoiceNote32 (%ld,%ld,%ld,%ld)\n",nVoice,nValue,nLength,nCdots);
   return 0;
 }
 
-INT16 SetVoiceAccent16(INT16 nVoice, INT16 nTempo, INT16 nVolume,
-                       INT16 nMode, INT16 nPitch)
+INT16 WINAPI SetVoiceAccent16(INT16 nVoice, INT16 nTempo, INT16 nVolume,
+                              INT16 nMode, INT16 nPitch)
 {
   printf("SetVoiceAccent16(%d,%d,%d,%d,%d)\n", nVoice, nTempo, 
 	 nVolume, nMode, nPitch);
   return 0;
 }
 
-DWORD SetVoiceAccent32(DWORD nVoice, DWORD nTempo, DWORD nVolume,
-                       DWORD nMode, DWORD nPitch)
+DWORD WINAPI SetVoiceAccent32(DWORD nVoice, DWORD nTempo, DWORD nVolume,
+                              DWORD nMode, DWORD nPitch)
 {
   printf("SetVoiceAccent32(%ld,%ld,%ld,%ld,%ld)\n", nVoice, nTempo, 
 	 nVolume, nMode, nPitch);
   return 0;
 }
 
-INT16 SetVoiceEnvelope16(INT16 nVoice, INT16 nShape, INT16 nRepeat)
+INT16 WINAPI SetVoiceEnvelope16(INT16 nVoice, INT16 nShape, INT16 nRepeat)
 {
   printf("SetVoiceEnvelope16(%d,%d,%d)\n",nVoice,nShape,nRepeat);
   return 0;
 }
 
-DWORD SetVoiceEnvelope32(DWORD nVoice, DWORD nShape, DWORD nRepeat)
+DWORD WINAPI SetVoiceEnvelope32(DWORD nVoice, DWORD nShape, DWORD nRepeat)
 {
   printf("SetVoiceEnvelope32(%ld,%ld,%ld)\n",nVoice,nShape,nRepeat);
   return 0;
 }
 
-INT16 SetSoundNoise16(INT16 nSource, INT16 nDuration)
+INT16 WINAPI SetSoundNoise16(INT16 nSource, INT16 nDuration)
 {
   printf("SetSoundNoise16(%d,%d)\n",nSource,nDuration);
   return 0;
 }
 
-DWORD SetSoundNoise32(DWORD nSource, DWORD nDuration)
+DWORD WINAPI SetSoundNoise32(DWORD nSource, DWORD nDuration)
 {
   printf("SetSoundNoise32(%ld,%ld)\n",nSource,nDuration);
   return 0;
 }
 
-INT16 SetVoiceSound16(INT16 nVoice, DWORD lFrequency, INT16 nDuration)
+INT16 WINAPI SetVoiceSound16(INT16 nVoice, DWORD lFrequency, INT16 nDuration)
 {
   printf("SetVoiceSound16(%d, %ld, %d)\n",nVoice,lFrequency, nDuration);
   return 0;
 }
 
-DWORD SetVoiceSound32(DWORD nVoice, DWORD lFrequency, DWORD nDuration)
+DWORD WINAPI SetVoiceSound32(DWORD nVoice, DWORD lFrequency, DWORD nDuration)
 {
   printf("SetVoiceSound32(%ld, %ld, %ld)\n",nVoice,lFrequency, nDuration);
   return 0;
 }
 
-INT16 StartSound16(void)
+INT16 WINAPI StartSound16(void)
 {
   return 0;
 }
 
-INT16 StopSound16(void)
+INT16 WINAPI StopSound16(void)
 {
   return 0;
 }
 
-INT16 WaitSoundState16(INT16 x)
+INT16 WINAPI WaitSoundState16(INT16 x)
 {
     fprintf(stderr, "WaitSoundState16(%d)\n", x);
     return 0;
 }
 
-DWORD WaitSoundState32(DWORD x)
+DWORD WINAPI WaitSoundState32(DWORD x)
 {
     fprintf(stderr, "WaitSoundState32(%ld)\n", x);
     return 0;
 }
 
-INT16 SyncAllVoices16(void)
+INT16 WINAPI SyncAllVoices16(void)
 {
     fprintf(stderr, "SyncAllVoices16()\n");
     return 0;
 }
 
-DWORD SyncAllVoices32(void)
+DWORD WINAPI SyncAllVoices32(void)
 {
     fprintf(stderr, "SyncAllVoices32()\n");
     return 0;
 }
 
-INT16 CountVoiceNotes16(INT16 x)
+INT16 WINAPI CountVoiceNotes16(INT16 x)
 {
     fprintf(stderr, "CountVoiceNotes16(%d)\n", x);
     return 0;
 }
 
-DWORD CountVoiceNotes32(DWORD x)
+DWORD WINAPI CountVoiceNotes32(DWORD x)
 {
     fprintf(stderr, "CountVoiceNotes32(%ld)\n", x);
     return 0;
 }
 
-LPINT16 GetThresholdEvent16(void)
+LPINT16 WINAPI GetThresholdEvent16(void)
 {
     fprintf(stderr, "GetThresholdEvent16()\n");
     return NULL;
 }
 
-LPDWORD GetThresholdEvent32(void)
+LPDWORD WINAPI GetThresholdEvent32(void)
 {
     fprintf(stderr, "GetThresholdEvent32()\n");
     return NULL;
 }
 
-INT16 GetThresholdStatus16(void)
+INT16 WINAPI GetThresholdStatus16(void)
 {
     fprintf(stderr, "GetThresholdStatus16()\n");
     return 0;
 }
 
-DWORD GetThresholdStatus32(void)
+DWORD WINAPI GetThresholdStatus32(void)
 {
     fprintf(stderr, "GetThresholdStatus32()\n");
     return 0;
 }
 
-INT16 SetVoiceThreshold16(INT16 a, INT16 b)
+INT16 WINAPI SetVoiceThreshold16(INT16 a, INT16 b)
 {
 	fprintf(stderr, "SetVoiceThreshold16(%d,%d)\n", a, b);
         return 0;
 }
 
-DWORD SetVoiceThreshold32(DWORD a, DWORD b)
+DWORD WINAPI SetVoiceThreshold32(DWORD a, DWORD b)
 {
     fprintf(stderr, "SetVoiceThreshold32(%ld,%ld)\n", a, b);
     return 0;
 }
 
-void DoBeep(void)
+void WINAPI DoBeep(void)
 {
 	fprintf(stderr, "BEEP!\n");
 }
diff --git a/misc/stress.c b/misc/stress.c
index d800323..6b4e2fe 100644
--- a/misc/stress.c
+++ b/misc/stress.c
@@ -8,14 +8,14 @@
 #include "debug.h"
 
 
-int AllocDiskSpace(long lLeft, UINT16 uDrive)
+int WINAPI AllocDiskSpace(long lLeft, UINT16 uDrive)
 {
 	dprintf_stress(stdnimp, "stress.dll: AllocDiskSpace %d, %ld\n", uDrive, lLeft);
 
 	return 1;
 }
 
-int AllocFileHandles(int Left)
+int WINAPI AllocFileHandles(int Left)
 {
 	dprintf_stress(stddeb, "stress.dll: AllocFileHandles %d\n", Left);
 
@@ -25,48 +25,48 @@
 		return 1;
 }
 
-BOOL16 AllocGDIMem(UINT16 uLeft)
+BOOL16 WINAPI AllocGDIMem(UINT16 uLeft)
 {
 	dprintf_stress(stddeb, "stress.dll: AllocGDIMem %d\n", uLeft);
 
 	return 1;
 }
 
-BOOL16 AllocMem(DWORD dwLeft)
+BOOL16 WINAPI AllocMem(DWORD dwLeft)
 {
 	dprintf_stress(stdnimp, "stress.dll: AllocMem %ld\n", dwLeft);
 
 	return 1;
 }
 
-BOOL16 AllocUserMem(UINT16 uContig)
+BOOL16 WINAPI AllocUserMem(UINT16 uContig)
 {
 	dprintf_stress(stddeb, "stress.dll: AllocUserMem %d\n", uContig);
 
 	return 1;
 }
 
-void FreeAllMem(void)
+void WINAPI FreeAllMem(void)
 {
 	dprintf_stress(stddeb, "stress.dll: FreeAllMem\n");
 }
 
-void FreeAllGDIMem(void)
+void WINAPI FreeAllGDIMem(void)
 {
 	dprintf_stress(stddeb, "stress.dll: FreeAllGDIMem\n");
 }
 
-void FreeAllUserMem(void)
+void WINAPI FreeAllUserMem(void)
 {
 	dprintf_stress(stddeb, "stress.dll: FreeAllUserMem\n");
 }
 
-void GetFreeAllUserMem(void)
+void WINAPI GetFreeAllUserMem(void)
 {
        dprintf_stress(stddeb, "stress.dll: GetFreeAllUserMem\n");
 }
 
-int GetFreeFileHandles(void)
+int WINAPI GetFreeFileHandles(void)
 {
 	dprintf_stress(stddeb, "stress.dll: GetFreeFileHandles\n");
 
@@ -77,12 +77,12 @@
 #endif
 }
 
-void UnAllocDiskSpace(UINT16 drive)
+void WINAPI UnAllocDiskSpace(UINT16 drive)
 {
 	dprintf_stress(stddeb, "stress.dll: UnAllocDiskSpace %d\n", drive);
 }
 
-void UnAllocFileHandles(void)
+void WINAPI UnAllocFileHandles(void)
 {
 	dprintf_stress(stddeb, "stress.dll: GetFreeAllUserMem\n");
 }
diff --git a/misc/system.c b/misc/system.c
index dee79bd..1c34729 100644
--- a/misc/system.c
+++ b/misc/system.c
@@ -100,7 +100,7 @@
  * Note: the function always takes 2 WORD arguments, contrary to what
  *       "Undocumented Windows" says.
   */
-DWORD InquireSystem( WORD code, WORD arg )
+DWORD WINAPI InquireSystem( WORD code, WORD arg )
 {
     WORD drivetype;
 
@@ -125,7 +125,7 @@
 /***********************************************************************
  *           CreateSystemTimer   (SYSTEM.2)
  */
-WORD CreateSystemTimer( WORD rate, FARPROC16 callback )
+WORD WINAPI CreateSystemTimer( WORD rate, FARPROC16 callback )
 {
     int i;
 
@@ -150,7 +150,7 @@
  *
  * Note: do not confuse this function with USER.182
  */
-WORD SYSTEM_KillSystemTimer( WORD timer )
+WORD WINAPI SYSTEM_KillSystemTimer( WORD timer )
 {
     if (!timer || (timer > NB_SYS_TIMERS)) return timer;  /* Error */
     SYS_Timers[timer-1].callback = NULL;
@@ -162,7 +162,7 @@
 /***********************************************************************
  *           EnableSystemTimers   (SYSTEM.4)
  */
-void EnableSystemTimers(void)
+void WINAPI EnableSystemTimers(void)
 {
     SYS_TimersDisabled = FALSE;
     if (SYS_NbTimers) SYSTEM_StartTicks();
@@ -172,7 +172,7 @@
 /***********************************************************************
  *           DisableSystemTimers   (SYSTEM.5)
  */
-void DisableSystemTimers(void)
+void WINAPI DisableSystemTimers(void)
 {
     SYS_TimersDisabled = TRUE;
     if (SYS_NbTimers) SYSTEM_StopTicks();
diff --git a/misc/toolhelp.c b/misc/toolhelp.c
index f5f73db..cba7996 100644
--- a/misc/toolhelp.c
+++ b/misc/toolhelp.c
@@ -29,7 +29,8 @@
 
 static int nrofnotifys = 0;
 
-BOOL16 NotifyRegister( HTASK16 htask, FARPROC16 lpfnCallback, WORD wFlags )
+BOOL16 WINAPI NotifyRegister( HTASK16 htask, FARPROC16 lpfnCallback,
+                              WORD wFlags )
 {
     int	i;
 
@@ -51,7 +52,7 @@
     return TRUE;
 }
 
-BOOL16 NotifyUnregister( HTASK16 htask )
+BOOL16 WINAPI NotifyUnregister( HTASK16 htask )
 {
     int	i;
     
diff --git a/misc/tweak.c b/misc/tweak.c
index e8f0095..0d88d0b 100644
--- a/misc/tweak.c
+++ b/misc/tweak.c
@@ -241,80 +241,6 @@
 
 /******************************************************************************
  *
- *   int  TWEAK_CheckOldFonts()
- *
- *   Examines wine.conf for old/invalid font entries and recommend changes to
- *   the user.
- *
- *   Revision history
- *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
- *             Original implementation.
- *
- *****************************************************************************/
-
-static void  TWEAK_CheckOldFontsCallback(char const *, char const *, void *);
-
-static char const  *fontmsgprologue = 
-"Wine warning:\n"
-"   The following entries in the [fonts] section of the wine.conf file are\n"
-"   obsolete or invalid:\n";
-
-static char const  *fontmsgepilogue =
-"   These entries should be eliminated or updated.\n"
-"   See the documentation/fonts file for more information.\n";
-
-static int  TWEAK_CheckOldFonts()
-{
-    int  found = 0;
-
-    PROFILE_EnumerateWineIniSection("Fonts", &TWEAK_CheckOldFontsCallback,
-				    (void *)&found);
-    if(found)
-	fprintf(stderr, fontmsgepilogue);
-
-    return 1;
-}
-
-static void  TWEAK_CheckOldFontsCallback(
-    char const  *key,
-    char const  *value,
-    void  *found)
-{
-    /* Ignore any keys that start with potential comment characters "'", '#',
-       or ';'. */
-    if(key[0] == '\'' || key[0] == '#' || key[0] == ';' || key[0] == '\0')
-	return;
-
-    /* Make sure this is a valid key */
-    if(strncasecmp(key, "Alias", 5) == 0 ||
-       strcasecmp(key, "Default") == 0) {
-
-	/* Valid key; make sure the value doesn't contain a wildcard */
-	if(strchr(value, '*')) {
-	    if(*(int *)found == 0) {
-		fprintf(stderr, fontmsgprologue);
-		++*(int *)found;
-	    }
-	    
-	    fprintf(stderr, "     %s=%s [no wildcards allowed]\n", key, value);
-	}
-    }
-    else {
-	/* Not a valid key */
-	if(*(int *)found == 0) {
-	    fprintf(stderr, fontmsgprologue);
-	    ++*(int *)found;
-	}
-
-	fprintf(stderr, "     %s=%s [obsolete]\n", key, value);
-    }
-
-    return;
-}
-
-
-/******************************************************************************
- *
  *   int  TWEAK_CheckConfiguration()
  *
  *   Examines wine.conf for old/bad entries and recommends changes to the user.
@@ -327,12 +253,10 @@
 
 int  TWEAK_CheckConfiguration()
 {
-    TWEAK_CheckOldFonts();
     return 1;
 }
 
 
-
 /******************************************************************************
  *
  *     Tweak graphic subsystem.
diff --git a/misc/ver.c b/misc/ver.c
index 0a747bf..89426ca 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -303,8 +303,9 @@
 }
 
 /* GetFileResourceSize				[VER.2] */
-DWORD
-GetFileResourceSize(LPCSTR filename,SEGPTR restype,SEGPTR resid,LPDWORD off) {
+DWORD WINAPI GetFileResourceSize(LPCSTR filename,SEGPTR restype,SEGPTR resid,
+                                 LPDWORD off)
+{
 	HFILE32			lzfd;
 	OFSTRUCT		ofs;
 	BYTE			*resdata;
@@ -331,10 +332,9 @@
 }
 
 /* GetFileResource				[VER.3] */
-DWORD
-GetFileResource(LPCSTR filename,SEGPTR restype,SEGPTR resid,
-		DWORD off,DWORD datalen,LPVOID data
-) {
+DWORD WINAPI GetFileResource(LPCSTR filename,SEGPTR restype,SEGPTR resid,
+                             DWORD off,DWORD datalen,LPVOID data )
+{
 	HFILE32			lzfd;
 	OFSTRUCT		ofs;
 	BYTE			*resdata;
@@ -367,8 +367,8 @@
 }
 
 /* GetFileVersionInfoSize			[VER.6] */
-DWORD
-GetFileVersionInfoSize16(LPCSTR filename,LPDWORD handle) {
+DWORD WINAPI GetFileVersionInfoSize16(LPCSTR filename,LPDWORD handle)
+{
 	DWORD	len,ret;
 	BYTE	buf[72];
 	VS_FIXEDFILEINFO *vffi;
@@ -479,14 +479,14 @@
 }
 
 /* GetFileVersionInfoSize32A			[VERSION.1] */
-DWORD
-GetFileVersionInfoSize32A(LPCSTR filename,LPDWORD handle) {
+DWORD WINAPI GetFileVersionInfoSize32A(LPCSTR filename,LPDWORD handle)
+{
 	dprintf_ver(stddeb,"GetFileVersionInfoSize32A(%s,%p)\n",filename,handle);
 	return GetFileVersionInfoSize16(filename,handle);
 }
 
 /* GetFileVersionInfoSize32W			[VERSION.2] */
-DWORD GetFileVersionInfoSize32W( LPCWSTR filename, LPDWORD handle )
+DWORD WINAPI GetFileVersionInfoSize32W( LPCWSTR filename, LPDWORD handle )
 {
     LPSTR xfn = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
     DWORD ret = GetFileVersionInfoSize16( xfn, handle );
@@ -495,8 +495,9 @@
 }
 
 /* GetFileVersionInfo				[VER.7] */
-DWORD 
-GetFileVersionInfo16(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data) {
+DWORD  WINAPI GetFileVersionInfo16(LPCSTR filename,DWORD handle,DWORD datasize,
+                                   LPVOID data)
+{
 	dprintf_ver(stddeb,"GetFileVersionInfo16(%s,%ld,%ld,%p)\n->",
 		filename,handle,datasize,data
 	);
@@ -506,14 +507,15 @@
 }
 
 /* GetFileVersionInfoA				[VERSION.0] */
-DWORD 
-GetFileVersionInfo32A(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data) {
+DWORD  WINAPI GetFileVersionInfo32A(LPCSTR filename,DWORD handle,
+                                    DWORD datasize,LPVOID data)
+{
 	return GetFileVersionInfo16(filename,handle,datasize,data);
 }
 
 /* GetFileVersionInfoW				[VERSION.3] */
-DWORD GetFileVersionInfo32W( LPCWSTR filename, DWORD handle, DWORD datasize,
-                             LPVOID data)
+DWORD WINAPI GetFileVersionInfo32W( LPCWSTR filename, DWORD handle,
+                                    DWORD datasize, LPVOID data)
 {
     LPSTR fn = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
     DWORD ret = GetFileVersionInfo16( fn, handle, datasize, data );
@@ -534,7 +536,7 @@
  *
  ****************************************************************************/
 
-DWORD VerFindFile16(
+DWORD WINAPI VerFindFile16(
     UINT16 flags,
     LPCSTR lpszFilename,
     LPCSTR lpszWinDir,
@@ -693,8 +695,7 @@
 }
 
 /* VerFindFileA						[VERSION.5] */
-DWORD
-VerFindFile32A(
+DWORD WINAPI VerFindFile32A(
 	UINT32 flags,LPCSTR filename,LPCSTR windir,LPCSTR appdir,
 	LPSTR curdir,UINT32 *pcurdirlen,LPSTR destdir,UINT32 *pdestdirlen )
 {
@@ -707,8 +708,7 @@
 }
 
 /* VerFindFileW						[VERSION.6] */
-DWORD
-VerFindFile32W(
+DWORD WINAPI VerFindFile32W(
 	UINT32 flags,LPCWSTR filename,LPCWSTR windir,LPCWSTR appdir,
 	LPWSTR curdir,UINT32 *pcurdirlen,LPWSTR destdir,UINT32 *pdestdirlen )
 {
@@ -735,8 +735,7 @@
 }
 
 /* VerInstallFile					[VER.9] */
-DWORD
-VerInstallFile16(
+DWORD WINAPI VerInstallFile16(
 	UINT16 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
  	LPCSTR destdir,LPCSTR curdir,LPSTR tmpfile,UINT16 *tmpfilelen )
 {
@@ -784,8 +783,7 @@
     }
 }
 
-DWORD
-VerInstallFile32A(
+DWORD WINAPI VerInstallFile32A(
 	UINT32 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
  	LPCSTR destdir,LPCSTR curdir,LPSTR tmpfile,UINT32 *tmpfilelen )
 {
@@ -948,8 +946,7 @@
 }
 
 /* VerInstallFileW				[VERSION.8] */
-DWORD
-VerInstallFile32W(
+DWORD WINAPI VerInstallFile32W(
 	UINT32 flags,LPCWSTR srcfilename,LPCWSTR destfilename,LPCWSTR srcdir,
 	LPCWSTR destdir,LPCWSTR curdir,LPWSTR tmpfile,UINT32 *tmpfilelen )
 {
@@ -1035,8 +1032,8 @@
 
 /* VerQueryValue 			[VER.11] */
 /* take care, 'buffer' is NOT a SEGPTR, it just points to one */
-DWORD
-VerQueryValue16(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer,UINT16 *buflen)
+DWORD WINAPI VerQueryValue16(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer,
+                             UINT16 *buflen)
 {
 	BYTE	*block=PTR_SEG_TO_LIN(segblock),*b;
 	struct	db	*db;
@@ -1062,8 +1059,8 @@
 	return 1;
 }
 
-DWORD
-VerQueryValue32A(LPVOID vblock,LPCSTR subblock,LPVOID *vbuffer,UINT32 *buflen)
+DWORD WINAPI VerQueryValue32A(LPVOID vblock,LPCSTR subblock,
+                              LPVOID *vbuffer,UINT32 *buflen)
 {
 	BYTE	*b,*block=(LPBYTE)vblock,**buffer=(LPBYTE*)vbuffer;
 	struct	db	*db;
@@ -1088,8 +1085,8 @@
 	return 1;
 }
 
-DWORD
-VerQueryValue32W(LPVOID vblock,LPCWSTR subblock,LPVOID *vbuffer,UINT32 *buflen)
+DWORD WINAPI VerQueryValue32W(LPVOID vblock,LPCWSTR subblock,LPVOID *vbuffer,
+                              UINT32 *buflen)
 {
 	/* FIXME: hmm, we not only need to convert subblock, but also 
 	 *        the content...or?
diff --git a/misc/w32sys.c b/misc/w32sys.c
index 8fae50d..427b47e 100644
--- a/misc/w32sys.c
+++ b/misc/w32sys.c
@@ -12,7 +12,7 @@
 /***********************************************************************
  *           GetWin32sInfo   (W32SYS.12)
  */
-WORD GetWin32sInfo( LPWIN32SINFO lpInfo)
+WORD WINAPI GetWin32sInfo( LPWIN32SINFO lpInfo)
 {
     lpInfo->bMajor = 1;
     lpInfo->bMinor = 3;
diff --git a/misc/winsock.c b/misc/winsock.c
index 159ed1c..3246b41 100644
--- a/misc/winsock.c
+++ b/misc/winsock.c
@@ -2,14 +2,9 @@
  * based on Windows Sockets 1.1 specs
  * (ftp.microsoft.com:/Advsys/winsock/spec11/WINSOCK.TXT)
  * 
- * (C) 1993,1994,1996 John Brezak, Erik Bos, Alex Korobka.
+ * (C) 1993,1994,1996,1997 John Brezak, Erik Bos, Alex Korobka.
  *
- * TODO: Merge Async...() handling with X event loop by adding 
- *	 thread/task fdset to select(2) in windows/event.c.
- *       Also fork dns lookup helper during the startup (with a pipe 
- *	 for communication) and make it fork for a database request
- *	 instead of forking the main process (i.e. something like 
- *	 Netscape 4.0).
+ * TODO: 32-bit asynchronous services.
  */
  
 #include <stdio.h>
@@ -41,6 +36,8 @@
 #include "winnt.h"
 #include "heap.h"
 #include "ldt.h"
+#include "task.h"
+#include "message.h"
 #include "winsock.h"
 #include "miscemu.h"
 #include "stddebug.h"
@@ -57,10 +54,6 @@
 /* ----------------------------------- internal data */
 
 extern int h_errno;
-extern void __sigio(int);
-
-ws_async_ctl            async_ctl;
-int                     async_qid = -1;
 
 static HANDLE32 	_WSHeap = 0;
 static unsigned char*	_ws_stub = NULL;
@@ -74,13 +67,13 @@
 #define WS_PTR2HANDLE(ptr) \
         ((short)((int)(ptr) - (int)_ws_stub))
 #define WS_HANDLE2PTR(handle) \
-        ((unsigned)((int)_ws_stub + (int)handle))
+        ((unsigned)((int)_ws_stub + (int)(handle)))
 
 #define WSI_CHECK_RANGE(pwsi, pws) \
 	( ((unsigned)(pws) > (unsigned)(pwsi)) && \
 	  ((unsigned)(pws) < ((unsigned)(pwsi) + sizeof(WSINFO))) )
 
-static INT16         _ws_sock_ops[] =
+static INT32         _ws_sock_ops[] =
        { WS_SO_DEBUG, WS_SO_REUSEADDR, WS_SO_KEEPALIVE, WS_SO_DONTROUTE,
          WS_SO_BROADCAST, WS_SO_LINGER, WS_SO_OOBINLINE, WS_SO_SNDBUF,
          WS_SO_RCVBUF, WS_SO_ERROR, WS_SO_TYPE, WS_SO_DONTLINGER, 0 };
@@ -89,28 +82,27 @@
          SO_LINGER, SO_OOBINLINE, SO_SNDBUF, SO_RCVBUF, SO_ERROR, SO_TYPE,
 	 SO_LINGER };
 
-static INT16 init_async_select(ws_socket* pws, HWND16 hWnd, UINT16 uMsg, UINT32 lEvent);
-static int notify_client(ws_socket* pws, unsigned flag);
-
 static int _check_ws(LPWSINFO pwsi, ws_socket* pws);
 static int _check_buffer(LPWSINFO pwsi, int size);
 
-static void fixup_wshe(struct ws_hostent* p_wshe, SEGPTR base);
-static void fixup_wspe(struct ws_protoent* p_wspe, SEGPTR base);
-static void fixup_wsse(struct ws_servent* p_wsse, SEGPTR base);
+extern void EVENT_AddIO( int fd, unsigned flag );
+extern void EVENT_DeleteIO( int fd, unsigned flag );
 
-static int cancel_async_select(ws_socket*);
-
-static void convert_sockopt(INT16 *level, INT16 *optname)
+/***********************************************************************
+ *          convert_sockopt()
+ *
+ * Converts socket flags from Windows format.
+ */
+static void convert_sockopt(INT32 *level, INT32 *optname)
 {
-  int           i;
+  int i;
   switch (*level)
   {
      case WS_SOL_SOCKET:
         *level = SOL_SOCKET;
         for(i=0; _ws_sock_ops[i]; i++)
             if( _ws_sock_ops[i] == *optname ) break;
-        if( _ws_sock_ops[i] ) *optname = (INT16)_px_sock_ops[i];
+        if( _ws_sock_ops[i] ) *optname = _px_sock_ops[i];
         else fprintf(stderr, "convert_sockopt() unknown optname %d\n", *optname);
         break;
      case WS_IPPROTO_TCP:
@@ -118,71 +110,63 @@
   }
 }
 
-static void _ws_global_init()
-{
-   if( !_ws_stub )
-   {
-     _WSHeap = HeapCreate(HEAP_ZERO_MEMORY, 8120, 32768);
-     if( !(_ws_stub = WS_ALLOC(0x10)) )
-       fprintf(stderr,"Fatal: failed to create WinSock heap\n");
-   }
-   if( async_qid == -1 ) 
-     if( (async_qid = msgget(IPC_PRIVATE, IPC_CREAT | 0x1FF)) == -1 )
-       fprintf(stderr,"Fatal: failed to create WinSock resource\n");
-}
-
-/* ----------------------------------- Per-thread info */
-
-static void wsi_link(LPWSINFO pwsi)
-{ if( _wsi_list ) _wsi_list->prev = pwsi;
-  pwsi->next = _wsi_list; _wsi_list = pwsi; 
-}
-
-static void wsi_unlink(LPWSINFO pwsi)
-{
-  if( pwsi == _wsi_list ) _wsi_list = pwsi->next;
-  else 
-  { pwsi->prev->next = pwsi->next;
-    if( pwsi->next ) pwsi->next->prev = pwsi->prev; } 
-}
+/* ----------------------------------- Per-thread info (or per-process?) */
 
 static LPWSINFO wsi_find(HTASK16 hTask)
-{ LPWSINFO pwsi = _wsi_list;
-  while( pwsi && pwsi->tid != hTask ) pwsi = pwsi->next;
-  return pwsi; 
+{ 
+    TDB*	   pTask = (TDB*)GlobalLock16(hTask);
+    if( pTask )
+    {
+	if( pTask->pwsi ) return pTask->pwsi;
+	else
+	{
+	    LPWSINFO pwsi = _wsi_list;
+	    while( pwsi && pwsi->tid != hTask ) pwsi = pwsi->next;
+	    if( pwsi )
+		fprintf(stderr,"loose wsi struct! pwsi=0x%08x, task=0x%04x\n", 
+					(unsigned)pwsi, hTask );
+	    return pwsi; 
+	}
+    }
+    return NULL;
 }
 
 static ws_socket* wsi_alloc_socket(LPWSINFO pwsi, int fd)
 {
-  if( pwsi->last_free >= 0 )
-  {
-    int i = pwsi->last_free;
+    /* Initialize a new entry in the socket table */
 
-    pwsi->last_free = pwsi->sock[i].flags;
-    pwsi->sock[i].fd = fd;
-    pwsi->sock[i].flags = 0;
-    return &pwsi->sock[i];
-  }
-  return NULL;
+    if( pwsi->last_free >= 0 )
+    {
+	int i = pwsi->last_free;
+
+	pwsi->last_free = pwsi->sock[i].flags;	/* free list */
+	pwsi->sock[i].fd = fd;
+	pwsi->sock[i].flags = 0;
+	return &pwsi->sock[i];
+    }
+    return NULL;
 }
 
 static void fd_set_normalize(fd_set* fds, LPWSINFO pwsi, ws_fd_set* ws, int* highfd)
 {
-  FD_ZERO(fds);
-  if(ws) 
-  { 
-    int 	i;
-    ws_socket*  pws;
-    for(i=0;i<(ws->fd_count);i++) 
-    {
-      pws = (ws_socket*)WS_HANDLE2PTR(ws->fd_array[i]);
-      if( _check_ws(pwsi, pws) ) 
-      { 
-        if( pws->fd > *highfd ) *highfd = pws->fd; 
-        FD_SET(pws->fd, fds); 
-      }
+    /* translate Winsock fd set into the normal fd set */
+
+    FD_ZERO(fds);
+    if( ws ) 
+    { 
+	int 	i;
+	ws_socket*  pws;
+
+	for( i = 0; i < (ws->fd_count) ; i++ ) 
+	{
+	    pws = (ws_socket*)WS_HANDLE2PTR(ws->fd_array[i]);
+	    if( _check_ws(pwsi, pws) ) 
+	    {
+		if( pws->fd > *highfd ) *highfd = pws->fd; 
+		FD_SET(pws->fd, fds); 
+	    }
+	}
     }
-  }
 }
 
 /*
@@ -229,24 +213,19 @@
     return;
 }
 
-static void fd_set_update_except(LPWSINFO pwsi, fd_set *fds, ws_fd_set *ws,
-				 fd_set *errorfds)
+HANDLE16 __ws_gethandle( void* ptr )
 {
-    if (ws)
-    {
-	int i, j, count = ws->fd_count;
+    return (HANDLE16)WS_PTR2HANDLE(ptr);
+}
 
-	for (i=j=0; i < count; i++)
-	{
-	    ws_socket *pws = (ws_socket *)WS_HANDLE2PTR(ws->fd_array[i]);
+void* __ws_memalloc( int size )
+{
+    return WS_ALLOC(size);
+}
 
-	    if (_check_ws(pwsi, pws) && (FD_ISSET(pws->fd, fds)
-                                         || FD_ISSET(pws->fd, errorfds)))
-	    ws->fd_array[j++] = ws->fd_array[i];
-	}
-	ws->fd_count = j;
-    }
-    return;
+void __ws_memfree(void* ptr)
+{
+    WS_FREE(ptr);
 }
 
 /* ----------------------------------- API ----- 
@@ -254,9 +233,15 @@
  * Init / cleanup / error checking.
  */
 
-INT16 WSAStartup(UINT16 wVersionRequested, LPWSADATA lpWSAData)
+/***********************************************************************
+ *      WSAStartup16()			(WINSOCK.115)
+ *
+ * Create socket control struct, attach it to the global list and
+ * update a pointer in the task struct.
+ */
+INT16 WINAPI WSAStartup16(UINT16 wVersionRequested, LPWSADATA lpWSAData)
 {
-  WSADATA WINSOCK_data = { 0x0101, 0x0101,
+    WSADATA WINSOCK_data = { 0x0101, 0x0101,
                           "WINE Sockets 1.1",
                         #ifdef linux
                                 "Linux/i386",
@@ -272,191 +257,288 @@
                                 "Unknown",
                         #endif
 			   WS_MAX_SOCKETS_PER_THREAD,
-			   WS_MAX_UDP_DATAGRAM, NULL };
-  HTASK16               tid = GetCurrentTask();
-  LPWSINFO              pwsi;
+			   WS_MAX_UDP_DATAGRAM, (SEGPTR)NULL };
+    HTASK16             tid = GetCurrentTask();
+    LPWSINFO            pwsi;
 
-  dprintf_winsock(stddeb, "WSAStartup: verReq=%x\n", wVersionRequested);
+    dprintf_winsock(stddeb, "WSAStartup: verReq=%x\n", wVersionRequested);
 
-  if (LOBYTE(wVersionRequested) < 1 || (LOBYTE(wVersionRequested) == 1 &&
-      HIBYTE(wVersionRequested) < 1)) return WSAVERNOTSUPPORTED;
+    if (LOBYTE(wVersionRequested) < 1 || (LOBYTE(wVersionRequested) == 1 &&
+        HIBYTE(wVersionRequested) < 1)) return WSAVERNOTSUPPORTED;
 
-  if (!lpWSAData) return WSAEINVAL;
+    if (!lpWSAData) return WSAEINVAL;
 
-  _ws_global_init();
-  if( _WSHeap == 0 ) return WSASYSNOTREADY;
-  
-  pwsi = wsi_find(GetCurrentTask());
-  if( pwsi == NULL )
-  {
-    if( (pwsi = (LPWSINFO)WS_ALLOC( sizeof(WSINFO))) )
+    /* initialize socket heap */
+
+    if( !_ws_stub )
     {
-      int i = 0;
-      pwsi->tid = tid;
-      for( i = 0; i < WS_MAX_SOCKETS_PER_THREAD; i++ )
-      { 
-	pwsi->sock[i].fd = -1; 
-	pwsi->sock[i].flags = i + 1; 
-      }
-      pwsi->sock[WS_MAX_SOCKETS_PER_THREAD - 1].flags = -1;
-    } 
-    else return WSASYSNOTREADY;
-    wsi_link(pwsi);
-  } else pwsi->num_startup++;
+	_WSHeap = HeapCreate(HEAP_ZERO_MEMORY, 8120, 32768);
+	if( !(_ws_stub = WS_ALLOC(0x10)) )
+	{
+	    fprintf(stderr,"Fatal: failed to create WinSock heap\n");
+	    return 0;
+	}
+    }
+    if( _WSHeap == 0 ) return WSASYSNOTREADY;
 
-  /* return winsock information */
-  memcpy(lpWSAData, &WINSOCK_data, sizeof(WINSOCK_data));
+    /* create socket array for this task */
+  
+    pwsi = wsi_find(GetCurrentTask());
+    if( pwsi == NULL )
+    {
+	TDB* pTask = (TDB*)GlobalLock16( tid );
 
-  dprintf_winsock(stddeb, "WSAStartup: succeeded\n");
-  return(0);
+	if( (pwsi = (LPWSINFO)WS_ALLOC( sizeof(WSINFO))) )
+	{
+	    int i = 0;
+	    pwsi->tid = tid;
+	    for( i = 0; i < WS_MAX_SOCKETS_PER_THREAD; i++ )
+	    {
+		pwsi->sock[i].fd = -1; 
+		pwsi->sock[i].flags = i + 1; 
+	    }
+	    pwsi->sock[WS_MAX_SOCKETS_PER_THREAD - 1].flags = -1;
+	}
+	else return WSASYSNOTREADY;
+
+        /* add this control struct to the global list */
+
+	pwsi->prev = NULL;
+	if( _wsi_list ) 
+	    _wsi_list->prev = pwsi;
+	pwsi->next = _wsi_list; 
+	_wsi_list = pwsi;
+	pTask->pwsi = pwsi;
+    }
+    else pwsi->num_startup++;
+
+    /* return winsock information */
+
+    memcpy(lpWSAData, &WINSOCK_data, sizeof(WINSOCK_data));
+
+    dprintf_winsock(stddeb, "WSAStartup: succeeded\n");
+    return 0;
 }
 
+/***********************************************************************
+ *      WSAStartup32()			(WSOCK32.115)
+ */
+INT32 WINAPI WSAStartup32(UINT32 wVersionRequested, LPWSADATA lpWSAData)
+{
+    return WSAStartup16( wVersionRequested, lpWSAData );
+}
+
+/***********************************************************************
+ *      WSACleanup()			(WINSOCK.116)
+ *
+ * Cleanup functions of varying impact.
+ */
 void WINSOCK_Shutdown()
 {
-  if( async_qid != -1 )
-    if( msgctl(async_qid, IPC_RMID, NULL) == -1 )
-          fprintf(stderr,"failed to delete WS message queue.\n");
-    else async_qid = -1;
+    /* Called on exit(), has to remove all outstanding async DNS processes.  */
+
+    WINSOCK_cancel_task_aops( 0, __ws_memfree );
 }
 
-INT16 WSACleanup(void)
+INT32 WINSOCK_DeleteTaskWSI( TDB* pTask, LPWSINFO pwsi )
 {
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    /* WSACleanup() backend, called on task termination as well. */
 
-  /* FIXME: do global cleanup if no current task */
+    int	i, j, n;
 
-  dprintf_winsock(stddeb, "WSACleanup(%08x)\n", (unsigned)pwsi);
-  if( pwsi )
-  {
-      int	i, j, n;
+    if( --pwsi->num_startup > 0 ) return 0;
 
-      if( pwsi->num_startup-- ) return 0;
+    SIGNAL_MaskAsyncEvents( TRUE );
+    if( pTask ) 
+	pTask->pwsi = NULL;
+    WINSOCK_cancel_task_aops( pTask->hSelf, __ws_memfree );
+    SIGNAL_MaskAsyncEvents( FALSE );
 
-      SIGNAL_MaskAsyncEvents( TRUE );
-      WINSOCK_cancel_async_op(GetCurrentTask());
-      SIGNAL_MaskAsyncEvents( FALSE );
+    /* unlink socket control struct */
 
-      wsi_unlink(pwsi);
-      if( _wsi_list == NULL ) WINSOCK_Shutdown();
+    if( pwsi == _wsi_list ) 
+	_wsi_list = pwsi->next;
+    else
+	pwsi->prev->next = pwsi->next;
+    if( pwsi->next ) pwsi->next->prev = pwsi->prev; 
 
-      if( pwsi->flags & WSI_BLOCKINGCALL )
-	  dprintf_winsock(stddeb,"\tinside blocking call!\n");
-      if( pwsi->num_async_rq )
-	  dprintf_winsock(stddeb,"\thave %i outstanding async ops!\n", pwsi->num_async_rq );
+    if( _wsi_list == NULL ) 
+	WINSOCK_Shutdown();	/* just in case */
 
-      for(i = 0, j = 0, n = 0; i < WS_MAX_SOCKETS_PER_THREAD; i++)
+    if( pwsi->flags & WSI_BLOCKINGCALL )
+	dprintf_winsock(stddeb,"\tinside blocking call!\n");
+
+/* FIXME: aop_control() doesn't decrement pwsi->num_async_rq
+ *
+ *    if( pwsi->num_async_rq )
+ *	  dprintf_winsock(stddeb,"\thave %i outstanding async ops!\n", pwsi->num_async_rq );
+ */
+
+    for(i = 0, j = 0, n = 0; i < WS_MAX_SOCKETS_PER_THREAD; i++)
 	if( pwsi->sock[i].fd != -1 )
-	{ 
-	  n += cancel_async_select(&pwsi->sock[i]);
-          close(pwsi->sock[i].fd); j++; 
+	{
+	    if( pwsi->sock[i].psop )
+	    {
+		n++;
+		WSAAsyncSelect( (SOCKET16)WS_PTR2HANDLE(pwsi->sock + i), 0, 0, 0 );
+	    }
+            close(pwsi->sock[i].fd); j++; 
         }
-      if( j ) 
+    if( j ) 
 	  dprintf_winsock(stddeb,"\tclosed %i sockets, killed %i async selects!\n", j, n);
 
-      if( pwsi->buffer ) SEGPTR_FREE(pwsi->buffer);
-      if( pwsi->dbuffer ) SEGPTR_FREE(pwsi->dbuffer);
-      WS_FREE(pwsi);
-      return 0;
-  }
-  return SOCKET_ERROR;
+    /* delete scratch buffers */
+
+    if( pwsi->buffer ) SEGPTR_FREE(pwsi->buffer);
+    if( pwsi->dbuffer ) SEGPTR_FREE(pwsi->dbuffer);
+	
+    memset( pwsi, 0, sizeof(WSINFO) );
+    WS_FREE(pwsi);
+    return 0;
 }
 
-INT16 WSAGetLastError(void)
+INT32 WINAPI WSACleanup(void)
 {
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
-  INT16		ret;
+    HTASK16	hTask = GetCurrentTask();
 
-  dprintf_winsock(stddeb, "WSAGetLastError(%08x)", (unsigned)pwsi);
-
-  ret = (pwsi) ? pwsi->err : WSANOTINITIALISED;
-
-  dprintf_winsock(stddeb, " = %i\n", (int)ret);
-  return ret;
+    dprintf_winsock(stddeb, "WSACleanup(%04x)\n", hTask );
+    if( hTask )
+    {
+	LPWSINFO pwsi = wsi_find(hTask);
+	if( pwsi )
+	    return WINSOCK_DeleteTaskWSI( (TDB*)GlobalLock16(hTask), pwsi );
+	return SOCKET_ERROR;
+    }
+    else
+	WINSOCK_Shutdown(); /* remove all outstanding DNS requests */
+    return 0;
 }
 
-void WSASetLastError(INT16 iError)
+
+/***********************************************************************
+ *      WSAGetLastError()		(WSOCK32.111)(WINSOCK.111)
+ */
+INT32 WINAPI WSAGetLastError(void)
 {
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    INT16		ret;
 
-  dprintf_winsock(stddeb, "WSASetLastError(%08x): %d\n", (unsigned)pwsi, (int)iError);
+    dprintf_winsock(stddeb, "WSAGetLastError(%08x)", (unsigned)pwsi);
 
-  if( pwsi ) pwsi->err = iError;
+    ret = (pwsi) ? pwsi->err : WSANOTINITIALISED;
+
+    dprintf_winsock(stddeb, " = %i\n", (int)ret);
+    return ret;
+}
+
+/***********************************************************************
+ *      WSASetLastError32()		(WSOCK32.112)
+ */
+void WINAPI WSASetLastError32(INT32 iError)
+{
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WSASetLastError(%08x): %d\n", (unsigned)pwsi, (int)iError);
+    if( pwsi ) pwsi->err = iError;
+}
+
+/***********************************************************************
+ *      WSASetLastError16()		(WINSOCK.112)
+ */
+void WINAPI WSASetLastError16(INT16 iError)
+{
+    WSASetLastError32(iError);
 }
 
 int _check_ws(LPWSINFO pwsi, ws_socket* pws)
 {
-  if( pwsi )
-    if( pwsi->flags & WSI_BLOCKINGCALL ) pwsi->err = WSAEINPROGRESS;
-    else if( WSI_CHECK_RANGE(pwsi, pws) ) return 1;
-    else pwsi->err = WSAENOTSOCK;
-  return 0;
+    if( pwsi )
+	if( pwsi->flags & WSI_BLOCKINGCALL ) pwsi->err = WSAEINPROGRESS;
+	else if( WSI_CHECK_RANGE(pwsi, pws) ) return 1;
+		 else pwsi->err = WSAENOTSOCK;
+    return 0;
 }
 
 int _check_buffer(LPWSINFO pwsi, int size)
 {
-  if( pwsi->buffer && pwsi->buflen >= size ) return 1;
-  else SEGPTR_FREE(pwsi->buffer);
-  pwsi->buffer = (char*)SEGPTR_ALLOC((pwsi->buflen = size)); 
-  return (pwsi->buffer != NULL);
+    if( pwsi->buffer && pwsi->buflen >= size ) return 1;
+    else SEGPTR_FREE(pwsi->buffer);
+
+    pwsi->buffer = (char*)SEGPTR_ALLOC((pwsi->buflen = size)); 
+    return (pwsi->buffer != NULL);
 }
 
-/* ----- socket operations */
+/* ----------------------------------- i/o APIs */
 
-SOCKET16 WINSOCK_accept(SOCKET16 s, struct sockaddr *addr, INT16 *addrlen16)
+/***********************************************************************
+ *		accept()		(WSOCK32.1)
+ */
+SOCKET32 WINAPI WINSOCK_accept32(SOCKET32 s, struct sockaddr *addr,
+                                 INT32 *addrlen32)
 {
-  ws_socket*	pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO	pwsi = wsi_find(GetCurrentTask());
+    ws_socket*	pws  = (ws_socket*)WS_HANDLE2PTR((SOCKET16)s);
+    LPWSINFO	pwsi = wsi_find(GetCurrentTask());
 
-  dprintf_winsock(stddeb, "WS_ACCEPT(%08x): socket %04x\n", 
-				   (unsigned)pwsi, (UINT16)s); 
-  if( _check_ws(pwsi, pws) )
-  {
-     int 	sock, fd_flags, addrlen32 = *addrlen16;
+    dprintf_winsock(stddeb, "WS_ACCEPT(%08x): socket %04x\n", 
+				  (unsigned)pwsi, (UINT16)s ); 
+    if( _check_ws(pwsi, pws) )
+    {
+	int 	sock, fd_flags;
 
-     /* this is how block info is supposed to be used -
-      * WSAIsBlocking() would then check WSI_BLOCKINGCALL bit.
-      */
+	fd_flags = fcntl(pws->fd, F_GETFL, 0);
 
-     fd_flags = fcntl(pws->fd, F_GETFL, 0);
-     if( !(fd_flags & O_NONBLOCK) ) pwsi->flags |= WSI_BLOCKINGCALL; 
+	if( (sock = accept(pws->fd, addr, addrlen32)) >= 0 )
+	{
+	    ws_socket*	pnew = wsi_alloc_socket(pwsi, sock); 
+	    if( pnew )
+	    {
+		s = (SOCKET32)WS_PTR2HANDLE(pnew);
+		if( pws->psop && pws->flags & WS_FD_ACCEPT )
+		{
+		    EVENT_AddIO( pws->fd, EVENT_IO_READ );	/* reenabler */
 
-     if( (sock = accept(pws->fd, addr, &addrlen32)) >= 0 )
-     {
-        ws_socket*	pnew = wsi_alloc_socket(pwsi, sock); 
-	notify_client(pws, WS_FD_ACCEPT);
-        if( pnew )
-        {
-	  if( pws->p_aop )
-	      init_async_select(pnew, pws->p_aop->hWnd,
-				      pws->p_aop->uMsg,
-				      pws->p_aop->flags & ~WS_FD_ACCEPT );
-
-	  pwsi->flags &= ~WSI_BLOCKINGCALL; 
-	  return (SOCKET16)WS_PTR2HANDLE(pnew);
-        } 
-	else pwsi->err = WSAENOBUFS;
-     } 
-     else pwsi->err = wsaErrno();
-
-     pwsi->flags &= ~WSI_BLOCKINGCALL;
-  }
-  return INVALID_SOCKET;
+		    /* async select the accept()'ed socket */
+		    WSAAsyncSelect( s, pws->psop->hWnd, pws->psop->uMsg,
+				    pws->flags & ~WS_FD_ACCEPT );
+		}
+		return s;
+            } 
+	    else pwsi->err = WSAENOBUFS;
+	} 
+	else pwsi->err = wsaErrno();
+    }
+    return INVALID_SOCKET32;
 }
 
-INT16 WINSOCK_bind(SOCKET16 s, struct sockaddr *name, INT16 namelen)
+/***********************************************************************
+ *              accept()		(WINSOCK.1)
+ */
+SOCKET16 WINAPI WINSOCK_accept16(SOCKET16 s, struct sockaddr* addr,
+                                 INT16* addrlen16 )
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    INT32 addrlen32 = *addrlen16;
+    SOCKET32 retSocket = WINSOCK_accept32( s, addr, &addrlen32 );
+   *addrlen16 = (INT16)addrlen32;
+    return (SOCKET16)retSocket;
+}
 
-  dprintf_winsock(stddeb, "WS_BIND(%08x): socket %04x, ptr %8x, length %d\n", 
+/***********************************************************************
+ *		bind()			(WSOCK32.2)
+ */
+INT32 WINAPI WINSOCK_bind32(SOCKET32 s, struct sockaddr *name, INT32 namelen)
+{
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_BIND(%08x): socket %04x, ptr %8x, length %d\n", 
 			   (unsigned)pwsi, s, (int) name, namelen);
 #if 0
-  dump_sockaddr(name);
+    dump_sockaddr(name);
 #endif
 
-  if ( _check_ws(pwsi, pws) )
-    if (namelen >= sizeof(*name)) 
-       if ( ((struct sockaddr_in *)name)->sin_family == AF_INET )
+    if ( _check_ws(pwsi, pws) )
+      if ( namelen >= sizeof(*name) ) 
+	if ( ((struct sockaddr_in *)name)->sin_family == AF_INET )
 	  if ( bind(pws->fd, name, namelen) < 0 ) 
 	  {
 	     int	loc_errno = errno;
@@ -469,34 +551,59 @@
 		default: pwsi->err = wsaErrno();
 	     }
 	  }
-	  else return 0;
-       else pwsi->err = WSAEAFNOSUPPORT;
-    else pwsi->err = WSAEFAULT;
-  return SOCKET_ERROR;
+	  else return 0; /* success */
+	else pwsi->err = WSAEAFNOSUPPORT;
+      else pwsi->err = WSAEFAULT;
+    return SOCKET_ERROR;
 }
 
-INT16 WINSOCK_closesocket(SOCKET16 s)
+/***********************************************************************
+ *              bind()			(WINSOCK.2)
+ */
+INT16 WINAPI WINSOCK_bind16(SOCKET16 s, struct sockaddr *name, INT16 namelen)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_CLOSE(%08x): socket %08x\n", (unsigned)pwsi, s);
-
-  if( _check_ws(pwsi, pws) )
-  { 
-    int		fd = pws->fd;
-
-    cancel_async_select(pws);
-    pws->fd = -1;
-    pws->flags = (unsigned)pwsi->last_free;
-    pwsi->last_free = pws - &pwsi->sock[0];
-    if (close(fd) == 0) return 0;
-    pwsi->err = (errno == EBADF) ? WSAENOTSOCK : wsaErrno();
-  }
-  return SOCKET_ERROR;
+  return (INT16)WINSOCK_bind32( s, name, namelen );
 }
 
-INT16 WINSOCK_connect(SOCKET16 s, struct sockaddr *name, INT16 namelen)
+/***********************************************************************
+ *		closesocket()		(WSOCK32.3)
+ */
+INT32 WINAPI WINSOCK_closesocket32(SOCKET32 s)
+{
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_CLOSE(%08x): socket %08x\n", (unsigned)pwsi, s);
+
+    if( _check_ws(pwsi, pws) )
+    { 
+	int	fd = pws->fd;
+
+	if( pws->psop ) WSAAsyncSelect( s, 0, 0, 0 );
+
+	pws->fd = -1;
+	pws->flags = (unsigned)pwsi->last_free;
+	pwsi->last_free = pws - &pwsi->sock[0]; /* add to free list */
+
+	if( close(fd) == 0 ) 
+	    return 0;
+	pwsi->err = (errno == EBADF) ? WSAENOTSOCK : wsaErrno();
+    }
+    return SOCKET_ERROR;
+}
+
+/***********************************************************************
+ *              closesocket()           (WINSOCK.3)
+ */
+INT16 WINAPI WINSOCK_closesocket16(SOCKET16 s)
+{
+    return (INT16)WINSOCK_closesocket32(s);
+}
+
+/***********************************************************************
+ *		connect()		(WSOCK32.4)
+ */
+INT32 WINAPI WINSOCK_connect32(SOCKET32 s, struct sockaddr *name, INT32 namelen)
 {
   ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
   LPWSINFO      pwsi = wsi_find(GetCurrentTask());
@@ -511,13 +618,22 @@
   {
     if (connect(pws->fd, name, namelen) == 0) 
     { 
-	if( pws->p_aop )
-	    /* we need to notify handler process if
-	     * connect() succeeded NOT in response to winsock message
-	     */
-	    notify_client(pws, WS_FD_CONNECTED);
-
-        pws->flags &= ~(WS_FD_INACTIVE | WS_FD_CONNECT); 
+	pws->flags &= ~(WS_FD_INACTIVE | WS_FD_CONNECT);
+	if( pws->psop && pws->flags & WS_FD_CONNECT )
+	{
+	    if( !(pws->flags & WS_FD_CONNECTED) )
+	    {
+		if( pws->flags & (WS_FD_READ | WS_FD_CLOSE) )
+		    EVENT_AddIO( pws->fd, EVENT_IO_READ );
+		else
+		    EVENT_DeleteIO( pws->fd, EVENT_IO_READ );
+		if( pws->flags & WS_FD_WRITE )
+		    EVENT_AddIO( pws->fd, EVENT_IO_WRITE );
+		else
+		    EVENT_DeleteIO( pws->fd, EVENT_IO_WRITE );
+		pws->flags |= WS_FD_CONNECTED;
+	    }
+	}
         return 0; 
     }
     pwsi->err = (errno == EINPROGRESS) ? WSAEWOULDBLOCK : wsaErrno();
@@ -525,77 +641,142 @@
   return SOCKET_ERROR;
 }
 
-INT16 WINSOCK_getpeername(SOCKET16 s, struct sockaddr *name, INT16 *namelen)
+/***********************************************************************
+ *              connect()               (WINSOCK.4)
+ */
+INT16 WINAPI WINSOCK_connect16(SOCKET16 s, struct sockaddr *name, INT16 namelen)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+  return (INT16)WINSOCK_connect32( s, name, namelen );
+}
 
-  dprintf_winsock(stddeb, "WS_GETPEERNAME(%08x): socket: %04x, ptr %8x, ptr %8x\n", 
+/***********************************************************************
+ *		getpeername()		(WSOCK32.5)
+ */
+INT32 WINAPI WINSOCK_getpeername32(SOCKET32 s, struct sockaddr *name,
+                                   INT32 *namelen)
+{
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GETPEERNAME(%08x): socket: %04x, ptr %8x, ptr %8x\n", 
 			   (unsigned)pwsi, s, (int) name, *namelen);
-  if( _check_ws(pwsi, pws) )
-  {
-    int	namelen32 = *namelen;
-    if (getpeername(pws->fd, name, &namelen32) == 0) 
-    { 
+    if( _check_ws(pwsi, pws) )
+    {
+	if (getpeername(pws->fd, name, namelen) == 0) 
+	    return 0; 
+	pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    }
+    return SOCKET_ERROR;
+}
+
+/***********************************************************************
+ *              getpeername()		(WINSOCK.5)
+ */
+INT16 WINAPI WINSOCK_getpeername16(SOCKET16 s, struct sockaddr *name,
+                                   INT16 *namelen16)
+{
+    INT32 namelen32 = *namelen16;
+    INT32 retVal = WINSOCK_getpeername32( s, name, &namelen32 );
+
 #if 0
-	dump_sockaddr(name);
+    dump_sockaddr(name);
 #endif
-       *namelen = (INT16)namelen32; 
-        return 0; 
-    }
-    pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
-  }
-  return SOCKET_ERROR;
+
+   *namelen16 = namelen32;
+    return (INT16)retVal;
 }
 
-INT16 WINSOCK_getsockname(SOCKET16 s, struct sockaddr *name, INT16 *namelen)
+/***********************************************************************
+ *		getsockname()		(WSOCK32.6)
+ */
+INT32 WINAPI WINSOCK_getsockname32(SOCKET32 s, struct sockaddr *name,
+                                   INT32 *namelen)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
 
-  dprintf_winsock(stddeb, "WS_GETSOCKNAME(%08x): socket: %04x, ptr %8x, ptr %8x\n", 
+    dprintf_winsock(stddeb, "WS_GETSOCKNAME(%08x): socket: %04x, ptr %8x, ptr %8x\n", 
 			  (unsigned)pwsi, s, (int) name, (int) *namelen);
-  if( _check_ws(pwsi, pws) )
-  {
-    int namelen32 = *namelen;
-    if (getsockname(pws->fd, name, &namelen32) == 0)
-    { 
-	*namelen = (INT16)namelen32; 
-	 return 0; 
+    if( _check_ws(pwsi, pws) )
+    {
+	if (getsockname(pws->fd, name, namelen) == 0)
+	    return 0; 
+	pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
     }
-    pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
-  }
-  return SOCKET_ERROR;
+    return SOCKET_ERROR;
 }
 
-INT16 WINSOCK_getsockopt(SOCKET16 s, INT16 level, 
-			 INT16 optname, char *optval, INT16 *optlen)
+/***********************************************************************
+ *              getsockname()		(WINSOCK.6)
+ */
+INT16 WINAPI WINSOCK_getsockname16(SOCKET16 s, struct sockaddr *name,
+                                   INT16 *namelen16)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_GETSOCKOPT(%08x): socket: %04x, opt %d, ptr %8x, ptr %8x\n", 
-			   (unsigned)pwsi, s, level, (int) optval, (int) *optlen);
-
-  if( _check_ws(pwsi, pws) )
-  {
-     int	optlen32 = *optlen;
-
-     convert_sockopt(&level, &optname);
-     if (getsockopt(pws->fd, (int) level, optname, optval, &optlen32) == 0 )
-     { *optlen = (INT16)optlen32; return 0; }
-     pwsi->err = (errno == EBADF) ? WSAENOTSOCK : wsaErrno();
-  }
-  return SOCKET_ERROR;
+    INT32 namelen32 = *namelen16;
+    INT32 retVal = WINSOCK_getsockname32( s, name, &namelen32 );
+   *namelen16 = namelen32;
+    return (INT16)retVal;
 }
 
-u_long  WINSOCK_htonl(u_long hostlong)   { return( htonl(hostlong) ); }
-u_short WINSOCK_htons(u_short hostshort) { return( htons(hostshort) ); }
-u_long  WINSOCK_inet_addr(char *cp)      { return( inet_addr(cp) ); }
-u_long  WINSOCK_ntohl(u_long netlong)    { return( ntohl(netlong) ); }
-u_short WINSOCK_ntohs(u_short netshort)  { return( ntohs(netshort) ); }
 
-SEGPTR WINSOCK_inet_ntoa(struct in_addr in)
+/***********************************************************************
+ *		getsockopt()		(WSOCK32.7)
+ */
+INT32 WINAPI WINSOCK_getsockopt32(SOCKET32 s, INT32 level, 
+                                  INT32 optname, char *optval, INT32 *optlen)
+{
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GETSOCKOPT(%08x): socket: %04x, opt %d, ptr %8x, ptr %8x\n", 
+			   (unsigned)pwsi, s, level, (int) optval, (int) *optlen);
+    if( _check_ws(pwsi, pws) )
+    {
+	convert_sockopt(&level, &optname);
+	if (getsockopt(pws->fd, (int) level, optname, optval, optlen) == 0 )
+	    return 0;
+	pwsi->err = (errno == EBADF) ? WSAENOTSOCK : wsaErrno();
+    }
+    return SOCKET_ERROR;
+}
+
+/***********************************************************************
+ *              getsockopt()		(WINSOCK.7)
+ */
+INT16 WINAPI WINSOCK_getsockopt16(SOCKET16 s, INT16 level,
+                                  INT16 optname, char *optval, INT16 *optlen)
+{
+    INT32 optlen32 = *optlen;
+    INT32 retVal = WINSOCK_getsockopt32( s, level, optname, optval, &optlen32 );
+   *optlen = optlen32;
+    return (INT16)retVal;
+}
+
+/***********************************************************************
+ *		htonl()			(WINSOCK.8)(WSOCK32.8)
+ */
+u_long WINAPI WINSOCK_htonl(u_long hostlong)   { return( htonl(hostlong) ); }
+/***********************************************************************
+ *		htons()			(WINSOCK.9)(WSOCK32.9)
+ */
+u_short WINAPI WINSOCK_htons(u_short hostshort) { return( htons(hostshort) ); }
+/***********************************************************************
+ *		inet_addr()		(WINSOCK.10)
+ */
+u_long WINAPI WINSOCK_inet_addr(char *cp)      { return( inet_addr(cp) ); }
+/***********************************************************************
+ *		htohl()			(WINSOCK.14)(WSOCK32.14)
+ */
+u_long WINAPI WINSOCK_ntohl(u_long netlong)    { return( ntohl(netlong) ); }
+/***********************************************************************
+ *		ntohs()			(WINSOCK.15)(WSOCK32.15)
+ */
+u_short WINAPI WINSOCK_ntohs(u_short netshort)  { return( ntohs(netshort) ); }
+
+/***********************************************************************
+ *		inet_ntoa()		(WINSOCK.11)
+ */
+SEGPTR WINAPI WINSOCK_inet_ntoa(struct in_addr in)
 {
   /* use "buffer for dummies" here because some applications have 
    * propensity to decode addresses in ws_hostent structure without 
@@ -623,7 +804,10 @@
   return (SEGPTR)NULL;
 }
 
-INT16 WINSOCK_ioctlsocket(SOCKET16 s, UINT32 cmd, UINT32 *argp)
+/***********************************************************************
+ *		ioctlsocket()		(WSOCK32.12)
+ */
+INT32 WINAPI WINSOCK_ioctlsocket32(SOCKET32 s, UINT32 cmd, UINT32 *argp)
 {
   ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
   LPWSINFO      pwsi = wsi_find(GetCurrentTask());
@@ -642,8 +826,9 @@
 
 	case WS_FIONBIO:    
 		newcmd=FIONBIO;  
-		if( pws->p_aop && *argp == 0 ) 
+		if( pws->psop && *argp == 0 ) 
 		{
+		    /* AsyncSelect()'ed sockets are always nonblocking */
 		    pwsi->err = WSAEINVAL; 
 		    return SOCKET_ERROR; 
 		}
@@ -668,81 +853,141 @@
   return SOCKET_ERROR;
 }
 
-INT16 WINSOCK_listen(SOCKET16 s, INT16 backlog)
+/***********************************************************************
+ *              ioctlsocket()           (WINSOCK.12)
+ */
+INT16 WINAPI WINSOCK_ioctlsocket16(SOCKET16 s, UINT32 cmd, UINT32 *argp)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    return (INT16)WINSOCK_ioctlsocket32( s, cmd, argp );
+}
 
-  dprintf_winsock(stddeb, "WS_LISTEN(%08x): socket %04x, backlog %d\n", 
-			  (unsigned)pwsi, s, backlog);
-  if( _check_ws(pwsi, pws) )
-  {
-    if( !pws->p_aop )
+
+/***********************************************************************
+ *		listen()		(WSOCK32.13)
+ */
+INT32 WINAPI WINSOCK_listen32(SOCKET32 s, INT32 backlog)
+{
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_LISTEN(%08x): socket %04x, backlog %d\n", 
+			    (unsigned)pwsi, s, backlog);
+    if( _check_ws(pwsi, pws) )
     {
-      int  fd_flags = fcntl(pws->fd, F_GETFL, 0);
-      if( !(fd_flags & O_NONBLOCK) ) pws->flags |= WS_FD_ACCEPT;
-    }
-    else notify_client(pws, WS_FD_ACCEPT);
+	if( !pws->psop )
+	{
+	    int  fd_flags = fcntl(pws->fd, F_GETFL, 0);
+	    if( !(fd_flags & O_NONBLOCK) ) pws->flags |= WS_FD_ACCEPT;
+	}
 
-    if (listen(pws->fd, backlog) == 0) return 0;
-    pwsi->err = wsaErrno();
-  }
-  return SOCKET_ERROR;
+	if (listen(pws->fd, backlog) == 0) return 0;
+	pwsi->err = wsaErrno();
+    }
+    else if( pwsi ) pwsi->err = WSAENOTSOCK;
+    return SOCKET_ERROR;
 }
 
-INT16 WINSOCK_recv(SOCKET16 s, char *buf, INT16 len, INT16 flags)
+/***********************************************************************
+ *              listen()		(WINSOCK.13)
+ */
+INT16 WINAPI WINSOCK_listen16(SOCKET16 s, INT16 backlog)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_RECV(%08x): socket %04x, buf %8x, len %d, flags %d",
-                          (unsigned)pwsi, s, (unsigned)buf, len, flags);
-  if( _check_ws(pwsi, pws) )
-  {
-    int length;
-    if ((length = recv(pws->fd, buf, len, flags)) >= 0) 
-    { 
-	dprintf_winsock(stddeb, " -> %i bytes\n", length);
-	notify_client(pws, WS_FD_READ);
-	return (INT16)length;
-    }
-    pwsi->err = wsaErrno();
-  }
-  dprintf_winsock(stddeb, " -> ERROR\n");
-  return SOCKET_ERROR;
+    return (INT16)WINSOCK_listen32( s, backlog );
 }
 
-INT16 WINSOCK_recvfrom(SOCKET16 s, char *buf, INT16 len, INT16 flags, 
-		struct sockaddr *from, INT16 *fromlen16)
+
+/***********************************************************************
+ *		recv()			(WSOCK32.16)
+ */
+INT32 WINAPI WINSOCK_recv32(SOCKET32 s, char *buf, INT32 len, INT32 flags)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
 
-  dprintf_winsock(stddeb, "WS_RECVFROM(%08x): socket %04x, ptr %08x, len %d, flags %d\n",
+    dprintf_winsock(stddeb, "WS_RECV(%08x): socket %04x, buf %8x, len %d, flags %d",
                           (unsigned)pwsi, s, (unsigned)buf, len, flags);
-  if( _check_ws(pwsi, pws) )
-  {
-    int length, fromlen32 = *fromlen16;
+    if( _check_ws(pwsi, pws) )
+    {
+	INT32 length;
+	if ((length = recv(pws->fd, buf, len, flags)) >= 0) 
+	{ 
+	    dprintf_winsock(stddeb, " -> %i bytes\n", length);
 
-    if ((length = recvfrom(pws->fd, buf, len, flags, from, &fromlen32)) >= 0)
-    {   
-      *fromlen16 = fromlen32; 
-       notify_client(pws, WS_FD_READ);
-       return (INT16)length;
+	    if( pws->psop && (pws->flags & (WS_FD_READ | WS_FD_CLOSE)) )
+		EVENT_AddIO( pws->fd, EVENT_IO_READ );	/* reenabler */
+
+	    return length;
+	}
+	pwsi->err = wsaErrno();
     }
-    pwsi->err = wsaErrno();
-  }
-  return SOCKET_ERROR;
+    else if( pwsi ) pwsi->err = WSAENOTSOCK;
+    dprintf_winsock(stddeb, " -> ERROR\n");
+    return SOCKET_ERROR;
 }
 
-INT16 WINSOCK_select(INT16 nfds, ws_fd_set *ws_readfds,
-				 ws_fd_set *ws_writefds,
-				 ws_fd_set *ws_exceptfds, struct timeval *timeout)
+/***********************************************************************
+ *              recv()			(WINSOCK.16)
+ */
+INT16 WINAPI WINSOCK_recv16(SOCKET16 s, char *buf, INT16 len, INT16 flags)
+{
+    return (INT16)WINSOCK_recv32( s, buf, len, flags );
+}
+
+
+/***********************************************************************
+ *		recvfrom()		(WSOCK32.17)
+ */
+INT32 WINAPI WINSOCK_recvfrom32(SOCKET32 s, char *buf, INT32 len, INT32 flags, 
+                                struct sockaddr *from, INT32 *fromlen32)
+{
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_RECVFROM(%08x): socket %04x, ptr %08x, len %d, flags %d",
+                          (unsigned)pwsi, s, (unsigned)buf, len, flags);
+    if( _check_ws(pwsi, pws) )
+    {
+	int length;
+
+	if ((length = recvfrom(pws->fd, buf, len, flags, from, fromlen32)) >= 0)
+	{
+	    dprintf_winsock(stddeb, " -> %i bytes\n", length);
+
+	    if( pws->psop && (pws->flags & (WS_FD_READ | WS_FD_CLOSE)) )
+		EVENT_AddIO( pws->fd, EVENT_IO_READ );  /* reenabler */
+
+	    return (INT16)length;
+	}
+	pwsi->err = wsaErrno();
+    }
+    else if( pwsi ) pwsi->err = WSAENOTSOCK;
+    dprintf_winsock(stddeb, " -> ERROR\n");
+    return SOCKET_ERROR;
+}
+
+/***********************************************************************
+ *              recvfrom()		(WINSOCK.17)
+ */
+INT16 WINAPI WINSOCK_recvfrom16(SOCKET16 s, char *buf, INT16 len, INT16 flags,
+                                struct sockaddr *from, INT16 *fromlen16)
+{
+    INT32 fromlen32 = *fromlen16;
+    INT32 retVal = WINSOCK_recvfrom32( s, buf, len, flags, from, &fromlen32 );
+   *fromlen16 = fromlen32;
+    return (INT16)retVal;
+}
+
+/***********************************************************************
+ *		select()		(WINSOCK.18)
+ */
+INT16 WINAPI WINSOCK_select16(INT16 nfds, ws_fd_set *ws_readfds,
+                              ws_fd_set *ws_writefds, ws_fd_set *ws_exceptfds,
+                              struct timeval *timeout)
 {
   LPWSINFO      pwsi = wsi_find(GetCurrentTask());
 	
   dprintf_winsock(stddeb, "WS_SELECT(%08x): nfds %d (ignored), read %8x, write %8x, excp %8x\n", 
-	  (unsigned) pwsi, nfds, (unsigned) ws_readfds, (unsigned) ws_writefds, (unsigned) ws_exceptfds);
+  (unsigned) pwsi, nfds, (unsigned) ws_readfds, (unsigned) ws_writefds, (unsigned) ws_exceptfds);
 
   if( pwsi )
   {
@@ -760,7 +1005,23 @@
 	  {
 	    fd_set_update(pwsi, &readfds, ws_readfds, &errorfds);
 	    fd_set_update(pwsi, &writefds, ws_writefds, &errorfds);
-	    fd_set_update_except(pwsi, &exceptfds, ws_exceptfds, &errorfds);
+
+	    /* update exception set (see "weirdness" comment in the
+	     * beginning of the file). */
+
+	    if (ws_exceptfds)
+	    {
+		int i, j, count = ws_exceptfds->fd_count;
+
+		for (i = j = 0; i < count; i++)
+		{
+		    ws_socket *pws = (ws_socket *)WS_HANDLE2PTR(ws_exceptfds->fd_array[i]);
+		    if( _check_ws(pwsi, pws) && 
+			(FD_ISSET(pws->fd, &exceptfds) || FD_ISSET(pws->fd, &errorfds)) )
+			ws_exceptfds->fd_array[j++] = ws_exceptfds->fd_array[i];
+		}
+		ws_exceptfds->fd_count = j;
+	    }
 	  }
 	  return highfd; 
      }
@@ -769,95 +1030,191 @@
   return SOCKET_ERROR;
 }
 
-INT16 WINSOCK_send(SOCKET16 s, char *buf, INT16 len, INT16 flags)
+/***********************************************************************
+ *              select()		(WSOCK32.18)
+ */
+INT32 WINAPI WINSOCK_select32(INT32 nfds, ws_fd_set *ws_readfds,
+                              ws_fd_set *ws_writefds, ws_fd_set *ws_exceptfds,
+                              struct timeval *timeout)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    /* struct timeval is the same for both 32- and 16-bit code */
+    return WINSOCK_select16( (INT16)nfds, ws_readfds, ws_writefds, ws_exceptfds, timeout );
+}
 
-  dprintf_winsock(stddeb, "WS_SEND(%08x): socket %04x, ptr %08x, length %d, flags %d\n", 
+
+/***********************************************************************
+ *		send()			(WSOCK32.19)
+ */
+INT32 WINAPI WINSOCK_send32(SOCKET32 s, char *buf, INT32 len, INT32 flags)
+{
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_SEND(%08x): socket %04x, ptr %08x, length %d, flags %d\n", 
 			  (unsigned)pwsi, s, (unsigned) buf, len, flags);
-  if( _check_ws(pwsi, pws) )
-  {
-    int		length;
-    if ((length = send(pws->fd, buf, len, flags)) < 0 ) 
-    {  
-	length = SOCKET_ERROR;
+    if( _check_ws(pwsi, pws) )
+    {
+	int	length;
+
+	if ((length = send(pws->fd, buf, len, flags)) < 0 ) 
+	{
+	    pwsi->err = wsaErrno();
+	    if( pwsi->err == WSAEWOULDBLOCK && 
+		pws->psop && pws->flags & WS_FD_WRITE )
+		EVENT_AddIO( pws->fd, EVENT_IO_WRITE );	/* reenabler */
+	}
+	else return (INT16)length;
+    }
+    else if( pwsi ) pwsi->err = WSAENOTSOCK;
+    return SOCKET_ERROR;
+}
+
+/***********************************************************************
+ *              send()			(WINSOCK.19)
+ */
+INT16 WINAPI WINSOCK_send16(SOCKET16 s, char *buf, INT16 len, INT16 flags)
+{
+    return WINSOCK_send32( s, buf, len, flags );
+}
+
+/***********************************************************************
+ *		sendto()		(WSOCK32.20)
+ */
+INT32 WINAPI WINSOCK_sendto32(SOCKET32 s, char *buf, INT32 len, INT32 flags,
+                              struct sockaddr *to, INT32 tolen)
+{
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_SENDTO(%08x): socket %04x, ptr %08x, length %d, flags %d\n",
+                          (unsigned)pwsi, s, (unsigned) buf, len, flags);
+    if( _check_ws(pwsi, pws) )
+    {
+	INT32	length;
+
+	if ((length = sendto(pws->fd, buf, len, flags, to, tolen)) < 0 )
+	{
+	    pwsi->err = wsaErrno();
+	    if( pwsi->err == WSAEWOULDBLOCK &&
+		pws->psop && pws->flags & WS_FD_WRITE )
+		EVENT_AddIO( pws->fd, EVENT_IO_WRITE ); /* reenabler */
+	} 
+	else return length;
+    }
+    else if( pwsi ) pwsi->err = WSAENOTSOCK;
+    return SOCKET_ERROR;
+}
+
+/***********************************************************************
+ *              sendto()		(WINSOCK.20)
+ */
+INT16 WINAPI WINSOCK_sendto16(SOCKET16 s, char *buf, INT16 len, INT16 flags,
+                              struct sockaddr *to, INT16 tolen)
+{
+    return (INT16)WINSOCK_sendto32( s, buf, len, flags, to, tolen );
+}
+
+/***********************************************************************
+ *		setsockopt()		(WSOCK32.21)
+ */
+INT32 WINAPI WINSOCK_setsockopt32(SOCKET16 s, INT32 level, INT32 optname, 
+                                  char *optval, INT32 optlen)
+{
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_SETSOCKOPT(%08x): socket %04x, lev %d, opt %d, ptr %08x, len %d\n",
+			  (unsigned)pwsi, s, level, optname, (int) optval, optlen);
+    if( _check_ws(pwsi, pws) )
+    {
+	convert_sockopt(&level, &optname);
+	if (setsockopt(pws->fd, level, optname, optval, optlen) == 0) return 0;
 	pwsi->err = wsaErrno();
     }
-    notify_client(pws, WS_FD_WRITE);
-    return (INT16)length;
-  }
-  return SOCKET_ERROR;
+    else if( pwsi ) pwsi->err = WSAENOTSOCK;
+    return SOCKET_ERROR;
 }
 
-INT16 WINSOCK_sendto(SOCKET16 s, char *buf, INT16 len, INT16 flags,
-		     struct sockaddr *to, INT16 tolen)
+/***********************************************************************
+ *              setsockopt()		(WINSOCK.21)
+ */
+INT16 WINAPI WINSOCK_setsockopt16(SOCKET16 s, INT16 level, INT16 optname,
+                                  char *optval, INT16 optlen)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_SENDTO(%08x): socket %04x, ptr %08x, length %d, flags %d\n",
-                          (unsigned)pwsi, s, (unsigned) buf, len, flags);
-  if( _check_ws(pwsi, pws) )
-  {
-    int		length;
-
-    if ((length = sendto(pws->fd, buf, len, flags, to, tolen)) < 0 )
-    {
-	length = SOCKET_ERROR;
-        pwsi->err = wsaErrno();
-    }
-    notify_client(pws, WS_FD_WRITE);
-    return (INT16)length;
-  }
-  return SOCKET_ERROR;
-}
-
-INT16 WINSOCK_setsockopt(SOCKET16 s, INT16 level, INT16 optname, 
-			 char *optval, INT16 optlen)
-{
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_SETSOCKOPT(%08x): socket %04x, level %d, opt %d, ptr %08x, len %d\n",
-			  (unsigned)pwsi, s, level, optname, (int) optval, optlen);
-  if( _check_ws(pwsi, pws) )
-  {
-    int		linger32[2];
-    convert_sockopt(&level, &optname);
+    INT32 linger32[2];
     if( optname == SO_LINGER )
     {
-	INT16*	   ptr = (INT16*)optval;
-        linger32[0] = ptr[0];
-	linger32[1] = ptr[1]; 
+	INT16* ptr = (INT16*)optval;
+	linger32[0] = ptr[0];
+	linger32[1] = ptr[1];
 	optval = (char*)&linger32;
 	optlen = sizeof(linger32);
     }
-    if (setsockopt(pws->fd, level, optname, optval, optlen) == 0) return 0;
-    pwsi->err = wsaErrno();
-  }
-  return SOCKET_ERROR;
+    return (INT16)WINSOCK_setsockopt32( s, level, optname, optval, optlen );
 }
 
-INT16 WINSOCK_shutdown(SOCKET16 s, INT16 how)
+
+/***********************************************************************
+ *		shutdown()		(WSOCK32.22)
+ */
+INT32 WINAPI WINSOCK_shutdown32(SOCKET32 s, INT32 how)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
 
-  dprintf_winsock(stddeb, "WS_SHUTDOWN(%08x): socket %04x, how %i\n",
-			   (unsigned)pwsi, s, how );
-  if( _check_ws(pwsi, pws) )
-  {
-    pws->flags |= WS_FD_INACTIVE;
-    cancel_async_select(pws);
+    dprintf_winsock(stddeb, "WS_SHUTDOWN(%08x): socket %04x, how %i\n",
+			    (unsigned)pwsi, s, how );
+    if( _check_ws(pwsi, pws) )
+    {
+	if( pws->psop )
+	    switch( how )
+	    {
+		case 0: /* drop receives */
+			if( pws->flags & (WS_FD_READ | WS_FD_CLOSE) )
+			    EVENT_DeleteIO( pws->fd, EVENT_IO_READ );
+			pws->flags &= ~(WS_FD_READ | WS_FD_CLOSE);
+			break;
 
-    if (shutdown(pws->fd, how) == 0) return 0;
-    pwsi->err = wsaErrno();
-  }
-  return SOCKET_ERROR;
+		case 1: /* drop sends */
+			if( pws->flags & WS_FD_WRITE )
+			    EVENT_DeleteIO( pws->fd, EVENT_IO_WRITE );
+			pws->flags &= ~WS_FD_WRITE;
+			break;
+
+		case 2: /* drop all */
+		default:
+			WSAAsyncSelect( s, 0, 0, 0 );
+			break;
+	    }
+
+	if (shutdown(pws->fd, how) == 0) 
+	{
+	    if( how > 1 ) 
+	    {
+		pws->flags &= ~WS_FD_CONNECTED;
+		pws->flags |= WS_FD_INACTIVE;
+	    }
+	    return 0;
+	}
+	pwsi->err = wsaErrno();
+    } 
+    else if( pwsi ) pwsi->err = WSAENOTSOCK;
+    return SOCKET_ERROR;
 }
 
-SOCKET16 WINSOCK_socket(INT16 af, INT16 type, INT16 protocol)
+/***********************************************************************
+ *              shutdown()		(WINSOCK.22)
+ */
+INT16 WINAPI WINSOCK_shutdown16(SOCKET16 s, INT16 how)
+{
+    return (INT16)WINSOCK_shutdown32( s, how );
+}
+
+
+/***********************************************************************
+ *		socket()		(WSOCK32.23)
+ */
+SOCKET32 WINAPI WINSOCK_socket32(INT32 af, INT32 type, INT32 protocol)
 {
   LPWSINFO      pwsi = wsi_find(GetCurrentTask());
 
@@ -873,7 +1230,8 @@
     {
 	case AF_INET:
 	case AF_UNSPEC: break;
-	default:        pwsi->err = WSAEAFNOSUPPORT; return INVALID_SOCKET;
+	default:        pwsi->err = WSAEAFNOSUPPORT; 
+			return INVALID_SOCKET32;
     }
 
     /* check the socket type */
@@ -881,13 +1239,14 @@
     {
 	case SOCK_STREAM:
 	case SOCK_DGRAM:
-	case SOCK_RAW: break;
-	default:       pwsi->err = WSAESOCKTNOSUPPORT; return INVALID_SOCKET;
+	case SOCK_RAW:  break;
+	default:        pwsi->err = WSAESOCKTNOSUPPORT; 
+			return INVALID_SOCKET32;
     }
 
     /* check the protocol type */
     if ( protocol < 0 )  /* don't support negative values */
-    { pwsi->err = WSAEPROTONOSUPPORT; return INVALID_SOCKET; }
+    { pwsi->err = WSAEPROTONOSUPPORT; return INVALID_SOCKET32; }
 
     if ( af == AF_UNSPEC)  /* did they not specify the address family? */
         switch(protocol) 
@@ -896,7 +1255,7 @@
              if (type == SOCK_STREAM) { af = AF_INET; break; }
           case IPPROTO_UDP:
              if (type == SOCK_DGRAM)  { af = AF_INET; break; }
-          default: pwsi->err = WSAEPROTOTYPE; return INVALID_SOCKET;
+          default: pwsi->err = WSAEPROTOTYPE; return INVALID_SOCKET32;
         }
 
     if ((sock = socket(af, type, protocol)) >= 0) 
@@ -906,11 +1265,10 @@
 	dprintf_winsock(stddeb,"\tcreated %04x (handle %i)\n", sock, (UINT16)WS_PTR2HANDLE(pnew));
 
         if( pnew ) return (SOCKET16)WS_PTR2HANDLE(pnew);
-	{
-          close(sock);
-          pwsi->err = WSAENOBUFS;
-          return INVALID_SOCKET;
-	}
+	
+        close(sock);
+        pwsi->err = WSAENOBUFS;
+        return INVALID_SOCKET32;
     }
 
     if (errno == EPERM) /* raw socket denied */
@@ -921,265 +1279,337 @@
   }
  
   dprintf_winsock(stddeb, "\t\tfailed!\n");
-  return INVALID_SOCKET;
+  return INVALID_SOCKET32;
+}
+
+/***********************************************************************
+ *              socket()		(WINSOCK.23)
+ */
+SOCKET16 WINAPI WINSOCK_socket16(INT16 af, INT16 type, INT16 protocol)
+{
+    return (SOCKET16)WINSOCK_socket32( af, type, protocol );
 }
     
 
-/* ----- database functions 
+/* ----------------------------------- DNS services
  *
- * Note that ws_...ent structures we return have SEGPTR pointers inside them.
+ * IMPORTANT: 16-bit API structures have SEGPTR pointers inside them.
+ * Also, we have to use wsock32 stubs to convert error codes from Unix
+ * to WSA, hence no direct mapping in if1632/wsock32.spec.
+ *
+ * FIXME: Win32 may need "short" h_addrtype and h_length in
+ * ...ent structures. If so, use WS_dup_...(pwsi, ..., 0) to
+ * convert.
  */
 
 static char*	NULL_STRING = "NULL";
 
-/*
-struct WIN_hostent *
-*/
-SEGPTR WINSOCK_gethostbyaddr(const char *addr, INT16 len, INT16 type)
-{
-  LPWSINFO      	pwsi = wsi_find(GetCurrentTask());
 
-  dprintf_winsock(stddeb, "WS_GetHostByAddr(%08x): ptr %8x, len %d, type %d\n", 
+/***********************************************************************
+ *		gethostbyaddr()		(WINSOCK.51)
+ *
+ *
+struct WIN_hostent *
+ */
+SEGPTR WINAPI WINSOCK_gethostbyaddr16(const char *addr, INT16 len, INT16 type)
+{
+    LPWSINFO      	pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetHostByAddr16(%08x): ptr %8x, len %d, type %d\n", 
 			  (unsigned)pwsi, (unsigned) addr, len, type);
-  if( pwsi )
-  {
-    struct hostent* 	host;
-    if( (host = gethostbyaddr(addr, len, type)) != NULL )
-      if( WS_dup_he(pwsi, host, WS_DUP_SEGPTR) )
-          return SEGPTR_GET(pwsi->buffer);
-      else pwsi->err = WSAENOBUFS;
-    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
-  } 
-  return NULL;
-}
-
-/*
-struct WIN_hostent *
-*/
-SEGPTR WINSOCK_gethostbyname(const char *name)
-{
-  LPWSINFO              pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_GetHostByName(%08x): %s\n",
-                          (unsigned)pwsi, (name)?name:"NULL");
-  if( pwsi )
-  {
-    struct hostent*     host;
-    if( (host = gethostbyname(name)) != NULL )
-      if( WS_dup_he(pwsi, host, WS_DUP_SEGPTR) )
-          return SEGPTR_GET(pwsi->buffer);
-      else pwsi->err = WSAENOBUFS;
-    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
-  }
-  return NULL;
-}
-
-INT16 WINSOCK_gethostname(char *name, INT16 namelen)
-{
-  LPWSINFO              pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_GetHostName(%08x): name %s, len %d\n", 
-			  (unsigned)pwsi, (name)?name:NULL_STRING, namelen);
-  if( pwsi )
-  {
-    if (gethostname(name, namelen) == 0) return 0;
-    pwsi->err = (errno == EINVAL) ? WSAEFAULT : wsaErrno();
-  }
-  return SOCKET_ERROR;
-}
-
-/*
-struct WIN_protoent *
-*/
-SEGPTR WINSOCK_getprotobyname(char *name)
-{
-  LPWSINFO              pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_GetProtoByName(%08x): %s\n",
-                          (unsigned)pwsi, (name)?name:NULL_STRING);
-  if( pwsi )
-  {
-    struct protoent*     proto;
-    if( (proto = getprotobyname(name)) != NULL )
-      if( WS_dup_pe(pwsi, proto, WS_DUP_SEGPTR) )
-          return SEGPTR_GET(pwsi->buffer);
-      else pwsi->err = WSAENOBUFS;
-    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
-  }
-  return NULL;
-}
-
-/*
-struct WIN_protoent *
-*/
-SEGPTR WINSOCK_getprotobynumber(INT16 number)
-{
-  LPWSINFO              pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_GetProtoByNumber(%08x): %i\n", (unsigned)pwsi, number);
-
-  if( pwsi )
-  {
-    struct protoent*     proto;
-    if( (proto = getprotobynumber(number)) != NULL )
-      if( WS_dup_pe(pwsi, proto, WS_DUP_SEGPTR) )
-          return SEGPTR_GET(pwsi->buffer);
-      else pwsi->err = WSAENOBUFS;
-    else pwsi->err = WSANO_DATA;
-  }
-  return NULL;
-}
-
-/*
-struct WIN_servent *
-*/
-SEGPTR WINSOCK_getservbyname(const char *name, const char *proto)
-{
-  LPWSINFO              pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_GetServByName(%08x): '%s', '%s'\n", 
-			  (unsigned)pwsi, (name)?name:NULL_STRING, (proto)?proto:NULL_STRING);
-
-  if( pwsi )
-  {
-    struct servent*     serv;
-    if( (serv = getservbyname(name, proto)) != NULL )
-      if( WS_dup_se(pwsi, serv, WS_DUP_SEGPTR) )
-          return SEGPTR_GET(pwsi->buffer);
-      else pwsi->err = WSAENOBUFS;
-    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
-  }
-  return NULL;
-}
-
-/*
-struct WIN_servent *
-*/
-SEGPTR WINSOCK_getservbyport(INT16 port, const char *proto)
-{
-  LPWSINFO              pwsi = wsi_find(GetCurrentTask());
-
-  dprintf_winsock(stddeb, "WS_GetServByPort(%08x): %i, '%s'\n",
-                          (unsigned)pwsi, (int)port, (proto)?proto:NULL_STRING);
-  if( pwsi )
-  {
-    struct servent*     serv;
-    if( (serv = getservbyport(port, proto)) != NULL )
-      if( WS_dup_se(pwsi, serv, WS_DUP_SEGPTR) )
-          return SEGPTR_GET(pwsi->buffer);
-      else pwsi->err = WSAENOBUFS;
-    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
-  }
-  return NULL;
-}
-
-
-/* ----------------------------------- Windows sockets extensions -- *
- *								     *
- * ----------------------------------------------------------------- */
-
-static int aop_control(ws_async_op* p_aop, int flag )
-{
-  unsigned	lLength;
-
-  read(p_aop->fd[0], &lLength, sizeof(unsigned));
-  if( LOWORD(lLength) )
-    if( (int)LOWORD(lLength) <= p_aop->buflen )
+    if( pwsi )
     {
-      char* buffer = (char*)PTR_SEG_TO_LIN(p_aop->buffer_base);
-      read(p_aop->fd[0], buffer, LOWORD(lLength));
-      switch( p_aop->flags )
-      {
-	case WSMSG_ASYNC_HOSTBYNAME:
-	case WSMSG_ASYNC_HOSTBYADDR: 
-	     fixup_wshe((struct ws_hostent*)buffer, p_aop->buffer_base); break;
-	case WSMSG_ASYNC_PROTOBYNAME:
-	case WSMSG_ASYNC_PROTOBYNUM:
-	     fixup_wspe((struct ws_protoent*)buffer, p_aop->buffer_base); break;
-	case WSMSG_ASYNC_SERVBYNAME:
-	case WSMSG_ASYNC_SERVBYPORT:
-	     fixup_wsse((struct ws_servent*)buffer, p_aop->buffer_base); break;
-	default:
-	     if( p_aop->flags ) fprintf(stderr,"Received unknown async request!\n"); 
-	     return AOP_CONTROL_REMOVE;
-      }
+	struct hostent*	host = gethostbyaddr(addr, len, type);
+	if( host )
+	    if( WS_dup_he(pwsi, host, WS_DUP_SEGPTR) )
+		return SEGPTR_GET(pwsi->buffer);
+	    else 
+		pwsi->err = WSAENOBUFS;
+	else 
+	    pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
     }
-    else lLength =  ((UINT32)LOWORD(lLength)) | ((unsigned)WSAENOBUFS << 16);
-
-#if 0
-  printf("async op completed: hWnd [%04x], uMsg [%04x], aop [%04x], event [%08x]\n",
-	 p_aop->hWnd, p_aop->uMsg, (HANDLE16)WS_PTR2HANDLE(p_aop), (LPARAM)lLength);
-#endif
-
-  PostMessage16(p_aop->hWnd, p_aop->uMsg, (HANDLE16)WS_PTR2HANDLE(p_aop), (LPARAM)lLength);
-  return AOP_CONTROL_REMOVE;
+    return (SEGPTR)NULL;
 }
 
-
-static HANDLE16 __WSAsyncDBQuery(LPWSINFO pwsi, HWND16 hWnd, UINT16 uMsg, LPCSTR init,
-				 INT16 len, INT16 type, SEGPTR sbuf, INT16 buflen, UINT32 flag)
+/***********************************************************************
+ *              gethostbyaddr()		(WSOCK32.51)
+ */
+struct hostent*  WINAPI WINSOCK_gethostbyaddr32(const char *addr, INT32 len,
+                                                INT32 type)
 {
-  /* queue 'flag' request and fork off its handler */
+    LPWSINFO		pwsi = wsi_find(GetCurrentTask());
 
-  async_ctl.ws_aop = (ws_async_op*)WS_ALLOC(sizeof(ws_async_op));
-
-  if( async_ctl.ws_aop )
-  {
-      HANDLE16        handle = (HANDLE16)WS_PTR2HANDLE(async_ctl.ws_aop);
-
-      if( pipe(async_ctl.ws_aop->fd) == 0 )
-      {
-	async_ctl.init = (char*)init;
-	async_ctl.lLength = len;
-	async_ctl.lEvent = type;
-
-        async_ctl.ws_aop->hWnd = hWnd;
-        async_ctl.ws_aop->uMsg = uMsg;
-
-	async_ctl.ws_aop->buffer_base = sbuf; async_ctl.ws_aop->buflen = buflen;
-	async_ctl.ws_aop->flags = flag;
-	async_ctl.ws_aop->aop_control = &aop_control;
-	WINSOCK_link_async_op( async_ctl.ws_aop );
-
-        async_ctl.ws_aop->pid = fork();
-        if( async_ctl.ws_aop->pid )
-        {
-            close(async_ctl.ws_aop->fd[1]);        /* write endpoint */
-
-           /* Damn, BSD'ish SIGIO doesn't work on pipes/streams
-            *
-            * async_io(async_ctl.ws_aop->fd[0], 1);
-            */
-
-            dprintf_winsock(stddeb, "\tasync_op = %04x (child %i)\n",
-                                    handle, async_ctl.ws_aop->pid);
-            return handle;
-        } else
-                /* child process */
-                 {
-                   close(async_ctl.ws_aop->fd[0]); /* read endpoint */
-		   switch(flag)
-		   {
-		     case WSMSG_ASYNC_HOSTBYADDR:
-		     case WSMSG_ASYNC_HOSTBYNAME:
- 			WS_do_async_gethost(pwsi,flag);
-		     case WSMSG_ASYNC_PROTOBYNUM:
-		     case WSMSG_ASYNC_PROTOBYNAME:
-			WS_do_async_getproto(pwsi,flag);
-		     case WSMSG_ASYNC_SERVBYPORT:
-		     case WSMSG_ASYNC_SERVBYNAME:
-			WS_do_async_getserv(pwsi,flag);
-		   }
-		   _exit(0); /* skip atexit()'ed cleanup */
-                 }
-      }
-      WS_FREE(async_ctl.ws_aop);
-      pwsi->err = wsaErrno();
-  } else pwsi->err = WSAEWOULDBLOCK;
-  return 0;
+    dprintf_winsock(stddeb, "WS_GetHostByAddr32(%08x): ptr %8x, len %d, type %d\n",
+                            (unsigned)pwsi, (unsigned) addr, len, type);
+    if( pwsi )
+    {
+	struct hostent* host = gethostbyaddr( addr, len, type );
+	if( host ) 
+	    return host;
+	pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    }
+    return NULL;
 }
 
-HANDLE16 WSAAsyncGetHostByAddr(HWND16 hWnd, UINT16 uMsg, LPCSTR addr,
+/***********************************************************************
+ *		gethostbyname()		(WINSOCK.52) 
+ *
+ *
+struct WIN_hostent *
+ */
+SEGPTR WINAPI WINSOCK_gethostbyname16(const char *name)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetHostByName16(%08x): %s\n",
+                          (unsigned)pwsi, (name)?name:"NULL");
+    if( pwsi )
+    {
+	struct hostent*     host;
+	if( (host = gethostbyname(name)) != NULL )
+	    if( WS_dup_he(pwsi, host, WS_DUP_SEGPTR) )
+		return SEGPTR_GET(pwsi->buffer);
+	    else pwsi->err = WSAENOBUFS;
+	else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+  }
+  return (SEGPTR)NULL;
+}
+
+/***********************************************************************
+ *              gethostbyname()		(WSOCK32,52)
+ */
+struct hostent*  WINAPI WINSOCK_gethostbyname32(const char* name)
+{
+    LPWSINFO            pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetHostByName32(%08x): %s\n",
+                            (unsigned)pwsi, (name)?name:"NULL");
+    if( pwsi )
+    {
+	struct hostent* host = gethostbyname( name );
+	if( host )
+	    return host;
+	pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    }
+    return NULL;
+}
+
+/***********************************************************************
+ *		gethostname()		(WSOCK32.57)
+ */
+INT32 WINAPI WINSOCK_gethostname32(char *name, INT32 namelen)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetHostName(%08x): name %s, len %d\n", 
+			  (unsigned)pwsi, (name)?name:NULL_STRING, namelen);
+    if( pwsi )
+    {
+	if (gethostname(name, namelen) == 0) return 0;
+	pwsi->err = (errno == EINVAL) ? WSAEFAULT : wsaErrno();
+    }
+    return SOCKET_ERROR;
+}
+
+/***********************************************************************
+ *              gethostname()		(WINSOCK.57)
+ */
+INT16 WINAPI WINSOCK_gethostname16(char *name, INT16 namelen)
+{
+    return (INT16)WINSOCK_gethostname32(name, namelen);
+}
+
+/***********************************************************************
+ *		getprotobyname()	(WINSOCK.53)
+ *
+ *
+struct WIN_protoent *
+ */
+SEGPTR WINAPI WINSOCK_getprotobyname16(char *name)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetProtoByName16(%08x): %s\n",
+                          (unsigned)pwsi, (name)?name:NULL_STRING);
+    if( pwsi )
+    {
+	struct protoent*     proto;
+	if( (proto = getprotobyname(name)) != NULL )
+	    if( WS_dup_pe(pwsi, proto, WS_DUP_SEGPTR) )
+		return SEGPTR_GET(pwsi->buffer);
+	    else pwsi->err = WSAENOBUFS;
+	else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    }
+    return (SEGPTR)NULL;
+}
+
+/***********************************************************************
+ *              getprotobyname()	(WSOCK32.53)
+ */
+struct protoent* WINAPI WINSOCK_getprotobyname32(char* name)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetProtoByName32(%08x): %s\n",
+                          (unsigned)pwsi, (name)?name:NULL_STRING);
+    if( pwsi )
+    {
+	struct protoent* proto;
+	if( (proto = getprotobyname(name)) != NULL )
+                return proto;
+        pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    }
+    return NULL;
+}
+
+
+/***********************************************************************
+ *		getprotobynumber()	(WINSOCK.54)
+ *
+ *
+struct WIN_protoent *
+ */
+SEGPTR WINAPI WINSOCK_getprotobynumber16(INT16 number)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetProtoByNumber16(%08x): %i\n", (unsigned)pwsi, number);
+
+    if( pwsi )
+    {
+	struct protoent*     proto;
+	if( (proto = getprotobynumber(number)) != NULL )
+	    if( WS_dup_pe(pwsi, proto, WS_DUP_SEGPTR) )
+		return SEGPTR_GET(pwsi->buffer);
+	    else pwsi->err = WSAENOBUFS;
+	else pwsi->err = WSANO_DATA;
+    }
+    return (SEGPTR)NULL;
+}
+
+/***********************************************************************
+ *              getprotobynumber()	(WSOCK32.54)
+ */
+struct protoent* WINAPI WINSOCK_getprotobynumber32(INT32 number)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetProtoByNumber32(%08x): %i\n", (unsigned)pwsi, number);
+
+    if( pwsi )
+    {
+	struct protoent* proto;
+	if( (proto = getprotobynumber(number)) != NULL )
+	    return proto;
+	pwsi->err = WSANO_DATA;
+    }
+    return NULL;
+}
+
+/***********************************************************************
+ *		getservbyname()		(WINSOCK.55)
+ *
+ *
+struct WIN_servent *
+ */
+SEGPTR WINAPI WINSOCK_getservbyname16(const char *name, const char *proto)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetServByName16(%08x): '%s', '%s'\n", 
+			  (unsigned)pwsi, (name)?name:NULL_STRING, (proto)?proto:NULL_STRING);
+    if( pwsi )
+    {
+	struct servent*     serv;
+	if( (serv = getservbyname(name, proto)) != NULL )
+	    if( WS_dup_se(pwsi, serv, WS_DUP_SEGPTR) )
+		return SEGPTR_GET(pwsi->buffer);
+	    else pwsi->err = WSAENOBUFS;
+	else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    }
+    return (SEGPTR)NULL;
+}
+
+/***********************************************************************
+ *              getservbyname()		(WSOCK32.55)
+ */
+struct servent* WINAPI WINSOCK_getservbyname32(const char *name, const char *proto)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetServByName32(%08x): '%s', '%s'\n",
+                          (unsigned)pwsi, (name)?name:NULL_STRING, (proto)?proto:NULL_STRING);
+    if( pwsi )
+    {
+	struct servent* serv;
+	if( (serv = getservbyname(name, proto)) != NULL )
+	    return serv;
+	pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    }
+    return NULL;
+}
+
+/***********************************************************************
+ *		getservbyport()		(WINSOCK.56)
+ *
+ *
+struct WIN_servent *
+ */
+SEGPTR WINAPI WINSOCK_getservbyport16(INT16 port, const char *proto)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetServByPort16(%08x): %i, '%s'\n",
+                          (unsigned)pwsi, (int)port, (proto)?proto:NULL_STRING);
+    if( pwsi )
+    {
+	struct servent*     serv;
+	if( (serv = getservbyport(port, proto)) != NULL )
+	    if( WS_dup_se(pwsi, serv, WS_DUP_SEGPTR) )
+		return SEGPTR_GET(pwsi->buffer);
+	    else pwsi->err = WSAENOBUFS;
+	else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    }
+    return (SEGPTR)NULL;
+}
+
+/***********************************************************************
+ *              getservbyport()		(WSOCK32.56)
+ */
+struct servent* WINAPI WINSOCK_getservbyport32(INT32 port, const char *proto)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_GetServByPort32(%08x): %i, '%s'\n",
+                          (unsigned)pwsi, (int)port, (proto)?proto:NULL_STRING);
+    if( pwsi )
+    {
+	struct servent* serv;
+	if( (serv = getservbyport(port, proto)) != NULL )
+	    return serv;
+	pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    }
+    return NULL;
+}
+
+
+/* ------------------------------------- Windows sockets extensions -- *
+ *								       *
+ * ------------------------------------------------------------------- */
+
+
+/***********************************************************************
+ *          Asynchronous DNS services
+ */
+
+/* winsock_dns.c */
+extern HANDLE16 __WSAsyncDBQuery(LPWSINFO pwsi, HWND16 hWnd, UINT16 uMsg, INT16 type, LPCSTR init,
+				 INT16 len, LPCSTR proto, SEGPTR sbuf, INT16 buflen, UINT32 flag);
+
+/***********************************************************************
+ *       WSAAsyncGetHostByAddr()	(WINSOCK.102)
+ */
+HANDLE16 WINAPI WSAAsyncGetHostByAddr(HWND16 hWnd, UINT16 uMsg, LPCSTR addr,
                                INT16 len, INT16 type, SEGPTR sbuf, INT16 buflen)
 {
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
@@ -1188,14 +1618,17 @@
                           (unsigned)pwsi, hWnd, uMsg, (unsigned)addr , len );
 
   if( pwsi ) 
-    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, addr, len,
-			    type, sbuf, buflen, WSMSG_ASYNC_HOSTBYADDR );
+    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, type, addr, len,
+			    NULL, sbuf, buflen, WSMSG_ASYNC_HOSTBYADDR );
   return 0;
 }
 
 
-HANDLE16 WSAAsyncGetHostByName(HWND16 hWnd, UINT16 uMsg, LPCSTR name, 
-                               SEGPTR sbuf, INT16 buflen)
+/***********************************************************************
+ *       WSAAsyncGetHostByName()	(WINSOCK.103)
+ */
+HANDLE16 WINAPI WSAAsyncGetHostByName(HWND16 hWnd, UINT16 uMsg, LPCSTR name, 
+                                      SEGPTR sbuf, INT16 buflen)
 {
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
 
@@ -1203,14 +1636,17 @@
                           (unsigned)pwsi, hWnd, uMsg, (name)?name:NULL_STRING, (int)buflen );
 
   if( pwsi )
-    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, name, 0,
-                            0, sbuf, buflen, WSMSG_ASYNC_HOSTBYNAME );
+    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, 0, name, 0,
+                            NULL, sbuf, buflen, WSMSG_ASYNC_HOSTBYNAME );
   return 0;
 }                     
 
 
-HANDLE16 WSAAsyncGetProtoByName(HWND16 hWnd, UINT16 uMsg, LPCSTR name, 
-                                SEGPTR sbuf, INT16 buflen)
+/***********************************************************************
+ *       WSAAsyncGetProtoByName()	(WINSOCK.105)
+ */
+HANDLE16 WINAPI WSAAsyncGetProtoByName(HWND16 hWnd, UINT16 uMsg, LPCSTR name, 
+                                       SEGPTR sbuf, INT16 buflen)
 {
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
 
@@ -1218,14 +1654,17 @@
                           (unsigned)pwsi, hWnd, uMsg, (name)?name:NULL_STRING );
 
   if( pwsi )
-    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, name, 0,
-                            0, sbuf, buflen, WSMSG_ASYNC_PROTOBYNAME );
+    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, 0, name, 0,
+                            NULL, sbuf, buflen, WSMSG_ASYNC_PROTOBYNAME );
   return 0;
 }
 
 
-HANDLE16 WSAAsyncGetProtoByNumber(HWND16 hWnd, UINT16 uMsg, INT16 number, 
-                                  SEGPTR sbuf, INT16 buflen)
+/***********************************************************************
+ *       WSAAsyncGetProtoByNumber()	(WINSOCK.104)
+ */
+HANDLE16 WINAPI WSAAsyncGetProtoByNumber(HWND16 hWnd, UINT16 uMsg, INT16 number, 
+                                         SEGPTR sbuf, INT16 buflen)
 {
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
 
@@ -1233,14 +1672,17 @@
                           (unsigned)pwsi, hWnd, uMsg, number );
 
   if( pwsi )
-    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, NULL, 0,
-                            number, sbuf, buflen, WSMSG_ASYNC_PROTOBYNUM );
+    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, number, NULL, 0,
+                            NULL, sbuf, buflen, WSMSG_ASYNC_PROTOBYNUM );
   return 0;
 }
 
 
-HANDLE16 WSAAsyncGetServByName(HWND16 hWnd, UINT16 uMsg, LPCSTR name, 
-                               LPCSTR proto, SEGPTR sbuf, INT16 buflen)
+/***********************************************************************
+ *       WSAAsyncGetServByName()	(WINSOCK.107)
+ */
+HANDLE16 WINAPI WSAAsyncGetServByName(HWND16 hWnd, UINT16 uMsg, LPCSTR name, 
+                                      LPCSTR proto, SEGPTR sbuf, INT16 buflen)
 {
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
 
@@ -1248,17 +1690,16 @@
                    (unsigned)pwsi, hWnd, uMsg, (name)?name:NULL_STRING, (proto)?proto:NULL_STRING );
 
   if( pwsi )
-  { 
-    async_ctl.buffer = (char*)proto;
-    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, name, 0,
-                            0, sbuf, buflen, WSMSG_ASYNC_SERVBYNAME );
-  }
+    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, 0, name, 0,
+                            proto, sbuf, buflen, WSMSG_ASYNC_SERVBYNAME );
   return 0;
 }
 
-
-HANDLE16 WSAAsyncGetServByPort(HWND16 hWnd, UINT16 uMsg, INT16 port, 
-			       LPCSTR proto, SEGPTR sbuf, INT16 buflen)
+/***********************************************************************
+ *       WSAAsyncGetServByPort()	(WINSOCK.106)
+ */
+HANDLE16 WINAPI WSAAsyncGetServByPort(HWND16 hWnd, UINT16 uMsg, INT16 port, 
+                                      LPCSTR proto, SEGPTR sbuf, INT16 buflen)
 {
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
 
@@ -1266,170 +1707,315 @@
                            (unsigned)pwsi, hWnd, uMsg, port, (proto)?proto:NULL_STRING );
 
   if( pwsi )
-    return __WSAsyncDBQuery(pwsi, hWnd, uMsg, proto, 0,
-                            port, sbuf, buflen, WSMSG_ASYNC_SERVBYPORT );
+      return __WSAsyncDBQuery(pwsi, hWnd, uMsg, port, proto, 0,
+                              NULL, sbuf, buflen, WSMSG_ASYNC_SERVBYPORT );
   return 0;
 }
 
-INT16 WSACancelAsyncRequest(HANDLE16 hAsyncTaskHandle)
+/***********************************************************************
+ *       WSACancelAsyncRequest()	(WINSOCK.108)
+ */
+INT16 WINAPI WSACancelAsyncRequest(HANDLE16 hAsyncTaskHandle)
 {
+  INT16			retVal = SOCKET_ERROR;
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
   ws_async_op*		p_aop = (ws_async_op*)WS_HANDLE2PTR(hAsyncTaskHandle);
 
   dprintf_winsock(stddeb, "WS_CancelAsyncRequest(%08x): handle %04x\n", 
 			   (unsigned)pwsi, hAsyncTaskHandle);
   if( pwsi )
-    if( WINSOCK_check_async_op(p_aop) )
-    {
-  	kill(p_aop->pid, SIGKILL); 
-	waitpid(p_aop->pid, NULL, 0); /* just in case */
-	close(p_aop->fd[0]);
-	WINSOCK_unlink_async_op(p_aop);
-	WS_FREE(p_aop);
-	return 0;
-    }
-    else pwsi->err = WSAEINVAL;
-  return SOCKET_ERROR;
-}
-
-/* ----- asynchronous select() */
-
-int cancel_async_select(ws_socket* pws)
-{
-  if( pws->p_aop )
   {
-    kill(pws->p_aop->pid, SIGKILL);
-    waitpid(pws->p_aop->pid, NULL, 0);
-    WS_FREE(pws->p_aop); 
-    pws->p_aop = NULL;
-    return 1;
-  }
-  return 0;
-}
-
-void _sigusr1_handler_parent(int sig)
-{
-  /* child process puts MTYPE_CLIENT data packet into the
-   * 'async_qid' message queue and signals us with SIGUSR1.
-   * This handler reads the queue and posts 'uMsg' notification
-   * message.
-   */
-
-  ipc_packet		ipack;
-
-  signal( SIGUSR1, _sigusr1_handler_parent);
-  while( msgrcv(async_qid, (struct msgbuf*)&ipack,
-          MTYPE_CLIENT_SIZE, MTYPE_CLIENT, IPC_NOWAIT) != -1 )
-  {
-    if( ipack.wParam && abs((short)ipack.wParam) < 32768 )
-    {
-      ws_socket*        pws = (ws_socket*)WS_HANDLE2PTR(ipack.wParam);
-      if( pws->p_aop && abs((char*)_ws_stub - (char*)pws->p_aop) < 32768 )
+      SIGNAL_MaskAsyncEvents( TRUE );	/* block SIGIO */
+      if( WINSOCK_cancel_async_op(p_aop) )
       {
-	  pws->flags &= ~(ipack.lParam);
-#if 0
-          printf("async event - hWnd %04x, uMsg %04x [%08x]\n",
-                  pws->p_aop->hWnd, pws->p_aop->uMsg, ipack.lParam );
-#endif
-	  PostMessage16(pws->p_aop->hWnd, pws->p_aop->uMsg, 
-                        (WPARAM16)ipack.wParam, (LPARAM)ipack.lParam );
+	  WS_FREE(p_aop);
+	  pwsi->num_async_rq--;
+	  retVal = 0;
       }
-      else fprintf(stderr,"AsyncSelect:stray async_op in socket %04x!\n", ipack.wParam);
-    }
-    else fprintf(stderr,"AsyncSelect:stray socket at %04x!\n", ipack.wParam);
+      else pwsi->err = WSAEINVAL;
+      SIGNAL_MaskAsyncEvents( FALSE );
   }
+  return retVal;
 }
 
-int notify_client( ws_socket* pws, unsigned flag )
+/***********************************************************************
+ *      WSAAsyncSelect()		(WINSOCK.101)
+ */
+
+static ws_select_op* __ws_select_list = NULL;
+
+BOOL32 WINSOCK_HandleIO( int* max_fd, int num_pending, fd_set io_set[3] )
 {
-  if( pws->p_aop && ((pws->p_aop->flags & flag) ||
-		     (flag == WS_FD_CONNECTED && pws->flags & WS_FD_CONNECT)) )
-  {
-     async_ctl.ip.mtype = MTYPE_PARENT;
-     async_ctl.ip.lParam = flag;
-     while( msgsnd(async_qid, (struct msgbuf*)&(async_ctl.ip),
-                               MTYPE_PARENT_SIZE, 0) == -1 )
-     { 
-	if( errno == EINTR ) continue;
-	else
-	{
-	    perror("AsyncSelect(parent)"); 
-	    cancel_async_select(pws);
-	    pws->flags &= WS_FD_INTERNAL;
-	    return 0;
-	}
-     }
-     kill(pws->p_aop->pid, SIGUSR1);
-     return 1;
-  }
-  return 0;
-}
+    /* This function is called by the event dispatcher
+     * with io_set containing the result of select() */
 
-INT16 init_async_select(ws_socket* pws, HWND16 hWnd, UINT16 uMsg, UINT32 lEvent)
-{
-    ws_async_op*        p_aop;
+    ws_select_op*	psop = __ws_select_list;
+    BOOL32		bPost = FALSE;
+    DWORD		dwEvent, dwErrBytes;
+    int			num_posted;
 
-    if( cancel_async_select(pws) )  /* delete old async handler if any */
-      pws->flags &= WS_FD_INTERNAL;
+    dprintf_winsock(stddeb,"WINSOCK_HandleIO: %i pending descriptors\n", num_pending );
 
-    if( lEvent == 0 ) return 0;
-
-    /* setup async handler - some data may be redundant */
-
-    WINSOCK_unblock_io(pws->fd, 1);
-    if( (p_aop = (ws_async_op*)WS_ALLOC(sizeof(ws_async_op))) )
+    for( num_posted = dwEvent = 0 ; psop; psop = psop->next )
     {
-      p_aop->hWnd = hWnd;
-      p_aop->uMsg = uMsg;
-      pws->p_aop = p_aop;
+	unsigned	flags = psop->pws->flags;
+	int		fd = psop->pws->fd;
+	int		r, w, e;
 
-      async_ctl.lEvent = p_aop->flags = lEvent;
-      async_ctl.ws_sock = pws;
-      async_ctl.ip.wParam = (UINT16)WS_PTR2HANDLE(pws);
-      async_ctl.ip.lParam = 0;
+	w = 0;
+	if( (r = FD_ISSET( fd, &io_set[EVENT_IO_READ] )) ||
+	    (w = FD_ISSET( fd, &io_set[EVENT_IO_WRITE] )) ||
+	    (e = FD_ISSET( fd, &io_set[EVENT_IO_EXCEPT] )) )
+	{
+	    /* This code removes WS_FD flags on one-shot events (WS_FD_CLOSE, 
+	     * WS_FD_CONNECT), otherwise it clears descriptors in the io_set.
+	     * Reenabling calls turn them back on.
+	     */
 
-      p_aop->pid = fork();
-      if( p_aop->pid != -1 )
-        if( p_aop->pid == 0 ) WINSOCK_do_async_select(); /* child process */
-	else pws->flags |= lEvent;
+	    dprintf_winsock(stddeb,"\tchecking psop = 0x%08x\n", (unsigned) psop );
 
-      signal( SIGUSR1, _sigusr1_handler_parent );
-      return 0;                                  /* Wine process */
+	    num_pending--;
+
+	    if( flags & WS_FD_ACCEPT )
+	    {
+		/* listening socket */
+
+		FD_CLR( fd, &io_set[EVENT_IO_WRITE] );
+		if( r )
+		{
+		    FD_CLR( fd, &io_set[EVENT_IO_READ] ); /* reenabled by the next accept() */
+		    dwEvent = WSAMAKESELECTREPLY( WS_FD_ACCEPT, 0 );
+		    bPost = TRUE;
+		} 
+		else continue;
+	    }
+	    else if( flags & WS_FD_CONNECT )
+	    {
+		/* connecting socket */
+
+		if( w || (w = FD_ISSET( fd, &io_set[EVENT_IO_WRITE] )) )
+		{
+		    /* ready to write means that socket is connected */
+
+		    psop->pws->flags |= WS_FD_CONNECTED;
+		    psop->pws->flags &= ~(WS_FD_CONNECT | WS_FD_INACTIVE);
+		    dwEvent = WSAMAKESELECTREPLY( WS_FD_CONNECT, 0 );
+
+		    if( flags & (WS_FD_READ | WS_FD_CLOSE))
+			FD_SET( fd, &io_set[EVENT_IO_READ] );
+		    if( flags & WS_FD_WRITE ) FD_SET( fd, &io_set[EVENT_IO_WRITE] );
+		    else FD_CLR( fd, &io_set[EVENT_IO_WRITE] );
+		    bPost = TRUE;
+		}
+		else if( r )
+		{
+		    /* failure - do read() to get correct errno */
+
+		    if( read( fd, &dwErrBytes, sizeof(dwErrBytes) ) == -1 )
+		    {
+			dwEvent = WSAMAKESELECTREPLY( WS_FD_CONNECT, wsaErrno() );
+			bPost = TRUE;
+		    }
+		}
+		/* otherwise bPost stays FALSE */
+	    }
+	    else 
+	    {
+		/* connected socket --
+		 * removed WS_FD_OOB code for now.
+		 */
+
+		if( flags & WS_FD_WRITE &&
+		   (w || (w = FD_ISSET( fd, &io_set[EVENT_IO_WRITE] ))) )
+		{
+		    /* this will be reenabled when send() or sendto() fail with
+		     * WSAEWOULDBLOCK */
+
+		    if( PostMessage16( psop->hWnd, psop->uMsg, (WPARAM16)WS_PTR2HANDLE(psop->pws), 
+			              (LPARAM)WSAMAKESELECTREPLY( WS_FD_WRITE, 0 ) ) )
+		    {
+			FD_CLR( fd, &io_set[EVENT_IO_WRITE] );
+			num_posted++;
+		    }
+		}
+
+		if( r && (flags & (WS_FD_READ | WS_FD_CLOSE)) )
+		{
+		    int val = (flags & WS_FD_RAW);
+
+		     /* WS_FD_RAW is set by the WSAAsyncSelect() init */
+
+		    bPost = TRUE;
+		    if( !val && ioctl( fd, FIONREAD, (char*)&dwErrBytes) == -1 )
+		    {
+			/* weirdness */
+
+			dwEvent = WSAMAKESELECTREPLY( WS_FD_READ, wsaErrno() );
+		    }
+		    else if( val || dwErrBytes )
+		    {
+			/* got pending data, will be reenabled by recv() or recvfrom() */
+
+			FD_CLR( fd, &io_set[EVENT_IO_READ] );
+			dwEvent = WSAMAKESELECTREPLY( WS_FD_READ, 0 );
+		    }
+		    else
+		    {
+			/* 0 bytes to read - connection reset by peer? */
+
+			do
+			    val = read( fd, (char*)&dwErrBytes, sizeof(dwErrBytes));
+			while( errno == EINTR );
+			if( errno != EWOULDBLOCK )
+			{
+			    switch( val )
+			    {
+				case  0: errno = ENETDOWN;	/* soft reset, fall through */
+				case -1: 			/* hard reset */
+					 dwEvent = WSAMAKESELECTREPLY( WS_FD_CLOSE, wsaErrno() );
+					 break;
+
+				default: bPost = FALSE;
+					 continue;		/* FIXME: this is real bad */
+			    }
+			}
+			else { bPost = FALSE; continue; }	/* more weirdness */
+
+			/* this is it, this socket is closed */
+
+			psop->pws->flags &= ~(WS_FD_READ | WS_FD_CLOSE | WS_FD_WRITE);
+			FD_CLR( fd, &io_set[EVENT_IO_READ] );
+			FD_CLR( fd, &io_set[EVENT_IO_WRITE] );
+
+			if( *max_fd == (fd + 1) ) (*max_fd)--;
+		    }
+		}
+	    }
+
+	    if( bPost )
+	    {
+		PostMessage16( psop->hWnd, psop->uMsg, 
+			      (WPARAM16)WS_PTR2HANDLE(psop->pws), (LPARAM)dwEvent );
+		bPost = FALSE;
+		num_posted++;
+	    }
+	}
+	if( num_pending <= 0 ) break;
     }
-    return SOCKET_ERROR;
+
+    dprintf_winsock(stddeb, "\tdone, %i posted events\n", num_posted );
+    return ( num_posted ) ? TRUE : FALSE;
 }
 
-INT16 WSAAsyncSelect(SOCKET16 s, HWND16 hWnd, UINT16 uMsg, UINT32 lEvent)
+
+INT16 WINAPI WSAAsyncSelect(SOCKET16 s, HWND16 hWnd, UINT16 uMsg, UINT32 lEvent)
 {
-  ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
-  LPWSINFO      pwsi = wsi_find(GetCurrentTask());
+    ws_socket*    pws  = (ws_socket*)WS_HANDLE2PTR(s);
+    LPWSINFO      pwsi = wsi_find(GetCurrentTask());
 
-  dprintf_winsock(stddeb, "WS_AsyncSelect(%08x): %04x, hWnd %04x, uMsg %04x, event %08x\n",
+    dprintf_winsock(stddeb, "WS_AsyncSelect(%08x): %04x, hWnd %04x, uMsg %04x, event %08x\n",
 			  (unsigned)pwsi, s, hWnd, uMsg, (unsigned)lEvent );
-  if( _check_ws(pwsi, pws) )
-    if( init_async_select(pws, hWnd, uMsg, lEvent) == 0 ) return 0;
-    else pwsi->err = WSAENOBUFS;
-  return SOCKET_ERROR; 
+    if( _check_ws(pwsi, pws) )
+    {
+	ws_select_op* psop;
+
+	if( (psop = pws->psop) )
+	{
+	    /* delete previous control struct */
+
+	    if( psop == __ws_select_list )
+		__ws_select_list = psop->next;
+	    else
+		psop->prev->next = psop->next; 
+	    if( psop->next ) psop->next->prev = psop->prev;
+
+	    if( pws->flags & (WS_FD_ACCEPT | WS_FD_CONNECT | WS_FD_READ | WS_FD_CLOSE) )
+		EVENT_DeleteIO( pws->fd, EVENT_IO_READ );
+	    if( pws->flags & (WS_FD_CONNECT | WS_FD_WRITE) )
+		EVENT_DeleteIO( pws->fd, EVENT_IO_WRITE );
+
+	    dprintf_winsock(stddeb,"\tremoving psop = 0x%08x\n", (unsigned) psop );
+
+	    WS_FREE( pws->psop );
+	    pws->flags &= ~(WS_FD_RAW | WS_FD_ACCEPT | WS_FD_CONNECT | 
+			    WS_FD_READ | WS_FD_WRITE | WS_FD_CLOSE);
+	    pws->psop = NULL;
+	}
+
+	if( lEvent )
+	{
+	    psop = (ws_select_op*)WS_ALLOC(sizeof(ws_select_op));
+	    if( psop )
+	    {
+		int sock_type, bytes = sizeof(int);
+
+		WINSOCK_unblock_io( pws->fd, TRUE );
+
+		psop->prev = NULL;
+		psop->next = __ws_select_list;
+		if( __ws_select_list )
+		    __ws_select_list->prev = psop;
+		__ws_select_list = psop;
+		
+		psop->pws = pws;
+		psop->hWnd = hWnd;
+		psop->uMsg = uMsg;
+
+		pws->psop = psop;
+		pws->flags |= (0x0000FFFF &lEvent);
+		getsockopt(pws->fd, SOL_SOCKET, SO_TYPE, &sock_type, &bytes);
+		if( sock_type == SOCK_RAW ) pws->flags |= WS_FD_RAW;
+
+		if( lEvent & (WS_FD_ACCEPT | WS_FD_CONNECT | WS_FD_READ | WS_FD_CLOSE) )
+		    EVENT_AddIO( pws->fd, EVENT_IO_READ );
+		if( lEvent & (WS_FD_CONNECT | WS_FD_WRITE) )
+		    EVENT_AddIO( pws->fd, EVENT_IO_WRITE );
+
+		/* TODO: handle WS_FD_ACCEPT right away if the socket is readable */
+
+		dprintf_winsock(stddeb,"\tcreating psop = 0x%08x\n", (unsigned)psop );
+
+		return 0; /* success */
+	    }
+	    else pwsi->err = WSAENOBUFS;
+	} 
+	else return 0;
+    } 
+    else if( pwsi ) pwsi->err = WSAEINVAL;
+    return SOCKET_ERROR; 
 }
 
-/* ----- miscellaneous */
 
-INT16 __WSAFDIsSet(SOCKET16 fd, ws_fd_set *set)
+/***********************************************************************
+ *	__WSAFDIsSet()			(WINSOCK.151)
+ */
+INT16 WINAPI __WSAFDIsSet16(SOCKET16 s, ws_fd_set *set)
 {
   int i = set->fd_count;
   
-  dprintf_winsock(stddeb, "__WSAFDIsSet(%d,%8lx)\n",fd,(unsigned long)set);
+  dprintf_winsock(stddeb, "__WSAFDIsSet(%d,%8lx)\n", s,(unsigned long)set);
     
   while (i--)
-      if (set->fd_array[i] == fd) return 1;
+      if (set->fd_array[i] == s) return 1;
   return 0;
 }                                                            
 
-BOOL16 WSAIsBlocking(void)
+/***********************************************************************
+ *      __WSAFDIsSet()			(WSOCK32.151)
+ */
+INT32 WINAPI __WSAFDIsSet32(SOCKET32 s, ws_fd_set *set)
+{
+    return __WSAFDIsSet16( (SOCKET16)s, set );
+}
+
+/***********************************************************************
+ *      WSAIsBlocking()			(WINSOCK.114)(WSOCK32.114)
+ */
+BOOL32 WINAPI WSAIsBlocking(void)
 {
   /* By default WinSock should set all its sockets to non-blocking mode
    * and poll in PeekMessage loop when processing "blocking" ones. This 
-   * function * is supposed to tell if program is in this loop. Our 
+   * function is supposed to tell if program is in this loop. Our 
    * blocking calls are truly blocking so we always return FALSE.
    *
    * Note: It is allowed to call this function without prior WSAStartup().
@@ -1439,7 +2025,10 @@
   return FALSE;
 }
 
-INT16 WSACancelBlockingCall(void)
+/***********************************************************************
+ *      WSACancelBlockingCall()		(WINSOCK.113)(WSOCK32.113)
+ */
+INT32 WINAPI WSACancelBlockingCall(void)
 {
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
 
@@ -1449,45 +2038,82 @@
   return SOCKET_ERROR;
 }
 
-FARPROC16 WSASetBlockingHook16(FARPROC16 lpBlockFunc)
+
+/***********************************************************************
+ *      WSASetBlockingHook16()		(WINSOCK.109)
+ */
+FARPROC16 WINAPI WSASetBlockingHook16(FARPROC16 lpBlockFunc)
 {
   FARPROC16		prev;
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
 
   dprintf_winsock(stddeb, "WS_SetBlockingHook16(%08x): hook %08x\n", 
 			  (unsigned)pwsi, (unsigned) lpBlockFunc);
-
   if( pwsi ) { 
-      prev = pwsi->blocking_hook; 
-      pwsi->blocking_hook = lpBlockFunc; 
+      prev = (FARPROC16)pwsi->blocking_hook; 
+      pwsi->blocking_hook = (DWORD)lpBlockFunc; 
+      pwsi->flags &= ~WSI_BLOCKINGHOOK32;
       return prev; 
   }
   return 0;
 }
 
-FARPROC32 WSASetBlockingHook32(FARPROC32 lpBlockFunc)
-{
-  fprintf( stderr, "WSASetBlockingHook32(%p): empty stub\n", lpBlockFunc );
-  return NULL;
-}
 
-INT16 WSAUnhookBlockingHook16(void)
+/***********************************************************************
+ *      WSASetBlockingHook32()
+ */
+FARPROC32 WINAPI WSASetBlockingHook32(FARPROC32 lpBlockFunc)
 {
+  FARPROC32             prev;
   LPWSINFO              pwsi = wsi_find(GetCurrentTask());
 
-  dprintf_winsock(stddeb, "WS_UnhookBlockingHook(%08x)\n", (unsigned)pwsi);
-  if( pwsi ) return (INT16)(INT32)(pwsi->blocking_hook = (FARPROC16)NULL);
-  return SOCKET_ERROR;
-}
-
-INT32 WSAUnhookBlockingHook32(void)
-{
-  fprintf( stderr, "WSAUnhookBlockingHook32(): empty stub\n");
+  dprintf_winsock(stddeb, "WS_SetBlockingHook32(%08x): hook %08x\n",
+                          (unsigned)pwsi, (unsigned) lpBlockFunc);
+  if( pwsi ) {
+      prev = (FARPROC32)pwsi->blocking_hook;
+      pwsi->blocking_hook = (DWORD)lpBlockFunc;
+      pwsi->flags |= WSI_BLOCKINGHOOK32;
+      return prev;
+  }
   return NULL;
 }
 
-VOID
-WsControl(DWORD x1,DWORD x2,LPDWORD x3,LPDWORD x4,LPDWORD x5,LPDWORD x6) 
+
+/***********************************************************************
+ *      WSAUnhookBlockingHook16()	(WINSOCK.110)
+ */
+INT16 WINAPI WSAUnhookBlockingHook16(void)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_UnhookBlockingHook16(%08x)\n", (unsigned)pwsi);
+    if( pwsi ) return (INT16)(pwsi->blocking_hook = 0);
+    return SOCKET_ERROR;
+}
+
+
+/***********************************************************************
+ *      WSAUnhookBlockingHook32()
+ */
+INT32 WINAPI WSAUnhookBlockingHook32(void)
+{
+    LPWSINFO              pwsi = wsi_find(GetCurrentTask());
+
+    dprintf_winsock(stddeb, "WS_UnhookBlockingHook32(%08x)\n", (unsigned)pwsi);
+    if( pwsi )
+    {
+	pwsi->blocking_hook = 0;
+	pwsi->flags &= ~WSI_BLOCKINGHOOK32;
+	return 0;
+    }
+    return SOCKET_ERROR;
+}
+
+/***********************************************************************
+ *      WsControl()
+ */
+VOID WINAPI WsControl(DWORD x1,DWORD x2,LPDWORD x3,LPDWORD x4,
+                      LPDWORD x5,LPDWORD x6) 
 {
 	fprintf(stdnimp,"WsControl(%lx,%lx,%p,%p,%p,%p)\n",
 		x1,x2,x3,x4,x5,x6
@@ -1548,8 +2174,8 @@
 {
    /* Duplicate hostent structure and flatten data (with its pointers)
     * into pwsi->buffer. Internal pointers can be linear, SEGPTR, or 
-    * relative to 0 depending on "flag" value. Return data size (also 
-    * in the pwsi->buflen).
+    * relative to pwsi->buffer depending on "flag" value. Returns size
+    * of the data copied (also in the pwsi->buflen).
     */
 
    int size = hostent_size(p_he);
@@ -1561,14 +2187,14 @@
      p = pwsi->buffer;
      p_base = (flag & WS_DUP_OFFSET) ? NULL
 				     : ((flag & WS_DUP_SEGPTR) ? (char*)SEGPTR_GET(p) : p);
-     p += (flag & WS_DUP_SEGPTR) ? sizeof(struct ws_hostent) : sizeof(struct hostent);
+     p += (flag & WS_DUP_NATIVE) ? sizeof(struct hostent) : sizeof(struct ws_hostent);
      p_name = p;
      strcpy(p, p_he->h_name); p += strlen(p) + 1;
      p_aliases = p;
      p += list_dup(p_he->h_aliases, p, p_base + (p - pwsi->buffer), 0);
      p_addr = p;
      list_dup(p_he->h_addr_list, p, p_base + (p - pwsi->buffer), p_he->h_length);
-     if( !(flag & WS_DUP_SEGPTR) )
+     if( flag & WS_DUP_NATIVE )
      { struct hostent* p_to = (struct hostent*)pwsi->buffer;
        p_to->h_addrtype = p_he->h_addrtype; p_to->h_length = p_he->h_length;
        p_to->h_name = p_base + (p_name - pwsi->buffer);
@@ -1587,22 +2213,6 @@
    return size;
 }
 
-void fixup_wshe(struct ws_hostent* p_wshe, SEGPTR base)
-{
-   /* add 'base' to ws_hostent pointers to convert them from offsets */ 
-
-   int i;
-   unsigned*	p_aliases,*p_addr;
-
-   p_aliases = (unsigned*)((char*)p_wshe + (unsigned)p_wshe->h_aliases); 
-   p_addr = (unsigned*)((char*)p_wshe + (unsigned)p_wshe->h_addr_list);
-   ((unsigned)(p_wshe->h_name)) += (unsigned)base;
-   ((unsigned)(p_wshe->h_aliases)) += (unsigned)base;
-   ((unsigned)(p_wshe->h_addr_list)) += (unsigned)base;
-   for(i=0;p_aliases[i];i++) p_aliases[i] += (unsigned)base;
-   for(i=0;p_addr[i];i++) p_addr[i] += (unsigned)base;
-}
-
 /* ----- protoent */
 
 static int protoent_size(struct protoent* p_pe)
@@ -1626,12 +2236,12 @@
      p = pwsi->buffer; 
      p_base = (flag & WS_DUP_OFFSET) ? NULL
 				     : ((flag & WS_DUP_SEGPTR) ? (char*)SEGPTR_GET(p) : p);
-     p += (flag & WS_DUP_SEGPTR)? sizeof(struct ws_protoent) : sizeof(struct protoent);
+     p += (flag & WS_DUP_NATIVE)? sizeof(struct protoent) : sizeof(struct ws_protoent);
      p_name = p;
      strcpy(p, p_pe->p_name); p += strlen(p) + 1;
      p_aliases = p;
      list_dup(p_pe->p_aliases, p, p_base + (p - pwsi->buffer), 0);
-     if( !(flag & WS_DUP_NATIVE) )
+     if( flag & WS_DUP_NATIVE )
      { struct protoent* p_to = (struct protoent*)pwsi->buffer;
        p_to->p_proto = p_pe->p_proto;
        p_to->p_name = p_base + (p_name - pwsi->buffer); 
@@ -1646,15 +2256,6 @@
    return size;
 }
 
-void fixup_wspe(struct ws_protoent* p_wspe, SEGPTR base)
-{
-   int i;
-   unsigned*       p_aliases = (unsigned*)((char*)p_wspe + (unsigned)p_wspe->p_aliases); 
-   ((unsigned)(p_wspe->p_name)) += (unsigned)base;
-   ((unsigned)(p_wspe->p_aliases)) += (unsigned)base;
-   for(i=0;p_aliases[i];i++) p_aliases[i] += (unsigned)base;
-}
-
 /* ----- servent */
 
 static int servent_size(struct servent* p_se)
@@ -1678,7 +2279,7 @@
      p = pwsi->buffer;
      p_base = (flag & WS_DUP_OFFSET) ? NULL 
 				     : ((flag & WS_DUP_SEGPTR) ? (char*)SEGPTR_GET(p) : p);
-     p += (flag & WS_DUP_SEGPTR)? sizeof(struct ws_servent) : sizeof(struct servent);
+     p += (flag & WS_DUP_NATIVE)? sizeof(struct servent) : sizeof(struct ws_servent);
      p_name = p;
      strcpy(p, p_se->s_name); p += strlen(p) + 1;
      p_proto = p;
@@ -1686,7 +2287,7 @@
      p_aliases = p;
      list_dup(p_se->s_aliases, p, p_base + (p - pwsi->buffer), 0);
 
-     if( !(flag & WS_DUP_SEGPTR) )
+     if( flag & WS_DUP_NATIVE )
      { struct servent* p_to = (struct servent*)pwsi->buffer;
        p_to->s_port = p_se->s_port;
        p_to->s_name = p_base + (p_name - pwsi->buffer); 
@@ -1703,16 +2304,6 @@
    return size;
 }
 
-void fixup_wsse(struct ws_servent* p_wsse, SEGPTR base)
-{
-   int i;
-   unsigned*       p_aliases = (unsigned*)((char*)p_wsse + (unsigned)p_wsse->s_aliases);
-   ((unsigned)(p_wsse->s_name)) += (unsigned)base;
-   ((p_wsse->s_proto)) += (unsigned)base;
-   ((p_wsse->s_aliases)) += (unsigned)base;
-   for(i=0;p_aliases[i];i++) p_aliases[i] += (unsigned)base;
-}
-
 /* ----------------------------------- error handling */
 
 UINT16 wsaErrno(void)
diff --git a/misc/winsock_async.c b/misc/winsock_async.c
deleted file mode 100644
index 5cd0382..0000000
--- a/misc/winsock_async.c
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * asynchronous winsock services
- * 
- * (C) 1996 Alex Korobka.
- *
- * FIXME: telftp16 (ftp part) stalls on AsyncSelect with FD_ACCEPT.
- */
-#include <unistd.h>
-#include <string.h>
-#include <signal.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/ipc.h>
-#include <sys/msg.h>
-#include <sys/wait.h>
-#include <errno.h>
-#ifdef __EMX__
-#include <sys/so_ioctl.h>
-#include <sys/param.h>
-#endif
-#ifdef __svr4__
-#include <sys/file.h>
-#include <sys/filio.h>
-#endif
-
-extern int h_errno;
-
-#include "windows.h"
-#include "winsock.h"
-#include "debug.h"
-
-#ifndef FASYNC
-#define FASYNC FIOASYNC
-#endif
-
-#define __WS_ASYNC_DEBUG	0
-
-static int		__async_io_max_fd = 0;
-static fd_set		__async_io_fdset;
-static ws_async_op*	__async_op_list = NULL;
-
-extern ws_async_ctl	async_ctl;
-extern int		async_qid;
-
-fd_set		 fd_read, fd_write, fd_excp;
-
-/* ----------------------------------- async/non-blocking I/O */
-
-int WINSOCK_async_io(int fd, int async)
-{
-    int fd_flags;
-
-#ifndef __EMX__
-    fcntl(fd, F_SETOWN, getpid());
-#endif
-
-    fd_flags = fcntl(fd, F_GETFL, 0);
-    if (fcntl(fd, F_SETFL, (async)? fd_flags | FASYNC
-                                  : fd_flags & ~FASYNC ) != -1) return 0;
-    return -1;
-}
-
-int WINSOCK_unblock_io(int fd, int noblock)
-{
-    int fd_flags;
-
-    fd_flags = fcntl(fd, F_GETFL, 0);
-    if (fcntl(fd, F_SETFL, (noblock)? fd_flags |  O_NONBLOCK
-                                    : fd_flags & ~O_NONBLOCK ) != -1) return 0;
-    return -1;
-}
-
-int WINSOCK_check_async_op(ws_async_op* p_aop)
-{
-  ws_async_op*   p = __async_op_list;
-  while( p ) if( p == p_aop ) return 1;
-	     else p = p->next;
-  return 0;
-}
-
-void WINSOCK_cancel_async_op(HTASK16 hTask)
-{
-  ws_async_op*   p = __async_op_list;
-  while( p ) 
-     if(hTask == GetWindowTask16(p->hWnd)) 
-        p->flags = 0;
-}
-
-void WINSOCK_link_async_op(ws_async_op* p_aop)
-{
-  if( __async_op_list ) __async_op_list->prev = p_aop;
-  else FD_ZERO(&__async_io_fdset);
-
-  p_aop->next = __async_op_list; 
-  p_aop->prev = NULL;
-  __async_op_list = p_aop;
-
-  FD_SET(p_aop->fd[0], &__async_io_fdset);
-  if( p_aop->fd[0] > __async_io_max_fd ) 
-		     __async_io_max_fd = p_aop->fd[0];
-}
-
-void WINSOCK_unlink_async_op(ws_async_op* p_aop)
-{
-  if( p_aop == __async_op_list ) __async_op_list = p_aop->next;
-  else
-  { p_aop->prev->next = p_aop->next;
-    if( p_aop->next ) p_aop->next->prev = p_aop->prev; }
-  FD_CLR(p_aop->fd[0], &__async_io_fdset); 
-  if( p_aop->fd[0] == __async_io_max_fd )
-		      __async_io_max_fd--;
-}
-
-/* ----------------------------------- SIGIO handler -
- *
- * link_async_op/unlink_async_op allow to install generic
- * async IO handlers (provided that aop_control function is defined).
- *
- * Note: AsyncGetXbyY expilicitly raise it.
- */
-
-void WINSOCK_sigio(int signal)
-{
- struct timeval         timeout;
- fd_set                 check_set;
- ws_async_op*		p_aop;
-
- check_set = __async_io_fdset;
- memset(&timeout, 0, sizeof(timeout));
-
- while( select(__async_io_max_fd + 1,
-              &check_set, NULL, NULL, &timeout) > 0)
- {
-   for( p_aop = __async_op_list;
-	p_aop ; p_aop = p_aop->next )
-      if( FD_ISSET(p_aop->fd[0], &check_set) )
-          if( p_aop->aop_control(p_aop, AOP_IO) == AOP_CONTROL_REMOVE )
-	  {
-	      if( p_aop->pid ) 
-	      { 
-		kill(p_aop->pid, SIGKILL);
-		waitpid(p_aop->pid, NULL, WNOHANG);
-	      }
-	      WINSOCK_unlink_async_op( p_aop );
-	  }
-   check_set = __async_io_fdset;
-  }
-}
-
-/* ----------------------------------- child process IPC */
-
-static void _sigusr1_handler_child(int sig)
-{
-   /* read message queue to decide which
-    * async_ctl parameters to update 
-    *
-    * Note: we don't want to have SA_RESTART on this signal
-    * handler, otherwise select() won't notice changed fd sets.
-    */
-
-   signal( SIGUSR1, _sigusr1_handler_child );
-   while( msgrcv(async_qid, (struct msgbuf*)&async_ctl.ip,
-          MTYPE_PARENT_SIZE, MTYPE_PARENT, IPC_NOWAIT) != -1 )
-   {
-       /* only ip.lParam is updated */
-#if __WS_ASYNC_DEBUG
-       printf("handler - event %08x\n", async_ctl.ip.lParam );
-#endif
-
-       switch( async_ctl.ip.lParam )
-       {
-	  /* These are events we are notified of.
-	   */
-
-          case   WS_FD_CONNECTED: async_ctl.lEvent &= ~WS_FD_CONNECT;
-				  FD_SET(async_ctl.ws_sock->fd, &fd_read);
-				  FD_SET(async_ctl.ws_sock->fd, &fd_write);
-			  	  break;
-
-          case   WS_FD_ACCEPT:  async_ctl.ws_sock->flags |= WS_FD_ACCEPT;
-				FD_SET(async_ctl.ws_sock->fd, &fd_read);
-                                FD_SET(async_ctl.ws_sock->fd, &fd_write);
-                                break;
-          case   WS_FD_OOB:     async_ctl.lEvent |= WS_FD_OOB;
-				FD_SET(async_ctl.ws_sock->fd, &fd_excp);
-                                break;
-          case   WS_FD_READ:    async_ctl.lEvent |= WS_FD_READ;
-				FD_SET(async_ctl.ws_sock->fd, &fd_read);
-                                break;
-          case   WS_FD_WRITE:   async_ctl.lEvent |= WS_FD_WRITE;
-				FD_SET(async_ctl.ws_sock->fd, &fd_write);
-                                break;
-          default:
-       }
-   }
-}
-
-static int notify_parent( unsigned flag )
-{
-  if( flag & WSMSG_ASYNC_SELECT )
-  {
-     async_ctl.ip.mtype = MTYPE_CLIENT;
-     while( msgsnd(async_qid, (struct msgbuf*)&(async_ctl.ip),
-                               MTYPE_CLIENT_SIZE, 0) == -1 )
-     {
-       if( errno == EINTR ) continue;
-#ifdef EIDRM
-       else if( errno == EIDRM ) _exit(0);
-#endif
-       else 
-       { 
-	 perror("AsyncSelect(child)"); 
-	 return 0; 
-       }
-     }
-     kill(getppid(), SIGUSR1); 
-
-#if __WS_ASYNC_DEBUG
-  printf("handler - notify [%08x]\n", async_ctl.ip.lParam);
-#endif
-  }
-  else /* use half-duplex pipe to handle variable length packets */
-  {
-     write(async_ctl.ws_aop->fd[1], &async_ctl.lLength, sizeof(unsigned) );
-     write(async_ctl.ws_aop->fd[1], async_ctl.buffer, async_ctl.lLength );
-#ifndef __EMX__
-     kill(getppid(), SIGIO);    /* simulate async I/O */
-#endif
-#if __WS_ASYNC_DEBUG
-  printf("handler - notify aop [%d, buf %d]\n", async_ctl.lLength, async_ctl.ws_aop->buflen);
-#endif
-     pause();
-  }
-  return 1;
-}
-
-/* ----------------------------------- async select */
-
-static void setup_fd_sets()
-{
-   FD_ZERO(&fd_read); FD_ZERO(&fd_write); FD_ZERO(&fd_excp);
-
-   if( async_ctl.lEvent & WS_FD_OOB) 
-       FD_SET(async_ctl.ws_sock->fd, &fd_excp);
-   if( async_ctl.lEvent & (WS_FD_ACCEPT | WS_FD_READ |
-			   WS_FD_CONNECT | WS_FD_CLOSE) ) 
-       FD_SET(async_ctl.ws_sock->fd, &fd_read);
-   if( async_ctl.lEvent & (WS_FD_WRITE | WS_FD_CONNECT) ) 
-       FD_SET(async_ctl.ws_sock->fd, &fd_write);
-}
-
-static void setup_sig_sets(sigset_t* sig_block)
-{
-   sigemptyset(sig_block);
-   sigaddset(sig_block, SIGUSR1);
-   sigprocmask( SIG_BLOCK, sig_block, NULL);
-   signal( SIGUSR1, _sigusr1_handler_child );
-}
-
-void WINSOCK_do_async_select()
-{
-  sigset_t    sig_block;
-  int	      sock_type, bytes;
-
-  getsockopt(async_ctl.ws_sock->fd, SOL_SOCKET, SO_TYPE, &sock_type, &bytes);
-  setup_sig_sets(&sig_block);
-  setup_fd_sets();
-
-  while(1)
-  {
-    int		val;
-
-    if( sock_type != SOCK_STREAM )
-        async_ctl.lEvent &= ~(WS_FD_ACCEPT | WS_FD_CONNECT);
-    sigprocmask( SIG_UNBLOCK, &sig_block, NULL); 
-
-#if __WS_ASYNC_DEBUG
-    printf("select(2)[%i,%i,%i]... ", 
-	     FD_ISSET(async_ctl.ws_sock->fd, &fd_read),
-	     FD_ISSET(async_ctl.ws_sock->fd, &fd_write),
-	     FD_ISSET(async_ctl.ws_sock->fd, &fd_excp));
-#endif
-    if( (val = select(async_ctl.ws_sock->fd + 1, 
-		     &fd_read, &fd_write, &fd_excp, NULL)) == -1 )
-      if( errno == EINTR ) continue;
-#if __WS_ASYNC_DEBUG
-    printf("got %i events\n", val);
-#endif
-
-#if __WS_ASYNC_DEBUG
-    if( FD_ISSET(async_ctl.ws_sock->fd, &fd_read) )
-	printf("handler - read is READY! [%08x]\n", async_ctl.lEvent & (WS_FD_READ | WS_FD_CLOSE));
-#endif
-
-    sigprocmask( SIG_BLOCK, &sig_block, NULL);
-    async_ctl.ip.lParam = 0;
-    if( async_ctl.ws_sock->flags & WS_FD_ACCEPT )
-    {
-	/* listening socket */
-	
-	FD_CLR(async_ctl.ws_sock->fd, &fd_read);
-	FD_CLR(async_ctl.ws_sock->fd, &fd_write);
-
-	async_ctl.ip.lParam = WSAMAKESELECTREPLY( WS_FD_ACCEPT, 0 );
-        notify_parent( WSMSG_ASYNC_SELECT );
-	continue;
-    }
-    else /* I/O socket */
-    {
-	if( async_ctl.lEvent & WS_FD_CONNECT )
-	{
-	  if( FD_ISSET(async_ctl.ws_sock->fd, &fd_write) ) 
-	  {
-	      /* success - reinit fd sets to start I/O */
-
-	      if( async_ctl.lEvent & (WS_FD_READ | WS_FD_CLOSE))
-		   FD_SET(async_ctl.ws_sock->fd, &fd_read);
-	      else FD_CLR(async_ctl.ws_sock->fd, &fd_read);
-	      if( async_ctl.lEvent & WS_FD_WRITE )
-		   FD_SET(async_ctl.ws_sock->fd, &fd_write);
-	      else FD_CLR(async_ctl.ws_sock->fd, &fd_write);
-
-	      async_ctl.ip.lParam = WSAMAKESELECTREPLY( WS_FD_CONNECT, 0 );
-	      async_ctl.lEvent &= ~WS_FD_CONNECT; /* one-shot */
-	  }
-	  else if( FD_ISSET(async_ctl.ws_sock->fd, &fd_read) )
-	  {
-              /* failure - do read() to get correct errno */
-
-              if( read(async_ctl.ws_sock->fd, &bytes, 4) == -1 )
-                  async_ctl.ip.lParam = WSAMAKESELECTREPLY( WS_FD_CONNECT, wsaErrno() );
-              else continue;
-	  } else continue; /* OOB?? */
-
-          notify_parent( WSMSG_ASYNC_SELECT );
-	}
-	else /* connected socket */
-	{
-
-	  if( async_ctl.lEvent & WS_FD_OOB )
-	    if( FD_ISSET(async_ctl.ws_sock->fd, &fd_excp) )
-	    {
-	      async_ctl.ip.lParam = WSAMAKESELECTREPLY( WS_FD_OOB, 0 );
-	      async_ctl.lEvent &= ~WS_FD_OOB;
-	      FD_CLR(async_ctl.ws_sock->fd, &fd_excp);
-	      notify_parent( WSMSG_ASYNC_SELECT );
-	    }
-	    else FD_SET(async_ctl.ws_sock->fd, &fd_excp);
-
-          if( async_ctl.lEvent & WS_FD_WRITE )
-            if( FD_ISSET( async_ctl.ws_sock->fd, &fd_write ) )
-            {
-              async_ctl.ip.lParam = WSAMAKESELECTREPLY( WS_FD_WRITE, 0 );
-              async_ctl.lEvent &= ~WS_FD_WRITE;
-              FD_CLR(async_ctl.ws_sock->fd, &fd_write);
-              notify_parent( WSMSG_ASYNC_SELECT );
-            }
-            else FD_SET(async_ctl.ws_sock->fd, &fd_write);
-
-	  if( async_ctl.lEvent & (WS_FD_READ | WS_FD_CLOSE) )
-	    if( FD_ISSET(async_ctl.ws_sock->fd, &fd_read) )
-	    {
-	      int 	ok = 0;
-
-	      if( sock_type == SOCK_RAW ) ok = 1;
-	      else if( ioctl( async_ctl.ws_sock->fd, FIONREAD, (char*)&bytes) == -1 )
-	      {
-		  async_ctl.ip.lParam = WSAMAKESELECTREPLY( WS_FD_READ, wsaErrno() );
-		  FD_CLR( async_ctl.ws_sock->fd, &fd_read );
-		  bytes = 0;
-	      }
-
-	      if( bytes || ok )	/* got data */
-	      {
-#if __WS_ASYNC_DEBUG
-		  if( ok ) printf("\traw/datagram read pending\n");
-		  else printf("\t%i bytes pending\n", bytes );
-#endif
-		  if( async_ctl.lEvent & WS_FD_READ )
-		  {
-		     async_ctl.ip.lParam = WSAMAKESELECTREPLY( WS_FD_READ, 0 );
-		     async_ctl.lEvent &= ~WS_FD_READ;
-		     if( !(async_ctl.lEvent & WS_FD_CLOSE) ) 
-			   FD_CLR( async_ctl.ws_sock->fd, &fd_read );
-		  }
-		  else if( !(async_ctl.lEvent & (WS_FD_WRITE | WS_FD_OOB)) ) 
-		       {
-			  sigprocmask( SIG_UNBLOCK, &sig_block, NULL);
-			  pause();
-			  sigprocmask( SIG_BLOCK, &sig_block, NULL);
-		       }
-		       else continue;
-	      }
-	      else		/* 0 bytes to read */
-	      {
-		  val = read( async_ctl.ws_sock->fd, (char*)&bytes, 4);
-	          if( errno == EWOULDBLOCK || errno == EINTR ) 
-		  { 
-#if __WS_ASYNC_DEBUG
-		    printf("\twould block..\n");
-#endif
-		    continue;
-		  }
-		  switch( val )
-		  {
-		    case  0: errno = ENETDOWN;	/* ENETDOWN */
-		    case -1: 			/* ECONNRESET */
-			     async_ctl.ip.lParam = WSAMAKESELECTREPLY( WS_FD_CLOSE, wsaErrno() );
-			     break;
-		    default: continue;
-		  }
-		  async_ctl.lEvent &= ~(WS_FD_CLOSE | WS_FD_READ); /* one-shot */
-		  FD_ZERO(&fd_read); FD_ZERO(&fd_write); 
-	      }
-
-	      notify_parent( WSMSG_ASYNC_SELECT );
-	  }
-	  else FD_SET(async_ctl.ws_sock->fd, &fd_read);
-
-	} /* connected socket */
-    } /* I/O socket */
-  } /* while */
-}
-
-
-/* ----------------------------------- getXbyY requests */
-
-static void _async_fail()
-{
-     async_ctl.lLength =
-        (h_errno < 0) ? (unsigned)WSAMAKEASYNCREPLY( 0, wsaErrno() )
-                      : (unsigned)WSAMAKEASYNCREPLY( 0, wsaHerrno() );
-     write(async_ctl.ws_aop->fd[1], &async_ctl.lLength, sizeof(unsigned) );
-#ifndef __EMX__
-     kill(getppid(), SIGIO);    /* simulate async I/O */
-#endif
-     pause();
-}
-
-void dump_ws_hostent_offset(struct ws_hostent* wshe)
-{
-  int		i;
-  char*		base = (char*)wshe;
-  unsigned*	ptr;
-
-  printf("h_name = %08x\t[%s]\n", (unsigned)wshe->h_name, base + (unsigned)wshe->h_name);
-  printf("h_aliases = %08x\t[%08x]\n", (unsigned)wshe->h_aliases, 
-				       (unsigned)(base + (unsigned)wshe->h_aliases));
-  ptr = (unsigned*)(base + (unsigned)wshe->h_aliases);
-  for(i = 0; ptr[i]; i++ )
-  {
-	printf("%i - %08x ", i + 1, ptr[i]);
-	printf(" [%s]\n", ((char*)base) + ptr[i]);
-  }
-  printf("h_length = %i\n", wshe->h_length);
-}
-
-void WS_do_async_gethost(LPWSINFO pwsi, unsigned flag )
-{  
-  int			size = 0;
-  struct hostent* 	p_he;
-
-  close(async_ctl.ws_aop->fd[0]);
-  p_he = (flag & WSMSG_ASYNC_HOSTBYNAME)
-	 ? gethostbyname(async_ctl.init)
-	 : gethostbyaddr(async_ctl.init,
-		 	 async_ctl.lLength, async_ctl.lEvent);
-  if( p_he ) size = WS_dup_he(pwsi, p_he, WS_DUP_SEGPTR | WS_DUP_OFFSET );
-  if( size )
-  {
-     async_ctl.buffer = pwsi->buffer;
-     async_ctl.lLength = (unsigned)WSAMAKEASYNCREPLY( (UINT16)size, 0 );
-     notify_parent( flag );
-  }
-  else _async_fail();
-}
-
-void WS_do_async_getproto(LPWSINFO pwsi, unsigned flag )
-{
-  int			size = 0;
-  struct protoent*	p_pe;
-
-  close(async_ctl.ws_aop->fd[0]);
-  p_pe = (flag & WSMSG_ASYNC_PROTOBYNAME)
-	 ? getprotobyname(async_ctl.init)
-	 : getprotobynumber(async_ctl.lEvent);
-  if( p_pe ) size = WS_dup_pe(pwsi, p_pe, WS_DUP_SEGPTR | WS_DUP_OFFSET );
-  if( size )
-  {
-     async_ctl.buffer = pwsi->buffer;
-     async_ctl.lLength = (unsigned)WSAMAKEASYNCREPLY( (UINT16)size, 0 );
-     notify_parent( flag );
-  } 
-  else _async_fail();
-}
-
-void WS_do_async_getserv(LPWSINFO pwsi, unsigned flag )
-{
-  int			size = 0;
-  struct servent* 	p_se;
-
-  close(async_ctl.ws_aop->fd[0]);
-  p_se = (flag & WSMSG_ASYNC_SERVBYNAME)
-	 ? getservbyname(async_ctl.init, async_ctl.buffer)
-	 : getservbyport(async_ctl.lEvent, async_ctl.init);
-  if( p_se ) size = WS_dup_se(pwsi, p_se, WS_DUP_SEGPTR | WS_DUP_OFFSET );
-  if( size )
-  {
-     async_ctl.buffer = pwsi->buffer;
-     async_ctl.lLength = (unsigned)WSAMAKEASYNCREPLY( (UINT16)size, 0 );
-     notify_parent( flag );
-  }
-  else _async_fail();
-}
-
diff --git a/misc/winsock_dns.c b/misc/winsock_dns.c
new file mode 100644
index 0000000..8042489
--- /dev/null
+++ b/misc/winsock_dns.c
@@ -0,0 +1,530 @@
+/*
+ * asynchronous DNS services
+ * 
+ * (C) 1996,1997 Alex Korobka.
+ *
+ * TODO: Fork dns lookup helper during the startup (with a pipe
+ *       for communication) and make it fork for a database request
+ *       instead of forking the main process (i.e. something like
+ *       Netscape 4.0).
+ */
+
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <sys/wait.h>
+#include <errno.h>
+#ifdef __EMX__
+#include <sys/so_ioctl.h>
+#include <sys/param.h>
+#endif
+#ifdef __svr4__
+#include <sys/file.h>
+#include <sys/filio.h>
+#endif
+
+extern int h_errno;
+
+#include "windows.h"
+#include "heap.h"
+#include "ldt.h"
+#include "message.h"
+#include "miscemu.h"
+#include "winsock.h"
+#include "debug.h"
+
+#ifndef FASYNC
+#define FASYNC FIOASYNC
+#endif
+
+#define __WS_ASYNC_DEBUG	0
+
+typedef struct          /* async DNS op control struct */
+{
+  ws_async_op*  ws_aop;
+  char*         buffer;
+  int           type;
+  union
+  {
+    char*       init;
+    char*       name;
+    char*       addr;
+  } rq;
+  unsigned      ilength;
+} ws_async_ctl;
+
+extern HANDLE16	__ws_gethandle( void* ptr );
+extern void*	__ws_memalloc( int size );
+extern void	__ws_memfree( void* ptr );
+
+/* NOTE: ws_async_op list is traversed inside the SIGIO handler! */
+
+static int		__async_io_max_fd = 0;
+static fd_set		__async_io_fdset;
+static ws_async_op*	__async_op_list = NULL;
+
+static void fixup_wshe(struct ws_hostent* p_wshe, SEGPTR base);
+static void fixup_wspe(struct ws_protoent* p_wspe, SEGPTR base);
+static void fixup_wsse(struct ws_servent* p_wsse, SEGPTR base);
+
+extern void EVENT_AddIO( int fd, unsigned flag );
+extern void EVENT_DeleteIO( int fd, unsigned flag );
+
+/* ----------------------------------- async/non-blocking I/O */
+
+int WINSOCK_async_io(int fd, int async)
+{
+    int fd_flags;
+
+#ifndef __EMX__
+    fcntl(fd, F_SETOWN, getpid());
+#endif
+
+    fd_flags = fcntl(fd, F_GETFL, 0);
+    if (fcntl(fd, F_SETFL, (async)? fd_flags | FASYNC
+                                  : fd_flags & ~FASYNC ) != -1) return 0;
+    return -1;
+}
+
+int WINSOCK_unblock_io(int fd, int noblock)
+{
+    int fd_flags;
+
+    fd_flags = fcntl(fd, F_GETFL, 0);
+    if (fcntl(fd, F_SETFL, (noblock)? fd_flags |  O_NONBLOCK
+                                    : fd_flags & ~O_NONBLOCK ) != -1) return 0;
+    return -1;
+}
+
+int WINSOCK_check_async_op(ws_async_op* p_aop)
+{
+  ws_async_op*   p = __async_op_list;
+  while( p ) if( p == p_aop ) return 1;
+	     else p = p->next;
+  return 0;
+}
+
+int WINSOCK_cancel_async_op(ws_async_op* p_aop)
+{
+    /* SIGIO unsafe! */
+
+    if( WINSOCK_check_async_op(p_aop) )
+    {
+	if( !(p_aop->flags & WSMSG_DEAD_AOP) )
+	{
+            kill(p_aop->pid, SIGKILL);
+            waitpid(p_aop->pid, NULL, 0); /* just in case */
+            close(p_aop->fd[0]);
+	}
+        WINSOCK_unlink_async_op(p_aop);
+	EVENT_DeleteIO( p_aop->fd[0], EVENT_IO_READ );
+        p_aop->flags = 0;
+	p_aop->hWnd = p_aop->uMsg = 0;
+        return 1;
+    }
+    return 0;
+}
+
+void WINSOCK_cancel_task_aops(HTASK16 hTask, void (*__opfree)(void*))
+{
+    /* SIGIO safe, hTask == 0 cancels all outstanding async ops */
+
+    int num = 0;
+    ws_async_op*   p, *next;
+
+    dprintf_winsock(stddeb,"\tcancelling async DNS requests... ");
+
+    SIGNAL_MaskAsyncEvents( TRUE );
+    next = __async_op_list;
+    while( (p = next) ) 
+    {
+	HTASK16 hWndTask = GetWindowTask16(p->hWnd);
+
+	next = p->next;
+	if(!hTask || !hWndTask || (hTask == hWndTask))
+	{
+	    WINSOCK_cancel_async_op(p);
+	    if( __opfree ) __opfree(p);
+	    num++;
+	}
+    }
+    SIGNAL_MaskAsyncEvents( FALSE );
+    dprintf_winsock(stddeb,"%i total\n", num );
+}
+
+void WINSOCK_link_async_op(ws_async_op* p_aop)
+{
+  /* SIGIO safe */
+
+  p_aop->prev = NULL;
+  SIGNAL_MaskAsyncEvents( TRUE );
+  if( __async_op_list )
+  {
+      ws_async_op*	p = __async_op_list;
+      __async_op_list->prev = p_aop;
+
+      /* traverse the list and reap dead ops */
+      while( p )
+      {
+	  if( p->flags & WSMSG_DEAD_AOP )
+	  {
+	      ws_async_op* dead = p;
+
+	      dprintf_winsock(stddeb,"\treaping dead aop [%08x]\n", (unsigned)p );
+
+	      p = p->next;
+	      WINSOCK_unlink_async_op( dead );
+	      __ws_memfree( dead );
+	      continue;
+	  }
+	  p = p->next;
+      }
+  }
+  else FD_ZERO(&__async_io_fdset);
+  p_aop->next = __async_op_list;
+  __async_op_list = p_aop;
+  SIGNAL_MaskAsyncEvents( FALSE );
+
+  FD_SET(p_aop->fd[0], &__async_io_fdset);
+  if( p_aop->fd[0] > __async_io_max_fd ) 
+		     __async_io_max_fd = p_aop->fd[0];
+}
+
+void WINSOCK_unlink_async_op(ws_async_op* p_aop)
+{
+  /* SIGIO unsafe! */
+
+  if( p_aop == __async_op_list ) __async_op_list = p_aop->next;
+  else
+      p_aop->prev->next = p_aop->next;
+  if( p_aop->next ) p_aop->next->prev = p_aop->prev;
+
+  FD_CLR(p_aop->fd[0], &__async_io_fdset); 
+  if( p_aop->fd[0] == __async_io_max_fd )
+		      __async_io_max_fd--;
+}
+
+/* ----------------------------------- SIGIO handler -
+ *
+ * link_async_op/unlink_async_op allow to install generic
+ * async IO handlers (provided that aop_control function is defined).
+ *
+ * Note: AsyncGetXbyY expilicitly raise it.
+ */
+
+void WINSOCK_sigio(int signal)
+{
+ struct timeval         timeout;
+ fd_set                 check_set;
+ ws_async_op*		p_aop;
+
+ check_set = __async_io_fdset;
+ memset(&timeout, 0, sizeof(timeout));
+
+ while( select(__async_io_max_fd + 1,
+              &check_set, NULL, NULL, &timeout) > 0)
+ {
+   for( p_aop = __async_op_list;
+	p_aop ; p_aop = p_aop->next )
+      if( FD_ISSET(p_aop->fd[0], &check_set) )
+          if( p_aop->aop_control(p_aop, AOP_IO) == AOP_CONTROL_REMOVE )
+	  {
+	      p_aop->flags = WSMSG_DEAD_AOP;  /* can't free inside the signal */
+	      close(p_aop->fd[0]);
+	      FD_CLR(p_aop->fd[0],&__async_io_fdset);
+	      if( p_aop->fd[0] == __async_io_max_fd )
+				 __async_io_max_fd = p_aop->fd[0];
+	      if( p_aop->pid ) 
+	      { 
+		  kill(p_aop->pid, SIGKILL); 
+		  waitpid(p_aop->pid, NULL, WNOHANG);
+		  p_aop->pid = 0;
+	      }
+	  }
+   check_set = __async_io_fdset;
+  }
+}
+
+/* ----------------------------------- getXbyY requests */
+
+static	 ws_async_ctl	async_ctl; /* child process control struct */
+
+static int aop_control(ws_async_op* p_aop, int flag )
+{
+    unsigned    lLength;
+
+  /* success:   LOWORD(lLength) has the length of the struct
+   *            to read.
+   * failure:   LOWORD(lLength) is zero, HIWORD(lLength) contains
+   *            the error code.
+   */
+
+    read(p_aop->fd[0], &lLength, sizeof(unsigned));
+    if( LOWORD(lLength) )
+    {
+	if( (int)LOWORD(lLength) <= p_aop->buflen )
+	{
+            char* buffer = (char*)PTR_SEG_TO_LIN(p_aop->buffer_base);
+            read(p_aop->fd[0], buffer, LOWORD(lLength));
+            switch( p_aop->flags )
+            {
+		case WSMSG_ASYNC_HOSTBYNAME:
+		case WSMSG_ASYNC_HOSTBYADDR:
+		     fixup_wshe((struct ws_hostent*)buffer, p_aop->buffer_base); break;
+		case WSMSG_ASYNC_PROTOBYNAME:
+		case WSMSG_ASYNC_PROTOBYNUM:
+		     fixup_wspe((struct ws_protoent*)buffer, p_aop->buffer_base); break;
+		case WSMSG_ASYNC_SERVBYNAME:
+		case WSMSG_ASYNC_SERVBYPORT:
+		     fixup_wsse((struct ws_servent*)buffer, p_aop->buffer_base); break;
+		default:
+                     if( p_aop->flags ) fprintf(stderr,"Received unknown async request!\n");
+                     return AOP_CONTROL_REMOVE;
+            }
+	}
+        else lLength =  ((UINT32)LOWORD(lLength)) | ((unsigned)WSAENOBUFS << 16);
+    } /* failure */
+
+#if __WS_ASYNC_DEBUG
+    printf("DNS aop completed: hWnd [%04x], uMsg [%04x], aop [%04x], event [%08x]\n",
+         p_aop->hWnd, p_aop->uMsg, __ws_gethandle(p_aop), (LPARAM)lLength);
+#endif
+
+    /* FIXME: update num_async_rq */
+    EVENT_DeleteIO( p_aop->fd[0], EVENT_IO_READ );
+    PostMessage16( p_aop->hWnd, p_aop->uMsg, __ws_gethandle(p_aop), (LPARAM)lLength );
+    
+    return AOP_CONTROL_REMOVE;  /* one-shot request */
+}
+
+
+HANDLE16 __WSAsyncDBQuery(LPWSINFO pwsi, HWND16 hWnd, UINT16 uMsg, INT16 type, LPSTR init,
+		  	  INT16 len, LPSTR proto, SEGPTR sbuf, INT16 buflen, UINT32 flag)
+{
+    /* queue 'flag' request and fork off its handler */
+
+    async_ctl.ws_aop = (ws_async_op*)__ws_memalloc(sizeof(ws_async_op));
+
+    if( async_ctl.ws_aop )
+    {
+	HANDLE16        handle = __ws_gethandle(async_ctl.ws_aop);
+
+	if( pipe(async_ctl.ws_aop->fd) == 0 )
+	{
+	    async_ctl.rq.init = (char*)init;
+	    async_ctl.ilength = len;
+	    async_ctl.buffer = proto;
+	    async_ctl.type = type;
+
+	    async_ctl.ws_aop->hWnd = hWnd;
+	    async_ctl.ws_aop->uMsg = uMsg;
+	    async_ctl.ws_aop->buffer_base = sbuf; async_ctl.ws_aop->buflen = buflen;
+	    async_ctl.ws_aop->flags = flag;
+	    async_ctl.ws_aop->aop_control = &aop_control;
+
+	    WINSOCK_link_async_op( async_ctl.ws_aop );
+
+	    async_ctl.ws_aop->pid = fork();
+	    if( async_ctl.ws_aop->pid )
+	    {
+		close(async_ctl.ws_aop->fd[1]);  /* write endpoint */
+		dprintf_winsock(stddeb, "\tasync_op = %04x (child %i)\n",
+					handle, async_ctl.ws_aop->pid);
+		if( async_ctl.ws_aop->pid > 0 )
+		{
+		    EVENT_AddIO( async_ctl.ws_aop->fd[0], EVENT_IO_READ );
+		    pwsi->num_async_rq++;
+		    return __ws_gethandle(async_ctl.ws_aop);
+		}
+
+		/* fork() failed */
+		close(async_ctl.ws_aop->fd[0]);
+		pwsi->err = WSAEWOULDBLOCK;
+	    }
+	    else
+	    {
+		/* child process */
+
+		close(async_ctl.ws_aop->fd[0]);  /* read endpoint */
+		switch( flag )
+		{
+		    case WSMSG_ASYNC_HOSTBYADDR:
+		    case WSMSG_ASYNC_HOSTBYNAME:
+			WS_do_async_gethost(pwsi, flag);
+			break;
+		    case WSMSG_ASYNC_PROTOBYNUM:
+		    case WSMSG_ASYNC_PROTOBYNAME:
+			WS_do_async_getproto(pwsi, flag);
+			break;
+		    case WSMSG_ASYNC_SERVBYPORT:
+		    case WSMSG_ASYNC_SERVBYNAME:
+			WS_do_async_getserv(pwsi, flag);
+			break;
+		}
+		_exit(0); 	/* skip  atexit()'ed cleanup */
+	    }
+	}
+	else pwsi->err = wsaErrno(); /* failed to create pipe */
+
+	__ws_memfree((void*)async_ctl.ws_aop);
+    } else pwsi->err = WSAEWOULDBLOCK;
+    return 0;
+}
+
+static int _async_notify()
+{
+    /* use half-duplex pipe to send variable length packets 
+     * to the parent process */
+     
+    write(async_ctl.ws_aop->fd[1], &async_ctl.ilength, sizeof(unsigned));
+    write(async_ctl.ws_aop->fd[1], async_ctl.buffer, async_ctl.ilength );
+
+#ifndef __EMX__
+    kill(getppid(), SIGIO);    /* simulate async I/O */
+#endif
+
+#if __WS_ASYNC_DEBUG
+    printf("handler - notify aop [%d, buf %d]\n", async_ctl.ilength, async_ctl.ws_aop->buflen);
+#endif
+    return 1;
+}
+
+static void _async_fail()
+{
+     /* write a DWORD with error code (low word is zero) */
+
+     async_ctl.ilength =
+        (h_errno < 0) ? (unsigned)WSAMAKEASYNCREPLY( 0, wsaErrno() )
+                      : (unsigned)WSAMAKEASYNCREPLY( 0, wsaHerrno() );
+     write(async_ctl.ws_aop->fd[1], &async_ctl.ilength, sizeof(unsigned) );
+#ifndef __EMX__
+     kill(getppid(), SIGIO);    /* simulate async I/O */
+#endif
+
+#if __WS_ASYNC_DEBUG
+    printf("handler - failed aop [%d, buf %d]\n", async_ctl.ilength, async_ctl.ws_aop->buflen);
+#endif
+}
+
+void dump_ws_hostent_offset(struct ws_hostent* wshe)
+{
+  int		i;
+  char*		base = (char*)wshe;
+  unsigned*	ptr;
+
+  printf("h_name = %08x\t[%s]\n", (unsigned)wshe->h_name, base + (unsigned)wshe->h_name);
+  printf("h_aliases = %08x\t[%08x]\n", (unsigned)wshe->h_aliases, 
+				       (unsigned)(base + (unsigned)wshe->h_aliases));
+  ptr = (unsigned*)(base + (unsigned)wshe->h_aliases);
+  for(i = 0; ptr[i]; i++ )
+  {
+	printf("%i - %08x ", i + 1, ptr[i]);
+	printf(" [%s]\n", ((char*)base) + ptr[i]);
+  }
+  printf("h_length = %i\n", wshe->h_length);
+}
+
+void WS_do_async_gethost(LPWSINFO pwsi, unsigned flag )
+{  
+  int			size = 0;
+  struct hostent* 	p_he;
+
+  close(async_ctl.ws_aop->fd[0]);
+
+  dprintf_winsock(stddeb,"DNS: getting hostent for [%s]\n", async_ctl.rq.name );
+
+  p_he = (flag & WSMSG_ASYNC_HOSTBYNAME)
+	 ? gethostbyname(async_ctl.rq.name)
+	 : gethostbyaddr(async_ctl.rq.name,
+		 	 async_ctl.ilength, async_ctl.type);
+  dprintf_winsock(stddeb,"DNS: done!\n");
+
+  if( p_he ) size = WS_dup_he(pwsi, p_he, WS_DUP_SEGPTR | WS_DUP_OFFSET );
+  if( size )
+  {
+     async_ctl.buffer = pwsi->buffer;
+     async_ctl.ilength = (unsigned)WSAMAKEASYNCREPLY( (UINT16)size, 0 );
+     _async_notify( flag );
+  }
+  else _async_fail();
+}
+
+void WS_do_async_getproto(LPWSINFO pwsi, unsigned flag )
+{
+  int			size = 0;
+  struct protoent*	p_pe;
+
+  close(async_ctl.ws_aop->fd[0]);
+  p_pe = (flag & WSMSG_ASYNC_PROTOBYNAME)
+	 ? getprotobyname(async_ctl.rq.name)
+	 : getprotobynumber(async_ctl.type);
+  if( p_pe ) size = WS_dup_pe(pwsi, p_pe, WS_DUP_SEGPTR | WS_DUP_OFFSET );
+  if( size )
+  {
+     async_ctl.buffer = pwsi->buffer;
+     async_ctl.ilength = (unsigned)WSAMAKEASYNCREPLY( (UINT16)size, 0 );
+     _async_notify( flag );
+  } 
+  else _async_fail();
+}
+
+void WS_do_async_getserv(LPWSINFO pwsi, unsigned flag )
+{
+  int			size = 0;
+  struct servent* 	p_se;
+
+  close(async_ctl.ws_aop->fd[0]);
+  p_se = (flag & WSMSG_ASYNC_SERVBYNAME)
+	 ? getservbyname(async_ctl.rq.name, async_ctl.buffer)
+	 : getservbyport(async_ctl.type, async_ctl.buffer);
+  if( p_se ) size = WS_dup_se(pwsi, p_se, WS_DUP_SEGPTR | WS_DUP_OFFSET );
+  if( size )
+  {
+     async_ctl.buffer = pwsi->buffer;
+     async_ctl.ilength = (unsigned)WSAMAKEASYNCREPLY( (UINT16)size, 0 );
+     _async_notify( flag );
+  }
+  else _async_fail();
+}
+
+/* ----------------------------------- helper functions */
+
+void fixup_wshe(struct ws_hostent* p_wshe, SEGPTR base)
+{
+   /* add 'base' to ws_hostent pointers to convert them from offsets */
+
+   int i;
+   unsigned*    p_aliases,*p_addr;
+
+   p_aliases = (unsigned*)((char*)p_wshe + (unsigned)p_wshe->h_aliases);
+   p_addr = (unsigned*)((char*)p_wshe + (unsigned)p_wshe->h_addr_list);
+   ((unsigned)(p_wshe->h_name)) += (unsigned)base;
+   ((unsigned)(p_wshe->h_aliases)) += (unsigned)base;
+   ((unsigned)(p_wshe->h_addr_list)) += (unsigned)base;
+   for(i=0;p_aliases[i];i++) p_aliases[i] += (unsigned)base;
+   for(i=0;p_addr[i];i++) p_addr[i] += (unsigned)base;
+}
+
+void fixup_wspe(struct ws_protoent* p_wspe, SEGPTR base)
+{
+   int i;
+   unsigned*       p_aliases = (unsigned*)((char*)p_wspe + (unsigned)p_wspe->p_aliases);
+   ((unsigned)(p_wspe->p_name)) += (unsigned)base;
+   ((unsigned)(p_wspe->p_aliases)) += (unsigned)base;
+   for(i=0;p_aliases[i];i++) p_aliases[i] += (unsigned)base;
+}
+
+void fixup_wsse(struct ws_servent* p_wsse, SEGPTR base)
+{
+   int i;
+   unsigned*       p_aliases = (unsigned*)((char*)p_wsse + (unsigned)p_wsse->s_aliases);
+   ((unsigned)(p_wsse->s_name)) += (unsigned)base;
+   ((p_wsse->s_proto)) += (unsigned)base;
+   ((p_wsse->s_aliases)) += (unsigned)base;
+   for(i=0;p_aliases[i];i++) p_aliases[i] += (unsigned)base;
+}
+
diff --git a/misc/wsprintf.c b/misc/wsprintf.c
index 9cfbc57..f347fd5 100644
--- a/misc/wsprintf.c
+++ b/misc/wsprintf.c
@@ -230,7 +230,8 @@
 /***********************************************************************
  *           wvsnprintf16   (Not a Windows API)
  */
-INT16 wvsnprintf16( LPSTR buffer, UINT16 maxlen, LPCSTR spec, LPCVOID args )
+INT16 WINAPI wvsnprintf16( LPSTR buffer, UINT16 maxlen, LPCSTR spec,
+                           LPCVOID args )
 {
     WPRINTF_FORMAT format;
     LPSTR p = buffer;
@@ -329,7 +330,8 @@
 /***********************************************************************
  *           wvsnprintf32A   (Not a Windows API)
  */
-INT32 wvsnprintf32A( LPSTR buffer, UINT32 maxlen, LPCSTR spec, LPCVOID args )
+INT32 WINAPI wvsnprintf32A( LPSTR buffer, UINT32 maxlen, LPCSTR spec,
+                            LPCVOID args )
 {
     WPRINTF_FORMAT format;
     LPSTR p = buffer;
@@ -397,7 +399,8 @@
 /***********************************************************************
  *           wvsnprintf32W   (Not a Windows API)
  */
-INT32 wvsnprintf32W( LPWSTR buffer, UINT32 maxlen, LPCWSTR spec, LPCVOID args )
+INT32 WINAPI wvsnprintf32W( LPWSTR buffer, UINT32 maxlen, LPCWSTR spec,
+                            LPCVOID args )
 {
     WPRINTF_FORMAT format;
     LPWSTR p = buffer;
@@ -464,7 +467,7 @@
 /***********************************************************************
  *           wvsprintf16   (USER.421)
  */
-INT16 wvsprintf16( LPSTR buffer, LPCSTR spec, LPCVOID args )
+INT16 WINAPI wvsprintf16( LPSTR buffer, LPCSTR spec, LPCVOID args )
 {
     return wvsnprintf16( buffer, 0xffff, spec, args );
 }
@@ -473,7 +476,7 @@
 /***********************************************************************
  *           wvsprintf32A   (USER32.586)
  */
-INT32 wvsprintf32A( LPSTR buffer, LPCSTR spec, LPCVOID args )
+INT32 WINAPI wvsprintf32A( LPSTR buffer, LPCSTR spec, LPCVOID args )
 {
     return wvsnprintf32A( buffer, 0xffffffff, spec, args );
 }
@@ -482,7 +485,7 @@
 /***********************************************************************
  *           wvsprintf32W   (USER32.587)
  */
-INT32 wvsprintf32W( LPWSTR buffer, LPCWSTR spec, LPCVOID args )
+INT32 WINAPI wvsprintf32W( LPWSTR buffer, LPCWSTR spec, LPCVOID args )
 {
     return wvsnprintf32W( buffer, 0xffffffff, spec, args );
 }
@@ -492,7 +495,7 @@
  *           wsprintf16   (USER.420)
  */
 /* Winelib version */
-INT16 wsprintf16( LPSTR buffer, LPCSTR spec, ... )
+INT16 WINAPIV wsprintf16( LPSTR buffer, LPCSTR spec, ... )
 {
     va_list valist;
     INT16 res;
@@ -505,7 +508,7 @@
 }
 
 /* Emulator version */
-INT16 WIN16_wsprintf16(void)
+INT16 WINAPIV WIN16_wsprintf16(void)
 {
     SEGPTR *win_stack = (SEGPTR *)CURRENT_STACK16->args;
     LPSTR buffer = (LPSTR)PTR_SEG_TO_LIN(win_stack[0]);
@@ -519,7 +522,7 @@
  *           wsprintf32A   (USER32.584)
  */
 /* Winelib version */
-INT32 wsprintf32A( LPSTR buffer, LPCSTR spec, ... )
+INT32 WINAPIV wsprintf32A( LPSTR buffer, LPCSTR spec, ... )
 {
     va_list valist;
     INT32 res;
@@ -531,7 +534,7 @@
 }
 
 /* Emulator version */
-INT32 WIN32_wsprintf32A( DWORD *args )
+INT32 WINAPIV WIN32_wsprintf32A( DWORD *args )
 {
     return wvsprintf32A( (LPSTR)args[0], (LPCSTR)args[1], (LPCVOID)&args[2] );
 }
@@ -541,7 +544,7 @@
  *           wsprintf32W   (USER32.585)
  */
 /* Winelib version */
-INT32 wsprintf32W( LPWSTR buffer, LPCWSTR spec, ... )
+INT32 WINAPIV wsprintf32W( LPWSTR buffer, LPCWSTR spec, ... )
 {
     va_list valist;
     INT32 res;
@@ -553,7 +556,7 @@
 }
 
 /* Emulator version */
-INT32 WIN32_wsprintf32W( DWORD *args )
+INT32 WINAPIV WIN32_wsprintf32W( DWORD *args )
 {
     return wvsprintf32W( (LPWSTR)args[0], (LPCWSTR)args[1], (LPCVOID)&args[2]);
 }
diff --git a/miscemu/emulate.c b/miscemu/emulate.c
index eee31e0..6e5ec58 100644
--- a/miscemu/emulate.c
+++ b/miscemu/emulate.c
@@ -28,7 +28,7 @@
  */
 /* FIXME: Only skeletal implementation for now */
 
-void WIN87_fpmath( CONTEXT *context )
+void WINAPI WIN87_fpmath( CONTEXT *context )
 {
     dprintf_int(stddeb, "_fpmath: (cs:eip=%x:%lx es=%x bx=%04x ax=%04x dx==%04x)\n",
                  (WORD)CS_reg(context), EIP_reg(context),
@@ -107,21 +107,20 @@
 }
 
 
-void
-WIN87_WinEm87Info(struct Win87EmInfoStruct *pWIS, int cbWin87EmInfoStruct)
+void WINAPI WIN87_WinEm87Info(struct Win87EmInfoStruct *pWIS,
+                              int cbWin87EmInfoStruct)
 {
   dprintf_int(stddeb, "__WinEm87Info(%p,%d)\n",pWIS,cbWin87EmInfoStruct);
 }
 
-void
-WIN87_WinEm87Restore(void *pWin87EmSaveArea, int cbWin87EmSaveArea)
+void WINAPI WIN87_WinEm87Restore(void *pWin87EmSaveArea,
+                                 int cbWin87EmSaveArea)
 {
   dprintf_int(stddeb, "__WinEm87Restore(%p,%d)\n",
 	pWin87EmSaveArea,cbWin87EmSaveArea);
 }
 
-void
-WIN87_WinEm87Save(void *pWin87EmSaveArea, int cbWin87EmSaveArea)
+void WINAPI WIN87_WinEm87Save(void *pWin87EmSaveArea, int cbWin87EmSaveArea)
 {
   dprintf_int(stddeb, "__WinEm87Save(%p,%d)\n",
 	pWin87EmSaveArea,cbWin87EmSaveArea);
diff --git a/miscemu/instr.c b/miscemu/instr.c
index 931cfe8..9e414c4 100644
--- a/miscemu/instr.c
+++ b/miscemu/instr.c
@@ -8,7 +8,7 @@
 #include "windows.h"
 #include "ldt.h"
 #include "miscemu.h"
-#include "sigcontext.h"
+#include "sig_context.h"
 
 
 #define STACK_sig(context) \
diff --git a/msdos/dpmi.c b/msdos/dpmi.c
index 05404ce..ae7a852 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -52,7 +52,7 @@
  *
  * Handler for int 31h (DPMI).
  */
-void INT_Int31Handler( CONTEXT *context )
+void WINAPI INT_Int31Handler( CONTEXT *context )
 {
     DWORD dw;
     BYTE *ptr;
diff --git a/msdos/int10.c b/msdos/int10.c
index bb99f8e..e73d5bd 100644
--- a/msdos/int10.c
+++ b/msdos/int10.c
@@ -15,7 +15,7 @@
  *
  * Handler for int 10h (video).
  */
-void INT_Int10Handler( CONTEXT *context )
+void WINAPI INT_Int10Handler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
diff --git a/msdos/int11.c b/msdos/int11.c
index 88b3041..c66f20c 100644
--- a/msdos/int11.c
+++ b/msdos/int11.c
@@ -15,7 +15,7 @@
  *
  * Handler for int 11h (get equipment list).
  */
-void INT_Int11Handler( CONTEXT *context )
+void WINAPI INT_Int11Handler( CONTEXT *context )
 {
     int diskdrives = 0;
     int parallelports = 0;
diff --git a/msdos/int12.c b/msdos/int12.c
index cff7f52..79429bd 100644
--- a/msdos/int12.c
+++ b/msdos/int12.c
@@ -9,7 +9,7 @@
  *
  * Handler for int 12h (get memory size).
  */
-void INT_Int12Handler( CONTEXT *context )
+void WINAPI INT_Int12Handler( CONTEXT *context )
 {
     AX_reg(context) = 640;
 }
diff --git a/msdos/int13.c b/msdos/int13.c
index 9213897..eb9560c 100644
--- a/msdos/int13.c
+++ b/msdos/int13.c
@@ -15,7 +15,7 @@
  *
  * Handler for int 13h (disk I/O).
  */
-void INT_Int13Handler( CONTEXT *context )
+void WINAPI INT_Int13Handler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
diff --git a/msdos/int1a.c b/msdos/int1a.c
index ddc52ef..1e8157a 100644
--- a/msdos/int1a.c
+++ b/msdos/int1a.c
@@ -44,7 +44,7 @@
  *
  * Handler for int 1ah (date and time).
  */
-void INT_Int1aHandler( CONTEXT *context )
+void WINAPI INT_Int1aHandler( CONTEXT *context )
 {
     time_t ltime;
     DWORD ticks;
diff --git a/msdos/int21.c b/msdos/int21.c
index 46b0004..d01e61f 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -95,14 +95,14 @@
     return TRUE;
 }
 
-BYTE *GetCurrentDTA(void)
+static BYTE *GetCurrentDTA(void)
 {
     TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
     return (BYTE *)PTR_SEG_TO_LIN( pTask->dta );
 }
 
 
-void ChopOffWhiteSpace(char *string)
+static void ChopOffWhiteSpace(char *string)
 {
 	int length;
 
@@ -324,7 +324,7 @@
 }
 
 
-void OpenExistingFile( CONTEXT *context )
+static void OpenExistingFile( CONTEXT *context )
 {
     AX_reg(context) = _lopen16( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)),
                               AL_reg(context) );
@@ -880,7 +880,7 @@
 /***********************************************************************
  *           DOS3Call  (KERNEL.102)
  */
-void DOS3Call( CONTEXT *context )
+void WINAPI DOS3Call( CONTEXT *context )
 {
     BOOL32	bSetDOSExtendedError = FALSE;
 
@@ -1044,7 +1044,7 @@
         break;
             
     case 0x30: /* GET DOS VERSION */
-        AX_reg(context) = DOSVERSION;
+        AX_reg(context) = HIWORD(GetVersion16());
         BX_reg(context) = 0x0012;     /* 0x123456 is Wine's serial # */
         CX_reg(context) = 0x3456;
         break;
@@ -1077,7 +1077,7 @@
 		break;
 				
 	      case 0x06: /* GET TRUE VERSION NUMBER */
-		BX_reg(context) = DOSVERSION;
+		BX_reg(context) = HIWORD(GetVersion16());
 		DX_reg(context) = 0x00;
 		break;
 
diff --git a/msdos/int25.c b/msdos/int25.c
index 7073bd8..8e99609 100644
--- a/msdos/int25.c
+++ b/msdos/int25.c
@@ -18,7 +18,7 @@
  *
  * Handler for int 25h (absolute disk read).
  */
-void INT_Int25Handler( CONTEXT *context )
+void WINAPI INT_Int25Handler( CONTEXT *context )
 {
     BYTE *dataptr = PTR_SEG_OFF_TO_LIN( DS_reg(context), BX_reg(context) );
     DWORD begin, length;
diff --git a/msdos/int26.c b/msdos/int26.c
index 09ee526..4a58a5c 100644
--- a/msdos/int26.c
+++ b/msdos/int26.c
@@ -17,7 +17,7 @@
  *
  * Handler for int 26h (absolute disk read).
  */
-void INT_Int26Handler( CONTEXT *context )
+void WINAPI INT_Int26Handler( CONTEXT *context )
 {
     BYTE *dataptr = PTR_SEG_OFF_TO_LIN( DS_reg(context), BX_reg(context) );
     DWORD begin, length;
diff --git a/msdos/int2a.c b/msdos/int2a.c
index 02e37d8..35b6c22 100644
--- a/msdos/int2a.c
+++ b/msdos/int2a.c
@@ -15,7 +15,7 @@
  *
  * Handler for int 2ah (network).
  */
-void INT_Int2aHandler( CONTEXT *context )
+void WINAPI INT_Int2aHandler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
diff --git a/msdos/int2f.c b/msdos/int2f.c
index d8dbae1..b43e3b2 100644
--- a/msdos/int2f.c
+++ b/msdos/int2f.c
@@ -11,7 +11,6 @@
 #include "msdos.h"
 #include "miscemu.h"
 #include "module.h"
-#include "options.h"
 #include "stddebug.h"
 /* #define DEBUG_INT */
 #include "debug.h"
@@ -27,7 +26,7 @@
  *
  * Handler for int 2fh (multiplex).
  */
-void INT_Int2fHandler( CONTEXT *context )
+void WINAPI INT_Int2fHandler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
@@ -76,13 +75,15 @@
     switch(AL_reg(context))
     {
     case 0x00:  /* Windows enhanced mode installation check */
-        AX_reg(context) = (Options.mode == MODE_ENHANCED) ? WINVERSION : 0;
+        AX_reg(context) = (GetWinFlags() & WF_ENHANCED) ?
+                                                  LOWORD(GetVersion16()) : 0;
         break;
 	
     case 0x0a:  /* Get Windows version and type */
         AX_reg(context) = 0;
-        BX_reg(context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
-        CX_reg(context) = (Options.mode == MODE_ENHANCED) ? 3 : 2;
+        BX_reg(context) = (LOWORD(GetVersion16()) << 8) |
+                          (LOWORD(GetVersion16()) >> 8);
+        CX_reg(context) = (GetWinFlags() & WF_ENHANCED) ? 3 : 2;
         break;
 
     case 0x80:  /* Release time-slice */
diff --git a/msdos/int4b.c b/msdos/int4b.c
index 4f4e8c5..6157547 100644
--- a/msdos/int4b.c
+++ b/msdos/int4b.c
@@ -8,7 +8,7 @@
  *           INT_Int4bHandler
  *
  */
-void INT_Int4bHandler( CONTEXT *context )
+void WINAPI INT_Int4bHandler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
diff --git a/msdos/int5c.c b/msdos/int5c.c
index ab22059..6a17e8a 100644
--- a/msdos/int5c.c
+++ b/msdos/int5c.c
@@ -15,7 +15,7 @@
  *
  * Also handler for interrupt 5c. 
  */
-void NetBIOSCall( CONTEXT *context )
+void WINAPI NetBIOSCall( CONTEXT *context )
 {
     BYTE* ptr;
     ptr = (BYTE*) PTR_SEG_OFF_TO_LIN(ES_reg(context),BX_reg(context));
diff --git a/msdos/vxd.c b/msdos/vxd.c
index a56c1e5..dc51e79 100644
--- a/msdos/vxd.c
+++ b/msdos/vxd.c
@@ -21,20 +21,29 @@
              CX_reg(context), DX_reg(context), SI_reg(context), \
              DI_reg(context), (WORD)DS_reg(context), (WORD)ES_reg(context) )
 
+
+static WORD VXD_WinVersion(void)
+{
+    WORD version = GetVersion16();
+    return (version >> 8) | (version << 8);
+}
+
 /***********************************************************************
  *           VXD_PageFile
  */
-void VXD_PageFile( CONTEXT *context )
+void WINAPI VXD_PageFile( CONTEXT *context )
 {
+    unsigned	service = AX_reg(context);
+
     /* taken from Ralf Brown's Interrupt List */
 
-    dprintf_vxd(stddeb,"VxD PageFile called ...\n");
+    dprintf_vxd(stddeb,"VxD: [%04x] PageFile\n", (UINT16)service );
 
-    switch(AX_reg(context)) 
+    switch(service)
     {
     case 0x00: /* get version, is this windows version? */
 	dprintf_vxd(stddeb,"VxD PageFile: returning version\n");
-        AX_reg(context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
+        AX_reg(context) = VXD_WinVersion();
 	RESET_CFLAG(context);
 	break;
 
@@ -69,15 +78,17 @@
 /***********************************************************************
  *           VXD_Shell
  */
-void VXD_Shell( CONTEXT *context )
+void WINAPI VXD_Shell( CONTEXT *context )
 {
-    dprintf_vxd(stddeb,"VxD Shell called ...\n");
+    unsigned	service = DX_reg(context);
 
-    switch (DX_reg(context)) /* Ralf Brown says EDX, but I use DX instead */
+    dprintf_vxd(stddeb,"VxD: [%04x] Shell\n", (UINT16)service);
+
+    switch (service) /* Ralf Brown says EDX, but I use DX instead */
     {
     case 0x0000:
 	dprintf_vxd(stddeb,"VxD Shell: returning version\n");
-        AX_reg(context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
+        AX_reg(context) = VXD_WinVersion();
 	EBX_reg(context) = 1; /* system VM Handle */
 	break;
 
@@ -127,15 +138,17 @@
 /***********************************************************************
  *           VXD_Comm
  */
-void VXD_Comm( CONTEXT *context )
+void WINAPI VXD_Comm( CONTEXT *context )
 {
-    dprintf_vxd(stddeb,"VxD Comm called ...\n");
+    unsigned	service = AX_reg(context);
 
-    switch (AX_reg(context))
+    dprintf_vxd(stddeb,"VxD: [%04x] Comm\n", (UINT16)service);
+
+    switch (service)
     {
     case 0x0000: /* get version */
 	dprintf_vxd(stddeb,"VxD Comm: returning version\n");
-        AX_reg(context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
+        AX_reg(context) = VXD_WinVersion();
 	RESET_CFLAG(context);
 	break;
 
@@ -146,3 +159,37 @@
         VXD_BARF( context, "comm" );
     }
 }
+
+/***********************************************************************
+ *           VXD_Timer
+ */
+void VXD_Timer( CONTEXT *context )
+{
+    unsigned service = AX_reg(context);
+
+    dprintf_vxd(stddeb,"VxD: [%04x] Virtual Timer\n", (UINT16)service);
+
+    switch(service)
+    {
+    case 0x0000: /* version */
+	AX_reg(context) = VXD_WinVersion();
+	RESET_CFLAG(context);
+	break;
+
+    case 0x0100: /* clock tick time, in 840nsecs */
+	EAX_reg(context) = GetTickCount();
+
+	EDX_reg(context) = EAX_reg(context) >> 22;
+	EAX_reg(context) <<= 10; /* not very precise */
+	break;
+
+    case 0x0101: /* current Windows time, msecs */
+    case 0x0102: /* current VM time, msecs */
+	EAX_reg(context) = GetTickCount();
+	break;
+
+    default:
+	VXD_BARF( context, "VTD" );
+    }
+}
+
diff --git a/multimedia/joystick.c b/multimedia/joystick.c
index 4e643e2..cdd65ab 100644
--- a/multimedia/joystick.c
+++ b/multimedia/joystick.c
@@ -111,7 +111,7 @@
 /**************************************************************************
  * 				JoyGetNumDevs		[MMSYSTEM.101]
  */
-WORD JoyGetNumDevs(void)
+WORD WINAPI JoyGetNumDevs(void)
 {
 int joy;
 WORD joy_cnt = 0;
@@ -130,7 +130,7 @@
 /**************************************************************************
  * 				JoyGetDevCaps		[MMSYSTEM.102]
  */
-WORD JoyGetDevCaps(WORD wID, LPJOYCAPS lpCaps, WORD wSize)
+WORD WINAPI JoyGetDevCaps(WORD wID, LPJOYCAPS lpCaps, WORD wSize)
 {
     dprintf_mmsys(stderr, "JoyGetDevCaps(%04X, %p, %d);\n",
             wID, lpCaps, wSize);
@@ -138,7 +138,7 @@
     if (JoyOpenDriver(wID) == TRUE) {
         lpCaps->wMid = MM_MICROSOFT;
         lpCaps->wPid = MM_PC_JOYSTICK;
-        strcpy(lpCaps->szPname, "WineJoy\0"); /* joystick product name */
+        strcpy(lpCaps->szPname, "WineJoy"); /* joystick product name */
         lpCaps->wXmin = 0; /* FIXME */
         lpCaps->wXmax = 0xffff;
         lpCaps->wYmin = 0;
@@ -159,7 +159,7 @@
 /**************************************************************************
  * 				JoyGetPos	       	[MMSYSTEM.103]
  */
-WORD JoyGetPos(WORD wID, LPJOYINFO lpInfo)
+WORD WINAPI JoyGetPos(WORD wID, LPJOYINFO lpInfo)
 {
         struct js_status js;
 
@@ -184,7 +184,7 @@
 /**************************************************************************
  * 				JoyGetThreshold		[MMSYSTEM.104]
  */
-WORD JoyGetThreshold(WORD wID, LPWORD lpThreshold)
+WORD WINAPI JoyGetThreshold(WORD wID, LPWORD lpThreshold)
 {
     dprintf_mmsys(stderr, "JoyGetThreshold(%04X, %p);\n", wID, lpThreshold);
     if (wID > 3) return JOYERR_PARMS;
@@ -195,7 +195,7 @@
 /**************************************************************************
  * 				JoyReleaseCapture	[MMSYSTEM.105]
  */
-WORD JoyReleaseCapture(WORD wID)
+WORD WINAPI JoyReleaseCapture(WORD wID)
 {
     dprintf_mmsys(stderr, "JoyReleaseCapture(%04X);\n", wID);
     JoyCaptured = FALSE;
@@ -208,7 +208,7 @@
 /**************************************************************************
  * 				JoySetCapture		[MMSYSTEM.106]
  */
-WORD JoySetCapture(HWND16 hWnd, WORD wID, WORD wPeriod, BOOL16 bChanged)
+WORD WINAPI JoySetCapture(HWND16 hWnd, WORD wID, WORD wPeriod, BOOL16 bChanged)
 {
 
     dprintf_mmsys(stderr, "JoySetCapture(%04X, %04X, %d, %d);\n",
@@ -227,7 +227,7 @@
 /**************************************************************************
  * 				JoySetThreshold		[MMSYSTEM.107]
  */
-WORD JoySetThreshold(WORD wID, WORD wThreshold)
+WORD WINAPI JoySetThreshold(WORD wID, WORD wThreshold)
 {
     dprintf_mmsys(stderr, "JoySetThreshold(%04X, %d);\n", wID, wThreshold);
 
@@ -239,7 +239,7 @@
 /**************************************************************************
  * 				JoySetCalibration	[MMSYSTEM.109]
  */
-WORD JoySetCalibration(WORD wID)
+WORD WINAPI JoySetCalibration(WORD wID)
 {
     fprintf(stderr, "EMPTY STUB !!! JoySetCalibration(%04X);\n", wID);
     return JOYERR_NOCANDO;
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index 1624ee3..f97ca49 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -42,8 +42,8 @@
 extern UINT16 MMSYSTEM_NextDevID(UINT16 wDevID);
 extern BOOL32 MMSYSTEM_DevIDValid(UINT16 wDevID);
 
-LONG DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
-		      DWORD dwParam1, DWORD dwParam2);
+LONG WINAPI DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
+                             DWORD dwParam1, DWORD dwParam2);
 
 LONG WAVE_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
 		     DWORD dwParam1, DWORD dwParam2);
@@ -2107,8 +2107,8 @@
 /* FIXME: "all" is a valid devicetype and we should access all devices if
  * it is used. (imagine "close all"). Not implemented yet.
  */
-DWORD mciSendString (LPCSTR lpstrCommand, LPSTR lpstrReturnString, 
-	UINT16 uReturnLength, HWND16 hwndCallback)
+DWORD WINAPI mciSendString (LPCSTR lpstrCommand, LPSTR lpstrReturnString, 
+                            UINT16 uReturnLength, HWND16 hwndCallback)
 {
 	char	*cmd,*dev,*args,**keywords,*filename;
 	WORD	uDevTyp=0,wDevID=0;
diff --git a/multimedia/midi.c b/multimedia/midi.c
index 7384f8d..9392819 100644
--- a/multimedia/midi.c
+++ b/multimedia/midi.c
@@ -1089,7 +1089,7 @@
 	lpCaps->wMid = 0x00FF; 	/* Manufac ID */
 	lpCaps->wPid = 0x0001; 	/* Product ID */
 	lpCaps->vDriverVersion = 0x001; /* Product Version */
-	strcpy(lpCaps->szPname, "Linux MIDIOUT Driver version 0.01");
+	strcpy(lpCaps->szPname, "Linux MIDIOUT Driver v0.01");
 /* FIXME
    Values are the same as I get with Borland TC 4.5
 */
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index b4f6cf9..b13221f 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -39,8 +39,8 @@
 
 UINT16 midiGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
 UINT16 waveGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
-LONG DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
-		      DWORD dwParam1, DWORD dwParam2);
+LONG WINAPI DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
+                             DWORD dwParam1, DWORD dwParam2);
 
 LONG WAVE_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
 		     DWORD dwParam1, DWORD dwParam2);
@@ -98,8 +98,8 @@
 /**************************************************************************
 * 				MMSYSTEM_WEP		[MMSYSTEM.1]
 */
-int MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
-		 WORD cbHeapSize, LPSTR lpCmdLine)
+int WINAPI MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
+                        WORD cbHeapSize, LPSTR lpCmdLine)
 {
 	fprintf(stderr, "STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance);
 	return(TRUE);
@@ -108,7 +108,7 @@
 /**************************************************************************
 * 				sndPlaySound		[MMSYSTEM.2]
 */
-BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
+BOOL16 WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
 {
 	BOOL16			bRet = FALSE;
 	HMMIO16			hmmio;
@@ -251,7 +251,7 @@
 /**************************************************************************
 * 				mmsystemGetVersion	[MMSYSTEM.5]
 */
-WORD mmsystemGetVersion()
+WORD WINAPI mmsystemGetVersion()
 {
 	dprintf_mmsys(stddeb, "mmsystemGetVersion // 0.4.0 ...?... :-) !\n");
 	return 0x0040;
@@ -260,8 +260,8 @@
 /**************************************************************************
 * 				DriverProc	[MMSYSTEM.6]
 */
-LRESULT DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
-						DWORD dwParam1, DWORD dwParam2)
+LRESULT WINAPI DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
+                          DWORD dwParam1, DWORD dwParam2)
 {
 	return DrvDefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
 }
@@ -269,8 +269,8 @@
 /**************************************************************************
 * 				DriverCallback	[MMSYSTEM.31]
 */
-BOOL16 DriverCallback(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, 
-		WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
+BOOL16 WINAPI DriverCallback(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, 
+                             WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -303,7 +303,7 @@
 /**************************************************************************
 * 				auxGetNumDevs		[MMSYSTEM.350]
 */
-UINT16 auxGetNumDevs()
+UINT16 WINAPI auxGetNumDevs()
 {
 	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "auxGetNumDevs !\n");
@@ -315,7 +315,7 @@
 /**************************************************************************
 * 				auxGetDevCaps		[MMSYSTEM.351]
 */
-UINT16 auxGetDevCaps(UINT16 uDeviceID, AUXCAPS * lpCaps, UINT16 uSize)
+UINT16 WINAPI auxGetDevCaps(UINT16 uDeviceID, AUXCAPS * lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "auxGetDevCaps(%04X, %p, %d) !\n", 
 					uDeviceID, lpCaps, uSize);
@@ -326,7 +326,7 @@
 /**************************************************************************
 * 				auxGetVolume		[MMSYSTEM.352]
 */
-UINT16 auxGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume)
+UINT16 WINAPI auxGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume)
 {
 	dprintf_mmsys(stddeb, "auxGetVolume(%04X, %p) !\n", uDeviceID, lpdwVolume);
 	return auxMessage(uDeviceID, AUXDM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -335,7 +335,7 @@
 /**************************************************************************
 * 				auxSetVolume		[MMSYSTEM.353]
 */
-UINT16 auxSetVolume(UINT16 uDeviceID, DWORD dwVolume)
+UINT16 WINAPI auxSetVolume(UINT16 uDeviceID, DWORD dwVolume)
 {
 	dprintf_mmsys(stddeb, "auxSetVolume(%04X, %08lX) !\n", uDeviceID, dwVolume);
 	return auxMessage(uDeviceID, AUXDM_SETVOLUME, 0L, dwVolume, 0L);
@@ -344,7 +344,7 @@
 /**************************************************************************
 * 				auxOutMessage		[MMSYSTEM.354]
 */
-DWORD auxOutMessage(UINT16 uDeviceID, UINT16 uMessage, DWORD dw1, DWORD dw2)
+DWORD WINAPI auxOutMessage(UINT16 uDeviceID, UINT16 uMessage, DWORD dw1, DWORD dw2)
 {
 	dprintf_mmsys(stddeb, "auxOutMessage(%04X, %04X, %08lX, %08lX)\n", 
 				uDeviceID, uMessage, dw1, dw2);
@@ -354,7 +354,7 @@
 /**************************************************************************
 * 				mciGetErrorString		[MMSYSTEM.706]
 */
-BOOL16 mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT16 uLength)
+BOOL16 WINAPI mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT16 uLength)
 {
 	LPSTR	msgptr;
 	dprintf_mmsys(stddeb, "mciGetErrorString(%08lX, %p, %d);\n", wError, lpstrBuffer, uLength);
@@ -630,7 +630,7 @@
 /**************************************************************************
 * 				mciDriverNotify			[MMSYSTEM.711]
 */
-BOOL16 mciDriverNotify(HWND16 hWndCallBack, UINT16 wDevID, UINT16 wStatus)
+BOOL16 WINAPI mciDriverNotify(HWND16 hWndCallBack, UINT16 wDevID, UINT16 wStatus)
 {
 	dprintf_mmsys(stddeb, "mciDriverNotify(%04X, %u, %04X)\n", hWndCallBack, wDevID, wStatus);
 	if (!IsWindow32(hWndCallBack)) return FALSE;
@@ -935,7 +935,8 @@
 /**************************************************************************
 * 				mciSendCommand			[MMSYSTEM.701]
 */
-DWORD mciSendCommand(UINT16 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI mciSendCommand(UINT16 wDevID, UINT16 wMsg, DWORD dwParam1,
+                            DWORD dwParam2)
 {
     HDRVR16 hDrv = 0;
     dprintf_mci(stddeb, "mciSendCommand(%04X, %s, %08lX, %08lX)\n", 
@@ -977,7 +978,7 @@
 /**************************************************************************
 * 				mciGetDeviceID	       	[MMSYSTEM.703]
 */
-UINT16 mciGetDeviceID (LPCSTR lpstrName)
+UINT16 WINAPI mciGetDeviceID (LPCSTR lpstrName)
 {
     UINT16 wDevID;
 
@@ -1007,8 +1008,8 @@
 /**************************************************************************
 * 				mciSetYieldProc		[MMSYSTEM.714]
 */
-BOOL16 mciSetYieldProc (UINT16 uDeviceID, 
-		YIELDPROC fpYieldProc, DWORD dwYieldData)
+BOOL16 WINAPI mciSetYieldProc (UINT16 uDeviceID, 
+                               YIELDPROC fpYieldProc, DWORD dwYieldData)
 {
     return FALSE;
 }
@@ -1016,7 +1017,7 @@
 /**************************************************************************
 * 				mciGetDeviceIDFromElementID	[MMSYSTEM.715]
 */
-UINT16 mciGetDeviceIDFromElementID(DWORD dwElementID, LPCSTR lpstrType)
+UINT16 WINAPI mciGetDeviceIDFromElementID(DWORD dwElementID, LPCSTR lpstrType)
 {
     return 0;
 }
@@ -1024,7 +1025,7 @@
 /**************************************************************************
 * 				mciGetYieldProc		[MMSYSTEM.716]
 */
-YIELDPROC mciGetYieldProc(UINT16 uDeviceID, DWORD * lpdwYieldData)
+YIELDPROC WINAPI mciGetYieldProc(UINT16 uDeviceID, DWORD * lpdwYieldData)
 {
     return NULL;
 }
@@ -1032,7 +1033,7 @@
 /**************************************************************************
 * 				mciGetCreatorTask	[MMSYSTEM.717]
 */
-HTASK16 mciGetCreatorTask(UINT16 uDeviceID)
+HTASK16 WINAPI mciGetCreatorTask(UINT16 uDeviceID)
 {
     return 0;
 }
@@ -1040,7 +1041,7 @@
 /**************************************************************************
 * 				midiOutGetNumDevs	[MMSYSTEM.201]
 */
-UINT16 midiOutGetNumDevs(void)
+UINT16 WINAPI midiOutGetNumDevs(void)
 {
 	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "midiOutGetNumDevs\n");
@@ -1052,7 +1053,7 @@
 /**************************************************************************
 * 				midiOutGetDevCaps	[MMSYSTEM.202]
 */
-UINT16 midiOutGetDevCaps(UINT16 uDeviceID, MIDIOUTCAPS * lpCaps, UINT16 uSize)
+UINT16 WINAPI midiOutGetDevCaps(UINT16 uDeviceID, MIDIOUTCAPS * lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiOutGetDevCaps\n");
 	return modMessage(uDeviceID,MODM_GETDEVCAPS,0,(DWORD)lpCaps,uSize);
@@ -1061,7 +1062,7 @@
 /**************************************************************************
 * 				midiOutGetErrorText 	[MMSYSTEM.203]
 */
-UINT16 midiOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
+UINT16 WINAPI midiOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiOutGetErrorText\n");
 	return midiGetErrorText(uError, lpText, uSize);
@@ -1071,7 +1072,7 @@
 /**************************************************************************
 * 				midiGetErrorText       	[internal]
 */
-UINT16 midiGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
+UINT16 WINAPI midiGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
 	LPSTR	msgptr;
 	if ((lpText == NULL) || (uSize < 1)) return(FALSE);
@@ -1116,8 +1117,8 @@
 /**************************************************************************
 * 				midiOutOpen    		[MMSYSTEM.204]
 */
-UINT16 midiOutOpen(HMIDIOUT16 * lphMidiOut, UINT16 uDeviceID,
-		 DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
+UINT16 WINAPI midiOutOpen(HMIDIOUT16 * lphMidiOut, UINT16 uDeviceID,
+                          DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HMIDI16	hMidiOut;
 	LPMIDIOPENDESC	lpDesc;
@@ -1154,7 +1155,7 @@
 /**************************************************************************
 * 				midiOutClose		[MMSYSTEM.205]
 */
-UINT16 midiOutClose(HMIDIOUT16 hMidiOut)
+UINT16 WINAPI midiOutClose(HMIDIOUT16 hMidiOut)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutClose(%04X)\n", hMidiOut);
@@ -1166,8 +1167,8 @@
 /**************************************************************************
 * 				midiOutPrepareHeader	[MMSYSTEM.206]
 */
-UINT16 midiOutPrepareHeader(HMIDIOUT16 hMidiOut,
-    MIDIHDR * lpMidiOutHdr, UINT16 uSize)
+UINT16 WINAPI midiOutPrepareHeader(HMIDIOUT16 hMidiOut,
+                                   MIDIHDR * lpMidiOutHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutPrepareHeader(%04X, %p, %d)\n", 
@@ -1181,8 +1182,8 @@
 /**************************************************************************
 * 				midiOutUnprepareHeader	[MMSYSTEM.207]
 */
-UINT16 midiOutUnprepareHeader(HMIDIOUT16 hMidiOut,
-    MIDIHDR * lpMidiOutHdr, UINT16 uSize)
+UINT16 WINAPI midiOutUnprepareHeader(HMIDIOUT16 hMidiOut,
+                                     MIDIHDR * lpMidiOutHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutUnprepareHeader(%04X, %p, %d)\n", 
@@ -1196,7 +1197,7 @@
 /**************************************************************************
 * 				midiOutShortMsg		[MMSYSTEM.208]
 */
-UINT16 midiOutShortMsg(HMIDIOUT16 hMidiOut, DWORD dwMsg)
+UINT16 WINAPI midiOutShortMsg(HMIDIOUT16 hMidiOut, DWORD dwMsg)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutShortMsg(%04X, %08lX)\n", hMidiOut, dwMsg);
@@ -1208,8 +1209,8 @@
 /**************************************************************************
 * 				midiOutLongMsg		[MMSYSTEM.209]
 */
-UINT16 midiOutLongMsg(HMIDIOUT16 hMidiOut,
-    MIDIHDR * lpMidiOutHdr, UINT16 uSize)
+UINT16 WINAPI midiOutLongMsg(HMIDIOUT16 hMidiOut,
+                             MIDIHDR * lpMidiOutHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutLongMsg(%04X, %p, %d)\n", 
@@ -1223,7 +1224,7 @@
 /**************************************************************************
 * 				midiOutReset		[MMSYSTEM.210]
 */
-UINT16 midiOutReset(HMIDIOUT16 hMidiOut)
+UINT16 WINAPI midiOutReset(HMIDIOUT16 hMidiOut)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutReset(%04X)\n", hMidiOut);
@@ -1235,7 +1236,7 @@
 /**************************************************************************
 * 				midiOutGetVolume	[MMSYSTEM.211]
 */
-UINT16 midiOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume)
+UINT16 WINAPI midiOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume)
 {
 	dprintf_mmsys(stddeb, "midiOutGetVolume(%04X, %p);\n", uDeviceID, lpdwVolume);
 	return modMessage(uDeviceID, MODM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -1245,7 +1246,7 @@
 /**************************************************************************
 * 				midiOutSetVolume	[MMSYSTEM.212]
 */
-UINT16 midiOutSetVolume(UINT16 uDeviceID, DWORD dwVolume)
+UINT16 WINAPI midiOutSetVolume(UINT16 uDeviceID, DWORD dwVolume)
 {
 	dprintf_mmsys(stddeb, "midiOutSetVolume(%04X, %08lX);\n", uDeviceID, dwVolume);
 	return modMessage(uDeviceID, MODM_SETVOLUME, 0L, dwVolume, 0L);
@@ -1255,8 +1256,8 @@
 /**************************************************************************
 * 				midiOutCachePatches		[MMSYSTEM.213]
 */
-UINT16 midiOutCachePatches(HMIDIOUT16 hMidiOut,
-    UINT16 uBank, WORD * lpwPatchArray, UINT16 uFlags)
+UINT16 WINAPI midiOutCachePatches(HMIDIOUT16 hMidiOut, UINT16 uBank,
+                                  WORD * lpwPatchArray, UINT16 uFlags)
 {
         /* not really necessary to support this */
 	fprintf(stdnimp, "midiOutCachePatches: not supported yet\n");
@@ -1266,8 +1267,8 @@
 /**************************************************************************
 * 				midiOutCacheDrumPatches	[MMSYSTEM.214]
 */
-UINT16 midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut,
-    UINT16 uPatch, WORD * lpwKeyArray, UINT16 uFlags)
+UINT16 WINAPI midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut, UINT16 uPatch,
+                                      WORD * lpwKeyArray, UINT16 uFlags)
 {
 	fprintf(stdnimp, "midiOutCacheDrumPatchesi: not supported yet\n");
 	return MMSYSERR_NOTSUPPORTED;
@@ -1276,7 +1277,7 @@
 /**************************************************************************
 * 				midiOutGetID		[MMSYSTEM.215]
 */
-UINT16 midiOutGetID(HMIDIOUT16 hMidiOut, UINT16 * lpuDeviceID)
+UINT16 WINAPI midiOutGetID(HMIDIOUT16 hMidiOut, UINT16 * lpuDeviceID)
 {
 	dprintf_mmsys(stddeb, "midiOutGetID\n");
 	return 0;
@@ -1285,8 +1286,8 @@
 /**************************************************************************
 * 				midiOutMessage		[MMSYSTEM.216]
 */
-DWORD midiOutMessage(HMIDIOUT16 hMidiOut, UINT16 uMessage, 
-						DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI midiOutMessage(HMIDIOUT16 hMidiOut, UINT16 uMessage, 
+                            DWORD dwParam1, DWORD dwParam2)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutMessage(%04X, %04X, %08lX, %08lX)\n", 
@@ -1300,7 +1301,7 @@
 /**************************************************************************
 * 				midiInGetNumDevs	[MMSYSTEM.301]
 */
-UINT16 midiInGetNumDevs(void)
+UINT16 WINAPI midiInGetNumDevs(void)
 {
 	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "midiInGetNumDevs\n");
@@ -1312,8 +1313,8 @@
 /**************************************************************************
 * 				midiInGetDevCaps	[MMSYSTEM.302]
 */
-UINT16 midiInGetDevCaps(UINT16 uDeviceID,
-    LPMIDIINCAPS lpCaps, UINT16 uSize)
+UINT16 WINAPI midiInGetDevCaps(UINT16 uDeviceID,
+                               LPMIDIINCAPS lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiInGetDevCaps\n");
 	return midMessage(uDeviceID,MIDM_GETDEVCAPS,0,(DWORD)lpCaps,uSize);;
@@ -1322,7 +1323,7 @@
 /**************************************************************************
 * 				midiInGetErrorText 		[MMSYSTEM.303]
 */
-UINT16 midiInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
+UINT16 WINAPI midiInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiInGetErrorText\n");
 	return (midiGetErrorText(uError, lpText, uSize));
@@ -1331,8 +1332,8 @@
 /**************************************************************************
 * 				midiInOpen		[MMSYSTEM.304]
 */
-UINT16 midiInOpen(HMIDIIN16 * lphMidiIn, UINT16 uDeviceID,
-    DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
+UINT16 WINAPI midiInOpen(HMIDIIN16 * lphMidiIn, UINT16 uDeviceID,
+                         DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HMIDI16	hMidiIn;
 	LPMIDIOPENDESC	lpDesc;
@@ -1369,7 +1370,7 @@
 /**************************************************************************
 * 				midiInClose		[MMSYSTEM.305]
 */
-UINT16 midiInClose(HMIDIIN16 hMidiIn)
+UINT16 WINAPI midiInClose(HMIDIIN16 hMidiIn)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInClose(%04X)\n", hMidiIn);
@@ -1381,8 +1382,8 @@
 /**************************************************************************
 * 				midiInPrepareHeader	[MMSYSTEM.306]
 */
-UINT16 midiInPrepareHeader(HMIDIIN16 hMidiIn,
-    MIDIHDR * lpMidiInHdr, UINT16 uSize)
+UINT16 WINAPI midiInPrepareHeader(HMIDIIN16 hMidiIn,
+                                  MIDIHDR * lpMidiInHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInPrepareHeader(%04X, %p, %d)\n", 
@@ -1396,8 +1397,8 @@
 /**************************************************************************
 * 				midiInUnprepareHeader	[MMSYSTEM.307]
 */
-UINT16 midiInUnprepareHeader(HMIDIIN16 hMidiIn,
-    MIDIHDR * lpMidiInHdr, UINT16 uSize)
+UINT16 WINAPI midiInUnprepareHeader(HMIDIIN16 hMidiIn,
+                                    MIDIHDR * lpMidiInHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInUnprepareHeader(%04X, %p, %d)\n", 
@@ -1411,8 +1412,8 @@
 /**************************************************************************
 * 				midiInAddBuffer		[MMSYSTEM.308]
 */
-UINT16 midiInAddBuffer(HMIDIIN16 hMidiIn,
-    MIDIHDR * lpMidiInHdr, UINT16 uSize)
+UINT16 WINAPI midiInAddBuffer(HMIDIIN16 hMidiIn,
+                              MIDIHDR * lpMidiInHdr, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiInAddBuffer\n");
 	return 0;
@@ -1421,7 +1422,7 @@
 /**************************************************************************
 * 				midiInStart			[MMSYSTEM.309]
 */
-UINT16 midiInStart(HMIDIIN16 hMidiIn)
+UINT16 WINAPI midiInStart(HMIDIIN16 hMidiIn)
 {
 	dprintf_mmsys(stddeb, "midiInStart\n");
 	return 0;
@@ -1430,7 +1431,7 @@
 /**************************************************************************
 * 				midiInStop			[MMSYSTEM.310]
 */
-UINT16 midiInStop(HMIDIIN16 hMidiIn)
+UINT16 WINAPI midiInStop(HMIDIIN16 hMidiIn)
 {
 	dprintf_mmsys(stddeb, "midiInStop\n");
 	return 0;
@@ -1439,7 +1440,7 @@
 /**************************************************************************
 * 				midiInReset			[MMSYSTEM.311]
 */
-UINT16 midiInReset(HMIDIIN16 hMidiIn)
+UINT16 WINAPI midiInReset(HMIDIIN16 hMidiIn)
 {
 	dprintf_mmsys(stddeb, "midiInReset\n");
 	return 0;
@@ -1448,7 +1449,7 @@
 /**************************************************************************
 * 				midiInGetID			[MMSYSTEM.312]
 */
-UINT16 midiInGetID(HMIDIIN16 hMidiIn, UINT16 * lpuDeviceID)
+UINT16 WINAPI midiInGetID(HMIDIIN16 hMidiIn, UINT16 * lpuDeviceID)
 {
 	dprintf_mmsys(stddeb, "midiInGetID\n");
 	return 0;
@@ -1457,8 +1458,8 @@
 /**************************************************************************
 * 				midiInMessage		[MMSYSTEM.313]
 */
-DWORD midiInMessage(HMIDIIN16 hMidiIn, UINT16 uMessage, 
-							DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI midiInMessage(HMIDIIN16 hMidiIn, UINT16 uMessage, 
+                           DWORD dwParam1, DWORD dwParam2)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInMessage(%04X, %04X, %08lX, %08lX)\n", 
@@ -1472,7 +1473,7 @@
 /**************************************************************************
 * 				waveOutGetNumDevs		[MMSYSTEM.401]
 */
-UINT16 waveOutGetNumDevs()
+UINT16 WINAPI waveOutGetNumDevs()
 {
 	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "waveOutGetNumDevs\n");
@@ -1484,7 +1485,8 @@
 /**************************************************************************
 * 				waveOutGetDevCaps		[MMSYSTEM.402]
 */
-UINT16 waveOutGetDevCaps(UINT16 uDeviceID, WAVEOUTCAPS * lpCaps, UINT16 uSize)
+UINT16 WINAPI waveOutGetDevCaps(UINT16 uDeviceID, WAVEOUTCAPS * lpCaps,
+                                UINT16 uSize)
 {
 	if (uDeviceID > waveOutGetNumDevs() - 1) return MMSYSERR_BADDEVICEID;
 	if (uDeviceID == (UINT16)WAVE_MAPPER) return MMSYSERR_BADDEVICEID; /* FIXME: do we have a wave mapper ? */
@@ -1495,7 +1497,7 @@
 /**************************************************************************
 * 				waveOutGetErrorText 	[MMSYSTEM.403]
 */
-UINT16 waveOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
+UINT16 WINAPI waveOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
    dprintf_mmsys(stddeb, "waveOutGetErrorText\n");
    return(waveGetErrorText(uError, lpText, uSize));
@@ -1571,8 +1573,9 @@
 /**************************************************************************
 * 				waveOutOpen			[MMSYSTEM.404]
 */
-UINT16 waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
-    const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
+UINT16 WINAPI waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
+                          const LPWAVEFORMAT lpFormat, DWORD dwCallback,
+                          DWORD dwInstance, DWORD dwFlags)
 {
 	HWAVEOUT16 hWaveOut;
 	LPWAVEOPENDESC	lpDesc;
@@ -1621,7 +1624,7 @@
 /**************************************************************************
 * 				waveOutClose		[MMSYSTEM.405]
 */
-UINT16 waveOutClose(HWAVEOUT16 hWaveOut)
+UINT16 WINAPI waveOutClose(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -1634,8 +1637,8 @@
 /**************************************************************************
 * 				waveOutPrepareHeader	[MMSYSTEM.406]
 */
-UINT16 waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
-     WAVEHDR * lpWaveOutHdr, UINT16 uSize)
+UINT16 WINAPI waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
+                                   WAVEHDR * lpWaveOutHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -1650,8 +1653,8 @@
 /**************************************************************************
 * 				waveOutUnprepareHeader	[MMSYSTEM.407]
 */
-UINT16 waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
-    WAVEHDR * lpWaveOutHdr, UINT16 uSize)
+UINT16 WINAPI waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
+                                     WAVEHDR * lpWaveOutHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -1666,7 +1669,8 @@
 /**************************************************************************
 * 				waveOutWrite		[MMSYSTEM.408]
 */
-UINT16 waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr,  UINT16 uSize)
+UINT16 WINAPI waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr,
+                           UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -1680,7 +1684,7 @@
 /**************************************************************************
 * 				waveOutPause		[MMSYSTEM.409]
 */
-UINT16 waveOutPause(HWAVEOUT16 hWaveOut)
+UINT16 WINAPI waveOutPause(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -1693,7 +1697,7 @@
 /**************************************************************************
 * 				waveOutRestart		[MMSYSTEM.410]
 */
-UINT16 waveOutRestart(HWAVEOUT16 hWaveOut)
+UINT16 WINAPI waveOutRestart(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -1706,7 +1710,7 @@
 /**************************************************************************
 * 				waveOutReset		[MMSYSTEM.411]
 */
-UINT16 waveOutReset(HWAVEOUT16 hWaveOut)
+UINT16 WINAPI waveOutReset(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutReset(%04X)\n", hWaveOut);
@@ -1718,7 +1722,8 @@
 /**************************************************************************
 * 				waveOutGetPosition	[MMSYSTEM.412]
 */
-UINT16 waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpTime, UINT16 uSize)
+UINT16 WINAPI waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpTime,
+                                 UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut, lpTime, uSize);
@@ -1731,7 +1736,7 @@
 /**************************************************************************
 * 				waveOutGetPitch		[MMSYSTEM.413]
 */
-UINT16 waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch)
+UINT16 WINAPI waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetPitch(%04X, %p);\n", hWaveOut, lpdwPitch);
@@ -1744,7 +1749,7 @@
 /**************************************************************************
 * 				waveOutSetPitch		[MMSYSTEM.414]
 */
-UINT16 waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch)
+UINT16 WINAPI waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut, dwPitch);
@@ -1756,7 +1761,7 @@
 /**************************************************************************
 * 				waveOutGetVolume	[MMSYSTEM.415]
 */
-UINT16 waveOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume)
+UINT16 WINAPI waveOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume)
 {
 	dprintf_mmsys(stddeb, "waveOutGetVolume(%04X, %p);\n", uDeviceID, lpdwVolume);
 	return wodMessage(uDeviceID, WODM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -1765,7 +1770,7 @@
 /**************************************************************************
 * 				waveOutSetVolume	[MMSYSTEM.416]
 */
-UINT16 waveOutSetVolume(UINT16 uDeviceID, DWORD dwVolume)
+UINT16 WINAPI waveOutSetVolume(UINT16 uDeviceID, DWORD dwVolume)
 {
 	dprintf_mmsys(stddeb, "waveOutSetVolume(%04X, %08lX);\n", uDeviceID, dwVolume);
 	return wodMessage(uDeviceID, WODM_SETVOLUME, 0L, dwVolume, 0L);
@@ -1774,7 +1779,7 @@
 /**************************************************************************
 * 				waveOutGetPlaybackRate	[MMSYSTEM.417]
 */
-UINT16 waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate)
+UINT16 WINAPI waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut, lpdwRate);
@@ -1787,7 +1792,7 @@
 /**************************************************************************
 * 				waveOutSetPlaybackRate	[MMSYSTEM.418]
 */
-UINT16 waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate)
+UINT16 WINAPI waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut, dwRate);
@@ -1800,7 +1805,7 @@
 /**************************************************************************
 * 				waveOutBreakLoop 	[MMSYSTEM.419]
 */
-UINT16 waveOutBreakLoop(HWAVEOUT16 hWaveOut)
+UINT16 WINAPI waveOutBreakLoop(HWAVEOUT16 hWaveOut)
 {
 	dprintf_mmsys(stddeb, "waveOutBreakLoop(%04X)\n", hWaveOut);
 	return MMSYSERR_INVALHANDLE;
@@ -1809,7 +1814,7 @@
 /**************************************************************************
 * 				waveOutGetID	 	[MMSYSTEM.420]
 */
-UINT16 waveOutGetID(HWAVEOUT16 hWaveOut, UINT16 * lpuDeviceID)
+UINT16 WINAPI waveOutGetID(HWAVEOUT16 hWaveOut, UINT16 * lpuDeviceID)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetID(%04X, %p);\n", hWaveOut, lpuDeviceID);
@@ -1823,8 +1828,8 @@
 /**************************************************************************
 * 				waveOutMessage 		[MMSYSTEM.421]
 */
-DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 uMessage, 
-							DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 uMessage, 
+                            DWORD dwParam1, DWORD dwParam2)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutMessage(%04X, %04X, %08lX, %08lX)\n", 
@@ -1837,7 +1842,7 @@
 /**************************************************************************
 * 				waveInGetNumDevs 		[MMSYSTEM.501]
 */
-UINT16 waveInGetNumDevs()
+UINT16 WINAPI waveInGetNumDevs()
 {
 	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "waveInGetNumDevs\n");
@@ -1850,7 +1855,7 @@
 /**************************************************************************
 * 				waveInGetDevCaps 		[MMSYSTEM.502]
 */
-UINT16 waveInGetDevCaps(UINT16 uDeviceID, WAVEINCAPS * lpCaps, UINT16 uSize)
+UINT16 WINAPI waveInGetDevCaps(UINT16 uDeviceID, WAVEINCAPS * lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "waveInGetDevCaps\n");
 	return widMessage(uDeviceID, WIDM_GETDEVCAPS, 0L, (DWORD)lpCaps, uSize);
@@ -1860,7 +1865,7 @@
 /**************************************************************************
 * 				waveInGetErrorText 	[MMSYSTEM.503]
 */
-UINT16 waveInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
+UINT16 WINAPI waveInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
    dprintf_mmsys(stddeb, "waveInGetErrorText\n");
    return(waveGetErrorText(uError, lpText, uSize));
@@ -1870,8 +1875,9 @@
 /**************************************************************************
 * 				waveInOpen			[MMSYSTEM.504]
 */
-UINT16 waveInOpen(HWAVEIN16 * lphWaveIn, UINT16 uDeviceID,
-    const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
+UINT16 WINAPI waveInOpen(HWAVEIN16 * lphWaveIn, UINT16 uDeviceID,
+                         const LPWAVEFORMAT lpFormat, DWORD dwCallback,
+                         DWORD dwInstance, DWORD dwFlags)
 {
 	HWAVEIN16 hWaveIn;
 	LPWAVEOPENDESC	lpDesc;
@@ -1918,7 +1924,7 @@
 /**************************************************************************
 * 				waveInClose			[MMSYSTEM.505]
 */
-UINT16 waveInClose(HWAVEIN16 hWaveIn)
+UINT16 WINAPI waveInClose(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -1932,8 +1938,8 @@
 /**************************************************************************
 * 				waveInPrepareHeader		[MMSYSTEM.506]
 */
-UINT16 waveInPrepareHeader(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT16 uSize)
+UINT16 WINAPI waveInPrepareHeader(HWAVEIN16 hWaveIn,
+                                  WAVEHDR * lpWaveInHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEHDR 		lp32WaveInHdr;
@@ -1956,8 +1962,8 @@
 /**************************************************************************
 * 				waveInUnprepareHeader	[MMSYSTEM.507]
 */
-UINT16 waveInUnprepareHeader(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT16 uSize)
+UINT16 WINAPI waveInUnprepareHeader(HWAVEIN16 hWaveIn,
+                                    WAVEHDR * lpWaveInHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEHDR 		lp32WaveInHdr;
@@ -1979,8 +1985,8 @@
 /**************************************************************************
 * 				waveInAddBuffer		[MMSYSTEM.508]
 */
-UINT16 waveInAddBuffer(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT16 uSize)
+UINT16 WINAPI waveInAddBuffer(HWAVEIN16 hWaveIn,
+                              WAVEHDR * lpWaveInHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEHDR 		lp32WaveInHdr;
@@ -2002,7 +2008,7 @@
 /**************************************************************************
 * 				waveInStart			[MMSYSTEM.509]
 */
-UINT16 waveInStart(HWAVEIN16 hWaveIn)
+UINT16 WINAPI waveInStart(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -2016,7 +2022,7 @@
 /**************************************************************************
 * 				waveInStop			[MMSYSTEM.510]
 */
-UINT16 waveInStop(HWAVEIN16 hWaveIn)
+UINT16 WINAPI waveInStop(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -2030,7 +2036,7 @@
 /**************************************************************************
 * 				waveInReset			[MMSYSTEM.511]
 */
-UINT16 waveInReset(HWAVEIN16 hWaveIn)
+UINT16 WINAPI waveInReset(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -2044,7 +2050,8 @@
 /**************************************************************************
 * 				waveInGetPosition	[MMSYSTEM.512]
 */
-UINT16 waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpTime, UINT16 uSize)
+UINT16 WINAPI waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpTime,
+                                UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -2059,7 +2066,7 @@
 /**************************************************************************
 * 				waveInGetID			[MMSYSTEM.513]
 */
-UINT16 waveInGetID(HWAVEIN16 hWaveIn, UINT16 * lpuDeviceID)
+UINT16 WINAPI waveInGetID(HWAVEIN16 hWaveIn, UINT16 * lpuDeviceID)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -2075,8 +2082,8 @@
 /**************************************************************************
 * 				waveInMessage 		[MMSYSTEM.514]
 */
-DWORD waveInMessage(HWAVEIN16 hWaveIn, UINT16 uMessage,
-		    DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI waveInMessage(HWAVEIN16 hWaveIn, UINT16 uMessage,
+                           DWORD dwParam1, DWORD dwParam2)
 {
 	LPWAVEOPENDESC	lpDesc;
 
@@ -2091,7 +2098,8 @@
 /**************************************************************************
 * 				mmioOpen       		[MMSYSTEM.1210]
 */
-HMMIO16 mmioOpen(LPSTR szFileName, MMIOINFO * lpmmioinfo, DWORD dwOpenFlags)
+HMMIO16 WINAPI mmioOpen(LPSTR szFileName, MMIOINFO * lpmmioinfo,
+                        DWORD dwOpenFlags)
 {
         HFILE32 hFile;
 	HMMIO16		hmmio;
@@ -2121,7 +2129,7 @@
 /**************************************************************************
 * 				mmioClose      		[MMSYSTEM.1211]
 */
-UINT16 mmioClose(HMMIO16 hmmio, UINT16 uFlags)
+UINT16 WINAPI mmioClose(HMMIO16 hmmio, UINT16 uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmio(stddeb, "mmioClose(%04X, %04X);\n", hmmio, uFlags);
@@ -2138,7 +2146,7 @@
 /**************************************************************************
 * 				mmioRead	       	[MMSYSTEM.1212]
 */
-LONG mmioRead(HMMIO16 hmmio, HPSTR pch, LONG cch)
+LONG WINAPI mmioRead(HMMIO16 hmmio, HPSTR pch, LONG cch)
 {
 	LONG		count;
 	LPMMIOINFO	lpmminfo;
@@ -2156,7 +2164,7 @@
 /**************************************************************************
 * 				mmioWrite      		[MMSYSTEM.1213]
 */
-LONG mmioWrite(HMMIO16 hmmio, HPCSTR pch, LONG cch)
+LONG WINAPI mmioWrite(HMMIO16 hmmio, HPCSTR pch, LONG cch)
 {
 	LONG		count;
 	LPMMIOINFO	lpmminfo;
@@ -2171,7 +2179,7 @@
 /**************************************************************************
 * 				mmioSeek       		[MMSYSTEM.1214]
 */
-LONG mmioSeek(HMMIO16 hmmio, LONG lOffset, int iOrigin)
+LONG WINAPI mmioSeek(HMMIO16 hmmio, LONG lOffset, int iOrigin)
 {
 	int		count;
 	LPMMIOINFO	lpmminfo;
@@ -2189,7 +2197,7 @@
 /**************************************************************************
 * 				mmioGetInfo	       	[MMSYSTEM.1215]
 */
-UINT16 mmioGetInfo(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags)
+UINT16 WINAPI mmioGetInfo(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmio(stddeb, "mmioGetInfo\n");
@@ -2203,7 +2211,7 @@
 /**************************************************************************
 * 				mmioSetInfo    		[MMSYSTEM.1216]
 */
-UINT16 mmioSetInfo(HMMIO16 hmmio, const MMIOINFO * lpmmioinfo, UINT16 uFlags)
+UINT16 WINAPI mmioSetInfo(HMMIO16 hmmio, const MMIOINFO * lpmmioinfo, UINT16 uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmio(stddeb, "mmioSetInfo\n");
@@ -2216,8 +2224,8 @@
 /**************************************************************************
 * 				mmioSetBuffer		[MMSYSTEM.1217]
 */
-UINT16 mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer, 
-						LONG cchBuffer, UINT16 uFlags)
+UINT16 WINAPI mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer, 
+                            LONG cchBuffer, UINT16 uFlags)
 {
 	dprintf_mmio(stddeb, "mmioSetBuffer // empty stub \n");
 	return 0;
@@ -2226,7 +2234,7 @@
 /**************************************************************************
 * 				mmioFlush      		[MMSYSTEM.1218]
 */
-UINT16 mmioFlush(HMMIO16 hmmio, UINT16 uFlags)
+UINT16 WINAPI mmioFlush(HMMIO16 hmmio, UINT16 uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmio(stddeb, "mmioFlush(%04X, %04X)\n", hmmio, uFlags);
@@ -2239,7 +2247,7 @@
 /**************************************************************************
 * 				mmioAdvance    		[MMSYSTEM.1219]
 */
-UINT16 mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags)
+UINT16 WINAPI mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags)
 {
 	int		count = 0;
 	LPMMIOINFO	lpmminfo;
@@ -2263,7 +2271,7 @@
 /**************************************************************************
 * 				mmioStringToFOURCC	[MMSYSTEM.1220]
 */
-FOURCC mmioStringToFOURCC(LPCSTR sz, UINT16 uFlags)
+FOURCC WINAPI mmioStringToFOURCC(LPCSTR sz, UINT16 uFlags)
 {
 	dprintf_mmio(stddeb, "mmioStringToFOURCC // empty stub \n");
 	return 0;
@@ -2272,8 +2280,8 @@
 /**************************************************************************
 * 				mmioInstallIOProc	[MMSYSTEM.1221]
 */
-LPMMIOPROC mmioInstallIOProc(FOURCC fccIOProc, 
-				LPMMIOPROC pIOProc, DWORD dwFlags)
+LPMMIOPROC WINAPI mmioInstallIOProc(FOURCC fccIOProc, 
+                                    LPMMIOPROC pIOProc, DWORD dwFlags)
 {
 	dprintf_mmio(stddeb, "mmioInstallIOProc // empty stub \n");
 	return 0;
@@ -2282,8 +2290,8 @@
 /**************************************************************************
 * 				mmioSendMessage		[MMSYSTEM.1222]
 */
-LRESULT mmioSendMessage(HMMIO16 hmmio, UINT16 uMessage,
-					    LPARAM lParam1, LPARAM lParam2)
+LRESULT WINAPI mmioSendMessage(HMMIO16 hmmio, UINT16 uMessage,
+                               LPARAM lParam1, LPARAM lParam2)
 {
 	dprintf_mmio(stddeb, "mmioSendMessage // empty stub \n");
 	return 0;
@@ -2292,8 +2300,8 @@
 /**************************************************************************
 * 				mmioDescend	       	[MMSYSTEM.1223]
 */
-UINT16 mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
-		    const MMCKINFO * lpckParent, UINT16 uFlags)
+UINT16 WINAPI mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
+                          const MMCKINFO * lpckParent, UINT16 uFlags)
 {
 	DWORD	dwfcc, dwOldPos;
 	LPMMIOINFO	lpmminfo;
@@ -2367,7 +2375,7 @@
 /**************************************************************************
 * 				mmioAscend     		[MMSYSTEM.1224]
 */
-UINT16 mmioAscend(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags)
+UINT16 WINAPI mmioAscend(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags)
 {
 	dprintf_mmio(stddeb, "mmioAscend // empty stub !\n");
 	return 0;
@@ -2376,7 +2384,7 @@
 /**************************************************************************
 * 				mmioCreateChunk		[MMSYSTEM.1225]
 */
-UINT16 mmioCreateChunk(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags)
+UINT16 WINAPI mmioCreateChunk(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags)
 {
 	dprintf_mmio(stddeb, "mmioCreateChunk // empty stub \n");
 	return 0;
@@ -2386,8 +2394,8 @@
 /**************************************************************************
 * 				mmioRename     		[MMSYSTEM.1226]
 */
-UINT16 mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
-     MMIOINFO * lpmmioinfo, DWORD dwRenameFlags)
+UINT16 WINAPI mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
+                         MMIOINFO * lpmmioinfo, DWORD dwRenameFlags)
 {
 	dprintf_mmio(stddeb, "mmioRename('%s', '%s', %p, %08lX); // empty stub \n",
 			szFileName, szNewFileName, lpmmioinfo, dwRenameFlags);
@@ -2397,7 +2405,7 @@
 /**************************************************************************
 * 				DrvOpen	       		[MMSYSTEM.1100]
 */
-HDRVR16 DrvOpen(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
+HDRVR16 WINAPI DrvOpen(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
 {
 	dprintf_mmsys(stddeb, "DrvOpen('%s', '%s', %08lX);\n",
 		lpDriverName, lpSectionName, lParam);
@@ -2408,7 +2416,7 @@
 /**************************************************************************
 * 				DrvClose       		[MMSYSTEM.1101]
 */
-LRESULT DrvClose(HDRVR16 hDrvr, LPARAM lParam1, LPARAM lParam2)
+LRESULT WINAPI DrvClose(HDRVR16 hDrvr, LPARAM lParam1, LPARAM lParam2)
 {
 	dprintf_mmsys(stddeb, "DrvClose(%04X, %08lX, %08lX);\n", hDrvr, lParam1, lParam2);
 	return CloseDriver(hDrvr, lParam1, lParam2);
@@ -2418,7 +2426,8 @@
 /**************************************************************************
 * 				DrvSendMessage		[MMSYSTEM.1102]
 */
-LRESULT DrvSendMessage(HDRVR16 hDriver, WORD msg, LPARAM lParam1, LPARAM lParam2)
+LRESULT WINAPI DrvSendMessage(HDRVR16 hDriver, WORD msg, LPARAM lParam1,
+                              LPARAM lParam2)
 {
 	DWORD 	dwDriverID = 0;
 	dprintf_mmsys(stddeb, "DrvSendMessage(%04X, %04X, %08lX, %08lX);\n",
@@ -2429,7 +2438,7 @@
 /**************************************************************************
 * 				DrvGetModuleHandle	[MMSYSTEM.1103]
 */
-HANDLE16 DrvGetModuleHandle(HDRVR16 hDrvr)
+HANDLE16 WINAPI DrvGetModuleHandle(HDRVR16 hDrvr)
 {
 	dprintf_mmsys(stddeb, "DrvGetModuleHandle(%04X);\n", hDrvr);
         return 0;
@@ -2439,8 +2448,8 @@
 /**************************************************************************
 * 				DrvDefDriverProc	[MMSYSTEM.1104]
 */
-LRESULT DrvDefDriverProc(DWORD dwDriverID, HDRVR16 hDriv, WORD wMsg, 
-						DWORD dwParam1, DWORD dwParam2)
+LRESULT WINAPI DrvDefDriverProc(DWORD dwDriverID, HDRVR16 hDriv, WORD wMsg, 
+                                DWORD dwParam1, DWORD dwParam2)
 {
 	return DefDriverProc(dwDriverID, hDriv, wMsg, dwParam1, dwParam2);
 }
diff --git a/multimedia/time.c b/multimedia/time.c
index d8c5917..6242f85 100644
--- a/multimedia/time.c
+++ b/multimedia/time.c
@@ -114,7 +114,7 @@
 /**************************************************************************
  * 				timeGetSystemTime	[MMSYSTEM.601]
  */
-WORD timeGetSystemTime(LPMMTIME lpTime, WORD wSize)
+WORD WINAPI timeGetSystemTime(LPMMTIME lpTime, WORD wSize)
 {
     dprintf_mmsys(stddeb, "timeGetSystemTime(%p, %u);\n", lpTime, wSize);
     if (!mmTimeStarted)
@@ -127,8 +127,8 @@
 /**************************************************************************
  * 				timeSetEvent		[MMSYSTEM.602]
  */
-WORD timeSetEvent(WORD wDelay, WORD wResol, LPTIMECALLBACK lpFunc,
-		  DWORD dwUser, WORD wFlags)
+WORD WINAPI timeSetEvent(WORD wDelay, WORD wResol, LPTIMECALLBACK lpFunc,
+                         DWORD dwUser, WORD wFlags)
 {
     WORD wNewID = 0;
     LPTIMERENTRY lpNewTimer;
@@ -171,7 +171,7 @@
 /**************************************************************************
  * 				timeKillEvent		[MMSYSTEM.603]
  */
-WORD timeKillEvent(WORD wID)
+WORD WINAPI timeKillEvent(WORD wID)
 {
     LPTIMERENTRY lpTimer = lpTimerList;
     while (lpTimer != NULL) {
@@ -193,7 +193,7 @@
 /**************************************************************************
  * 				timeGetDevCaps		[MMSYSTEM.604]
  */
-WORD timeGetDevCaps(LPTIMECAPS lpCaps, WORD wSize)
+WORD WINAPI timeGetDevCaps(LPTIMECAPS lpCaps, WORD wSize)
 {
     dprintf_mmtime(stddeb, "timeGetDevCaps(%p, %u) !\n", lpCaps, wSize);
     if (!mmTimeStarted)
@@ -206,7 +206,7 @@
 /**************************************************************************
  * 				timeBeginPeriod		[MMSYSTEM.605]
  */
-WORD timeBeginPeriod(WORD wPeriod)
+WORD WINAPI timeBeginPeriod(WORD wPeriod)
 {
     dprintf_mmtime(stddeb, "timeBeginPeriod(%u) !\n", wPeriod);
     if (!mmTimeStarted)
@@ -219,7 +219,7 @@
 /**************************************************************************
  * 				timeEndPeriod		[MMSYSTEM.606]
  */
-WORD timeEndPeriod(WORD wPeriod)
+WORD WINAPI timeEndPeriod(WORD wPeriod)
 {
     dprintf_mmtime(stddeb, "timeEndPeriod(%u) !\n", wPeriod);
     if (wPeriod < MMSYSTIME_MININTERVAL || wPeriod > MMSYSTIME_MAXINTERVAL) 
@@ -230,7 +230,7 @@
 /**************************************************************************
  * 				timeGetTime    		[MMSYSTEM.607]
  */
-DWORD timeGetTime()
+DWORD WINAPI timeGetTime()
 {
     dprintf_mmtime(stddeb, "timeGetTime(); !\n");
     if (!mmTimeStarted)
diff --git a/objects/bitmap.c b/objects/bitmap.c
index fdb59d2..6fe7a98 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -30,10 +30,31 @@
 
 
 /***********************************************************************
+ *           XPutImage_wrapper
+ *
+ * Wrapper to call XPutImage with CALL_LARGE_STACK.
+ */
+
+struct XPutImage_descr
+{
+    BITMAPOBJ *bmp;
+    XImage    *image;
+    INT32      width;
+    INT32      height;
+};
+
+static int XPutImage_wrapper( const struct XPutImage_descr *descr )
+{
+    return XPutImage( display, descr->bmp->pixmap, BITMAP_GC(descr->bmp),
+                      descr->image, 0, 0, 0, 0, descr->width, descr->height );
+}
+
+
+/***********************************************************************
  *           CreateBitmap16    (GDI.48)
  */
-HBITMAP16 CreateBitmap16( INT16 width, INT16 height, UINT16 planes,
-                          UINT16 bpp, LPCVOID bits )
+HBITMAP16 WINAPI CreateBitmap16( INT16 width, INT16 height, UINT16 planes,
+                                 UINT16 bpp, LPCVOID bits )
 {
     return CreateBitmap32( width, height, planes, bpp, bits );
 }
@@ -42,8 +63,8 @@
 /***********************************************************************
  *           CreateBitmap32    (GDI32.25)
  */
-HBITMAP32 CreateBitmap32( INT32 width, INT32 height, UINT32 planes,
-                          UINT32 bpp, LPCVOID bits )
+HBITMAP32 WINAPI CreateBitmap32( INT32 width, INT32 height, UINT32 planes,
+                                 UINT32 bpp, LPCVOID bits )
 {
     BITMAPOBJ * bmpObjPtr;
     HBITMAP32 hbitmap;
@@ -63,7 +84,7 @@
       /* Create the BITMAPOBJ */
     hbitmap = GDI_AllocObject( sizeof(BITMAPOBJ), BITMAP_MAGIC );
     if (!hbitmap) return 0;
-    bmpObjPtr = (BITMAPOBJ *) GDI_HEAP_LIN_ADDR( hbitmap );
+    bmpObjPtr = (BITMAPOBJ *) GDI_HEAP_LOCK( hbitmap );
 
     bmpObjPtr->size.cx = 0;
     bmpObjPtr->size.cy = 0;
@@ -85,6 +106,7 @@
     else if (bits)  /* Set bitmap bits */
 	SetBitmapBits32( hbitmap, height * bmpObjPtr->bitmap.bmWidthBytes,
                          bits );
+    GDI_HEAP_UNLOCK( hbitmap );
     return hbitmap;
 }
 
@@ -92,7 +114,7 @@
 /***********************************************************************
  *           CreateCompatibleBitmap16    (GDI.51)
  */
-HBITMAP16 CreateCompatibleBitmap16( HDC16 hdc, INT16 width, INT16 height )
+HBITMAP16 WINAPI CreateCompatibleBitmap16(HDC16 hdc, INT16 width, INT16 height)
 {
     return CreateCompatibleBitmap32( hdc, width, height );
 }
@@ -101,7 +123,7 @@
 /***********************************************************************
  *           CreateCompatibleBitmap32    (GDI32.30)
  */
-HBITMAP32 CreateCompatibleBitmap32( HDC32 hdc, INT32 width, INT32 height )
+HBITMAP32 WINAPI CreateCompatibleBitmap32(HDC32 hdc, INT32 width, INT32 height)
 {
     HBITMAP32 hbmpRet = 0;
     DC *dc;
@@ -118,7 +140,7 @@
 /***********************************************************************
  *           CreateBitmapIndirect16    (GDI.49)
  */
-HBITMAP16 CreateBitmapIndirect16( const BITMAP16 * bmp )
+HBITMAP16 WINAPI CreateBitmapIndirect16( const BITMAP16 * bmp )
 {
     return CreateBitmap16( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
                            bmp->bmBitsPixel, PTR_SEG_TO_LIN( bmp->bmBits ) );
@@ -128,7 +150,7 @@
 /***********************************************************************
  *           CreateBitmapIndirect32    (GDI32.26)
  */
-HBITMAP32 CreateBitmapIndirect32( const BITMAP32 * bmp )
+HBITMAP32 WINAPI CreateBitmapIndirect32( const BITMAP32 * bmp )
 {
     return CreateBitmap32( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
                            bmp->bmBitsPixel, bmp->bmBits );
@@ -136,9 +158,21 @@
 
 
 /***********************************************************************
+ *           BITMAP_GetXImage
+ *
+ * Get an X image for a bitmap. For use with CALL_LARGE_STACK.
+ */
+XImage *BITMAP_GetXImage( const BITMAPOBJ *bmp )
+{
+    return XGetImage( display, bmp->pixmap, 0, 0, bmp->bitmap.bmWidth,
+                      bmp->bitmap.bmHeight, AllPlanes, ZPixmap );
+}
+
+
+/***********************************************************************
  *           GetBitmapBits16    (GDI.74)
  */
-LONG GetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPVOID buffer )
+LONG WINAPI GetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPVOID buffer )
 {
     return GetBitmapBits32( hbitmap, count, buffer );
 }
@@ -147,12 +181,12 @@
 /***********************************************************************
  *           GetBitmapBits32    (GDI32.143)
  */
-LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
+LONG WINAPI GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
 {
     BITMAPOBJ * bmp;
-    LONG height,widthbytes;
+    LONG height, old_height;
     XImage * image;
-    LPBYTE tmpbuffer,tbuf;
+    LPBYTE tbuf;
     int	h,w,pad;
     
     /* KLUDGE! */
@@ -169,7 +203,11 @@
     dprintf_bitmap(stddeb, "GetBitmapBits: %dx%d %d colors %p fetched height: %ld\n",
 	    bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
 	    1 << bmp->bitmap.bmBitsPixel, buffer, height );
-    if (!height) return 0;
+    if (!height) 
+    {
+      GDI_HEAP_UNLOCK( hbitmap );
+      return 0;
+    }
 
     switch (bmp->bitmap.bmBitsPixel) {
     case 1:
@@ -198,19 +236,16 @@
 	fprintf(stderr,"GetBitMapBits32: unknown depth %d, please report.\n",
 		bmp->bitmap.bmBitsPixel
 	);
+	GDI_HEAP_UNLOCK( hbitmap );
 	return 0;
     }
 
-    widthbytes	= DIB_GetXImageWidthBytes(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
-    tmpbuffer	= (LPBYTE)xmalloc(widthbytes*height);
-    image = XCreateImage( display, DefaultVisualOfScreen(screen),
-		  bmp->bitmap.bmBitsPixel, ZPixmap, 0, tmpbuffer,
-		  bmp->bitmap.bmWidth,height,32,widthbytes
-    );
-    
-    CallTo32_LargeStack( (int(*)())XGetSubImage, 11,
-                         display, bmp->pixmap, 0, 0, bmp->bitmap.bmWidth,
-                         height, AllPlanes, ZPixmap, image, 0, 0 );
+    /* Hack: change the bitmap height temporarily to avoid */
+    /*       getting unnecessary bitmap rows. */
+    old_height = bmp->bitmap.bmHeight;
+    bmp->bitmap.bmHeight = height;
+    image = (XImage *)CALL_LARGE_STACK( BITMAP_GetXImage, bmp );
+    bmp->bitmap.bmHeight = old_height;
 
     /* copy XImage to 16 bit padded image buffer with real bitsperpixel */
 
@@ -277,7 +312,8 @@
             tbuf += pad;
 	}
     }
-    XDestroyImage( image ); /* frees tbuffer too */
+    XDestroyImage( image );
+    GDI_HEAP_UNLOCK( hbitmap );
     return height * bmp->bitmap.bmWidthBytes;
 }
 
@@ -285,7 +321,7 @@
 /***********************************************************************
  *           SetBitmapBits16    (GDI.106)
  */
-LONG SetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPCVOID buffer )
+LONG WINAPI SetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPCVOID buffer )
 {
     return SetBitmapBits32( hbitmap, count, buffer );
 }
@@ -294,8 +330,9 @@
 /***********************************************************************
  *           SetBitmapBits32    (GDI32.303)
  */
-LONG SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
+LONG WINAPI SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
 {
+    struct XPutImage_descr descr;
     BITMAPOBJ * bmp;
     LONG height;
     XImage * image;
@@ -317,8 +354,12 @@
       /* Only set entire lines */
     height = count / bmp->bitmap.bmWidthBytes;
     if (height > bmp->bitmap.bmHeight) height = bmp->bitmap.bmHeight;
-    if (!height) return 0;
-    	
+    if (!height) 
+    {
+      GDI_HEAP_UNLOCK( hbitmap );
+      return 0;
+    }
+	
     switch (bmp->bitmap.bmBitsPixel) {
     case 1:
 	if (!(bmp->bitmap.bmWidth & 15))
@@ -416,10 +457,14 @@
         break;
     }
 
-    CallTo32_LargeStack( XPutImage, 10,
-                         display, bmp->pixmap, BITMAP_GC(bmp), image, 0, 0,
-                         0, 0, bmp->bitmap.bmWidth, height );
+    descr.bmp    = bmp;
+    descr.image  = image;
+    descr.width  = bmp->bitmap.bmWidth;
+    descr.height = height;
+    CALL_LARGE_STACK( XPutImage_wrapper, &descr );
+
     XDestroyImage( image ); /* frees tmpbuffer too */
+    GDI_HEAP_UNLOCK( hbitmap );
     return height * bmp->bitmap.bmWidthBytes;
 }
 
@@ -429,10 +474,9 @@
  * defines in windows.h
  */
 
-HANDLE32 LoadImage32A(
-	HINSTANCE32 hinst,LPCSTR name,UINT32 type,INT32 desiredx,
-	INT32 desiredy,UINT32 loadflags
-) {
+HANDLE32 WINAPI LoadImage32A( HINSTANCE32 hinst, LPCSTR name, UINT32 type,
+                              INT32 desiredx, INT32 desiredy, UINT32 loadflags)
+{
 	if (HIWORD(name)) {
 		dprintf_resource(stddeb,"LoadImage32A(0x%04x,%s,%d,%d,%d,0x%08x)\n",
 			hinst,name,type,desiredx,desiredy,loadflags
@@ -459,8 +503,8 @@
  * FIXME: implementation still lacks nearly all features, see LR_*
  * defines in windows.h
  */
-HANDLE32 CopyImage32( HANDLE32 hnd, UINT32 type, INT32 desiredx,
-                      INT32 desiredy, UINT32 flags )
+HANDLE32 WINAPI CopyImage32( HANDLE32 hnd, UINT32 type, INT32 desiredx,
+                             INT32 desiredy, UINT32 flags )
 {
     switch (type)
     {
@@ -478,7 +522,7 @@
 /**********************************************************************
  *	    LoadBitmap16    (USER.175)
  */
-HBITMAP16 LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
+HBITMAP16 WINAPI LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
 {
     HBITMAP32 hbitmap = 0;
     HDC32 hdc;
@@ -520,7 +564,7 @@
 /**********************************************************************
  *	    LoadBitmap32W   (USER32.357)
  */
-HBITMAP32 LoadBitmap32W( HINSTANCE32 instance, LPCWSTR name )
+HBITMAP32 WINAPI LoadBitmap32W( HINSTANCE32 instance, LPCWSTR name )
 {
     HBITMAP32 hbitmap = 0;
     HDC32 hdc;
@@ -553,7 +597,7 @@
 /**********************************************************************
  *	    LoadBitmap32A   (USER32.356)
  */
-HBITMAP32 LoadBitmap32A( HINSTANCE32 instance, LPCSTR name )
+HBITMAP32 WINAPI LoadBitmap32A( HINSTANCE32 instance, LPCSTR name )
 {
     HBITMAP32 res;
     if (!HIWORD(name)) res = LoadBitmap32W( instance, (LPWSTR)name );
@@ -629,7 +673,8 @@
 /***********************************************************************
  *           CreateDiscardableBitmap16    (GDI.156)
  */
-HBITMAP16 CreateDiscardableBitmap16( HDC16 hdc, INT16 width, INT16 height )
+HBITMAP16 WINAPI CreateDiscardableBitmap16( HDC16 hdc, INT16 width,
+                                            INT16 height )
 {
     return CreateCompatibleBitmap16( hdc, width, height );
 }
@@ -638,7 +683,8 @@
 /***********************************************************************
  *           CreateDiscardableBitmap32    (GDI32.38)
  */
-HBITMAP32 CreateDiscardableBitmap32( HDC32 hdc, INT32 width, INT32 height )
+HBITMAP32 WINAPI CreateDiscardableBitmap32( HDC32 hdc, INT32 width,
+                                            INT32 height )
 {
     return CreateCompatibleBitmap32( hdc, width, height );
 }
@@ -647,11 +693,12 @@
 /***********************************************************************
  *           GetBitmapDimensionEx16    (GDI.468)
  */
-BOOL16 GetBitmapDimensionEx16( HBITMAP16 hbitmap, LPSIZE16 size )
+BOOL16 WINAPI GetBitmapDimensionEx16( HBITMAP16 hbitmap, LPSIZE16 size )
 {
     BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     if (!bmp) return FALSE;
     *size = bmp->size;
+    GDI_HEAP_UNLOCK( hbitmap );
     return TRUE;
 }
 
@@ -659,12 +706,13 @@
 /***********************************************************************
  *           GetBitmapDimensionEx32    (GDI32.144)
  */
-BOOL32 GetBitmapDimensionEx32( HBITMAP32 hbitmap, LPSIZE32 size )
+BOOL32 WINAPI GetBitmapDimensionEx32( HBITMAP32 hbitmap, LPSIZE32 size )
 {
     BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     if (!bmp) return FALSE;
     size->cx = (INT32)bmp->size.cx;
     size->cy = (INT32)bmp->size.cy;
+    GDI_HEAP_UNLOCK( hbitmap );
     return TRUE;
 }
 
@@ -672,7 +720,7 @@
 /***********************************************************************
  *           GetBitmapDimension    (GDI.162)
  */
-DWORD GetBitmapDimension( HBITMAP16 hbitmap )
+DWORD WINAPI GetBitmapDimension( HBITMAP16 hbitmap )
 {
     SIZE16 size;
     if (!GetBitmapDimensionEx16( hbitmap, &size )) return 0;
@@ -683,14 +731,15 @@
 /***********************************************************************
  *           SetBitmapDimensionEx16    (GDI.478)
  */
-BOOL16 SetBitmapDimensionEx16( HBITMAP16 hbitmap, INT16 x, INT16 y,
-                               LPSIZE16 prevSize )
+BOOL16 WINAPI SetBitmapDimensionEx16( HBITMAP16 hbitmap, INT16 x, INT16 y,
+                                      LPSIZE16 prevSize )
 {
     BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     if (!bmp) return FALSE;
     if (prevSize) *prevSize = bmp->size;
     bmp->size.cx = x;
     bmp->size.cy = y;
+    GDI_HEAP_UNLOCK( hbitmap );
     return TRUE;
 }
 
@@ -698,14 +747,15 @@
 /***********************************************************************
  *           SetBitmapDimensionEx32    (GDI32.304)
  */
-BOOL32 SetBitmapDimensionEx32( HBITMAP32 hbitmap, INT32 x, INT32 y,
-                               LPSIZE32 prevSize )
+BOOL32 WINAPI SetBitmapDimensionEx32( HBITMAP32 hbitmap, INT32 x, INT32 y,
+                                      LPSIZE32 prevSize )
 {
     BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     if (!bmp) return FALSE;
     if (prevSize) CONV_SIZE16TO32( &bmp->size, prevSize );
     bmp->size.cx = (INT16)x;
     bmp->size.cy = (INT16)y;
+    GDI_HEAP_UNLOCK( hbitmap );
     return TRUE;
 }
 
@@ -713,9 +763,10 @@
 /***********************************************************************
  *           SetBitmapDimension    (GDI.163)
  */
-DWORD SetBitmapDimension( HBITMAP16 hbitmap, INT16 x, INT16 y )
+DWORD WINAPI SetBitmapDimension( HBITMAP16 hbitmap, INT16 x, INT16 y )
 {
     SIZE16 size;
     if (!SetBitmapDimensionEx16( hbitmap, x, y, &size )) return 0;
     return MAKELONG( size.cx, size.cy );
 }
+
diff --git a/objects/brush.c b/objects/brush.c
index 4a06005..5f216f2 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -16,15 +16,16 @@
 /***********************************************************************
  *           CreateBrushIndirect16    (GDI.50)
  */
-HBRUSH16 CreateBrushIndirect16( const LOGBRUSH16 * brush )
+HBRUSH16 WINAPI CreateBrushIndirect16( const LOGBRUSH16 * brush )
 {
     BRUSHOBJ * brushPtr;
     HBRUSH16 hbrush = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC );
     if (!hbrush) return 0;
-    brushPtr = (BRUSHOBJ *) GDI_HEAP_LIN_ADDR( hbrush );
+    brushPtr = (BRUSHOBJ *) GDI_HEAP_LOCK( hbrush );
     brushPtr->logbrush.lbStyle = brush->lbStyle;
     brushPtr->logbrush.lbColor = brush->lbColor;
     brushPtr->logbrush.lbHatch = brush->lbHatch;
+    GDI_HEAP_UNLOCK( hbrush );
     return hbrush;
 }
 
@@ -32,15 +33,16 @@
 /***********************************************************************
  *           CreateBrushIndirect32    (GDI32.27)
  */
-HBRUSH32 CreateBrushIndirect32( const LOGBRUSH32 * brush )
+HBRUSH32 WINAPI CreateBrushIndirect32( const LOGBRUSH32 * brush )
 {
     BRUSHOBJ * brushPtr;
     HBRUSH32 hbrush = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC );
     if (!hbrush) return 0;
-    brushPtr = (BRUSHOBJ *) GDI_HEAP_LIN_ADDR( hbrush );
+    brushPtr = (BRUSHOBJ *) GDI_HEAP_LOCK( hbrush );
     brushPtr->logbrush.lbStyle = brush->lbStyle;
     brushPtr->logbrush.lbColor = brush->lbColor;
     brushPtr->logbrush.lbHatch = brush->lbHatch;
+    GDI_HEAP_UNLOCK( hbrush );
     return hbrush;
 }
 
@@ -48,7 +50,7 @@
 /***********************************************************************
  *           CreateHatchBrush16    (GDI.58)
  */
-HBRUSH16 CreateHatchBrush16( INT16 style, COLORREF color )
+HBRUSH16 WINAPI CreateHatchBrush16( INT16 style, COLORREF color )
 {
     LOGBRUSH32 logbrush = { BS_HATCHED, color, style };
     dprintf_gdi(stddeb, "CreateHatchBrush16: %d %06lx\n", style, color );
@@ -60,7 +62,7 @@
 /***********************************************************************
  *           CreateHatchBrush32    (GDI32.48)
  */
-HBRUSH32 CreateHatchBrush32( INT32 style, COLORREF color )
+HBRUSH32 WINAPI CreateHatchBrush32( INT32 style, COLORREF color )
 {
     LOGBRUSH32 logbrush = { BS_HATCHED, color, style };
     dprintf_gdi(stddeb, "CreateHatchBrush32: %d %06lx\n", style, color );
@@ -72,7 +74,7 @@
 /***********************************************************************
  *           CreatePatternBrush16    (GDI.60)
  */
-HBRUSH16 CreatePatternBrush16( HBITMAP16 hbitmap )
+HBRUSH16 WINAPI CreatePatternBrush16( HBITMAP16 hbitmap )
 {
     return (HBRUSH16)CreatePatternBrush32( hbitmap );
 }
@@ -81,7 +83,7 @@
 /***********************************************************************
  *           CreatePatternBrush32    (GDI32.54)
  */
-HBRUSH32 CreatePatternBrush32( HBITMAP32 hbitmap )
+HBRUSH32 WINAPI CreatePatternBrush32( HBITMAP32 hbitmap )
 {
     LOGBRUSH32 logbrush = { BS_PATTERN, 0, 0 };
     BITMAPOBJ *bmp, *newbmp;
@@ -95,9 +97,15 @@
     logbrush.lbHatch = (INT32)CreateBitmapIndirect16( &bmp->bitmap );
     newbmp = (BITMAPOBJ *) GDI_GetObjPtr( (HGDIOBJ32)logbrush.lbHatch,
                                           BITMAP_MAGIC );
-    if (!newbmp) return 0;
+    if (!newbmp) 
+    {
+      GDI_HEAP_UNLOCK( hbitmap );
+      return 0;
+    }
     XCopyArea( display, bmp->pixmap, newbmp->pixmap, BITMAP_GC(bmp),
 	       0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight, 0, 0 );
+    GDI_HEAP_UNLOCK( hbitmap );
+    GDI_HEAP_UNLOCK( logbrush.lbHatch );
     return CreateBrushIndirect32( &logbrush );
 }
 
@@ -105,7 +113,7 @@
 /***********************************************************************
  *           CreateDIBPatternBrush16    (GDI.445)
  */
-HBRUSH16 CreateDIBPatternBrush16( HGLOBAL16 hbitmap, UINT16 coloruse )
+HBRUSH16 WINAPI CreateDIBPatternBrush16( HGLOBAL16 hbitmap, UINT16 coloruse )
 {
     LOGBRUSH32 logbrush = { BS_DIBPATTERN, coloruse, 0 };
     BITMAPINFO *info, *newInfo;
@@ -140,7 +148,7 @@
 /***********************************************************************
  *           CreateDIBPatternBrush32    (GDI32.34)
  */
-HBRUSH32 CreateDIBPatternBrush32( HGLOBAL32 hbitmap, UINT32 coloruse )
+HBRUSH32 WINAPI CreateDIBPatternBrush32( HGLOBAL32 hbitmap, UINT32 coloruse )
 {
     LOGBRUSH32 logbrush = { BS_DIBPATTERN, coloruse, 0 };
     BITMAPINFO *info, *newInfo;
@@ -175,7 +183,7 @@
 /***********************************************************************
  *           CreateSolidBrush    (GDI.66)
  */
-HBRUSH16 CreateSolidBrush16( COLORREF color )
+HBRUSH16 WINAPI CreateSolidBrush16( COLORREF color )
 {
     LOGBRUSH32 logbrush = { BS_SOLID, color, 0 };
     dprintf_gdi(stddeb, "CreateSolidBrush16: %06lx\n", color );
@@ -186,7 +194,7 @@
 /***********************************************************************
  *           CreateSolidBrush32    (GDI32.64)
  */
-HBRUSH32 CreateSolidBrush32( COLORREF color )
+HBRUSH32 WINAPI CreateSolidBrush32( COLORREF color )
 {
     LOGBRUSH32 logbrush = { BS_SOLID, color, 0 };
     dprintf_gdi(stddeb, "CreateSolidBrush32: %06lx\n", color );
@@ -197,7 +205,7 @@
 /***********************************************************************
  *           SetBrushOrg    (GDI.148)
  */
-DWORD SetBrushOrg( HDC16 hdc, INT16 x, INT16 y )
+DWORD WINAPI SetBrushOrg( HDC16 hdc, INT16 x, INT16 y )
 {
     DWORD retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -212,7 +220,7 @@
 /***********************************************************************
  *           SetBrushOrgEx    (GDI32.308)
  */
-BOOL32 SetBrushOrgEx( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 oldorg )
+BOOL32 WINAPI SetBrushOrgEx( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 oldorg )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
 
@@ -231,7 +239,7 @@
 /***********************************************************************
  *           GetSysColorBrush16    (USER.281)
  */
-HBRUSH16 GetSysColorBrush16( INT16 index )
+HBRUSH16 WINAPI GetSysColorBrush16( INT16 index )
 {
     fprintf( stderr, "Unimplemented stub: GetSysColorBrush16(%d)\n", index );
     return GetStockObject32(LTGRAY_BRUSH);
@@ -241,7 +249,7 @@
 /***********************************************************************
  *           GetSysColorBrush32    (USER32.289)
  */
-HBRUSH32 GetSysColorBrush32( INT32 index)
+HBRUSH32 WINAPI GetSysColorBrush32( INT32 index)
 {
     fprintf( stderr, "Unimplemented stub: GetSysColorBrush32(%d)\n", index );
     return GetStockObject32(LTGRAY_BRUSH);
diff --git a/objects/clipping.c b/objects/clipping.c
index e801cb0..d417c71 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -51,7 +51,7 @@
 /***********************************************************************
  *           SelectClipRgn16    (GDI.44)
  */
-INT16 SelectClipRgn16( HDC16 hdc, HRGN16 hrgn )
+INT16 WINAPI SelectClipRgn16( HDC16 hdc, HRGN16 hrgn )
 {
     return (INT16)SelectClipRgn32( hdc, hrgn );
 }
@@ -60,7 +60,7 @@
 /***********************************************************************
  *           SelectClipRgn32    (GDI32.297)
  */
-INT32 SelectClipRgn32( HDC32 hdc, HRGN32 hrgn )
+INT32 WINAPI SelectClipRgn32( HDC32 hdc, HRGN32 hrgn )
 {
     INT32 retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -81,6 +81,7 @@
     }
 
     CLIPPING_UpdateGCRegion( dc );
+    GDI_HEAP_UNLOCK( hdc );
     return retval;
 }
 
@@ -88,7 +89,7 @@
 /***********************************************************************
  *           SelectVisRgn    (GDI.105)
  */
-INT16 SelectVisRgn( HDC16 hdc, HRGN16 hrgn )
+INT16 WINAPI SelectVisRgn( HDC16 hdc, HRGN16 hrgn )
 {
     int retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -100,6 +101,7 @@
 
     retval = CombineRgn16( dc->w.hVisRgn, hrgn, 0, RGN_COPY );
     CLIPPING_UpdateGCRegion( dc );
+    GDI_HEAP_UNLOCK( hdc );
     return retval;
 }
 
@@ -107,7 +109,7 @@
 /***********************************************************************
  *           OffsetClipRgn16    (GDI.32)
  */
-INT16 OffsetClipRgn16( HDC16 hdc, INT16 x, INT16 y )
+INT16 WINAPI OffsetClipRgn16( HDC16 hdc, INT16 x, INT16 y )
 {
     return (INT16)OffsetClipRgn32( hdc, x, y );
 }
@@ -116,7 +118,7 @@
 /***********************************************************************
  *           OffsetClipRgn32    (GDI32.255)
  */
-INT32 OffsetClipRgn32( HDC32 hdc, INT32 x, INT32 y )
+INT32 WINAPI OffsetClipRgn32( HDC32 hdc, INT32 x, INT32 y )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
@@ -124,6 +126,7 @@
 	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
 	if (!dc) return ERROR;
 	MF_MetaParam2(dc, META_OFFSETCLIPRGN, x, y);
+	GDI_HEAP_UNLOCK( hdc );
 	return NULLREGION;   /* ?? */
     }
 
@@ -133,16 +136,18 @@
     {
 	INT32 ret = OffsetRgn32( dc->w.hClipRgn, XLPTODP(dc,x), YLPTODP(dc,y));
 	CLIPPING_UpdateGCRegion( dc );
+	GDI_HEAP_UNLOCK( hdc );
 	return ret;
     }
-    else return SIMPLEREGION; /* Clip region == client area */
+    GDI_HEAP_UNLOCK( hdc );
+    return SIMPLEREGION; /* Clip region == client area */
 }
 
 
 /***********************************************************************
  *           OffsetVisRgn    (GDI.102)
  */
-INT16 OffsetVisRgn( HDC16 hdc, INT16 x, INT16 y )
+INT16 WINAPI OffsetVisRgn( HDC16 hdc, INT16 x, INT16 y )
 {
     INT16 retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -150,6 +155,7 @@
     dprintf_clipping(stddeb, "OffsetVisRgn: %04x %d,%d\n", hdc, x, y );
     retval = OffsetRgn32( dc->w.hVisRgn, x, y );
     CLIPPING_UpdateGCRegion( dc );
+    GDI_HEAP_UNLOCK( hdc );
     return retval;
 }
 
@@ -194,8 +200,8 @@
 /***********************************************************************
  *           ExcludeClipRect16    (GDI.21)
  */
-INT16 ExcludeClipRect16( HDC16 hdc, INT16 left, INT16 top,
-                         INT16 right, INT16 bottom )
+INT16 WINAPI ExcludeClipRect16( HDC16 hdc, INT16 left, INT16 top,
+                                INT16 right, INT16 bottom )
 {
     return (INT16)ExcludeClipRect32( hdc, left, top, right, bottom );
 }
@@ -204,15 +210,17 @@
 /***********************************************************************
  *           ExcludeClipRect32    (GDI32.92)
  */
-INT32 ExcludeClipRect32( HDC32 hdc, INT32 left, INT32 top,
-                         INT32 right, INT32 bottom )
+INT32 WINAPI ExcludeClipRect32( HDC32 hdc, INT32 left, INT32 top,
+                                INT32 right, INT32 bottom )
 {
+    INT32 ret;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
     {
 	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
 	if (!dc) return ERROR;
 	MF_MetaParam4(dc, META_EXCLUDECLIPRECT, left, top, right, bottom);
+	GDI_HEAP_UNLOCK( hdc );
 	return NULLREGION;   /* ?? */
     }
 
@@ -223,15 +231,17 @@
 
     dprintf_clipping(stddeb, "ExcludeClipRect: %04x %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
-    return CLIPPING_IntersectClipRect( dc, left, top, right, bottom, CLIP_EXCLUDE );
+    ret = CLIPPING_IntersectClipRect( dc, left, top, right, bottom, CLIP_EXCLUDE );
+    GDI_HEAP_UNLOCK( hdc );
+    return ret;
 }
 
 
 /***********************************************************************
  *           IntersectClipRect16    (GDI.22)
  */
-INT16 IntersectClipRect16( HDC16 hdc, INT16 left, INT16 top,
-                           INT16 right, INT16 bottom )
+INT16 WINAPI IntersectClipRect16( HDC16 hdc, INT16 left, INT16 top,
+                                  INT16 right, INT16 bottom )
 {
     return (INT16)IntersectClipRect32( hdc, left, top, right, bottom );
 }
@@ -240,15 +250,17 @@
 /***********************************************************************
  *           IntersectClipRect32    (GDI32.245)
  */
-INT32 IntersectClipRect32( HDC32 hdc, INT32 left, INT32 top,
-                           INT32 right, INT32 bottom )
+INT32 WINAPI IntersectClipRect32( HDC32 hdc, INT32 left, INT32 top,
+                                  INT32 right, INT32 bottom )
 {
+    INT32 ret;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
     {
 	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
 	if (!dc) return ERROR;
 	MF_MetaParam4(dc, META_INTERSECTCLIPRECT, left, top, right, bottom);
+	GDI_HEAP_UNLOCK( hdc );
 	return NULLREGION;   /* ?? */
     }
 
@@ -259,7 +271,9 @@
 
     dprintf_clipping(stddeb, "IntersectClipRect: %04x %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
-    return CLIPPING_IntersectClipRect( dc, left, top, right, bottom, CLIP_INTERSECT );
+    ret = CLIPPING_IntersectClipRect( dc, left, top, right, bottom, CLIP_INTERSECT );
+    GDI_HEAP_UNLOCK( hdc );
+    return ret;
 }
 
 
@@ -298,6 +312,7 @@
         DeleteObject32( dc->w.hVisRgn );
         dc->w.hVisRgn = newRgn;    
         CLIPPING_UpdateGCRegion( dc );
+	GDI_HEAP_UNLOCK( newRgn );
     }
     else DeleteObject32( newRgn );
     return ret;
@@ -307,8 +322,8 @@
 /***********************************************************************
  *           ExcludeVisRect    (GDI.73)
  */
-INT16 ExcludeVisRect( HDC16 hdc, INT16 left, INT16 top,
-                      INT16 right, INT16 bottom )
+INT16 WINAPI ExcludeVisRect( HDC16 hdc, INT16 left, INT16 top,
+                             INT16 right, INT16 bottom )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
@@ -322,8 +337,8 @@
 /***********************************************************************
  *           IntersectVisRect    (GDI.98)
  */
-INT16 IntersectVisRect( HDC16 hdc, INT16 left, INT16 top,
-                        INT16 right, INT16 bottom )
+INT16 WINAPI IntersectVisRect( HDC16 hdc, INT16 left, INT16 top,
+                               INT16 right, INT16 bottom )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
@@ -337,7 +352,7 @@
 /***********************************************************************
  *           PtVisible16    (GDI.103)
  */
-BOOL16 PtVisible16( HDC16 hdc, INT16 x, INT16 y )
+BOOL16 WINAPI PtVisible16( HDC16 hdc, INT16 x, INT16 y )
 {
     return PtVisible32( hdc, x, y );
 }
@@ -346,7 +361,7 @@
 /***********************************************************************
  *           PtVisible32    (GDI32.279)
  */
-BOOL32 PtVisible32( HDC32 hdc, INT32 x, INT32 y )
+BOOL32 WINAPI PtVisible32( HDC32 hdc, INT32 x, INT32 y )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
@@ -364,7 +379,7 @@
 /***********************************************************************
  *           RectVisible16    (GDI.104)
  */
-BOOL16 RectVisible16( HDC16 hdc, LPRECT16 rect )
+BOOL16 WINAPI RectVisible16( HDC16 hdc, LPRECT16 rect )
 {
     RECT16 tmpRect;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -382,7 +397,7 @@
 /***********************************************************************
  *           RectVisible32    (GDI32.282)
  */
-BOOL32 RectVisible32( HDC32 hdc, LPRECT32 rect )
+BOOL32 WINAPI RectVisible32( HDC32 hdc, LPRECT32 rect )
 {
     RECT16 rect16;
     CONV_RECT32TO16( rect, &rect16 );
@@ -393,7 +408,7 @@
 /***********************************************************************
  *           GetClipBox16    (GDI.77)
  */
-INT16 GetClipBox16( HDC16 hdc, LPRECT16 rect )
+INT16 WINAPI GetClipBox16( HDC16 hdc, LPRECT16 rect )
 {
     int ret;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -407,7 +422,7 @@
 /***********************************************************************
  *           GetClipBox32    (GDI32.162)
  */
-INT32 GetClipBox32( HDC32 hdc, LPRECT32 rect )
+INT32 WINAPI GetClipBox32( HDC32 hdc, LPRECT32 rect )
 {
     INT32 ret;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -421,7 +436,7 @@
 /***********************************************************************
  *           GetClipRgn32  (GDI32.163)
  */
-INT32 GetClipRgn32( HDC32 hdc, HRGN32 hRgn )
+INT32 WINAPI GetClipRgn32( HDC32 hdc, HRGN32 hRgn )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if( dc && hRgn )
@@ -440,7 +455,7 @@
 /***********************************************************************
  *           SaveVisRgn    (GDI.129)
  */
-HRGN16 SaveVisRgn( HDC16 hdc )
+HRGN16 WINAPI SaveVisRgn( HDC16 hdc )
 {
     HRGN32 copy;
     RGNOBJ *obj, *copyObj;
@@ -456,13 +471,28 @@
     dc->w.flags &= ~DC_DIRTY;
 
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
+    {
+        GDI_HEAP_UNLOCK( hdc );
 	return 0;
-    if (!(copy = CreateRectRgn32( 0, 0, 0, 0 ))) return 0;
+    }
+    if (!(copy = CreateRectRgn32( 0, 0, 0, 0 )))
+    {
+        GDI_HEAP_UNLOCK( dc->w.hVisRgn );
+        GDI_HEAP_UNLOCK( hdc );
+        return 0;
+    }  
     CombineRgn32( copy, dc->w.hVisRgn, 0, RGN_COPY );
     if (!(copyObj = (RGNOBJ *) GDI_GetObjPtr( copy, REGION_MAGIC )))
+    {
+        GDI_HEAP_UNLOCK( dc->w.hVisRgn );
+        GDI_HEAP_UNLOCK( hdc );
 	return 0;
+    }
     copyObj->header.hNext = obj->header.hNext;
     obj->header.hNext = copy;
+    GDI_HEAP_UNLOCK( dc->w.hVisRgn );
+    GDI_HEAP_UNLOCK( hdc );
+    GDI_HEAP_UNLOCK( copy );
     return copy;
 }
 
@@ -470,20 +500,39 @@
 /***********************************************************************
  *           RestoreVisRgn    (GDI.130)
  */
-INT16 RestoreVisRgn( HDC16 hdc )
+INT16 WINAPI RestoreVisRgn( HDC16 hdc )
 {
     HRGN32 saved;
     RGNOBJ *obj, *savedObj;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc || !dc->w.hVisRgn) return ERROR;    
+    if (!dc) return ERROR;    
+    if (!dc->w.hVisRgn)
+    {
+        GDI_HEAP_UNLOCK( hdc );
+        return ERROR;    
+    }
     dprintf_clipping(stddeb, "RestoreVisRgn: %04x\n", hdc );
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
+    {
+        GDI_HEAP_UNLOCK( hdc );
 	return ERROR;
-    if (!(saved = obj->header.hNext)) return ERROR;
+    }
+    if (!(saved = obj->header.hNext)) 
+    {
+        GDI_HEAP_UNLOCK( dc->w.hVisRgn );
+        GDI_HEAP_UNLOCK( hdc );
+        return ERROR;
+    }
     if (!(savedObj = (RGNOBJ *) GDI_GetObjPtr( saved, REGION_MAGIC )))
-	return ERROR;
+    {
+        GDI_HEAP_UNLOCK( dc->w.hVisRgn );
+        GDI_HEAP_UNLOCK( hdc );
+        return ERROR;
+    }
     DeleteObject32( dc->w.hVisRgn );
     dc->w.hVisRgn = saved;
     CLIPPING_UpdateGCRegion( dc );
+    GDI_HEAP_UNLOCK( hdc );
+    GDI_HEAP_UNLOCK( saved );
     return savedObj->xrgn ? COMPLEXREGION : NULLREGION;
 }
diff --git a/objects/color.c b/objects/color.c
index 7d5c0bd..b07b790 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -857,6 +857,7 @@
     WORD 		 index = 0;
     HPALETTE16		 hPal = (dc)? dc->w.hPalette: STOCK_DEFAULT_PALETTE;
     unsigned char	 spec_type = color >> 24;
+    PALETTEOBJ* 	 palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
 
     if ( cSpace.flags & COLOR_FIXED )
     {
@@ -866,7 +867,6 @@
 
 	unsigned 	long red, green, blue;
 	unsigned 	idx = 0;
-	PALETTEOBJ * 	palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
 
 	switch(spec_type)
         {
@@ -876,7 +876,11 @@
 					    palPtr->logpalette.palNumEntries,
 					    NULL, color, FALSE);
 
-            if( palPtr->mapping ) return palPtr->mapping[idx];
+            if( palPtr->mapping )
+	    {
+	        GDI_HEAP_UNLOCK( hPal );
+		return palPtr->mapping[idx];
+	    }
 
 	    color = *(COLORREF*)(palPtr->logpalette.palPalEntry + idx);
 	    break;
@@ -886,11 +890,15 @@
             if( (idx = color & 0xffff) >= palPtr->logpalette.palNumEntries)
             {
                 fprintf(stderr, "\tRGB(%lx) : idx %d is out of bounds, assuming black\n", color, idx);
+		GDI_HEAP_UNLOCK( hPal );
                 return 0;
             }
 
-            if( palPtr->mapping ) return palPtr->mapping[idx];
-
+            if( palPtr->mapping ) 
+	    {
+		GDI_HEAP_UNLOCK( hPal );
+		return palPtr->mapping[idx];
+	    }
 	    color = *(COLORREF*)(palPtr->logpalette.palPalEntry + idx);
 	    break;
 
@@ -900,8 +908,12 @@
 
 	  case 0: /* RGB */
 	    if( dc && (dc->w.bitsPerPixel == 1) )
+	    {
+		GDI_HEAP_UNLOCK( hPal );
 		return (((color >> 16) & 0xff) +
 			((color >> 8) & 0xff) + (color & 0xff) > 255*3/2) ? 1 : 0;
+	    }
+
 	}
 
         red = GetRValue(color); green = GetGValue(color); blue = GetBValue(color);
@@ -909,6 +921,7 @@
 	if (COLOR_Graymax)
         {
 	    /* grayscale only; return scaled value */
+	    GDI_HEAP_UNLOCK( hPal );
             return ( (red * 30 + green * 69 + blue * 11) * COLOR_Graymax) / 25500;
 	}
 	else
@@ -918,12 +931,12 @@
             if (COLOR_Greenmax != 255) green = (green * COLOR_Greenmax) / 255;
 	    if (COLOR_Bluemax != 255) blue = (blue * COLOR_Bluemax) / 255;
 
+	    GDI_HEAP_UNLOCK( hPal );
 	    return (red << COLOR_Redshift) | (green << COLOR_Greenshift) | (blue << COLOR_Blueshift);
         }
     }
     else 
     {
-	PALETTEOBJ* palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC);
 
 	/* palPtr can be NULL when DC is being destroyed */
 
@@ -939,8 +952,11 @@
 
        	    case 0:  /* RGB */
 		if( dc && (dc->w.bitsPerPixel == 1) )
+		{
+		    GDI_HEAP_UNLOCK( hPal );
 		    return (((color >> 16) & 0xff) +
 			    ((color >> 8) & 0xff) + (color & 0xff) > 255*3/2) ? 1 : 0;
+		}
 
 	    	index = COLOR_PaletteLookupPixel( COLOR_sysPal, 256, 
 						  COLOR_PaletteToPixel, color, FALSE);
@@ -968,6 +984,7 @@
 	}
     }
 
+    GDI_HEAP_UNLOCK( hPal );
     return index;
 }
 
@@ -977,12 +994,11 @@
  * Set the color-mapping table for selected palette. 
  * Return number of entries which mapping has changed.
  */
-int COLOR_SetMapping( PALETTEOBJ* palPtr, BOOL32 mapOnly )
+int COLOR_SetMapping( PALETTEOBJ* palPtr, UINT32 uStart, UINT32 uNum, BOOL32 mapOnly )
 {
-    int  i, index;
     char flag;
     int  prevMapping = (palPtr->mapping) ? 1 : 0;
-    int  iRemapped = 0;
+    int  index, iRemapped = 0;
 
     /* reset dynamic system palette entries */
 
@@ -994,15 +1010,15 @@
     palPtr->mapping = (int*)xrealloc(palPtr->mapping, sizeof(int)*
                                      palPtr->logpalette.palNumEntries);
 
-    for( i = 0; i < palPtr->logpalette.palNumEntries; i++ )
+    for( uNum += uStart; uStart < uNum; uStart++ )
     {
         index = -1;
         flag = PC_SYS_USED;
 
-        switch( palPtr->logpalette.palPalEntry[i].peFlags & 0x07 )
+        switch( palPtr->logpalette.palPalEntry[uStart].peFlags & 0x07 )
         {
 	case PC_EXPLICIT:   /* palette entries are indices into system palette */
-            index = *(WORD*)(palPtr->logpalette.palPalEntry + i);
+            index = *(WORD*)(palPtr->logpalette.palPalEntry + uStart);
             if( index > 255 || (index >= COLOR_gapStart && index <= COLOR_gapEnd) ) 
             {
                 fprintf(stderr,"PC_EXPLICIT: idx %d out of system palette, assuming black.\n", index); 
@@ -1016,7 +1032,7 @@
             /* fall through */
 	default:	    /* try to collapse identical colors */
             index = COLOR_PaletteLookupExactIndex(COLOR_sysPal, 256,  
-                             *(COLORREF*)(palPtr->logpalette.palPalEntry + i));
+                             *(COLORREF*)(palPtr->logpalette.palPalEntry + uStart));
             /* fall through */
 	case PC_NOCOLLAPSE: 
             if( index < 0 )
@@ -1028,13 +1044,13 @@
                     COLOR_firstFree = COLOR_freeList[index];
 
                     color.pixel = (COLOR_PaletteToPixel) ? COLOR_PaletteToPixel[index] : index;
-                    color.red = palPtr->logpalette.palPalEntry[i].peRed << 8;
-                    color.green = palPtr->logpalette.palPalEntry[i].peGreen << 8;
-                    color.blue = palPtr->logpalette.palPalEntry[i].peBlue << 8;
+                    color.red = palPtr->logpalette.palPalEntry[uStart].peRed << 8;
+                    color.green = palPtr->logpalette.palPalEntry[uStart].peGreen << 8;
+                    color.blue = palPtr->logpalette.palPalEntry[uStart].peBlue << 8;
                     color.flags = DoRed | DoGreen | DoBlue;
                     XStoreColor(display, cSpace.colorMap, &color);
 
-                    COLOR_sysPal[index] = palPtr->logpalette.palPalEntry[i];
+                    COLOR_sysPal[index] = palPtr->logpalette.palPalEntry[uStart];
                     COLOR_sysPal[index].peFlags = flag;
 		    COLOR_freeList[index] = 0;
 
@@ -1044,27 +1060,28 @@
                 else if ( cSpace.flags & COLOR_VIRTUAL ) 
                 {
                     index = COLOR_ToPhysical( NULL, 0x00ffffff &
-                             *(COLORREF*)(palPtr->logpalette.palPalEntry + i));
+                             *(COLORREF*)(palPtr->logpalette.palPalEntry + uStart));
                     break;     
                 }
 
                 /* we have to map to existing entry in the system palette */
 
                 index = COLOR_PaletteLookupPixel(COLOR_sysPal, 256, NULL, 
-                       *(COLORREF*)(palPtr->logpalette.palPalEntry + i), TRUE);
+                       *(COLORREF*)(palPtr->logpalette.palPalEntry + uStart), TRUE);
             }
-	    palPtr->logpalette.palPalEntry[i].peFlags |= PC_SYS_USED;
+	    palPtr->logpalette.palPalEntry[uStart].peFlags |= PC_SYS_USED;
 
             if( COLOR_PaletteToPixel ) index = COLOR_PaletteToPixel[index];
             break;
         }
 
-        if( !prevMapping || palPtr->mapping[i] != index ) iRemapped++;
-        palPtr->mapping[i] = index;
+        if( !prevMapping || palPtr->mapping[uStart] != index ) iRemapped++;
+        palPtr->mapping[uStart] = index;
 
-        dprintf_palette(stddeb,"\tentry %i (%lx) -> pixel %i\n", i, 
-				*(COLORREF*)(palPtr->logpalette.palPalEntry + i), index);
+        dprintf_palette(stddeb,"\tentry %i (%lx) -> pixel %i\n", uStart, 
+				*(COLORREF*)(palPtr->logpalette.palPalEntry + uStart), index);
 	
     }
     return iRemapped;
 }
+
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index e8a9537..317f163 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -522,7 +522,7 @@
 /***********************************************************************
  *           LoadCursor16    (USER.173)
  */
-HCURSOR16 LoadCursor16( HINSTANCE16 hInstance, SEGPTR name )
+HCURSOR16 WINAPI LoadCursor16( HINSTANCE16 hInstance, SEGPTR name )
 {
     if (HIWORD(name))
         dprintf_cursor( stddeb, "LoadCursor16: %04x '%s'\n",
@@ -539,7 +539,7 @@
 /***********************************************************************
  *           LoadIcon16    (USER.174)
  */
-HICON16 LoadIcon16( HINSTANCE16 hInstance, SEGPTR name )
+HICON16 WINAPI LoadIcon16( HINSTANCE16 hInstance, SEGPTR name )
 {
     if (HIWORD(name))
         dprintf_icon( stddeb, "LoadIcon: %04x '%s'\n",
@@ -557,9 +557,10 @@
 /***********************************************************************
  *           CreateCursor16    (USER.406)
  */
-HCURSOR16 CreateCursor16(HINSTANCE16 hInstance, INT16 xHotSpot, INT16 yHotSpot,
-                         INT16 nWidth, INT16 nHeight,
-                         LPCVOID lpANDbits, LPCVOID lpXORbits )
+HCURSOR16 WINAPI CreateCursor16( HINSTANCE16 hInstance,
+                                 INT16 xHotSpot, INT16 yHotSpot,
+                                 INT16 nWidth, INT16 nHeight,
+                                 LPCVOID lpANDbits, LPCVOID lpXORbits )
 {
     CURSORICONINFO info = { { xHotSpot, yHotSpot }, nWidth, nHeight, 0, 1, 1 };
 
@@ -572,9 +573,10 @@
 /***********************************************************************
  *           CreateCursor32    (USER32.66)
  */
-HCURSOR32 CreateCursor32(HINSTANCE32 hInstance, INT32 xHotSpot, INT32 yHotSpot,
-                         INT32 nWidth, INT32 nHeight,
-                         LPCVOID lpANDbits, LPCVOID lpXORbits )
+HCURSOR32 WINAPI CreateCursor32( HINSTANCE32 hInstance,
+                                 INT32 xHotSpot, INT32 yHotSpot,
+                                 INT32 nWidth, INT32 nHeight,
+                                 LPCVOID lpANDbits, LPCVOID lpXORbits )
 {
     CURSORICONINFO info = { { xHotSpot, yHotSpot }, nWidth, nHeight, 0, 1, 1 };
 
@@ -587,9 +589,9 @@
 /***********************************************************************
  *           CreateIcon16    (USER.407)
  */
-HICON16 CreateIcon16( HINSTANCE16 hInstance, INT16 nWidth, INT16 nHeight,
-                      BYTE bPlanes, BYTE bBitsPixel,
-                      LPCVOID lpANDbits, LPCVOID lpXORbits )
+HICON16 WINAPI CreateIcon16( HINSTANCE16 hInstance, INT16 nWidth,
+                             INT16 nHeight, BYTE bPlanes, BYTE bBitsPixel,
+                             LPCVOID lpANDbits, LPCVOID lpXORbits )
 {
     CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, 0, bPlanes, bBitsPixel};
 
@@ -602,9 +604,9 @@
 /***********************************************************************
  *           CreateIcon32    (USER32.74)
  */
-HICON32 CreateIcon32( HINSTANCE32 hInstance, INT32 nWidth, INT32 nHeight,
-                      BYTE bPlanes, BYTE bBitsPixel,
-                      LPCVOID lpANDbits, LPCVOID lpXORbits )
+HICON32 WINAPI CreateIcon32( HINSTANCE32 hInstance, INT32 nWidth,
+                             INT32 nHeight, BYTE bPlanes, BYTE bBitsPixel,
+                             LPCVOID lpANDbits, LPCVOID lpXORbits )
 {
     CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, 0, bPlanes, bBitsPixel};
 
@@ -617,8 +619,10 @@
 /***********************************************************************
  *           CreateCursorIconIndirect    (USER.408)
  */
-HGLOBAL16 CreateCursorIconIndirect(HINSTANCE16 hInstance, CURSORICONINFO *info,
-                                   LPCVOID lpANDbits, LPCVOID lpXORbits )
+HGLOBAL16 WINAPI CreateCursorIconIndirect( HINSTANCE16 hInstance,
+                                           CURSORICONINFO *info,
+                                           LPCVOID lpANDbits,
+                                           LPCVOID lpXORbits )
 {
     HGLOBAL16 handle;
     char *ptr;
@@ -644,7 +648,7 @@
 /***********************************************************************
  *           CopyIcon16    (USER.368)
  */
-HICON16 CopyIcon16( HINSTANCE16 hInstance, HICON16 hIcon )
+HICON16 WINAPI CopyIcon16( HINSTANCE16 hInstance, HICON16 hIcon )
 {
     dprintf_icon( stddeb, "CopyIcon16: %04x %04x\n", hInstance, hIcon );
     return CURSORICON_Copy( hInstance, hIcon );
@@ -654,7 +658,7 @@
 /***********************************************************************
  *           CopyIcon32    (USER32.59)
  */
-HICON32 CopyIcon32( HICON32 hIcon )
+HICON32 WINAPI CopyIcon32( HICON32 hIcon )
 {
     dprintf_icon( stddeb, "CopyIcon32: %04x\n", hIcon );
     return CURSORICON_Copy( 0, hIcon );
@@ -664,7 +668,7 @@
 /***********************************************************************
  *           CopyCursor16    (USER.369)
  */
-HCURSOR16 CopyCursor16( HINSTANCE16 hInstance, HCURSOR16 hCursor )
+HCURSOR16 WINAPI CopyCursor16( HINSTANCE16 hInstance, HCURSOR16 hCursor )
 {
     dprintf_cursor( stddeb, "CopyCursor16: %04x %04x\n", hInstance, hCursor );
     return CURSORICON_Copy( hInstance, hCursor );
@@ -674,7 +678,7 @@
 /***********************************************************************
  *           DestroyIcon16    (USER.457)
  */
-BOOL16 DestroyIcon16( HICON16 hIcon )
+BOOL16 WINAPI DestroyIcon16( HICON16 hIcon )
 {
     return DestroyIcon32( hIcon );
 }
@@ -683,7 +687,7 @@
 /***********************************************************************
  *           DestroyIcon32    (USER32.132)
  */
-BOOL32 DestroyIcon32( HICON32 hIcon )
+BOOL32 WINAPI DestroyIcon32( HICON32 hIcon )
 {
     dprintf_icon( stddeb, "DestroyIcon: %04x\n", hIcon );
     /* FIXME: should check for OEM icon here */
@@ -694,7 +698,7 @@
 /***********************************************************************
  *           DestroyCursor16    (USER.458)
  */
-BOOL16 DestroyCursor16( HCURSOR16 hCursor )
+BOOL16 WINAPI DestroyCursor16( HCURSOR16 hCursor )
 {
     return DestroyCursor32( hCursor );
 }
@@ -703,7 +707,7 @@
 /***********************************************************************
  *           DestroyCursor32    (USER32.131)
  */
-BOOL32 DestroyCursor32( HCURSOR32 hCursor )
+BOOL32 WINAPI DestroyCursor32( HCURSOR32 hCursor )
 {
     dprintf_cursor( stddeb, "DestroyCursor: %04x\n", hCursor );
     /* FIXME: should check for OEM cursor here */
@@ -714,7 +718,7 @@
 /***********************************************************************
  *           DrawIcon16    (USER.84)
  */
-BOOL16 DrawIcon16( HDC16 hdc, INT16 x, INT16 y, HICON16 hIcon )
+BOOL16 WINAPI DrawIcon16( HDC16 hdc, INT16 x, INT16 y, HICON16 hIcon )
 {
     return DrawIcon32( hdc, x, y, hIcon );
 }
@@ -723,7 +727,7 @@
 /***********************************************************************
  *           DrawIcon32    (USER32.158)
  */
-BOOL32 DrawIcon32( HDC32 hdc, INT32 x, INT32 y, HICON32 hIcon )
+BOOL32 WINAPI DrawIcon32( HDC32 hdc, INT32 x, INT32 y, HICON32 hIcon )
 {
     CURSORICONINFO *ptr;
     HDC32 hMemDC;
@@ -761,8 +765,8 @@
 /***********************************************************************
  *           DumpIcon    (USER.459)
  */
-DWORD DumpIcon( SEGPTR pInfo, WORD *lpLen,
-                SEGPTR *lpXorBits, SEGPTR *lpAndBits )
+DWORD WINAPI DumpIcon( SEGPTR pInfo, WORD *lpLen,
+                       SEGPTR *lpXorBits, SEGPTR *lpAndBits )
 {
     CURSORICONINFO *info = PTR_SEG_TO_LIN( pInfo );
     int sizeAnd, sizeXor;
@@ -833,9 +837,8 @@
             image->bitmap_unit = 16;
             _XInitImageFuncPtrs(image);
             if (pixmapAll)
-                CallTo32_LargeStack( XPutImage, 10,
-                                     display, pixmapAll, BITMAP_monoGC, image,
-                                     0, 0, 0, 0, ptr->nWidth, ptr->nHeight*2 );
+                XPutImage( display, pixmapAll, BITMAP_monoGC, image,
+                           0, 0, 0, 0, ptr->nWidth, ptr->nHeight * 2 );
             image->data = NULL;
             XDestroyImage( image );
         }
@@ -925,7 +928,7 @@
 /***********************************************************************
  *           SetCursor16    (USER.69)
  */
-HCURSOR16 SetCursor16( HCURSOR16 hCursor )
+HCURSOR16 WINAPI SetCursor16( HCURSOR16 hCursor )
 {
     return (HCURSOR16)SetCursor32( hCursor );
 }
@@ -934,7 +937,7 @@
 /***********************************************************************
  *           SetCursor32    (USER32.471)
  */
-HCURSOR32 SetCursor32( HCURSOR32 hCursor )
+HCURSOR32 WINAPI SetCursor32( HCURSOR32 hCursor )
 {
     HCURSOR32 hOldCursor;
 
@@ -943,7 +946,8 @@
     hOldCursor = hActiveCursor;
     hActiveCursor = hCursor;
     /* Change the cursor shape only if it is visible */
-    if (CURSOR_ShowCount >= 0) CURSORICON_SetCursor( hActiveCursor );
+    if (CURSOR_ShowCount >= 0)
+        CALL_LARGE_STACK( CURSORICON_SetCursor, hActiveCursor );
     return hOldCursor;
 }
 
@@ -951,7 +955,7 @@
 /***********************************************************************
  *           SetCursorPos16    (USER.70)
  */
-void SetCursorPos16( INT16 x, INT16 y )
+void WINAPI SetCursorPos16( INT16 x, INT16 y )
 {
     SetCursorPos32( x, y );
 }
@@ -960,7 +964,7 @@
 /***********************************************************************
  *           SetCursorPos32    (USER32.473)
  */
-BOOL32 SetCursorPos32( INT32 x, INT32 y )
+BOOL32 WINAPI SetCursorPos32( INT32 x, INT32 y )
 {
     dprintf_cursor( stddeb, "SetCursorPos: x=%d y=%d\n", x, y );
     XWarpPointer( display, rootWindow, rootWindow, 0, 0, 0, 0, x, y );
@@ -971,7 +975,7 @@
 /***********************************************************************
  *           ShowCursor16    (USER.71)
  */
-INT16 ShowCursor16( BOOL16 bShow )
+INT16 WINAPI ShowCursor16( BOOL16 bShow )
 {
     return ShowCursor32( bShow );
 }
@@ -980,20 +984,20 @@
 /***********************************************************************
  *           ShowCursor32    (USER32.529)
  */
-INT32 ShowCursor32( BOOL32 bShow )
+INT32 WINAPI ShowCursor32( BOOL32 bShow )
 {
     dprintf_cursor( stddeb, "ShowCursor: %d, count=%d\n",
                     bShow, CURSOR_ShowCount );
 
     if (bShow)
     {
-        if (++CURSOR_ShowCount == 0)
-            CURSORICON_SetCursor( hActiveCursor );  /* Show it */
+        if (++CURSOR_ShowCount == 0)  /* Show it */
+            CALL_LARGE_STACK( CURSORICON_SetCursor, hActiveCursor );
     }
     else
     {
-        if (--CURSOR_ShowCount == -1)
-            CURSORICON_SetCursor( 0 );  /* Hide it */
+        if (--CURSOR_ShowCount == -1)  /* Hide it */
+            CALL_LARGE_STACK( CURSORICON_SetCursor, 0 );
     }
     return CURSOR_ShowCount;
 }
@@ -1002,7 +1006,7 @@
 /***********************************************************************
  *           GetCursor16    (USER.247)
  */
-HCURSOR16 GetCursor16(void)
+HCURSOR16 WINAPI GetCursor16(void)
 {
     return hActiveCursor;
 }
@@ -1011,7 +1015,7 @@
 /***********************************************************************
  *           GetCursor32    (USER32.226)
  */
-HCURSOR32 GetCursor32(void)
+HCURSOR32 WINAPI GetCursor32(void)
 {
     return hActiveCursor;
 }
@@ -1020,7 +1024,7 @@
 /***********************************************************************
  *           ClipCursor16    (USER.16)
  */
-BOOL16 ClipCursor16( const RECT16 *rect )
+BOOL16 WINAPI ClipCursor16( const RECT16 *rect )
 {
     if (!rect) SetRectEmpty32( &CURSOR_ClipRect );
     else CONV_RECT16TO32( rect, &CURSOR_ClipRect );
@@ -1031,7 +1035,7 @@
 /***********************************************************************
  *           ClipCursor32    (USER32.52)
  */
-BOOL32 ClipCursor32( const RECT32 *rect )
+BOOL32 WINAPI ClipCursor32( const RECT32 *rect )
 {
     if (!rect) SetRectEmpty32( &CURSOR_ClipRect );
     else CopyRect32( &CURSOR_ClipRect, rect );
@@ -1042,7 +1046,7 @@
 /***********************************************************************
  *           GetCursorPos16    (USER.17)
  */
-void GetCursorPos16( POINT16 *pt )
+void WINAPI GetCursorPos16( POINT16 *pt )
 {
     Window root, child;
     int rootX, rootY, childX, childY;
@@ -1064,7 +1068,7 @@
 /***********************************************************************
  *           GetCursorPos32    (USER32.228)
  */
-void GetCursorPos32( POINT32 *pt )
+void WINAPI GetCursorPos32( POINT32 *pt )
 {
     POINT16 pt16;
     GetCursorPos16( &pt16 );
@@ -1075,7 +1079,7 @@
 /***********************************************************************
  *           GetClipCursor16    (USER.309)
  */
-void GetClipCursor16( RECT16 *rect )
+void WINAPI GetClipCursor16( RECT16 *rect )
 {
     if (rect) CONV_RECT32TO16( &CURSOR_ClipRect, rect );
 }
@@ -1084,7 +1088,7 @@
 /***********************************************************************
  *           GetClipCursor32    (USER32.220)
  */
-void GetClipCursor32( RECT32 *rect )
+void WINAPI GetClipCursor32( RECT32 *rect )
 {
     if (rect) CopyRect32( rect, &CURSOR_ClipRect );
 }
@@ -1093,7 +1097,7 @@
 /**********************************************************************
  *	    GetIconID    (USER.455)
  */
-WORD GetIconID( HGLOBAL16 hResource, DWORD resType )
+WORD WINAPI GetIconID( HGLOBAL16 hResource, DWORD resType )
 {
     CURSORICONDIR *lpDir = (CURSORICONDIR *)GlobalLock16(hResource);
 /* LockResource16(hResource); */
@@ -1132,7 +1136,7 @@
 /**********************************************************************
  *	    LoadIconHandler    (USER.456)
  */
-HICON16 LoadIconHandler( HGLOBAL16 hResource, BOOL16 bNew )
+HICON16 WINAPI LoadIconHandler( HGLOBAL16 hResource, BOOL16 bNew )
 {
     dprintf_cursor(stddeb,"LoadIconHandler: hRes=%04x\n",hResource);
 
diff --git a/objects/dc.c b/objects/dc.c
index 0210fc3..77d3996 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -141,7 +141,7 @@
     DC *dc;
 
     if (!(hdc = GDI_AllocObject( sizeof(DC), DC_MAGIC ))) return NULL;
-    dc = (DC *) GDI_HEAP_LIN_ADDR( hdc );
+    dc = (DC *) GDI_HEAP_LOCK( hdc );
 
     dc->hSelf      = hdc;
     dc->funcs      = funcs;
@@ -163,15 +163,17 @@
 }
 
 
+
 /***********************************************************************
  *           DC_GetDCPtr
  */
 DC *DC_GetDCPtr( HDC32 hdc )
 {
-    GDIOBJHDR *ptr = (GDIOBJHDR *)GDI_HEAP_LIN_ADDR( hdc );
+    GDIOBJHDR *ptr = (GDIOBJHDR *)GDI_HEAP_LOCK( hdc );
     if (!ptr) return NULL;
     if ((ptr->wMagic == DC_MAGIC) || (ptr->wMagic == METAFILE_DC_MAGIC))
         return (DC *)ptr;
+    GDI_HEAP_UNLOCK( hdc );
     return NULL;
 }
 
@@ -380,14 +382,18 @@
 /***********************************************************************
  *           GetDCState    (GDI.179)
  */
-HDC16 GetDCState( HDC16 hdc )
+HDC16 WINAPI GetDCState( HDC16 hdc )
 {
     DC * newdc, * dc;
     HGDIOBJ16 handle;
     
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
-    if (!(handle = GDI_AllocObject( sizeof(DC), DC_MAGIC ))) return 0;
-    newdc = (DC *) GDI_HEAP_LIN_ADDR( handle );
+    if (!(handle = GDI_AllocObject( sizeof(DC), DC_MAGIC )))
+    {
+      GDI_HEAP_UNLOCK( hdc );
+      return 0;
+    }
+    newdc = (DC *) GDI_HEAP_LOCK( handle );
 
     dprintf_dc(stddeb, "GetDCState(%04x): returning %04x\n", hdc, handle );
 
@@ -446,6 +452,8 @@
     }
     else
 	newdc->w.hClipRgn = 0;
+    GDI_HEAP_UNLOCK( handle );
+    GDI_HEAP_UNLOCK( hdc );
     return handle;
 }
 
@@ -453,13 +461,22 @@
 /***********************************************************************
  *           SetDCState    (GDI.180)
  */
-void SetDCState( HDC16 hdc, HDC16 hdcs )
+void WINAPI SetDCState( HDC16 hdc, HDC16 hdcs )
 {
     DC *dc, *dcs;
     
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return;
-    if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC ))) return;
-    if (!dcs->w.flags & DC_SAVED) return;
+    if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC )))
+    {
+      GDI_HEAP_UNLOCK( hdc );
+      return;
+    }
+    if (!dcs->w.flags & DC_SAVED)
+    {
+      GDI_HEAP_UNLOCK( hdc );
+      GDI_HEAP_UNLOCK( hdcs );
+      return;
+    }
     dprintf_dc(stddeb, "SetDCState: %04x %04x\n", hdc, hdcs );
 
     dc->w.flags           = dcs->w.flags & ~DC_SAVED;
@@ -506,13 +523,15 @@
     SelectObject32( hdc, dcs->w.hFont );
     SelectObject32( hdc, dcs->w.hPen );
     GDISelectPalette( hdc, dcs->w.hPalette, FALSE );
+    GDI_HEAP_UNLOCK( hdc );
+    GDI_HEAP_UNLOCK( hdcs );
 }
 
 
 /***********************************************************************
  *           SaveDC16    (GDI.30)
  */
-INT16 SaveDC16( HDC16 hdc )
+INT16 WINAPI SaveDC16( HDC16 hdc )
 {
     return (INT16)SaveDC32( hdc );
 }
@@ -521,10 +540,11 @@
 /***********************************************************************
  *           SaveDC32    (GDI32.292)
  */
-INT32 SaveDC32( HDC32 hdc )
+INT32 WINAPI SaveDC32( HDC32 hdc )
 {
     HDC32 hdcs;
     DC * dc, * dcs;
+    INT32 ret;
 
     dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
@@ -532,21 +552,29 @@
 	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
 	if (!dc) return 0;
 	MF_MetaParam0(dc, META_SAVEDC);
+	GDI_HEAP_UNLOCK( hdc );
 	return 1;  /* ?? */
     }
-    if (!(hdcs = GetDCState( hdc ))) return 0;
-    dcs = (DC *) GDI_HEAP_LIN_ADDR( hdcs );
+    if (!(hdcs = GetDCState( hdc )))
+    {
+      GDI_HEAP_UNLOCK( hdc );
+      return 0;
+    }
+    dcs = (DC *) GDI_HEAP_LOCK( hdcs );
     dcs->header.hNext = dc->header.hNext;
     dc->header.hNext = hdcs;
     dprintf_dc(stddeb, "SaveDC(%04x): returning %d\n", hdc, dc->saveLevel+1 );
-    return ++dc->saveLevel;
+    ret = ++dc->saveLevel;
+    GDI_HEAP_UNLOCK( hdcs );
+    GDI_HEAP_UNLOCK( hdc );
+    return ret;
 }
 
 
 /***********************************************************************
  *           RestoreDC16    (GDI.39)
  */
-BOOL16 RestoreDC16( HDC16 hdc, INT16 level )
+BOOL16 WINAPI RestoreDC16( HDC16 hdc, INT16 level )
 {
     return RestoreDC32( hdc, level );
 }
@@ -555,7 +583,7 @@
 /***********************************************************************
  *           RestoreDC32    (GDI32.290)
  */
-BOOL32 RestoreDC32( HDC32 hdc, INT32 level )
+BOOL32 WINAPI RestoreDC32( HDC32 hdc, INT32 level )
 {
     DC * dc, * dcs;
 
@@ -565,21 +593,35 @@
     {
 	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
 	if (!dc) return FALSE;
-	if (level != -1) return FALSE;
+	if (level != -1) 
+	{
+	  GDI_HEAP_UNLOCK( hdc );
+	  return FALSE;
+	}
 	MF_MetaParam1(dc, META_RESTOREDC, level);
+	GDI_HEAP_UNLOCK( hdc );
 	return TRUE;
     }
     if (level == -1) level = dc->saveLevel;
-    if ((level < 1) || (level > dc->saveLevel)) return FALSE;
+    if ((level < 1) || (level > dc->saveLevel))
+    {
+      GDI_HEAP_UNLOCK( hdc );
+      return FALSE;
+    }
     
     while (dc->saveLevel >= level)
     {
 	HDC16 hdcs = dc->header.hNext;
-	if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC ))) return FALSE;
+	if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC )))
+	{
+	  GDI_HEAP_UNLOCK( hdc );
+	  return FALSE;
+	}	
 	dc->header.hNext = dcs->header.hNext;
 	if (--dc->saveLevel < level) SetDCState( hdc, hdcs );
 	DeleteDC32( hdcs );
     }
+    GDI_HEAP_UNLOCK( hdc );
     return TRUE;
 }
 
@@ -587,8 +629,8 @@
 /***********************************************************************
  *           CreateDC16    (GDI.53)
  */
-HDC16 CreateDC16( LPCSTR driver, LPCSTR device, LPCSTR output,
-                  const DEVMODE16 *initData )
+HDC16 WINAPI CreateDC16( LPCSTR driver, LPCSTR device, LPCSTR output,
+                         const DEVMODE16 *initData )
 {
     DC * dc;
     const DC_FUNCTIONS *funcs;
@@ -609,6 +651,7 @@
     }
 
     DC_InitDC( dc );
+    GDI_HEAP_UNLOCK( dc->hSelf );
     return dc->hSelf;
 }
 
@@ -616,8 +659,8 @@
 /***********************************************************************
  *           CreateDC32A    (GDI32.)
  */
-HDC32 CreateDC32A( LPCSTR driver, LPCSTR device, LPCSTR output,
-                   const DEVMODE32A *initData )
+HDC32 WINAPI CreateDC32A( LPCSTR driver, LPCSTR device, LPCSTR output,
+                          const DEVMODE32A *initData )
 {
     return CreateDC16( driver, device, output, (const DEVMODE16 *)initData );
 }
@@ -626,8 +669,8 @@
 /***********************************************************************
  *           CreateDC32W    (GDI32.)
  */
-HDC32 CreateDC32W( LPCWSTR driver, LPCWSTR device, LPCWSTR output,
-                   const DEVMODE32W *initData )
+HDC32 WINAPI CreateDC32W( LPCWSTR driver, LPCWSTR device, LPCWSTR output,
+                          const DEVMODE32W *initData )
 { 
     LPSTR driverA = HEAP_strdupWtoA( GetProcessHeap(), 0, driver );
     LPSTR deviceA = HEAP_strdupWtoA( GetProcessHeap(), 0, device );
@@ -644,8 +687,8 @@
 /***********************************************************************
  *           CreateIC16    (GDI.153)
  */
-HDC16 CreateIC16( LPCSTR driver, LPCSTR device, LPCSTR output,
-                  const DEVMODE16* initData )
+HDC16 WINAPI CreateIC16( LPCSTR driver, LPCSTR device, LPCSTR output,
+                         const DEVMODE16* initData )
 {
       /* Nothing special yet for ICs */
     return CreateDC16( driver, device, output, initData );
@@ -655,8 +698,8 @@
 /***********************************************************************
  *           CreateIC32A    (GDI32.49)
  */
-HDC32 CreateIC32A( LPCSTR driver, LPCSTR device, LPCSTR output,
-                   const DEVMODE32A* initData )
+HDC32 WINAPI CreateIC32A( LPCSTR driver, LPCSTR device, LPCSTR output,
+                          const DEVMODE32A* initData )
 {
       /* Nothing special yet for ICs */
     return CreateDC32A( driver, device, output, initData );
@@ -666,8 +709,8 @@
 /***********************************************************************
  *           CreateIC32W    (GDI32.50)
  */
-HDC32 CreateIC32W( LPCWSTR driver, LPCWSTR device, LPCWSTR output,
-                   const DEVMODE32W* initData )
+HDC32 WINAPI CreateIC32W( LPCWSTR driver, LPCWSTR device, LPCWSTR output,
+                          const DEVMODE32W* initData )
 {
       /* Nothing special yet for ICs */
     return CreateDC32W( driver, device, output, initData );
@@ -677,7 +720,7 @@
 /***********************************************************************
  *           CreateCompatibleDC16    (GDI.52)
  */
-HDC16 CreateCompatibleDC16( HDC16 hdc )
+HDC16 WINAPI CreateCompatibleDC16( HDC16 hdc )
 {
     return (HDC16)CreateCompatibleDC32( hdc );
 }
@@ -686,7 +729,7 @@
 /***********************************************************************
  *           CreateCompatibleDC32   (GDI32.31)
  */
-HDC32 CreateCompatibleDC32( HDC32 hdc )
+HDC32 WINAPI CreateCompatibleDC32( HDC32 hdc )
 {
     DC *dc, *origDC;
     HBITMAP32 hbitmap;
@@ -722,6 +765,7 @@
     }
 
     DC_InitDC( dc );
+    GDI_HEAP_UNLOCK( dc->hSelf );
     return dc->hSelf;
 }
 
@@ -729,7 +773,7 @@
 /***********************************************************************
  *           DeleteDC16    (GDI.68)
  */
-BOOL16 DeleteDC16( HDC16 hdc )
+BOOL16 WINAPI DeleteDC16( HDC16 hdc )
 {
     return DeleteDC32( hdc );
 }
@@ -738,7 +782,7 @@
 /***********************************************************************
  *           DeleteDC32    (GDI32.67)
  */
-BOOL32 DeleteDC32( HDC32 hdc )
+BOOL32 WINAPI DeleteDC32( HDC32 hdc )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
@@ -775,7 +819,7 @@
 /***********************************************************************
  *           ResetDC16    (GDI.376)
  */
-HDC16 ResetDC16( HDC16 hdc, const DEVMODE16 *devmode )
+HDC16 WINAPI ResetDC16( HDC16 hdc, const DEVMODE16 *devmode )
 {
     fprintf( stderr, "ResetDC16: empty stub!\n" );
     return hdc;
@@ -785,7 +829,7 @@
 /***********************************************************************
  *           ResetDC32A    (GDI32.287)
  */
-HDC32 ResetDC32A( HDC32 hdc, const DEVMODE32A *devmode )
+HDC32 WINAPI ResetDC32A( HDC32 hdc, const DEVMODE32A *devmode )
 {
     fprintf( stderr, "ResetDC32A: empty stub!\n" );
     return hdc;
@@ -795,7 +839,7 @@
 /***********************************************************************
  *           ResetDC32W    (GDI32.288)
  */
-HDC32 ResetDC32W( HDC32 hdc, const DEVMODE32W *devmode )
+HDC32 WINAPI ResetDC32W( HDC32 hdc, const DEVMODE32W *devmode )
 {
     fprintf( stderr, "ResetDC32A: empty stub!\n" );
     return hdc;
@@ -805,7 +849,7 @@
 /***********************************************************************
  *           GetDeviceCaps16    (GDI.80)
  */
-INT16 GetDeviceCaps16( HDC16 hdc, INT16 cap )
+INT16 WINAPI GetDeviceCaps16( HDC16 hdc, INT16 cap )
 {
     return GetDeviceCaps32( hdc, cap );
 }
@@ -814,23 +858,31 @@
 /***********************************************************************
  *           GetDeviceCaps32    (GDI32.171)
  */
-INT32 GetDeviceCaps32( HDC32 hdc, INT32 cap )
+INT32 WINAPI GetDeviceCaps32( HDC32 hdc, INT32 cap )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    INT32 ret;
+
     if (!dc) return 0;
 
-    if ((cap < 0) || (cap > sizeof(DeviceCaps)-sizeof(WORD))) return 0;
+    if ((cap < 0) || (cap > sizeof(DeviceCaps)-sizeof(WORD)))
+    {
+      GDI_HEAP_UNLOCK( hdc );
+      return 0;
+    }
     
     dprintf_dc(stddeb, "GetDeviceCaps(%04x,%d): returning %d\n",
 	    hdc, cap, *(WORD *)(((char *)dc->w.devCaps) + cap) );
-    return *(WORD *)(((char *)dc->w.devCaps) + cap);
+    ret = *(WORD *)(((char *)dc->w.devCaps) + cap);
+    GDI_HEAP_UNLOCK( hdc );
+    return ret;
 }
 
 
 /***********************************************************************
  *           SetBkColor16    (GDI.1)
  */
-COLORREF SetBkColor16( HDC16 hdc, COLORREF color )
+COLORREF WINAPI SetBkColor16( HDC16 hdc, COLORREF color )
 {
     return SetBkColor32( hdc, color );
 }
@@ -839,7 +891,7 @@
 /***********************************************************************
  *           SetBkColor32    (GDI32.305)
  */
-COLORREF SetBkColor32( HDC32 hdc, COLORREF color )
+COLORREF WINAPI SetBkColor32( HDC32 hdc, COLORREF color )
 {
     COLORREF oldColor;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -848,12 +900,14 @@
 	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
 	if (!dc) return 0x80000000;
 	MF_MetaParam2(dc, META_SETBKCOLOR, HIWORD(color), LOWORD(color));
+	GDI_HEAP_UNLOCK( hdc );
 	return 0;  /* ?? */
     }
 
     oldColor = dc->w.backgroundColor;
     dc->w.backgroundColor = color;
     dc->w.backgroundPixel = COLOR_ToPhysical( dc, color );
+    GDI_HEAP_UNLOCK( hdc );
     return oldColor;
 }
 
@@ -861,7 +915,7 @@
 /***********************************************************************
  *           SetTextColor16    (GDI.9)
  */
-COLORREF SetTextColor16( HDC16 hdc, COLORREF color )
+COLORREF WINAPI SetTextColor16( HDC16 hdc, COLORREF color )
 {
     return SetTextColor32( hdc, color );
 }
@@ -870,7 +924,7 @@
 /***********************************************************************
  *           SetTextColor32    (GDI32.338)
  */
-COLORREF SetTextColor32( HDC32 hdc, COLORREF color )
+COLORREF WINAPI SetTextColor32( HDC32 hdc, COLORREF color )
 {
     COLORREF oldColor;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -879,12 +933,14 @@
 	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
 	if (!dc) return 0x80000000;
 	MF_MetaParam2(dc, META_SETTEXTCOLOR, HIWORD(color), LOWORD(color));
+	GDI_HEAP_UNLOCK( hdc );
 	return 0;  /* ?? */
     }
 
     oldColor = dc->w.textColor;
     dc->w.textColor = color;
     dc->w.textPixel = COLOR_ToPhysical( dc, color );
+    GDI_HEAP_UNLOCK( hdc );
     return oldColor;
 }
 
@@ -892,7 +948,7 @@
 /***********************************************************************
  *           SetTextAlign16    (GDI.346)
  */
-UINT16 SetTextAlign16( HDC16 hdc, UINT16 textAlign )
+UINT16 WINAPI SetTextAlign16( HDC16 hdc, UINT16 textAlign )
 {
     return SetTextAlign32( hdc, textAlign );
 }
@@ -901,7 +957,7 @@
 /***********************************************************************
  *           SetTextAlign32    (GDI32.336)
  */
-UINT32 SetTextAlign32( HDC32 hdc, UINT32 textAlign )
+UINT32 WINAPI SetTextAlign32( HDC32 hdc, UINT32 textAlign )
 {
     UINT32 prevAlign;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -909,10 +965,12 @@
     {
 	if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ))) return 0;
 	MF_MetaParam1( dc, META_SETTEXTALIGN, textAlign );
+	GDI_HEAP_UNLOCK( hdc );
 	return 1;
     }
     prevAlign = dc->w.textAlign;
     dc->w.textAlign = textAlign;
+    GDI_HEAP_UNLOCK( hdc );
     return prevAlign;
 }
 
@@ -920,10 +978,11 @@
 /***********************************************************************
  *           GetDCOrgEx  (GDI32.168)
  */
-BOOL32 GetDCOrgEx( HDC32 hDC, LPPOINT32 lpp )
+BOOL32 WINAPI GetDCOrgEx( HDC32 hDC, LPPOINT32 lpp )
 {
-    DC * dc = (DC *) GDI_GetObjPtr( hDC, DC_MAGIC );
-    if (!dc || !lpp) return FALSE;
+    DC * dc;
+    if (!lpp) return FALSE;
+    if (!(dc = (DC *) GDI_GetObjPtr( hDC, DC_MAGIC ))) return FALSE;
 
     if (!(dc->w.flags & DC_MEMORY))
     {
@@ -935,6 +994,7 @@
     }
     else lpp->x = lpp->y = 0;
     lpp->x += dc->w.DCOrgX; lpp->y += dc->w.DCOrgY;
+    GDI_HEAP_UNLOCK( hDC );
     return TRUE;
 }
 
@@ -942,7 +1002,7 @@
 /***********************************************************************
  *           GetDCOrg    (GDI.79)
  */
-DWORD GetDCOrg( HDC16 hdc )
+DWORD WINAPI GetDCOrg( HDC16 hdc )
 {
     POINT32	pt;
     if( GetDCOrgEx( hdc, &pt) )
@@ -954,7 +1014,7 @@
 /***********************************************************************
  *           SetDCOrg    (GDI.117)
  */
-DWORD SetDCOrg( HDC16 hdc, INT16 x, INT16 y )
+DWORD WINAPI SetDCOrg( HDC16 hdc, INT16 x, INT16 y )
 {
     DWORD prevOrg;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -962,6 +1022,7 @@
     prevOrg = dc->w.DCOrgX | (dc->w.DCOrgY << 16);
     dc->w.DCOrgX = x;
     dc->w.DCOrgY = y;
+    GDI_HEAP_UNLOCK( hdc );
     return prevOrg;
 }
 
@@ -969,7 +1030,7 @@
 /***********************************************************************
  *           SetDCHook   (GDI.190)
  */
-BOOL16 SetDCHook( HDC16 hdc, FARPROC16 hookProc, DWORD dwHookData )
+BOOL16 WINAPI SetDCHook( HDC16 hdc, FARPROC16 hookProc, DWORD dwHookData )
 {
     DC *dc = (DC *)GDI_GetObjPtr( hdc, DC_MAGIC );
 
@@ -979,6 +1040,7 @@
     if (!dc) return FALSE;
     dc->hookProc = hookProc;
     dc->dwHookData = dwHookData;
+    GDI_HEAP_UNLOCK( hdc );
     return TRUE;
 }
 
@@ -986,11 +1048,12 @@
 /***********************************************************************
  *           GetDCHook   (GDI.191)
  */
-DWORD GetDCHook( HDC16 hdc, FARPROC16 *phookProc )
+DWORD WINAPI GetDCHook( HDC16 hdc, FARPROC16 *phookProc )
 {
     DC *dc = (DC *)GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
     *phookProc = dc->hookProc;
+    GDI_HEAP_UNLOCK( hdc );
     return dc->dwHookData;
 }
 
@@ -998,7 +1061,7 @@
 /***********************************************************************
  *           SetHookFlags       (GDI.192)
  */
-WORD SetHookFlags(HDC16 hDC, WORD flags)
+WORD WINAPI SetHookFlags(HDC16 hDC, WORD flags)
 {
   DC* dc = (DC*)GDI_GetObjPtr( hDC, DC_MAGIC );
 
@@ -1016,6 +1079,7 @@
             dc->w.flags |= DC_DIRTY;
         else if( flags & DCHF_VALIDATEVISRGN || !flags )
             dc->w.flags &= ~DC_DIRTY;
+	GDI_HEAP_UNLOCK( hDC );
         return wRet;
     }
   return 0;
diff --git a/objects/dcvalues.c b/objects/dcvalues.c
index 9ea8221..df7de09 100644
--- a/objects/dcvalues.c
+++ b/objects/dcvalues.c
@@ -10,7 +10,7 @@
 
 
 #define DC_GET_VAL_16( func_type, func_name, dc_field ) \
-func_type func_name( HDC16 hdc ) \
+func_type WINAPI func_name( HDC16 hdc ) \
 { \
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
     if (!dc) return 0; \
@@ -18,7 +18,7 @@
 }
 
 #define DC_GET_VAL_32( func_type, func_name, dc_field ) \
-func_type func_name( HDC32 hdc ) \
+func_type WINAPI func_name( HDC32 hdc ) \
 { \
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
     if (!dc) return 0; \
@@ -26,7 +26,7 @@
 }
 
 #define DC_GET_X_Y( func_type, func_name, ret_x, ret_y ) \
-func_type func_name( HDC16 hdc ) \
+func_type WINAPI func_name( HDC16 hdc ) \
 { \
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
     if (!dc) return 0; \
@@ -34,7 +34,7 @@
 }
 
 #define DC_GET_VAL_EX( func_name, ret_x, ret_y ) \
-BOOL16 func_name##16( HDC16 hdc, LPPOINT16 pt ) \
+BOOL16 WINAPI func_name##16( HDC16 hdc, LPPOINT16 pt ) \
 { \
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
     if (!dc) return FALSE; \
@@ -43,7 +43,7 @@
     return TRUE; \
 } \
  \
-BOOL32 func_name##32( HDC32 hdc, LPPOINT32 pt ) \
+BOOL32 WINAPI func_name##32( HDC32 hdc, LPPOINT32 pt ) \
 { \
     DC * dc = (DC *) GDI_GetObjPtr( (HDC16)hdc, DC_MAGIC ); \
     if (!dc) return FALSE; \
@@ -53,7 +53,7 @@
 }
 
 #define DC_SET_MODE_16( func_name, dc_field, min_val, max_val, meta_func ) \
-INT16 func_name( HDC16 hdc, INT16 mode ) \
+INT16 WINAPI func_name( HDC16 hdc, INT16 mode ) \
 { \
     INT16 prevMode; \
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
@@ -70,7 +70,7 @@
 }
 
 #define DC_SET_MODE_32( func_name, dc_field, min_val, max_val, meta_func ) \
-INT32 func_name( HDC32 hdc, INT32 mode ) \
+INT32 WINAPI func_name( HDC32 hdc, INT32 mode ) \
 { \
     INT32 prevMode; \
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
diff --git a/objects/dib.c b/objects/dib.c
index 433cf71..9746225 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -18,8 +18,31 @@
 
 extern void CLIPPING_UpdateGCRegion(DC* );
 
-static int	bitmapDepthTable[] = { 8, 1, 32, 16, 24, 15, 4, 0 };
-static int	ximageDepthTable[] = { 0, 0, 0,  0,  0,  0,  0 };
+static int bitmapDepthTable[] = { 8, 1, 32, 16, 24, 15, 4, 0 };
+static int ximageDepthTable[] = { 0, 0, 0,  0,  0,  0,  0 };
+
+
+/* This structure holds the arguments for DIB_SetImageBits() */
+typedef struct
+{
+    DC               *dc;
+    LPCVOID           bits;
+    DWORD             lines;
+    DWORD             infoWidth;
+    WORD              depth;
+    WORD              infoBpp;
+    const BITMAPINFO *info;
+    WORD              coloruse;
+    Drawable          drawable;
+    GC                gc;
+    int               xSrc;
+    int               ySrc;
+    int               xDest;
+    int               yDest;
+    int               width;
+    int               height;
+} DIB_SETIMAGEBITS_DESCR;
+
 
 /***********************************************************************
  *           DIB_Init
@@ -152,7 +175,7 @@
  * for a 24-bit deep bitmap.
  */
 static int *DIB_BuildColorMap( DC *dc, WORD coloruse, WORD depth,
-                               BITMAPINFO *info )
+                               const BITMAPINFO *info )
 {
     int i, colors;
     BOOL32 isInfo;
@@ -217,18 +240,20 @@
  *
  * SetDIBits for a 1-bit deep DIB.
  */
-static void DIB_SetImageBits_1( DWORD lines, BYTE *bits, DWORD width,
+static void DIB_SetImageBits_1( DWORD lines, const BYTE *srcbits,
+                                DWORD srcwidth, DWORD dstwidth,
                                 int *colors, XImage *bmpImage )
 {
     DWORD i, x;
-    BYTE pad, pix;
+    BYTE pix;
+    const BYTE *bits = srcbits;
 
-    if (!(width & 31)) pad = 0;
-    else pad = ((32 - (width & 31)) + 7) / 8;
+    /* 32 bit aligned */
+    DWORD linebytes = ((srcwidth + 31) & ~31) / 8;
 
     while (lines--)
     {
-	for (i = width/8, x = 0; (i > 0); i--)
+	for (i = dstwidth/8, x = 0; (i > 0); i--)
 	{
 	    pix = *bits++;
 	    XPutPixel( bmpImage, x++, lines, colors[pix >> 7] );
@@ -241,7 +266,7 @@
 	    XPutPixel( bmpImage, x++, lines, colors[pix & 1] );
 	}
 	pix = *bits;
-	switch(width & 7)
+	switch(dstwidth & 7)
 	{
 	case 7: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
 	case 6: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
@@ -251,7 +276,8 @@
 	case 2: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
 	case 1: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] );
 	}
-	bits += pad;
+	srcbits += linebytes;
+	bits	 = srcbits;
     }
 }
 
@@ -261,25 +287,27 @@
  *
  * SetDIBits for a 4-bit deep DIB.
  */
-static void DIB_SetImageBits_4( DWORD lines, BYTE *bits, DWORD width,
+static void DIB_SetImageBits_4( DWORD lines, const BYTE *srcbits,
+                                DWORD srcwidth, DWORD dstwidth,
                                 int *colors, XImage *bmpImage )
 {
     DWORD i, x;
-    BYTE pad;
-
-    if (!(width & 7)) pad = 0;
-    else pad = ((8 - (width & 7)) + 1) / 2;
+    const BYTE *bits = srcbits;
+  
+    /* 32 bit aligned */
+    DWORD linebytes = ((srcwidth+7)&~7)/2;
 
     while (lines--)
     {
-	for (i = width/2, x = 0; i > 0; i--)
+	for (i = srcwidth/2, x = 0; i > 0; i--)
 	{
 	    BYTE pix = *bits++;
 	    XPutPixel( bmpImage, x++, lines, colors[pix >> 4] );
 	    XPutPixel( bmpImage, x++, lines, colors[pix & 0x0f] );
 	}
-	if (width & 1) XPutPixel( bmpImage, x, lines, colors[*bits >> 4] );
-	bits += pad;
+        if (srcwidth & 1) XPutPixel( bmpImage, x, lines, colors[*bits >> 4] );
+        srcbits += linebytes;
+        bits	 = srcbits;
     }
 }
 
@@ -295,11 +323,11 @@
  *
  * SetDIBits for a 4-bit deep compressed DIB.
  */
-static void DIB_SetImageBits_RLE4( DWORD lines, BYTE *bits, DWORD width,
-                                   int *colors, XImage *bmpImage )
+static void DIB_SetImageBits_RLE4( DWORD lines, const BYTE *bits, DWORD width,
+                                DWORD dstwidth, int *colors, XImage *bmpImage )
 {
 	int x = 0, c, length;
-	BYTE *begin = bits;
+	const BYTE *begin = bits;
 
         lines--;
 	while ((int)lines >= 0)
@@ -355,17 +383,22 @@
  *
  * SetDIBits for an 8-bit deep DIB.
  */
-static void DIB_SetImageBits_8( DWORD lines, BYTE *bits, DWORD width,
+static void DIB_SetImageBits_8( DWORD lines, const BYTE *srcbits,
+                                DWORD srcwidth, DWORD dstwidth,
                                 int *colors, XImage *bmpImage )
 {
     DWORD x;
-    BYTE pad = (4 - (width & 3)) & 3;
+    const BYTE *bits = srcbits;
+
+    /* align to 32 bit */
+    DWORD linebytes = (srcwidth + 3) & ~3;
 
     while (lines--)
     {
-	for (x = 0; x < width; x++)
+	for (x = 0; x < dstwidth; x++)
 	    XPutPixel( bmpImage, x, lines, colors[*bits++] );
-	bits += pad;
+        srcbits += linebytes;
+        bits     = srcbits;
     }
 }
 
@@ -400,12 +433,12 @@
   RleDelta	= 2		/* Delta */
 };
   
-static void DIB_SetImageBits_RLE8( DWORD lines, BYTE *bits, DWORD width,
-                                   int *colors, XImage *bmpImage )
+static void DIB_SetImageBits_RLE8( DWORD lines, const BYTE *bits, DWORD width,
+                                DWORD dstwidth, int *colors, XImage *bmpImage )
 {
     int x;			/* X-positon on each line.  Increases. */
     int line;			/* Line #.  Starts at lines-1, decreases */
-    BYTE *pIn = bits;		/* Pointer to current position in bits */
+    const BYTE *pIn = bits;     /* Pointer to current position in bits */
     BYTE length;		/* The length pf a run */
     BYTE color_index;		/* index into colors[] as read from bits */
     BYTE escape_code;		/* See enum Rle8_EscapeCodes.*/
@@ -553,21 +586,25 @@
  *
  * SetDIBits for a 24-bit deep DIB.
  */
-static void DIB_SetImageBits_24( DWORD lines, BYTE *bits, DWORD width,
+static void DIB_SetImageBits_24( DWORD lines, const BYTE *srcbits,
+                                 DWORD srcwidth, DWORD dstwidth,
 				 DC *dc, XImage *bmpImage )
 {
     DWORD x;
-    BYTE pad = (4 - ((width*3) & 3)) & 3;
+    const BYTE *bits = srcbits;
+  
+    /* align to 32 bit */
+    DWORD linebytes = (srcwidth * 3 + 3) & ~3;
 
     /* "bits" order is reversed for some reason */
 
     while (lines--)
     {
-	for (x = 0; x < width; x++, bits += 3)
+	for (x = 0; x < dstwidth; x++, bits += 3)
 	    XPutPixel( bmpImage, x, lines, 
 		       COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])) );
 
-	bits += pad;
+        bits = (srcbits += linebytes);
     }
 }
 
@@ -578,70 +615,68 @@
  * Transfer the bits to an X image.
  * Helper function for SetDIBits() and SetDIBitsToDevice().
  */
-static int DIB_SetImageBits( DC *dc, DWORD lines, WORD depth, LPSTR bits,
-                             DWORD infoWidth, WORD infoBpp,
-                             BITMAPINFO *info, WORD coloruse,
-			     Drawable drawable, GC gc, int xSrc, int ySrc,
-			     int xDest, int yDest, int width, int height )
+static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
 {
     int *colorMapping;
     XImage *bmpImage;
     DWORD compression = 0;
 
-    if (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
-        compression = info->bmiHeader.biCompression;
+    if (descr->info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
+        compression = descr->info->bmiHeader.biCompression;
 
       /* Build the color mapping table */
 
-    if (infoBpp > 8) {
-	    	colorMapping = NULL;
-    } else {
-        if (!(colorMapping = DIB_BuildColorMap( dc, coloruse, depth, info )))
-            return 0;
-    }
+    if (descr->infoBpp > 8) colorMapping = NULL;
+    else if (!(colorMapping = DIB_BuildColorMap( descr->dc, descr->coloruse,
+                                                 descr->depth, descr->info )))
+        return 0;
 
-    if( dc->w.flags & DC_DIRTY ) CLIPPING_UpdateGCRegion(dc);
+    if( descr->dc->w.flags & DC_DIRTY ) CLIPPING_UpdateGCRegion(descr->dc);
 
       /* Transfer the pixels */
-    XCREATEIMAGE(bmpImage, infoWidth, lines, depth );
+    XCREATEIMAGE(bmpImage, descr->infoWidth, descr->lines, descr->depth );
 
-    switch(infoBpp)
+    switch(descr->infoBpp)
     {
     case 1:
-	DIB_SetImageBits_1( lines, bits, infoWidth,
-			    colorMapping, bmpImage );
+	DIB_SetImageBits_1( descr->lines, descr->bits, descr->infoWidth,
+			    descr->width, colorMapping, bmpImage );
 	break;
     case 4:
-	if (compression) DIB_SetImageBits_RLE4( lines, bits, infoWidth,
+	if (compression) DIB_SetImageBits_RLE4( descr->lines, descr->bits,
+                                                descr->infoWidth, descr->width,
                                                 colorMapping, bmpImage );
-	else DIB_SetImageBits_4( lines, bits, infoWidth,
-                                 colorMapping, bmpImage );
+	else DIB_SetImageBits_4( descr->lines, descr->bits, descr->infoWidth,
+                                 descr->width, colorMapping, bmpImage );
 	break;
     case 8:
-	if (compression) DIB_SetImageBits_RLE8( lines, bits, infoWidth,
+	if (compression) DIB_SetImageBits_RLE8( descr->lines, descr->bits,
+                                                descr->infoWidth, descr->width,
                                                 colorMapping, bmpImage );
-	else DIB_SetImageBits_8( lines, bits, infoWidth,
-                                 colorMapping, bmpImage );
+	else DIB_SetImageBits_8( descr->lines, descr->bits, descr->infoWidth,
+                                 descr->width, colorMapping, bmpImage );
 	break;
     case 24:
-	DIB_SetImageBits_24( lines, bits, infoWidth, dc, bmpImage );
+	DIB_SetImageBits_24( descr->lines, descr->bits, descr->infoWidth,
+                             descr->width, descr->dc, bmpImage );
 	break;
     default:
-        fprintf( stderr, "Invalid depth %d for SetDIBits!\n", infoBpp );
+        fprintf( stderr, "Invalid depth %d for SetDIBits!\n", descr->infoBpp );
         break;
     }
     if (colorMapping) free(colorMapping);
-    XPutImage( display, drawable, gc, bmpImage, xSrc, ySrc,
-	       xDest, yDest, width, height );
+    XPutImage( display, descr->drawable, descr->gc, bmpImage,
+               descr->xSrc, descr->ySrc, descr->xDest, descr->yDest,
+               descr->width, descr->height );
     XDestroyImage( bmpImage );
-    return lines;
+    return descr->lines;
 }
 
 
 /***********************************************************************
  *           StretchDIBits16   (GDI.439)
  */
-INT16 StretchDIBits16( HDC16 hdc, INT16 xDst, INT16 yDst, INT16 widthDst,
+INT16 WINAPI StretchDIBits16(HDC16 hdc, INT16 xDst, INT16 yDst, INT16 widthDst,
                        INT16 heightDst, INT16 xSrc, INT16 ySrc, INT16 widthSrc,
                        INT16 heightSrc, const VOID *bits,
                        const BITMAPINFO *info, UINT16 wUsage, DWORD dwRop )
@@ -655,7 +690,7 @@
 /***********************************************************************
  *           StretchDIBits32   (GDI32.351)
  */
-INT32 StretchDIBits32( HDC32 hdc, INT32 xDst, INT32 yDst, INT32 widthDst,
+INT32 WINAPI StretchDIBits32(HDC32 hdc, INT32 xDst, INT32 yDst, INT32 widthDst,
                        INT32 heightDst, INT32 xSrc, INT32 ySrc, INT32 widthSrc,
                        INT32 heightSrc, const void *bits,
                        const BITMAPINFO *info, UINT32 wUsage, DWORD dwRop )
@@ -679,9 +714,9 @@
 /***********************************************************************
  *           SetDIBits16    (GDI.440)
  */
-INT16 SetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan,
-                   UINT16 lines, LPCVOID bits, const BITMAPINFO *info,
-                   UINT16 coloruse )
+INT16 WINAPI SetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan,
+                          UINT16 lines, LPCVOID bits, const BITMAPINFO *info,
+                          UINT16 coloruse )
 {
     return SetDIBits32( hdc, hbitmap, startscan, lines, bits, info, coloruse );
 }
@@ -690,43 +725,68 @@
 /***********************************************************************
  *           SetDIBits32   (GDI32.312)
  */
-INT32 SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
-                   UINT32 lines, LPCVOID bits, const BITMAPINFO *info,
-                   UINT32 coloruse )
+INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
+                          UINT32 lines, LPCVOID bits, const BITMAPINFO *info,
+                          UINT32 coloruse )
 {
-    DC * dc;
+    DIB_SETIMAGEBITS_DESCR descr;
     BITMAPOBJ * bmp;
-    DWORD width, height;
-    WORD bpp;
+    DWORD height;
+    INT32 result;
 
       /* Check parameters */
 
-    dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) 
+    descr.dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    if (!descr.dc) 
     {
-	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
-	if (!dc) return 0;
+	descr.dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!descr.dc) return 0;
     }
     if (!(bmp = (BITMAPOBJ *)GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
-	return 0;
-    if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height, &bpp ) == -1)
+    {
+        GDI_HEAP_UNLOCK( hdc );
         return 0;
-    if (!lines || (startscan >= (WORD)height)) return 0;
+    }
+    if (DIB_GetBitmapInfo( &info->bmiHeader, &descr.infoWidth, &height,
+                           &descr.infoBpp ) == -1)
+    {
+        GDI_HEAP_UNLOCK( hbitmap );
+        GDI_HEAP_UNLOCK( hdc );
+        return 0;
+    }
+    if (!lines || (startscan >= height))
+    {
+        GDI_HEAP_UNLOCK( hbitmap );
+        GDI_HEAP_UNLOCK( hdc );
+        return 0;
+    }
     if (startscan + lines > height) lines = height - startscan;
 
-    return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 16,
-                                dc, lines, bmp->bitmap.bmBitsPixel,
-                                bits, width, bpp, info,
-                                coloruse, bmp->pixmap, BITMAP_GC(bmp), 0, 0, 0,
-                                height - startscan - lines,
-                                bmp->bitmap.bmWidth, lines );
+    descr.bits      = bits;
+    descr.lines     = lines;
+    descr.depth     = bmp->bitmap.bmBitsPixel;
+    descr.info      = info;
+    descr.coloruse  = coloruse;
+    descr.drawable  = bmp->pixmap;
+    descr.gc        = BITMAP_GC(bmp);
+    descr.xSrc      = 0;
+    descr.ySrc      = 0;
+    descr.xDest     = 0;
+    descr.yDest     = height - startscan - lines;
+    descr.width     = bmp->bitmap.bmWidth;
+    descr.height    = lines;
+
+    result = CALL_LARGE_STACK( DIB_SetImageBits, &descr );
+    GDI_HEAP_UNLOCK( hdc );
+    GDI_HEAP_UNLOCK( hbitmap );
+    return result;
 }
 
 
 /***********************************************************************
  *           SetDIBitsToDevice16    (GDI.443)
  */
-INT16 SetDIBitsToDevice16( HDC16 hdc, INT16 xDest, INT16 yDest, INT16 cx,
+INT16 WINAPI SetDIBitsToDevice16(HDC16 hdc, INT16 xDest, INT16 yDest, INT16 cx,
                            INT16 cy, INT16 xSrc, INT16 ySrc, UINT16 startscan,
                            UINT16 lines, LPCVOID bits, const BITMAPINFO *info,
                            UINT16 coloruse )
@@ -739,14 +799,14 @@
 /***********************************************************************
  *           SetDIBitsToDevice32   (GDI32.313)
  */
-INT32 SetDIBitsToDevice32( HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
+INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
                            DWORD cy, INT32 xSrc, INT32 ySrc, UINT32 startscan,
                            UINT32 lines, LPCVOID bits, const BITMAPINFO *info,
                            UINT32 coloruse )
 {
+    DIB_SETIMAGEBITS_DESCR descr;
     DC * dc;
     DWORD width, height;
-    WORD bpp;
 
       /* Check parameters */
 
@@ -756,7 +816,8 @@
 	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
 	if (!dc) return 0;
     }
-    if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height, &bpp ) == -1)
+    if (DIB_GetBitmapInfo( &info->bmiHeader, &width,
+                           &height, &descr.infoBpp ) == -1)
         return 0;
     if (!lines || (startscan >= height)) return 0;
     if (startscan + lines > height) lines = height - startscan;
@@ -769,14 +830,24 @@
 
     DC_SetupGCForText( dc );  /* To have the correct colors */
     XSetFunction( display, dc->u.x.gc, DC_XROPfunction[dc->w.ROPmode-1] );
-    return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 16,
-                                dc, lines, dc->w.bitsPerPixel, bits, width,
-                                bpp, info, coloruse,
-                                dc->u.x.drawable, dc->u.x.gc,
-                                xSrc, ySrc - startscan,
-                                dc->w.DCOrgX + XLPTODP( dc, xDest ),
-                                dc->w.DCOrgY + YLPTODP( dc, yDest ),
-                                cx, cy );
+
+    descr.dc        = dc;
+    descr.bits      = bits;
+    descr.lines     = lines;
+    descr.infoWidth = width;
+    descr.depth     = dc->w.bitsPerPixel;
+    descr.info      = info;
+    descr.coloruse  = coloruse;
+    descr.drawable  = dc->u.x.drawable;
+    descr.gc        = dc->u.x.gc;
+    descr.xSrc      = xSrc;
+    descr.ySrc      = ySrc - startscan;
+    descr.xDest     = dc->w.DCOrgX + XLPTODP( dc, xDest );
+    descr.yDest     = dc->w.DCOrgY + YLPTODP( dc, yDest );
+    descr.width     = cx;
+    descr.height    = cy;
+
+    return CALL_LARGE_STACK( DIB_SetImageBits, &descr );
 }
 
 
@@ -784,9 +855,9 @@
 /***********************************************************************
  *           GetDIBits16    (GDI.441)
  */
-INT16 GetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan,
-                   UINT16 lines, LPSTR bits, BITMAPINFO * info,
-                   UINT16 coloruse )
+INT16 WINAPI GetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan,
+                          UINT16 lines, LPSTR bits, BITMAPINFO * info,
+                          UINT16 coloruse )
 {
     return GetDIBits32( hdc, hbitmap, startscan, lines, bits, info, coloruse );
 }
@@ -797,9 +868,9 @@
  *
  * http://www.microsoft.com/msdn/sdk/platforms/doc/sdk/win32/func/src/f30_14.htm
  */
-INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
-                   UINT32 lines, LPSTR bits, BITMAPINFO * info,
-                   UINT32 coloruse )
+INT32 WINAPI GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
+                          UINT32 lines, LPSTR bits, BITMAPINFO * info,
+                          UINT32 coloruse )
 {
     DC * dc;
     BITMAPOBJ * bmp;
@@ -818,7 +889,10 @@
     if (!(bmp = (BITMAPOBJ *)GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
 	return 0;
     if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC )))
-	return 0;
+    {
+        GDI_HEAP_UNLOCK( hbitmap );
+        return 0;
+    }
 
       /* Transfer color info */
     
@@ -851,7 +925,11 @@
 	if( lines > info->bmiHeader.biHeight ) lines = info->bmiHeader.biHeight;
 	yend = startscan + lines;
 	if( startscan >= bmp->bitmap.bmHeight ) 
-	    return FALSE;
+        {
+            GDI_HEAP_UNLOCK( hbitmap );
+            GDI_HEAP_UNLOCK( dc->w.hPalette );
+            return FALSE;
+        }
 	if( yend > bmp->bitmap.bmHeight ) yend = bmp->bitmap.bmHeight;
 
 	/* adjust scanline width */
@@ -861,12 +939,11 @@
 	{
 	    /* bitmap is wider than DIB, copy only a part */
 
-	    pad = 0; xend = info->bmiHeader.biWidth;
+	    pad = 0;
+            xend = info->bmiHeader.biWidth;
 	}
 
-	bmpImage = (XImage *)CallTo32_LargeStack( (int (*)())XGetImage, 8, 
-		               display, bmp->pixmap, 0, 0, bmp->bitmap.bmWidth,
-		               bmp->bitmap.bmHeight, AllPlanes, ZPixmap );
+	bmpImage = (XImage *)CALL_LARGE_STACK( BITMAP_GetXImage, bmp );
 
 	switch( info->bmiHeader.biBitCount )
 	{
@@ -965,6 +1042,8 @@
 	info->bmiHeader.biCompression = 0;
     }
 
+    GDI_HEAP_UNLOCK( hbitmap );
+    GDI_HEAP_UNLOCK( dc->w.hPalette );
     return lines;
 }
 
@@ -972,7 +1051,7 @@
 /***********************************************************************
  *           CreateDIBitmap16    (GDI.442)
  */
-HBITMAP16 CreateDIBitmap16( HDC16 hdc, const BITMAPINFOHEADER * header,
+HBITMAP16 WINAPI CreateDIBitmap16( HDC16 hdc, const BITMAPINFOHEADER * header,
                             DWORD init, LPCVOID bits, const BITMAPINFO * data,
                             UINT16 coloruse )
 {
@@ -983,7 +1062,7 @@
 /***********************************************************************
  *           CreateDIBitmap32    (GDI32.37)
  */
-HBITMAP32 CreateDIBitmap32( HDC32 hdc, const BITMAPINFOHEADER *header,
+HBITMAP32 WINAPI CreateDIBitmap32( HDC32 hdc, const BITMAPINFOHEADER *header,
                             DWORD init, LPCVOID bits, const BITMAPINFO *data,
                             UINT32 coloruse )
 {
diff --git a/objects/font.c b/objects/font.c
index 75dcf63..216962f 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -177,7 +177,7 @@
 /***********************************************************************
  *           CreateFontIndirect16   (GDI.57)
  */
-HFONT16 CreateFontIndirect16( const LOGFONT16 *font )
+HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *font )
 {
     HFONT16 hFont = 0;
 
@@ -187,7 +187,7 @@
 	if( hFont )
 	{
 	    FONTOBJ* fontPtr;
-	    fontPtr = (FONTOBJ *) GDI_HEAP_LIN_ADDR( hFont );
+	    fontPtr = (FONTOBJ *) GDI_HEAP_LOCK( hFont );
 	    memcpy( &fontPtr->logfont, font, sizeof(LOGFONT16) );
 
 	    dprintf_font(stddeb,"CreateFontIndirect(%i %i) '%s' %s %s => %04x\n",
@@ -196,6 +196,7 @@
 				 font->lfWeight > 400 ? "Bold" : "",
 				 font->lfItalic ? "Italic" : "",
 				 hFont);
+	    GDI_HEAP_UNLOCK( hFont );
 	}
     }
     else fprintf(stderr,"CreateFontIndirect(NULL) => NULL\n");
@@ -206,7 +207,7 @@
 /***********************************************************************
  *           CreateFontIndirect32A   (GDI32.44)
  */
-HFONT32 CreateFontIndirect32A( const LOGFONT32A *font )
+HFONT32 WINAPI CreateFontIndirect32A( const LOGFONT32A *font )
 {
     LOGFONT16 font16;
 
@@ -217,7 +218,7 @@
 /***********************************************************************
  *           CreateFontIndirect32W   (GDI32.45)
  */
-HFONT32 CreateFontIndirect32W( const LOGFONT32W *font )
+HFONT32 WINAPI CreateFontIndirect32W( const LOGFONT32W *font )
 {
     LOGFONT16 font16;
 
@@ -228,10 +229,11 @@
 /***********************************************************************
  *           CreateFont16    (GDI.56)
  */
-HFONT16 CreateFont16( INT16 height, INT16 width, INT16 esc, INT16 orient,
-                      INT16 weight, BYTE italic, BYTE underline,
-                      BYTE strikeout, BYTE charset, BYTE outpres,
-                      BYTE clippres, BYTE quality, BYTE pitch, LPCSTR name )
+HFONT16 WINAPI CreateFont16(INT16 height, INT16 width, INT16 esc, INT16 orient,
+                            INT16 weight, BYTE italic, BYTE underline,
+                            BYTE strikeout, BYTE charset, BYTE outpres,
+                            BYTE clippres, BYTE quality, BYTE pitch,
+                            LPCSTR name )
 {
     LOGFONT16 logfont = { height, width, esc, orient, weight, italic, underline,
                           strikeout, charset, outpres, clippres, quality, pitch, };
@@ -247,10 +249,11 @@
 /*************************************************************************
  *           CreateFont32A    (GDI32.43)
  */
-HFONT32 CreateFont32A( INT32 height, INT32 width, INT32 esc, INT32 orient,
-                       INT32 weight, DWORD italic, DWORD underline,
-                       DWORD strikeout, DWORD charset, DWORD outpres,
-                       DWORD clippres, DWORD quality, DWORD pitch, LPCSTR name)
+HFONT32 WINAPI CreateFont32A( INT32 height, INT32 width, INT32 esc,
+                              INT32 orient, INT32 weight, DWORD italic,
+                              DWORD underline, DWORD strikeout, DWORD charset,
+                              DWORD outpres, DWORD clippres, DWORD quality,
+                              DWORD pitch, LPCSTR name )
 {
     return (HFONT32)CreateFont16( height, width, esc, orient, weight, italic,
                                   underline, strikeout, charset, outpres,
@@ -260,11 +263,11 @@
 /*************************************************************************
  *           CreateFont32W    (GDI32.46)
  */
-HFONT32 CreateFont32W( INT32 height, INT32 width, INT32 esc, INT32 orient,
-                       INT32 weight, DWORD italic, DWORD underline,
-                       DWORD strikeout, DWORD charset, DWORD outpres,
-                       DWORD clippres, DWORD quality, DWORD pitch,
-                       LPCWSTR name )
+HFONT32 WINAPI CreateFont32W( INT32 height, INT32 width, INT32 esc,
+                              INT32 orient, INT32 weight, DWORD italic,
+                              DWORD underline, DWORD strikeout, DWORD charset,
+                              DWORD outpres, DWORD clippres, DWORD quality,
+                              DWORD pitch, LPCWSTR name )
 {
     LPSTR namea = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
     HFONT32 ret = (HFONT32)CreateFont16( height, width, esc, orient, weight,
@@ -358,7 +361,9 @@
 /***********************************************************************
  *              EnumFontFamiliesEx16	(GDI.613)
  */
-INT16 EnumFontFamiliesEx16( HDC16 hDC, LPLOGFONT16 plf, FONTENUMPROCEX16 efproc, LPARAM lParam, DWORD dwFlags)
+INT16 WINAPI EnumFontFamiliesEx16( HDC16 hDC, LPLOGFONT16 plf,
+                                   FONTENUMPROCEX16 efproc, LPARAM lParam,
+                                   DWORD dwFlags)
 {
     INT16	retVal = 0;
     DC* 	dc = (DC*) GDI_GetObjPtr( hDC, DC_MAGIC );
@@ -419,8 +424,9 @@
 /***********************************************************************
  *              EnumFontFamiliesEx32W	(GDI32.82)
  */
-INT32 EnumFontFamiliesEx32W( HDC32 hDC, LPLOGFONT32W plf, FONTENUMPROCEX32W efproc, 
-					LPARAM lParam, DWORD dwFlags )
+INT32 WINAPI EnumFontFamiliesEx32W( HDC32 hDC, LPLOGFONT32W plf,
+                                    FONTENUMPROCEX32W efproc, 
+                                    LPARAM lParam, DWORD dwFlags )
 {
     return  FONT_EnumFontFamiliesEx32( hDC, plf, (FONTENUMPROC32W)efproc, 
 						  lParam, ENUM_UNICODE );
@@ -429,8 +435,9 @@
 /***********************************************************************
  *              EnumFontFamiliesEx32A	(GDI32.81)
  */
-INT32 EnumFontFamiliesEx32A( HDC32 hDC, LPLOGFONT32A plf, FONTENUMPROCEX32A efproc, 
-					LPARAM lParam, DWORD dwFlags)
+INT32 WINAPI EnumFontFamiliesEx32A( HDC32 hDC, LPLOGFONT32A plf,
+                                    FONTENUMPROCEX32A efproc, 
+                                    LPARAM lParam, DWORD dwFlags)
 {
     return  FONT_EnumFontFamiliesEx32( hDC, (LPLOGFONT32W)plf, 
 				      (FONTENUMPROC32W)efproc, lParam, 0);
@@ -439,7 +446,8 @@
 /***********************************************************************
  *              EnumFontFamilies16	(GDI.330)
  */
-INT16 EnumFontFamilies16( HDC16 hDC, LPCSTR lpFamily, FONTENUMPROC16 efproc, LPARAM lpData )
+INT16 WINAPI EnumFontFamilies16( HDC16 hDC, LPCSTR lpFamily,
+                                 FONTENUMPROC16 efproc, LPARAM lpData )
 {
     LOGFONT16	lf;
 
@@ -453,7 +461,8 @@
 /***********************************************************************
  *              EnumFontFamilies32A	(GDI32.80)
  */
-INT32 EnumFontFamilies32A( HDC32 hDC, LPCSTR lpFamily, FONTENUMPROC32A efproc, LPARAM lpData )
+INT32 WINAPI EnumFontFamilies32A( HDC32 hDC, LPCSTR lpFamily,
+                                  FONTENUMPROC32A efproc, LPARAM lpData )
 {
     LOGFONT32A	lf;
 
@@ -468,7 +477,8 @@
 /***********************************************************************
  *              EnumFontFamilies32W	(GDI32.83)
  */
-INT32 EnumFontFamilies32W( HDC32 hDC, LPCWSTR lpFamily, FONTENUMPROC32W efproc, LPARAM lpData )
+INT32 WINAPI EnumFontFamilies32W( HDC32 hDC, LPCWSTR lpFamily,
+                                  FONTENUMPROC32W efproc, LPARAM lpData )
 {
     LOGFONT32W  lf;
 
@@ -482,7 +492,8 @@
 /***********************************************************************
  *              EnumFonts16		(GDI.70)
  */
-INT16 EnumFonts16( HDC16 hDC, LPCSTR lpName, FONTENUMPROC16 efproc, LPARAM lpData )
+INT16 WINAPI EnumFonts16( HDC16 hDC, LPCSTR lpName, FONTENUMPROC16 efproc,
+                          LPARAM lpData )
 {
     return EnumFontFamilies16( hDC, lpName, (FONTENUMPROCEX16)efproc, lpData );
 }
@@ -490,7 +501,8 @@
 /***********************************************************************
  *              EnumFonts32A		(GDI32.84)
  */
-INT32 EnumFonts32A( HDC32 hDC, LPCSTR lpName, FONTENUMPROC32A efproc, LPARAM lpData )
+INT32 WINAPI EnumFonts32A( HDC32 hDC, LPCSTR lpName, FONTENUMPROC32A efproc,
+                           LPARAM lpData )
 {
     return EnumFontFamilies32A( hDC, lpName, efproc, lpData );
 }
@@ -498,7 +510,8 @@
 /***********************************************************************
  *              EnumFonts32W		(GDI32.85)
  */
-INT32 EnumFonts32W( HDC32 hDC, LPCWSTR lpName, FONTENUMPROC32W efproc, LPARAM lpData )
+INT32 WINAPI EnumFonts32W( HDC32 hDC, LPCWSTR lpName, FONTENUMPROC32W efproc,
+                           LPARAM lpData )
 {
     return EnumFontFamilies32W( hDC, lpName, efproc, lpData );
 }
@@ -507,7 +520,7 @@
 /***********************************************************************
  *           GetTextCharacterExtra16    (GDI.89)
  */
-INT16 GetTextCharacterExtra16( HDC16 hdc )
+INT16 WINAPI GetTextCharacterExtra16( HDC16 hdc )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
@@ -519,7 +532,7 @@
 /***********************************************************************
  *           GetTextCharacterExtra32    (GDI32.225)
  */
-INT32 GetTextCharacterExtra32( HDC32 hdc )
+INT32 WINAPI GetTextCharacterExtra32( HDC32 hdc )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
@@ -531,7 +544,7 @@
 /***********************************************************************
  *           SetTextCharacterExtra16    (GDI.8)
  */
-INT16 SetTextCharacterExtra16( HDC16 hdc, INT16 extra )
+INT16 WINAPI SetTextCharacterExtra16( HDC16 hdc, INT16 extra )
 {
     return (INT16)SetTextCharacterExtra32( hdc, extra );
 }
@@ -540,7 +553,7 @@
 /***********************************************************************
  *           SetTextCharacterExtra32    (GDI32.337)
  */
-INT32 SetTextCharacterExtra32( HDC32 hdc, INT32 extra )
+INT32 WINAPI SetTextCharacterExtra32( HDC32 hdc, INT32 extra )
 {
     INT32 prev;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -555,7 +568,7 @@
 /***********************************************************************
  *           SetTextJustification16    (GDI.10)
  */
-INT16 SetTextJustification16( HDC16 hdc, INT16 extra, INT16 breaks )
+INT16 WINAPI SetTextJustification16( HDC16 hdc, INT16 extra, INT16 breaks )
 {
     return SetTextJustification32( hdc, extra, breaks );
 }
@@ -564,7 +577,7 @@
 /***********************************************************************
  *           SetTextJustification32    (GDI32.339)
  */
-BOOL32 SetTextJustification32( HDC32 hdc, INT32 extra, INT32 breaks )
+BOOL32 WINAPI SetTextJustification32( HDC32 hdc, INT32 extra, INT32 breaks )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
@@ -590,7 +603,7 @@
 /***********************************************************************
  *           GetTextFace16    (GDI.92)
  */
-INT16 GetTextFace16( HDC16 hdc, INT16 count, LPSTR name )
+INT16 WINAPI GetTextFace16( HDC16 hdc, INT16 count, LPSTR name )
 {
         return GetTextFace32A(hdc,count,name);
 }
@@ -598,7 +611,7 @@
 /***********************************************************************
  *           GetTextFace32A    (GDI32.234)
  */
-INT32 GetTextFace32A( HDC32 hdc, INT32 count, LPSTR name )
+INT32 WINAPI GetTextFace32A( HDC32 hdc, INT32 count, LPSTR name )
 {
     FONTOBJ *font;
 
@@ -607,13 +620,14 @@
     if (!(font = (FONTOBJ *) GDI_GetObjPtr( dc->w.hFont, FONT_MAGIC )))
         return 0;
     lstrcpyn32A( name, font->logfont.lfFaceName, count );
+    GDI_HEAP_UNLOCK( dc->w.hFont );
     return strlen(name);
 }
 
 /***********************************************************************
  *           GetTextFace32W    (GDI32.235)
  */
-INT32 GetTextFace32W( HDC32 hdc, INT32 count, LPWSTR name )
+INT32 WINAPI GetTextFace32W( HDC32 hdc, INT32 count, LPWSTR name )
 {
     LPSTR nameA = HeapAlloc( GetProcessHeap(), 0, count );
     INT32 res = GetTextFace32A(hdc,count,nameA);
@@ -626,7 +640,7 @@
 /***********************************************************************
  *           GetTextExtent    (GDI.91)
  */
-DWORD GetTextExtent( HDC16 hdc, LPCSTR str, INT16 count )
+DWORD WINAPI GetTextExtent( HDC16 hdc, LPCSTR str, INT16 count )
 {
     SIZE16 size;
     if (!GetTextExtentPoint16( hdc, str, count, &size )) return 0;
@@ -641,7 +655,8 @@
  * Original Windows versions of GetTextExtentPoint{A,W} have documented
  * bugs.
  */
-BOOL16 GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count, LPSIZE16 size)
+BOOL16 WINAPI GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count,
+                                    LPSIZE16 size )
 {
     SIZE32 size32;
     BOOL32 ret = GetTextExtentPoint32A( hdc, str, count, &size32 );
@@ -653,8 +668,8 @@
 /***********************************************************************
  *           GetTextExtentPoint32A    (GDI32.230)
  */
-BOOL32 GetTextExtentPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
-                              LPSIZE32 size )
+BOOL32 WINAPI GetTextExtentPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
+                                     LPSIZE32 size )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc)
@@ -676,8 +691,8 @@
 /***********************************************************************
  *           GetTextExtentPoint32W    (GDI32.231)
  */
-BOOL32 GetTextExtentPoint32W( HDC32 hdc, LPCWSTR str, INT32 count,
-                              LPSIZE32 size )
+BOOL32 WINAPI GetTextExtentPoint32W( HDC32 hdc, LPCWSTR str, INT32 count,
+                                     LPSIZE32 size )
 {
     LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
     BOOL32 ret = GetTextExtentPoint32A( hdc, p, count, size );
@@ -689,8 +704,8 @@
 /***********************************************************************
  *           GetTextExtentPoint32ABuggy    (GDI32.232)
  */
-BOOL32 GetTextExtentPoint32ABuggy( HDC32 hdc, LPCSTR str, INT32 count,
-                                   LPSIZE32 size )
+BOOL32 WINAPI GetTextExtentPoint32ABuggy( HDC32 hdc, LPCSTR str, INT32 count,
+                                          LPSIZE32 size )
 {
     dprintf_font( stddeb, "GetTextExtentPoint32ABuggy: not bug compatible.\n");
     return GetTextExtentPoint32A( hdc, str, count, size );
@@ -699,8 +714,8 @@
 /***********************************************************************
  *           GetTextExtentPoint32WBuggy    (GDI32.233)
  */
-BOOL32 GetTextExtentPoint32WBuggy( HDC32 hdc, LPCWSTR str, INT32 count,
-                                   LPSIZE32 size )
+BOOL32 WINAPI GetTextExtentPoint32WBuggy( HDC32 hdc, LPCWSTR str, INT32 count,
+                                          LPSIZE32 size )
 {
     dprintf_font( stddeb, "GetTextExtentPoint32WBuggy: not bug compatible.\n");
     return GetTextExtentPoint32W( hdc, str, count, size );
@@ -710,9 +725,9 @@
 /***********************************************************************
  *           GetTextExtentExPoint32A    (GDI32.228)
  */
-BOOL32 GetTextExtentExPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
-                                INT32 maxExt,LPINT32 lpnFit, LPINT32 alpDx,
-                                LPSIZE32 size )
+BOOL32 WINAPI GetTextExtentExPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
+                                       INT32 maxExt, LPINT32 lpnFit,
+                                       LPINT32 alpDx, LPSIZE32 size )
 {
     int index, nFit, extent;
     SIZE32 tSize;
@@ -752,9 +767,9 @@
  *           GetTextExtentExPoint32W    (GDI32.229)
  */
 
-BOOL32 GetTextExtentExPoint32W( HDC32 hdc, LPCWSTR str, INT32 count,
-                                INT32 maxExt, LPINT32 lpnFit, LPINT32 alpDx,
-                                LPSIZE32 size )
+BOOL32 WINAPI GetTextExtentExPoint32W( HDC32 hdc, LPCWSTR str, INT32 count,
+                                       INT32 maxExt, LPINT32 lpnFit,
+                                       LPINT32 alpDx, LPSIZE32 size )
 {
     LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
     BOOL32 ret = GetTextExtentExPoint32A( hdc, p, count, maxExt,
@@ -766,7 +781,7 @@
 /***********************************************************************
  *           GetTextMetrics16    (GDI.93)
  */
-BOOL16 GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *metrics )
+BOOL16 WINAPI GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *metrics )
 {
     TEXTMETRIC32A tm32;
 
@@ -779,7 +794,7 @@
 /***********************************************************************
  *           GetTextMetrics32A    (GDI32.236)
  */
-BOOL32 GetTextMetrics32A( HDC32 hdc, TEXTMETRIC32A *metrics )
+BOOL32 WINAPI GetTextMetrics32A( HDC32 hdc, TEXTMETRIC32A *metrics )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc)
@@ -791,8 +806,26 @@
     if (!dc->funcs->pGetTextMetrics ||
         !dc->funcs->pGetTextMetrics( dc,metrics ))
         return FALSE;
+    /* map them from device to logic coordinatesystem before returning.
+     * FIXME: should this be in the device driver?
+     */
+#define WDPTOLP(x) ((x<0)?					\
+		(-abs((x)*dc->wndExtX/dc->vportExtX)):		\
+		(abs((x)*dc->wndExtX/dc->vportExtX)))
+#define HDPTOLP(y) ((y<0)?					\
+		(-abs((y)*dc->wndExtY/dc->vportExtY)):		\
+		(abs((y)*dc->wndExtY/dc->vportExtY)))
+	
+    metrics->tmHeight           = HDPTOLP(metrics->tmHeight);
+    metrics->tmAscent           = HDPTOLP(metrics->tmAscent);
+    metrics->tmDescent          = HDPTOLP(metrics->tmDescent);
+    metrics->tmInternalLeading  = HDPTOLP(metrics->tmInternalLeading);
+    metrics->tmExternalLeading  = HDPTOLP(metrics->tmExternalLeading);
+    metrics->tmAveCharWidth     = WDPTOLP(metrics->tmAveCharWidth);
+    metrics->tmMaxCharWidth     = WDPTOLP(metrics->tmMaxCharWidth);
+    metrics->tmOverhang         = WDPTOLP(metrics->tmOverhang);
 
-    dprintf_font(stdnimp,"text metrics:
+    dprintf_font(stddeb,"text metrics:
     Weight = %03i\t FirstChar = %03i\t AveCharWidth = %i
     Italic = % 3i\t LastChar = %03i\t\t MaxCharWidth = %i
     UnderLined = %01i\t DefaultChar = %03i\t Overhang = %i
@@ -819,7 +852,7 @@
 /***********************************************************************
  *           GetTextMetrics32W    (GDI32.237)
  */
-BOOL32 GetTextMetrics32W( HDC32 hdc, TEXTMETRIC32W *metrics )
+BOOL32 WINAPI GetTextMetrics32W( HDC32 hdc, TEXTMETRIC32W *metrics )
 {
     TEXTMETRIC32A tm;
     if (!GetTextMetrics32A( (HDC16)hdc, &tm )) return FALSE;
@@ -831,8 +864,8 @@
 /***********************************************************************
  *           GetCharWidth16    (GDI.350)
  */
-BOOL16 GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
-                       LPINT16 buffer )
+BOOL16 WINAPI GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
+                              LPINT16 buffer )
 {
     BOOL32	retVal = FALSE;
 
@@ -867,8 +900,8 @@
 /***********************************************************************
  *           GetCharWidth32A    (GDI32.155)
  */
-BOOL32 GetCharWidth32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
-                        LPINT32 buffer )
+BOOL32 WINAPI GetCharWidth32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
+                               LPINT32 buffer )
 {
     UINT32 i, extra;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -895,8 +928,8 @@
 /***********************************************************************
  *           GetCharWidth32W    (GDI32.158)
  */
-BOOL32 GetCharWidth32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
-                        LPINT32 buffer )
+BOOL32 WINAPI GetCharWidth32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
+                               LPINT32 buffer )
 {
     return GetCharWidth32A( hdc, firstChar, lastChar, buffer );
 }
@@ -908,7 +941,7 @@
  *
  *           SetMapperFlags16    (GDI.349)
  */
-DWORD SetMapperFlags16( HDC16 hDC, DWORD dwFlag )
+DWORD WINAPI SetMapperFlags16( HDC16 hDC, DWORD dwFlag )
 {
     return SetMapperFlags32( hDC, dwFlag );
 }
@@ -917,19 +950,30 @@
 /***********************************************************************
  *           SetMapperFlags32    (GDI32.322)
  */
-DWORD SetMapperFlags32( HDC32 hDC, DWORD dwFlag )
+DWORD WINAPI SetMapperFlags32( HDC32 hDC, DWORD dwFlag )
 {
     dprintf_font(stdnimp,"SetmapperFlags(%04x, %08lX) // Empty Stub !\n",
                  hDC, dwFlag);
     return 0L;
 }
 
+/***********************************************************************
+ *          GetAspectRatioFilterEx16  (GDI.486)
+ */
+BOOL16 GetAspectRatioFilterEx16( HDC16 hdc, LPVOID pAspectRatio )
+{
+  dprintf_font(stdnimp, 
+      "GetAspectRatioFilterEx(%04x, %p): // Empty Stub !\n",
+	       hdc, pAspectRatio);
+  return FALSE;
+}
+
 
 /***********************************************************************
  *           GetCharABCWidths16   (GDI.307)
  */
-BOOL16 GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
-                           LPABC16 abc )
+BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
+                                  LPABC16 abc )
 {
     ABC32 abc32;
     if (!GetCharABCWidths32A( hdc, firstChar, lastChar, &abc32 )) return FALSE;
@@ -943,8 +987,8 @@
 /***********************************************************************
  *           GetCharABCWidths32A   (GDI32.149)
  */
-BOOL32 GetCharABCWidths32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
-                            LPABC32 abc )
+BOOL32 WINAPI GetCharABCWidths32A(HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
+                                  LPABC32 abc )
 {
     /* No TrueType fonts in Wine so far */
     fprintf( stdnimp, "STUB: GetCharABCWidths(%04x,%04x,%04x,%p)\n",
@@ -956,8 +1000,8 @@
 /***********************************************************************
  *           GetCharABCWidths32W   (GDI32.152)
  */
-BOOL32 GetCharABCWidths32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
-                            LPABC32 abc )
+BOOL32 WINAPI GetCharABCWidths32W(HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
+                                  LPABC32 abc )
 {
     return GetCharABCWidths32A( hdc, firstChar, lastChar, abc );
 }
@@ -966,9 +1010,9 @@
 /***********************************************************************
  *           GetGlyphOutline16    (GDI.309)
  */
-DWORD GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat,
-                         LPGLYPHMETRICS16 lpgm, DWORD cbBuffer,
-                         LPVOID lpBuffer, const MAT2 *lpmat2 )
+DWORD WINAPI GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat,
+                                LPGLYPHMETRICS16 lpgm, DWORD cbBuffer,
+                                LPVOID lpBuffer, const MAT2 *lpmat2 )
 {
     fprintf( stdnimp,"GetGlyphOutLine16(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
              hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
@@ -979,9 +1023,9 @@
 /***********************************************************************
  *           GetGlyphOutline32A    (GDI32.186)
  */
-DWORD GetGlyphOutline32A( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
-                         LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
-                         LPVOID lpBuffer, const MAT2 *lpmat2 )
+DWORD WINAPI GetGlyphOutline32A( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
+                                 LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
+                                 LPVOID lpBuffer, const MAT2 *lpmat2 )
 {
     fprintf( stdnimp,"GetGlyphOutLine32A(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
              hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
@@ -991,9 +1035,9 @@
 /***********************************************************************
  *           GetGlyphOutline32W    (GDI32.187)
  */
-DWORD GetGlyphOutline32W( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
-                         LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
-                         LPVOID lpBuffer, const MAT2 *lpmat2 )
+DWORD WINAPI GetGlyphOutline32W( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
+                                 LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
+                                 LPVOID lpBuffer, const MAT2 *lpmat2 )
 {
     fprintf( stdnimp,"GetGlyphOutLine32W(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
              hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
@@ -1003,8 +1047,9 @@
 /***********************************************************************
  *           CreateScalableFontResource16   (GDI.310)
  */
-BOOL16 CreateScalableFontResource16( UINT16 fHidden, LPCSTR lpszResourceFile,
-                                     LPCSTR fontFile, LPCSTR path )
+BOOL16 WINAPI CreateScalableFontResource16( UINT16 fHidden,
+                                            LPCSTR lpszResourceFile,
+                                            LPCSTR fontFile, LPCSTR path )
 {
     return CreateScalableFontResource32A( fHidden, lpszResourceFile,
                                           fontFile, path );
@@ -1013,9 +1058,10 @@
 /***********************************************************************
  *           CreateScalableFontResource32A   (GDI32.62)
  */
-BOOL32 CreateScalableFontResource32A( DWORD fHidden, LPCSTR lpszResourceFile,
-                                      LPCSTR lpszFontFile,
-                                      LPCSTR lpszCurrentPath )
+BOOL32 WINAPI CreateScalableFontResource32A( DWORD fHidden,
+                                             LPCSTR lpszResourceFile,
+                                             LPCSTR lpszFontFile,
+                                             LPCSTR lpszCurrentPath )
 {
     /* fHidden=1 - only visible for the calling app, read-only, not
      * enumbered with EnumFonts/EnumFontFamilies
@@ -1029,9 +1075,10 @@
 /***********************************************************************
  *           CreateScalableFontResource32W   (GDI32.63)
  */
-BOOL32 CreateScalableFontResource32W( DWORD fHidden, LPCWSTR lpszResourceFile,
-                                      LPCWSTR lpszFontFile,
-                                      LPCWSTR lpszCurrentPath )
+BOOL32 WINAPI CreateScalableFontResource32W( DWORD fHidden,
+                                             LPCWSTR lpszResourceFile,
+                                             LPCWSTR lpszFontFile,
+                                             LPCWSTR lpszCurrentPath )
 {
     fprintf(stdnimp,"CreateScalableFontResource32W(%ld,%p,%p,%p) // empty stub\n",
             fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
@@ -1042,7 +1089,7 @@
 /*************************************************************************
  *             GetRasterizerCaps16   (GDI.313)
  */
-BOOL16 GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes )
+BOOL16 WINAPI GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes)
 {
     return GetRasterizerCaps32( lprs, cbNumBytes );
 }
@@ -1051,7 +1098,7 @@
 /*************************************************************************
  *             GetRasterizerCaps32   (GDI32.216)
  */
-BOOL32 GetRasterizerCaps32( LPRASTERIZER_STATUS lprs, UINT32 cbNumBytes )
+BOOL32 WINAPI GetRasterizerCaps32( LPRASTERIZER_STATUS lprs, UINT32 cbNumBytes)
 {
   RASTERIZER_STATUS rs;
 
@@ -1065,8 +1112,8 @@
 /*************************************************************************
  *             GetKerningPairs16   (GDI.332)
  */
-INT16 GetKerningPairs16( HDC16 hDC, INT16 cPairs,
-                         LPKERNINGPAIR16 lpKerningPairs )
+INT16 WINAPI GetKerningPairs16( HDC16 hDC, INT16 cPairs,
+                                LPKERNINGPAIR16 lpKerningPairs )
 {
     /* At this time kerning is ignored (set to 0) */
     int i;
@@ -1080,8 +1127,8 @@
 /*************************************************************************
  *             GetKerningPairs32A   (GDI32.192)
  */
-DWORD GetKerningPairs32A( HDC32 hDC, DWORD cPairs,
-                          LPKERNINGPAIR32 lpKerningPairs )
+DWORD WINAPI GetKerningPairs32A( HDC32 hDC, DWORD cPairs,
+                                 LPKERNINGPAIR32 lpKerningPairs )
 {
     int i;
     fprintf(stdnimp,"GetKerningPairs32: almost empty stub!\n");
@@ -1093,9 +1140,16 @@
 /*************************************************************************
  *             GetKerningPairs32W   (GDI32.193)
  */
-DWORD GetKerningPairs32W( HDC32 hDC, DWORD cPairs,
-                          LPKERNINGPAIR32 lpKerningPairs )
+DWORD WINAPI GetKerningPairs32W( HDC32 hDC, DWORD cPairs,
+                                 LPKERNINGPAIR32 lpKerningPairs )
 {
     return GetKerningPairs32A( hDC, cPairs, lpKerningPairs );
 }
 
+BOOL32 WINAPI TranslateCharSetInfo(LPDWORD lpSrc,LPCHARSETINFO lpCs,DWORD dwFlags) {
+    fprintf(stderr,"TranslateCharSetInfo(%p,%p,0x%08lx), stub.\n",
+    	lpSrc,lpCs,dwFlags
+    );
+    return TRUE;
+}
+
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 3d59435..6c80245 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -231,11 +231,13 @@
     {
 	/* Create default palette */
 
+      /* DR well *this* palette can't be moveable (?) */
+
 	HPALETTE16 hpalette = PALETTE_Init();
 
 	if( hpalette )
 	{
-	    StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *)GDI_HEAP_LIN_ADDR( hpalette );
+	    StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *)GDI_HEAP_LOCK( hpalette );
 	    return TRUE;
 	}
     }
@@ -250,12 +252,17 @@
 {
     static DWORD count = 0;
     GDIOBJHDR * obj;
-    HGDIOBJ16 handle = GDI_HEAP_ALLOC( size );
+    HGDIOBJ16 handle;
+    if ( magic == DC_MAGIC || magic == METAFILE_DC_MAGIC )
+      handle = GDI_HEAP_ALLOC( size );
+    else 
+      handle = GDI_HEAP_ALLOC_MOVEABLE( size );
     if (!handle) return 0;
-    obj = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    obj = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     obj->hNext   = 0;
     obj->wMagic  = magic;
     obj->dwCount = ++count;
+    GDI_HEAP_UNLOCK( handle );
     return handle;
 }
 
@@ -271,10 +278,10 @@
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
         return TRUE;
     
-    object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    object = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (!object) return FALSE;
     object->wMagic = 0;  /* Mark it as invalid */
-
+ 
       /* Free object */
     
     GDI_HEAP_FREE( handle );
@@ -286,6 +293,8 @@
  *
  * Return a pointer to the GDI object associated to the handle.
  * Return NULL if the object has the wrong magic number.
+ * Movable GDI objects are locked in memory: it is up to the caller to unlock
+ * it after the caller is done with the pointer.
  */
 GDIOBJHDR * GDI_GetObjPtr( HGDIOBJ16 handle, WORD magic )
 {
@@ -294,9 +303,13 @@
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
       ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else 
-      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+      ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (!ptr) return NULL;
-    if ((magic != MAGIC_DONTCARE) && (ptr->wMagic != magic)) return NULL;
+    if ((magic != MAGIC_DONTCARE) && (ptr->wMagic != magic)) 
+    {
+      GDI_HEAP_UNLOCK( handle );
+      return NULL;
+    }
     return ptr;
 }
 
@@ -304,7 +317,7 @@
 /***********************************************************************
  *           DeleteObject16    (GDI.69)
  */
-BOOL16 DeleteObject16( HGDIOBJ16 obj )
+BOOL16 WINAPI DeleteObject16( HGDIOBJ16 obj )
 {
     return DeleteObject32( obj );
 }
@@ -313,12 +326,15 @@
 /***********************************************************************
  *           DeleteObject32    (GDI32.70)
  */
-BOOL32 DeleteObject32( HGDIOBJ32 obj )
+BOOL32 WINAPI DeleteObject32( HGDIOBJ32 obj )
 {
       /* Check if object is valid */
 
-    GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( obj );
-    if (!header || HIWORD(obj)) return FALSE;
+    GDIOBJHDR * header;
+    if (HIWORD(obj)) return FALSE;
+    if ((obj >= FIRST_STOCK_HANDLE) && (obj <= LAST_STOCK_HANDLE))
+        return TRUE;
+    if (!(header = (GDIOBJHDR *) GDI_HEAP_LOCK( obj ))) return FALSE;
 
     dprintf_gdi(stddeb, "DeleteObject: %04x\n", obj );
 
@@ -340,7 +356,7 @@
 /***********************************************************************
  *           GetStockObject16    (GDI.87)
  */
-HGDIOBJ16 GetStockObject16( INT16 obj )
+HGDIOBJ16 WINAPI GetStockObject16( INT16 obj )
 {
     return (HGDIOBJ16)GetStockObject32( obj );
 }
@@ -349,7 +365,7 @@
 /***********************************************************************
  *           GetStockObject32    (GDI32.220)
  */
-HGDIOBJ32 GetStockObject32( INT32 obj )
+HGDIOBJ32 WINAPI GetStockObject32( INT32 obj )
 {
     if ((obj < 0) || (obj >= NB_STOCK_OBJECTS)) return 0;
     if (!StockObjects[obj]) return 0;
@@ -362,73 +378,86 @@
 /***********************************************************************
  *           GetObject16    (GDI.82)
  */
-INT16 GetObject16( HANDLE16 handle, INT16 count, LPVOID buffer )
+INT16 WINAPI GetObject16( HANDLE16 handle, INT16 count, LPVOID buffer )
 {
     GDIOBJHDR * ptr = NULL;
+    INT16 result = 0;
     dprintf_gdi(stddeb, "GetObject16: %04x %d %p\n", handle, count, buffer );
     if (!count) return 0;
 
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
       ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else
-      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+      ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (!ptr) return 0;
     
     switch(ptr->wMagic)
-    {
+      {
       case PEN_MAGIC:
-	  return PEN_GetObject16( (PENOBJ *)ptr, count, buffer );
+	result = PEN_GetObject16( (PENOBJ *)ptr, count, buffer );
+	break;
       case BRUSH_MAGIC: 
-	  return BRUSH_GetObject16( (BRUSHOBJ *)ptr, count, buffer );
+	result = BRUSH_GetObject16( (BRUSHOBJ *)ptr, count, buffer );
+	break;
       case BITMAP_MAGIC: 
-	  return BITMAP_GetObject16( (BITMAPOBJ *)ptr, count, buffer );
+	result = BITMAP_GetObject16( (BITMAPOBJ *)ptr, count, buffer );
+	break;
       case FONT_MAGIC:
-	  return FONT_GetObject16( (FONTOBJ *)ptr, count, buffer );
+	result = FONT_GetObject16( (FONTOBJ *)ptr, count, buffer );
+	break;
       case PALETTE_MAGIC:
-	  return PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
-    }
-    return 0;
+	result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
+	break;
+      }
+    GDI_HEAP_UNLOCK( handle );
+    return result;
 }
 
 
 /***********************************************************************
  *           GetObject32A    (GDI32.204)
  */
-INT32 GetObject32A( HANDLE32 handle, INT32 count, LPVOID buffer )
+INT32 WINAPI GetObject32A( HANDLE32 handle, INT32 count, LPVOID buffer )
 {
     GDIOBJHDR * ptr = NULL;
+    INT32 result = 0;
     dprintf_gdi(stddeb, "GetObject32A: %08x %d %p\n", handle, count, buffer );
     if (!count) return 0;
 
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
       ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else
-      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+      ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (!ptr) return 0;
     
     switch(ptr->wMagic)
     {
       case PEN_MAGIC:
-	  return PEN_GetObject32( (PENOBJ *)ptr, count, buffer );
+	  result = PEN_GetObject32( (PENOBJ *)ptr, count, buffer );
+	  break;
       case BRUSH_MAGIC: 
-	  return BRUSH_GetObject32( (BRUSHOBJ *)ptr, count, buffer );
+	  result = BRUSH_GetObject32( (BRUSHOBJ *)ptr, count, buffer );
+	  break;
       case BITMAP_MAGIC: 
-	  return BITMAP_GetObject32( (BITMAPOBJ *)ptr, count, buffer );
+	  result = BITMAP_GetObject32( (BITMAPOBJ *)ptr, count, buffer );
+	  break;
       case FONT_MAGIC:
-	  return FONT_GetObject32A( (FONTOBJ *)ptr, count, buffer );
+	  result = FONT_GetObject32A( (FONTOBJ *)ptr, count, buffer );
+	  break;
       case PALETTE_MAGIC:
           fprintf( stderr, "GetObject32: magic %04x not implemented\n",
                    ptr->wMagic );
           break;
     }
-    return 0;
+    GDI_HEAP_UNLOCK( handle );
+    return result;
 }
 
 
 /***********************************************************************
  *           GetObject32W    (GDI32.206)
  */
-INT32 GetObject32W( HANDLE32 handle, INT32 count, LPVOID buffer )
+INT32 WINAPI GetObject32W( HANDLE32 handle, INT32 count, LPVOID buffer )
 {
     return GetObject32A( handle, count, buffer );
 }
@@ -437,7 +466,7 @@
 /***********************************************************************
  *           SelectObject16    (GDI.45)
  */
-HGDIOBJ16 SelectObject16( HDC16 hdc, HGDIOBJ16 handle )
+HGDIOBJ16 WINAPI SelectObject16( HDC16 hdc, HGDIOBJ16 handle )
 {
     return (HGDIOBJ16)SelectObject32( hdc, handle );
 }
@@ -446,7 +475,7 @@
 /***********************************************************************
  *           SelectObject32    (GDI32.299)
  */
-HGDIOBJ32 SelectObject32( HDC32 hdc, HGDIOBJ32 handle )
+HGDIOBJ32 WINAPI SelectObject32( HDC32 hdc, HGDIOBJ32 handle )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc || !dc->funcs->pSelectObject) return 0;
@@ -458,7 +487,7 @@
 /***********************************************************************
  *           UnrealizeObject16    (GDI.150)
  */
-BOOL16 UnrealizeObject16( HGDIOBJ16 obj )
+BOOL16 WINAPI UnrealizeObject16( HGDIOBJ16 obj )
 {
     return UnrealizeObject32( obj );
 }
@@ -467,11 +496,12 @@
 /***********************************************************************
  *           UnrealizeObject    (GDI32.358)
  */
-BOOL32 UnrealizeObject32( HGDIOBJ32 obj )
+BOOL32 WINAPI UnrealizeObject32( HGDIOBJ32 obj )
 {
-      /* Check if object is valid */
+    BOOL32 result = TRUE;
+  /* Check if object is valid */
 
-    GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( obj );
+    GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LOCK( obj );
     if (!header) return FALSE;
 
     dprintf_gdi( stddeb, "UnrealizeObject: %04x\n", obj );
@@ -481,21 +511,23 @@
     switch(header->wMagic)
     {
     case PALETTE_MAGIC: 
-        return PALETTE_UnrealizeObject( obj, (PALETTEOBJ *)header );
+        result = PALETTE_UnrealizeObject( obj, (PALETTEOBJ *)header );
+	break;
 
     case BRUSH_MAGIC:
         /* Windows resets the brush origin. We don't need to. */
         break;
     }
-    return TRUE;
+    GDI_HEAP_UNLOCK( obj );
+    return result;
 }
 
 
 /***********************************************************************
  *           EnumObjects16    (GDI.71)
  */
-INT16 EnumObjects16( HDC16 hdc, INT16 nObjType, GOBJENUMPROC16 lpEnumFunc,
-                     LPARAM lParam )
+INT16 WINAPI EnumObjects16( HDC16 hdc, INT16 nObjType,
+                            GOBJENUMPROC16 lpEnumFunc, LPARAM lParam )
 {
     /* Solid colors to enumerate */
     static const COLORREF solid_colors[] =
@@ -573,8 +605,8 @@
 /***********************************************************************
  *           EnumObjects32    (GDI32.89)
  */
-INT32 EnumObjects32( HDC32 hdc, INT32 nObjType, GOBJENUMPROC32 lpEnumFunc,
-                     LPARAM lParam )
+INT32 WINAPI EnumObjects32( HDC32 hdc, INT32 nObjType,
+                            GOBJENUMPROC32 lpEnumFunc, LPARAM lParam )
 {
     /* Solid colors to enumerate */
     static const COLORREF solid_colors[] =
@@ -648,12 +680,19 @@
 
 /***********************************************************************
  *           IsGDIObject    (GDI.462)
+ * 
+ * returns type of object if valid (W95 system programming secrets p. 264-5)
  */
-BOOL16 IsGDIObject( HGDIOBJ16 handle )
+BOOL16 WINAPI IsGDIObject( HGDIOBJ16 handle )
 {
-    GDIOBJHDR *object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    GDIOBJHDR *object = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (object)
-      return (object->wMagic>=PEN_MAGIC && object->wMagic<= METAFILE_DC_MAGIC);
+    {
+        UINT16 magic = object->wMagic;
+        GDI_HEAP_UNLOCK( handle );
+        if (magic >= PEN_MAGIC && magic <= METAFILE_DC_MAGIC)
+            return magic - PEN_MAGIC + 1;
+    }
     return FALSE;
 }
 
@@ -661,7 +700,7 @@
 /***********************************************************************
  *           MulDiv16   (GDI.128)
  */
-INT16 MulDiv16( INT16 foo, INT16 bar, INT16 baz )
+INT16 WINAPI MulDiv16( INT16 foo, INT16 bar, INT16 baz )
 {
     INT32 ret;
     if (!baz) return -32768;
@@ -674,7 +713,7 @@
 /***********************************************************************
  *           MulDiv32   (KERNEL32.391)
  */
-INT32 MulDiv32( INT32 foo, INT32 bar, INT32 baz )
+INT32 WINAPI MulDiv32( INT32 foo, INT32 bar, INT32 baz )
 {
 #ifdef __GNUC__
     long long ret;
diff --git a/objects/linedda.c b/objects/linedda.c
index d0cf871..7297860 100644
--- a/objects/linedda.c
+++ b/objects/linedda.c
@@ -11,8 +11,8 @@
 /**********************************************************************
  *           LineDDA16   (GDI.100)
  */
-void LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd, INT16 nYEnd,
-                LINEDDAPROC16 callback, LPARAM lParam )
+void WINAPI LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd, INT16 nYEnd,
+                       LINEDDAPROC16 callback, LPARAM lParam )
 {
     LineDDA32( nXStart, nYStart, nXEnd, nYEnd,
                (LINEDDAPROC32)callback, lParam );
@@ -22,8 +22,8 @@
 /**********************************************************************
  *           LineDDA32   (GDI32.248)
  */
-BOOL32 LineDDA32( INT32 nXStart, INT32 nYStart, INT32 nXEnd, INT32 nYEnd,
-                  LINEDDAPROC32 callback, LPARAM lParam )
+BOOL32 WINAPI LineDDA32(INT32 nXStart, INT32 nYStart, INT32 nXEnd, INT32 nYEnd,
+                        LINEDDAPROC32 callback, LPARAM lParam )
 {
     INT32 xadd = 1, yadd = 1;
     INT32 err,erradd;
diff --git a/objects/metafile.c b/objects/metafile.c
index 87e0b34..ad8622a 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -57,7 +57,7 @@
 /******************************************************************
  *         GetMetafile16   (GDI.124)
  */
-HMETAFILE16 GetMetaFile16( LPCSTR lpFilename )
+HMETAFILE16 WINAPI GetMetaFile16( LPCSTR lpFilename )
 {
     return GetMetaFile32A( lpFilename );
 }
@@ -66,7 +66,7 @@
 /******************************************************************
  *         GetMetafile32A   (GDI32.197)
  */
-HMETAFILE32 GetMetaFile32A( LPCSTR lpFilename )
+HMETAFILE32 WINAPI GetMetaFile32A( LPCSTR lpFilename )
 {
   HMETAFILE16 hmf;
   METAHEADER *mh;
@@ -137,7 +137,7 @@
 /******************************************************************
  *         GetMetafile32W   (GDI32.199)
  */
-HMETAFILE32 GetMetaFile32W( LPCWSTR lpFilename )
+HMETAFILE32 WINAPI GetMetaFile32W( LPCWSTR lpFilename )
 {
     LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, lpFilename );
     HMETAFILE32 ret = GetMetaFile32A( p );
@@ -150,7 +150,7 @@
  *         CopyMetaFile16   (GDI.151)
  */
 
-HMETAFILE16 CopyMetaFile16( HMETAFILE16 hSrcMetaFile, LPCSTR lpFilename )
+HMETAFILE16 WINAPI CopyMetaFile16( HMETAFILE16 hSrcMetaFile, LPCSTR lpFilename )
 {
     return CopyMetaFile32A( hSrcMetaFile, lpFilename );
 }
@@ -159,7 +159,7 @@
 /******************************************************************
  *         CopyMetaFile32A   (GDI32.23)
  */
-HMETAFILE32 CopyMetaFile32A( HMETAFILE32 hSrcMetaFile, LPCSTR lpFilename )
+HMETAFILE32 WINAPI CopyMetaFile32A(HMETAFILE32 hSrcMetaFile, LPCSTR lpFilename)
 {
     HMETAFILE16 handle = 0;
     METAHEADER *mh;
@@ -201,7 +201,8 @@
 /******************************************************************
  *         CopyMetaFile32W   (GDI32.24)
  */
-HMETAFILE32 CopyMetaFile32W( HMETAFILE32 hSrcMetaFile, LPCWSTR lpFilename )
+HMETAFILE32 WINAPI CopyMetaFile32W( HMETAFILE32 hSrcMetaFile,
+                                    LPCWSTR lpFilename )
 {
     LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, lpFilename );
     HMETAFILE32 ret = CopyMetaFile32A( hSrcMetaFile, p );
@@ -215,7 +216,7 @@
  *         (This is not exactly what windows does, see "Undoc Win")
  */
 
-BOOL16 IsValidMetaFile(HMETAFILE16 hmf)
+BOOL16 WINAPI IsValidMetaFile(HMETAFILE16 hmf)
 {
     BOOL16 resu=FALSE;
     METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
@@ -234,7 +235,7 @@
 /******************************************************************
  *         PlayMetafile16   (GDI.123)
  */
-BOOL16 PlayMetaFile16( HDC16 hdc, HMETAFILE16 hmf )
+BOOL16 WINAPI PlayMetaFile16( HDC16 hdc, HMETAFILE16 hmf )
 {
     return PlayMetaFile32( hdc, hmf );
 }
@@ -243,7 +244,7 @@
 /******************************************************************
  *         PlayMetafile32   (GDI32.265)
  */
-BOOL32 PlayMetaFile32( HDC32 hdc, HMETAFILE32 hmf )
+BOOL32 WINAPI PlayMetaFile32( HDC32 hdc, HMETAFILE32 hmf )
 {
     METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
     METARECORD *mr;
@@ -262,7 +263,7 @@
     hPen = dc->w.hPen;
     hBrush = dc->w.hBrush;
     hFont = dc->w.hFont;
-
+    GDI_HEAP_UNLOCK(hdc);
     /* create the handle table */
     hHT = GlobalAlloc16(GMEM_MOVEABLE|GMEM_ZEROINIT,
 		      sizeof(HANDLETABLE16) * mh->mtNoObjects);
@@ -299,8 +300,8 @@
  *            EnumMetaFile16   (GDI.175)
  *                                    Niels de carpentier, april 1996
  */
-BOOL16 EnumMetaFile16( HDC16 hdc, HMETAFILE16 hmf, MFENUMPROC16 lpEnumFunc,
-                       LPARAM lpData )
+BOOL16 WINAPI EnumMetaFile16( HDC16 hdc, HMETAFILE16 hmf,
+                              MFENUMPROC16 lpEnumFunc, LPARAM lpData )
 {
     METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
     METARECORD *mr;
@@ -321,7 +322,8 @@
     hPen = dc->w.hPen;
     hBrush = dc->w.hBrush;
     hFont = dc->w.hFont;
-   
+    GDI_HEAP_UNLOCK(hdc);
+
     /* create the handle table */
     
     hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT,
@@ -365,8 +367,8 @@
 /******************************************************************
  *             PlayMetaFileRecord16   (GDI.176)
  */
-void PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
-                           UINT16 nHandles )
+void WINAPI PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
+                                  UINT16 nHandles )
 {
     short s1;
     HANDLE16 hndl;
@@ -818,7 +820,7 @@
  * Trade in a meta file object handle for a handle to the meta file memory
  */
 
-HGLOBAL16 GetMetaFileBits(HMETAFILE16 hmf)
+HGLOBAL16 WINAPI GetMetaFileBits(HMETAFILE16 hmf)
 {
     dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: %04x\n", hmf);
 
@@ -830,7 +832,7 @@
  *
  * Trade in a meta file memory handle for a handle to a meta file object
  */
-HMETAFILE16 SetMetaFileBits( HGLOBAL16 hMem )
+HMETAFILE16 WINAPI SetMetaFileBits( HGLOBAL16 hMem )
 {
     dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: %04x\n", hMem);
 
@@ -840,7 +842,7 @@
 /******************************************************************
  *         SetMetaFileBitsBetter   (GDI.196)
  */
-HMETAFILE16 SetMetaFileBitsBetter( HMETAFILE16 hMeta )
+HMETAFILE16 WINAPI SetMetaFileBitsBetter( HMETAFILE16 hMeta )
 {
    if( IsValidMetaFile( hMeta ) )
        return (HMETAFILE16)GlobalReAlloc16( hMeta, 0, 
@@ -1044,7 +1046,10 @@
 	len = sizeof(METARECORD) + sizeof(BITMAPINFOHEADER) + 
 	      (bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes) + 6;
 	if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len)))
+	  {
+	    GDI_HEAP_UNLOCK((HGDIOBJ16)logbrush->lbHatch);
 	    return FALSE;
+	  }
 	mr = (METARECORD *)GlobalLock16(hmr);
 	memset(mr, 0, len);
 	mr->rdFunction = META_DIBCREATEPATTERNBRUSH;
@@ -1060,6 +1065,7 @@
 	memcpy(mr->rdParam + (sizeof(BITMAPINFOHEADER) / 2) + 4,
 	       PTR_SEG_TO_LIN(bmp->bitmap.bmBits),
 	       bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes);
+	GDI_HEAP_UNLOCK(logbrush->lbHatch);
 	break;
 
     case BS_DIBPATTERN:
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index 514cb78..2a3cb2d 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -249,6 +249,17 @@
 
 static XpmColorSymbol *OBM_Colors = NULL;
 
+/* This structure holds the arguments for OBM_CreateBitmaps() */
+typedef struct
+{
+    char     **data;      /* In: bitmap data */
+    BOOL32     color;     /* In: color or monochrome */
+    BOOL32     need_mask; /* In: do we need a mask? */
+    HBITMAP16  bitmap;    /* Out: resulting bitmap */
+    HBITMAP16  mask;      /* Out: resulting mask (if needed) */
+    POINT32    hotspot;   /* Out: bitmap hotspot */
+} OBM_BITMAP_DESCR;
+
 
 /***********************************************************************
  *           OBM_InitColorSymbols
@@ -293,7 +304,7 @@
     hbitmap = GDI_AllocObject( sizeof(BITMAPOBJ), BITMAP_MAGIC );
     if (!hbitmap) return 0;
 
-    bmpObjPtr = (BITMAPOBJ *) GDI_HEAP_LIN_ADDR( hbitmap );
+    bmpObjPtr = (BITMAPOBJ *) GDI_HEAP_LOCK( hbitmap );
     bmpObjPtr->size.cx = width;
     bmpObjPtr->size.cy = height;
     bmpObjPtr->pixmap  = pixmap;
@@ -304,6 +315,7 @@
     bmpObjPtr->bitmap.bmPlanes     = 1;
     bmpObjPtr->bitmap.bmBitsPixel  = bpp;
     bmpObjPtr->bitmap.bmBits       = NULL;
+    GDI_HEAP_UNLOCK( hbitmap );
     return hbitmap;
 }
 
@@ -313,8 +325,7 @@
  *
  * Create the 2 bitmaps from XPM data.
  */
-static BOOL32 OBM_CreateBitmaps( char **data, BOOL32 color, HBITMAP16 *hBitmap,
-                                 HBITMAP16 *hBitmapMask, POINT32 *hotspot )
+static BOOL32 OBM_CreateBitmaps( OBM_BITMAP_DESCR *descr )
 {
     Pixmap pixmap, pixmask;
     XpmAttributes *attrs;
@@ -323,11 +334,11 @@
     attrs = (XpmAttributes *)xmalloc( XpmAttributesSize() );
     attrs->valuemask    = XpmColormap | XpmDepth | XpmColorSymbols |XpmHotspot;
     attrs->colormap     = COLOR_GetColormap();
-    attrs->depth        = color ? screenDepth : 1;
+    attrs->depth        = descr->color ? screenDepth : 1;
     attrs->colorsymbols = (attrs->depth > 1) ? OBM_Colors : OBM_BlackAndWhite;
     attrs->numsymbols   = (attrs->depth > 1) ? NB_COLOR_SYMBOLS : 2;
         
-    err = XpmCreatePixmapFromData( display, rootWindow, data,
+    err = XpmCreatePixmapFromData( display, rootWindow, descr->data,
                                    &pixmap, &pixmask, attrs );
 
     if (err != XpmSuccess)
@@ -335,22 +346,20 @@
         free( attrs );
         return FALSE;
     }
-    if (hotspot)
-    {
-        hotspot->x = attrs->x_hotspot;
-        hotspot->y = attrs->y_hotspot;
-    }
-    *hBitmap = OBM_MakeBitmap( attrs->width, attrs->height,
-                               attrs->depth, pixmap );
-    if (hBitmapMask) *hBitmapMask = OBM_MakeBitmap(attrs->width, attrs->height,
-                                                   1, pixmask );
+    descr->hotspot.x = attrs->x_hotspot;
+    descr->hotspot.y = attrs->y_hotspot;
+    descr->bitmap = OBM_MakeBitmap( attrs->width, attrs->height,
+                                    attrs->depth, pixmap );
+    if (descr->need_mask)
+        descr->mask = OBM_MakeBitmap( attrs->width, attrs->height,
+                                      1, pixmask );
     free( attrs );
-    if (!*hBitmap)
+    if (!descr->bitmap)
     {
         if (pixmap) XFreePixmap( display, pixmap );
         if (pixmask) XFreePixmap( display, pixmask );
-        if (*hBitmap) GDI_FreeObject( *hBitmap );
-        if (hBitmapMask && *hBitmapMask) GDI_FreeObject( *hBitmapMask );
+        if (descr->bitmap) GDI_FreeObject( descr->bitmap );
+        if (descr->need_mask && descr->mask) GDI_FreeObject( descr->mask );
         return FALSE;
     }
     else return TRUE;
@@ -362,22 +371,23 @@
  */
 HBITMAP16 OBM_LoadBitmap( WORD id )
 {
-    HBITMAP16 hbitmap;
+    OBM_BITMAP_DESCR descr;
 
     if ((id < OBM_FIRST) || (id > OBM_LAST)) return 0;
     id -= OBM_FIRST;
 
     if (!OBM_InitColorSymbols()) return 0;
-    
-    if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 5,
-                              OBM_Pixmaps_Data[id].data,
-                              OBM_Pixmaps_Data[id].color,
-                              &hbitmap, NULL, NULL ))
+
+    descr.data      = OBM_Pixmaps_Data[id].data;
+    descr.color     = OBM_Pixmaps_Data[id].color;
+    descr.need_mask = FALSE;
+
+    if (!CALL_LARGE_STACK( OBM_CreateBitmaps, &descr ))
     {
         fprintf( stderr, "Error creating OEM bitmap %d\n", OBM_FIRST+id );
         return 0;
     }
-    return hbitmap;
+    return descr.bitmap;
 }
 
 
@@ -386,11 +396,10 @@
  */
 HGLOBAL16 OBM_LoadCursorIcon( WORD id, BOOL32 fCursor )
 {
+    OBM_BITMAP_DESCR descr;
     HGLOBAL16 handle;
     CURSORICONINFO *pInfo;
     BITMAPOBJ *bmpXor, *bmpAnd;
-    HBITMAP16 hXorBits, hAndBits;
-    POINT32 hotspot;
     int sizeXor, sizeAnd;
 
     if (fCursor)
@@ -412,37 +421,39 @@
 
     if (!OBM_InitColorSymbols()) return 0;
     
-    if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 5,
-                           fCursor ? OBM_Cursors_Data[id] : OBM_Icons_Data[id],
-                           !fCursor, &hXorBits, &hAndBits, &hotspot ))
+    descr.data      = fCursor ? OBM_Cursors_Data[id] : OBM_Icons_Data[id];
+    descr.color     = !fCursor;
+    descr.need_mask = TRUE;
+
+    if (!CALL_LARGE_STACK( OBM_CreateBitmaps, &descr ))
     {
         fprintf( stderr, "Error creating OEM cursor/icon %d\n", id );
         return 0;
     }
 
-    bmpXor = (BITMAPOBJ *) GDI_GetObjPtr( hXorBits, BITMAP_MAGIC );
-    bmpAnd = (BITMAPOBJ *) GDI_GetObjPtr( hAndBits, BITMAP_MAGIC );
+    bmpXor = (BITMAPOBJ *) GDI_GetObjPtr( descr.bitmap, BITMAP_MAGIC );
+    bmpAnd = (BITMAPOBJ *) GDI_GetObjPtr( descr.mask, BITMAP_MAGIC );
     sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
     sizeAnd = bmpXor->bitmap.bmHeight * BITMAP_WIDTH_BYTES( bmpXor->bitmap.bmWidth, 1 );
 
     if (!(handle = GlobalAlloc16( GMEM_MOVEABLE,
                                   sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
     {
-        DeleteObject32( hXorBits );
-        DeleteObject32( hAndBits );
+        DeleteObject32( descr.bitmap );
+        DeleteObject32( descr.mask );
         return 0;
     }
 
     pInfo = (CURSORICONINFO *)GlobalLock16( handle );
-    pInfo->ptHotSpot.x   = hotspot.x;
-    pInfo->ptHotSpot.y   = hotspot.y;
+    pInfo->ptHotSpot.x   = descr.hotspot.x;
+    pInfo->ptHotSpot.y   = descr.hotspot.y;
     pInfo->nWidth        = bmpXor->bitmap.bmWidth;
     pInfo->nHeight       = bmpXor->bitmap.bmHeight;
     pInfo->nWidthBytes   = bmpXor->bitmap.bmWidthBytes;
     pInfo->bPlanes       = bmpXor->bitmap.bmPlanes;
     pInfo->bBitsPerPixel = bmpXor->bitmap.bmBitsPixel;
 
-    if (hAndBits)
+    if (descr.mask)
     {
           /* Invert the mask */
 
@@ -466,12 +477,12 @@
         }
     }
 
-    if (hAndBits) GetBitmapBits32( hAndBits, sizeAnd, (char *)(pInfo + 1) );
+    if (descr.mask) GetBitmapBits32( descr.mask, sizeAnd, (char *)(pInfo + 1));
     else memset( (char *)(pInfo + 1), 0xff, sizeAnd );
-    GetBitmapBits32( hXorBits, sizeXor, (char *)(pInfo + 1) + sizeAnd );
+    GetBitmapBits32( descr.bitmap, sizeXor, (char *)(pInfo + 1) + sizeAnd );
 
-    DeleteObject32( hXorBits );
-    DeleteObject32( hAndBits );
+    DeleteObject32( descr.bitmap );
+    DeleteObject32( descr.mask );
 
     if (fCursor) OBM_Cursors[id] = handle;
     return handle;
diff --git a/objects/palette.c b/objects/palette.c
index 74207b8..0049425 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -64,6 +64,8 @@
 
     palObj->mapping = xmalloc( sizeof(int) * 20 );
 
+    GDI_HEAP_UNLOCK( hpalette );
+
     free( palPtr );
     return hpalette;
 }
@@ -82,7 +84,7 @@
 /***********************************************************************
  *           CreatePalette16    (GDI.360)
  */
-HPALETTE16 CreatePalette16( const LOGPALETTE* palette )
+HPALETTE16 WINAPI CreatePalette16( const LOGPALETTE* palette )
 {
     return CreatePalette32( palette );
 }
@@ -91,7 +93,7 @@
 /***********************************************************************
  *           CreatePalette32    (GDI32.53)
  */
-HPALETTE32 CreatePalette32( const LOGPALETTE* palette )
+HPALETTE32 WINAPI CreatePalette32( const LOGPALETTE* palette )
 {
     PALETTEOBJ * palettePtr;
     HPALETTE32 hpalette;
@@ -103,11 +105,12 @@
     hpalette = GDI_AllocObject( size + sizeof(int*) +sizeof(GDIOBJHDR) , PALETTE_MAGIC );
     if (!hpalette) return 0;
 
-    palettePtr = (PALETTEOBJ *) GDI_HEAP_LIN_ADDR( hpalette );
+    palettePtr = (PALETTEOBJ *) GDI_HEAP_LOCK( hpalette );
     memcpy( &palettePtr->logpalette, palette, size );
     PALETTE_ValidateFlags(palettePtr->logpalette.palPalEntry, 
 			  palettePtr->logpalette.palNumEntries);
     palettePtr->mapping = NULL;
+    GDI_HEAP_UNLOCK( hpalette );
 
     dprintf_palette(stddeb,"returning %04x\n", hpalette);
     return hpalette;
@@ -117,8 +120,8 @@
 /***********************************************************************
  *           GetPaletteEntries16    (GDI.363)
  */
-UINT16 GetPaletteEntries16( HPALETTE16 hpalette, UINT16 start, UINT16 count,
-                            LPPALETTEENTRY entries )
+UINT16 WINAPI GetPaletteEntries16( HPALETTE16 hpalette, UINT16 start,
+                                   UINT16 count, LPPALETTEENTRY entries )
 {
     return GetPaletteEntries32( hpalette, start, count, entries );
 }
@@ -127,8 +130,8 @@
 /***********************************************************************
  *           GetPaletteEntries32    (GDI32.209)
  */
-UINT32 GetPaletteEntries32( HPALETTE32 hpalette, UINT32 start, UINT32 count,
-                            LPPALETTEENTRY entries )
+UINT32 WINAPI GetPaletteEntries32( HPALETTE32 hpalette, UINT32 start,
+                                   UINT32 count, LPPALETTEENTRY entries )
 {
     PALETTEOBJ * palPtr;
     INT32 numEntries;
@@ -140,13 +143,18 @@
     if (!palPtr) return 0;
 
     numEntries = palPtr->logpalette.palNumEntries;
-    if (start >= numEntries) return 0;
+    if (start >= numEntries) 
+    {
+      GDI_HEAP_UNLOCK( hpalette );
+      return 0;
+    }
     if (start+count > numEntries) count = numEntries - start;
     memcpy( entries, &palPtr->logpalette.palPalEntry[start],
 	    count * sizeof(PALETTEENTRY) );
     for( numEntries = 0; numEntries < count ; numEntries++ )
          if (entries[numEntries].peFlags & 0xF0)
              entries[numEntries].peFlags = 0;
+    GDI_HEAP_UNLOCK( hpalette );
     return count;
 }
 
@@ -154,8 +162,8 @@
 /***********************************************************************
  *           SetPaletteEntries16    (GDI.364)
  */
-UINT16 SetPaletteEntries16( HPALETTE16 hpalette, UINT16 start, UINT16 count,
-                            LPPALETTEENTRY entries )
+UINT16 WINAPI SetPaletteEntries16( HPALETTE16 hpalette, UINT16 start,
+                                   UINT16 count, LPPALETTEENTRY entries )
 {
     return SetPaletteEntries32( hpalette, start, count, entries );
 }
@@ -164,8 +172,8 @@
 /***********************************************************************
  *           SetPaletteEntries32    (GDI32.326)
  */
-UINT32 SetPaletteEntries32( HPALETTE32 hpalette, UINT32 start, UINT32 count,
-                            LPPALETTEENTRY entries )
+UINT32 WINAPI SetPaletteEntries32( HPALETTE32 hpalette, UINT32 start,
+                                   UINT32 count, LPPALETTEENTRY entries )
 {
     PALETTEOBJ * palPtr;
     INT32 numEntries;
@@ -177,7 +185,11 @@
     if (!palPtr) return 0;
 
     numEntries = palPtr->logpalette.palNumEntries;
-    if (start >= numEntries) return 0;
+    if (start >= numEntries) 
+    {
+      GDI_HEAP_UNLOCK( hpalette );
+      return 0;
+    }
     if (start+count > numEntries) count = numEntries - start;
     memcpy( &palPtr->logpalette.palPalEntry[start], entries,
 	    count * sizeof(PALETTEENTRY) );
@@ -185,7 +197,7 @@
 			  palPtr->logpalette.palNumEntries);
     free(palPtr->mapping);
     palPtr->mapping = NULL;
-
+    GDI_HEAP_UNLOCK( hpalette );
     return count;
 }
 
@@ -193,7 +205,7 @@
 /***********************************************************************
  *           ResizePalette16   (GDI.368)
  */
-BOOL16 ResizePalette16( HPALETTE16 hPal, UINT16 cEntries )
+BOOL16 WINAPI ResizePalette16( HPALETTE16 hPal, UINT16 cEntries )
 {
     return ResizePalette32( hPal, cEntries );
 }
@@ -202,7 +214,7 @@
 /***********************************************************************
  *           ResizePalette32   (GDI32.289)
  */
-BOOL32 ResizePalette32( HPALETTE32 hPal, UINT32 cEntries )
+BOOL32 WINAPI ResizePalette32( HPALETTE32 hPal, UINT32 cEntries )
 {
     PALETTEOBJ * palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
     UINT32	 cPrevEnt, prevVer;
@@ -219,7 +231,9 @@
 	      				sizeof(int*) + sizeof(GDIOBJHDR);
     size += sizeof(int*) + sizeof(GDIOBJHDR);
     mapping = palPtr->mapping;
-
+    
+    GDI_HEAP_UNLOCK( hPal );
+    
     hPal = GDI_HEAP_REALLOC( hPal, size );
     palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
     if( !palPtr ) return FALSE;
@@ -236,6 +250,7 @@
     }
     palPtr->logpalette.palNumEntries = cEntries;
     palPtr->logpalette.palVersion = prevVer;
+    GDI_HEAP_UNLOCK( hPal );
     return TRUE;
 }
 
@@ -243,28 +258,47 @@
 /***********************************************************************
  *           AnimatePalette16   (GDI.367)
  */
-BOOL16 AnimatePalette16( HPALETTE16 hPal, UINT16 StartIndex, UINT16 NumEntries,
-                         LPPALETTEENTRY PaletteColors )
+void WINAPI AnimatePalette16( HPALETTE16 hPal, UINT16 StartIndex,
+                              UINT16 NumEntries, LPPALETTEENTRY PaletteColors)
 {
-    return AnimatePalette32( hPal, StartIndex, NumEntries, PaletteColors );
+    AnimatePalette32( hPal, StartIndex, NumEntries, PaletteColors );
 }
 
 
 /***********************************************************************
  *           AnimatePalette32   (GDI32.6)
+ *
+ * FIXME: should use existing mapping when animating a primary palette
  */
-BOOL32 AnimatePalette32( HPALETTE32 hPal, UINT32 StartIndex, UINT32 NumEntries,
-                         LPPALETTEENTRY PaletteColors )
+BOOL32 WINAPI AnimatePalette32( HPALETTE32 hPal, UINT32 StartIndex,
+                               UINT32 NumEntries, LPPALETTEENTRY PaletteColors)
 {
-    fprintf(stdnimp,"AnimatePalette: empty stub! \n");
-    return TRUE;
+    dprintf_palette(stddeb, "AnimatePalette: %04x (%i - %i)", hPal, 
+                    StartIndex, StartIndex + NumEntries );
+
+    if( hPal != STOCK_DEFAULT_PALETTE ) 
+    {
+        PALETTEOBJ* palPtr = (PALETTEOBJ *)GDI_GetObjPtr(hPal, PALETTE_MAGIC);
+
+	if( (StartIndex + NumEntries) < palPtr->logpalette.palNumEntries )
+	{
+	    UINT32 u;
+	    for( u = 0; u < NumEntries; u++ )
+		palPtr->logpalette.palPalEntry[u + StartIndex] = PaletteColors[u];
+	    COLOR_SetMapping(palPtr, StartIndex, NumEntries,
+                             hPal != hPrimaryPalette );
+            GDI_HEAP_UNLOCK( hPal );
+	    return TRUE;
+	}
+    }
+    return FALSE;
 }
 
 
 /***********************************************************************
  *           SetSystemPaletteUse16   (GDI.373)
  */
-UINT16 SetSystemPaletteUse16( HDC16 hdc, UINT16 use )
+UINT16 WINAPI SetSystemPaletteUse16( HDC16 hdc, UINT16 use )
 {
     return SetSystemPaletteUse32( hdc, use );
 }
@@ -273,7 +307,7 @@
 /***********************************************************************
  *           SetSystemPaletteUse32   (GDI32.335)
  */
-UINT32 SetSystemPaletteUse32( HDC32 hdc, UINT32 use )
+UINT32 WINAPI SetSystemPaletteUse32( HDC32 hdc, UINT32 use )
 {
     UINT32 old = SystemPaletteUse;
     fprintf( stdnimp,"SetSystemPaletteUse(%04x,%04x) // empty stub !!!\n",
@@ -286,7 +320,7 @@
 /***********************************************************************
  *           GetSystemPaletteUse16   (GDI.374)
  */
-UINT16 GetSystemPaletteUse16( HDC16 hdc )
+UINT16 WINAPI GetSystemPaletteUse16( HDC16 hdc )
 {
     return SystemPaletteUse;
 }
@@ -295,7 +329,7 @@
 /***********************************************************************
  *           GetSystemPaletteUse32   (GDI32.223)
  */
-UINT32 GetSystemPaletteUse32( HDC32 hdc )
+UINT32 WINAPI GetSystemPaletteUse32( HDC32 hdc )
 {
     return SystemPaletteUse;
 }
@@ -304,8 +338,8 @@
 /***********************************************************************
  *           GetSystemPaletteEntries16   (GDI.375)
  */
-UINT16 GetSystemPaletteEntries16( HDC16 hdc, UINT16 start, UINT16 count,
-                                  LPPALETTEENTRY entries )
+UINT16 WINAPI GetSystemPaletteEntries16( HDC16 hdc, UINT16 start, UINT16 count,
+                                         LPPALETTEENTRY entries )
 {
     return GetSystemPaletteEntries32( hdc, start, count, entries );
 }
@@ -314,8 +348,8 @@
 /***********************************************************************
  *           GetSystemPaletteEntries32   (GDI32.222)
  */
-UINT32 GetSystemPaletteEntries32( HDC32 hdc, UINT32 start, UINT32 count,
-                                  LPPALETTEENTRY entries )
+UINT32 WINAPI GetSystemPaletteEntries32( HDC32 hdc, UINT32 start, UINT32 count,
+                                         LPPALETTEENTRY entries )
 {
     UINT32 i;
     DC *dc;
@@ -323,7 +357,11 @@
     dprintf_palette(stddeb,"GetSystemPaletteEntries: hdc = %04x, cound = %i", hdc, count );
 
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
-    if (start >= dc->w.devCaps->sizePalette) return 0;
+    if (start >= dc->w.devCaps->sizePalette)
+      {
+	GDI_HEAP_UNLOCK( hdc );
+	return 0;
+      }
     if (start+count >= dc->w.devCaps->sizePalette)
 	count = dc->w.devCaps->sizePalette - start;
     for (i = 0; i < count; i++)
@@ -333,6 +371,7 @@
         dprintf_palette( stddeb,"\tidx(%02x) -> RGB(%08lx)\n",
                          start + i, *(COLORREF*)(entries + i) );
     }
+    GDI_HEAP_UNLOCK( hdc );
     return count;
 }
 
@@ -340,7 +379,7 @@
 /***********************************************************************
  *           GetNearestPaletteIndex16   (GDI.370)
  */
-UINT16 GetNearestPaletteIndex16( HPALETTE16 hpalette, COLORREF color )
+UINT16 WINAPI GetNearestPaletteIndex16( HPALETTE16 hpalette, COLORREF color )
 {
     return GetNearestPaletteIndex32( hpalette, color );
 }
@@ -349,7 +388,7 @@
 /***********************************************************************
  *           GetNearestPaletteIndex32   (GDI32.203)
  */
-UINT32 GetNearestPaletteIndex32( HPALETTE32 hpalette, COLORREF color )
+UINT32 WINAPI GetNearestPaletteIndex32( HPALETTE32 hpalette, COLORREF color )
 {
     PALETTEOBJ*	palObj = (PALETTEOBJ*)GDI_GetObjPtr( hpalette, PALETTE_MAGIC );
     UINT32 index  = 0;
@@ -361,6 +400,7 @@
 
     dprintf_palette(stddeb,"GetNearestPaletteIndex(%04x,%06lx): returning %d\n", 
                     hpalette, color, index );
+    GDI_HEAP_UNLOCK( hpalette );
     return index;
 }
 
@@ -368,7 +408,7 @@
 /***********************************************************************
  *           GetNearestColor16   (GDI.154)
  */
-COLORREF GetNearestColor16( HDC16 hdc, COLORREF color )
+COLORREF WINAPI GetNearestColor16( HDC16 hdc, COLORREF color )
 {
     return GetNearestColor32( hdc, color );
 }
@@ -377,7 +417,7 @@
 /***********************************************************************
  *           GetNearestColor32   (GDI32.202)
  */
-COLORREF GetNearestColor32( HDC32 hdc, COLORREF color )
+COLORREF WINAPI GetNearestColor32( HDC32 hdc, COLORREF color )
 {
     COLORREF 	 nearest = 0xFADECAFE;
     DC 		*dc;
@@ -391,10 +431,12 @@
 
       nearest = COLOR_LookupNearestColor( palObj->logpalette.palPalEntry,
 					  palObj->logpalette.palNumEntries, color );
+      GDI_HEAP_UNLOCK( dc->w.hPalette );
     }
 
     dprintf_palette(stddeb,"GetNearestColor(%06lx): returning %06lx\n", 
                     color, nearest );
+    GDI_HEAP_UNLOCK( hdc );    
     return nearest;
 }
 
@@ -431,6 +473,7 @@
 BOOL32 PALETTE_DeleteObject( HPALETTE16 hpalette, PALETTEOBJ *palette )
 {
     free( palette->mapping );
+    if (hLastRealizedPalette == hpalette) hLastRealizedPalette = 0;
     return GDI_FreeObject( hpalette );
 }
 
@@ -438,7 +481,7 @@
 /***********************************************************************
  *           GDISelectPalette    (GDI.361)
  */
-HPALETTE16 GDISelectPalette( HDC16 hdc, HPALETTE16 hpal, WORD wBkg)
+HPALETTE16 WINAPI GDISelectPalette( HDC16 hdc, HPALETTE16 hpal, WORD wBkg)
 {
     HPALETTE16 prev;
     DC *dc;
@@ -453,6 +496,7 @@
     }
     prev = dc->w.hPalette;
     dc->w.hPalette = hpal;
+    GDI_HEAP_UNLOCK( hdc );
     if (!wBkg) hPrimaryPalette = hpal; 
     return prev;
 }
@@ -461,7 +505,7 @@
 /***********************************************************************
  *           GDIRealizePalette    (GDI.362)
  */
-UINT16 GDIRealizePalette( HDC16 hdc )
+UINT16 WINAPI GDIRealizePalette( HDC16 hdc )
 {
     PALETTEOBJ* palPtr;
     int realized = 0;
@@ -481,12 +525,16 @@
 
         palPtr = (PALETTEOBJ *) GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC );
         
-	realized = COLOR_SetMapping(palPtr, dc->w.hPalette != hPrimaryPalette 
-                                  || dc->w.hPalette == STOCK_DEFAULT_PALETTE );
+        realized = COLOR_SetMapping(palPtr,0,palPtr->logpalette.palNumEntries,
+                                    (dc->w.hPalette != hPrimaryPalette) ||
+                                    (dc->w.hPalette == STOCK_DEFAULT_PALETTE));
+	GDI_HEAP_UNLOCK( dc->w.hPalette );
 	hLastRealizedPalette = dc->w.hPalette;
     }
-    else dprintf_palette(stddeb, " skipping ");
+    else dprintf_palette(stddeb, " skipping (hLastRealizedPalette = %04x) ",
+			 hLastRealizedPalette);
     
+    GDI_HEAP_UNLOCK( hdc );
     dprintf_palette(stdnimp, " realized %i colors\n", realized );
     return (UINT16)realized;
 }
@@ -495,7 +543,7 @@
 /***********************************************************************
  *           RealizeDefaultPalette    (GDI.365)
  */
-UINT16 RealizeDefaultPalette( HDC16 hdc )
+UINT16 WINAPI RealizeDefaultPalette( HDC16 hdc )
 {
     DC          *dc;
     PALETTEOBJ*  palPtr;
@@ -510,7 +558,11 @@
 	if (!dc) return 0;
     }
 
-    if ( dc->w.flags & DC_MEMORY ) return 0;
+    if ( dc->w.flags & DC_MEMORY ) 
+      {
+	GDI_HEAP_UNLOCK( hdc );
+	return 0;
+      }
 
     hPrimaryPalette = STOCK_DEFAULT_PALETTE;
     hLastRealizedPalette = STOCK_DEFAULT_PALETTE;
@@ -533,18 +585,23 @@
 /***********************************************************************
  *           IsDCCurrentPalette   (GDI.412)
  */
-BOOL16 IsDCCurrentPalette(HDC16 hDC)
+BOOL16 WINAPI IsDCCurrentPalette(HDC16 hDC)
 {
     DC* dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
-    return (dc)?(dc->w.hPalette == hPrimaryPalette):FALSE;
+    if (dc) 
+    {
+      GDI_HEAP_UNLOCK( hDC );
+      return dc->w.hPalette == hPrimaryPalette;
+    }
+    return FALSE;
 }
 
 
 /***********************************************************************
  *           SelectPalette16    (USER.282)
  */
-HPALETTE16 SelectPalette16( HDC16 hDC, HPALETTE16 hPal,
-                            BOOL16 bForceBackground )
+HPALETTE16 WINAPI SelectPalette16( HDC16 hDC, HPALETTE16 hPal,
+                                   BOOL16 bForceBackground )
 {
     return SelectPalette32( hDC, hPal, bForceBackground );
 }
@@ -553,8 +610,8 @@
 /***********************************************************************
  *           SelectPalette32    (GDI32.300)
  */
-HPALETTE32 SelectPalette32( HDC32 hDC, HPALETTE32 hPal,
-                            BOOL32 bForceBackground )
+HPALETTE32 WINAPI SelectPalette32( HDC32 hDC, HPALETTE32 hPal,
+                                   BOOL32 bForceBackground )
 {
     WORD	wBkgPalette = 1;
     PALETTEOBJ* lpt = (PALETTEOBJ*) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
@@ -565,6 +622,7 @@
 
     dprintf_palette(stddeb," entries = %d\n", 
 			    lpt->logpalette.palNumEntries);
+    GDI_HEAP_UNLOCK( hPal );
 
     if( hPal != STOCK_DEFAULT_PALETTE )
     {
@@ -584,7 +642,7 @@
 /***********************************************************************
  *           RealizePalette16    (USER.283)
  */
-UINT16 RealizePalette16( HDC16 hDC )
+UINT16 WINAPI RealizePalette16( HDC16 hDC )
 {
     return RealizePalette32( hDC );
 }
@@ -593,7 +651,7 @@
 /***********************************************************************
  *           RealizePalette32    (GDI32.280)
  */
-UINT32 RealizePalette32( HDC32 hDC )
+UINT32 WINAPI RealizePalette32( HDC32 hDC )
 {
     UINT32 realized = GDIRealizePalette( hDC );
 
@@ -615,7 +673,7 @@
 /**********************************************************************
  *            UpdateColors16   (GDI.366)
  */
-INT16 UpdateColors16( HDC16 hDC )
+INT16 WINAPI UpdateColors16( HDC16 hDC )
 {
     HWND32 hWnd = WindowFromDC32( hDC );
 
@@ -631,7 +689,7 @@
 /**********************************************************************
  *            UpdateColors32   (GDI32.359)
  */
-BOOL32 UpdateColors32( HDC32 hDC )
+BOOL32 WINAPI UpdateColors32( HDC32 hDC )
 {
     UpdateColors16( hDC );
     return TRUE;
diff --git a/objects/pen.c b/objects/pen.c
index f33b791..c2c63ad 100644
--- a/objects/pen.c
+++ b/objects/pen.c
@@ -15,7 +15,7 @@
 /***********************************************************************
  *           CreatePen16    (GDI.61)
  */
-HPEN16 CreatePen16( INT16 style, INT16 width, COLORREF color )
+HPEN16 WINAPI CreatePen16( INT16 style, INT16 width, COLORREF color )
 {
     LOGPEN32 logpen = { style, { width, 0 }, color };
     dprintf_gdi(stddeb, "CreatePen16: %d %d %06lx\n", style, width, color );
@@ -26,7 +26,7 @@
 /***********************************************************************
  *           CreatePen32    (GDI32.55)
  */
-HPEN32 CreatePen32( INT32 style, INT32 width, COLORREF color )
+HPEN32 WINAPI CreatePen32( INT32 style, INT32 width, COLORREF color )
 {
     LOGPEN32 logpen = { style, { width, 0 }, color };
     dprintf_gdi(stddeb, "CreatePen32: %d %d %06lx\n", style, width, color );
@@ -37,7 +37,7 @@
 /***********************************************************************
  *           CreatePenIndirect16    (GDI.62)
  */
-HPEN16 CreatePenIndirect16( const LOGPEN16 * pen )
+HPEN16 WINAPI CreatePenIndirect16( const LOGPEN16 * pen )
 {
     PENOBJ * penPtr;
     HPEN16 hpen;
@@ -45,10 +45,11 @@
     if (pen->lopnStyle > PS_INSIDEFRAME) return 0;
     hpen = GDI_AllocObject( sizeof(PENOBJ), PEN_MAGIC );
     if (!hpen) return 0;
-    penPtr = (PENOBJ *)GDI_HEAP_LIN_ADDR( hpen );
+    penPtr = (PENOBJ *)GDI_HEAP_LOCK( hpen );
     penPtr->logpen.lopnStyle = pen->lopnStyle;
     penPtr->logpen.lopnColor = pen->lopnColor;
     CONV_POINT16TO32( &pen->lopnWidth, &penPtr->logpen.lopnWidth );
+    GDI_HEAP_UNLOCK( hpen );
     return hpen;
 }
 
@@ -56,7 +57,7 @@
 /***********************************************************************
  *           CreatePenIndirect32    (GDI32.56)
  */
-HPEN32 CreatePenIndirect32( const LOGPEN32 * pen )
+HPEN32 WINAPI CreatePenIndirect32( const LOGPEN32 * pen )
 {
     PENOBJ * penPtr;
     HPEN32 hpen;
@@ -64,10 +65,11 @@
     if (pen->lopnStyle > PS_INSIDEFRAME) return 0;
     hpen = GDI_AllocObject( sizeof(PENOBJ), PEN_MAGIC );
     if (!hpen) return 0;
-    penPtr = (PENOBJ *)GDI_HEAP_LIN_ADDR( hpen );
+    penPtr = (PENOBJ *)GDI_HEAP_LOCK( hpen );
     penPtr->logpen.lopnStyle = pen->lopnStyle;
     penPtr->logpen.lopnWidth = pen->lopnWidth;
     penPtr->logpen.lopnColor = pen->lopnColor;
+    GDI_HEAP_UNLOCK( hpen );
     return hpen;
 }
 
diff --git a/objects/region.c b/objects/region.c
index 9148e6d..a8e86e8 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -27,7 +27,7 @@
 /***********************************************************************
  *           OffsetRgn16    (GDI.101)
  */
-INT16 OffsetRgn16( HRGN16 hrgn, INT16 x, INT16 y )
+INT16 WINAPI OffsetRgn16( HRGN16 hrgn, INT16 x, INT16 y )
 {
     return OffsetRgn32( hrgn, x, y );
 }
@@ -36,13 +36,18 @@
 /***********************************************************************
  *           OffsetRgn32   (GDI32.256)
  */
-INT32 OffsetRgn32( HRGN32 hrgn, INT32 x, INT32 y )
+INT32 WINAPI OffsetRgn32( HRGN32 hrgn, INT32 x, INT32 y )
 {
     RGNOBJ * obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC );
     if (!obj) return ERROR;
     dprintf_region(stddeb, "OffsetRgn: %04x %d,%d\n", hrgn, x, y );
-    if (!obj->xrgn) return NULLREGION;
+    if (!obj->xrgn) 
+    {
+      GDI_HEAP_UNLOCK( hrgn );
+      return NULLREGION;
+    }
     XOffsetRegion( obj->xrgn, x, y );
+    GDI_HEAP_UNLOCK( hrgn );
     return COMPLEXREGION;
 }
 
@@ -50,7 +55,7 @@
 /***********************************************************************
  *           GetRgnBox16    (GDI.134)
  */
-INT16 GetRgnBox16( HRGN16 hrgn, LPRECT16 rect )
+INT16 WINAPI GetRgnBox16( HRGN16 hrgn, LPRECT16 rect )
 {
     RGNOBJ * obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC );
     if (!obj) return ERROR;
@@ -58,12 +63,14 @@
     if (!obj->xrgn)
     {
         SetRectEmpty16( rect );
+	GDI_HEAP_UNLOCK( hrgn );
         return NULLREGION;
     }
     else
     {
         XRectangle xrect;
         XClipBox( obj->xrgn, &xrect );
+	GDI_HEAP_UNLOCK(hrgn);
         SetRect16( rect, xrect.x, xrect.y,
                    xrect.x + xrect.width, xrect.y + xrect.height);
         return COMPLEXREGION;
@@ -74,7 +81,7 @@
 /***********************************************************************
  *           GetRgnBox32    (GDI32.219)
  */
-INT32 GetRgnBox32( HRGN32 hrgn, LPRECT32 rect )
+INT32 WINAPI GetRgnBox32( HRGN32 hrgn, LPRECT32 rect )
 {
     RECT16 r;
     INT16 ret = GetRgnBox16( hrgn, &r );
@@ -86,7 +93,7 @@
 /***********************************************************************
  *           CreateRectRgn16    (GDI.64)
  */
-HRGN16 CreateRectRgn16( INT16 left, INT16 top, INT16 right, INT16 bottom )
+HRGN16 WINAPI CreateRectRgn16(INT16 left, INT16 top, INT16 right, INT16 bottom)
 {
     return (HRGN16)CreateRectRgn32( left, top, right, bottom );
 }
@@ -95,13 +102,13 @@
 /***********************************************************************
  *           CreateRectRgn32   (GDI32.59)
  */
-HRGN32 CreateRectRgn32( INT32 left, INT32 top, INT32 right, INT32 bottom )
+HRGN32 WINAPI CreateRectRgn32(INT32 left, INT32 top, INT32 right, INT32 bottom)
 {
     HRGN32 hrgn;
     RGNOBJ *obj;
 
     if (!(hrgn = GDI_AllocObject( sizeof(RGNOBJ), REGION_MAGIC ))) return 0;
-    obj = (RGNOBJ *) GDI_HEAP_LIN_ADDR( hrgn );
+    obj = (RGNOBJ *) GDI_HEAP_LOCK( hrgn );
     if ((right > left) && (bottom > top))
     {
 	XRectangle rect = { left, top, right - left, bottom - top };
@@ -115,6 +122,7 @@
     else obj->xrgn = 0;
     dprintf_region( stddeb, "CreateRectRgn(%d,%d-%d,%d): returning %04x\n",
                     left, top, right, bottom, hrgn );
+    GDI_HEAP_UNLOCK( hrgn );
     return hrgn;
 }
 
@@ -122,7 +130,7 @@
 /***********************************************************************
  *           CreateRectRgnIndirect16    (GDI.65)
  */
-HRGN16 CreateRectRgnIndirect16( const RECT16* rect )
+HRGN16 WINAPI CreateRectRgnIndirect16( const RECT16* rect )
 {
     return CreateRectRgn32( rect->left, rect->top, rect->right, rect->bottom );
 }
@@ -131,7 +139,7 @@
 /***********************************************************************
  *           CreateRectRgnIndirect32    (GDI32.60)
  */
-HRGN32 CreateRectRgnIndirect32( const RECT32* rect )
+HRGN32 WINAPI CreateRectRgnIndirect32( const RECT32* rect )
 {
     return CreateRectRgn32( rect->left, rect->top, rect->right, rect->bottom );
 }
@@ -140,8 +148,8 @@
 /***********************************************************************
  *           SetRectRgn16    (GDI.172)
  */
-VOID SetRectRgn16( HRGN16 hrgn, INT16 left, INT16 top,
-                   INT16 right, INT16 bottom )
+VOID WINAPI SetRectRgn16( HRGN16 hrgn, INT16 left, INT16 top,
+                          INT16 right, INT16 bottom )
 {
     SetRectRgn32( hrgn, left, top, right, bottom );
 }
@@ -150,8 +158,8 @@
 /***********************************************************************
  *           SetRectRgn32    (GDI32.332)
  */
-VOID SetRectRgn32( HRGN32 hrgn, INT32 left, INT32 top,
-                   INT32 right, INT32 bottom )
+VOID WINAPI SetRectRgn32( HRGN32 hrgn, INT32 left, INT32 top,
+                          INT32 right, INT32 bottom )
 {
     RGNOBJ * obj;
 
@@ -167,14 +175,16 @@
             XUnionRectWithRegion( &rect, obj->xrgn, obj->xrgn );
     }
     else obj->xrgn = 0;
+    GDI_HEAP_UNLOCK( hrgn );
 }
 
 
 /***********************************************************************
  *           CreateRoundRectRgn16    (GDI.444)
  */
-HRGN16 CreateRoundRectRgn16( INT16 left, INT16 top, INT16 right, INT16 bottom,
-                             INT16 ellipse_width, INT16 ellipse_height )
+HRGN16 WINAPI CreateRoundRectRgn16( INT16 left, INT16 top,
+                                    INT16 right, INT16 bottom,
+                                    INT16 ellipse_width, INT16 ellipse_height )
 {
     return (HRGN16)CreateRoundRectRgn32( left, top, right, bottom,
                                          ellipse_width, ellipse_height );
@@ -184,8 +194,9 @@
 /***********************************************************************
  *           CreateRoundRectRgn32    (GDI32.61)
  */
-HRGN32 CreateRoundRectRgn32( INT32 left, INT32 top, INT32 right, INT32 bottom,
-                             INT32 ellipse_width, INT32 ellipse_height )
+HRGN32 WINAPI CreateRoundRectRgn32( INT32 left, INT32 top,
+                                    INT32 right, INT32 bottom,
+                                    INT32 ellipse_width, INT32 ellipse_height )
 {
     RGNOBJ * obj;
     HRGN32 hrgn;
@@ -201,7 +212,7 @@
       /* Create region */
 
     if (!(hrgn = GDI_AllocObject( sizeof(RGNOBJ), REGION_MAGIC ))) return 0;
-    obj = (RGNOBJ *) GDI_HEAP_LIN_ADDR( hrgn );
+    obj = (RGNOBJ *) GDI_HEAP_LOCK( hrgn );
     obj->xrgn = XCreateRegion();
     dprintf_region(stddeb,"CreateRoundRectRgn(%d,%d-%d,%d %dx%d): return=%04x\n",
                left, top, right, bottom, ellipse_width, ellipse_height, hrgn );
@@ -273,6 +284,7 @@
         rect.height = bottom - top + 1;
         XUnionRectWithRegion( &rect, obj->xrgn, obj->xrgn );
     }
+    GDI_HEAP_UNLOCK( hrgn );
     return hrgn;
 }
 
@@ -280,7 +292,8 @@
 /***********************************************************************
  *           CreateEllipticRgn16    (GDI.54)
  */
-HRGN16 CreateEllipticRgn16( INT16 left, INT16 top, INT16 right, INT16 bottom )
+HRGN16 WINAPI CreateEllipticRgn16( INT16 left, INT16 top,
+                                   INT16 right, INT16 bottom )
 {
     return (HRGN16)CreateRoundRectRgn32( left, top, right, bottom,
                                          right-left, bottom-top );
@@ -290,7 +303,8 @@
 /***********************************************************************
  *           CreateEllipticRgn32    (GDI32.39)
  */
-HRGN32 CreateEllipticRgn32( INT32 left, INT32 top, INT32 right, INT32 bottom )
+HRGN32 WINAPI CreateEllipticRgn32( INT32 left, INT32 top,
+                                   INT32 right, INT32 bottom )
 {
     return CreateRoundRectRgn32( left, top, right, bottom,
                                  right-left, bottom-top );
@@ -300,7 +314,7 @@
 /***********************************************************************
  *           CreateEllipticRgnIndirect16    (GDI.55)
  */
-HRGN16 CreateEllipticRgnIndirect16( const RECT16 *rect )
+HRGN16 WINAPI CreateEllipticRgnIndirect16( const RECT16 *rect )
 {
     return CreateRoundRectRgn32( rect->left, rect->top, rect->right,
                                  rect->bottom, rect->right - rect->left,
@@ -311,7 +325,7 @@
 /***********************************************************************
  *           CreateEllipticRgnIndirect32    (GDI32.40)
  */
-HRGN32 CreateEllipticRgnIndirect32( const RECT32 *rect )
+HRGN32 WINAPI CreateEllipticRgnIndirect32( const RECT32 *rect )
 {
     return CreateRoundRectRgn32( rect->left, rect->top, rect->right,
                                  rect->bottom, rect->right - rect->left,
@@ -322,7 +336,8 @@
 /***********************************************************************
  *           CreatePolygonRgn16    (GDI.63)
  */
-HRGN16 CreatePolygonRgn16( const POINT16 * points, INT16 count, INT16 mode )
+HRGN16 WINAPI CreatePolygonRgn16( const POINT16 * points, INT16 count,
+                                  INT16 mode )
 {
     return CreatePolyPolygonRgn16( points, &count, 1, mode );
 }
@@ -331,8 +346,9 @@
 /***********************************************************************
  *           CreatePolyPolygonRgn16    (GDI.451)
  */
-HRGN16 CreatePolyPolygonRgn16( const POINT16 * points, const INT16 * count,
-                               INT16 nbpolygons, INT16 mode )
+HRGN16 WINAPI CreatePolyPolygonRgn16( const POINT16 * points,
+                                      const INT16 * count,
+                                      INT16 nbpolygons, INT16 mode )
 {
     int		i,nrofpts;
     LPINT32	count32;
@@ -360,7 +376,8 @@
 /***********************************************************************
  *           CreatePolygonRgn32    (GDI32.58)
  */
-HRGN32 CreatePolygonRgn32( const POINT32 *points, INT32 count, INT32 mode )
+HRGN32 WINAPI CreatePolygonRgn32( const POINT32 *points, INT32 count,
+                                  INT32 mode )
 {
     return CreatePolyPolygonRgn32( points, &count, 1, mode );
 }
@@ -369,8 +386,9 @@
 /***********************************************************************
  *           CreatePolyPolygonRgn32    (GDI32.57)
  */
-HRGN32 CreatePolyPolygonRgn32( const POINT32 * points, const INT32 * count,
-                               INT32 nbpolygons, INT32 mode )
+HRGN32 WINAPI CreatePolyPolygonRgn32( const POINT32 * points,
+                                      const INT32 * count,
+                                      INT32 nbpolygons, INT32 mode )
 {
     RGNOBJ * obj;
     HRGN32 hrgn;
@@ -395,7 +413,7 @@
 	HeapFree( GetProcessHeap(), 0, xpoints );
 	return 0;
     }
-    obj = (RGNOBJ *) GDI_HEAP_LIN_ADDR( hrgn );
+    obj = (RGNOBJ *) GDI_HEAP_LOCK( hrgn );
     obj->xrgn = 0;
     dprintf_region(stddeb, "CreatePolyPolygonRgn: %d polygons, returning %04x\n",
                    nbpolygons, hrgn );
@@ -430,6 +448,7 @@
     }
 
     HeapFree( GetProcessHeap(), 0, xpoints );
+    GDI_HEAP_UNLOCK( hrgn );
     return hrgn;
 }
 
@@ -437,7 +456,7 @@
 /***********************************************************************
  *           PtInRegion16    (GDI.161)
  */
-BOOL16 PtInRegion16( HRGN16 hrgn, INT16 x, INT16 y )
+BOOL16 WINAPI PtInRegion16( HRGN16 hrgn, INT16 x, INT16 y )
 {
     return PtInRegion32( hrgn, x, y );
 }
@@ -446,50 +465,59 @@
 /***********************************************************************
  *           PtInRegion32    (GDI32.278)
  */
-BOOL32 PtInRegion32( HRGN32 hrgn, INT32 x, INT32 y )
+BOOL32 WINAPI PtInRegion32( HRGN32 hrgn, INT32 x, INT32 y )
 {
     RGNOBJ * obj;
+    BOOL32 result;
     
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC ))) return FALSE;
-    if (!obj->xrgn) return FALSE;
-    return XPointInRegion( obj->xrgn, x, y );
+    if (!obj->xrgn) result = FALSE;
+    else result = XPointInRegion( obj->xrgn, x, y );
+    GDI_HEAP_UNLOCK( hrgn );
+    return result;
 }
 
 
 /***********************************************************************
  *           RectInRegion16    (GDI.181)
  */
-BOOL16 RectInRegion16( HRGN16 hrgn, const RECT16 *rect )
+BOOL16 WINAPI RectInRegion16( HRGN16 hrgn, const RECT16 *rect )
 {
     RGNOBJ * obj;
-    
+    BOOL16 result;
+
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC ))) return FALSE;
-    if (!obj->xrgn) return FALSE;
-    return (XRectInRegion( obj->xrgn, rect->left, rect->top,
+    if (!obj->xrgn) result = FALSE;
+    else result = (XRectInRegion( obj->xrgn, rect->left, rect->top,
                            rect->right-rect->left,
                            rect->bottom-rect->top ) != RectangleOut);
+    GDI_HEAP_UNLOCK( hrgn );
+    return result;
 }
 
 
 /***********************************************************************
  *           RectInRegion32    (GDI32.281)
  */
-BOOL32 RectInRegion32( HRGN32 hrgn, const RECT32 *rect )
+BOOL32 WINAPI RectInRegion32( HRGN32 hrgn, const RECT32 *rect )
 {
     RGNOBJ * obj;
+    BOOL32 result;
     
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC ))) return FALSE;
-    if (!obj->xrgn) return FALSE;
-    return (XRectInRegion( obj->xrgn, rect->left, rect->top,
+    if (!obj->xrgn) result = FALSE;
+    else result = (XRectInRegion( obj->xrgn, rect->left, rect->top,
                            rect->right-rect->left,
                            rect->bottom-rect->top ) != RectangleOut);
+    GDI_HEAP_UNLOCK( hrgn );
+    return result;
 }
 
 
 /***********************************************************************
  *           EqualRgn16    (GDI.72)
  */
-BOOL16 EqualRgn16( HRGN16 rgn1, HRGN16 rgn2 )
+BOOL16 WINAPI EqualRgn16( HRGN16 rgn1, HRGN16 rgn2 )
 {
     return EqualRgn32( rgn1, rgn2 );
 }
@@ -498,13 +526,22 @@
 /***********************************************************************
  *           EqualRgn32    (GDI32.90)
  */
-BOOL32 EqualRgn32( HRGN32 rgn1, HRGN32 rgn2 )
+BOOL32 WINAPI EqualRgn32( HRGN32 rgn1, HRGN32 rgn2 )
 {
     RGNOBJ *obj1, *obj2;
+    BOOL32 result;
+
     if (!(obj1 = (RGNOBJ *) GDI_GetObjPtr( rgn1, REGION_MAGIC ))) return FALSE;
-    if (!(obj2 = (RGNOBJ *) GDI_GetObjPtr( rgn2, REGION_MAGIC ))) return FALSE;
-    if (!obj1->xrgn || !obj2->xrgn) return (!obj1->xrgn && !obj2->xrgn);
-    return XEqualRegion( obj1->xrgn, obj2->xrgn );
+    if (!(obj2 = (RGNOBJ *) GDI_GetObjPtr( rgn2, REGION_MAGIC ))) 
+    {
+      GDI_HEAP_UNLOCK( rgn1 );
+      return FALSE;
+    }
+    if (!obj1->xrgn || !obj2->xrgn) result = (!obj1->xrgn && !obj2->xrgn);
+    else result = XEqualRegion( obj1->xrgn, obj2->xrgn );
+    GDI_HEAP_UNLOCK( rgn1 );
+    GDI_HEAP_UNLOCK( rgn2 );
+    return result;
 }
 
 
@@ -558,6 +595,7 @@
     else
       ret = COMPLEXREGION;
     XUnionRectWithRegion( &rect, rgnObj->xrgn, rgnObj->xrgn );
+    GDI_HEAP_UNLOCK( hRgn );
   }
   return ret;
 }
@@ -575,13 +613,20 @@
 
     destObj = (RGNOBJ*) GDI_GetObjPtr( hDest, REGION_MAGIC );
     srcObj  = (RGNOBJ*) GDI_GetObjPtr( hSrc, REGION_MAGIC );
-    if (!srcObj->xrgn) return FALSE;
+    if (!srcObj->xrgn) 
+    {
+      GDI_HEAP_UNLOCK( hDest );
+      GDI_HEAP_UNLOCK( hSrc );
+      return FALSE;
+    }
     REGION_CopyRegion( srcObj, destObj );
     XShrinkRegion( destObj->xrgn, -x, -y );
     result = XCreateRegion();
     XSubtractRegion( destObj->xrgn, srcObj->xrgn, result );
     XDestroyRegion( destObj->xrgn );
     destObj->xrgn = result;
+    GDI_HEAP_UNLOCK( hDest );
+    GDI_HEAP_UNLOCK( hSrc );
     return TRUE;
 }
 
@@ -589,7 +634,7 @@
 /***********************************************************************
  *           CombineRgn16    (GDI.451)
  */
-INT16 CombineRgn16( HRGN16 hDest, HRGN16 hSrc1, HRGN16 hSrc2, INT16 mode )
+INT16 WINAPI CombineRgn16(HRGN16 hDest, HRGN16 hSrc1, HRGN16 hSrc2, INT16 mode)
 {
     return (INT16)CombineRgn32( hDest, hSrc1, hSrc2, mode );
 }
@@ -600,10 +645,11 @@
  *
  * Note: The behavior is correct even if src and dest regions are the same.
  */
-INT32 CombineRgn32( HRGN32 hDest, HRGN32 hSrc1, HRGN32 hSrc2, INT32 mode )
+INT32 WINAPI CombineRgn32(HRGN32 hDest, HRGN32 hSrc1, HRGN32 hSrc2, INT32 mode)
 {
     RGNOBJ *destObj, *src1Obj, *src2Obj;
     Region destrgn;
+    INT32 result;
 
     dprintf_region(stddeb, "CombineRgn: %04x,%04x -> %04x mode=%x\n", 
 		   hSrc1, hSrc2, hDest, mode );
@@ -611,12 +657,24 @@
     if (!(destObj = (RGNOBJ *) GDI_GetObjPtr( hDest, REGION_MAGIC )))
 	return ERROR;
     if (!(src1Obj = (RGNOBJ *) GDI_GetObjPtr( hSrc1, REGION_MAGIC )))
+    {
+        GDI_HEAP_UNLOCK( hDest );
 	return ERROR;
-    if (mode == RGN_COPY) return REGION_CopyRegion( src1Obj, destObj );
+    }
+    if (mode == RGN_COPY) 
+    {
+       result = REGION_CopyRegion( src1Obj, destObj );
+       GDI_HEAP_UNLOCK( hDest );
+       GDI_HEAP_UNLOCK( hSrc1 );
+       return result;
+    }
 
     if (!(src2Obj = (RGNOBJ *) GDI_GetObjPtr( hSrc2, REGION_MAGIC )))
-        return ERROR;
-
+    {
+       GDI_HEAP_UNLOCK( hDest );
+       GDI_HEAP_UNLOCK( hSrc1 );
+       return ERROR;
+    }
       /* Some optimizations for null regions */
 
     if (!src1Obj->xrgn || !src2Obj->xrgn)
@@ -625,26 +683,48 @@
         {
         case RGN_DIFF:
             if (src1Obj->xrgn)
-                return REGION_CopyRegion( src1Obj, destObj );
+	    {
+                result = REGION_CopyRegion( src1Obj, destObj );
+		GDI_HEAP_UNLOCK( hDest );
+		GDI_HEAP_UNLOCK( hSrc1 );
+		GDI_HEAP_UNLOCK( hSrc2 );
+		return result;
+	    }
             /* else fall through */
         case RGN_AND:
             if (destObj->xrgn) XDestroyRegion( destObj->xrgn );
 	    destObj->xrgn = 0;
+	    GDI_HEAP_UNLOCK( hDest );
+	    GDI_HEAP_UNLOCK( hSrc1 );
+	    GDI_HEAP_UNLOCK( hSrc2 );
 	    return NULLREGION;
         case RGN_OR:
         case RGN_XOR:
             if (src1Obj->xrgn)
-                return REGION_CopyRegion( src1Obj, destObj );
+                result = REGION_CopyRegion( src1Obj, destObj );
             else
-                return REGION_CopyRegion( src2Obj, destObj );
+                result = REGION_CopyRegion( src2Obj, destObj );
+	    GDI_HEAP_UNLOCK( hDest );
+	    GDI_HEAP_UNLOCK( hSrc1 );
+	    GDI_HEAP_UNLOCK( hSrc2 );
+	    return result;
 	default:
+	    GDI_HEAP_UNLOCK( hDest );
+	    GDI_HEAP_UNLOCK( hSrc1 );
+	    GDI_HEAP_UNLOCK( hSrc2 );
 	    return ERROR;
         }
     }
 
       /* Perform the operation with the two X regions */
 
-    if (!(destrgn = XCreateRegion())) return ERROR;
+    if (!(destrgn = XCreateRegion()))
+    {
+      GDI_HEAP_UNLOCK( hDest );
+      GDI_HEAP_UNLOCK( hSrc1 );
+      GDI_HEAP_UNLOCK( hSrc2 );
+      return ERROR;
+    }
     switch(mode)
     {
     case RGN_AND:
@@ -661,6 +741,9 @@
         break;
     default:
         XDestroyRegion( destrgn );
+	GDI_HEAP_UNLOCK( hDest );
+	GDI_HEAP_UNLOCK( hSrc1 );
+	GDI_HEAP_UNLOCK( hSrc2 );
         return ERROR;
     }
     if (destObj->xrgn) XDestroyRegion( destObj->xrgn );
@@ -669,7 +752,13 @@
     {
         XDestroyRegion( destObj->xrgn );
         destObj->xrgn = 0;
+	GDI_HEAP_UNLOCK( hDest );
+	GDI_HEAP_UNLOCK( hSrc1 );
+	GDI_HEAP_UNLOCK( hSrc2 );
         return NULLREGION;
     }
+    GDI_HEAP_UNLOCK( hDest );
+    GDI_HEAP_UNLOCK( hSrc1 );
+    GDI_HEAP_UNLOCK( hSrc2 );
     return COMPLEXREGION;
 }
diff --git a/objects/text.c b/objects/text.c
index 176ddd6..1b46830 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -182,8 +182,8 @@
 /***********************************************************************
  *           DrawText16    (USER.85)
  */
-INT16 DrawText16( HDC16 hdc, LPCSTR str, INT16 i_count,
-                  LPRECT16 rect, UINT16 flags )
+INT16 WINAPI DrawText16( HDC16 hdc, LPCSTR str, INT16 i_count,
+                         LPRECT16 rect, UINT16 flags )
 {
     SIZE16 size;
     const char *strPtr;
@@ -285,8 +285,8 @@
 /***********************************************************************
  *           DrawText32A    (USER32.163)
  */
-INT32 DrawText32A( HDC32 hdc, LPCSTR str, INT32 count,
-                   LPRECT32 rect, UINT32 flags )
+INT32 WINAPI DrawText32A( HDC32 hdc, LPCSTR str, INT32 count,
+                          LPRECT32 rect, UINT32 flags )
 {
     RECT16 rect16;
     INT16 ret;
@@ -303,8 +303,8 @@
 /***********************************************************************
  *           DrawText32W    (USER32.166)
  */
-INT32 DrawText32W( HDC32 hdc, LPCWSTR str, INT32 count,
-                   LPRECT32 rect, UINT32 flags )
+INT32 WINAPI DrawText32W( HDC32 hdc, LPCWSTR str, INT32 count,
+                          LPRECT32 rect, UINT32 flags )
 {
     LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
     INT32 ret = DrawText32A( hdc, p, count, rect, flags );
@@ -316,9 +316,9 @@
 /***********************************************************************
  *           ExtTextOut16    (GDI.351)
  */
-BOOL16 ExtTextOut16( HDC16 hdc, INT16 x, INT16 y, UINT16 flags,
-                     const RECT16 *lprect, LPCSTR str, UINT16 count,
-                     const INT16 *lpDx )
+BOOL16 WINAPI ExtTextOut16( HDC16 hdc, INT16 x, INT16 y, UINT16 flags,
+                            const RECT16 *lprect, LPCSTR str, UINT16 count,
+                            const INT16 *lpDx )
 {
     BOOL32	ret;
     int		i;
@@ -338,9 +338,9 @@
 /***********************************************************************
  *           ExtTextOut32A    (GDI32.98)
  */
-BOOL32 ExtTextOut32A( HDC32 hdc, INT32 x, INT32 y, UINT32 flags,
-                      const RECT32 *lprect, LPCSTR str, UINT32 count,
-                      const INT32 *lpDx )
+BOOL32 WINAPI ExtTextOut32A( HDC32 hdc, INT32 x, INT32 y, UINT32 flags,
+                             const RECT32 *lprect, LPCSTR str, UINT32 count,
+                             const INT32 *lpDx )
 {
     DC * dc = DC_GetDCPtr( hdc );
     return dc && dc->funcs->pExtTextOut && 
@@ -351,9 +351,9 @@
 /***********************************************************************
  *           ExtTextOut32W    (GDI32.99)
  */
-BOOL32 ExtTextOut32W( HDC32 hdc, INT32 x, INT32 y, UINT32 flags,
-                      const RECT32 *lprect, LPCWSTR str, UINT32 count,
-                      const INT32 *lpDx )
+BOOL32 WINAPI ExtTextOut32W( HDC32 hdc, INT32 x, INT32 y, UINT32 flags,
+                             const RECT32 *lprect, LPCWSTR str, UINT32 count,
+                             const INT32 *lpDx )
 {
     LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
     INT32 ret = ExtTextOut32A( hdc, x, y, flags, lprect, p, count, lpDx );
@@ -365,7 +365,7 @@
 /***********************************************************************
  *           TextOut16    (GDI.33)
  */
-BOOL16 TextOut16( HDC16 hdc, INT16 x, INT16 y, LPCSTR str, INT16 count )
+BOOL16 WINAPI TextOut16( HDC16 hdc, INT16 x, INT16 y, LPCSTR str, INT16 count )
 {
     return ExtTextOut16( hdc, x, y, 0, NULL, str, count, NULL );
 }
@@ -374,7 +374,7 @@
 /***********************************************************************
  *           TextOut32A    (GDI32.355)
  */
-BOOL32 TextOut32A( HDC32 hdc, INT32 x, INT32 y, LPCSTR str, INT32 count )
+BOOL32 WINAPI TextOut32A( HDC32 hdc, INT32 x, INT32 y, LPCSTR str, INT32 count )
 {
     return ExtTextOut32A( hdc, x, y, 0, NULL, str, count, NULL );
 }
@@ -383,7 +383,7 @@
 /***********************************************************************
  *           TextOut32W    (GDI32.356)
  */
-BOOL32 TextOut32W( HDC32 hdc, INT32 x, INT32 y, LPCWSTR str, INT32 count )
+BOOL32 WINAPI TextOut32W(HDC32 hdc, INT32 x, INT32 y, LPCWSTR str, INT32 count)
 {
     return ExtTextOut32W( hdc, x, y, 0, NULL, str, count, NULL );
 }
@@ -392,9 +392,9 @@
 /***********************************************************************
  *           GrayString16   (USER.185)
  */
-BOOL16 GrayString16( HDC16 hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 gsprc,
-                     LPARAM lParam, INT16 cch, INT16 x, INT16 y,
-                     INT16 cx, INT16 cy )
+BOOL16 WINAPI GrayString16( HDC16 hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 gsprc,
+                            LPARAM lParam, INT16 cch, INT16 x, INT16 y,
+                            INT16 cx, INT16 cy )
 {
     BOOL16 ret;
     COLORREF current_color;
@@ -411,9 +411,9 @@
 /***********************************************************************
  *           GrayString32A   (USER32.314)
  */
-BOOL32 GrayString32A( HDC32 hdc, HBRUSH32 hbr, GRAYSTRINGPROC32 gsprc,
-                      LPARAM lParam, INT32 cch, INT32 x, INT32 y,
-                      INT32 cx, INT32 cy )
+BOOL32 WINAPI GrayString32A( HDC32 hdc, HBRUSH32 hbr, GRAYSTRINGPROC32 gsprc,
+                             LPARAM lParam, INT32 cch, INT32 x, INT32 y,
+                             INT32 cx, INT32 cy )
 {
     BOOL32 ret;
     COLORREF current_color;
@@ -430,9 +430,9 @@
 /***********************************************************************
  *           GrayString32W   (USER32.315)
  */
-BOOL32 GrayString32W( HDC32 hdc, HBRUSH32 hbr, GRAYSTRINGPROC32 gsprc,
-                      LPARAM lParam, INT32 cch, INT32 x, INT32 y,
-                      INT32 cx, INT32 cy )
+BOOL32 WINAPI GrayString32W( HDC32 hdc, HBRUSH32 hbr, GRAYSTRINGPROC32 gsprc,
+                             LPARAM lParam, INT32 cch, INT32 x, INT32 y,
+                             INT32 cx, INT32 cy )
 {
     BOOL32 ret;
     COLORREF current_color;
@@ -523,8 +523,9 @@
 /***********************************************************************
  *           TabbedTextOut16    (USER.196)
  */
-LONG TabbedTextOut16( HDC16 hdc, INT16 x, INT16 y, LPCSTR lpstr, INT16 count, 
-                      INT16 cTabStops, const INT16 *lpTabPos, INT16 nTabOrg )
+LONG WINAPI TabbedTextOut16( HDC16 hdc, INT16 x, INT16 y, LPCSTR lpstr,
+                             INT16 count, INT16 cTabStops,
+                             const INT16 *lpTabPos, INT16 nTabOrg )
 {
     dprintf_text( stddeb, "TabbedTextOut16: %04x %d,%d '%.*s' %d\n",
                   hdc, x, y, count, lpstr, count );
@@ -536,8 +537,9 @@
 /***********************************************************************
  *           TabbedTextOut32A    (USER32.541)
  */
-LONG TabbedTextOut32A( HDC32 hdc, INT32 x, INT32 y, LPCSTR lpstr, INT32 count, 
-                       INT32 cTabStops, const INT32 *lpTabPos, INT32 nTabOrg )
+LONG WINAPI TabbedTextOut32A( HDC32 hdc, INT32 x, INT32 y, LPCSTR lpstr,
+                              INT32 count, INT32 cTabStops,
+                              const INT32 *lpTabPos, INT32 nTabOrg )
 {
     dprintf_text( stddeb, "TabbedTextOut32A: %04x %d,%d '%.*s' %d\n",
                   hdc, x, y, count, lpstr, count );
@@ -549,8 +551,9 @@
 /***********************************************************************
  *           TabbedTextOut32W    (USER32.542)
  */
-LONG TabbedTextOut32W( HDC32 hdc, INT32 x, INT32 y, LPCWSTR str, INT32 count, 
-                       INT32 cTabStops, const INT32 *lpTabPos, INT32 nTabOrg )
+LONG WINAPI TabbedTextOut32W( HDC32 hdc, INT32 x, INT32 y, LPCWSTR str,
+                              INT32 count, INT32 cTabStops,
+                              const INT32 *lpTabPos, INT32 nTabOrg )
 {
     LONG ret;
     LPSTR p = HEAP_xalloc( GetProcessHeap(), 0, count + 1 );
@@ -565,8 +568,8 @@
 /***********************************************************************
  *           GetTabbedTextExtent16    (USER.197)
  */
-DWORD GetTabbedTextExtent16( HDC16 hdc, LPCSTR lpstr, INT16 count, 
-                             INT16 cTabStops, const INT16 *lpTabPos )
+DWORD WINAPI GetTabbedTextExtent16( HDC16 hdc, LPCSTR lpstr, INT16 count, 
+                                    INT16 cTabStops, const INT16 *lpTabPos )
 {
     dprintf_text( stddeb, "GetTabbedTextExtent: %04x '%.*s' %d\n",
                   hdc, count, lpstr, count );
@@ -578,8 +581,8 @@
 /***********************************************************************
  *           GetTabbedTextExtent32A    (USER32.292)
  */
-DWORD GetTabbedTextExtent32A( HDC32 hdc, LPCSTR lpstr, INT32 count, 
-                              INT32 cTabStops, const INT32 *lpTabPos )
+DWORD WINAPI GetTabbedTextExtent32A( HDC32 hdc, LPCSTR lpstr, INT32 count, 
+                                     INT32 cTabStops, const INT32 *lpTabPos )
 {
     dprintf_text( stddeb, "GetTabbedTextExtent: %04x '%.*s' %d\n",
                   hdc, count, lpstr, count );
@@ -591,8 +594,8 @@
 /***********************************************************************
  *           GetTabbedTextExtent32W    (USER32.293)
  */
-DWORD GetTabbedTextExtent32W( HDC32 hdc, LPCWSTR lpstr, INT32 count, 
-                              INT32 cTabStops, const INT32 *lpTabPos )
+DWORD WINAPI GetTabbedTextExtent32W( HDC32 hdc, LPCWSTR lpstr, INT32 count, 
+                                     INT32 cTabStops, const INT32 *lpTabPos )
 {
     LONG ret;
     LPSTR p = HEAP_xalloc( GetProcessHeap(), 0, count + 1 );
@@ -605,11 +608,13 @@
 /***********************************************************************
  *           GetTextCharset    (USER32.226) (USER.612)
  */
-INT32 GetTextCharset32(HDC32 hdc) {
+INT32 WINAPI GetTextCharset32(HDC32 hdc)
+{
     fprintf(stdnimp,"GetTextCharset(0x%x)\n",hdc);
     return DEFAULT_CHARSET; /* FIXME */
 }
 
-INT16 GetTextCharset16(HDC16 hdc) {
+INT16 WINAPI GetTextCharset16(HDC16 hdc)
+{
     return GetTextCharset32(hdc);
 }
diff --git a/scheduler/process.c b/scheduler/process.c
index 05fa39d..2819562 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -219,7 +219,7 @@
 /*********************************************************************
  *           CloseHandle   (KERNEL32.23)
  */
-BOOL32 CloseHandle( HANDLE32 handle )
+BOOL32 WINAPI CloseHandle( HANDLE32 handle )
 {
     BOOL32 ret = FALSE;
     K32OBJ *ptr = NULL;
@@ -350,7 +350,7 @@
 /***********************************************************************
  *           ExitProcess   (KERNEL32.100)
  */
-void ExitProcess( DWORD status )
+void WINAPI ExitProcess( DWORD status )
 {
     TASK_KillCurrentTask( status );
 }
@@ -359,7 +359,7 @@
 /***********************************************************************
  *           GetCurrentProcess   (KERNEL32.198)
  */
-HANDLE32 GetCurrentProcess(void)
+HANDLE32 WINAPI GetCurrentProcess(void)
 {
     return 0x7fffffff;
 }
@@ -368,7 +368,7 @@
 /***********************************************************************
  *           GetCurrentProcessId   (KERNEL32.199)
  */
-DWORD GetCurrentProcessId(void)
+DWORD WINAPI GetCurrentProcessId(void)
 {
     return (DWORD)pCurrentProcess;
 }
@@ -377,7 +377,7 @@
 /***********************************************************************
  *      GetEnvironmentStrings32A   (KERNEL32.210) (KERNEL32.211)
  */
-LPSTR GetEnvironmentStrings32A(void)
+LPSTR WINAPI GetEnvironmentStrings32A(void)
 {
     assert( pCurrentProcess );
     return pCurrentProcess->env_db->environ;
@@ -387,7 +387,7 @@
 /***********************************************************************
  *      GetEnvironmentStrings32W   (KERNEL32.212)
  */
-LPWSTR GetEnvironmentStrings32W(void)
+LPWSTR WINAPI GetEnvironmentStrings32W(void)
 {
     INT32 size;
     LPWSTR ret, pW;
@@ -414,7 +414,7 @@
 /***********************************************************************
  *           FreeEnvironmentStrings32A   (KERNEL32.141)
  */
-BOOL32 FreeEnvironmentStrings32A( LPSTR ptr )
+BOOL32 WINAPI FreeEnvironmentStrings32A( LPSTR ptr )
 {
     assert( pCurrentProcess );
     if (ptr != pCurrentProcess->env_db->environ)
@@ -429,7 +429,7 @@
 /***********************************************************************
  *           FreeEnvironmentStrings32W   (KERNEL32.142)
  */
-BOOL32 FreeEnvironmentStrings32W( LPWSTR ptr )
+BOOL32 WINAPI FreeEnvironmentStrings32W( LPWSTR ptr )
 {
     assert( pCurrentProcess );
     return HeapFree( GetProcessHeap(), 0, ptr );
@@ -439,7 +439,7 @@
 /***********************************************************************
  *          GetEnvironmentVariable32A   (KERNEL32.213)
  */
-DWORD GetEnvironmentVariable32A( LPCSTR name, LPSTR value, DWORD size )
+DWORD WINAPI GetEnvironmentVariable32A( LPCSTR name, LPSTR value, DWORD size )
 {
     LPSTR p;
     INT32 len, res;
@@ -470,7 +470,7 @@
 /***********************************************************************
  *           GetEnvironmentVariable32W   (KERNEL32.214)
  */
-DWORD GetEnvironmentVariable32W( LPCWSTR nameW, LPWSTR valW, DWORD size )
+DWORD WINAPI GetEnvironmentVariable32W( LPCWSTR nameW, LPWSTR valW, DWORD size)
 {
     LPSTR name = HEAP_strdupWtoA( GetProcessHeap(), 0, nameW );
     LPSTR val  = HeapAlloc( GetProcessHeap(), 0, size );
@@ -485,7 +485,7 @@
 /***********************************************************************
  *           SetEnvironmentVariable32A   (KERNEL32.484)
  */
-BOOL32 SetEnvironmentVariable32A( LPCSTR name, LPCSTR value )
+BOOL32 WINAPI SetEnvironmentVariable32A( LPCSTR name, LPCSTR value )
 {
     INT32 size, len, res;
     LPSTR p, env, new_env;
@@ -535,7 +535,7 @@
 /***********************************************************************
  *           SetEnvironmentVariable32W   (KERNEL32.485)
  */
-BOOL32 SetEnvironmentVariable32W( LPCWSTR name, LPCWSTR value )
+BOOL32 WINAPI SetEnvironmentVariable32W( LPCWSTR name, LPCWSTR value )
 {
     LPSTR nameA  = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
     LPSTR valueA = HEAP_strdupWtoA( GetProcessHeap(), 0, value );
@@ -549,7 +549,8 @@
 /***********************************************************************
  *           ExpandEnvironmentVariablesA   (KERNEL32.103)
  */
-DWORD ExpandEnvironmentStrings32A( LPCSTR src, LPSTR dst, DWORD len) {
+DWORD WINAPI ExpandEnvironmentStrings32A( LPCSTR src, LPSTR dst, DWORD len)
+{
 	LPCSTR s;
         LPSTR d;
 	HANDLE32	heap = GetProcessHeap();
@@ -622,7 +623,8 @@
 /***********************************************************************
  *           ExpandEnvironmentVariablesA   (KERNEL32.104)
  */
-DWORD ExpandEnvironmentStrings32W( LPCWSTR src, LPWSTR dst, DWORD len) {
+DWORD WINAPI ExpandEnvironmentStrings32W( LPCWSTR src, LPWSTR dst, DWORD len)
+{
 	HANDLE32	heap = GetProcessHeap();
 	LPSTR		srcA = HEAP_strdupWtoA(heap,0,src);
 	LPSTR		dstA = HeapAlloc(heap,0,len);
@@ -637,7 +639,7 @@
 /***********************************************************************
  *           GetProcessHeap    (KERNEL32.259)
  */
-HANDLE32 GetProcessHeap(void)
+HANDLE32 WINAPI GetProcessHeap(void)
 {
     if (!pCurrentProcess) return SystemHeap;  /* For the boot-up code */
     return pCurrentProcess->heap;
@@ -647,7 +649,7 @@
 /***********************************************************************
  *           GetThreadLocale    (KERNEL32.295)
  */
-LCID GetThreadLocale(void)
+LCID WINAPI GetThreadLocale(void)
 {
     return pCurrentProcess->locale;
 }
@@ -656,7 +658,7 @@
 /***********************************************************************
  *           SetPriorityClass   (KERNEL32.503)
  */
-BOOL32 SetPriorityClass( HANDLE32 hprocess, DWORD priorityclass )
+BOOL32 WINAPI SetPriorityClass( HANDLE32 hprocess, DWORD priorityclass )
 {
     PDB32	*pdb;
 
@@ -688,7 +690,7 @@
 /***********************************************************************
  *           GetPriorityClass   (KERNEL32.250)
  */
-DWORD GetPriorityClass(HANDLE32 hprocess)
+DWORD WINAPI GetPriorityClass(HANDLE32 hprocess)
 {
     PDB32	*pdb;
     DWORD	ret;
@@ -726,7 +728,7 @@
  * FIXME: These should be allocated when a console is created, or inherited
  *        from the parent.
  */
-HANDLE32 GetStdHandle( DWORD std_handle )
+HANDLE32 WINAPI GetStdHandle( DWORD std_handle )
 {
     HFILE32 hFile;
     int fd;
@@ -771,7 +773,7 @@
 /***********************************************************************
  *           SetStdHandle    (KERNEL32.506)
  */
-BOOL32 SetStdHandle( DWORD std_handle, HANDLE32 handle )
+BOOL32 WINAPI SetStdHandle( DWORD std_handle, HANDLE32 handle )
 {
     assert( pCurrentProcess );
     switch(std_handle)
@@ -793,8 +795,8 @@
 /***********************************************************************
  *           GetProcessVersion    (KERNEL32)
  */
-DWORD
-GetProcessVersion(DWORD processid) {
+DWORD WINAPI GetProcessVersion(DWORD processid)
+{
 	PDB32	*process;
 	TDB	*pTask;
 
@@ -808,3 +810,65 @@
 		return 0;
 	return (pTask->version&0xff) | (((pTask->version >>8) & 0xff)<<16);
 }
+
+/***********************************************************************
+ *           SetProcessWorkingSetSize    (KERNEL32)
+ */
+BOOL32 WINAPI SetProcessWorkingSetSize(HANDLE32 hProcess,DWORD minset,
+                                       DWORD maxset)
+{
+	fprintf(stderr,"SetProcessWorkingSetSize(0x%08x,%ld,%ld), STUB!\n",
+		hProcess,minset,maxset
+	);
+	return TRUE;
+}
+
+/***********************************************************************
+ *           GetProcessWorkingSetSize    (KERNEL32)
+ */
+BOOL32 WINAPI GetProcessWorkingSetSize(HANDLE32 hProcess,LPDWORD minset,
+                                       LPDWORD maxset)
+{
+	fprintf(stderr,"SetProcessWorkingSetSize(0x%08x,%p,%p), STUB!\n",
+		hProcess,minset,maxset
+	);
+	/* 32 MB working set size */
+	if (minset) *minset = 32*1024*1024;
+	if (maxset) *maxset = 32*1024*1024;
+	return TRUE;
+}
+
+/***********************************************************************
+ *           SetProcessShutdownParameters    (KERNEL32)
+ */
+BOOL32 WINAPI SetProcessShutdownParameters(DWORD level,DWORD flags)
+{
+	fprintf(stderr,"SetProcessShutdownParameters(%ld,0x%08lx), STUB!\n",
+		level,flags
+	);
+	return TRUE;
+}
+
+/***********************************************************************
+ *           ReadProcessMemory    		(KERNEL32)
+ * FIXME: check this, if we ever run win32 binaries in different addressspaces
+ *	  ... and add a sizecheck
+ */
+BOOL32 WINAPI ReadProcessMemory( HANDLE32 hProcess, LPCVOID lpBaseAddress,
+                                 LPVOID lpBuffer, DWORD nSize,
+                                 LPDWORD lpNumberOfBytesRead )
+{
+	memcpy(lpBuffer,lpBaseAddress,nSize);
+	if (lpNumberOfBytesRead) *lpNumberOfBytesRead = nSize;
+	return TRUE;
+}
+
+/***********************************************************************
+ *           ConvertToGlobalHandle    		(KERNEL32)
+ * FIXME: this is not correctly implemented...
+ */
+HANDLE32 WINAPI ConvertToGlobalHandle(HANDLE32 h)
+{
+	fprintf(stderr,"ConvertToGlobalHandle(%d),stub!\n",h);
+	return h;
+}
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 22f78f6..7d1bbe2 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -12,6 +12,8 @@
 #include "selectors.h"
 #include "miscemu.h"
 #include "winnt.h"
+#include "debug.h"
+#include "stddebug.h"
 
 THDB *pCurrentThread = NULL;
 
@@ -114,9 +116,9 @@
  *
  * The only thing missing here is actually getting the thread to run ;-)
  */
-HANDLE32 CreateThread( LPSECURITY_ATTRIBUTES attribs, DWORD stack,
-                       LPTHREAD_START_ROUTINE start, LPVOID param,
-                       DWORD flags, LPDWORD id )
+HANDLE32 WINAPI CreateThread( LPSECURITY_ATTRIBUTES attribs, DWORD stack,
+                              LPTHREAD_START_ROUTINE start, LPVOID param,
+                              DWORD flags, LPDWORD id )
 {
     HANDLE32 handle;
     THDB *thread = THREAD_Create( pCurrentProcess, stack, start );
@@ -136,7 +138,7 @@
 /***********************************************************************
  *           GetCurrentThread   (KERNEL32.200)
  */
-HANDLE32 GetCurrentThread(void)
+HANDLE32 WINAPI GetCurrentThread(void)
 {
     return 0xFFFFFFFE;
 }
@@ -146,7 +148,7 @@
  *           GetCurrentThreadId   (KERNEL32.201)
  * Returns crypted (xor'ed) pointer to THDB in Win95.
  */
-DWORD GetCurrentThreadId(void)
+DWORD WINAPI GetCurrentThreadId(void)
 {
     /* FIXME: should probably use %fs register here */
     assert( pCurrentThread );
@@ -157,7 +159,7 @@
 /**********************************************************************
  *           GetLastError   (KERNEL.148) (KERNEL32.227)
  */
-DWORD GetLastError(void)
+DWORD WINAPI GetLastError(void)
 {
     THDB *thread = (THDB *)GetCurrentThreadId();
     return thread->last_error;
@@ -167,7 +169,7 @@
 /**********************************************************************
  *           SetLastError   (KERNEL.147) (KERNEL32.497)
  */
-void SetLastError( DWORD error )
+void WINAPI SetLastError( DWORD error )
 {
     THDB *thread;
     if (!pCurrentThread) return;  /* FIXME */
@@ -179,7 +181,7 @@
 /**********************************************************************
  *           SetLastErrorEx   (USER32.484)
  */
-void SetLastErrorEx( DWORD error, DWORD type )
+void WINAPI SetLastErrorEx( DWORD error, DWORD type )
 {
     /* FIXME: what about 'type'? */
     SetLastError( error );
@@ -189,7 +191,7 @@
 /**********************************************************************
  *           TlsAlloc   (KERNEL32.530)
  */
-DWORD TlsAlloc(void)
+DWORD WINAPI TlsAlloc(void)
 {
     DWORD i, mask, ret = 0;
     THDB *thread = (THDB *)GetCurrentThreadId();
@@ -216,7 +218,7 @@
 /**********************************************************************
  *           TlsFree   (KERNEL32.531)
  */
-BOOL32 TlsFree( DWORD index )
+BOOL32 WINAPI TlsFree( DWORD index )
 {
     DWORD mask;
     THDB *thread = (THDB *)GetCurrentThreadId();
@@ -246,7 +248,7 @@
 /**********************************************************************
  *           TlsGetValue   (KERNEL32.532)
  */
-LPVOID TlsGetValue( DWORD index )
+LPVOID WINAPI TlsGetValue( DWORD index )
 {
     THDB *thread = (THDB *)GetCurrentThreadId();
     if (index >= 64)
@@ -262,7 +264,7 @@
 /**********************************************************************
  *           TlsSetValue   (KERNEL32.533)
  */
-BOOL32 TlsSetValue( DWORD index, LPVOID value )
+BOOL32 WINAPI TlsSetValue( DWORD index, LPVOID value )
 {
     THDB *thread = (THDB *)GetCurrentThreadId();
     if (index >= 64)
@@ -278,7 +280,7 @@
 /***********************************************************************
  *           GetThreadContext   (KERNEL32.294)
  */
-BOOL32 GetThreadContext( HANDLE32 handle, CONTEXT *context )
+BOOL32 WINAPI GetThreadContext( HANDLE32 handle, CONTEXT *context )
 {
     THDB *thread = (THDB*)PROCESS_GetObjPtr( handle, K32OBJ_THREAD );
     if (!thread) return FALSE;
@@ -291,7 +293,7 @@
 /**********************************************************************
  *           NtCurrentTeb   (NTDLL.89)
  */
-void NtCurrentTeb( CONTEXT *context )
+void WINAPI NtCurrentTeb( CONTEXT *context )
 {
     EAX_reg(context) = GetSelectorBase( FS_reg(context) );
 }
@@ -300,7 +302,7 @@
 /**********************************************************************
  *           GetThreadPriority   (KERNEL32.296)
  */
-INT32 GetThreadPriority(HANDLE32 hthread)
+INT32 WINAPI GetThreadPriority(HANDLE32 hthread)
 {
     THDB *thread;
     INT32 ret;
@@ -315,7 +317,7 @@
 /**********************************************************************
  *           SetThreadPriority   (KERNEL32.514)
  */
-BOOL32 SetThreadPriority(HANDLE32 hthread,INT32 priority)
+BOOL32 WINAPI SetThreadPriority(HANDLE32 hthread,INT32 priority)
 {
     THDB *thread;
     
@@ -324,3 +326,12 @@
     K32OBJ_DecCount( &thread->header );
     return TRUE;
 }
+
+/**********************************************************************
+ *           TerminateThread   (KERNEL32)
+ */
+BOOL32 WINAPI TerminateThread(DWORD threadid,DWORD exitcode)
+{
+    fprintf(stdnimp,"TerminateThread(0x%08lx,%ld), STUB!\n",threadid,exitcode);
+    return TRUE;
+}
diff --git a/tools/build.c b/tools/build.c
index 6ab1a55..327a8e8 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -1327,13 +1327,11 @@
  * functions that need a large stack, like X bitmaps functions.
  *
  * The generated function has the following prototype:
- *   int CallTo32_LargeStack( int (*func)(), int nbargs, ... )
+ *   int CALLTO32_LargeStack( int (*func)(), void *arg );
  *
  * Stack layout:
  *   ...     ...
- * (ebp+20)  arg2
- * (ebp+16)  arg1
- * (ebp+12)  nbargs
+ * (ebp+12)  arg
  * (ebp+8)   func
  * (ebp+4)   ret addr
  * (ebp)     ebp
@@ -1344,22 +1342,16 @@
 
     fprintf( outfile, "\n\t.align 4\n" );
 #ifdef USE_STABS
-    fprintf( outfile, ".stabs \"CallTo32_LargeStack:F1\",36,0,0," PREFIX "CallTo32_LargeStack\n");
+    fprintf( outfile, ".stabs \"CALLTO32_LargeStack:F1\",36,0,0," PREFIX "CALLTO32_LargeStack\n");
 #endif
-    fprintf( outfile, "\t.globl " PREFIX "CallTo32_LargeStack\n" );
-    fprintf( outfile, PREFIX "CallTo32_LargeStack:\n" );
+    fprintf( outfile, "\t.globl " PREFIX "CALLTO32_LargeStack\n" );
+    fprintf( outfile, PREFIX "CALLTO32_LargeStack:\n" );
     
     /* Entry code */
 
     fprintf( outfile, "\tpushl %%ebp\n" );
     fprintf( outfile, "\tmovl %%esp,%%ebp\n" );
 
-    /* Save registers */
-
-    fprintf( outfile, "\tpushl %%ecx\n" );
-    fprintf( outfile, "\tpushl %%esi\n" );
-    fprintf( outfile, "\tpushl %%edi\n" );
-
     /* Retrieve the original 32-bit stack pointer and switch to it if any */
 
     fprintf( outfile, "\tmovl " PREFIX "IF1632_Original32_esp, %%eax\n" );
@@ -1368,33 +1360,14 @@
     fprintf( outfile, "\tmovl %%eax,%%esp\n" );
     fprintf( outfile, "no_orig_esp:\n" );
 
-    /* Transfer the arguments */
+    /* Transfer the argument and call the function */
 
-    fprintf( outfile, "\tmovl 12(%%ebp),%%ecx\n" );
-    fprintf( outfile, "\torl %%ecx,%%ecx\n" );
-    fprintf( outfile, "\tje no_args\n" );
-    fprintf( outfile, "\tleal 16(%%ebp),%%esi\n" );
-    fprintf( outfile, "\tshll $2,%%ecx\n" );
-    fprintf( outfile, "\tsubl %%ecx,%%esp\n" );
-    fprintf( outfile, "\tmovl %%esp,%%edi\n" );
-    fprintf( outfile, "\tshrl $2,%%ecx\n" );
-    fprintf( outfile, "\tcld\n" );
-    fprintf( outfile, "\trep; movsl\n" );
-    fprintf( outfile, "no_args:\n" );
-
-    /* Call the function */
-
+    fprintf( outfile, "\tpushl 12(%%ebp)\n" );
     fprintf( outfile, "\tcall 8(%%ebp)\n" );
 
-    /* Switch back to the normal stack */
-
-    fprintf( outfile, "\tleal -12(%%ebp),%%esp\n" );
-
     /* Restore registers and return */
 
-    fprintf( outfile, "\tpopl %%edi\n" );
-    fprintf( outfile, "\tpopl %%esi\n" );
-    fprintf( outfile, "\tpopl %%ecx\n" );
+    fprintf( outfile, "\tmovl %%ebp,%%esp\n" );
     fprintf( outfile, "\tpopl %%ebp\n" );
     fprintf( outfile, "\tret\n" );
 }
@@ -2197,6 +2170,19 @@
     fprintf( outfile, "\t.globl " PREFIX "CallFrom32_%s\n", profile );
     fprintf( outfile, PREFIX "CallFrom32_%s:\n", profile );
 
+#if 0
+    fprintf( outfile, "\tleal 8(%%esp),%%ebp\n" );
+    fprintf( outfile, "\tpushl $%d\n",  /* Nb args */
+             reg_func ? args | 0x80000000 : args);
+    fprintf( outfile, "\tpushl %%ebp\n" );
+    fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallFrom32\n" );
+    fprintf( outfile, "\tadd $8, %%esp\n" );
+    fprintf( outfile, "\tpopl  %%eax\n" );
+    fprintf( outfile, "\tpopl  %%eax\n" );
+    fprintf( outfile, "\tpopl  %%ebp\n" );
+    fprintf( outfile, "\tjmp %%eax\n" );
+#endif
+
     /* Entry code */
 
     fprintf( outfile, "\tleal 8(%%esp),%%ebp\n" );
@@ -2373,10 +2359,6 @@
     fprintf( outfile, "Code_Start:\n\n" );
 #endif
 
-    /* Build the 32-bit large stack callback */
-
-    BuildCall32LargeStack( outfile );
-
     /* Build the callback functions */
 
     for (i = 2; i < argc; i++) BuildCallFrom16Func( outfile, argv[i] );
@@ -2538,6 +2520,10 @@
     fprintf( outfile, "Code_Start:\n\n" );
 #endif
 
+    /* Build the 32-bit large stack callback */
+
+    BuildCall32LargeStack( outfile );
+
     /* Build the callback functions */
 
     for (i = 2; i < argc; i++) BuildCallTo32Func( outfile, atoi(argv[i]) );
diff --git a/tools/fnt2bdf.c b/tools/fnt2bdf.c
index 6795116..d994a99 100644
--- a/tools/fnt2bdf.c
+++ b/tools/fnt2bdf.c
@@ -350,12 +350,12 @@
 
 	case ANSI_CHARSET: 	fputs("ansi-0\n", fs); break;
 	case GREEK_CHARSET: 	fputs("cp125-3\n", fs); break;
-	case TURKISH_CHARSET: 	fputs("iso8859-9", fs); break;
-	case HEBREW_CHARSET: 	fputs("cp125-5", fs); break;
-	case ARABIC_CHARSET: 	fputs("cp125-6", fs); break;
-	case BALTIC_CHARSET: 	fputs("cp125-7", fs); break;
-	case RUSSIAN_CHARSET: 	fputs("cp125-1", fs); break;
-	case EE_CHARSET: 	fputs("iso8859-2", fs); break; 
+	case TURKISH_CHARSET: 	fputs("cp125-4\n", fs); break;
+	case HEBREW_CHARSET: 	fputs("cp125-5\n", fs); break;
+	case ARABIC_CHARSET: 	fputs("cp125-6\n", fs); break;
+	case BALTIC_CHARSET: 	fputs("cp125-7\n", fs); break;
+	case RUSSIAN_CHARSET: 	fputs("cp125-1\n", fs); break;
+	case EE_CHARSET: 	fputs("cp125-0\n", fs); break; 
 	case SYMBOL_CHARSET: 	fputs("misc-fontspecific\n", fs); break;
 	case SHIFTJIS_CHARSET: 	fputs("jisx0208.1983-0\n", fs); break;
 	case DEFAULT_CHARSET:	fputs("iso8859-1\n", fs); break;
diff --git a/win32/advapi.c b/win32/advapi.c
index 9bb1ca7..d6c25c0 100644
--- a/win32/advapi.c
+++ b/win32/advapi.c
@@ -16,8 +16,7 @@
 /***********************************************************************
  *           StartServiceCtrlDispatcherA   [ADVAPI32.196]
  */
-BOOL32
-StartServiceCtrlDispatcher32A(LPSERVICE_TABLE_ENTRY32A servent)
+BOOL32 WINAPI StartServiceCtrlDispatcher32A(LPSERVICE_TABLE_ENTRY32A servent)
 {
 	fprintf(stderr,"StartServiceCtrlDispatcherA(%p (%s)), STUB.\n",
 		servent,
@@ -29,8 +28,7 @@
 /***********************************************************************
  *           StartServiceCtrlDispatcherW   [ADVAPI32.197]
  */
-BOOL32
-StartServiceCtrlDispatcher32W(LPSERVICE_TABLE_ENTRY32W servent)
+BOOL32 WINAPI StartServiceCtrlDispatcher32W(LPSERVICE_TABLE_ENTRY32W servent)
 {
 	char	buffer[200];
 
@@ -46,8 +44,8 @@
 /***********************************************************************
  *           OpenProcessToken   [ADVAPI32.197]
  */
-BOOL32
-OpenProcessToken(HANDLE32 process,DWORD desiredaccess,HANDLE32 *thandle)
+BOOL32 WINAPI OpenProcessToken(HANDLE32 process,DWORD desiredaccess,
+                               HANDLE32 *thandle)
 {
 	fprintf(stdnimp,"OpenProcessToken(%08x,%08lx,%p),stub!\n",
 		process,desiredaccess,thandle
@@ -58,10 +56,9 @@
 /***********************************************************************
  *           OpenThreadToken		[ADVAPI32.114]
  */
-BOOL32
-OpenThreadToken(
-	HANDLE32 thread,DWORD desiredaccess,BOOL32 openasself,HANDLE32 *thandle
-) {
+BOOL32 WINAPI OpenThreadToken( HANDLE32 thread,DWORD desiredaccess,
+                               BOOL32 openasself,HANDLE32 *thandle )
+{
 	fprintf(stdnimp,"OpenThreadToken(%08x,%08lx,%d,%p),stub!\n",
 		thread,desiredaccess,openasself,thandle
 	);
@@ -71,16 +68,14 @@
 /***********************************************************************
  *           LookupPrivilegeValueA   [ADVAPI32.90]
  */
-BOOL32
-LookupPrivilegeValue32A(LPCSTR system,LPCSTR name,LPVOID bla)
+BOOL32 WINAPI LookupPrivilegeValue32A(LPCSTR system,LPCSTR name,LPVOID bla)
 {
 	fprintf(stdnimp,"LookupPrivilegeValue32A(%s,%s,%p),stub\n",
 		system,name,bla
 	);
 	return TRUE;
 }
-BOOL32
-AdjustTokenPrivileges(HANDLE32 TokenHandle,BOOL32 DisableAllPrivileges,
+BOOL32 WINAPI AdjustTokenPrivileges(HANDLE32 TokenHandle,BOOL32 DisableAllPrivileges,
 	LPVOID NewState,DWORD BufferLength,LPVOID PreviousState,
 	LPDWORD ReturnLength )
 {
@@ -90,27 +85,24 @@
 /***********************************************************************
  *           GetTokenInformation	[ADVAPI32.66]
  */
-BOOL32
-GetTokenInformation(
+BOOL32 WINAPI GetTokenInformation(
 	HANDLE32 token,/*TOKEN_INFORMATION_CLASS*/ DWORD tokeninfoclass,LPVOID tokeninfo,
 	DWORD tokeninfolength,LPDWORD retlen
 ) {
-	fprintf(stderr,"GetTokenInformation(%08lx,%d,%p,%ld,%p)\n",
+	fprintf(stderr,"GetTokenInformation(%08x,%ld,%p,%ld,%p)\n",
 		token,tokeninfoclass,tokeninfo,tokeninfolength,retlen
 	);
 	return TRUE;
 }
 
 /*SC_HANDLE*/
-DWORD
-OpenSCManagerA(LPCSTR machine,LPCSTR dbname,DWORD desiredaccess)
+DWORD WINAPI OpenSCManagerA(LPCSTR machine,LPCSTR dbname,DWORD desiredaccess)
 {
 	fprintf(stderr,"OpenSCManagerA(%s,%s,%08lx)\n",machine,dbname,desiredaccess);
 	return 0;
 }
 
-DWORD
-OpenSCManagerW(LPCWSTR machine,LPCWSTR dbname,DWORD desiredaccess)
+DWORD WINAPI OpenSCManagerW(LPCWSTR machine,LPCWSTR dbname,DWORD desiredaccess)
 {
 	LPSTR	machineA = HEAP_strdupWtoA(GetProcessHeap(),0,machine);
 	LPSTR	dbnameA = HEAP_strdupWtoA(GetProcessHeap(),0,dbname);
@@ -120,8 +112,7 @@
 	return 0;
 }
 
-BOOL32
-AllocateLocallyUniqueId(LPLUID lpluid) {
+BOOL32 WINAPI AllocateLocallyUniqueId(LPLUID lpluid) {
 	lpluid->LowPart = time(NULL);
 	lpluid->HighPart = 0;
 	return TRUE;
diff --git a/win32/code_page.c b/win32/code_page.c
index 508172b..7a10618 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -17,7 +17,7 @@
 /***********************************************************************
  *           GetACP               (KERNEL32.148)
  */
-UINT32 GetACP(void)
+UINT32 WINAPI GetACP(void)
 {
     return 1252;    /* Windows 3.1 ISO Latin */
 }
@@ -25,7 +25,7 @@
 /***********************************************************************
  *           GetCPInfo            (KERNEL32.154)
  */
-BOOL32 GetCPInfo( UINT32 codepage, LPCPINFO cpinfo )
+BOOL32 WINAPI GetCPInfo( UINT32 codepage, LPCPINFO cpinfo )
 {
     cpinfo->DefaultChar[0] = '?';
     switch (codepage)
@@ -61,7 +61,7 @@
 /***********************************************************************
  *              GetOEMCP                (KERNEL32.248)
  */
-UINT32 GetOEMCP(void)
+UINT32 WINAPI GetOEMCP(void)
 {
     return 437;    /* MS-DOS United States */
 }
@@ -69,7 +69,7 @@
 /***********************************************************************
  *           IsValidCodePage   (KERNEL32.360)
  */
-BOOL32 IsValidCodePage(UINT32 CodePage)
+BOOL32 WINAPI IsValidCodePage(UINT32 CodePage)
 {
     switch ( CodePage )
     {
@@ -85,14 +85,20 @@
 /***********************************************************************
  *              MultiByteToWideChar                (KERNEL32.392)
  */
-int MultiByteToWideChar(UINT32 page, DWORD flags, char *src, int srclen,
-                        WCHAR *dst, int dstlen)
+int WINAPI MultiByteToWideChar(UINT32 page, DWORD flags, char *src, int srclen,
+                               WCHAR *dst, int dstlen)
 {
-    return (srclen==-1) ? strlen(src) * 2: srclen*2; 
+    if (srclen == -1)
+   	 srclen = lstrlen32A(src);
+    if (!dst)
+         return srclen*2;
+
+    lstrcpynAtoW(dst,src,srclen); /* FIXME */
+    return srclen*2;
 }
 
-int WideCharToMultiByte(UINT32 page, DWORD flags, WCHAR *src, int srclen,
-                        char *dst, int dstlen, char* defchar, BOOL32 *used)
+int WINAPI WideCharToMultiByte(UINT32 page, DWORD flags, WCHAR *src, int srclen,
+                               char *dst, int dstlen, char* defchar, BOOL32 *used)
 {
 	int count = 0;
 	int dont_copy= (dstlen==0);
@@ -133,7 +139,7 @@
 /***********************************************************************
  *           IsDBCSLeadByteEx   (KERNEL32.359)
  */
-BOOL32 IsDBCSLeadByteEx( UINT32 codepage, BYTE testchar )
+BOOL32 WINAPI IsDBCSLeadByteEx( UINT32 codepage, BYTE testchar )
 {
     CPINFO cpinfo;
     int i;
@@ -153,7 +159,7 @@
 /***********************************************************************
  *           IsDBCSLeadByte16   (KERNEL.207)
  */
-BOOL16 IsDBCSLeadByte16( BYTE testchar )
+BOOL16 WINAPI IsDBCSLeadByte16( BYTE testchar )
 {
     return IsDBCSLeadByteEx(GetACP(), testchar);
 }
@@ -162,7 +168,7 @@
 /***********************************************************************
  *           IsDBCSLeadByte32   (KERNEL32.358)
  */
-BOOL32 IsDBCSLeadByte32( BYTE testchar )
+BOOL32 WINAPI IsDBCSLeadByte32( BYTE testchar )
 {
     return IsDBCSLeadByteEx(GetACP(), testchar);
 }
@@ -171,8 +177,8 @@
 /***********************************************************************
  *              EnumSystemCodePages32A                (KERNEL32.92)
  */
-BOOL32
-EnumSystemCodePages32A(CODEPAGE_ENUMPROC32A lpfnCodePageEnum,DWORD flags) {
+BOOL32 WINAPI EnumSystemCodePages32A(CODEPAGE_ENUMPROC32A lpfnCodePageEnum,DWORD flags)
+{
 	dprintf_win32(stddeb,"EnumSystemCodePages32A(%p,%08lx)\n",
 		lpfnCodePageEnum,flags
 	);
@@ -183,8 +189,8 @@
 /***********************************************************************
  *              EnumSystemCodePages32W                (KERNEL32.93)
  */
-BOOL32
-EnumSystemCodePages32W( CODEPAGE_ENUMPROC32W lpfnCodePageEnum, DWORD flags)
+BOOL32 WINAPI EnumSystemCodePages32W( CODEPAGE_ENUMPROC32W lpfnCodePageEnum,
+                                      DWORD flags)
 {
     WCHAR	*cp;
     dprintf_win32(stddeb,"EnumSystemCodePages32W(%p,%08lx)\n",
diff --git a/win32/console.c b/win32/console.c
index e8e506d..872ac73 100644
--- a/win32/console.c
+++ b/win32/console.c
@@ -26,7 +26,7 @@
 /***********************************************************************
  *           SetConsoleCtrlHandler               (KERNEL32.459)
  */
-BOOL32 SetConsoleCtrlHandler(HANDLER_ROUTINE * func,  BOOL32 a)
+BOOL32 WINAPI SetConsoleCtrlHandler(HANDLER_ROUTINE * func,  BOOL32 a)
 {
 	return 0;
 }
@@ -34,8 +34,8 @@
 /***********************************************************************
  *           GetConsoleScreenBufferInfo   (KERNEL32.190)
  */
-BOOL32 GetConsoleScreenBufferInfo( HANDLE32 hConsoleOutput,
-                                   LPCONSOLE_SCREEN_BUFFER_INFO csbi )
+BOOL32 WINAPI GetConsoleScreenBufferInfo( HANDLE32 hConsoleOutput,
+                                          LPCONSOLE_SCREEN_BUFFER_INFO csbi )
 {
     csbi->dwSize.x = 80;
     csbi->dwSize.y = 24;
@@ -54,7 +54,7 @@
 /***********************************************************************
  *            GetLargestConsoleWindowSize   (KERNEL32.226)
  */
-DWORD GetLargestConsoleWindowSize( HANDLE32 hConsoleOutput )
+DWORD WINAPI GetLargestConsoleWindowSize( HANDLE32 hConsoleOutput )
 {
     return (DWORD)MAKELONG(dummyinfo.dwMaximumWindowSize.x,dummyinfo.dwMaximumWindowSize.y);
 }
@@ -62,7 +62,7 @@
 /***********************************************************************
  *            GetConsoleCP   (KERNEL32.226)
  */
-UINT32 GetConsoleCP(VOID)
+UINT32 WINAPI GetConsoleCP(VOID)
 {
     return GetACP();
 }
@@ -70,7 +70,7 @@
 /***********************************************************************
  *            GetConsoleOutputCP   (KERNEL32.189)
  */
-UINT32 GetConsoleOutputCP(VOID)
+UINT32 WINAPI GetConsoleOutputCP(VOID)
 {
     return GetConsoleCP();
 }
@@ -78,7 +78,7 @@
 /***********************************************************************
  *            GetConsoleMode   (KERNEL32.188)
  */
-BOOL32 GetConsoleMode(HANDLE32 hcon,LPDWORD mode)
+BOOL32 WINAPI GetConsoleMode(HANDLE32 hcon,LPDWORD mode)
 {
 	*mode = 	ENABLE_PROCESSED_INPUT	|
 			ENABLE_LINE_INPUT	|
@@ -91,7 +91,7 @@
 /***********************************************************************
  *            SetConsoleMode   (KERNEL32.188)
  */
-BOOL32 SetConsoleMode(HANDLE32 hcon,DWORD mode)
+BOOL32 WINAPI SetConsoleMode(HANDLE32 hcon,DWORD mode)
 {
     fprintf(stdnimp,"SetConsoleMode(%08x,%08lx)\n",hcon,mode);
     return TRUE;
@@ -100,7 +100,7 @@
 /***********************************************************************
  *            GetConsoleTitleA   (KERNEL32.191)
  */
-DWORD GetConsoleTitle32A(LPSTR title,DWORD size)
+DWORD WINAPI GetConsoleTitle32A(LPSTR title,DWORD size)
 {
     lstrcpyn32A(title,"Console",size);
     return strlen("Console");
@@ -109,7 +109,7 @@
 /***********************************************************************
  *            GetConsoleTitleW   (KERNEL32.192)
  */
-DWORD GetConsoleTitle32W(LPWSTR title,DWORD size)
+DWORD WINAPI GetConsoleTitle32W(LPWSTR title,DWORD size)
 {
     lstrcpynAtoW(title,"Console",size);
     return strlen("Console");
@@ -118,12 +118,11 @@
 /***********************************************************************
  *            WriteConsoleA   (KERNEL32.567)
  */
-BOOL32 WriteConsole32A(
-	HANDLE32 hConsoleOutput,
-	LPVOID lpBuffer,
-	DWORD nNumberOfCharsToWrite,
-	LPDWORD lpNumberOfCharsWritten,
-	LPVOID lpReserved )
+BOOL32 WINAPI WriteConsole32A( HANDLE32 hConsoleOutput,
+                               LPVOID lpBuffer,
+                               DWORD nNumberOfCharsToWrite,
+                               LPDWORD lpNumberOfCharsWritten,
+                               LPVOID lpReserved )
 {
 	LPSTR	buf = (LPSTR)xmalloc(nNumberOfCharsToWrite+1);
 
@@ -138,12 +137,11 @@
 /***********************************************************************
  *            WriteConsoleW   (KERNEL32.577)
  */
-BOOL32 WriteConsole32W(
-	HANDLE32 hConsoleOutput,
-	LPVOID lpBuffer,
-	DWORD nNumberOfCharsToWrite,
-	LPDWORD lpNumberOfCharsWritten,
-	LPVOID lpReserved )
+BOOL32 WINAPI WriteConsole32W( HANDLE32 hConsoleOutput,
+                               LPVOID lpBuffer,
+                               DWORD nNumberOfCharsToWrite,
+                               LPDWORD lpNumberOfCharsWritten,
+                               LPVOID lpReserved )
 {
 	LPSTR	buf = (LPSTR)xmalloc(2*nNumberOfCharsToWrite+1);
 
@@ -158,12 +156,11 @@
 /***********************************************************************
  *            ReadConsoleA   (KERNEL32.419)
  */
-BOOL32 ReadConsole32A(
-	HANDLE32 hConsoleInput,
-	LPVOID lpBuffer,
-	DWORD nNumberOfCharsToRead,
-	LPDWORD lpNumberOfCharsRead,
-	LPVOID lpReserved )
+BOOL32 WINAPI ReadConsole32A( HANDLE32 hConsoleInput,
+                              LPVOID lpBuffer,
+                              DWORD nNumberOfCharsToRead,
+                              LPDWORD lpNumberOfCharsRead,
+                              LPVOID lpReserved )
 {
 	fgets(lpBuffer,nNumberOfCharsToRead,stdin);
 	*lpNumberOfCharsRead = strlen(lpBuffer);
@@ -173,12 +170,11 @@
 /***********************************************************************
  *            ReadConsoleW   (KERNEL32.427)
  */
-BOOL32 ReadConsole32W(
-	HANDLE32 hConsoleInput,
-	LPVOID lpBuffer,
-	DWORD nNumberOfCharsToRead,
-	LPDWORD lpNumberOfCharsRead,
-	LPVOID lpReserved )
+BOOL32 WINAPI ReadConsole32W( HANDLE32 hConsoleInput,
+                              LPVOID lpBuffer,
+                              DWORD nNumberOfCharsToRead,
+                              LPDWORD lpNumberOfCharsRead,
+                              LPVOID lpReserved )
 {
 	LPSTR	buf = (LPSTR)xmalloc(nNumberOfCharsToRead);
 
@@ -191,7 +187,7 @@
 /***********************************************************************
  *            SetConsoleTitle32A   (KERNEL32.476)
  */
-BOOL32 SetConsoleTitle32A(LPCSTR title)
+BOOL32 WINAPI SetConsoleTitle32A(LPCSTR title)
 {
     fprintf(stderr,"SetConsoleTitle(%s)\n",title);
     return TRUE;
@@ -200,7 +196,7 @@
 /***********************************************************************
  *            SetConsoleTitle32W   (KERNEL32.477)
  */
-BOOL32 SetConsoleTitle32W( LPCWSTR title )
+BOOL32 WINAPI SetConsoleTitle32W( LPCWSTR title )
 {
     LPSTR titleA = HEAP_strdupWtoA( GetProcessHeap(), 0, title );
     fprintf(stderr,"SetConsoleTitle(%s)\n",titleA);
@@ -211,13 +207,13 @@
 /***********************************************************************
  *            FlushConsoleInputBuffer   (KERNEL32.132)
  */
-BOOL32 FlushConsoleInputBuffer(HANDLE32 hConsoleInput){
+BOOL32 WINAPI FlushConsoleInputBuffer(HANDLE32 hConsoleInput){
     fprintf(stderr,"FlushConsoleInputBuffer(%d)\n",hConsoleInput);
     return TRUE;
 }
 
-BOOL32
-SetConsoleCursorPosition(HANDLE32 hcons,COORD c) {
+BOOL32 WINAPI SetConsoleCursorPosition(HANDLE32 hcons,COORD c)
+{
     /* x are columns, y rows */
     if (!c.y) {
     	fprintf(stderr,"\r");
@@ -232,8 +228,8 @@
 /***********************************************************************
  *            GetNumberOfConsoleInputEvents   (KERNEL32.246)
  */
-BOOL32
-GetNumberOfConsoleInputEvents(HANDLE32 hcon,LPDWORD nrofevents) {
+BOOL32 WINAPI GetNumberOfConsoleInputEvents(HANDLE32 hcon,LPDWORD nrofevents)
+{
 	*nrofevents = 1;
 	return TRUE;
 }
diff --git a/win32/cursoricon32.c b/win32/cursoricon32.c
index 4ce417e..b551663 100644
--- a/win32/cursoricon32.c
+++ b/win32/cursoricon32.c
@@ -461,7 +461,7 @@
 /***********************************************************************
  *           LoadCursorW		(USER32.361)
  */
-HCURSOR32 LoadCursor32W(HINSTANCE32 hInstance,LPCWSTR name)
+HCURSOR32 WINAPI LoadCursor32W(HINSTANCE32 hInstance,LPCWSTR name)
 {
     return CURSORICON32_Load( hInstance, name,
                             SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE);
@@ -470,7 +470,7 @@
 /***********************************************************************
  *           LoadCursorA		(USER32.358)
  */
-HCURSOR32 LoadCursor32A(HINSTANCE32 hInstance,LPCSTR name)
+HCURSOR32 WINAPI LoadCursor32A(HINSTANCE32 hInstance,LPCSTR name)
 {
 	HCURSOR32 res=0;
 	if(!HIWORD(name))
@@ -488,7 +488,7 @@
 /***********************************************************************
  *           LoadIconW		(USER32.363)
  */
-HICON32 LoadIcon32W(HINSTANCE32 hInstance,LPCWSTR name)
+HICON32 WINAPI LoadIcon32W(HINSTANCE32 hInstance,LPCWSTR name)
 {
     return CURSORICON32_Load( hInstance, name,
                             SYSMETRICS_CXICON, SYSMETRICS_CYICON,
@@ -498,7 +498,7 @@
 /***********************************************************************
  *           LoadIconA		(USER32.362)
  */
-HICON32 LoadIcon32A(HINSTANCE32 hInstance,LPCSTR name)
+HICON32 WINAPI LoadIcon32A(HINSTANCE32 hInstance,LPCSTR name)
 {
 	HICON32 res=0;
 	if(!HIWORD(name))
diff --git a/win32/environment.c b/win32/environment.c
index 2480765..cbe6259 100644
--- a/win32/environment.c
+++ b/win32/environment.c
@@ -18,7 +18,7 @@
 /***********************************************************************
  *           GetCommandLineA      (KERNEL32.161)
  */
-LPCSTR GetCommandLine32A(void)
+LPCSTR WINAPI GetCommandLine32A(void)
 {
     static char buffer[256];
     char *cp;
@@ -39,7 +39,7 @@
 /***********************************************************************
  *           GetCommandLineW      (KERNEL32.162)
  */
-LPCWSTR GetCommandLine32W(void)
+LPCWSTR WINAPI GetCommandLine32W(void)
 {
     static WCHAR buffer[256];
 
@@ -51,7 +51,7 @@
 /***********************************************************************
  *           GetSystemPowerStatus      (KERNEL32.621)
  */
-BOOL32 GetSystemPowerStatus(LPSYSTEM_POWER_STATUS sps_ptr)
+BOOL32 WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS sps_ptr)
 {
     return FALSE;   /* no power management support */
 }
@@ -60,7 +60,8 @@
 /***********************************************************************
  *           SetSystemPowerState      (KERNEL32.630)
  */
-BOOL32 SetSystemPowerState(BOOL32 suspend_or_hibernate, BOOL32 force_flag)
+BOOL32 WINAPI SetSystemPowerState(BOOL32 suspend_or_hibernate,
+                                  BOOL32 force_flag)
 {
     /* suspend_or_hibernate flag: w95 does not support
        this feature anyway */
diff --git a/win32/except.c b/win32/except.c
index 90a28fb..4fbcd9d 100644
--- a/win32/except.c
+++ b/win32/except.c
@@ -45,6 +45,24 @@
 #define TEB_EXCEPTION_FRAME(pcontext) \
     ((PEXCEPTION_FRAME)((TEB *)GET_SEL_BASE((pcontext)->SegFs))->except)
 
+/*******************************************************************
+ *         _local_unwind2  (CRTDLL)
+ */
+void WINAPI CRTDLL__local_unwind2(PEXCEPTION_FRAME endframe,DWORD nr,
+                                  PCONTEXT pcontext)
+{
+	fprintf(stderr,"CRTDLL__local_unwind2(%p,%ld)\n",endframe,nr);
+	return;
+}
+
+/*******************************************************************
+ *         _global_unwind2  (CRTDLL)
+ */
+void WINAPI CRTDLL__global_unwind2(PEXCEPTION_FRAME endframe,PCONTEXT pcontext)
+{
+	RtlUnwind(endframe,NULL/*should point to the return;*/,NULL,0,pcontext);
+	return;
+}
 
 /*******************************************************************
  *         RtlUnwind  (KERNEL32.443)
@@ -52,9 +70,9 @@
  *  This function is undocumented. This is the general idea of 
  *  RtlUnwind, though. Note that error handling is not yet implemented.
  */
-void RtlUnwind( PEXCEPTION_FRAME pEndFrame, LPVOID unusedEip, 
-                PEXCEPTION_RECORD pRecord, DWORD returnEax,
-                PCONTEXT pcontext /* Wine additional parameter */ )
+void WINAPI RtlUnwind( PEXCEPTION_FRAME pEndFrame, LPVOID unusedEip, 
+                       PEXCEPTION_RECORD pRecord, DWORD returnEax,
+                       PCONTEXT pcontext /* Wine additional parameter */ )
 {   
    EXCEPTION_RECORD record;
    DWORD            dispatch;
@@ -94,9 +112,13 @@
        dprintf_win32(stddeb,"exception handler returns 0x%x, dispatch=0x%x\n",
                               retval, (int) dispatch);
   
-       if (retval == ExceptionCollidedUnwind)
+       if (	(retval == ExceptionCollidedUnwind) &&
+           	(TEB_EXCEPTION_FRAME(pcontext) != (LPVOID)dispatch)
+       )
            TEB_EXCEPTION_FRAME(pcontext) = (LPVOID)dispatch;
-       else if (TEB_EXCEPTION_FRAME(pcontext) != pEndFrame)
+       else if (	(TEB_EXCEPTION_FRAME(pcontext) != pEndFrame) &&
+           		(TEB_EXCEPTION_FRAME(pcontext) != TEB_EXCEPTION_FRAME(pcontext)->Prev)
+       )
            TEB_EXCEPTION_FRAME(pcontext) = TEB_EXCEPTION_FRAME(pcontext)->Prev;
        else
           break;  
@@ -107,11 +129,11 @@
 /*******************************************************************
  *         RaiseException  (KERNEL32.418)
  */
-void RaiseException(DWORD dwExceptionCode,
-		    DWORD dwExceptionFlags,
-		    DWORD cArguments,
-		    const LPDWORD lpArguments,
-		    PCONTEXT pcontext /* Wine additional parameter */ )
+void WINAPI RaiseException(DWORD dwExceptionCode,
+                           DWORD dwExceptionFlags,
+                           DWORD cArguments,
+                           const LPDWORD lpArguments,
+                           PCONTEXT pcontext /* Wine additional parameter */ )
 {
     PEXCEPTION_FRAME    pframe; 
     EXCEPTION_RECORD    record;
@@ -162,7 +184,7 @@
 /*******************************************************************
  *         UnhandledExceptionFilter   (KERNEL32.537)
  */
-DWORD UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers)
+DWORD WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers)
 {
     char message[80];
 
@@ -187,7 +209,7 @@
 /*************************************************************
  *            SetUnhandledExceptionFilter   (KERNEL32.516)
  */
-LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
                                           LPTOP_LEVEL_EXCEPTION_FILTER filter )
 {
     LPTOP_LEVEL_EXCEPTION_FILTER old = pCurrentProcess->top_filter;
diff --git a/win32/file.c b/win32/file.c
index 170c91a..79b75c6 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -33,8 +33,8 @@
 /***********************************************************************
  *             WriteFile               (KERNEL32.578)
  */
-BOOL32 WriteFile(HFILE32 hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
-                 LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
+BOOL32 WINAPI WriteFile(HFILE32 hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
+                        LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
 {
     LONG	res;
 
@@ -51,8 +51,8 @@
 /***********************************************************************
  *              ReadFile                (KERNEL32.428)
  */
-BOOL32 ReadFile(HFILE32 hFile, LPVOID lpBuffer, DWORD numtoread,
-                LPDWORD numread, LPOVERLAPPED lpOverlapped)
+BOOL32 WINAPI ReadFile(HFILE32 hFile, LPVOID lpBuffer, DWORD numtoread,
+                       LPDWORD numread, LPOVERLAPPED lpOverlapped)
 {
     int actual_read;
 
@@ -74,9 +74,9 @@
  * Doesn't support character devices, pipes, template files, or a
  * lot of the 'attributes' flags yet.
  */
-HFILE32 CreateFile32A(LPCSTR filename, DWORD access, DWORD sharing,
-                      LPSECURITY_ATTRIBUTES security, DWORD creation,
-                      DWORD attributes, HANDLE32 template)
+HFILE32 WINAPI CreateFile32A(LPCSTR filename, DWORD access, DWORD sharing,
+                             LPSECURITY_ATTRIBUTES security, DWORD creation,
+                             DWORD attributes, HANDLE32 template)
 {
     int access_flags, create_flags;
 
@@ -115,9 +115,9 @@
 /*************************************************************************
  *              CreateFile32W              (KERNEL32.48)
  */
-HFILE32 CreateFile32W(LPCWSTR filename, DWORD access, DWORD sharing,
-                      LPSECURITY_ATTRIBUTES security, DWORD creation,
-                      DWORD attributes, HANDLE32 template)
+HFILE32 WINAPI CreateFile32W(LPCWSTR filename, DWORD access, DWORD sharing,
+                             LPSECURITY_ATTRIBUTES security, DWORD creation,
+                             DWORD attributes, HANDLE32 template)
 {
     LPSTR afn = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
     HFILE32 res = CreateFile32A( afn, access, sharing, security, creation,
@@ -182,7 +182,7 @@
 /**************************************************************************
  *              SetFileAttributes16	(KERNEL.421)
  */
-BOOL16 SetFileAttributes16( LPCSTR lpFileName, DWORD attributes )
+BOOL16 WINAPI SetFileAttributes16( LPCSTR lpFileName, DWORD attributes )
 {
     return SetFileAttributes32A( lpFileName, attributes );
 }
@@ -191,7 +191,7 @@
 /**************************************************************************
  *              SetFileAttributes32A	(KERNEL32.490)
  */
-BOOL32 SetFileAttributes32A(LPCSTR lpFileName, DWORD attributes)
+BOOL32 WINAPI SetFileAttributes32A(LPCSTR lpFileName, DWORD attributes)
 {
     struct stat buf;
     DOS_FULL_NAME full_name;
@@ -221,10 +221,11 @@
     return TRUE;
 }
 
+
 /**************************************************************************
  *              SetFileAttributes32W	(KERNEL32.491)
  */
-BOOL32 SetFileAttributes32W(LPCWSTR lpFileName, DWORD attributes)
+BOOL32 WINAPI SetFileAttributes32W(LPCWSTR lpFileName, DWORD attributes)
 {
     LPSTR afn = HEAP_strdupWtoA( GetProcessHeap(), 0, lpFileName );
     BOOL32 res = SetFileAttributes32A( afn, attributes );
@@ -232,17 +233,29 @@
     return res;
 }
 
-VOID SetFileApisToOEM()
+
+/**************************************************************************
+ *              SetFileApisToOEM   (KERNEL32.645)
+ */
+VOID WINAPI SetFileApisToOEM(void)
 {
     fprintf(stdnimp,"SetFileApisToOEM(),stub!\n");
 }
 
-VOID SetFileApisToANSI()
+
+/**************************************************************************
+ *              SetFileApisToANSI   (KERNEL32.644)
+ */
+VOID WINAPI SetFileApisToANSI(void)
 {
     fprintf(stdnimp,"SetFileApisToANSI(),stub!\n");
 }
 
-BOOL32 AreFileApisANSI()
+
+/**************************************************************************
+ *              AreFileApisANSI   (KERNEL32.105)
+ */
+BOOL32 WINAPI AreFileApisANSI(void)
 {
     fprintf(stdnimp,"AreFileApisANSI(),stub!\n");
     return TRUE;
diff --git a/win32/init.c b/win32/init.c
index ddd5799..80a8191 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -21,7 +21,7 @@
 /***********************************************************************
  *              GetModuleHandle         (KERNEL32.237)
  */
-HMODULE32 WIN32_GetModuleHandleA(char *module)
+HMODULE32 WINAPI WIN32_GetModuleHandleA(char *module)
 {
     HMODULE32 hModule;
 
@@ -37,7 +37,7 @@
     return hModule;
 }
 
-HMODULE32 WIN32_GetModuleHandleW(LPCWSTR module)
+HMODULE32 WINAPI WIN32_GetModuleHandleW(LPCWSTR module)
 {
     HMODULE32 hModule;
     LPSTR modulea = HEAP_strdupWtoA( GetProcessHeap(), 0, module );
@@ -50,7 +50,7 @@
 /***********************************************************************
  *              GetStartupInfoA         (KERNEL32.273)
  */
-VOID GetStartupInfo32A(LPSTARTUPINFO32A lpStartupInfo)
+VOID WINAPI GetStartupInfo32A(LPSTARTUPINFO32A lpStartupInfo)
 {
     lpStartupInfo->cb = sizeof(STARTUPINFO32A);
     lpStartupInfo->lpReserved = "<Reserved>";
@@ -67,7 +67,7 @@
 /***********************************************************************
  *              GetStartupInfoW         (KERNEL32.274)
  */
-VOID GetStartupInfo32W(LPSTARTUPINFO32W lpStartupInfo)
+VOID WINAPI GetStartupInfo32W(LPSTARTUPINFO32W lpStartupInfo)
 {
     lpStartupInfo->cb = sizeof(STARTUPINFO32W);
     lpStartupInfo->lpReserved = HEAP_strdupAtoW(GetProcessHeap(),0,"<Reserved>");
@@ -84,8 +84,8 @@
 /***********************************************************************
  *              GetComputerNameA         (KERNEL32.165)
  */
-BOOL32
-GetComputerName32A(LPSTR name,LPDWORD size) {
+BOOL32 WINAPI GetComputerName32A(LPSTR name,LPDWORD size)
+{
 	if (-1==gethostname(name,*size))
 		return FALSE;
 	*size = lstrlen32A(name);
@@ -95,8 +95,8 @@
 /***********************************************************************
  *              GetComputerNameW         (KERNEL32.166)
  */
-BOOL32
-GetComputerName32W(LPWSTR name,LPDWORD size) {
+BOOL32 WINAPI GetComputerName32W(LPWSTR name,LPDWORD size)
+{
 	LPSTR	nameA = (LPSTR)xmalloc(*size);
 
 	if (!GetComputerName32A(nameA,size)) {
@@ -112,7 +112,7 @@
 /***********************************************************************
  *           GetUserNameA   [ADVAPI32.67]
  */
-BOOL32 GetUserName32A(LPSTR lpszName, LPDWORD lpSize)
+BOOL32 WINAPI GetUserName32A(LPSTR lpszName, LPDWORD lpSize)
 {
   size_t len;
   char *name;
@@ -131,7 +131,7 @@
 /***********************************************************************
  *           GetUserNameW   [ADVAPI32.68]
  */
-BOOL32 GetUserName32W(LPWSTR lpszName, LPDWORD lpSize)
+BOOL32 WINAPI GetUserName32W(LPWSTR lpszName, LPDWORD lpSize)
 {
 	LPSTR name = (LPSTR)xmalloc(*lpSize);
 	DWORD	size = *lpSize;
diff --git a/win32/newfns.c b/win32/newfns.c
index b53a503..f8477fc 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -16,8 +16,8 @@
 /****************************************************************************
  *		QueryPerformanceCounter (KERNEL32.415)
  */
-BOOL32
-QueryPerformanceCounter(LPLARGE_INTEGER counter) {
+BOOL32 WINAPI QueryPerformanceCounter(LPLARGE_INTEGER counter)
+{
 	/* FIXME: don't know what are good values */
 	counter->LowPart	= 1;
 	counter->HighPart	= 0;
@@ -28,8 +28,8 @@
  *		DisableThreadLibraryCalls (KERNEL32.74)
  * Don't call DllEntryPoint for DLL_THREAD_{ATTACH,DETACH} if set.
  */
-BOOL32
-DisableThreadLibraryCalls(HMODULE32 hModule) {
+BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32 hModule)
+{
     fprintf(stdnimp, "DisableThreadLibraryCalls Stub called!\n");
     return TRUE;
 }
diff --git a/win32/ordinals.c b/win32/ordinals.c
index a617b0c..28f098f 100644
--- a/win32/ordinals.c
+++ b/win32/ordinals.c
@@ -1,5 +1,5 @@
 /*
- * Win32 ordinal only exported functions
+ * Win32 ordinal only exported functions that can't be stuffed somehwere else.
  *
  * Copyright 1997 Marcus Meissner
  */
@@ -19,57 +19,35 @@
 extern THDB	*pCurrentThread;
 extern PDB32	*pCurrentProcess;
 
+static CRITICAL_SECTION Win16Mutex;
+
+/***********************************************
+ *           GetPWinLock    (KERNEL32)
+ * Return the infamous Win16Mutex.
+ */
+VOID WINAPI GetPWinLock(CRITICAL_SECTION **lock)
+{
+        fprintf(stderr,"GetPWinlock(%p)\n",lock);
+        *lock = &Win16Mutex;
+}
+
 /**********************************************************************
  *           _KERNEL32_88
  */
-DWORD
-WOW32_1(DWORD x,DWORD y) {
+DWORD WINAPI WOW32_1(DWORD x,DWORD y)
+{
     fprintf(stderr,"WOW32_1(0x%08lx,0x%08lx), stub!\n",x,y);
     return 0;
 }
 
-/**********************************************************************
- *           WOWGetVDMPointer	(KERNEL32.55)
- * Get linear from segmented pointer. (MSDN lib)
- */
-LPVOID
-WOWGetVDMPointer(DWORD vp,DWORD nrofbytes,BOOL32 protected) {
-    /* FIXME: add size check too */
-    fprintf(stdnimp,"WOWGetVDMPointer(%08lx,%ld,%d)\n",vp,nrofbytes,protected);
-    if (protected)
-	return PTR_SEG_TO_LIN(vp);
-    else
-	return DOSMEM_MapRealToLinear(vp);
-}
-
-/**********************************************************************
- *           WOWGetVDMPointerFix (KERNEL32.55)
- * Dito, but fix heapsegment (MSDN lib)
- */
-LPVOID
-WOWGetVDMPointerFix(DWORD vp,DWORD nrofbytes,BOOL32 protected) {
-    /* FIXME: fix heapsegment */
-    fprintf(stdnimp,"WOWGetVDMPointerFix(%08lx,%ld,%d)\n",vp,nrofbytes,protected);
-    return WOWGetVDMPointer(vp,nrofbytes,protected);
-}
-
-/**********************************************************************
- *           WOWGetVDMPointerUnFix (KERNEL32.56)
- */
-void
-WOWGetVDMPointerUnfix(DWORD vp) {
-    fprintf(stdnimp,"WOWGetVDMPointerUnfix(%08lx), STUB\n",vp);
-    /* FIXME: unfix heapsegment */
-}
-
 
 /***********************************************************************
  *           _KERNEL32_18    (KERNEL32.18)
  * 'Of course you cannot directly access Windows internal structures'
  */
 
-DWORD
-_KERNEL32_18(DWORD processid,DWORD action) {
+DWORD WINAPI _KERNEL32_18(DWORD processid,DWORD action)
+{
 	PDB32	*process;
 	TDB	*pTask;
 
@@ -141,290 +119,13 @@
 	/* shouldn't come here */
 }
 
-/***********************************************************************
- *           _KERNEL32_52    (KERNEL32.52)
- * FIXME: what does it really do?
- */
-VOID
-_KERNEL32_52(DWORD arg1,CONTEXT *regs) {
-	fprintf(stderr,"_KERNE32_52(arg1=%08lx,%08lx)\n",arg1,EDI_reg(regs));
-
-	EAX_reg(regs) = (DWORD)WIN32_GetProcAddress16(EDI_reg(regs),"ThkBuf");
-
-	fprintf(stderr,"	GetProcAddress16(\"ThkBuf\") returns %08lx\n",
-			EAX_reg(regs)
-	);
-}
-
-/***********************************************************************
- *           GetPWinLock    (KERNEL32) FIXME
- * get mutex? critical section for 16 bit mode?
- */
-VOID
-GetPWinLock(CRITICAL_SECTION **lock) {
-	static CRITICAL_SECTION plock;
-	fprintf(stderr,"GetPWinlock(%p)\n",lock);
-	*lock = &plock;
-}
-
-/***********************************************************************
- * 		_KERNEL32_43 	(KERNEL32.42)
- * A thunkbuffer link routine 
- * The thunkbuf looks like:
- *
- *	00: DWORD	length		? don't know exactly
- *	04: SEGPTR	ptr		? where does it point to?
- * The pointer ptr is written into the first DWORD of 'thunk'.
- * (probably correct implemented)
- */
-BOOL32
-_KERNEL32_43(LPDWORD thunk,LPCSTR thkbuf,DWORD len,LPCSTR dll16,LPCSTR dll32) {
-	HINSTANCE16	hmod;
-	LPDWORD		addr;
-	SEGPTR		segaddr;
-
-	fprintf(stderr,"_KERNEL32_43(%p,%s,0x%08lx,%s,%s)\n",thunk,thkbuf,len,dll16,dll32);
-
-	hmod = LoadLibrary16(dll16);
-	if (hmod<32) {
-		fprintf(stderr,"->failed to load 16bit DLL %s, error %d\n",dll16,hmod);
-		return NULL;
-	}
-	segaddr = (DWORD)WIN32_GetProcAddress16(hmod,(LPSTR)thkbuf);
-	if (!segaddr) {
-		fprintf(stderr,"->no %s exported from %s!\n",thkbuf,dll16);
-		return NULL;
-	}
-	addr = (LPDWORD)PTR_SEG_TO_LIN(segaddr);
-	if (addr[0] != len) {
-		fprintf(stderr,"->thkbuf length mismatch? %ld vs %ld\n",len,addr[0]);
-		return NULL;
-	}
-	if (!addr[1])
-		return 0;
-	*(DWORD*)thunk = addr[1];
-	return addr[1];
-}
-
-/***********************************************************************
- * 		_KERNEL32_45 	(KERNEL32.44)
- * FIXME: not sure what it does
- */
-VOID
-_KERNEL32_45(DWORD x,CONTEXT *context) {
-	fprintf(stderr,"_KERNEL32_45(0x%08lx,%%eax=0x%08lx,%%cx=0x%04lx,%%edx=0x%08lx)\n",
-		x,(DWORD)EAX_reg(context),(DWORD)CX_reg(context),(DWORD)EDX_reg(context)
-	);
-}
-
-/***********************************************************************
- *		(KERNEL32.40)
- * A thunk setup routine.
- * Expects a pointer to a preinitialized thunkbuffer in the first argument
- * looking like:
- *	00..03:		unknown	(some pointer to the 16bit struct?)
- *	04: EB1E		jmp +0x20
- *
- *	06..23:		unknown (space for replacement code, check .90)
- *
- *	24:>E8xxxxxxxx		call <32bitoffset xxxxxxxx>
- *	29: 58			pop eax
- *	2A: 2D2500xxxx		and eax,0x2500xxxx
- *	2F: BAxxxxxxxx		mov edx,xxxxxxxx
- *	34: 68yyyyyyyy		push KERNEL32.90
- *	39: C3			ret
- *
- *	3A: EB1E		jmp +0x20
- *	3E ... 59:	unknown (space for replacement code?)
- *	5A: E8xxxxxxxx		call <32bitoffset xxxxxxxx>
- *	5F: 5A			pop edx
- *	60: 81EA25xxxxxx	sub edx, 0x25xxxxxx
- *	66: 52			push edx
- *	67: 68xxxxxxxx		push xxxxxxxx
- *	6C: 68yyyyyyyy		push KERNEL32.89
- *	71: C3			ret
- *	72: end?
- * This function checks if the code is there, and replaces the yyyyyyyy entries
- * by the functionpointers.
- * The thunkbuf looks like:
- *
- *	00: DWORD	length		? don't know exactly
- *	04: SEGPTR	ptr		? where does it point to?
- * The segpointer ptr is written into the first DWORD of 'thunk'.
- * (probably correct implemented)
- */
-
-LPVOID
-_KERNEL32_41(LPBYTE thunk,LPCSTR thkbuf,DWORD len,LPCSTR dll16,LPCSTR dll32) {
-	HMODULE32	hkrnl32 = WIN32_GetModuleHandleA("KERNEL32");
-	HMODULE16	hmod;
-	LPDWORD		addr,addr2;
-	DWORD		segaddr;
-
-	fprintf(stderr,"KERNEL32_41(%p,%s,%ld,%s,%s)\n",
-		thunk,thkbuf,len,dll16,dll32
-	);
-
-	/* FIXME: add checks for valid code ... */
-	/* write pointers to kernel32.89 and kernel32.90 (+ordinal base of 1) */
-	*(DWORD*)(thunk+0x35) = (DWORD)GetProcAddress32(hkrnl32,(LPSTR)91);
-	*(DWORD*)(thunk+0x6D) = (DWORD)GetProcAddress32(hkrnl32,(LPSTR)90);
-
-	
-	hmod = LoadLibrary16(dll16);
-	if (hmod<32) {
-		fprintf(stderr,"->failed to load 16bit DLL %s, error %d\n",dll16,hmod);
-		return NULL;
-	}
-	segaddr = (DWORD)WIN32_GetProcAddress16(hmod,(LPSTR)thkbuf);
-	if (!segaddr) {
-		fprintf(stderr,"->no %s exported from %s!\n",thkbuf,dll16);
-		return NULL;
-	}
-	addr = (LPDWORD)PTR_SEG_TO_LIN(segaddr);
-	if (addr[0] != len) {
-		fprintf(stderr,"->thkbuf length mismatch? %ld vs %ld\n",len,addr[0]);
-		return NULL;
-	}
-	addr2 = PTR_SEG_TO_LIN(addr[1]);
-	if (HIWORD(addr2))
-		*(DWORD*)thunk = (DWORD)addr2;
-	return addr2;
-}
 
 /***********************************************************************
  *							(KERNEL32.33)
  * Returns some internal value.... probably the default environment database?
  */
-DWORD
-_KERNEL32_34() {
+DWORD WINAPI _KERNEL32_34()
+{
 	fprintf(stderr,"KERNEL32_34(), STUB returning 0\n");
 	return 0;
 }
-
-/***********************************************************************
- *							(KERNEL32.90)
- * Thunk priming? function
- * Rewrites the first part of the thunk to use the QT_Thunk interface.
- * Replaces offset 4 ... 24 by:
- *	
- *  33C9                    xor ecx, ecx
- *  8A4DFC                  mov cl , [ebp-04]
- *  8B148Dxxxxxxxx          mov edx, [4*ecx + (EAX+EDX)]
- *  B8yyyyyyyy              mov eax, QT_Thunk
- *  FFE0                    jmp eax
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- *  CC                      int 03
- * and jumps to the start of that code.
- * (ok)
- */
-VOID
-_KERNEL32_91(CONTEXT *context) {
-	LPBYTE	x;
-
-	fprintf(stderr,"_KERNEL32_91(eax=0x%08lx,edx=0x%08lx)\n",
-		EAX_reg(context),EDX_reg(context)
-	);
-	x = (LPBYTE)EAX_reg(context);
-	*x++ = 0x33;*x++=0xC9; /* xor ecx,ecx */
-	*x++ = 0x8A;*x++=0x4D;*x++=0xFC; /* mov cl,[ebp-04] */
-	*x++ = 0x8B;*x++=0x14;*x++=0x8D;*(DWORD*)x= EAX_reg(context)+EDX_reg(context);
-	x+=4;	/* mov edx, [4*ecx + (EAX+EDX) */
-	*x++ = 0xB8; *(DWORD*)x = (DWORD)GetProcAddress32(WIN32_GetModuleHandleA("KERNEL32"),"QT_Thunk");
-	x+=4; 	/* mov eax , QT_Thunk */
-	*x++ = 0xFF; *x++ = 0xE0;	/* jmp eax */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	*x++ = 0xCC;	/* int 03 */
-	EIP_reg(context) = EAX_reg(context);
-}
-
-/***********************************************************************
- *							(KERNEL32.45)
- * Another thunkbuf link routine.
- * The start of the thunkbuf looks like this:
- * 	00: DWORD	length
- *	04: SEGPTR	address for thunkbuffer pointer
- */
-VOID
-_KERNEL32_46(LPBYTE thunk,LPSTR thkbuf,DWORD len,LPSTR dll16,LPSTR dll32) {
-	LPDWORD		addr;
-	HMODULE16	hmod;
-	SEGPTR		segaddr;
-
-	fprintf(stderr,"KERNEL32_46(%p,%s,%lx,%s,%s)\n",
-		thunk,thkbuf,len,dll16,dll32
-	);
-	hmod = LoadLibrary16(dll16);
-	if (hmod < 32) {
-		fprintf(stderr,"->couldn't load %s, error %d\n",dll16,hmod);
-		return;
-	}
-	segaddr = (SEGPTR)WIN32_GetProcAddress16(hmod,thkbuf);
-	if (!segaddr) {
-		fprintf(stderr,"-> haven't found %s in %s!\n",thkbuf,dll16);
-		return;
-	}
-	addr = (LPDWORD)PTR_SEG_TO_LIN(segaddr);
-	if (addr[0] != len) {
-		fprintf(stderr,"-> length of thkbuf differs from expected length! (%ld vs %ld)\n",addr[0],len);
-		return;
-	}
-	*(DWORD*)PTR_SEG_TO_LIN(addr[1]) = (DWORD)thunk;
-}
-
-/**********************************************************************
- *           _KERNEL32_87
- * Check if thunking is initialized (ss selector set up etc.)
- */
-BOOL32 _KERNEL32_87() {
-    fprintf(stderr,"KERNEL32_87 stub, returning TRUE\n");
-    return TRUE;
-}
-
-/**********************************************************************
- *           _KERNEL32_88
- * One of the real thunking functions
- * Probably implemented totally wrong.
- */
-BOOL32 _KERNEL32_88(DWORD nr,DWORD flags,LPVOID fun,DWORD *hmm) {
-    fprintf(stderr,"KERNEL32_88(%ld,0x%08lx,%p,%p) stub, returning TRUE\n",
-	nr,flags,fun,hmm
-    );
-#ifndef WINELIB
-    switch (nr) {
-    case 0: CallTo32_0(fun);
-	break;
-    case 4: CallTo32_1(fun,hmm[0]);
-	break;
-    case 8: CallTo32_2(fun,hmm[0],hmm[1]);
-	break;
-    default:
-	fprintf(stderr,"    unsupported nr of arguments, %ld\n",nr);
-	break;
-
-    }
-#endif
-    return TRUE;
-}
diff --git a/win32/process.c b/win32/process.c
index deb34dd..ff4f2c5 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -37,7 +37,7 @@
 /***********************************************************************
  *           CreateMutexA    (KERNEL32.52)
  */
-HANDLE32 CreateMutex32A(SECURITY_ATTRIBUTES *sa,BOOL32 on,LPCSTR name)
+HANDLE32 WINAPI CreateMutex32A(SECURITY_ATTRIBUTES *sa,BOOL32 on,LPCSTR name)
 {
 	K32MUTEX	*mut;
 	HANDLE32	handle;
@@ -71,7 +71,7 @@
 /***********************************************************************
  *           CreateMutexW    (KERNEL32.53)
  */
-HANDLE32 CreateMutex32W(SECURITY_ATTRIBUTES *sa, BOOL32 on, LPCWSTR a)
+HANDLE32 WINAPI CreateMutex32W(SECURITY_ATTRIBUTES *sa, BOOL32 on, LPCWSTR a)
 {
 	LPSTR		name = a?HEAP_strdupWtoA(GetProcessHeap(),0,a):NULL;
 	HANDLE32	ret;
@@ -84,9 +84,9 @@
 /***********************************************************************
  *           CreateSemaphoreA    (KERNEL32.60)
  */
-HANDLE32 CreateSemaphore32A(
-	LPSECURITY_ATTRIBUTES sa,LONG initial,LONG max,LPCSTR name
-) {
+HANDLE32 WINAPI CreateSemaphore32A( LPSECURITY_ATTRIBUTES sa,
+                                    LONG initial,LONG max,LPCSTR name )
+{
 	K32SEMAPHORE	*sem;
 	HANDLE32	handle;
 	K32OBJ 		*obj = K32OBJ_FindName( name );
@@ -119,7 +119,7 @@
 /***********************************************************************
  *           CreateSemaphoreW    (KERNEL32.61)
  */
-HANDLE32 CreateSemaphore32W(SECURITY_ATTRIBUTES *sa,LONG initial,LONG max,LPCWSTR a)
+HANDLE32 WINAPI CreateSemaphore32W(SECURITY_ATTRIBUTES *sa,LONG initial,LONG max,LPCWSTR a)
 {
 	LPSTR		name =a?HEAP_strdupWtoA(GetProcessHeap(),0,a):NULL;
 	HANDLE32	ret;
@@ -133,7 +133,7 @@
 /***********************************************************************
  *           OpenSemaphoreA    (KERNEL32.403)
  */
-HANDLE32 OpenSemaphore32A(DWORD desired,BOOL32 inherit,LPCSTR name)
+HANDLE32 WINAPI OpenSemaphore32A(DWORD desired,BOOL32 inherit,LPCSTR name)
 {
 	K32OBJ 		*obj = K32OBJ_FindName( name );
 
@@ -149,7 +149,7 @@
 /***********************************************************************
  *           OpenSemaphoreA    (KERNEL32.404)
  */
-HANDLE32 OpenSemaphore32W(DWORD desired,BOOL32 inherit,LPCWSTR name)
+HANDLE32 WINAPI OpenSemaphore32W(DWORD desired,BOOL32 inherit,LPCWSTR name)
 {
 	LPSTR	nameA = name?HEAP_strdupWtoA(GetProcessHeap(),0,name):NULL;
 	HANDLE32	ret = OpenSemaphore32A(desired,inherit,nameA);
@@ -161,7 +161,8 @@
 /***********************************************************************
  *           ReleaseSemaphore    (KERNEL32.403)
  */
-BOOL32 ReleaseSemaphore(HANDLE32 hSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount) {
+BOOL32 WINAPI ReleaseSemaphore(HANDLE32 hSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount)
+{
 	K32SEMAPHORE	*sem;
 
 	sem = (K32SEMAPHORE*)PROCESS_GetObjPtr(hSemaphore,K32OBJ_SEMAPHORE);
@@ -183,7 +184,7 @@
 /***********************************************************************
  *           OpenMutexA    (KERNEL32.399)
  */
-HANDLE32 OpenMutex32A(DWORD desiredaccess, BOOL32 inherithandle, LPCSTR name)
+HANDLE32 WINAPI OpenMutex32A(DWORD desiredaccess, BOOL32 inherithandle, LPCSTR name)
 {
 	K32OBJ 		*obj = K32OBJ_FindName( name );
 
@@ -199,7 +200,8 @@
 /***********************************************************************
  *           OpenMutexW    (KERNEL32.400)
  */
-HANDLE32 OpenMutex32W(DWORD desiredaccess, BOOL32 inherithandle, LPCWSTR name)
+HANDLE32 WINAPI OpenMutex32W(DWORD desiredaccess, BOOL32 inherithandle,
+                             LPCWSTR name)
 {
 	LPSTR		nameA=name?HEAP_strdupWtoA(GetProcessHeap(),0,name):NULL;
 	HANDLE32	ret = OpenMutex32A(desiredaccess,inherithandle,nameA);
@@ -211,7 +213,7 @@
 /***********************************************************************
  *           ReleaseMutex    (KERNEL32.435)
  */
-BOOL32 ReleaseMutex (HANDLE32 h)
+BOOL32 WINAPI ReleaseMutex (HANDLE32 h)
 {
 	K32MUTEX	*mut = (K32MUTEX*)PROCESS_GetObjPtr(h,K32OBJ_MUTEX);
 
@@ -233,7 +235,8 @@
 /***********************************************************************
  *           CreateEventA    (KERNEL32.43)
  */
-HANDLE32 CreateEvent32A(SECURITY_ATTRIBUTES *sa,BOOL32 au,BOOL32 on,LPCSTR name)
+HANDLE32 WINAPI CreateEvent32A(SECURITY_ATTRIBUTES *sa,BOOL32 au,BOOL32 on,
+                               LPCSTR name)
 {
 	K32EVENT	*evt;
 	HANDLE32	handle;
@@ -263,7 +266,8 @@
 /***********************************************************************
  *           CreateEventW    (KERNEL32.43)
  */
-HANDLE32 CreateEvent32W(SECURITY_ATTRIBUTES *sa, BOOL32 au, BOOL32 on,LPCWSTR name)
+HANDLE32 WINAPI CreateEvent32W(SECURITY_ATTRIBUTES *sa, BOOL32 au,
+                               BOOL32 on,LPCWSTR name)
 {
 	LPSTR nameA=name?HEAP_strdupWtoA(GetProcessHeap(),0,name):NULL;
 	HANDLE32 ret = CreateEvent32A(sa,au,on,nameA);
@@ -275,7 +279,8 @@
 /***********************************************************************
  *           OpenEventA    (KERNEL32.394)
  */
-HANDLE32 OpenEvent32A(DWORD desiredaccess,BOOL32 inherithandle,LPCSTR name) {
+HANDLE32 WINAPI OpenEvent32A(DWORD desiredaccess,BOOL32 inherithandle,LPCSTR name)
+{
 	K32OBJ 		*obj = K32OBJ_FindName( name );
 
 	if (obj) {
@@ -290,7 +295,8 @@
 /***********************************************************************
  *           OpenEventW    (KERNEL32.395)
  */
-HANDLE32 OpenEvent32W(DWORD desiredaccess,BOOL32 inherithandle,LPCWSTR name) {
+HANDLE32 WINAPI OpenEvent32W(DWORD desiredaccess,BOOL32 inherithandle,LPCWSTR name)
+{
 	LPSTR	nameA = name?HEAP_strdupWtoA(GetProcessHeap(),0,name):NULL;
 	HANDLE32	ret = OpenEvent32A(desiredaccess,inherithandle,nameA);
 
@@ -301,7 +307,7 @@
 /***********************************************************************
  *           SetEvent    (KERNEL32.487)
  */
-BOOL32 SetEvent (HANDLE32 h)
+BOOL32 WINAPI SetEvent (HANDLE32 h)
 {
 	fprintf(stderr,"SetEvent(%d) stub\n",h);
 	return 0;
@@ -309,7 +315,7 @@
 /***********************************************************************
  *           ResetEvent    (KERNEL32.439)
  */
-BOOL32 ResetEvent (HANDLE32 h)
+BOOL32 WINAPI ResetEvent (HANDLE32 h)
 {
 	fprintf(stderr,"ResetEvent(%d) stub\n",h);
 	return 0;
@@ -318,16 +324,26 @@
 /***********************************************************************
  *           WaitForSingleObject    (KERNEL32.561)
  */
-DWORD WaitForSingleObject(HANDLE32 h, DWORD timeout)
+DWORD WINAPI WaitForSingleObject(HANDLE32 h, DWORD timeout)
 {
 	fprintf(stderr,"WaitForSingleObject(%d,%ld) stub\n",h,timeout);
 	return 0;
 }
 
 /***********************************************************************
+ *           WaitForSingleObjectEx    (KERNEL32)
+ */
+DWORD WINAPI WaitForSingleObjectEx(HANDLE32 h,DWORD timeout,BOOL32 bAlertable)
+{
+	fprintf(stderr,"WaitForSingleObjectEx(%d,%ld,%d) stub\n",h,timeout,bAlertable);
+	return 0;
+}
+
+
+/***********************************************************************
  *           WaitForMultipleObjects    (USER32.399)
  */
-DWORD MsgWaitForMultipleObjects(
+DWORD WINAPI MsgWaitForMultipleObjects(
 	DWORD nCount,HANDLE32 *pHandles,BOOL32 fWaitAll,DWORD dwMilliseconds,
 	DWORD dwWakeMask
 ) {
@@ -341,20 +357,25 @@
 /***********************************************************************
  *           DuplicateHandle    (KERNEL32.78)
  */
-BOOL32 DuplicateHandle(HANDLE32 a, HANDLE32 b, HANDLE32 c, HANDLE32 * d, DWORD e, BOOL32 f, DWORD g)
+BOOL32 WINAPI DuplicateHandle(HANDLE32 a, HANDLE32 b, HANDLE32 c, HANDLE32 * d, DWORD e, BOOL32 f, DWORD g)
 {
 	fprintf(stderr,"DuplicateHandle(%d,%d,%d,%p,%ld,%d,%ld) stub\n",a,b,c,d,e,f,g);
 	*d = b;
 	return TRUE;
 }
 
+HINSTANCE32 WINAPI LoadLibraryEx32A(LPCSTR libname,HFILE32 hfile,DWORD flags)
+{
+    fprintf(stderr,"LoadLibraryEx32A(%s,%d,0x%08lx)\n",libname,hfile,flags);
+    return LoadLibrary32A(libname);
+}
 
 /***********************************************************************
  *           LoadLibraryA         (KERNEL32.365)
  * copied from LoadLibrary
  * This does not currently support built-in libraries
  */
-HINSTANCE32 LoadLibrary32A(LPCSTR libname)
+HINSTANCE32 WINAPI LoadLibrary32A(LPCSTR libname)
 {
 	HINSTANCE32 handle;
 	dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
@@ -376,7 +397,7 @@
 /***********************************************************************
  *           LoadLibrary32W         (KERNEL32.368)
  */
-HINSTANCE32 LoadLibrary32W(LPCWSTR libnameW)
+HINSTANCE32 WINAPI LoadLibrary32W(LPCWSTR libnameW)
 {
     LPSTR libnameA = HEAP_strdupWtoA( GetProcessHeap(), 0, libnameW );
     HINSTANCE32 ret = LoadLibrary32A( libnameA );
@@ -387,7 +408,7 @@
 /***********************************************************************
  *           FreeLibrary
  */
-BOOL32 FreeLibrary32(HINSTANCE32 hLibModule)
+BOOL32 WINAPI FreeLibrary32(HINSTANCE32 hLibModule)
 {
 	fprintf(stderr,"FreeLibrary: empty stub\n");
 	return TRUE;
@@ -396,8 +417,9 @@
 /**********************************************************************
  *          GetProcessAffinityMask
  */
-BOOL32 GetProcessAffinityMask(HANDLE32 hProcess, LPDWORD lpProcessAffinityMask,
-  LPDWORD lpSystemAffinityMask)
+BOOL32 WINAPI GetProcessAffinityMask(HANDLE32 hProcess,
+                                     LPDWORD lpProcessAffinityMask,
+                                     LPDWORD lpSystemAffinityMask)
 {
 	dprintf_task(stddeb,"GetProcessAffinityMask(%x,%lx,%lx)\n",
 		hProcess,(lpProcessAffinityMask?*lpProcessAffinityMask:0),
@@ -415,7 +437,7 @@
  *           SetThreadAffinityMask
  * Works now like the Windows95 (no MP support) version
  */
-BOOL32 SetThreadAffinityMask(HANDLE32 hThread, DWORD dwThreadAffinityMask)
+BOOL32 WINAPI SetThreadAffinityMask(HANDLE32 hThread, DWORD dwThreadAffinityMask)
 {
 	THDB	*thdb = (THDB*)PROCESS_GetObjPtr(hThread,K32OBJ_THREAD);
 
@@ -430,8 +452,7 @@
 	return TRUE;
 }
 
-BOOL32
-CreateProcess32A(
+BOOL32 WINAPI CreateProcess32A(
 	LPCSTR appname,LPSTR cmdline,LPSECURITY_ATTRIBUTES processattributes,
         LPSECURITY_ATTRIBUTES threadattributes,BOOL32 inherithandles,
 	DWORD creationflags,LPVOID env,LPCSTR curdir,
@@ -444,8 +465,7 @@
 	return TRUE;
 }
 
-BOOL32
-ContinueDebugEvent(DWORD pid,DWORD tid,DWORD contstatus) {
+BOOL32 WINAPI ContinueDebugEvent(DWORD pid,DWORD tid,DWORD contstatus) {
 	fprintf(stderr,"ContinueDebugEvent(%ld,%ld,%ld), stub\n",pid,tid,contstatus);
 	return TRUE;
 }
@@ -455,8 +475,7 @@
  *
  * FIXME: implement this better ...
  */
-BOOL32
-GetProcessTimes(
+BOOL32 WINAPI GetProcessTimes(
 	HANDLE32 hprocess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,
 	LPFILETIME lpKernelTime, LPFILETIME lpUserTime
 ) {
diff --git a/win32/security.c b/win32/security.c
index f8e9afa..4f7ef47 100644
--- a/win32/security.c
+++ b/win32/security.c
@@ -8,23 +8,23 @@
 #include "stddebug.h"
 #include "debug.h"
 
-BOOL32 IsValidSid (LPSID pSid);
-BOOL32 EqualSid (LPSID pSid1, LPSID pSid2);
-BOOL32 EqualPrefixSid (LPSID pSid1, LPSID pSid2);
-DWORD GetSidLengthRequired (BYTE nSubAuthorityCount);
-BOOL32 AllocateAndInitializeSid (LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3,    DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, LPSID *pSid);
-VOID *FreeSid(LPSID pSid);
-BOOL32 InitializeSid (LPSID pSid, LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount);
-LPSID_IDENTIFIER_AUTHORITY GetSidIdentifierAuthority (LPSID pSid);
-DWORD *GetSidSubAuthority (LPSID pSid, DWORD nSubAuthority);
-BYTE *GetSidSubAuthorityCount (LPSID pSid);
-DWORD GetLengthSid (LPSID pSid);
-BOOL32 CopySid (DWORD nDestinationSidLength, LPSID pDestinationSid, LPSID pSourceSid);
+BOOL32 WINAPI IsValidSid (LPSID pSid);
+BOOL32 WINAPI EqualSid (LPSID pSid1, LPSID pSid2);
+BOOL32 WINAPI EqualPrefixSid (LPSID pSid1, LPSID pSid2);
+DWORD  WINAPI GetSidLengthRequired (BYTE nSubAuthorityCount);
+BOOL32 WINAPI AllocateAndInitializeSid(LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3,    DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, LPSID *pSid);
+VOID*  WINAPI FreeSid(LPSID pSid);
+BOOL32 WINAPI InitializeSid (LPSID pSid, LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount);
+LPSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(LPSID pSid);
+DWORD* WINAPI GetSidSubAuthority(LPSID pSid, DWORD nSubAuthority);
+BYTE*  WINAPI GetSidSubAuthorityCount(LPSID pSid);
+DWORD  WINAPI GetLengthSid(LPSID pSid);
+BOOL32 WINAPI CopySid(DWORD nDestinationSidLength, LPSID pDestinationSid, LPSID pSourceSid);
 
 /***********************************************************************
  *           IsValidSid  (ADVAPI.80)
  */
-BOOL32 IsValidSid (LPSID pSid) {
+BOOL32 WINAPI IsValidSid (LPSID pSid) {
     if (!pSid || pSid->Revision != SID_REVISION)
         return FALSE;
 
@@ -34,7 +34,7 @@
 /***********************************************************************
  *           EqualSid  (ADVAPI.40)
  */
-BOOL32 EqualSid (LPSID pSid1, LPSID pSid2) {
+BOOL32 WINAPI EqualSid (LPSID pSid1, LPSID pSid2) {
     if (!IsValidSid(pSid1) || !IsValidSid(pSid2))
         return FALSE;
 
@@ -50,7 +50,7 @@
 /***********************************************************************
  *           EqualPrefixSid  (ADVAPI.39)
  */
-BOOL32 EqualPrefixSid (LPSID pSid1, LPSID pSid2) {
+BOOL32 WINAPI EqualPrefixSid (LPSID pSid1, LPSID pSid2) {
     if (!IsValidSid(pSid1) || !IsValidSid(pSid2))
         return FALSE;
 
@@ -67,14 +67,14 @@
 /***********************************************************************
  *           GetSidLengthRequired  (ADVAPI.63)
  */
-DWORD GetSidLengthRequired (BYTE nSubAuthorityCount) {
+DWORD WINAPI GetSidLengthRequired (BYTE nSubAuthorityCount) {
     return sizeof (SID) + (nSubAuthorityCount - 1 * sizeof (DWORD));
 }
 
 /***********************************************************************
  *           AllocateAndInitializeSid  (ADVAPI.11)
  */
-BOOL32 AllocateAndInitializeSid (LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
+BOOL32 WINAPI AllocateAndInitializeSid(LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
     BYTE nSubAuthorityCount,
     DWORD nSubAuthority0, DWORD nSubAuthority1,
     DWORD nSubAuthority2, DWORD nSubAuthority3,
@@ -112,7 +112,7 @@
 /***********************************************************************
  *           FreeSid  (ADVAPI.42)
  */
-VOID *FreeSid(LPSID pSid) {
+VOID* WINAPI FreeSid(LPSID pSid) {
     free(pSid);
     return NULL;
 }
@@ -120,8 +120,9 @@
 /***********************************************************************
  *           InitializeSid  (ADVAPI.74)
  */
-BOOL32 InitializeSid (LPSID pSid, LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
-                    BYTE nSubAuthorityCount) {
+BOOL32 WINAPI InitializeSid (LPSID pSid, LPSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
+                    BYTE nSubAuthorityCount)
+{
     int i;
 
     pSid->Revision = SID_REVISION;
@@ -139,36 +140,41 @@
 /***********************************************************************
  *           GetSidIdentifierAuthority  (ADVAPI.62)
  */
-LPSID_IDENTIFIER_AUTHORITY GetSidIdentifierAuthority (LPSID pSid) {
+LPSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority (LPSID pSid)
+{
     return &pSid->IdentifierAuthority;
 }
 
 /***********************************************************************
  *           GetSidSubAuthority  (ADVAPI.64)
  */
-DWORD *GetSidSubAuthority (LPSID pSid, DWORD nSubAuthority) {
+DWORD * WINAPI GetSidSubAuthority (LPSID pSid, DWORD nSubAuthority)
+{
     return &pSid->SubAuthority[nSubAuthority];
 }
 
 /***********************************************************************
  *           GetSidSubAuthorityCount  (ADVAPI.65)
  */
-BYTE *GetSidSubAuthorityCount (LPSID pSid) {
+BYTE * WINAPI GetSidSubAuthorityCount (LPSID pSid)
+{
     return &pSid->SubAuthorityCount;
 }
 
 /***********************************************************************
  *           GetLengthSid  (ADVAPI.48)
  */
-DWORD GetLengthSid (LPSID pSid) {
+DWORD WINAPI GetLengthSid (LPSID pSid)
+{
     return GetSidLengthRequired(*GetSidSubAuthorityCount(pSid));
 }
 
 /***********************************************************************
  *           CopySid  (ADVAPI.24)
  */
-BOOL32 CopySid (DWORD nDestinationSidLength, LPSID pDestinationSid,
-              LPSID pSourceSid) {
+BOOL32 WINAPI CopySid (DWORD nDestinationSidLength, LPSID pDestinationSid,
+                       LPSID pSourceSid)
+{
 
     if (!IsValidSid(pSourceSid))
         return FALSE;
diff --git a/win32/thread.c b/win32/thread.c
index 93153a0..4d4da74 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -38,7 +38,7 @@
 * The returned number need not be equal to the result!!!!		*
 ************************************************************************/
 
-LONG InterlockedIncrement(LPLONG lpAddend)
+LONG WINAPI InterlockedIncrement(LPLONG lpAddend)
 {
 #if defined(__i386__)&&defined(__GNUC__)
 	long ret;
@@ -78,7 +78,7 @@
 * The returned number need not be equal to the result!!!!		*
 ************************************************************************/
 
-LONG InterlockedDecrement(LPLONG lpAddend)
+LONG WINAPI InterlockedDecrement(LPLONG lpAddend)
 {
 #if defined(__i386__)&&defined(__GNUC__)	
 	LONG ret;
@@ -111,7 +111,7 @@
 *           InterlockedExchange				[KERNEL32]	*
 ************************************************************************/
 
-LONG InterlockedExchange(LPLONG target, LONG value)
+LONG WINAPI InterlockedExchange(LPLONG target, LONG value)
 {
 #if defined(__i386__)&&defined(__GNUC__)	
 	LONG ret;
@@ -145,7 +145,7 @@
 *           InitializeCriticalSection			[KERNEL32]	*
 ************************************************************************/
 
-void InitializeCriticalSection(CRITICAL_SECTION *pcritical)
+void WINAPI InitializeCriticalSection(CRITICAL_SECTION *pcritical)
 {
    pcritical->LockCount=-1;
    pcritical->RecursionCount=0;
@@ -158,7 +158,7 @@
 *           DeleteCriticalSection			[KERNEL32]	*
 ************************************************************************/
 
-void DeleteCriticalSection(CRITICAL_SECTION *pcritical)
+void WINAPI DeleteCriticalSection(CRITICAL_SECTION *pcritical)
 {
    semctl((int) pcritical->LockSemaphore,0,IPC_RMID,(union semun)NULL);
    pcritical->Reserved=-1;
@@ -168,7 +168,7 @@
 *           EnterCriticalSection			[KERNEL32]	*
 ************************************************************************/
 
-void EnterCriticalSection (CRITICAL_SECTION *pcritical)
+void WINAPI EnterCriticalSection (CRITICAL_SECTION *pcritical)
 {
    if( InterlockedIncrement(&(pcritical->LockCount)))
    {   
@@ -195,7 +195,7 @@
 *           TryEnterCriticalSection			[KERNEL32]	*
 ************************************************************************/
 
-BOOL32 TryEnterCriticalSection (CRITICAL_SECTION *pcritical)
+BOOL32 WINAPI TryEnterCriticalSection (CRITICAL_SECTION *pcritical)
 {
    if( InterlockedIncrement(&(pcritical->LockCount)))
    {
@@ -215,7 +215,7 @@
 *           LeaveCriticalSection			[KERNEL32]	*
 ************************************************************************/
 
-void LeaveCriticalSection (CRITICAL_SECTION *pcritical)
+void WINAPI LeaveCriticalSection(CRITICAL_SECTION *pcritical)
 {
    /* do we actually own this critical section ??? */
    if( pcritical->OwningThread!= (HANDLE32) GetCurrentThreadId())
@@ -245,7 +245,7 @@
 *           ReinitializeCriticalSection			[KERNEL32]	*
 ************************************************************************/
 
-void ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit)
+void WINAPI ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit)
 {
    /* hmm ?????? */	
 }
@@ -254,7 +254,7 @@
 *           MakeCriticalSectionGlobal			[KERNEL32]	*
 ************************************************************************/
 
-void MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit)
+void WINAPI MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit)
 {
    /* nothing (SysV Semaphores are already global) */
    return;	
diff --git a/win32/time.c b/win32/time.c
index 4994190..67c3cb5 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -16,7 +16,7 @@
 /***********************************************************************
  *              GetLocalTime            (KERNEL32.228)
  */
-VOID GetLocalTime(LPSYSTEMTIME systime)
+VOID WINAPI GetLocalTime(LPSYSTEMTIME systime)
 {
     time_t local_time;
     struct tm *local_tm;
@@ -39,7 +39,7 @@
 /***********************************************************************
  *              GetSystemTime            (KERNEL32.285)
  */
-VOID GetSystemTime(LPSYSTEMTIME systime)
+VOID WINAPI GetSystemTime(LPSYSTEMTIME systime)
 {
     time_t local_time;
     struct tm *local_tm;
@@ -63,7 +63,7 @@
 /***********************************************************************
  *              SetSystemTime            (KERNEL32.507)
  */
-BOOL32 SetSystemTime(const SYSTEMTIME *systime)
+BOOL32 WINAPI SetSystemTime(const SYSTEMTIME *systime)
 {
     struct timeval tv;
     struct timezone tz;
@@ -99,7 +99,7 @@
 /***********************************************************************
  *              GetTimeZoneInformation  (KERNEL32.302)
  */
-DWORD GetTimeZoneInformation(LPTIME_ZONE_INFORMATION tzinfo)
+DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION tzinfo)
 {
     time_t gmt, lt;
 
@@ -118,7 +118,7 @@
 /***********************************************************************
  *              SetTimeZoneInformation  (KERNEL32.515)
  */
-BOOL32 SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION tzinfo)
+BOOL32 WINAPI SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION tzinfo)
 {
     struct timezone tz;
 
@@ -135,7 +135,7 @@
 /***********************************************************************
  *              Sleep  (KERNEL32.523)
  */
-VOID Sleep(DWORD cMilliseconds)
+VOID WINAPI Sleep(DWORD cMilliseconds)
 {
     if(cMilliseconds == INFINITE32)
         while(1) sleep(1000); /* Spin forever */
diff --git a/win32/user32.c b/win32/user32.c
index 5a1192a..3080596 100644
--- a/win32/user32.c
+++ b/win32/user32.c
@@ -22,7 +22,7 @@
 /***********************************************************************
  *          GetMessage32A   (USER32.269)
  */
-BOOL32 GetMessage32A(MSG32* lpmsg,HWND32 hwnd,UINT32 min,UINT32 max)
+BOOL32 WINAPI GetMessage32A(MSG32* lpmsg,HWND32 hwnd,UINT32 min,UINT32 max)
 {
     BOOL32 ret;
     MSG16 *msg = SEGPTR_NEW(MSG16);
@@ -37,7 +37,7 @@
 /***********************************************************************
  *          GetMessage32W   (USER32.273)
  */
-BOOL32 GetMessage32W(MSG32* lpmsg,HWND32 hwnd,UINT32 min,UINT32 max)
+BOOL32 WINAPI GetMessage32W(MSG32* lpmsg,HWND32 hwnd,UINT32 min,UINT32 max)
 {
     BOOL32 ret;
     MSG16 *msg = SEGPTR_NEW(MSG16);
@@ -52,8 +52,8 @@
 /***********************************************************************
  *         PeekMessageA
  */
-BOOL32 PeekMessage32A( LPMSG32 lpmsg, HWND32 hwnd,
-                       UINT32 min,UINT32 max,UINT32 wRemoveMsg)
+BOOL32 WINAPI PeekMessage32A( LPMSG32 lpmsg, HWND32 hwnd,
+                              UINT32 min,UINT32 max,UINT32 wRemoveMsg)
 {
 	MSG16 msg;
 	BOOL32 ret;
@@ -66,8 +66,8 @@
 /***********************************************************************
  *         PeekMessageW
  */
-BOOL32 PeekMessage32W( LPMSG32 lpmsg, HWND32 hwnd,
-                       UINT32 min,UINT32 max,UINT32 wRemoveMsg)
+BOOL32 WINAPI PeekMessage32W( LPMSG32 lpmsg, HWND32 hwnd,
+                              UINT32 min,UINT32 max,UINT32 wRemoveMsg)
 {
 	/* FIXME: Should perform Unicode translation on specific messages */
 	return PeekMessage32A(lpmsg,hwnd,min,max,wRemoveMsg);
diff --git a/windows/caret.c b/windows/caret.c
index 00de7ff..315ce72 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -65,7 +65,8 @@
     /* So now it's always a toggle */
 
     Caret.on = !Caret.on;
-    if (!(hdc = GetDCEx32( Caret.hwnd, 0, DCX_USESTYLE | DCX_CACHE ))) return;
+    /* do not use DCX_CACHE here, for x,y,width,height are in logical units */
+    if (!(hdc = GetDCEx32( Caret.hwnd, 0, DCX_USESTYLE /*| DCX_CACHE*/ ))) return;
     hPrevBrush = SelectObject32( hdc, Caret.hBrush );
     PatBlt32( hdc, Caret.x, Caret.y, Caret.width, Caret.height, PATINVERT );
     SelectObject32( hdc, hPrevBrush );
@@ -125,7 +126,8 @@
 /*****************************************************************
  *           CreateCaret16   (USER.163)
  */
-void CreateCaret16( HWND16 hwnd, HBITMAP16 bitmap, INT16 width, INT16 height )
+void WINAPI CreateCaret16( HWND16 hwnd, HBITMAP16 bitmap,
+                           INT16 width, INT16 height )
 {
     CreateCaret32( hwnd, bitmap, width, height );
 }
@@ -133,8 +135,8 @@
 /*****************************************************************
  *           CreateCaret32   (USER32.65)
  */
-BOOL32 CreateCaret32( HWND32 hwnd, HBITMAP32 bitmap,
-                      INT32 width, INT32 height )
+BOOL32 WINAPI CreateCaret32( HWND32 hwnd, HBITMAP32 bitmap,
+                             INT32 width, INT32 height )
 {
     dprintf_caret(stddeb,"CreateCaret: hwnd=%04x\n", hwnd);
 
@@ -175,7 +177,7 @@
 /*****************************************************************
  *           DestroyCaret16   (USER.164)
  */
-void DestroyCaret16(void)
+void WINAPI DestroyCaret16(void)
 {
     DestroyCaret32();
 }
@@ -184,7 +186,7 @@
 /*****************************************************************
  *           DestroyCaret32   (USER32.130)
  */
-BOOL32 DestroyCaret32(void)
+BOOL32 WINAPI DestroyCaret32(void)
 {
     if (!Caret.hwnd) return FALSE;
 
@@ -202,7 +204,7 @@
 /*****************************************************************
  *           SetCaretPos16   (USER.165)
  */
-void SetCaretPos16( INT16 x, INT16 y )
+void WINAPI SetCaretPos16( INT16 x, INT16 y )
 {
     SetCaretPos32( x, y );
 }
@@ -211,7 +213,7 @@
 /*****************************************************************
  *           SetCaretPos32   (USER32.465)
  */
-BOOL32 SetCaretPos32( INT32 x, INT32 y)
+BOOL32 WINAPI SetCaretPos32( INT32 x, INT32 y)
 {
     if (!Caret.hwnd) return FALSE;
     if ((x == Caret.x) && (y == Caret.y)) return TRUE;
@@ -234,7 +236,7 @@
 /*****************************************************************
  *           HideCaret16   (USER.166)
  */
-void HideCaret16( HWND16 hwnd )
+void WINAPI HideCaret16( HWND16 hwnd )
 {
     HideCaret32( hwnd );
 }
@@ -243,7 +245,7 @@
 /*****************************************************************
  *           HideCaret32   (USER32.316)
  */
-BOOL32 HideCaret32( HWND32 hwnd )
+BOOL32 WINAPI HideCaret32( HWND32 hwnd )
 {
     if (!Caret.hwnd) return FALSE;
     if (hwnd && (Caret.hwnd != hwnd)) return FALSE;
@@ -261,7 +263,7 @@
 /*****************************************************************
  *           ShowCaret16   (USER.167)
  */
-void ShowCaret16( HWND16 hwnd )
+void WINAPI ShowCaret16( HWND16 hwnd )
 {
     ShowCaret32( hwnd );
 }
@@ -270,7 +272,7 @@
 /*****************************************************************
  *           ShowCaret32   (USER32.528)
  */
-BOOL32 ShowCaret32( HWND32 hwnd )
+BOOL32 WINAPI ShowCaret32( HWND32 hwnd )
 {
     if (!Caret.hwnd) return FALSE;
     if (hwnd && (Caret.hwnd != hwnd)) return FALSE;
@@ -294,7 +296,7 @@
 /*****************************************************************
  *           SetCaretBlinkTime16   (USER.168)
  */
-void SetCaretBlinkTime16( UINT16 msecs )
+void WINAPI SetCaretBlinkTime16( UINT16 msecs )
 {
     SetCaretBlinkTime32( msecs );
 }
@@ -302,7 +304,7 @@
 /*****************************************************************
  *           SetCaretBlinkTime32   (USER32.464)
  */
-BOOL32 SetCaretBlinkTime32( UINT32 msecs )
+BOOL32 WINAPI SetCaretBlinkTime32( UINT32 msecs )
 {
     if (!Caret.hwnd) return FALSE;
 
@@ -318,7 +320,7 @@
 /*****************************************************************
  *           GetCaretBlinkTime16   (USER.169)
  */
-UINT16 GetCaretBlinkTime16(void)
+UINT16 WINAPI GetCaretBlinkTime16(void)
 {
     return (UINT16)GetCaretBlinkTime32();
 }
@@ -327,7 +329,7 @@
 /*****************************************************************
  *           GetCaretBlinkTime32   (USER32.208)
  */
-UINT32 GetCaretBlinkTime32(void)
+UINT32 WINAPI GetCaretBlinkTime32(void)
 {
     return Caret.timeout;
 }
@@ -336,7 +338,7 @@
 /*****************************************************************
  *           GetCaretPos16   (USER.183)
  */
-VOID GetCaretPos16( LPPOINT16 pt )
+VOID WINAPI GetCaretPos16( LPPOINT16 pt )
 {
     if (!Caret.hwnd || !pt) return;
 
@@ -350,7 +352,7 @@
 /*****************************************************************
  *           GetCaretPos32   (USER32.209)
  */
-BOOL32 GetCaretPos32( LPPOINT32 pt )
+BOOL32 WINAPI GetCaretPos32( LPPOINT32 pt )
 {
     if (!Caret.hwnd || !pt) return FALSE;
     pt->x = Caret.x;
diff --git a/windows/class.c b/windows/class.c
index 4cc7eb6..e6422e9 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -304,7 +304,7 @@
 /***********************************************************************
  *           RegisterClass16    (USER.57)
  */
-ATOM RegisterClass16( const WNDCLASS16 *wc )
+ATOM WINAPI RegisterClass16( const WNDCLASS16 *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -342,7 +342,7 @@
 /***********************************************************************
  *           RegisterClass32A      (USER32.426)
  */
-ATOM RegisterClass32A( const WNDCLASS32A* wc )
+ATOM WINAPI RegisterClass32A( const WNDCLASS32A* wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -379,7 +379,7 @@
 /***********************************************************************
  *           RegisterClass32W      (USER32.429)
  */
-ATOM RegisterClass32W( const WNDCLASS32W* wc )
+ATOM WINAPI RegisterClass32W( const WNDCLASS32W* wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -414,7 +414,7 @@
 /***********************************************************************
  *           RegisterClassEx16    (USER.397)
  */
-ATOM RegisterClassEx16( const WNDCLASSEX16 *wc )
+ATOM WINAPI RegisterClassEx16( const WNDCLASSEX16 *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -449,7 +449,7 @@
 /***********************************************************************
  *           RegisterClassEx32A      (USER32.427)
  */
-ATOM RegisterClassEx32A( const WNDCLASSEX32A* wc )
+ATOM WINAPI RegisterClassEx32A( const WNDCLASSEX32A* wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -484,7 +484,7 @@
 /***********************************************************************
  *           RegisterClassEx32W      (USER32.428)
  */
-ATOM RegisterClassEx32W( const WNDCLASSEX32W* wc )
+ATOM WINAPI RegisterClassEx32W( const WNDCLASSEX32W* wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -519,7 +519,7 @@
 /***********************************************************************
  *           UnregisterClass16    (USER.403)
  */
-BOOL16 UnregisterClass16( SEGPTR className, HINSTANCE16 hInstance )
+BOOL16 WINAPI UnregisterClass16( SEGPTR className, HINSTANCE16 hInstance )
 {
     CLASS *classPtr;
     ATOM atom;
@@ -535,7 +535,7 @@
 /***********************************************************************
  *           UnregisterClass32A    (USER32.562)
  */
-BOOL32 UnregisterClass32A( LPCSTR className, HINSTANCE32 hInstance )
+BOOL32 WINAPI UnregisterClass32A( LPCSTR className, HINSTANCE32 hInstance )
 {
     CLASS *classPtr;
     ATOM atom;
@@ -551,7 +551,7 @@
 /***********************************************************************
  *           UnregisterClass32W    (USER32.563)
  */
-BOOL32 UnregisterClass32W( LPCWSTR className, HINSTANCE32 hInstance )
+BOOL32 WINAPI UnregisterClass32W( LPCWSTR className, HINSTANCE32 hInstance )
 {
     CLASS *classPtr;
     ATOM atom;
@@ -567,7 +567,7 @@
 /***********************************************************************
  *           GetClassWord16    (USER.129)
  */
-WORD GetClassWord16( HWND16 hwnd, INT16 offset )
+WORD WINAPI GetClassWord16( HWND16 hwnd, INT16 offset )
 {
     return GetClassWord32( hwnd, offset );
 }
@@ -576,7 +576,7 @@
 /***********************************************************************
  *           GetClassWord32    (USER32.218)
  */
-WORD GetClassWord32( HWND32 hwnd, INT32 offset )
+WORD WINAPI GetClassWord32( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr;
     
@@ -607,7 +607,7 @@
 /***********************************************************************
  *           GetClassLong16    (USER.131)
  */
-LONG GetClassLong16( HWND16 hwnd, INT16 offset )
+LONG WINAPI GetClassLong16( HWND16 hwnd, INT16 offset )
 {
     WND *wndPtr;
     LONG ret;
@@ -629,7 +629,7 @@
 /***********************************************************************
  *           GetClassLong32A    (USER32.214)
  */
-LONG GetClassLong32A( HWND32 hwnd, INT32 offset )
+LONG WINAPI GetClassLong32A( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr;
     
@@ -663,7 +663,7 @@
 /***********************************************************************
  *           GetClassLong32W    (USER32.215)
  */
-LONG GetClassLong32W( HWND32 hwnd, INT32 offset )
+LONG WINAPI GetClassLong32W( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr;
 
@@ -684,7 +684,7 @@
 /***********************************************************************
  *           SetClassWord16    (USER.130)
  */
-WORD SetClassWord16( HWND16 hwnd, INT16 offset, WORD newval )
+WORD WINAPI SetClassWord16( HWND16 hwnd, INT16 offset, WORD newval )
 {
     return SetClassWord32( hwnd, offset, newval );
 }
@@ -693,7 +693,7 @@
 /***********************************************************************
  *           SetClassWord32    (USER32.468)
  */
-WORD SetClassWord32( HWND32 hwnd, INT32 offset, WORD newval )
+WORD WINAPI SetClassWord32( HWND32 hwnd, INT32 offset, WORD newval )
 {
     WND * wndPtr;
     WORD retval = 0;
@@ -737,7 +737,7 @@
 /***********************************************************************
  *           SetClassLong16    (USER.132)
  */
-LONG SetClassLong16( HWND16 hwnd, INT16 offset, LONG newval )
+LONG WINAPI SetClassLong16( HWND16 hwnd, INT16 offset, LONG newval )
 {
     WND *wndPtr;
     LONG retval;
@@ -761,7 +761,7 @@
 /***********************************************************************
  *           SetClassLong32A    (USER32.466)
  */
-LONG SetClassLong32A( HWND32 hwnd, INT32 offset, LONG newval )
+LONG WINAPI SetClassLong32A( HWND32 hwnd, INT32 offset, LONG newval )
 {
     WND * wndPtr;
     LONG retval = 0;
@@ -813,7 +813,7 @@
 /***********************************************************************
  *           SetClassLong32W    (USER32.467)
  */
-LONG SetClassLong32W( HWND32 hwnd, INT32 offset, LONG newval )
+LONG WINAPI SetClassLong32W( HWND32 hwnd, INT32 offset, LONG newval )
 {
     WND *wndPtr;
     LONG retval;
@@ -839,7 +839,7 @@
 /***********************************************************************
  *           GetClassName16      (USER.58)
  */
-INT16 GetClassName16( HWND16 hwnd, LPSTR buffer, INT16 count )
+INT16 WINAPI GetClassName16( HWND16 hwnd, LPSTR buffer, INT16 count )
 {
     WND *wndPtr;
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
@@ -850,7 +850,7 @@
 /***********************************************************************
  *           GetClassName32A      (USER32.216)
  */
-INT32 GetClassName32A( HWND32 hwnd, LPSTR buffer, INT32 count )
+INT32 WINAPI GetClassName32A( HWND32 hwnd, LPSTR buffer, INT32 count )
 {
     WND *wndPtr;
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
@@ -861,7 +861,7 @@
 /***********************************************************************
  *           GetClassName32W      (USER32.217)
  */
-INT32 GetClassName32W( HWND32 hwnd, LPWSTR buffer, INT32 count )
+INT32 WINAPI GetClassName32W( HWND32 hwnd, LPWSTR buffer, INT32 count )
 {
     WND *wndPtr;
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
@@ -872,15 +872,19 @@
 /***********************************************************************
  *           GetClassInfo16      (USER.404)
  */
-BOOL16 GetClassInfo16( HINSTANCE16 hInstance, SEGPTR name, WNDCLASS16 *wc )
+BOOL16 WINAPI GetClassInfo16( HINSTANCE16 hInstance, SEGPTR name,
+                              WNDCLASS16 *wc )
 {
     ATOM atom;
     CLASS *classPtr;
 
     hInstance = GetExePtr( hInstance );
     if (!(atom = GlobalFindAtom16( name )) ||
-        !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
-        (hInstance != classPtr->hInstance)) return FALSE;
+        !(classPtr = CLASS_FindClassByAtom( atom, hInstance )))
+        return FALSE;
+    if ((hInstance != classPtr->hInstance) &&
+        !(classPtr->style & CS_GLOBALCLASS)) /*BWCC likes to pass hInstance=0*/
+        return FALSE;
     wc->style         = (UINT16)classPtr->style;
     wc->lpfnWndProc   = WINPROC_GetProc( classPtr->winproc, WIN_PROC_16 );
     wc->cbClsExtra    = (INT16)classPtr->cbClsExtra;
@@ -900,7 +904,8 @@
 /***********************************************************************
  *           GetClassInfo32A      (USER32.210)
  */
-BOOL32 GetClassInfo32A( HINSTANCE32 hInstance, LPCSTR name, WNDCLASS32A *wc )
+BOOL32 WINAPI GetClassInfo32A( HINSTANCE32 hInstance, LPCSTR name,
+                               WNDCLASS32A *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -929,7 +934,8 @@
 /***********************************************************************
  *           GetClassInfo32W      (USER32.213)
  */
-BOOL32 GetClassInfo32W( HINSTANCE32 hInstance, LPCWSTR name, WNDCLASS32W *wc )
+BOOL32 WINAPI GetClassInfo32W( HINSTANCE32 hInstance, LPCWSTR name,
+                               WNDCLASS32W *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -961,7 +967,8 @@
  * FIXME: this is just a guess, I have no idea if GetClassInfoEx() is the
  * same in Win16 as in Win32. --AJ
  */
-BOOL16 GetClassInfoEx16( HINSTANCE16 hInstance, SEGPTR name, WNDCLASSEX16 *wc )
+BOOL16 WINAPI GetClassInfoEx16( HINSTANCE16 hInstance, SEGPTR name,
+                                WNDCLASSEX16 *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -990,8 +997,8 @@
 /***********************************************************************
  *           GetClassInfoEx32A      (USER32.211)
  */
-BOOL32 GetClassInfoEx32A( HINSTANCE32 hInstance, LPCSTR name,
-                          WNDCLASSEX32A *wc )
+BOOL32 WINAPI GetClassInfoEx32A( HINSTANCE32 hInstance, LPCSTR name,
+                                 WNDCLASSEX32A *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -1019,8 +1026,8 @@
 /***********************************************************************
  *           GetClassInfoEx32W      (USER32.212)
  */
-BOOL32 GetClassInfoEx32W( HINSTANCE32 hInstance, LPCWSTR name,
-                          WNDCLASSEX32W *wc )
+BOOL32 WINAPI GetClassInfoEx32W( HINSTANCE32 hInstance, LPCWSTR name,
+                                 WNDCLASSEX32W *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -1048,7 +1055,7 @@
 /***********************************************************************
  *           ClassFirst      (TOOLHELP.69)
  */
-BOOL16 ClassFirst( CLASSENTRY *pClassEntry )
+BOOL16 WINAPI ClassFirst( CLASSENTRY *pClassEntry )
 {
     pClassEntry->wNext = 1;
     return ClassNext( pClassEntry );
@@ -1058,7 +1065,7 @@
 /***********************************************************************
  *           ClassNext      (TOOLHELP.70)
  */
-BOOL16 ClassNext( CLASSENTRY *pClassEntry )
+BOOL16 WINAPI ClassNext( CLASSENTRY *pClassEntry )
 {
     int i;
     CLASS *class = firstClass;
diff --git a/windows/clipboard.c b/windows/clipboard.c
index ce261c0..d51dbd4 100644
--- a/windows/clipboard.c
+++ b/windows/clipboard.c
@@ -178,7 +178,7 @@
 
   selectionWait=True;
   while(selectionWait) 
-        EVENT_WaitXEvent( TRUE, FALSE );
+        EVENT_WaitNetEvent( TRUE, FALSE );
 
   /* we treat Unix text as CF_OEMTEXT */
   dprintf_clipboard(stddeb,"\tgot CF_OEMTEXT = %i\n", 
@@ -212,7 +212,7 @@
 /**************************************************************************
  *            OpenClipboard16   (USER.137)
  */
-BOOL16 OpenClipboard16( HWND16 hWnd )
+BOOL16 WINAPI OpenClipboard16( HWND16 hWnd )
 {
     return OpenClipboard32( hWnd );
 }
@@ -221,7 +221,7 @@
 /**************************************************************************
  *            OpenClipboard32   (USER32.406)
  */
-BOOL32 OpenClipboard32( HWND32 hWnd )
+BOOL32 WINAPI OpenClipboard32( HWND32 hWnd )
 {
     BOOL32 bRet = FALSE;
     dprintf_clipboard(stddeb,"OpenClipboard(%04x) = ", hWnd);
@@ -241,7 +241,7 @@
 /**************************************************************************
  *            CloseClipboard16   (USER.138)
  */
-BOOL16 CloseClipboard16(void)
+BOOL16 WINAPI CloseClipboard16(void)
 {
     return CloseClipboard32();
 }
@@ -250,7 +250,7 @@
 /**************************************************************************
  *            CloseClipboard32   (USER32.53)
  */
-BOOL32 CloseClipboard32(void)
+BOOL32 WINAPI CloseClipboard32(void)
 {
     dprintf_clipboard(stddeb,"CloseClipboard(); !\n");
 
@@ -266,7 +266,7 @@
 /**************************************************************************
  *            EmptyClipboard16   (USER.139)
  */
-BOOL16 EmptyClipboard16(void)
+BOOL16 WINAPI EmptyClipboard16(void)
 {
     return EmptyClipboard32();
 }
@@ -275,7 +275,7 @@
 /**************************************************************************
  *            EmptyClipboard32   (USER32.168)
  */
-BOOL32 EmptyClipboard32(void)
+BOOL32 WINAPI EmptyClipboard32(void)
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
 
@@ -316,7 +316,7 @@
 /**************************************************************************
  *            GetClipboardOwner16   (USER.140)
  */
-HWND16 GetClipboardOwner16(void)
+HWND16 WINAPI GetClipboardOwner16(void)
 {
     return hWndClipOwner;
 }
@@ -325,7 +325,7 @@
 /**************************************************************************
  *            GetClipboardOwner32   (USER32.224)
  */
-HWND32 GetClipboardOwner32(void)
+HWND32 WINAPI GetClipboardOwner32(void)
 {
     return hWndClipOwner;
 }
@@ -334,7 +334,7 @@
 /**************************************************************************
  *            SetClipboardData16   (USER.141)
  */
-HANDLE16 SetClipboardData16( UINT16 wFormat, HANDLE16 hData )
+HANDLE16 WINAPI SetClipboardData16( UINT16 wFormat, HANDLE16 hData )
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
     Window       owner;
@@ -391,7 +391,7 @@
 /**************************************************************************
  *            SetClipboardData32   (USER32.469)
  */
-HANDLE32 SetClipboardData32( UINT32 wFormat, HANDLE32 hData )
+HANDLE32 WINAPI SetClipboardData32( UINT32 wFormat, HANDLE32 hData )
 {
     fprintf( stderr, "SetClipboardData: empty stub\n" );
     return 0;
@@ -450,7 +450,7 @@
 /**************************************************************************
  *             GetClipboardData16   (USER.142)
  */
-HANDLE16 GetClipboardData16( UINT16 wFormat )
+HANDLE16 WINAPI GetClipboardData16( UINT16 wFormat )
 {
     LPCLIPFORMAT lpRender = ClipFormats; 
     LPCLIPFORMAT lpUpdate = NULL;
@@ -499,7 +499,7 @@
 /**************************************************************************
  *             GetClipboardData32   (USER32.221)
  */
-HANDLE32 GetClipboardData32( UINT32 wFormat )
+HANDLE32 WINAPI GetClipboardData32( UINT32 wFormat )
 {
     fprintf( stderr, "GetClipboardData32: empty stub\n" );
     return 0;
@@ -508,7 +508,7 @@
 /**************************************************************************
  *           CountClipboardFormats16   (USER.143)
  */
-INT16 CountClipboardFormats16(void)
+INT16 WINAPI CountClipboardFormats16(void)
 {
     return CountClipboardFormats32();
 }
@@ -517,7 +517,7 @@
 /**************************************************************************
  *           CountClipboardFormats32   (USER32.62)
  */
-INT32 CountClipboardFormats32(void)
+INT32 WINAPI CountClipboardFormats32(void)
 {
     INT32 FormatCount = 0;
     LPCLIPFORMAT lpFormat = ClipFormats; 
@@ -548,7 +548,7 @@
 /**************************************************************************
  *            EnumClipboardFormats16   (USER.144)
  */
-UINT16 EnumClipboardFormats16( UINT16 wFormat )
+UINT16 WINAPI EnumClipboardFormats16( UINT16 wFormat )
 {
     return EnumClipboardFormats32( wFormat );
 }
@@ -557,7 +557,7 @@
 /**************************************************************************
  *            EnumClipboardFormats32   (USER32.178)
  */
-UINT32 EnumClipboardFormats32( UINT32 wFormat )
+UINT32 WINAPI EnumClipboardFormats32( UINT32 wFormat )
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
 
@@ -600,7 +600,7 @@
 /**************************************************************************
  *            RegisterClipboardFormat16  (USER.145)
  */
-UINT16 RegisterClipboardFormat16( LPCSTR FormatName )
+UINT16 WINAPI RegisterClipboardFormat16( LPCSTR FormatName )
 {
     LPCLIPFORMAT lpNewFormat; 
     LPCLIPFORMAT lpFormat = ClipFormats; 
@@ -646,7 +646,7 @@
 /**************************************************************************
  *            RegisterClipboardFormat32A   (USER32.430)
  */
-UINT32 RegisterClipboardFormat32A( LPCSTR formatName )
+UINT32 WINAPI RegisterClipboardFormat32A( LPCSTR formatName )
 {
     return RegisterClipboardFormat16( formatName );
 }
@@ -655,7 +655,7 @@
 /**************************************************************************
  *            RegisterClipboardFormat32W   (USER32.431)
  */
-UINT32 RegisterClipboardFormat32W( LPCWSTR formatName )
+UINT32 WINAPI RegisterClipboardFormat32W( LPCWSTR formatName )
 {
     LPSTR aFormat = HEAP_strdupWtoA( GetProcessHeap(), 0, formatName );
     UINT32 ret = RegisterClipboardFormat32A( aFormat );
@@ -666,7 +666,7 @@
 /**************************************************************************
  *            GetClipboardFormatName16   (USER.146)
  */
-INT16 GetClipboardFormatName16( UINT16 wFormat, LPSTR retStr, INT16 maxlen )
+INT16 WINAPI GetClipboardFormatName16( UINT16 wFormat, LPSTR retStr, INT16 maxlen )
 {
     return GetClipboardFormatName32A( wFormat, retStr, maxlen );
 }
@@ -675,7 +675,7 @@
 /**************************************************************************
  *            GetClipboardFormatName32A   (USER32.222)
  */
-INT32 GetClipboardFormatName32A( UINT32 wFormat, LPSTR retStr, INT32 maxlen )
+INT32 WINAPI GetClipboardFormatName32A( UINT32 wFormat, LPSTR retStr, INT32 maxlen )
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
 
@@ -702,7 +702,7 @@
 /**************************************************************************
  *            GetClipboardFormatName32W   (USER32.223)
  */
-INT32 GetClipboardFormatName32W( UINT32 wFormat, LPWSTR retStr, INT32 maxlen )
+INT32 WINAPI GetClipboardFormatName32W( UINT32 wFormat, LPWSTR retStr, INT32 maxlen )
 {
     LPSTR p = HEAP_xalloc( GetProcessHeap(), 0, maxlen );
     INT32 ret = GetClipboardFormatName32A( wFormat, p, maxlen );
@@ -715,7 +715,7 @@
 /**************************************************************************
  *            SetClipboardViewer16   (USER.147)
  */
-HWND16 SetClipboardViewer16( HWND16 hWnd )
+HWND16 WINAPI SetClipboardViewer16( HWND16 hWnd )
 {
     return SetClipboardViewer32( hWnd );
 }
@@ -724,11 +724,11 @@
 /**************************************************************************
  *            SetClipboardViewer32   (USER32.470)
  */
-HWND32 SetClipboardViewer32( HWND32 hWnd )
+HWND32 WINAPI SetClipboardViewer32( HWND32 hWnd )
 {
     HWND32 hwndPrev = hWndViewer;
 
-    dprintf_clipboard(stddeb,"SetClipboardViewer(%04x)\n", hWnd);
+    dprintf_clipboard(stddeb,"SetClipboardViewer(%04x): returning %04x\n", hWnd, hwndPrev);
 
     hWndViewer = hWnd;
     return hwndPrev;
@@ -738,7 +738,7 @@
 /**************************************************************************
  *           GetClipboardViewer16   (USER.148)
  */
-HWND16 GetClipboardViewer16(void)
+HWND16 WINAPI GetClipboardViewer16(void)
 {
     return hWndViewer;
 }
@@ -747,7 +747,7 @@
 /**************************************************************************
  *           GetClipboardViewer32   (USER32.225)
  */
-HWND32 GetClipboardViewer32(void)
+HWND32 WINAPI GetClipboardViewer32(void)
 {
     return hWndViewer;
 }
@@ -756,7 +756,7 @@
 /**************************************************************************
  *           ChangeClipboardChain16   (USER.149)
  */
-BOOL16 ChangeClipboardChain16(HWND16 hWnd, HWND16 hWndNext)
+BOOL16 WINAPI ChangeClipboardChain16(HWND16 hWnd, HWND16 hWndNext)
 {
     return ChangeClipboardChain32(hWnd,hWndNext);
 }
@@ -764,7 +764,7 @@
 /**************************************************************************
  *           ChangeClipboardChain32   (USER32.21)
  */
-BOOL32 ChangeClipboardChain32(HWND32 hWnd, HWND32 hWndNext)
+BOOL32 WINAPI ChangeClipboardChain32(HWND32 hWnd, HWND32 hWndNext)
 {
     BOOL32 bRet = 0;
 
@@ -786,7 +786,7 @@
 /**************************************************************************
  *           IsClipboardFormatAvailable16   (USER.193)
  */
-BOOL16 IsClipboardFormatAvailable16( UINT16 wFormat )
+BOOL16 WINAPI IsClipboardFormatAvailable16( UINT16 wFormat )
 {
     return IsClipboardFormatAvailable32( wFormat );
 }
@@ -795,7 +795,7 @@
 /**************************************************************************
  *           IsClipboardFormatAvailable32   (USER32.339)
  */
-BOOL32 IsClipboardFormatAvailable32( UINT32 wFormat )
+BOOL32 WINAPI IsClipboardFormatAvailable32( UINT32 wFormat )
 {
     dprintf_clipboard(stddeb,"IsClipboardFormatAvailable(%04X) !\n", wFormat);
 
@@ -809,7 +809,7 @@
 /**************************************************************************
  *             GetOpenClipboardWindow16   (USER.248)
  */
-HWND16 GetOpenClipboardWindow16(void)
+HWND16 WINAPI GetOpenClipboardWindow16(void)
 {
     return hWndClipWindow;
 }
@@ -818,7 +818,7 @@
 /**************************************************************************
  *             GetOpenClipboardWindow32   (USER32.276)
  */
-HWND32 GetOpenClipboardWindow32(void)
+HWND32 WINAPI GetOpenClipboardWindow32(void)
 {
     return hWndClipWindow;
 }
@@ -827,7 +827,7 @@
 /**************************************************************************
  *             GetPriorityClipboardFormat16   (USER.402)
  */
-INT16 GetPriorityClipboardFormat16( UINT16 *lpPriorityList, INT16 nCount)
+INT16 WINAPI GetPriorityClipboardFormat16( UINT16 *lpPriorityList, INT16 nCount)
 {
     fprintf( stderr, "GetPriorityClipboardFormat16(%p, %d): stub\n",
              lpPriorityList, nCount );
@@ -838,7 +838,7 @@
 /**************************************************************************
  *             GetPriorityClipboardFormat32   (USER32
  */
-INT32 GetPriorityClipboardFormat32( UINT32 *lpPriorityList, INT32 nCount )
+INT32 WINAPI GetPriorityClipboardFormat32( UINT32 *lpPriorityList, INT32 nCount )
 {
     fprintf( stderr, "GetPriorityClipboardFormat32(%p, %d): stub\n",
              lpPriorityList, nCount );
diff --git a/windows/dce.c b/windows/dce.c
index 5e925f6..d54654c 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -95,7 +95,7 @@
 /**********************************************************************
  *          WindowFromDC16   (USER32.580)
  */
-HWND16 WindowFromDC16( HDC16 hDC )
+HWND16 WINAPI WindowFromDC16( HDC16 hDC )
 {
     return (HWND16)WindowFromDC32( hDC );
 }
@@ -104,7 +104,7 @@
 /**********************************************************************
  *          WindowFromDC32   (USER32.580)
  */
-HWND32 WindowFromDC32( HDC32 hDC )
+HWND32 WINAPI WindowFromDC32( HDC32 hDC )
 {
     DCE *dce = firstDCE;
     while (dce && (dce->hDC != hDC)) dce = dce->next;
@@ -417,7 +417,7 @@
 /***********************************************************************
  *           GetDCEx16    (USER.359)
  */
-HDC16 GetDCEx16( HWND16 hwnd, HRGN16 hrgnClip, DWORD flags )
+HDC16 WINAPI GetDCEx16( HWND16 hwnd, HRGN16 hrgnClip, DWORD flags )
 {
     return (HDC16)GetDCEx32( hwnd, hrgnClip, flags );
 }
@@ -428,7 +428,7 @@
  *
  * Unimplemented flags: DCX_LOCKWINDOWUPDATE
  */
-HDC32 GetDCEx32( HWND32 hwnd, HRGN32 hrgnClip, DWORD flags )
+HDC32 WINAPI GetDCEx32( HWND32 hwnd, HRGN32 hrgnClip, DWORD flags )
 {
     HRGN32 	hrgnVisible;
     HDC32 	hdc = 0;
@@ -583,7 +583,7 @@
 /***********************************************************************
  *           GetDC16    (USER.66)
  */
-HDC16 GetDC16( HWND16 hwnd )
+HDC16 WINAPI GetDC16( HWND16 hwnd )
 {
     return (HDC16)GetDC32( hwnd );
 }
@@ -592,7 +592,7 @@
 /***********************************************************************
  *           GetDC32    (USER32.229)
  */
-HDC32 GetDC32( HWND32 hwnd )
+HDC32 WINAPI GetDC32( HWND32 hwnd )
 {
     if (!hwnd)
         return GetDCEx32( GetDesktopWindow32(), 0, DCX_CACHE | DCX_WINDOW );
@@ -603,7 +603,7 @@
 /***********************************************************************
  *           GetWindowDC16    (USER.67)
  */
-HDC16 GetWindowDC16( HWND16 hwnd )
+HDC16 WINAPI GetWindowDC16( HWND16 hwnd )
 {
     if (!hwnd) hwnd = GetDesktopWindow16();
     return GetDCEx16( hwnd, 0, DCX_USESTYLE | DCX_WINDOW );
@@ -613,7 +613,7 @@
 /***********************************************************************
  *           GetWindowDC32    (USER32.)
  */
-HDC32 GetWindowDC32( HWND32 hwnd )
+HDC32 WINAPI GetWindowDC32( HWND32 hwnd )
 {
     if (!hwnd) hwnd = GetDesktopWindow32();
     return GetDCEx32( hwnd, 0, DCX_USESTYLE | DCX_WINDOW );
@@ -623,7 +623,7 @@
 /***********************************************************************
  *           ReleaseDC16    (USER.68)
  */
-INT16 ReleaseDC16( HWND16 hwnd, HDC16 hdc )
+INT16 WINAPI ReleaseDC16( HWND16 hwnd, HDC16 hdc )
 {
     return (INT32)ReleaseDC32( hwnd, hdc );
 }
@@ -632,7 +632,7 @@
 /***********************************************************************
  *           ReleaseDC32    (USER32.439)
  */
-INT32 ReleaseDC32( HWND32 hwnd, HDC32 hdc )
+INT32 WINAPI ReleaseDC32( HWND32 hwnd, HDC32 hdc )
 {
     DCE * dce = firstDCE;
     
@@ -674,7 +674,7 @@
  *
  * See "Undoc. Windows" for hints (DC, SetDCHook, SetHookFlags)..  
  */
-BOOL16 DCHook( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
+BOOL16 WINAPI DCHook( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
 {
     HRGN32 hVisRgn;
     DCE *dce = firstDCE;;
@@ -729,7 +729,7 @@
 /***********************************************************************
  *           LockWindowUpdate16   (USER.294)
  */
-BOOL16 LockWindowUpdate16( HWND16 hwnd )
+BOOL16 WINAPI LockWindowUpdate16( HWND16 hwnd )
 {
     return LockWindowUpdate32( hwnd );
 }
@@ -738,7 +738,7 @@
 /***********************************************************************
  *           LockWindowUpdate32   (USER32.377)
  */
-BOOL32 LockWindowUpdate32( HWND32 hwnd )
+BOOL32 WINAPI LockWindowUpdate32( HWND32 hwnd )
 {
     /* FIXME? DCX_LOCKWINDOWUPDATE is unimplemented */
     return TRUE;
diff --git a/windows/defdlg.c b/windows/defdlg.c
index 3c5c082..1285d73 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -248,7 +248,8 @@
 /***********************************************************************
  *           DefDlgProc16   (USER.308)
  */
-LRESULT DefDlgProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam )
+LRESULT WINAPI DefDlgProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam,
+                             LPARAM lParam )
 {
     DIALOGINFO * dlgInfo;
     BOOL16 result = FALSE;
@@ -302,7 +303,8 @@
 /***********************************************************************
  *           DefDlgProc32A   (USER32.119)
  */
-LRESULT DefDlgProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+LRESULT WINAPI DefDlgProc32A( HWND32 hwnd, UINT32 msg,
+                              WPARAM32 wParam, LPARAM lParam )
 {
     DIALOGINFO * dlgInfo;
     BOOL16 result = FALSE;
@@ -356,7 +358,8 @@
 /***********************************************************************
  *           DefDlgProc32W   (USER32.120)
  */
-LRESULT DefDlgProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+LRESULT WINAPI DefDlgProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
+                              LPARAM lParam )
 {
     DIALOGINFO * dlgInfo;
     BOOL16 result = FALSE;
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 7b59447..a5b5af4 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -359,8 +359,8 @@
 /***********************************************************************
  *           DefWindowProc16   (USER.107)
  */
-LRESULT DefWindowProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam,
-                         LPARAM lParam )
+LRESULT WINAPI DefWindowProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam,
+                                LPARAM lParam )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     LRESULT result = 0;
@@ -426,8 +426,8 @@
 /***********************************************************************
  *           DefWindowProc32A   (USER32.125)
  */
-LRESULT DefWindowProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
-                          LPARAM lParam )
+LRESULT WINAPI DefWindowProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
+                                 LPARAM lParam )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     LRESULT result = 0;
@@ -487,8 +487,8 @@
 /***********************************************************************
  *           DefWindowProc32W   (USER32.126)
  */
-LRESULT DefWindowProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
-                          LPARAM lParam )
+LRESULT WINAPI DefWindowProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
+                                 LPARAM lParam )
 {
     LRESULT result;
 
diff --git a/windows/dialog.c b/windows/dialog.c
index 8b2f580..21ef5b0 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -618,8 +618,8 @@
 /***********************************************************************
  *           CreateDialog16   (USER.89)
  */
-HWND16 CreateDialog16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
-                       HWND16 owner, DLGPROC16 dlgProc )
+HWND16 WINAPI CreateDialog16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
+                              HWND16 owner, DLGPROC16 dlgProc )
 {
     return CreateDialogParam16( hInst, dlgTemplate, owner, dlgProc, 0 );
 }
@@ -628,8 +628,9 @@
 /***********************************************************************
  *           CreateDialogParam16   (USER.241)
  */
-HWND16 CreateDialogParam16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
-                            HWND16 owner, DLGPROC16 dlgProc, LPARAM param )
+HWND16 WINAPI CreateDialogParam16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
+                                   HWND16 owner, DLGPROC16 dlgProc,
+                                   LPARAM param )
 {
     HWND16 hwnd = 0;
     HRSRC16 hRsrc;
@@ -652,8 +653,9 @@
 /***********************************************************************
  *           CreateDialogParam32A   (USER32.72)
  */
-HWND32 CreateDialogParam32A( HINSTANCE32 hInst, LPCSTR name,
-                             HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
+HWND32 WINAPI CreateDialogParam32A( HINSTANCE32 hInst, LPCSTR name,
+                                    HWND32 owner, DLGPROC32 dlgProc,
+                                    LPARAM param )
 {
     if (HIWORD(name))
     {
@@ -669,8 +671,9 @@
 /***********************************************************************
  *           CreateDialogParam32W   (USER32.73)
  */
-HWND32 CreateDialogParam32W( HINSTANCE32 hInst, LPCWSTR name,
-                             HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
+HWND32 WINAPI CreateDialogParam32W( HINSTANCE32 hInst, LPCWSTR name,
+                                    HWND32 owner, DLGPROC32 dlgProc,
+                                    LPARAM param )
 {
     HANDLE32 hrsrc = FindResource32W( hInst, name, (LPWSTR)RT_DIALOG );
     if (!hrsrc) return 0;
@@ -683,8 +686,8 @@
 /***********************************************************************
  *           CreateDialogIndirect16   (USER.219)
  */
-HWND16 CreateDialogIndirect16( HINSTANCE16 hInst, LPCVOID dlgTemplate,
-                               HWND16 owner, DLGPROC16 dlgProc )
+HWND16 WINAPI CreateDialogIndirect16( HINSTANCE16 hInst, LPCVOID dlgTemplate,
+                                      HWND16 owner, DLGPROC16 dlgProc )
 {
     return CreateDialogIndirectParam16( hInst, dlgTemplate, owner, dlgProc, 0);
 }
@@ -693,9 +696,10 @@
 /***********************************************************************
  *           CreateDialogIndirectParam16   (USER.242)
  */
-HWND16 CreateDialogIndirectParam16( HINSTANCE16 hInst, LPCVOID dlgTemplate,
-                                    HWND16 owner, DLGPROC16 dlgProc,
-                                    LPARAM param )
+HWND16 WINAPI CreateDialogIndirectParam16( HINSTANCE16 hInst,
+                                           LPCVOID dlgTemplate,
+                                           HWND16 owner, DLGPROC16 dlgProc,
+                                           LPARAM param )
 {
     return DIALOG_CreateIndirect( hInst, dlgTemplate, FALSE, owner,
                                   dlgProc, param, WIN_PROC_16 );
@@ -705,9 +709,10 @@
 /***********************************************************************
  *           CreateDialogIndirectParam32A   (USER32.69)
  */
-HWND32 CreateDialogIndirectParam32A( HINSTANCE32 hInst, LPCVOID dlgTemplate,
-                                     HWND32 owner, DLGPROC32 dlgProc,
-                                     LPARAM param )
+HWND32 WINAPI CreateDialogIndirectParam32A( HINSTANCE32 hInst,
+                                            LPCVOID dlgTemplate,
+                                            HWND32 owner, DLGPROC32 dlgProc,
+                                            LPARAM param )
 {
     return DIALOG_CreateIndirect( hInst, dlgTemplate, TRUE, owner,
                                   (DLGPROC16)dlgProc, param, WIN_PROC_32A );
@@ -717,9 +722,10 @@
 /***********************************************************************
  *           CreateDialogIndirectParam32W   (USER32.71)
  */
-HWND32 CreateDialogIndirectParam32W( HINSTANCE32 hInst, LPCVOID dlgTemplate,
-                                     HWND32 owner, DLGPROC32 dlgProc,
-                                     LPARAM param )
+HWND32 WINAPI CreateDialogIndirectParam32W( HINSTANCE32 hInst,
+                                            LPCVOID dlgTemplate,
+                                            HWND32 owner, DLGPROC32 dlgProc,
+                                            LPARAM param )
 {
     return DIALOG_CreateIndirect( hInst, dlgTemplate, TRUE, owner,
                                   (DLGPROC16)dlgProc, param, WIN_PROC_32W );
@@ -763,8 +769,8 @@
 /***********************************************************************
  *           DialogBox16   (USER.87)
  */
-INT16 DialogBox16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
-                   HWND16 owner, DLGPROC16 dlgProc )
+INT16 WINAPI DialogBox16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
+                          HWND16 owner, DLGPROC16 dlgProc )
 {
     return DialogBoxParam16( hInst, dlgTemplate, owner, dlgProc, 0 );
 }
@@ -773,8 +779,8 @@
 /***********************************************************************
  *           DialogBoxParam16   (USER.239)
  */
-INT16 DialogBoxParam16( HINSTANCE16 hInst, SEGPTR template,
-                        HWND16 owner, DLGPROC16 dlgProc, LPARAM param )
+INT16 WINAPI DialogBoxParam16( HINSTANCE16 hInst, SEGPTR template,
+                               HWND16 owner, DLGPROC16 dlgProc, LPARAM param )
 {
     HWND16 hwnd = CreateDialogParam16( hInst, template, owner, dlgProc, param);
     if (hwnd) return (INT16)DIALOG_DoDialogBox( hwnd, owner );
@@ -785,8 +791,8 @@
 /***********************************************************************
  *           DialogBoxParam32A   (USER32.138)
  */
-INT32 DialogBoxParam32A( HINSTANCE32 hInst, LPCSTR name,
-                         HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
+INT32 WINAPI DialogBoxParam32A( HINSTANCE32 hInst, LPCSTR name,
+                                HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
 {
     HWND32 hwnd = CreateDialogParam32A( hInst, name, owner, dlgProc, param );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
@@ -797,8 +803,8 @@
 /***********************************************************************
  *           DialogBoxParam32W   (USER32.139)
  */
-INT32 DialogBoxParam32W( HINSTANCE32 hInst, LPCWSTR name,
-                         HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
+INT32 WINAPI DialogBoxParam32W( HINSTANCE32 hInst, LPCWSTR name,
+                                HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
 {
     HWND32 hwnd = CreateDialogParam32W( hInst, name, owner, dlgProc, param );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
@@ -809,8 +815,8 @@
 /***********************************************************************
  *           DialogBoxIndirect16   (USER.218)
  */
-INT16 DialogBoxIndirect16( HINSTANCE16 hInst, HANDLE16 dlgTemplate,
-                           HWND16 owner, DLGPROC16 dlgProc )
+INT16 WINAPI DialogBoxIndirect16( HINSTANCE16 hInst, HANDLE16 dlgTemplate,
+                                  HWND16 owner, DLGPROC16 dlgProc )
 {
     return DialogBoxIndirectParam16( hInst, dlgTemplate, owner, dlgProc, 0 );
 }
@@ -819,8 +825,9 @@
 /***********************************************************************
  *           DialogBoxIndirectParam16   (USER.240)
  */
-INT16 DialogBoxIndirectParam16( HINSTANCE16 hInst, HANDLE16 dlgTemplate,
-                                HWND16 owner, DLGPROC16 dlgProc, LPARAM param )
+INT16 WINAPI DialogBoxIndirectParam16( HINSTANCE16 hInst, HANDLE16 dlgTemplate,
+                                       HWND16 owner, DLGPROC16 dlgProc,
+                                       LPARAM param )
 {
     HWND16 hwnd;
     LPCVOID ptr;
@@ -836,8 +843,9 @@
 /***********************************************************************
  *           DialogBoxIndirectParam32A   (USER32.135)
  */
-INT32 DialogBoxIndirectParam32A( HINSTANCE32 hInstance, LPCVOID template,
-                                 HWND32 owner, DLGPROC32 dlgProc, LPARAM param)
+INT32 WINAPI DialogBoxIndirectParam32A(HINSTANCE32 hInstance, LPCVOID template,
+                                       HWND32 owner, DLGPROC32 dlgProc,
+                                       LPARAM param )
 {
     HWND32 hwnd = CreateDialogIndirectParam32A( hInstance, template,
                                                 owner, dlgProc, param );
@@ -849,8 +857,9 @@
 /***********************************************************************
  *           DialogBoxIndirectParam32W   (USER32.137)
  */
-INT32 DialogBoxIndirectParam32W( HINSTANCE32 hInstance, LPCVOID template,
-                                 HWND32 owner, DLGPROC32 dlgProc, LPARAM param)
+INT32 WINAPI DialogBoxIndirectParam32W(HINSTANCE32 hInstance, LPCVOID template,
+                                       HWND32 owner, DLGPROC32 dlgProc,
+                                       LPARAM param )
 {
     HWND32 hwnd = CreateDialogIndirectParam32W( hInstance, template,
                                                 owner, dlgProc, param );
@@ -862,7 +871,7 @@
 /***********************************************************************
  *           EndDialog16   (USER32.173)
  */
-BOOL16 EndDialog16( HWND16 hwnd, INT16 retval )
+BOOL16 WINAPI EndDialog16( HWND16 hwnd, INT16 retval )
 {
     return EndDialog32( hwnd, retval );
 }
@@ -871,7 +880,7 @@
 /***********************************************************************
  *           EndDialog32   (USER32.173)
  */
-BOOL32 EndDialog32( HWND32 hwnd, INT32 retval )
+BOOL32 WINAPI EndDialog32( HWND32 hwnd, INT32 retval )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     DIALOGINFO * dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
@@ -998,7 +1007,7 @@
 /***********************************************************************
  *           IsDialogMessage16   (USER.90)
  */
-BOOL16 IsDialogMessage16( HWND16 hwndDlg, LPMSG16 msg )
+BOOL16 WINAPI IsDialogMessage16( HWND16 hwndDlg, LPMSG16 msg )
 {
     BOOL32 ret, translate, dispatch;
 
@@ -1017,7 +1026,7 @@
 /***********************************************************************
  *           IsDialogMessage32A   (USER32.341)
  */
-BOOL32 IsDialogMessage32A( HWND32 hwndDlg, LPMSG32 msg )
+BOOL32 WINAPI IsDialogMessage32A( HWND32 hwndDlg, LPMSG32 msg )
 {
     BOOL32 ret, translate, dispatch;
 
@@ -1036,7 +1045,7 @@
 /***********************************************************************
  *           IsDialogMessage32W   (USER32.342)
  */
-BOOL32 IsDialogMessage32W( HWND32 hwndDlg, LPMSG32 msg )
+BOOL32 WINAPI IsDialogMessage32W( HWND32 hwndDlg, LPMSG32 msg )
 {
     BOOL32 ret, translate, dispatch;
 
@@ -1055,7 +1064,7 @@
 /****************************************************************
  *         GetDlgCtrlID16   (USER.277)
  */
-INT16 GetDlgCtrlID16( HWND16 hwnd )
+INT16 WINAPI GetDlgCtrlID16( HWND16 hwnd )
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
     if (wndPtr) return wndPtr->wIDmenu;
@@ -1066,7 +1075,7 @@
 /****************************************************************
  *         GetDlgCtrlID32   (USER32.233)
  */
-INT32 GetDlgCtrlID32( HWND32 hwnd )
+INT32 WINAPI GetDlgCtrlID32( HWND32 hwnd )
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
     if (wndPtr) return wndPtr->wIDmenu;
@@ -1077,7 +1086,7 @@
 /***********************************************************************
  *           GetDlgItem16   (USER.91)
  */
-HWND16 GetDlgItem16( HWND16 hwndDlg, INT16 id )
+HWND16 WINAPI GetDlgItem16( HWND16 hwndDlg, INT16 id )
 {
     WND *pWnd;
 
@@ -1091,7 +1100,7 @@
 /***********************************************************************
  *           GetDlgItem32   (USER32.234)
  */
-HWND32 GetDlgItem32( HWND32 hwndDlg, INT32 id )
+HWND32 WINAPI GetDlgItem32( HWND32 hwndDlg, INT32 id )
 {
     WND *pWnd;
 
@@ -1105,8 +1114,8 @@
 /*******************************************************************
  *           SendDlgItemMessage16   (USER.101)
  */
-LRESULT SendDlgItemMessage16( HWND16 hwnd, INT16 id, UINT16 msg,
-                              WPARAM16 wParam, LPARAM lParam )
+LRESULT WINAPI SendDlgItemMessage16( HWND16 hwnd, INT16 id, UINT16 msg,
+                                     WPARAM16 wParam, LPARAM lParam )
 {
     HWND16 hwndCtrl = GetDlgItem16( hwnd, id );
     if (hwndCtrl) return SendMessage16( hwndCtrl, msg, wParam, lParam );
@@ -1117,8 +1126,8 @@
 /*******************************************************************
  *           SendDlgItemMessage32A   (USER32.451)
  */
-LRESULT SendDlgItemMessage32A( HWND32 hwnd, INT32 id, UINT32 msg,
-                               WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI SendDlgItemMessage32A( HWND32 hwnd, INT32 id, UINT32 msg,
+                                      WPARAM32 wParam, LPARAM lParam )
 {
     HWND32 hwndCtrl = GetDlgItem32( hwnd, id );
     if (hwndCtrl) return SendMessage32A( hwndCtrl, msg, wParam, lParam );
@@ -1129,8 +1138,8 @@
 /*******************************************************************
  *           SendDlgItemMessage32W   (USER32.452)
  */
-LRESULT SendDlgItemMessage32W( HWND32 hwnd, INT32 id, UINT32 msg,
-                               WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI SendDlgItemMessage32W( HWND32 hwnd, INT32 id, UINT32 msg,
+                                      WPARAM32 wParam, LPARAM lParam )
 {
     HWND32 hwndCtrl = GetDlgItem32( hwnd, id );
     if (hwndCtrl) return SendMessage32W( hwndCtrl, msg, wParam, lParam );
@@ -1141,7 +1150,7 @@
 /*******************************************************************
  *           SetDlgItemText16   (USER.92)
  */
-void SetDlgItemText16( HWND16 hwnd, INT16 id, SEGPTR lpString )
+void WINAPI SetDlgItemText16( HWND16 hwnd, INT16 id, SEGPTR lpString )
 {
     SendDlgItemMessage16( hwnd, id, WM_SETTEXT, 0, (LPARAM)lpString );
 }
@@ -1150,7 +1159,7 @@
 /*******************************************************************
  *           SetDlgItemText32A   (USER32.477)
  */
-void SetDlgItemText32A( HWND32 hwnd, INT32 id, LPCSTR lpString )
+void WINAPI SetDlgItemText32A( HWND32 hwnd, INT32 id, LPCSTR lpString )
 {
     SendDlgItemMessage32A( hwnd, id, WM_SETTEXT, 0, (LPARAM)lpString );
 }
@@ -1159,7 +1168,7 @@
 /*******************************************************************
  *           SetDlgItemText32W   (USER32.478)
  */
-void SetDlgItemText32W( HWND32 hwnd, INT32 id, LPCWSTR lpString )
+void WINAPI SetDlgItemText32W( HWND32 hwnd, INT32 id, LPCWSTR lpString )
 {
     SendDlgItemMessage32W( hwnd, id, WM_SETTEXT, 0, (LPARAM)lpString );
 }
@@ -1168,7 +1177,7 @@
 /***********************************************************************
  *           GetDlgItemText16   (USER.93)
  */
-INT16 GetDlgItemText16( HWND16 hwnd, INT16 id, SEGPTR str, UINT16 len )
+INT16 WINAPI GetDlgItemText16( HWND16 hwnd, INT16 id, SEGPTR str, UINT16 len )
 {
     return (INT16)SendDlgItemMessage16( hwnd, id, WM_GETTEXT,
                                         len, (LPARAM)str );
@@ -1178,7 +1187,7 @@
 /***********************************************************************
  *           GetDlgItemText32A   (USER32.236)
  */
-INT32 GetDlgItemText32A( HWND32 hwnd, INT32 id, LPSTR str, UINT32 len )
+INT32 WINAPI GetDlgItemText32A( HWND32 hwnd, INT32 id, LPSTR str, UINT32 len )
 {
     return (INT32)SendDlgItemMessage32A( hwnd, id, WM_GETTEXT,
                                          len, (LPARAM)str );
@@ -1188,7 +1197,7 @@
 /***********************************************************************
  *           GetDlgItemText32W   (USER32.237)
  */
-INT32 GetDlgItemText32W( HWND32 hwnd, INT32 id, LPWSTR str, UINT32 len )
+INT32 WINAPI GetDlgItemText32W( HWND32 hwnd, INT32 id, LPWSTR str, UINT32 len )
 {
     return (INT32)SendDlgItemMessage32W( hwnd, id, WM_GETTEXT,
                                          len, (LPARAM)str );
@@ -1198,7 +1207,7 @@
 /*******************************************************************
  *           SetDlgItemInt16   (USER.94)
  */
-void SetDlgItemInt16( HWND16 hwnd, INT16 id, UINT16 value, BOOL16 fSigned )
+void WINAPI SetDlgItemInt16( HWND16 hwnd, INT16 id, UINT16 value, BOOL16 fSigned )
 {
     return SetDlgItemInt32( hwnd, (UINT32)(UINT16)id, value, fSigned );
 }
@@ -1207,7 +1216,8 @@
 /*******************************************************************
  *           SetDlgItemInt32   (USER32.476)
  */
-void SetDlgItemInt32( HWND32 hwnd, INT32 id, UINT32 value, BOOL32 fSigned )
+void WINAPI SetDlgItemInt32( HWND32 hwnd, INT32 id, UINT32 value,
+                             BOOL32 fSigned )
 {
     char str[20];
 
@@ -1220,8 +1230,8 @@
 /***********************************************************************
  *           GetDlgItemInt16   (USER.95)
  */
-UINT16 GetDlgItemInt16( HWND16 hwnd, INT16 id, BOOL16 *translated,
-                        BOOL16 fSigned )
+UINT16 WINAPI GetDlgItemInt16( HWND16 hwnd, INT16 id, BOOL16 *translated,
+                               BOOL16 fSigned )
 {
     UINT32 result;
     BOOL32 ok;
@@ -1245,8 +1255,8 @@
 /***********************************************************************
  *           GetDlgItemInt32   (USER32.235)
  */
-UINT32 GetDlgItemInt32( HWND32 hwnd, INT32 id, BOOL32 *translated,
-                        BOOL32 fSigned )
+UINT32 WINAPI GetDlgItemInt32( HWND32 hwnd, INT32 id, BOOL32 *translated,
+                               BOOL32 fSigned )
 {
     char str[30];
     char * endptr;
@@ -1278,7 +1288,7 @@
 /***********************************************************************
  *           CheckDlgButton16   (USER.97)
  */
-BOOL16 CheckDlgButton16( HWND16 hwnd, INT16 id, UINT16 check )
+BOOL16 WINAPI CheckDlgButton16( HWND16 hwnd, INT16 id, UINT16 check )
 {
     SendDlgItemMessage32A( hwnd, id, BM_SETCHECK32, check, 0 );
     return TRUE;
@@ -1288,7 +1298,7 @@
 /***********************************************************************
  *           CheckDlgButton32   (USER32.44)
  */
-BOOL32 CheckDlgButton32( HWND32 hwnd, INT32 id, UINT32 check )
+BOOL32 WINAPI CheckDlgButton32( HWND32 hwnd, INT32 id, UINT32 check )
 {
     SendDlgItemMessage32A( hwnd, id, BM_SETCHECK32, check, 0 );
     return TRUE;
@@ -1298,7 +1308,7 @@
 /***********************************************************************
  *           IsDlgButtonChecked16   (USER.98)
  */
-UINT16 IsDlgButtonChecked16( HWND16 hwnd, UINT16 id )
+UINT16 WINAPI IsDlgButtonChecked16( HWND16 hwnd, UINT16 id )
 {
     return (UINT16)SendDlgItemMessage32A( hwnd, id, BM_GETCHECK32, 0, 0 );
 }
@@ -1307,7 +1317,7 @@
 /***********************************************************************
  *           IsDlgButtonChecked32   (USER32.343)
  */
-UINT32 IsDlgButtonChecked32( HWND32 hwnd, UINT32 id )
+UINT32 WINAPI IsDlgButtonChecked32( HWND32 hwnd, UINT32 id )
 {
     return (UINT32)SendDlgItemMessage32A( hwnd, id, BM_GETCHECK32, 0, 0 );
 }
@@ -1316,8 +1326,8 @@
 /***********************************************************************
  *           CheckRadioButton16   (USER.96)
  */
-BOOL16 CheckRadioButton16( HWND16 hwndDlg, UINT16 firstID, UINT16 lastID,
-                           UINT16 checkID )
+BOOL16 WINAPI CheckRadioButton16( HWND16 hwndDlg, UINT16 firstID,
+                                  UINT16 lastID, UINT16 checkID )
 {
     return CheckRadioButton32( hwndDlg, firstID, lastID, checkID );
 }
@@ -1326,8 +1336,8 @@
 /***********************************************************************
  *           CheckRadioButton32   (USER32.47)
  */
-BOOL32 CheckRadioButton32( HWND32 hwndDlg, UINT32 firstID, UINT32 lastID,
-                           UINT32 checkID )
+BOOL32 WINAPI CheckRadioButton32( HWND32 hwndDlg, UINT32 firstID,
+                                  UINT32 lastID, UINT32 checkID )
 {
     WND *pWnd = WIN_FindWndPtr( hwndDlg );
     if (!pWnd) return FALSE;
@@ -1352,7 +1362,7 @@
 /***********************************************************************
  *           GetDialogBaseUnits   (USER.243) (USER32.232)
  */
-DWORD GetDialogBaseUnits(void)
+DWORD WINAPI GetDialogBaseUnits(void)
 {
     return MAKELONG( xBaseUnit, yBaseUnit );
 }
@@ -1361,7 +1371,7 @@
 /***********************************************************************
  *           MapDialogRect16   (USER.103)
  */
-void MapDialogRect16( HWND16 hwnd, LPRECT16 rect )
+void WINAPI MapDialogRect16( HWND16 hwnd, LPRECT16 rect )
 {
     DIALOGINFO * dlgInfo;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -1377,7 +1387,7 @@
 /***********************************************************************
  *           MapDialogRect32   (USER32.381)
  */
-void MapDialogRect32( HWND32 hwnd, LPRECT32 rect )
+void WINAPI MapDialogRect32( HWND32 hwnd, LPRECT32 rect )
 {
     DIALOGINFO * dlgInfo;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -1393,7 +1403,8 @@
 /***********************************************************************
  *           GetNextDlgGroupItem16   (USER.227)
  */
-HWND16 GetNextDlgGroupItem16(HWND16 hwndDlg, HWND16 hwndCtrl, BOOL16 fPrevious)
+HWND16 WINAPI GetNextDlgGroupItem16( HWND16 hwndDlg, HWND16 hwndCtrl,
+                                     BOOL16 fPrevious )
 {
     return (HWND16)GetNextDlgGroupItem32( hwndDlg, hwndCtrl, fPrevious );
 }
@@ -1402,7 +1413,8 @@
 /***********************************************************************
  *           GetNextDlgGroupItem32   (USER32.274)
  */
-HWND32 GetNextDlgGroupItem32(HWND32 hwndDlg, HWND32 hwndCtrl, BOOL32 fPrevious)
+HWND32 WINAPI GetNextDlgGroupItem32( HWND32 hwndDlg, HWND32 hwndCtrl,
+                                     BOOL32 fPrevious )
 {
     WND *pWnd, *pWndLast, *pWndCtrl, *pWndDlg;
 
@@ -1452,7 +1464,8 @@
 /***********************************************************************
  *           GetNextDlgTabItem16   (USER.228)
  */
-HWND16 GetNextDlgTabItem16( HWND16 hwndDlg, HWND16 hwndCtrl, BOOL16 fPrevious )
+HWND16 WINAPI GetNextDlgTabItem16( HWND16 hwndDlg, HWND16 hwndCtrl,
+                                   BOOL16 fPrevious )
 {
     return (HWND16)GetNextDlgTabItem32( hwndDlg, hwndCtrl, fPrevious );
 }
@@ -1461,7 +1474,8 @@
 /***********************************************************************
  *           GetNextDlgTabItem32   (USER32.275)
  */
-HWND32 GetNextDlgTabItem32( HWND32 hwndDlg, HWND32 hwndCtrl, BOOL32 fPrevious )
+HWND32 WINAPI GetNextDlgTabItem32( HWND32 hwndDlg, HWND32 hwndCtrl,
+                                   BOOL32 fPrevious )
 {
     WND *pWnd, *pWndLast, *pWndCtrl, *pWndDlg;
 
@@ -1691,7 +1705,7 @@
 /**********************************************************************
  *	    DlgDirSelect    (USER.99)
  */
-BOOL16 DlgDirSelect( HWND16 hwnd, LPSTR str, INT16 id )
+BOOL16 WINAPI DlgDirSelect( HWND16 hwnd, LPSTR str, INT16 id )
 {
     return DlgDirSelectEx16( hwnd, str, 128, id );
 }
@@ -1700,7 +1714,7 @@
 /**********************************************************************
  *	    DlgDirSelectComboBox    (USER.194)
  */
-BOOL16 DlgDirSelectComboBox( HWND16 hwnd, LPSTR str, INT16 id )
+BOOL16 WINAPI DlgDirSelectComboBox( HWND16 hwnd, LPSTR str, INT16 id )
 {
     return DlgDirSelectComboBoxEx16( hwnd, str, 128, id );
 }
@@ -1709,7 +1723,7 @@
 /**********************************************************************
  *           DlgDirSelectEx16    (USER.422)
  */
-BOOL16 DlgDirSelectEx16( HWND16 hwnd, LPSTR str, INT16 len, INT16 id )
+BOOL16 WINAPI DlgDirSelectEx16( HWND16 hwnd, LPSTR str, INT16 len, INT16 id )
 {
     return DIALOG_DlgDirSelect( hwnd, str, len, id, FALSE, FALSE, FALSE );
 }
@@ -1718,7 +1732,7 @@
 /**********************************************************************
  *           DlgDirSelectEx32A    (USER32.148)
  */
-BOOL32 DlgDirSelectEx32A( HWND32 hwnd, LPSTR str, INT32 len, INT32 id )
+BOOL32 WINAPI DlgDirSelectEx32A( HWND32 hwnd, LPSTR str, INT32 len, INT32 id )
 {
     return DIALOG_DlgDirSelect( hwnd, str, len, id, TRUE, FALSE, FALSE );
 }
@@ -1727,7 +1741,7 @@
 /**********************************************************************
  *           DlgDirSelectEx32W    (USER32.149)
  */
-BOOL32 DlgDirSelectEx32W( HWND32 hwnd, LPWSTR str, INT32 len, INT32 id )
+BOOL32 WINAPI DlgDirSelectEx32W( HWND32 hwnd, LPWSTR str, INT32 len, INT32 id )
 {
     return DIALOG_DlgDirSelect( hwnd, (LPSTR)str, len, id, TRUE, TRUE, FALSE );
 }
@@ -1736,7 +1750,8 @@
 /**********************************************************************
  *           DlgDirSelectComboBoxEx16    (USER.423)
  */
-BOOL16 DlgDirSelectComboBoxEx16( HWND16 hwnd, LPSTR str, INT16 len, INT16 id )
+BOOL16 WINAPI DlgDirSelectComboBoxEx16( HWND16 hwnd, LPSTR str, INT16 len,
+                                        INT16 id )
 {
     return DIALOG_DlgDirSelect( hwnd, str, len, id, FALSE, FALSE, TRUE );
 }
@@ -1745,7 +1760,8 @@
 /**********************************************************************
  *           DlgDirSelectComboBoxEx32A    (USER32.146)
  */
-BOOL32 DlgDirSelectComboBoxEx32A( HWND32 hwnd, LPSTR str, INT32 len, INT32 id )
+BOOL32 WINAPI DlgDirSelectComboBoxEx32A( HWND32 hwnd, LPSTR str, INT32 len,
+                                         INT32 id )
 {
     return DIALOG_DlgDirSelect( hwnd, str, len, id, TRUE, FALSE, TRUE );
 }
@@ -1754,7 +1770,8 @@
 /**********************************************************************
  *           DlgDirSelectComboBoxEx32W    (USER32.147)
  */
-BOOL32 DlgDirSelectComboBoxEx32W( HWND32 hwnd, LPWSTR str, INT32 len, INT32 id)
+BOOL32 WINAPI DlgDirSelectComboBoxEx32W( HWND32 hwnd, LPWSTR str, INT32 len,
+                                         INT32 id)
 {
     return DIALOG_DlgDirSelect( hwnd, (LPSTR)str, len, id, TRUE, TRUE, TRUE );
 }
@@ -1763,8 +1780,8 @@
 /**********************************************************************
  *	    DlgDirList16    (USER.100)
  */
-INT16 DlgDirList16( HWND16 hDlg, LPSTR spec, INT16 idLBox, INT16 idStatic,
-                    UINT16 attrib )
+INT16 WINAPI DlgDirList16( HWND16 hDlg, LPSTR spec, INT16 idLBox,
+                           INT16 idStatic, UINT16 attrib )
 {
     return DIALOG_DlgDirList( hDlg, spec, idLBox, idStatic, attrib, FALSE );
 }
@@ -1773,8 +1790,8 @@
 /**********************************************************************
  *	    DlgDirList32A    (USER32.142)
  */
-INT32 DlgDirList32A( HWND32 hDlg, LPSTR spec, INT32 idLBox, INT32 idStatic,
-                     UINT32 attrib )
+INT32 WINAPI DlgDirList32A( HWND32 hDlg, LPSTR spec, INT32 idLBox,
+                            INT32 idStatic, UINT32 attrib )
 {
     return DIALOG_DlgDirList( hDlg, spec, idLBox, idStatic, attrib, FALSE );
 }
@@ -1783,8 +1800,8 @@
 /**********************************************************************
  *	    DlgDirList32W    (USER32.145)
  */
-INT32 DlgDirList32W( HWND32 hDlg, LPWSTR spec, INT32 idLBox, INT32 idStatic,
-                     UINT32 attrib )
+INT32 WINAPI DlgDirList32W( HWND32 hDlg, LPWSTR spec, INT32 idLBox,
+                            INT32 idStatic, UINT32 attrib )
 {
     return DIALOG_DlgDirListW( hDlg, spec, idLBox, idStatic, attrib, FALSE );
 }
@@ -1793,8 +1810,8 @@
 /**********************************************************************
  *	    DlgDirListComboBox16    (USER.195)
  */
-INT16 DlgDirListComboBox16( HWND16 hDlg, LPSTR spec, INT16 idCBox,
-                            INT16 idStatic, UINT16 attrib )
+INT16 WINAPI DlgDirListComboBox16( HWND16 hDlg, LPSTR spec, INT16 idCBox,
+                                   INT16 idStatic, UINT16 attrib )
 {
     return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE );
 }
@@ -1803,8 +1820,8 @@
 /**********************************************************************
  *	    DlgDirListComboBox32A    (USER32.143)
  */
-INT32 DlgDirListComboBox32A( HWND32 hDlg, LPSTR spec, INT32 idCBox,
-                             INT32 idStatic, UINT32 attrib )
+INT32 WINAPI DlgDirListComboBox32A( HWND32 hDlg, LPSTR spec, INT32 idCBox,
+                                    INT32 idStatic, UINT32 attrib )
 {
     return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE );
 }
@@ -1813,8 +1830,8 @@
 /**********************************************************************
  *	    DlgDirListComboBox32W    (USER32.144)
  */
-INT32 DlgDirListComboBox32W( HWND32 hDlg, LPWSTR spec, INT32 idCBox,
-                             INT32 idStatic, UINT32 attrib )
+INT32 WINAPI DlgDirListComboBox32W( HWND32 hDlg, LPWSTR spec, INT32 idCBox,
+                                    INT32 idStatic, UINT32 attrib )
 {
     return DIALOG_DlgDirListW( hDlg, spec, idCBox, idStatic, attrib, TRUE );
 }
diff --git a/windows/driver.c b/windows/driver.c
index 942ecc8..2b8df27 100644
--- a/windows/driver.c
+++ b/windows/driver.c
@@ -45,8 +45,8 @@
 /**************************************************************************
  *				SendDriverMessage		[USER.251]
  */
-LRESULT SendDriverMessage(HDRVR16 hDriver, UINT16 msg, LPARAM lParam1,
-			  LPARAM lParam2)
+LRESULT WINAPI SendDriverMessage(HDRVR16 hDriver, UINT16 msg, LPARAM lParam1,
+                                 LPARAM lParam2)
 {
     LPDRIVERITEM lpdrv;
     LRESULT retval;
@@ -73,7 +73,7 @@
 /**************************************************************************
  *				OpenDriver		        [USER.252]
  */
-HDRVR16 OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
+HDRVR16 WINAPI OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
 {
     HDRVR16 hDrvr;
     LPDRIVERITEM lpdrv, lpnewdrv;
@@ -154,7 +154,7 @@
 /**************************************************************************
  *				CloseDriver				[USER.253]
  */
-LRESULT CloseDriver(HDRVR16 hDrvr, LPARAM lParam1, LPARAM lParam2)
+LRESULT WINAPI CloseDriver(HDRVR16 hDrvr, LPARAM lParam1, LPARAM lParam2)
 {
     LPDRIVERITEM lpdrv;
 
@@ -192,7 +192,7 @@
 /**************************************************************************
  *				GetDriverModuleHandle	[USER.254]
  */
-HMODULE16 GetDriverModuleHandle(HDRVR16 hDrvr)
+HMODULE16 WINAPI GetDriverModuleHandle(HDRVR16 hDrvr)
 {
     LPDRIVERITEM lpdrv;
     HMODULE16 hModule = 0;
@@ -211,8 +211,8 @@
 /**************************************************************************
  *				DefDriverProc			[USER.255]
  */
-LRESULT DefDriverProc(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg, 
-		      LPARAM lParam1, LPARAM lParam2)
+LRESULT WINAPI DefDriverProc(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg, 
+                             LPARAM lParam1, LPARAM lParam2)
 {
     switch(wMsg)
     {
@@ -249,7 +249,7 @@
 /**************************************************************************
  *				GetDriverInfo			[USER.256]
  */
-BOOL16 GetDriverInfo(HDRVR16 hDrvr, LPDRIVERINFOSTRUCT16 lpDrvInfo)
+BOOL16 WINAPI GetDriverInfo(HDRVR16 hDrvr, LPDRIVERINFOSTRUCT16 lpDrvInfo)
 {
     LPDRIVERITEM lpdrv;
 
@@ -268,7 +268,7 @@
 /**************************************************************************
  *				GetNextDriver			[USER.257]
  */
-HDRVR16 GetNextDriver(HDRVR16 hDrvr, DWORD dwFlags)
+HDRVR16 WINAPI GetNextDriver(HDRVR16 hDrvr, DWORD dwFlags)
 {
     LPDRIVERITEM lpdrv;
     HDRVR16 hRetDrv = 0;
diff --git a/windows/event.c b/windows/event.c
index dc5c238..541bd46 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -68,6 +68,12 @@
 static Atom dndProtocol = None;
 static Atom dndSelection = None;
 
+/* EVENT_WaitNetEvent() master fd sets */
+
+static fd_set __event_io_set[3];
+static int    __event_max_fd = 0;
+static int    __event_x_connection = 0;
+
 static const char * const event_names[] =
 {
     "", "", "KeyPress", "KeyRelease", "ButtonPress", "ButtonRelease",
@@ -102,6 +108,38 @@
 
 extern void FOCUS_SetXFocus( HWND32 );
 extern BOOL16 DRAG_QueryUpdate( HWND16, SEGPTR, BOOL32 );
+extern BOOL32 WINSOCK_HandleIO( int* max_fd, int num_pending, fd_set io_set[3] );
+
+/***********************************************************************
+ *           EVENT_Init
+ *
+ * Initialize network IO.
+ */
+BOOL32 EVENT_Init(void)
+{
+    int  i;
+    for( i = 0; i < 3; i++ )
+	FD_ZERO( __event_io_set + i );
+
+    __event_max_fd = __event_x_connection = ConnectionNumber(display);
+    FD_SET( __event_x_connection, &__event_io_set[EVENT_IO_READ] );
+    __event_max_fd++;
+    return TRUE;
+}
+
+/***********************************************************************
+ *          EVENT_AddIO 
+ */
+void EVENT_AddIO( int fd, int io_type )
+{
+    FD_SET( fd, &__event_io_set[io_type] );
+    if( __event_max_fd <= fd ) __event_max_fd = fd + 1;
+}
+
+void EVENT_DeleteIO( int fd, int io_type )
+{
+    FD_CLR( fd, &__event_io_set[io_type] );
+}
 
 /***********************************************************************
  *           EVENT_ProcessEvent
@@ -253,13 +291,13 @@
 }
 
 /***********************************************************************
- *           EVENT_WaitXEvent
+ *           EVENT_WaitNetEvent
  *
- * Wait for an X event, optionally sleeping until one arrives.
+ * Wait for a network event, optionally sleeping until one arrives.
  * Return TRUE if an event is pending, FALSE on timeout or error
  * (for instance lost connection with the server).
  */
-BOOL32 EVENT_WaitXEvent( BOOL32 sleep, BOOL32 peek )
+BOOL32 EVENT_WaitNetEvent( BOOL32 sleep, BOOL32 peek )
 {
     XEvent event;
     LONG maxWait = sleep ? TIMER_GetNextExpiration() : 0;
@@ -270,12 +308,11 @@
 
     if ((maxWait != -1) && !XPending(display))
     {
-        fd_set read_set;
+	int num_pending;
         struct timeval timeout;
-        int fd = ConnectionNumber(display);
-
-        FD_ZERO( &read_set );
-        FD_SET( fd, &read_set );
+	fd_set read_set = __event_io_set[EVENT_IO_READ];
+	fd_set write_set = __event_io_set[EVENT_IO_WRITE];
+	fd_set except_set = __event_io_set[EVENT_IO_EXCEPT];
 
 	timeout.tv_usec = (maxWait % 1000) * 1000;
 	timeout.tv_sec = maxWait / 1000;
@@ -291,8 +328,8 @@
 	}
 	stop_wait_op = STOP_WAIT_X;
 	/* The code up to the next "stop_wait_op = CONT" must be reentrant */
-	if (select( fd+1, &read_set, NULL, NULL, &timeout ) != 1 &&
-	    !XPending(display))
+	num_pending = select( __event_max_fd, &read_set, NULL, NULL, &timeout );
+	if ( num_pending == 0 )
         {
 	    stop_wait_op = CONT;
             TIMER_ExpireTimers();
@@ -300,7 +337,9 @@
 	}
         else stop_wait_op = CONT;
 #else  /* CONFIG_IPC */
-	if (select( fd+1, &read_set, NULL, NULL, &timeout ) != 1)
+	num_pending = select( __event_max_fd, 
+			&read_set, &write_set, &except_set, &timeout );
+	if ( num_pending == 0)
         {
             /* Timeout or error */
             TIMER_ExpireTimers();
@@ -308,9 +347,19 @@
         }
 #endif  /* CONFIG_IPC */
 
+	/*  Winsock asynchronous services */
+
+	if( FD_ISSET( __event_x_connection, &read_set) ) 
+	{
+	    num_pending--;
+	    if( num_pending )
+		WINSOCK_HandleIO( &__event_max_fd, num_pending, __event_io_set );
+	}
+	else /* no X events */
+	    return WINSOCK_HandleIO( &__event_max_fd, num_pending, __event_io_set );
     }
 
-    /* Process the event (and possibly others that occurred in the meantime) */
+    /* Process current X event (and possibly others that occurred in the meantime) */
 
     do
     {
@@ -1050,7 +1099,7 @@
 /**********************************************************************
  *		SetCapture16   (USER.18)
  */
-HWND16 SetCapture16( HWND16 hwnd )
+HWND16 WINAPI SetCapture16( HWND16 hwnd )
 {
     return (HWND16)EVENT_Capture( hwnd, HTCLIENT );
 }
@@ -1059,7 +1108,7 @@
 /**********************************************************************
  *		SetCapture32   (USER32.463)
  */
-HWND32 SetCapture32( HWND32 hwnd )
+HWND32 WINAPI SetCapture32( HWND32 hwnd )
 {
     return EVENT_Capture( hwnd, HTCLIENT );
 }
@@ -1068,7 +1117,7 @@
 /**********************************************************************
  *		ReleaseCapture   (USER.19) (USER32.438)
  */
-void ReleaseCapture(void)
+void WINAPI ReleaseCapture(void)
 {
     dprintf_win(stddeb, "ReleaseCapture() [%04x]\n", captureWnd );
     if( captureWnd ) EVENT_Capture( 0, 0 );
@@ -1078,7 +1127,7 @@
 /**********************************************************************
  *		GetCapture16   (USER.236)
  */
-HWND16 GetCapture16(void)
+HWND16 WINAPI GetCapture16(void)
 {
     return captureWnd;
 }
@@ -1087,7 +1136,7 @@
 /**********************************************************************
  *		GetCapture32   (USER32.207)
  */
-HWND32 GetCapture32(void)
+HWND32 WINAPI GetCapture32(void)
 {
     return captureWnd;
 }
@@ -1096,7 +1145,7 @@
 /***********************************************************************
  *           GetMouseEventProc   (USER.337)
  */
-FARPROC16 GetMouseEventProc(void)
+FARPROC16 WINAPI GetMouseEventProc(void)
 {
     HMODULE16 hmodule = GetModuleHandle16("USER");
     return MODULE_GetEntryPoint( hmodule,
@@ -1107,7 +1156,7 @@
 /***********************************************************************
  *           Mouse_Event   (USER.299)
  */
-void Mouse_Event( CONTEXT *context )
+void WINAPI Mouse_Event( CONTEXT *context )
 {
     /* Register values:
      * AX = mouse event
@@ -1147,7 +1196,7 @@
 /**********************************************************************
  *			EnableHardwareInput   (USER.331)
  */
-BOOL16 EnableHardwareInput(BOOL16 bEnable)
+BOOL16 WINAPI EnableHardwareInput(BOOL16 bEnable)
 {
   BOOL16 bOldState = InputEnabled;
   dprintf_event(stdnimp,"EnableHardwareInput(%d);\n", bEnable);
@@ -1159,7 +1208,7 @@
 /***********************************************************************
  *	     SwapMouseButton16   (USER.186)
  */
-BOOL16 SwapMouseButton16( BOOL16 fSwap )
+BOOL16 WINAPI SwapMouseButton16( BOOL16 fSwap )
 {
     BOOL16 ret = SwappedButtons;
     SwappedButtons = fSwap;
@@ -1170,7 +1219,7 @@
 /***********************************************************************
  *	     SwapMouseButton32   (USER32.536)
  */
-BOOL32 SwapMouseButton32( BOOL32 fSwap )
+BOOL32 WINAPI SwapMouseButton32( BOOL32 fSwap )
 {
     BOOL32 ret = SwappedButtons;
     SwappedButtons = fSwap;
diff --git a/windows/focus.c b/windows/focus.c
index 3c28c8e..28aa847 100644
--- a/windows/focus.c
+++ b/windows/focus.c
@@ -81,7 +81,7 @@
 /*****************************************************************
  *               SetFocus16   (USER.22)
  */
-HWND16 SetFocus16( HWND16 hwnd )
+HWND16 WINAPI SetFocus16( HWND16 hwnd )
 {
     return (HWND16)SetFocus32( hwnd );
 }
@@ -90,7 +90,7 @@
 /*****************************************************************
  *               SetFocus32   (USER32.480)
  */
-HWND32 SetFocus32( HWND32 hwnd )
+HWND32 WINAPI SetFocus32( HWND32 hwnd )
 {
     HWND32 hWndPrevFocus, hwndTop = hwnd;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
@@ -137,7 +137,7 @@
 /*****************************************************************
  *               GetFocus16   (USER.23)
  */
-HWND16 GetFocus16(void)
+HWND16 WINAPI GetFocus16(void)
 {
     return (HWND16)hwndFocus;
 }
@@ -146,7 +146,7 @@
 /*****************************************************************
  *               GetFocus32   (USER32.239)
  */
-HWND32 GetFocus32(void)
+HWND32 WINAPI GetFocus32(void)
 {
     return hwndFocus;
 }
diff --git a/windows/graphics.c b/windows/graphics.c
index a11404b..f924a8f 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -108,8 +108,13 @@
 	    XCopyArea( display, bmp->pixmap, dc->u.x.drawable, 
 		       dc->u.x.gc, xsrc, ysrc, width, height, xdest, ydest );
     }
-    else return FALSE;
+    else 
+    {
+      GDI_HEAP_UNLOCK( hbitmap );
+      return FALSE;
+    }
 
+    GDI_HEAP_UNLOCK( hbitmap );
     return TRUE;
 }
 
@@ -234,6 +239,7 @@
 
     XSetClipMask( display, dc->u.x.gc, (bmp) ? bmp->pixmap : None );
 
+    GDI_HEAP_UNLOCK( hMonoBitmap );
     return TRUE;
 }
 
diff --git a/windows/hook.c b/windows/hook.c
index 2b1333d..7166bad 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -1162,7 +1162,7 @@
 /***********************************************************************
  *           SetWindowsHook16   (USER.121)
  */
-FARPROC16 SetWindowsHook16( INT16 id, HOOKPROC16 proc )
+FARPROC16 WINAPI SetWindowsHook16( INT16 id, HOOKPROC16 proc )
 {
     HANDLE16 handle;
     HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) );
@@ -1186,7 +1186,7 @@
  *
  * FIXME: I don't know if this is correct
  */
-HHOOK SetWindowsHook32A( INT32 id, HOOKPROC32 proc )
+HHOOK WINAPI SetWindowsHook32A( INT32 id, HOOKPROC32 proc )
 {
     HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) );
 
@@ -1203,7 +1203,7 @@
  *
  * FIXME: I don't know if this is correct
  */
-HHOOK SetWindowsHook32W( INT32 id, HOOKPROC32 proc )
+HHOOK WINAPI SetWindowsHook32W( INT32 id, HOOKPROC32 proc )
 {
     HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) );
 
@@ -1218,8 +1218,8 @@
 /***********************************************************************
  *           SetWindowsHookEx16   (USER.291)
  */
-HHOOK SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
-			  HTASK16 hTask )
+HHOOK WINAPI SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
+                                 HTASK16 hTask )
 {
     HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN16, hInst, hTask );
     return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : (HHOOK)NULL;
@@ -1229,8 +1229,8 @@
 /***********************************************************************
  *           SetWindowsHookEx32A   (USER32.525)
  */
-HHOOK SetWindowsHookEx32A( INT32 id, HOOKPROC32 proc, HINSTANCE32 hInst,
-			   DWORD dwThreadID )
+HHOOK WINAPI SetWindowsHookEx32A( INT32 id, HOOKPROC32 proc, HINSTANCE32 hInst,
+                                  DWORD dwThreadID )
 {
     HANDLE16 handle;
     HTASK16 hTask;
@@ -1248,8 +1248,8 @@
 /***********************************************************************
  *           SetWindowsHookEx32W   (USER32.526)
  */
-HHOOK SetWindowsHookEx32W( INT32 id, HOOKPROC32 proc, HINSTANCE32 hInst,
-			   DWORD dwThreadID )
+HHOOK WINAPI SetWindowsHookEx32W( INT32 id, HOOKPROC32 proc, HINSTANCE32 hInst,
+                                  DWORD dwThreadID )
 {
     HANDLE16 handle;
     HTASK16 hTask;
@@ -1267,7 +1267,7 @@
 /***********************************************************************
  *           UnhookWindowsHook16   (USER.234)
  */
-BOOL16 UnhookWindowsHook16( INT16 id, HOOKPROC16 proc )
+BOOL16 WINAPI UnhookWindowsHook16( INT16 id, HOOKPROC16 proc )
 {
     HANDLE16 hook = HOOK_GetHook( id , GetTaskQueue(0) );
 
@@ -1287,7 +1287,7 @@
 /***********************************************************************
  *           UnhookWindowsHook32   (USER32.556)
  */
-BOOL32 UnhookWindowsHook32( INT32 id, HOOKPROC32 proc )
+BOOL32 WINAPI UnhookWindowsHook32( INT32 id, HOOKPROC32 proc )
 {
     HANDLE16 hook = HOOK_GetHook( id , GetTaskQueue(0) );
 
@@ -1307,7 +1307,7 @@
 /***********************************************************************
  *           UnhookWindowHookEx16   (USER.292)
  */
-BOOL16 UnhookWindowsHookEx16( HHOOK hhook )
+BOOL16 WINAPI UnhookWindowsHookEx16( HHOOK hhook )
 {
     if (HIWORD(hhook) != HOOK_MAGIC) return FALSE;  /* Not a new format hook */
     return HOOK_RemoveHook( LOWORD(hhook) );
@@ -1317,7 +1317,7 @@
 /***********************************************************************
  *           UnhookWindowHookEx32   (USER32.557)
  */
-BOOL32 UnhookWindowsHookEx32( HHOOK hhook )
+BOOL32 WINAPI UnhookWindowsHookEx32( HHOOK hhook )
 {
     return UnhookWindowsHookEx16( hhook );
 }
@@ -1329,8 +1329,8 @@
  * I wouldn't have separated this into 16 and 32 bit versions, but I
  * need a way to figure out if I need to do a mapping or not.
  */
-LRESULT CallNextHookEx16( HHOOK hhook, INT16 code, WPARAM16 wParam,
-			  LPARAM lParam )
+LRESULT WINAPI CallNextHookEx16( HHOOK hhook, INT16 code, WPARAM16 wParam,
+                                 LPARAM lParam )
 {
     HANDLE16 next;
 
@@ -1346,8 +1346,8 @@
  *
  * There aren't ANSI and UNICODE versions of this.
  */
-LRESULT CallNextHookEx32( HHOOK hhook, INT32 code, WPARAM32 wParam,
-			  LPARAM lParam )
+LRESULT WINAPI CallNextHookEx32( HHOOK hhook, INT32 code, WPARAM32 wParam,
+                                 LPARAM lParam )
 {
     HANDLE16 next;
     INT32 fromtype;	/* figure out Ansi/Unicode */
@@ -1369,8 +1369,8 @@
 /***********************************************************************
  *           DefHookProc16   (USER.235)
  */
-LRESULT DefHookProc16( INT16 code, WPARAM16 wParam, LPARAM lParam,
-		       HHOOK *hhook )
+LRESULT WINAPI DefHookProc16( INT16 code, WPARAM16 wParam, LPARAM lParam,
+                              HHOOK *hhook )
 {
     /* Note: the *hhook parameter is never used, since we rely on the
      * current hook value from the task queue to find the next hook. */
@@ -1384,7 +1384,7 @@
 /***********************************************************************
  *           CallMsgFilter16   (USER.123)
  */
-BOOL16 CallMsgFilter16( SEGPTR msg, INT16 code )
+BOOL16 WINAPI CallMsgFilter16( SEGPTR msg, INT16 code )
 {
     if (GetSysModalWindow16()) return FALSE;
     if (HOOK_CallHooks16( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) return TRUE;
@@ -1399,7 +1399,7 @@
  * FIXME: There are ANSI and UNICODE versions of this, plus an unspecified
  * version, plus USER (the 16bit one) has a CallMsgFilter32 function.
  */
-BOOL32 CallMsgFilter32A( LPMSG32 msg, INT32 code )
+BOOL32 WINAPI CallMsgFilter32A( LPMSG32 msg, INT32 code )
 {
     if (GetSysModalWindow16()) return FALSE;	/* ??? */
     if (HOOK_CallHooks32A( WH_SYSMSGFILTER, code, 0, (LPARAM)msg ))
@@ -1411,10 +1411,11 @@
 /***********************************************************************
  *           CallMsgFilter32W   (USER32.15)
  */
-BOOL32 CallMsgFilter32W( LPMSG32 msg, INT32 code )
+BOOL32 WINAPI CallMsgFilter32W( LPMSG32 msg, INT32 code )
 {
     if (GetSysModalWindow16()) return FALSE;	/* ??? */
     if (HOOK_CallHooks32W( WH_SYSMSGFILTER, code, 0, (LPARAM)msg ))
       return TRUE;
     return HOOK_CallHooks32W( WH_MSGFILTER, code, 0, (LPARAM)msg );
 }
+
diff --git a/windows/keyboard.c b/windows/keyboard.c
index c1965ca..be31d59 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -108,7 +108,7 @@
 /*
  * Table for vkey to scancode translation - 5/29/97 chrisf@america.com 
  */
-static BYTE vkey2scode[512] = {
+static const 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,
@@ -482,7 +482,7 @@
 /**********************************************************************
  *		GetKeyState			[USER.106]
  */
-WORD GetKeyState16(INT16 vkey)
+WORD WINAPI GetKeyState16(INT16 vkey)
 {
     return GetKeyState32(vkey);
 }
@@ -493,7 +493,7 @@
  * keyboard-input message.  This function retrieves the state of the key
  * at the time the input message was generated.  (SDK 3.1 Vol 2. p 390)
  */
-WORD GetKeyState32(INT32 vkey)
+WORD WINAPI GetKeyState32(INT32 vkey)
 {
     INT32 retval;
 
@@ -524,7 +524,7 @@
  * keyboard-input message.  This function retrieves the state of the keyboard
  * at the time the input message was generated.  (SDK 3.1 Vol 2. p 387)
  */
-VOID GetKeyboardState(LPBYTE lpKeyState)
+VOID WINAPI GetKeyboardState(LPBYTE lpKeyState)
 {
     dprintf_key(stddeb, "GetKeyboardState()\n");
     if (lpKeyState != NULL) {
@@ -538,7 +538,7 @@
 /**********************************************************************
  *      SetKeyboardState            [USER.223][USER32.483]
  */
-VOID SetKeyboardState(LPBYTE lpKeyState)
+VOID WINAPI SetKeyboardState(LPBYTE lpKeyState)
 {
     dprintf_key(stddeb, "SetKeyboardState()\n");
     if (lpKeyState != NULL) {
@@ -562,7 +562,7 @@
  * mouse or key had been depressed since the last call to 
  * GetAsyncKeyState.
  */
-WORD GetAsyncKeyState32(INT32 nKey)
+WORD WINAPI GetAsyncKeyState32(INT32 nKey)
 {
     short retval;	
 
@@ -595,7 +595,7 @@
 /**********************************************************************
  *            GetAsyncKeyState        (USER.249)
  */
-WORD GetAsyncKeyState16(INT16 nKey)
+WORD WINAPI GetAsyncKeyState16(INT16 nKey)
 {
     return GetAsyncKeyState32(nKey);
 }
@@ -607,7 +607,7 @@
  *
  * FIXME: should send some WM_INITMENU or/and WM_INITMENUPOPUP  -messages
  */
-INT32 TranslateAccelerator32(HWND32 hWnd, HACCEL32 hAccel, LPMSG32 msg)
+INT32 WINAPI TranslateAccelerator32(HWND32 hWnd, HACCEL32 hAccel, LPMSG32 msg)
 {
     MSG16	msg16;
 
@@ -615,7 +615,7 @@
     return TranslateAccelerator16(hWnd,hAccel,&msg16);
 }
 	
-INT16 TranslateAccelerator16(HWND16 hWnd, HACCEL16 hAccel, LPMSG16 msg)
+INT16 WINAPI TranslateAccelerator16(HWND16 hWnd, HACCEL16 hAccel, LPMSG16 msg)
 {
     ACCELHEADER	*lpAccelTbl;
     int 	i;
@@ -755,7 +755,7 @@
 /******************************************************************************
  *    	OemKeyScan			[KEYBOARD.128][USER32.400]
  */
-DWORD OemKeyScan(WORD wOemChar)
+DWORD WINAPI OemKeyScan(WORD wOemChar)
 {
     dprintf_keyboard(stddeb,"*OemKeyScan (%d)\n",wOemChar);
 
@@ -780,7 +780,7 @@
  * VkKeyScan '`'(0x60, 96) ... got keycode 00 ... returning 00
  */
 
-WORD VkKeyScan32A(CHAR cChar)
+WORD WINAPI VkKeyScan32A(CHAR cChar)
 {
 	KeyCode keycode;
 	KeySym keysym;    	
@@ -827,7 +827,7 @@
 /******************************************************************************
  *    	VkKeyScan			[KEYBOARD.129]
  */
-WORD VkKeyScan16(CHAR cChar)
+WORD WINAPI VkKeyScan16(CHAR cChar)
 {
 	return VkKeyScan32A(cChar);
 }
@@ -835,7 +835,7 @@
 /******************************************************************************
  *    	VkKeyScanW			[USER32.575]
  */
-WORD VkKeyScan32W(WCHAR cChar)
+WORD WINAPI VkKeyScan32W(WCHAR cChar)
 {
 	return VkKeyScan32A((CHAR)cChar); /* FIXME: check unicode */
 }
@@ -843,7 +843,7 @@
 /******************************************************************************
  *    	GetKeyboardType			[KEYBOARD.130]
  */
-INT16 GetKeyboardType16(INT16 nTypeFlag)
+INT16 WINAPI GetKeyboardType16(INT16 nTypeFlag)
 {
   return GetKeyboardType32(nTypeFlag);
 }
@@ -851,7 +851,7 @@
 /******************************************************************************
  *    	GetKeyboardType			[USER32.254]
  */
-INT32 GetKeyboardType32(INT32 nTypeFlag)
+INT32 WINAPI GetKeyboardType32(INT32 nTypeFlag)
 {
   dprintf_keyboard(stddeb,"GetKeyboardType(%d)\n",nTypeFlag);
   switch(nTypeFlag)
@@ -875,22 +875,24 @@
 /******************************************************************************
  *    	MapVirtualKeyA			[USER32.382]
  */
-UINT32 MapVirtualKey32A(UINT32 code, UINT32 maptype) {
-	return MapVirtualKey16(code,maptype);
+UINT32 WINAPI MapVirtualKey32A(UINT32 code, UINT32 maptype)
+{
+    return MapVirtualKey16(code,maptype);
 }
 
 /******************************************************************************
  *    	MapVirtualKeyA			[USER32.384]
  */
-UINT32 MapVirtualKey32W(UINT32 code, UINT32 maptype) {
-	return MapVirtualKey16(code,maptype);
+UINT32 WINAPI MapVirtualKey32W(UINT32 code, UINT32 maptype)
+{
+    return MapVirtualKey16(code,maptype);
 }
 
 /******************************************************************************
  *    	MapVirtualKeyA			[KEYBOARD.131]
  * MapVirtualKey translates keycodes from one format to another
  */
-UINT16 MapVirtualKey16(UINT16 wCode, UINT16 wMapType)
+UINT16 WINAPI MapVirtualKey16(UINT16 wCode, UINT16 wMapType)
 {
 #define returnMVK(value) { dprintf_keyboard(stddeb,"returning 0x%x.\n",value); return value; }
 
@@ -936,7 +938,7 @@
 /****************************************************************************
  *	GetKBCodePage16   (KEYBOARD.132)
  */
-INT16 GetKBCodePage16(void)
+INT16 WINAPI GetKBCodePage16(void)
 {
     dprintf_keyboard(stddeb,"GetKBCodePage()\n");
     return 850;
@@ -946,7 +948,7 @@
 /****************************************************************************
  *	GetKBCodePage32   (USER32.245)
  */
-UINT32 GetKBCodePage32(void)
+UINT32 WINAPI GetKBCodePage32(void)
 {
     dprintf_keyboard(stddeb,"GetKbCodePage()\n");
     return 850;
@@ -956,7 +958,7 @@
 /****************************************************************************
  *	GetKeyNameText32W   (USER32.247)
  */
-INT32 GetKeyNameText32W(LONG lParam, LPWSTR lpBuffer, INT32 nSize)
+INT32 WINAPI GetKeyNameText32W(LONG lParam, LPWSTR lpBuffer, INT32 nSize)
 {
 	LPSTR buf = xmalloc(nSize);
 	int	res = GetKeyNameText32A(lParam,buf,nSize);
@@ -969,7 +971,7 @@
 /****************************************************************************
  *	GetKeyNameText32A   (USER32.246)
  */
-INT32 GetKeyNameText32A(LONG lParam, LPSTR lpBuffer, INT32 nSize)
+INT32 WINAPI GetKeyNameText32A(LONG lParam, LPSTR lpBuffer, INT32 nSize)
 {
 	return GetKeyNameText16(lParam,lpBuffer,nSize);
 }
@@ -977,7 +979,7 @@
 /****************************************************************************
  *	GetKeyNameText16   (KEYBOARD.133)
  */
-INT16 GetKeyNameText16(LONG lParam, LPSTR lpBuffer, INT16 nSize)
+INT16 WINAPI GetKeyNameText16(LONG lParam, LPSTR lpBuffer, INT16 nSize)
 {
   /*	int i; */
 	
@@ -1002,8 +1004,8 @@
 /****************************************************************************
  *	ToAscii   (KEYBOARD.4)
  */
-INT16 ToAscii16(UINT16 virtKey,UINT16 scanCode, LPBYTE lpKeyState, 
-	LPVOID lpChar, UINT16 flags) 
+INT16 WINAPI ToAscii16(UINT16 virtKey,UINT16 scanCode, LPBYTE lpKeyState, 
+                       LPVOID lpChar, UINT16 flags) 
 {
     return ToAscii32(virtKey,scanCode,lpKeyState,lpChar,flags);
 }
@@ -1011,10 +1013,9 @@
 /****************************************************************************
  *	ToAscii   (USER32.545)
  */
-INT32 ToAscii32(
-	UINT32 virtKey,UINT32 scanCode,LPBYTE lpKeyState,
-	LPWORD lpChar,UINT32 flags
-) {
+INT32 WINAPI ToAscii32( UINT32 virtKey,UINT32 scanCode,LPBYTE lpKeyState,
+                        LPWORD lpChar,UINT32 flags )
+{
     XKeyEvent e;
     KeySym keysym;
     static XComposeStatus cs;
@@ -1178,3 +1179,14 @@
 		ret, *(char*)lpChar);
     return ret;
 }
+
+
+/***********************************************************************
+ *           GetKeyboardLayout			(USER32.249)
+ */
+/*HKL*/ HANDLE32 WINAPI GetKeyboardLayout(DWORD dwLayout)
+{
+	fprintf(stderr,"GetKeyboardLayout(%ld),STUB!\n",dwLayout);
+	return 0;
+}
+
diff --git a/windows/mdi.c b/windows/mdi.c
index 39c673e..fe881b9 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -615,23 +615,29 @@
  HDC32 		hDCSrc  = CreateCompatibleDC32(0);
  HDC32		hDCDest	= CreateCompatibleDC32(hDCSrc);
  HBITMAP16	hbClose = LoadBitmap16(0, MAKEINTRESOURCE(OBM_CLOSE) );
- HBITMAP16	hbCopy,hb_src,hb_dest;
+ HBITMAP16	hbCopy;
+ HANDLE16	hobjSrc, hobjDest;
 
- hb_src = SelectObject32(hDCSrc,hbClose);
+ hobjSrc = SelectObject32(hDCSrc, hbClose);
  hbCopy = CreateCompatibleBitmap32(hDCSrc,SYSMETRICS_CXSIZE,SYSMETRICS_CYSIZE);
- hb_dest = SelectObject32(hDCDest,hbCopy);
+ hobjDest = SelectObject32(hDCDest, hbCopy);
 
  BitBlt32(hDCDest, 0, 0, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
           hDCSrc, SYSMETRICS_CXSIZE, 0, SRCCOPY);
- 
- SelectObject32(hDCSrc,hb_src);
- SelectObject32(hDCDest,hb_dest);
-
+  
+ SelectObject32(hDCSrc, hobjSrc);
  DeleteObject32(hbClose);
-
- DeleteDC32(hDCDest);
  DeleteDC32(hDCSrc);
 
+ hobjSrc = SelectObject32( hDCDest, GetStockObject32(BLACK_PEN) );
+
+ MoveToEx32( hDCDest, SYSMETRICS_CXSIZE - 1, 0, NULL );
+ LineTo32( hDCDest, SYSMETRICS_CXSIZE - 1, SYSMETRICS_CYSIZE - 1);
+
+ SelectObject32(hDCDest, hobjSrc );
+ SelectObject32(hDCDest, hobjDest);
+ DeleteDC32(hDCDest);
+
  return hbCopy;
 }
 
@@ -897,7 +903,8 @@
  *
  * This function is the handler for all MDI requests.
  */
-LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam,
+                                LPARAM lParam)
 {
     LPCREATESTRUCT16     cs;
     MDICLIENTINFO       *ci;
@@ -1090,8 +1097,8 @@
 /***********************************************************************
  *           DefFrameProc16   (USER.445)
  */
-LRESULT DefFrameProc16( HWND16 hwnd, HWND16 hwndMDIClient, UINT16 message, 
-                        WPARAM16 wParam, LPARAM lParam )
+LRESULT WINAPI DefFrameProc16( HWND16 hwnd, HWND16 hwndMDIClient,
+                               UINT16 message, WPARAM16 wParam, LPARAM lParam )
 {
     HWND16	         childHwnd;
     MDICLIENTINFO*       ci;
@@ -1188,8 +1195,8 @@
 /***********************************************************************
  *           DefFrameProc32A   (USER32.121)
  */
-LRESULT DefFrameProc32A( HWND32 hwnd, HWND32 hwndMDIClient, UINT32 message, 
-                         WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI DefFrameProc32A( HWND32 hwnd, HWND32 hwndMDIClient,
+                                UINT32 message, WPARAM32 wParam, LPARAM lParam)
 {
     if (hwndMDIClient)
     {
@@ -1228,8 +1235,8 @@
 /***********************************************************************
  *           DefFrameProc32W   (USER32.122)
  */
-LRESULT DefFrameProc32W( HWND32 hwnd, HWND32 hwndMDIClient, UINT32 message, 
-                         WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI DefFrameProc32W( HWND32 hwnd, HWND32 hwndMDIClient,
+                                UINT32 message, WPARAM32 wParam, LPARAM lParam)
 {
     if (hwndMDIClient)
     {
@@ -1265,8 +1272,8 @@
 /***********************************************************************
  *           DefMDIChildProc16   (USER.447)
  */
-LRESULT DefMDIChildProc16( HWND16 hwnd, UINT16 message,
-                           WPARAM16 wParam, LPARAM lParam )
+LRESULT WINAPI DefMDIChildProc16( HWND16 hwnd, UINT16 message,
+                                  WPARAM16 wParam, LPARAM lParam )
 {
     MDICLIENTINFO       *ci;
     WND                 *clientWnd;
@@ -1411,8 +1418,8 @@
 /***********************************************************************
  *           DefMDIChildProc32A   (USER32.123)
  */
-LRESULT DefMDIChildProc32A( HWND32 hwnd, UINT32 message,
-                            WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI DefMDIChildProc32A( HWND32 hwnd, UINT32 message,
+                                   WPARAM32 wParam, LPARAM lParam )
 {
     MDICLIENTINFO       *ci;
     WND                 *clientWnd;
@@ -1463,8 +1470,8 @@
 /***********************************************************************
  *           DefMDIChildProc32W   (USER32.124)
  */
-LRESULT DefMDIChildProc32W( HWND32 hwnd, UINT32 message,
-                            WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI DefMDIChildProc32W( HWND32 hwnd, UINT32 message,
+                                   WPARAM32 wParam, LPARAM lParam )
 {
     MDICLIENTINFO       *ci;
     WND                 *clientWnd;
@@ -1509,7 +1516,7 @@
 /**********************************************************************
  *             TranslateMDISysAccel32   (USER32.554)
  */
-BOOL32 TranslateMDISysAccel32( HWND32 hwndClient, LPMSG32 msg )
+BOOL32 WINAPI TranslateMDISysAccel32( HWND32 hwndClient, LPMSG32 msg )
 {
     MSG16 msg16;
  
@@ -1522,7 +1529,7 @@
 /**********************************************************************
  *             TranslateMDISysAccel16   (USER.451)
  */
-BOOL16 TranslateMDISysAccel16( HWND16 hwndClient, LPMSG16 msg )
+BOOL16 WINAPI TranslateMDISysAccel16( HWND16 hwndClient, LPMSG16 msg )
 {
     WND* clientWnd = WIN_FindWndPtr( hwndClient);
 
@@ -1570,7 +1577,7 @@
 /***********************************************************************
  *           CalcChildScroll   (USER.462)
  */
-void CalcChildScroll( HWND16 hwnd, WORD scroll )
+void WINAPI CalcChildScroll( HWND16 hwnd, WORD scroll )
 {
     RECT32 childRect, clientRect;
     INT32  vmin, vmax, hmin, hmax, vpos, hpos;
@@ -1620,7 +1627,7 @@
 /***********************************************************************
  *           ScrollChildren16   (USER.463)
  */
-void ScrollChildren16(HWND16 hWnd, UINT16 uMsg, WPARAM16 wParam, LPARAM lParam)
+void WINAPI ScrollChildren16(HWND16 hWnd, UINT16 uMsg, WPARAM16 wParam, LPARAM lParam)
 {
     return ScrollChildren32( hWnd, uMsg, wParam, lParam );
 }
@@ -1629,7 +1636,8 @@
 /***********************************************************************
  *           ScrollChildren32   (USER32.447)
  */
-void ScrollChildren32(HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+void WINAPI ScrollChildren32(HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam,
+                             LPARAM lParam)
 {
     WND	*wndPtr = WIN_FindWndPtr(hWnd);
     INT32 newPos = -1;
@@ -1694,8 +1702,10 @@
  SetScrollPos32(hWnd, (uMsg == WM_VSCROLL)?SB_VERT:SB_HORZ , newPos, TRUE);
 
  if( uMsg == WM_VSCROLL )
-     ScrollWindow32(hWnd ,0 ,curPos - newPos, NULL, NULL);
+     ScrollWindowEx32(hWnd ,0 ,curPos - newPos, NULL, NULL, 0, NULL, 
+			SW_INVALIDATE | SW_ERASE | SW_SCROLLCHILDREN );
  else
-     ScrollWindow32(hWnd ,curPos - newPos, 0, NULL, NULL);
+     ScrollWindowEx32(hWnd ,curPos - newPos, 0, NULL, NULL, 0, NULL,
+			SW_INVALIDATE | SW_ERASE | SW_SCROLLCHILDREN );
 }
 
diff --git a/windows/message.c b/windows/message.c
index 6bd4f4d..6d4aa84 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -419,7 +419,7 @@
 
     /* If the queue is empty, attempt to fill it */
     if (!sysMsgQueue->msgCount && XPending(display))
-        EVENT_WaitXEvent( FALSE, FALSE );
+        EVENT_WaitNetEvent( FALSE, FALSE );
 
     for (i = kbd_msg = 0; i < sysMsgQueue->msgCount; i++, pos++)
     {
@@ -515,7 +515,7 @@
 /**********************************************************************
  *           SetDoubleClickTime16   (USER.20)
  */
-void SetDoubleClickTime16( UINT16 interval )
+void WINAPI SetDoubleClickTime16( UINT16 interval )
 {
     SetDoubleClickTime32( interval );
 }		
@@ -524,7 +524,7 @@
 /**********************************************************************
  *           SetDoubleClickTime32   (USER32.479)
  */
-BOOL32 SetDoubleClickTime32( UINT32 interval )
+BOOL32 WINAPI SetDoubleClickTime32( UINT32 interval )
 {
     doubleClickSpeed = interval ? interval : 500;
     return TRUE;
@@ -534,7 +534,7 @@
 /**********************************************************************
  *           GetDoubleClickTime16   (USER.21)
  */
-UINT16 GetDoubleClickTime16(void)
+UINT16 WINAPI GetDoubleClickTime16(void)
 {
     return doubleClickSpeed;
 }		
@@ -543,7 +543,7 @@
 /**********************************************************************
  *           GetDoubleClickTime32   (USER32.238)
  */
-UINT32 GetDoubleClickTime32(void)
+UINT32 WINAPI GetDoubleClickTime32(void)
 {
     return doubleClickSpeed;
 }		
@@ -632,7 +632,7 @@
 /***********************************************************************
  *           ReplyMessage16   (USER.115)
  */
-void ReplyMessage16( LRESULT result )
+void WINAPI ReplyMessage16( LRESULT result )
 {
     MESSAGEQUEUE *senderQ;
     MESSAGEQUEUE *queue;
@@ -892,8 +892,8 @@
 /***********************************************************************
  *           PeekMessage16   (USER.109)
  */
-BOOL16 PeekMessage16( LPMSG16 msg, HWND16 hwnd, UINT16 first,
-                      UINT16 last, UINT16 flags )
+BOOL16 WINAPI PeekMessage16( LPMSG16 msg, HWND16 hwnd, UINT16 first,
+                             UINT16 last, UINT16 flags )
 {
     return MSG_PeekMessage( msg, hwnd, first, last, flags, TRUE );
 }
@@ -902,7 +902,7 @@
 /***********************************************************************
  *           GetMessage16   (USER.108)
  */
-BOOL16 GetMessage16( SEGPTR msg, HWND16 hwnd, UINT16 first, UINT16 last ) 
+BOOL16 WINAPI GetMessage16( SEGPTR msg, HWND16 hwnd, UINT16 first, UINT16 last)
 {
     MSG16 *lpmsg = (MSG16 *)PTR_SEG_TO_LIN(msg);
     MSG_PeekMessage( lpmsg,
@@ -918,8 +918,8 @@
 /***********************************************************************
  *           PostMessage16   (USER.110)
  */
-BOOL16 PostMessage16( HWND16 hwnd, UINT16 message, WPARAM16 wParam,
-                      LPARAM lParam )
+BOOL16 WINAPI PostMessage16( HWND16 hwnd, UINT16 message, WPARAM16 wParam,
+                             LPARAM lParam )
 {
     MSG16 	msg;
     WND 	*wndPtr;
@@ -963,8 +963,8 @@
 /***********************************************************************
  *           PostMessage32A   (USER32.418)
  */
-BOOL32 PostMessage32A( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
-                       LPARAM lParam )
+BOOL32 WINAPI PostMessage32A( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
+                              LPARAM lParam )
 {
     /* FIXME */
     return PostMessage16( hwnd, message, wParam, lParam );
@@ -974,8 +974,8 @@
 /***********************************************************************
  *           PostMessage32W   (USER32.419)
  */
-BOOL32 PostMessage32W( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
-                       LPARAM lParam )
+BOOL32 WINAPI PostMessage32W( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
+                              LPARAM lParam )
 {
     /* FIXME */
     return PostMessage16( hwnd, message, wParam, lParam );
@@ -985,8 +985,8 @@
 /***********************************************************************
  *           PostAppMessage16   (USER.116)
  */
-BOOL16 PostAppMessage16( HTASK16 hTask, UINT16 message, WPARAM16 wParam,
-                         LPARAM lParam )
+BOOL16 WINAPI PostAppMessage16( HTASK16 hTask, UINT16 message, WPARAM16 wParam,
+                                LPARAM lParam )
 {
     MSG16 msg;
 
@@ -1006,7 +1006,8 @@
 /***********************************************************************
  *           SendMessage16   (USER.111)
  */
-LRESULT SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam)
+LRESULT WINAPI SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam,
+                              LPARAM lParam)
 {
     WND * wndPtr;
     WND **list, **ppWnd;
@@ -1103,7 +1104,8 @@
 /***********************************************************************
  *           SendMessage32A   (USER32.453)
  */
-LRESULT SendMessage32A(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+LRESULT WINAPI SendMessage32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
+                               LPARAM lParam )
 {
     WND * wndPtr;
     WND **list, **ppWnd;
@@ -1153,7 +1155,8 @@
 /***********************************************************************
  *           SendMessage32W   (USER32.458)
  */
-LRESULT SendMessage32W(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+LRESULT WINAPI SendMessage32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
+                               LPARAM lParam )
 {
     WND * wndPtr;
     WND **list, **ppWnd;
@@ -1202,7 +1205,7 @@
 /***********************************************************************
  *           WaitMessage    (USER.112) (USER32.577)
  */
-void WaitMessage( void )
+void WINAPI WaitMessage( void )
 {
     QUEUE_WaitBits( QS_ALLINPUT );
 }
@@ -1402,7 +1405,7 @@
 /***********************************************************************
  *           TranslateMessage16   (USER.113)
  */
-BOOL16 TranslateMessage16( const MSG16 *msg )
+BOOL16 WINAPI TranslateMessage16( const MSG16 *msg )
 {
     return MSG_DoTranslateMessage( msg->message, msg->hwnd,
                                    msg->wParam, msg->lParam );
@@ -1412,7 +1415,7 @@
 /***********************************************************************
  *           TranslateMessage32   (USER32.555)
  */
-BOOL32 TranslateMessage32( const MSG32 *msg )
+BOOL32 WINAPI TranslateMessage32( const MSG32 *msg )
 {
     return MSG_DoTranslateMessage( msg->message, msg->hwnd,
                                    msg->wParam, msg->lParam );
@@ -1422,7 +1425,7 @@
 /***********************************************************************
  *           DispatchMessage16   (USER.114)
  */
-LONG DispatchMessage16( const MSG16* msg )
+LONG WINAPI DispatchMessage16( const MSG16* msg )
 {
     WND * wndPtr;
     LONG retval;
@@ -1467,7 +1470,7 @@
 /***********************************************************************
  *           DispatchMessage32A   (USER32.140)
  */
-LONG DispatchMessage32A( const MSG32* msg )
+LONG WINAPI DispatchMessage32A( const MSG32* msg )
 {
     WND * wndPtr;
     LONG retval;
@@ -1514,7 +1517,7 @@
 /***********************************************************************
  *           DispatchMessage32W   (USER32.141)
  */
-LONG DispatchMessage32W( const MSG32* msg )
+LONG WINAPI DispatchMessage32W( const MSG32* msg )
 {
     WND * wndPtr;
     LONG retval;
@@ -1561,7 +1564,7 @@
 /***********************************************************************
  *           RegisterWindowMessage16   (USER.118)
  */
-WORD RegisterWindowMessage16( SEGPTR str )
+WORD WINAPI RegisterWindowMessage16( SEGPTR str )
 {
     dprintf_msg(stddeb, "RegisterWindowMessage16: %08lx\n", (DWORD)str );
     return GlobalAddAtom16( str );
@@ -1571,7 +1574,7 @@
 /***********************************************************************
  *           RegisterWindowMessage32A   (USER32.436)
  */
-WORD RegisterWindowMessage32A( LPCSTR str )
+WORD WINAPI RegisterWindowMessage32A( LPCSTR str )
 {
     dprintf_msg(stddeb, "RegisterWindowMessage32A: %s\n", str );
     return GlobalAddAtom32A( str );
@@ -1581,7 +1584,7 @@
 /***********************************************************************
  *           RegisterWindowMessage32W   (USER32.437)
  */
-WORD RegisterWindowMessage32W( LPCWSTR str )
+WORD WINAPI RegisterWindowMessage32W( LPCWSTR str )
 {
     dprintf_msg(stddeb, "RegisterWindowMessage32W: %p\n", str );
     return GlobalAddAtom32W( str );
@@ -1591,7 +1594,7 @@
 /***********************************************************************
  *           GetTickCount   (USER.13) (KERNEL32.299)
  */
-DWORD GetTickCount(void)
+DWORD WINAPI GetTickCount(void)
 {
     struct timeval t;
     gettimeofday( &t, NULL );
@@ -1604,7 +1607,7 @@
  *
  * (effectively identical to GetTickCount)
  */
-DWORD GetCurrentTime16(void)
+DWORD WINAPI GetCurrentTime16(void)
 {
     return GetTickCount();
 }
@@ -1613,7 +1616,7 @@
 /***********************************************************************
  *           InSendMessage16    (USER.192)
  */
-BOOL16 InSendMessage16(void)
+BOOL16 WINAPI InSendMessage16(void)
 {
     return InSendMessage32();
 }
@@ -1622,7 +1625,7 @@
 /***********************************************************************
  *           InSendMessage32    (USER32.319)
  */
-BOOL32 InSendMessage32(void)
+BOOL32 WINAPI InSendMessage32(void)
 {
     MESSAGEQUEUE *queue;
 
diff --git a/windows/msgbox.c b/windows/msgbox.c
index 27a9793..a2cb5be 100644
--- a/windows/msgbox.c
+++ b/windows/msgbox.c
@@ -26,8 +26,8 @@
  *
  * Dialog procedure for message boxes.
  */
-static LRESULT MSGBOX_DlgProc( HWND32 hwnd, UINT32 message,
-                               WPARAM32 wParam, LPARAM lParam )
+static LRESULT CALLBACK MSGBOX_DlgProc( HWND32 hwnd, UINT32 message,
+                                        WPARAM32 wParam, LPARAM lParam )
 {
   LPMSGBOX lpmb;
   RECT32 rect, textrect;
@@ -184,7 +184,7 @@
 /**************************************************************************
  *           MessageBox16   (USER.1)
  */
-INT16 MessageBox16( HWND16 hwnd, LPCSTR text, LPCSTR title, UINT16 type )
+INT16 WINAPI MessageBox16( HWND16 hwnd, LPCSTR text, LPCSTR title, UINT16 type)
 {
     return MessageBox32A( hwnd, text, title, type );
 }
@@ -193,7 +193,7 @@
 /**************************************************************************
  *           MessageBox32A   (USER32.390)
  */
-INT32 MessageBox32A( HWND32 hWnd, LPCSTR text, LPCSTR title, UINT32 type )
+INT32 WINAPI MessageBox32A(HWND32 hWnd, LPCSTR text, LPCSTR title, UINT32 type)
 {
     MSGBOX mbox;
 
@@ -211,7 +211,8 @@
 /**************************************************************************
  *           MessageBox32W   (USER32.395)
  */
-INT32 MessageBox32W( HWND32 hwnd, LPCWSTR text, LPCWSTR title, UINT32 type )
+INT32 WINAPI MessageBox32W( HWND32 hwnd, LPCWSTR text, LPCWSTR title,
+                            UINT32 type )
 {
     LPSTR titleA = HEAP_strdupWtoA( GetProcessHeap(), 0, title );
     LPSTR textA  = HEAP_strdupWtoA( GetProcessHeap(), 0, text );
@@ -225,8 +226,9 @@
 /**************************************************************************
  *           MessageBoxEx32A   (USER32.391)
  */
-INT32
-MessageBoxEx32A(HWND32 hWnd,LPCSTR text,LPCSTR title,UINT32 type,WORD langid) {
+INT32 WINAPI MessageBoxEx32A( HWND32 hWnd, LPCSTR text, LPCSTR title,
+                              UINT32 type, WORD langid )
+{
     /* ignore language id for now */
     return MessageBox32A(hWnd,text,title,type);
 }
@@ -234,8 +236,8 @@
 /**************************************************************************
  *           MessageBoxEx32W   (USER32.392)
  */
-INT32
-MessageBoxEx32W(HWND32 hWnd,LPCWSTR text,LPCWSTR title,UINT32 type,WORD langid)
+INT32 WINAPI MessageBoxEx32W( HWND32 hWnd, LPCWSTR text, LPCWSTR title,
+                              UINT32 type, WORD langid )
 {
     /* ignore language id for now */
     return MessageBox32W(hWnd,text,title,type);
@@ -245,7 +247,7 @@
 /**************************************************************************
  *           FatalAppExit16   (KERNEL.137)
  */
-void FatalAppExit16( UINT16 action, LPCSTR str )
+void WINAPI FatalAppExit16( UINT16 action, LPCSTR str )
 {
     FatalAppExit32A( action, str );
 }
@@ -254,7 +256,7 @@
 /**************************************************************************
  *           FatalAppExit32A   (KERNEL32.108)
  */
-void FatalAppExit32A( UINT32 action, LPCSTR str )
+void WINAPI FatalAppExit32A( UINT32 action, LPCSTR str )
 {
     MessageBox32A( 0, str, NULL, MB_SYSTEMMODAL | MB_OK );
     TASK_KillCurrentTask(0);
@@ -264,7 +266,7 @@
 /**************************************************************************
  *           FatalAppExit32W   (KERNEL32.109)
  */
-void FatalAppExit32W( UINT32 action, LPCWSTR str )
+void WINAPI FatalAppExit32W( UINT32 action, LPCWSTR str )
 {
     MessageBox32W( 0, str, NULL, MB_SYSTEMMODAL | MB_OK );
     TASK_KillCurrentTask(0);
diff --git a/windows/nonclient.c b/windows/nonclient.c
index b1ef586..03f6091 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -164,7 +164,7 @@
 /***********************************************************************
  *           AdjustWindowRect16    (USER.102)
  */
-BOOL16 AdjustWindowRect16( LPRECT16 rect, DWORD style, BOOL16 menu )
+BOOL16 WINAPI AdjustWindowRect16( LPRECT16 rect, DWORD style, BOOL16 menu )
 {
     return AdjustWindowRectEx16( rect, style, menu, 0 );
 }
@@ -173,7 +173,7 @@
 /***********************************************************************
  *           AdjustWindowRect32    (USER32.)
  */
-BOOL32 AdjustWindowRect32( LPRECT32 rect, DWORD style, BOOL32 menu )
+BOOL32 WINAPI AdjustWindowRect32( LPRECT32 rect, DWORD style, BOOL32 menu )
 {
     return AdjustWindowRectEx32( rect, style, menu, 0 );
 }
@@ -182,8 +182,8 @@
 /***********************************************************************
  *           AdjustWindowRectEx16    (USER.454)
  */
-BOOL16 AdjustWindowRectEx16( LPRECT16 rect, DWORD style,
-                             BOOL16 menu, DWORD exStyle )
+BOOL16 WINAPI AdjustWindowRectEx16( LPRECT16 rect, DWORD style,
+                                    BOOL16 menu, DWORD exStyle )
 {
       /* Correct the window style */
 
@@ -209,8 +209,8 @@
 /***********************************************************************
  *           AdjustWindowRectEx32    (USER32.)
  */
-BOOL32 AdjustWindowRectEx32( LPRECT32 rect, DWORD style,
-                             BOOL32 menu, DWORD exStyle )
+BOOL32 WINAPI AdjustWindowRectEx32( LPRECT32 rect, DWORD style,
+                                    BOOL32 menu, DWORD exStyle )
 {
     RECT16 rect16;
     BOOL32 ret;
diff --git a/windows/painting.c b/windows/painting.c
index 48f0d51..77a3748 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -92,7 +92,7 @@
 /***********************************************************************
  *           BeginPaint16    (USER.39)
  */
-HDC16 BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps ) 
+HDC16 WINAPI BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps ) 
 {
     BOOL32 bIcon;
     HRGN32 hrgnUpdate;
@@ -156,7 +156,7 @@
 /***********************************************************************
  *           BeginPaint32    (USER32.9)
  */
-HDC32 BeginPaint32( HWND32 hwnd, PAINTSTRUCT32 *lps )
+HDC32 WINAPI BeginPaint32( HWND32 hwnd, PAINTSTRUCT32 *lps )
 {
     PAINTSTRUCT16 ps;
 
@@ -176,7 +176,7 @@
 /***********************************************************************
  *           EndPaint16    (USER.40)
  */
-BOOL16 EndPaint16( HWND16 hwnd, const PAINTSTRUCT16* lps )
+BOOL16 WINAPI EndPaint16( HWND16 hwnd, const PAINTSTRUCT16* lps )
 {
     ReleaseDC16( hwnd, lps->hdc );
     ShowCaret32( hwnd );
@@ -187,7 +187,7 @@
 /***********************************************************************
  *           EndPaint32    (USER32.175)
  */
-BOOL32 EndPaint32( HWND32 hwnd, const PAINTSTRUCT32 *lps )
+BOOL32 WINAPI EndPaint32( HWND32 hwnd, const PAINTSTRUCT32 *lps )
 {
     ReleaseDC32( hwnd, lps->hdc );
     ShowCaret32( hwnd );
@@ -198,7 +198,7 @@
 /***********************************************************************
  *           FillWindow    (USER.324)
  */
-void FillWindow( HWND16 hwndParent, HWND16 hwnd, HDC16 hdc, HBRUSH16 hbrush )
+void WINAPI FillWindow( HWND16 hwndParent, HWND16 hwnd, HDC16 hdc, HBRUSH16 hbrush )
 {
     RECT16 rect;
     GetClientRect16( hwnd, &rect );
@@ -210,8 +210,8 @@
 /***********************************************************************
  *           PaintRect    (USER.325)
  */
-void PaintRect( HWND16 hwndParent, HWND16 hwnd, HDC16 hdc,
-                HBRUSH16 hbrush, const RECT16 *rect)
+void WINAPI PaintRect( HWND16 hwndParent, HWND16 hwnd, HDC16 hdc,
+                       HBRUSH16 hbrush, const RECT16 *rect)
 {
       /* Send WM_CTLCOLOR message if needed */
 
@@ -229,7 +229,7 @@
 /***********************************************************************
  *           GetControlBrush    (USER.326)
  */
-HBRUSH16 GetControlBrush( HWND16 hwnd, HDC16 hdc, UINT16 control )
+HBRUSH16 WINAPI GetControlBrush( HWND16 hwnd, HDC16 hdc, UINT16 control )
 {
     return (HBRUSH16)SendMessage32A( GetParent32(hwnd), WM_CTLCOLOR+control,
                                      (WPARAM32)hdc, (LPARAM)hwnd );
@@ -462,8 +462,8 @@
 /***********************************************************************
  *           RedrawWindow32    (USER32.425)
  */
-BOOL32 RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
-                       HRGN32 hrgnUpdate, UINT32 flags )
+BOOL32 WINAPI RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
+                              HRGN32 hrgnUpdate, UINT32 flags )
 {
     return PAINT_RedrawWindow( hwnd, rectUpdate, hrgnUpdate, flags, 0 );
 }
@@ -472,8 +472,8 @@
 /***********************************************************************
  *           RedrawWindow16    (USER.290)
  */
-BOOL16 RedrawWindow16( HWND16 hwnd, const RECT16 *rectUpdate,
-                       HRGN16 hrgnUpdate, UINT16 flags )
+BOOL16 WINAPI RedrawWindow16( HWND16 hwnd, const RECT16 *rectUpdate,
+                              HRGN16 hrgnUpdate, UINT16 flags )
 {
     if (rectUpdate)
     {
@@ -489,7 +489,7 @@
 /***********************************************************************
  *           UpdateWindow16   (USER.124)
  */
-void UpdateWindow16( HWND16 hwnd )
+void WINAPI UpdateWindow16( HWND16 hwnd )
 {
     PAINT_RedrawWindow( hwnd, NULL, 0, RDW_UPDATENOW | RDW_NOCHILDREN, 0 );
 }
@@ -497,7 +497,7 @@
 /***********************************************************************
  *           UpdateWindow32   (USER32.566)
  */
-void UpdateWindow32( HWND32 hwnd )
+void WINAPI UpdateWindow32( HWND32 hwnd )
 {
     PAINT_RedrawWindow( hwnd, NULL, 0, RDW_UPDATENOW | RDW_NOCHILDREN, 0 );
 }
@@ -505,7 +505,7 @@
 /***********************************************************************
  *           InvalidateRgn16   (USER.126)
  */
-void InvalidateRgn16( HWND16 hwnd, HRGN16 hrgn, BOOL16 erase )
+void WINAPI InvalidateRgn16( HWND16 hwnd, HRGN16 hrgn, BOOL16 erase )
 {
     PAINT_RedrawWindow((HWND32)hwnd, NULL, (HRGN32)hrgn, 
 		       RDW_INVALIDATE | (erase ? RDW_ERASE : 0), 0 );
@@ -515,7 +515,7 @@
 /***********************************************************************
  *           InvalidateRgn32   (USER32.328)
  */
-void InvalidateRgn32( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
+void WINAPI InvalidateRgn32( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
 {
     PAINT_RedrawWindow(hwnd, NULL, hrgn, RDW_INVALIDATE | (erase ? RDW_ERASE : 0), 0 );
 }
@@ -524,7 +524,7 @@
 /***********************************************************************
  *           InvalidateRect16   (USER.125)
  */
-void InvalidateRect16( HWND16 hwnd, const RECT16 *rect, BOOL16 erase )
+void WINAPI InvalidateRect16( HWND16 hwnd, const RECT16 *rect, BOOL16 erase )
 {
     RedrawWindow16( hwnd, rect, 0, RDW_INVALIDATE | (erase ? RDW_ERASE : 0) );
 }
@@ -533,7 +533,7 @@
 /***********************************************************************
  *           InvalidateRect32   (USER32.327)
  */
-void InvalidateRect32( HWND32 hwnd, const RECT32 *rect, BOOL32 erase )
+void WINAPI InvalidateRect32( HWND32 hwnd, const RECT32 *rect, BOOL32 erase )
 {
     PAINT_RedrawWindow( hwnd, rect, 0, 
 			RDW_INVALIDATE | (erase ? RDW_ERASE : 0), 0 );
@@ -543,7 +543,7 @@
 /***********************************************************************
  *           ValidateRgn16   (USER.128)
  */
-void ValidateRgn16( HWND16 hwnd, HRGN16 hrgn )
+void WINAPI ValidateRgn16( HWND16 hwnd, HRGN16 hrgn )
 {
     PAINT_RedrawWindow( (HWND32)hwnd, NULL, (HRGN32)hrgn, 
 			RDW_VALIDATE | RDW_NOCHILDREN, 0 );
@@ -553,7 +553,7 @@
 /***********************************************************************
  *           ValidateRgn32   (USER32.571)
  */
-void ValidateRgn32( HWND32 hwnd, HRGN32 hrgn )
+void WINAPI ValidateRgn32( HWND32 hwnd, HRGN32 hrgn )
 {
     PAINT_RedrawWindow( hwnd, NULL, hrgn, RDW_VALIDATE | RDW_NOCHILDREN, 0 );
 }
@@ -562,7 +562,7 @@
 /***********************************************************************
  *           ValidateRect16   (USER.127)
  */
-void ValidateRect16( HWND16 hwnd, const RECT16 *rect )
+void WINAPI ValidateRect16( HWND16 hwnd, const RECT16 *rect )
 {
     RedrawWindow16( hwnd, rect, 0, RDW_VALIDATE | RDW_NOCHILDREN );
 }
@@ -571,7 +571,7 @@
 /***********************************************************************
  *           ValidateRect32   (USER32.570)
  */
-void ValidateRect32( HWND32 hwnd, const RECT32 *rect )
+void WINAPI ValidateRect32( HWND32 hwnd, const RECT32 *rect )
 {
     PAINT_RedrawWindow( hwnd, rect, 0, RDW_VALIDATE | RDW_NOCHILDREN, 0 );
 }
@@ -580,7 +580,7 @@
 /***********************************************************************
  *           GetUpdateRect16   (USER.190)
  */
-BOOL16 GetUpdateRect16( HWND16 hwnd, LPRECT16 rect, BOOL16 erase )
+BOOL16 WINAPI GetUpdateRect16( HWND16 hwnd, LPRECT16 rect, BOOL16 erase )
 {
     RECT32 r;
     BOOL16 ret;
@@ -595,7 +595,7 @@
 /***********************************************************************
  *           GetUpdateRect32   (USER32.296)
  */
-BOOL32 GetUpdateRect32( HWND32 hwnd, LPRECT32 rect, BOOL32 erase )
+BOOL32 WINAPI GetUpdateRect32( HWND32 hwnd, LPRECT32 rect, BOOL32 erase )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return FALSE;
@@ -618,7 +618,7 @@
 /***********************************************************************
  *           GetUpdateRgn16   (USER.237)
  */
-INT16 GetUpdateRgn16( HWND16 hwnd, HRGN16 hrgn, BOOL16 erase )
+INT16 WINAPI GetUpdateRgn16( HWND16 hwnd, HRGN16 hrgn, BOOL16 erase )
 {
     return GetUpdateRgn32( hwnd, hrgn, erase );
 }
@@ -627,7 +627,7 @@
 /***********************************************************************
  *           GetUpdateRgn32   (USER32.297)
  */
-INT32 GetUpdateRgn32( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
+INT32 WINAPI GetUpdateRgn32( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
 {
     INT32 retval;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -647,7 +647,7 @@
 /***********************************************************************
  *           ExcludeUpdateRgn16   (USER.238)
  */
-INT16 ExcludeUpdateRgn16( HDC16 hdc, HWND16 hwnd )
+INT16 WINAPI ExcludeUpdateRgn16( HDC16 hdc, HWND16 hwnd )
 {
     return ExcludeUpdateRgn32( hdc, hwnd );
 }
@@ -656,7 +656,7 @@
 /***********************************************************************
  *           ExcludeUpdateRgn32   (USER32.194)
  */
-INT32 ExcludeUpdateRgn32( HDC32 hdc, HWND32 hwnd )
+INT32 WINAPI ExcludeUpdateRgn32( HDC32 hdc, HWND32 hwnd )
 {
     RECT32 rect;
     WND * wndPtr;
diff --git a/windows/property.c b/windows/property.c
index ab6daf4..09eebed 100644
--- a/windows/property.c
+++ b/windows/property.c
@@ -47,7 +47,7 @@
 /***********************************************************************
  *           GetProp16   (USER.25)
  */
-HANDLE16 GetProp16( HWND16 hwnd, LPCSTR str )
+HANDLE16 WINAPI GetProp16( HWND16 hwnd, LPCSTR str )
 {
     return (HANDLE16)GetProp32A( hwnd, str );
 }
@@ -56,7 +56,7 @@
 /***********************************************************************
  *           GetProp32A   (USER32.280)
  */
-HANDLE32 GetProp32A( HWND32 hwnd, LPCSTR str )
+HANDLE32 WINAPI GetProp32A( HWND32 hwnd, LPCSTR str )
 {
     PROPERTY *prop = PROP_FindProp( hwnd, str );
 
@@ -74,7 +74,7 @@
 /***********************************************************************
  *           GetProp32W   (USER32.281)
  */
-HANDLE32 GetProp32W( HWND32 hwnd, LPCWSTR str )
+HANDLE32 WINAPI GetProp32W( HWND32 hwnd, LPCWSTR str )
 {
     LPSTR strA;
     HANDLE32 ret;
@@ -90,7 +90,7 @@
 /***********************************************************************
  *           SetProp16   (USER.26)
  */
-BOOL16 SetProp16( HWND16 hwnd, LPCSTR str, HANDLE16 handle )
+BOOL16 WINAPI SetProp16( HWND16 hwnd, LPCSTR str, HANDLE16 handle )
 {
     return (BOOL16)SetProp32A( hwnd, str, handle );
 }
@@ -99,7 +99,7 @@
 /***********************************************************************
  *           SetProp32A   (USER32.496)
  */
-BOOL32 SetProp32A( HWND32 hwnd, LPCSTR str, HANDLE32 handle )
+BOOL32 WINAPI SetProp32A( HWND32 hwnd, LPCSTR str, HANDLE32 handle )
 {
     PROPERTY *prop;
 
@@ -131,7 +131,7 @@
 /***********************************************************************
  *           SetProp32W   (USER32.497)
  */
-BOOL32 SetProp32W( HWND32 hwnd, LPCWSTR str, HANDLE32 handle )
+BOOL32 WINAPI SetProp32W( HWND32 hwnd, LPCWSTR str, HANDLE32 handle )
 {
     BOOL32 ret;
     LPSTR strA;
@@ -148,7 +148,7 @@
 /***********************************************************************
  *           RemoveProp16   (USER.24)
  */
-HANDLE16 RemoveProp16( HWND16 hwnd, LPCSTR str )
+HANDLE16 WINAPI RemoveProp16( HWND16 hwnd, LPCSTR str )
 {
     return (HANDLE16)RemoveProp32A( hwnd, str );
 }
@@ -157,7 +157,7 @@
 /***********************************************************************
  *           RemoveProp32A   (USER32.441)
  */
-HANDLE32 RemoveProp32A( HWND32 hwnd, LPCSTR str )
+HANDLE32 WINAPI RemoveProp32A( HWND32 hwnd, LPCSTR str )
 {
     HANDLE32 handle;
     PROPERTY **pprop, *prop;
@@ -195,7 +195,7 @@
 /***********************************************************************
  *           RemoveProp32W   (USER32.442)
  */
-HANDLE32 RemoveProp32W( HWND32 hwnd, LPCWSTR str )
+HANDLE32 WINAPI RemoveProp32W( HWND32 hwnd, LPCWSTR str )
 {
     LPSTR strA;
     HANDLE32 ret;
@@ -231,7 +231,7 @@
 /***********************************************************************
  *           EnumProps16   (USER.27)
  */
-INT16 EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
+INT16 WINAPI EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
 {
     PROPERTY *prop, *next;
     WND *pWnd;
@@ -257,7 +257,7 @@
 /***********************************************************************
  *           EnumProps32A   (USER32.185)
  */
-INT32 EnumProps32A( HWND32 hwnd, PROPENUMPROC32A func )
+INT32 WINAPI EnumProps32A( HWND32 hwnd, PROPENUMPROC32A func )
 {
     return EnumPropsEx32A( hwnd, (PROPENUMPROCEX32A)func, 0 );
 }
@@ -266,7 +266,7 @@
 /***********************************************************************
  *           EnumProps32W   (USER32.188)
  */
-INT32 EnumProps32W( HWND32 hwnd, PROPENUMPROC32W func )
+INT32 WINAPI EnumProps32W( HWND32 hwnd, PROPENUMPROC32W func )
 {
     return EnumPropsEx32W( hwnd, (PROPENUMPROCEX32W)func, 0 );
 }
@@ -275,7 +275,7 @@
 /***********************************************************************
  *           EnumPropsEx32A   (USER32.186)
  */
-INT32 EnumPropsEx32A( HWND32 hwnd, PROPENUMPROCEX32A func, LPARAM lParam )
+INT32 WINAPI EnumPropsEx32A(HWND32 hwnd, PROPENUMPROCEX32A func, LPARAM lParam)
 {
     PROPERTY *prop, *next;
     WND *pWnd;
@@ -302,7 +302,7 @@
 /***********************************************************************
  *           EnumPropsEx32W   (USER32.187)
  */
-INT32 EnumPropsEx32W( HWND32 hwnd, PROPENUMPROCEX32W func, LPARAM lParam )
+INT32 WINAPI EnumPropsEx32W(HWND32 hwnd, PROPENUMPROCEX32W func, LPARAM lParam)
 {
     PROPERTY *prop, *next;
     WND *pWnd;
diff --git a/windows/queue.c b/windows/queue.c
index 4872a35..a0f50c4 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -668,7 +668,7 @@
 /***********************************************************************
  *           PostQuitMessage16   (USER.6)
  */
-void PostQuitMessage16( INT16 exitCode )
+void WINAPI PostQuitMessage16( INT16 exitCode )
 {
     PostQuitMessage32( exitCode );
 }
@@ -677,7 +677,7 @@
 /***********************************************************************
  *           PostQuitMessage32   (USER32.420)
  */
-void PostQuitMessage32( INT32 exitCode )
+void WINAPI PostQuitMessage32( INT32 exitCode )
 {
     MESSAGEQUEUE *queue;
 
@@ -690,7 +690,7 @@
 /***********************************************************************
  *           GetWindowTask16   (USER.224)
  */
-HTASK16 GetWindowTask16( HWND16 hwnd )
+HTASK16 WINAPI GetWindowTask16( HWND16 hwnd )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
@@ -701,7 +701,7 @@
 /***********************************************************************
  *           GetWindowThreadProcessId   (USER32.312)
  */
-DWORD GetWindowThreadProcessId( HWND32 hwnd, LPDWORD process )
+DWORD WINAPI GetWindowThreadProcessId( HWND32 hwnd, LPDWORD process )
 {
     HTASK16 htask;
     TDB	*tdb;
@@ -725,7 +725,7 @@
 /***********************************************************************
  *           SetMessageQueue16   (USER.266)
  */
-BOOL16 SetMessageQueue16( INT16 size )
+BOOL16 WINAPI SetMessageQueue16( INT16 size )
 {
     return SetMessageQueue32( size );
 }
@@ -734,7 +734,7 @@
 /***********************************************************************
  *           SetMessageQueue32   (USER32.493)
  */
-BOOL32 SetMessageQueue32( INT32 size )
+BOOL32 WINAPI SetMessageQueue32( INT32 size )
 {
     HQUEUE16 hQueue, hNewQueue;
     MESSAGEQUEUE *queuePtr;
@@ -781,7 +781,7 @@
 /***********************************************************************
  *           GetQueueStatus16   (USER.334)
  */
-DWORD GetQueueStatus16( UINT16 flags )
+DWORD WINAPI GetQueueStatus16( UINT16 flags )
 {
     MESSAGEQUEUE *queue;
     DWORD ret;
@@ -796,7 +796,7 @@
 /***********************************************************************
  *           GetInputState16   (USER.335)
  */
-BOOL16 GetInputState16(void)
+BOOL16 WINAPI GetInputState16(void)
 {
     return GetInputState32();
 }
@@ -805,7 +805,7 @@
 /***********************************************************************
  *           GetInputState32   (USER32.243)
  */
-BOOL32 GetInputState32(void)
+BOOL32 WINAPI GetInputState32(void)
 {
     MESSAGEQUEUE *queue;
 
@@ -818,7 +818,7 @@
 /***********************************************************************
  *           GetMessagePos   (USER.119) (USER32.271)
  */
-DWORD GetMessagePos(void)
+DWORD WINAPI GetMessagePos(void)
 {
     MESSAGEQUEUE *queue;
 
@@ -830,7 +830,7 @@
 /***********************************************************************
  *           GetMessageTime   (USER.120) (USER32.272)
  */
-LONG GetMessageTime(void)
+LONG WINAPI GetMessageTime(void)
 {
     MESSAGEQUEUE *queue;
 
@@ -842,7 +842,7 @@
 /***********************************************************************
  *           GetMessageExtraInfo   (USER.288) (USER32.270)
  */
-LONG GetMessageExtraInfo(void)
+LONG WINAPI GetMessageExtraInfo(void)
 {
     MESSAGEQUEUE *queue;
 
diff --git a/windows/rect.c b/windows/rect.c
index 61d76c2..7605666 100644
--- a/windows/rect.c
+++ b/windows/rect.c
@@ -11,7 +11,8 @@
 /***********************************************************************
  *           SetRect16    (USER.72)
  */
-void SetRect16(LPRECT16 rect, INT16 left, INT16 top, INT16 right, INT16 bottom)
+void WINAPI SetRect16( LPRECT16 rect, INT16 left, INT16 top,
+                       INT16 right, INT16 bottom )
 {
     rect->left   = left;
     rect->right  = right;
@@ -23,7 +24,8 @@
 /***********************************************************************
  *           SetRect32    (USER32.498)
  */
-void SetRect32(LPRECT32 rect, INT32 left, INT32 top, INT32 right, INT32 bottom)
+void WINAPI SetRect32( LPRECT32 rect, INT32 left, INT32 top,
+                       INT32 right, INT32 bottom )
 {
     rect->left   = left;
     rect->right  = right;
@@ -35,7 +37,7 @@
 /***********************************************************************
  *           SetRectEmpty16    (USER.73)
  */
-void SetRectEmpty16( LPRECT16 rect )
+void WINAPI SetRectEmpty16( LPRECT16 rect )
 {
     rect->left = rect->right = rect->top = rect->bottom = 0;
 }
@@ -44,7 +46,7 @@
 /***********************************************************************
  *           SetRectEmpty32    (USER32.499)
  */
-void SetRectEmpty32( LPRECT32 rect )
+void WINAPI SetRectEmpty32( LPRECT32 rect )
 {
     rect->left = rect->right = rect->top = rect->bottom = 0;
 }
@@ -53,7 +55,7 @@
 /***********************************************************************
  *           CopyRect16    (USER.74)
  */
-BOOL16 CopyRect16( RECT16 *dest, const RECT16 *src )
+BOOL16 WINAPI CopyRect16( RECT16 *dest, const RECT16 *src )
 {
     *dest = *src;
     return TRUE;
@@ -63,7 +65,7 @@
 /***********************************************************************
  *           CopyRect32    (USER32.61)
  */
-BOOL32 CopyRect32( RECT32 *dest, const RECT32 *src )
+BOOL32 WINAPI CopyRect32( RECT32 *dest, const RECT32 *src )
 {
     *dest = *src;
     return TRUE;
@@ -73,7 +75,7 @@
 /***********************************************************************
  *           IsRectEmpty16    (USER.75)
  */
-BOOL16 IsRectEmpty16( const RECT16 *rect )
+BOOL16 WINAPI IsRectEmpty16( const RECT16 *rect )
 {
     return ((rect->left == rect->right) || (rect->top == rect->bottom));
 }
@@ -82,7 +84,7 @@
 /***********************************************************************
  *           IsRectEmpty32    (USER32.346)
  */
-BOOL32 IsRectEmpty32( const RECT32 *rect )
+BOOL32 WINAPI IsRectEmpty32( const RECT32 *rect )
 {
     return ((rect->left == rect->right) || (rect->top == rect->bottom));
 }
@@ -91,7 +93,7 @@
 /***********************************************************************
  *           PtInRect16    (USER.76)
  */
-BOOL16 PtInRect16( const RECT16 *rect, POINT16 pt )
+BOOL16 WINAPI PtInRect16( const RECT16 *rect, POINT16 pt )
 {
     return ((pt.x >= rect->left) && (pt.x < rect->right) &&
 	    (pt.y >= rect->top) && (pt.y < rect->bottom));
@@ -101,7 +103,7 @@
 /***********************************************************************
  *           PtInRect32    (USER32.423)
  */
-BOOL32 PtInRect32( const RECT32 *rect, POINT32 pt )
+BOOL32 WINAPI PtInRect32( const RECT32 *rect, POINT32 pt )
 {
     return ((pt.x >= rect->left) && (pt.x < rect->right) &&
 	    (pt.y >= rect->top) && (pt.y < rect->bottom));
@@ -111,7 +113,7 @@
 /***********************************************************************
  *           OffsetRect16    (USER.77)
  */
-void OffsetRect16( LPRECT16 rect, INT16 x, INT16 y )
+void WINAPI OffsetRect16( LPRECT16 rect, INT16 x, INT16 y )
 {
     rect->left   += x;
     rect->right  += x;
@@ -123,7 +125,7 @@
 /***********************************************************************
  *           OffsetRect32    (USER32.405)
  */
-void OffsetRect32( LPRECT32 rect, INT32 x, INT32 y )
+void WINAPI OffsetRect32( LPRECT32 rect, INT32 x, INT32 y )
 {
     rect->left   += x;
     rect->right  += x;
@@ -135,7 +137,7 @@
 /***********************************************************************
  *           InflateRect16    (USER.78)
  */
-void InflateRect16( LPRECT16 rect, INT16 x, INT16 y )
+void WINAPI InflateRect16( LPRECT16 rect, INT16 x, INT16 y )
 {
     rect->left   -= x;
     rect->top 	 -= y;
@@ -147,7 +149,7 @@
 /***********************************************************************
  *           InflateRect32    (USER32.320)
  */
-void InflateRect32( LPRECT32 rect, INT32 x, INT32 y )
+void WINAPI InflateRect32( LPRECT32 rect, INT32 x, INT32 y )
 {
     rect->left   -= x;
     rect->top 	 -= y;
@@ -159,7 +161,8 @@
 /***********************************************************************
  *           IntersectRect16    (USER.79)
  */
-BOOL16 IntersectRect16( LPRECT16 dest, const RECT16 *src1, const RECT16 *src2 )
+BOOL16 WINAPI IntersectRect16( LPRECT16 dest, const RECT16 *src1,
+                               const RECT16 *src2 )
 {
     if (IsRectEmpty16(src1) || IsRectEmpty16(src2) ||
 	(src1->left >= src2->right) || (src2->left >= src1->right) ||
@@ -179,7 +182,8 @@
 /***********************************************************************
  *           IntersectRect32    (USER32.326)
  */
-BOOL32 IntersectRect32( LPRECT32 dest, const RECT32 *src1, const RECT32 *src2 )
+BOOL32 WINAPI IntersectRect32( LPRECT32 dest, const RECT32 *src1,
+                               const RECT32 *src2 )
 {
     if (IsRectEmpty32(src1) || IsRectEmpty32(src2) ||
 	(src1->left >= src2->right) || (src2->left >= src1->right) ||
@@ -199,7 +203,8 @@
 /***********************************************************************
  *           UnionRect16    (USER.80)
  */
-BOOL16 UnionRect16( LPRECT16 dest, const RECT16 *src1, const RECT16 *src2 )
+BOOL16 WINAPI UnionRect16( LPRECT16 dest, const RECT16 *src1,
+                           const RECT16 *src2 )
 {
     if (IsRectEmpty16(src1))
     {
@@ -228,7 +233,8 @@
 /***********************************************************************
  *           UnionRect32    (USER32.558)
  */
-BOOL32 UnionRect32( LPRECT32 dest, const RECT32 *src1, const RECT32 *src2 )
+BOOL32 WINAPI UnionRect32( LPRECT32 dest, const RECT32 *src1,
+                           const RECT32 *src2 )
 {
     if (IsRectEmpty32(src1))
     {
@@ -257,7 +263,7 @@
 /***********************************************************************
  *           EqualRect16    (USER.244)
  */
-BOOL16 EqualRect16( const RECT16* rect1, const RECT16* rect2 )
+BOOL16 WINAPI EqualRect16( const RECT16* rect1, const RECT16* rect2 )
 {
     return ((rect1->left == rect2->left) && (rect1->right == rect2->right) &&
 	    (rect1->top == rect2->top) && (rect1->bottom == rect2->bottom));
@@ -267,7 +273,7 @@
 /***********************************************************************
  *           EqualRect32    (USER32.193)
  */
-BOOL32 EqualRect32( const RECT32* rect1, const RECT32* rect2 )
+BOOL32 WINAPI EqualRect32( const RECT32* rect1, const RECT32* rect2 )
 {
     return ((rect1->left == rect2->left) && (rect1->right == rect2->right) &&
 	    (rect1->top == rect2->top) && (rect1->bottom == rect2->bottom));
@@ -277,7 +283,8 @@
 /***********************************************************************
  *           SubtractRect16    (USER.373)
  */
-BOOL16 SubtractRect16( LPRECT16 dest, const RECT16 *src1, const RECT16 *src2 )
+BOOL16 WINAPI SubtractRect16( LPRECT16 dest, const RECT16 *src1,
+                              const RECT16 *src2 )
 {
     RECT16 tmp;
 
@@ -312,7 +319,8 @@
 /***********************************************************************
  *           SubtractRect32    (USER32.535)
  */
-BOOL32 SubtractRect32( LPRECT32 dest, const RECT32 *src1, const RECT32 *src2 )
+BOOL32 WINAPI SubtractRect32( LPRECT32 dest, const RECT32 *src1,
+                              const RECT32 *src2 )
 {
     RECT32 tmp;
 
diff --git a/windows/scroll.c b/windows/scroll.c
index 85371bf..fdc9f4a 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -26,8 +26,8 @@
 /*************************************************************************
  *             ScrollWindow16   (USER.61)
  */
-void ScrollWindow16( HWND16 hwnd, INT16 dx, INT16 dy, const RECT16 *rect,
-                     const RECT16 *clipRect )
+void WINAPI ScrollWindow16(HWND16 hwnd, INT16 dx, INT16 dy, const RECT16 *rect,
+                           const RECT16 *clipRect )
 {
     RECT32 rect32, clipRect32;
 
@@ -39,9 +39,11 @@
 
 /*************************************************************************
  *             ScrollWindow32   (USER32.449)
+ *
+ * FIXME: verify clipping region calculations
  */
-BOOL32 ScrollWindow32( HWND32 hwnd, INT32 dx, INT32 dy, const RECT32 *rect,
-                       const RECT32 *clipRect )
+BOOL32 WINAPI ScrollWindow32( HWND32 hwnd, INT32 dx, INT32 dy,
+                              const RECT32 *rect, const RECT32 *clipRect )
 {
     HDC32  	hdc;
     HRGN32 	hrgnUpdate,hrgnClip;
@@ -122,8 +124,9 @@
 /*************************************************************************
  *             ScrollDC16   (USER.221)
  */
-BOOL16 ScrollDC16( HDC16 hdc, INT16 dx, INT16 dy, const RECT16 *rect,
-                   const RECT16 *cliprc, HRGN16 hrgnUpdate, LPRECT16 rcUpdate )
+BOOL16 WINAPI ScrollDC16( HDC16 hdc, INT16 dx, INT16 dy, const RECT16 *rect,
+                          const RECT16 *cliprc, HRGN16 hrgnUpdate,
+                          LPRECT16 rcUpdate )
 {
     RECT32 rect32, clipRect32, rcUpdate32;
     BOOL16 ret;
@@ -143,8 +146,9 @@
  * Both 'rc' and 'rLClip' are in logical units but update info is 
  * returned in device coordinates.
  */
-BOOL32 ScrollDC32( HDC32 hdc, INT32 dx, INT32 dy, const RECT32 *rc,
-                   const RECT32 *prLClip, HRGN32 hrgnUpdate, LPRECT32 rcUpdate )
+BOOL32 WINAPI ScrollDC32( HDC32 hdc, INT32 dx, INT32 dy, const RECT32 *rc,
+                          const RECT32 *prLClip, HRGN32 hrgnUpdate,
+                          LPRECT32 rcUpdate )
 {
     RECT32 rDClip, rLClip;
     HRGN32 hrgnClip = 0;
@@ -294,9 +298,10 @@
 /*************************************************************************
  *             ScrollWindowEx16   (USER.319)
  */
-INT16 ScrollWindowEx16( HWND16 hwnd, INT16 dx, INT16 dy, const RECT16 *rect,
-                        const RECT16 *clipRect, HRGN16 hrgnUpdate,
-                        LPRECT16 rcUpdate, UINT16 flags )
+INT16 WINAPI ScrollWindowEx16( HWND16 hwnd, INT16 dx, INT16 dy,
+                               const RECT16 *rect, const RECT16 *clipRect,
+                               HRGN16 hrgnUpdate, LPRECT16 rcUpdate,
+                               UINT16 flags )
 {
     RECT32 rect32, clipRect32, rcUpdate32;
     BOOL16 ret;
@@ -313,7 +318,7 @@
 /*************************************************************************
  *             SCROLL_FixCaret
  */
-BOOL32 SCROLL_FixCaret(HWND32 hWnd, LPRECT32 lprc, UINT32 flags)
+static BOOL32 SCROLL_FixCaret(HWND32 hWnd, LPRECT32 lprc, UINT32 flags)
 {
    HWND32 hCaret = CARET_GetHwnd();
 
@@ -341,10 +346,13 @@
 
 /*************************************************************************
  *             ScrollWindowEx32   (USER32.450)
+ *
+ * NOTE: Use this function instead of ScrollWindow32
  */
-INT32 ScrollWindowEx32( HWND32 hwnd, INT32 dx, INT32 dy, const RECT32 *rect,
-                        const RECT32 *clipRect, HRGN32 hrgnUpdate,
-                        LPRECT32 rcUpdate, UINT32 flags )
+INT32 WINAPI ScrollWindowEx32( HWND32 hwnd, INT32 dx, INT32 dy,
+                               const RECT32 *rect, const RECT32 *clipRect,
+                               HRGN32 hrgnUpdate, LPRECT32 rcUpdate,
+                               UINT32 flags )
 {
     INT32  retVal = NULLREGION;
     BOOL32 bCaret = FALSE, bOwnRgn = TRUE;
@@ -390,12 +398,14 @@
 	    if( dy > 0 ) dst.y = (src.y = dc->w.DCOrgY + cliprc.top) + dy;
 	    else src.y = (dst.y = dc->w.DCOrgY + cliprc.top) - dy;
 
-	    if( bUpdate )
-  		XSetGraphicsExposures( display, dc->u.x.gc, True );
+	    if( bUpdate ) /* handles non-Wine windows hanging over the scrolled area */
+		XSetGraphicsExposures( display, dc->u.x.gc, True );
+
 	    XSetFunction( display, dc->u.x.gc, GXcopy );
 	    XCopyArea( display, dc->u.x.drawable, dc->u.x.drawable, dc->u.x.gc, 
 		       src.x, src.y, cliprc.right - cliprc.left - abs(dx),
 		       cliprc.bottom - cliprc.top - abs(dy), dst.x, dst.y );
+
 	    if( bUpdate )
 		XSetGraphicsExposures( display, dc->u.x.gc, False );
 
@@ -434,7 +444,7 @@
 	    for( w = wnd->child; w; w = w->next )
 	    {
 		 CONV_RECT16TO32( &w->rectWindow, &r );
-	         if( IntersectRect32(&r, &r, &cliprc) )
+	         if( !clipRect || IntersectRect32(&r, &r, &cliprc) )
 		     SetWindowPos32(w->hwndSelf, 0, w->rectWindow.left + dx,
 				    w->rectWindow.top  + dy, 0,0, SWP_NOZORDER |
 				    SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOREDRAW |
@@ -443,8 +453,8 @@
 	}
 
 	if( flags & (SW_INVALIDATE | SW_ERASE) )
-            PAINT_RedrawWindow( hwnd, NULL, hrgnUpdate, RDW_INVALIDATE | RDW_ERASE |
-					((flags & SW_ERASE) ? RDW_ERASENOW : 0), 0 );
+	    PAINT_RedrawWindow( hwnd, NULL, hrgnUpdate, RDW_INVALIDATE | RDW_ERASE |
+		((flags & SW_ERASE) ? RDW_ERASENOW : 0) | ((flags & SW_SCROLLCHILDREN) ? RDW_ALLCHILDREN : 0 ), 0 );
 
 	if( bCaret )
 	{
diff --git a/windows/syscolor.c b/windows/syscolor.c
index 14d06ea..9f86835 100644
--- a/windows/syscolor.c
+++ b/windows/syscolor.c
@@ -175,7 +175,7 @@
 /*************************************************************************
  *             GetSysColor16   (USER.180)
  */
-COLORREF GetSysColor16( INT16 nIndex )
+COLORREF WINAPI GetSysColor16( INT16 nIndex )
 {
     return SysColors[nIndex];
 }
@@ -184,7 +184,7 @@
 /*************************************************************************
  *             GetSysColor32   (USER32.288)
  */
-COLORREF GetSysColor32( INT32 nIndex )
+COLORREF WINAPI GetSysColor32( INT32 nIndex )
 {
     return SysColors[nIndex];
 }
@@ -193,8 +193,8 @@
 /*************************************************************************
  *             SetSysColors16   (USER.181)
  */
-VOID SetSysColors16( INT16 nChanges, const INT16 *lpSysColor,
-                     const COLORREF *lpColorValues )
+VOID WINAPI SetSysColors16( INT16 nChanges, const INT16 *lpSysColor,
+                            const COLORREF *lpColorValues )
 {
     int i;
 
@@ -217,8 +217,8 @@
 /*************************************************************************
  *             SetSysColors32   (USER32.504)
  */
-BOOL32 SetSysColors32( INT32 nChanges, const INT32 *lpSysColor,
-                       const COLORREF *lpColorValues )
+BOOL32 WINAPI SetSysColors32( INT32 nChanges, const INT32 *lpSysColor,
+                              const COLORREF *lpColorValues )
 {
     int i;
 
diff --git a/windows/sysmetrics.c b/windows/sysmetrics.c
index 525088e..58fd85d 100644
--- a/windows/sysmetrics.c
+++ b/windows/sysmetrics.c
@@ -136,7 +136,7 @@
 /***********************************************************************
  *           GetSystemMetrics16    (USER.179)
  */
-INT16 GetSystemMetrics16( INT16 index )
+INT16 WINAPI GetSystemMetrics16( INT16 index )
 {
     if ((index < 0) || (index > SM_CMETRICS)) return 0;
     else return sysMetrics[index];    
@@ -146,7 +146,7 @@
 /***********************************************************************
  *           GetSystemMetrics32    (USER32.291)
  */
-INT32 GetSystemMetrics32( INT32 index )
+INT32 WINAPI GetSystemMetrics32( INT32 index )
 {
     if ((index < 0) || (index > SM_CMETRICS)) return 0;
     else return sysMetrics[index];    
diff --git a/windows/timer.c b/windows/timer.c
index b08e892..a28a375 100644
--- a/windows/timer.c
+++ b/windows/timer.c
@@ -301,7 +301,8 @@
 /***********************************************************************
  *           SetTimer16   (USER.10)
  */
-UINT16 SetTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout, TIMERPROC16 proc )
+UINT16 WINAPI SetTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout,
+                          TIMERPROC16 proc )
 {
     dprintf_timer( stddeb, "SetTimer16: %04x %d %d %08lx\n",
                    hwnd, id, timeout, (LONG)proc );
@@ -313,7 +314,8 @@
 /***********************************************************************
  *           SetTimer32   (USER32.510)
  */
-UINT32 SetTimer32( HWND32 hwnd, UINT32 id, UINT32 timeout, TIMERPROC32 proc )
+UINT32 WINAPI SetTimer32( HWND32 hwnd, UINT32 id, UINT32 timeout,
+                          TIMERPROC32 proc )
 {
     dprintf_timer( stddeb, "SetTimer32: %04x %d %d %08lx\n",
                    hwnd, id, timeout, (LONG)proc );
@@ -325,8 +327,8 @@
 /***********************************************************************
  *           SetSystemTimer16   (USER.11)
  */
-UINT16 SetSystemTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout,
-                         TIMERPROC16 proc )
+UINT16 WINAPI SetSystemTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout,
+                                TIMERPROC16 proc )
 {
     dprintf_timer( stddeb, "SetSystemTimer16: %04x %d %d %08lx\n", 
                    hwnd, id, timeout, (LONG)proc );
@@ -338,8 +340,8 @@
 /***********************************************************************
  *           SetSystemTimer32   (USER32.508)
  */
-UINT32 SetSystemTimer32( HWND32 hwnd, UINT32 id, UINT32 timeout,
-                         TIMERPROC32 proc )
+UINT32 WINAPI SetSystemTimer32( HWND32 hwnd, UINT32 id, UINT32 timeout,
+                                TIMERPROC32 proc )
 {
     dprintf_timer( stddeb, "SetSystemTimer32: %04x %d %d %08lx\n", 
                    hwnd, id, timeout, (LONG)proc );
@@ -351,7 +353,7 @@
 /***********************************************************************
  *           KillTimer16   (USER.12)
  */
-BOOL16 KillTimer16( HWND16 hwnd, UINT16 id )
+BOOL16 WINAPI KillTimer16( HWND16 hwnd, UINT16 id )
 {
     dprintf_timer(stddeb, "KillTimer16: %04x %d\n", hwnd, id );
     return TIMER_KillTimer( hwnd, id, FALSE );
@@ -361,7 +363,7 @@
 /***********************************************************************
  *           KillTimer32   (USER32.353)
  */
-BOOL32 KillTimer32( HWND32 hwnd, UINT32 id )
+BOOL32 WINAPI KillTimer32( HWND32 hwnd, UINT32 id )
 {
     dprintf_timer(stddeb, "KillTimer32: %04x %d\n", hwnd, id );
     return TIMER_KillTimer( hwnd, id, FALSE );
@@ -371,7 +373,7 @@
 /***********************************************************************
  *           KillSystemTimer16   (USER.182)
  */
-BOOL16 KillSystemTimer16( HWND16 hwnd, UINT16 id )
+BOOL16 WINAPI KillSystemTimer16( HWND16 hwnd, UINT16 id )
 {
     dprintf_timer( stddeb, "KillSystemTimer16: %04x %d\n", hwnd, id );
     return TIMER_KillTimer( hwnd, id, TRUE );
@@ -381,7 +383,7 @@
 /***********************************************************************
  *           KillSystemTimer32   (USER32.352)
  */
-BOOL32 KillSystemTimer32( HWND32 hwnd, UINT32 id )
+BOOL32 WINAPI KillSystemTimer32( HWND32 hwnd, UINT32 id )
 {
     dprintf_timer( stddeb, "KillSystemTimer32: %04x %d\n", hwnd, id );
     return TIMER_KillTimer( hwnd, id, TRUE );
diff --git a/windows/user.c b/windows/user.c
index 44edddf..8c7c9a5 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -28,7 +28,7 @@
 /***********************************************************************
  *           GetFreeSystemResources   (USER.284)
  */
-WORD GetFreeSystemResources( WORD resType )
+WORD WINAPI GetFreeSystemResources( WORD resType )
 {
     int userPercent, gdiPercent;
 
@@ -63,7 +63,7 @@
 /***********************************************************************
  *           SystemHeapInfo   (TOOLHELP.71)
  */
-BOOL16 SystemHeapInfo( SYSHEAPINFO *pHeapInfo )
+BOOL16 WINAPI SystemHeapInfo( SYSHEAPINFO *pHeapInfo )
 {
     pHeapInfo->wUserFreePercent = GetFreeSystemResources( GFSR_USERRESOURCES );
     pHeapInfo->wGDIFreePercent  = GetFreeSystemResources( GFSR_GDIRESOURCES );
@@ -76,7 +76,7 @@
 /***********************************************************************
  *           TimerCount   (TOOLHELP.80)
  */
-BOOL16 TimerCount( TIMERINFO *pTimerInfo )
+BOOL16 WINAPI TimerCount( TIMERINFO *pTimerInfo )
 {
     /* FIXME
      * In standard mode, dwmsSinceStart = dwmsThisVM 
@@ -97,7 +97,7 @@
 /**********************************************************************
  *           InitApp   (USER.5)
  */
-INT16 InitApp( HINSTANCE16 hInstance )
+INT16 WINAPI InitApp( HINSTANCE16 hInstance )
 {
     int queueSize;
 
@@ -162,7 +162,7 @@
 /***********************************************************************
  *           ExitWindows16   (USER.7)
  */
-BOOL16 ExitWindows16( DWORD dwReturnCode, UINT16 wReserved )
+BOOL16 WINAPI ExitWindows16( DWORD dwReturnCode, UINT16 wReserved )
 {
     return ExitWindowsEx( EWX_LOGOFF, 0xffffffff );
 }
@@ -171,7 +171,7 @@
 /***********************************************************************
  *           ExitWindowsExec16   (USER.246)
  */
-BOOL16 ExitWindowsExec16( LPCSTR lpszExe, LPCSTR lpszParams )
+BOOL16 WINAPI ExitWindowsExec16( LPCSTR lpszExe, LPCSTR lpszParams )
 {
 fprintf(stdnimp, "ExitWindowsExec() : Should run the following in DOS-mode :\n\t\"%s %s\"\n",
 	lpszExe, lpszParams);
@@ -182,7 +182,7 @@
 /***********************************************************************
  *           ExitWindowsEx   (USER32.195)
  */
-BOOL32 ExitWindowsEx( UINT32 flags, DWORD reserved )
+BOOL32 WINAPI ExitWindowsEx( UINT32 flags, DWORD reserved )
 {
     int i;
     BOOL32 result;
diff --git a/windows/win.c b/windows/win.c
index 3200d5a..9f4375b 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -97,7 +97,7 @@
     fprintf( stderr, "Window %04x (%p):\n", hwnd, ptr );
     fprintf( stderr,
              "next=%p  child=%p  parent=%p  owner=%p  class=%p '%s'\n"
-             "inst=%04x  taskQ=%04x  updRgn=%04x  active=%04x dce=%p  idmenu=%04x\n"
+             "inst=%04x  taskQ=%04x  updRgn=%04x  active=%04x dce=%p  idmenu=%08x\n"
              "style=%08lx  exstyle=%08lx  wndproc=%08x  text='%s'\n"
              "client=%d,%d-%d,%d  window=%d,%d-%d,%d"
              "sysmenu=%04x  flags=%04x  props=%p  vscroll=%p  hscroll=%p\n",
@@ -544,7 +544,7 @@
         if (!cs->hwndParent || (cs->hwndParent == pWndDesktop->hwndSelf))
             wndPtr->owner = NULL;
         else
-            wndPtr->owner = WIN_FindWndPtr(WIN_GetTopParent(cs->hwndParent));
+            wndPtr->owner = WIN_GetTopParentPtr(WIN_FindWndPtr(cs->hwndParent));
     }
 
     wndPtr->window         = 0;
@@ -692,7 +692,7 @@
 
     /* Set the window menu */
 
-    if ((cs->style & WS_CAPTION) && !(cs->style & WS_CHILD))
+    if ((wndPtr->dwStyle & (WS_CAPTION | WS_CHILD)) == WS_CAPTION )
     {
         if (cs->hMenu) SetMenu32(hwnd, cs->hMenu);
         else
@@ -786,10 +786,10 @@
 /***********************************************************************
  *           CreateWindow16   (USER.41)
  */
-HWND16 CreateWindow16( LPCSTR className, LPCSTR windowName,
-                       DWORD style, INT16 x, INT16 y, INT16 width,
-                       INT16 height, HWND16 parent, HMENU16 menu,
-                       HINSTANCE16 instance, LPVOID data ) 
+HWND16 WINAPI CreateWindow16( LPCSTR className, LPCSTR windowName,
+                              DWORD style, INT16 x, INT16 y, INT16 width,
+                              INT16 height, HWND16 parent, HMENU16 menu,
+                              HINSTANCE16 instance, LPVOID data ) 
 {
     return CreateWindowEx16( 0, className, windowName, style,
 			   x, y, width, height, parent, menu, instance, data );
@@ -799,10 +799,11 @@
 /***********************************************************************
  *           CreateWindowEx16   (USER.452)
  */
-HWND16 CreateWindowEx16( DWORD exStyle, LPCSTR className, LPCSTR windowName,
-                         DWORD style, INT16 x, INT16 y, INT16 width,
-                         INT16 height, HWND16 parent, HMENU16 menu,
-                         HINSTANCE16 instance, LPVOID data ) 
+HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className,
+                                LPCSTR windowName, DWORD style, INT16 x,
+                                INT16 y, INT16 width, INT16 height,
+                                HWND16 parent, HMENU16 menu,
+                                HINSTANCE16 instance, LPVOID data ) 
 {
     ATOM classAtom;
     CREATESTRUCT32A cs;
@@ -841,10 +842,11 @@
 /***********************************************************************
  *           CreateWindowEx32A   (USER32.82)
  */
-HWND32 CreateWindowEx32A( DWORD exStyle, LPCSTR className, LPCSTR windowName,
-                          DWORD style, INT32 x, INT32 y, INT32 width,
-                          INT32 height, HWND32 parent, HMENU32 menu,
-                          HINSTANCE32 instance, LPVOID data )
+HWND32 WINAPI CreateWindowEx32A( DWORD exStyle, LPCSTR className,
+                                 LPCSTR windowName, DWORD style, INT32 x,
+                                 INT32 y, INT32 width, INT32 height,
+                                 HWND32 parent, HMENU32 menu,
+                                 HINSTANCE32 instance, LPVOID data )
 {
     ATOM classAtom;
     CREATESTRUCT32A cs;
@@ -880,10 +882,11 @@
 /***********************************************************************
  *           CreateWindowEx32W   (USER32.83)
  */
-HWND32 CreateWindowEx32W( DWORD exStyle, LPCWSTR className, LPCWSTR windowName,
-                          DWORD style, INT32 x, INT32 y, INT32 width,
-                          INT32 height, HWND32 parent, HMENU32 menu,
-                          HINSTANCE32 instance, LPVOID data )
+HWND32 WINAPI CreateWindowEx32W( DWORD exStyle, LPCWSTR className,
+                                 LPCWSTR windowName, DWORD style, INT32 x,
+                                 INT32 y, INT32 width, INT32 height,
+                                 HWND32 parent, HMENU32 menu,
+                                 HINSTANCE32 instance, LPVOID data )
 {
     ATOM classAtom;
     CREATESTRUCT32W cs;
@@ -963,16 +966,18 @@
 
 
 /***********************************************************************
- *           DestroyWindow   (USER.53)
+ *           DestroyWindow16   (USER.53)
  */
-BOOL16 DestroyWindow16( HWND16 hwnd )
+BOOL16 WINAPI DestroyWindow16( HWND16 hwnd )
 {
     return DestroyWindow32(hwnd);
 }
+
+
 /***********************************************************************
- *           DestroyWindow   (USER32.134)
+ *           DestroyWindow32   (USER32.134)
  */
-BOOL32 DestroyWindow32( HWND32 hwnd )
+BOOL32 WINAPI DestroyWindow32( HWND32 hwnd )
 {
     WND * wndPtr;
 
@@ -1060,7 +1065,7 @@
 /***********************************************************************
  *           CloseWindow16   (USER.43)
  */
-BOOL16 CloseWindow16( HWND16 hwnd )
+BOOL16 WINAPI CloseWindow16( HWND16 hwnd )
 {
     return CloseWindow32( hwnd );
 }
@@ -1069,7 +1074,7 @@
 /***********************************************************************
  *           CloseWindow32   (USER32.55)
  */
-BOOL32 CloseWindow32( HWND32 hwnd )
+BOOL32 WINAPI CloseWindow32( HWND32 hwnd )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr || (wndPtr->dwStyle & WS_CHILD)) return FALSE;
@@ -1081,7 +1086,7 @@
 /***********************************************************************
  *           OpenIcon16   (USER.44)
  */
-BOOL16 OpenIcon16( HWND16 hwnd )
+BOOL16 WINAPI OpenIcon16( HWND16 hwnd )
 {
     return OpenIcon32( hwnd );
 }
@@ -1090,7 +1095,7 @@
 /***********************************************************************
  *           OpenIcon32   (USER32.409)
  */
-BOOL32 OpenIcon32( HWND32 hwnd )
+BOOL32 WINAPI OpenIcon32( HWND32 hwnd )
 {
     if (!IsIconic32( hwnd )) return FALSE;
     ShowWindow32( hwnd, SW_SHOWNORMAL );
@@ -1158,7 +1163,7 @@
 /***********************************************************************
  *           FindWindow16   (USER.50)
  */
-HWND16 FindWindow16( SEGPTR className, LPCSTR title )
+HWND16 WINAPI FindWindow16( SEGPTR className, LPCSTR title )
 {
     return FindWindowEx16( 0, 0, className, title );
 }
@@ -1167,8 +1172,8 @@
 /***********************************************************************
  *           FindWindowEx16   (USER.427)
  */
-HWND16 FindWindowEx16( HWND16 parent, HWND16 child,
-                       SEGPTR className, LPCSTR title )
+HWND16 WINAPI FindWindowEx16( HWND16 parent, HWND16 child,
+                              SEGPTR className, LPCSTR title )
 {
     ATOM atom = 0;
 
@@ -1189,7 +1194,7 @@
 /***********************************************************************
  *           FindWindow32A   (USER32.197)
  */
-HWND32 FindWindow32A( LPCSTR className, LPCSTR title )
+HWND32 WINAPI FindWindow32A( LPCSTR className, LPCSTR title )
 {
     return FindWindowEx32A( 0, 0, className, title );
 }
@@ -1198,8 +1203,8 @@
 /***********************************************************************
  *           FindWindowEx32A   (USER32.198)
  */
-HWND32 FindWindowEx32A( HWND32 parent, HWND32 child,
-                        LPCSTR className, LPCSTR title )
+HWND32 WINAPI FindWindowEx32A( HWND32 parent, HWND32 child,
+                               LPCSTR className, LPCSTR title )
 {
     ATOM atom = 0;
 
@@ -1216,8 +1221,8 @@
 /***********************************************************************
  *           FindWindowEx32W   (USER32.199)
  */
-HWND32 FindWindowEx32W( HWND32 parent, HWND32 child,
-                        LPCWSTR className, LPCWSTR title )
+HWND32 WINAPI FindWindowEx32W( HWND32 parent, HWND32 child,
+                               LPCWSTR className, LPCWSTR title )
 {
     ATOM atom = 0;
     char *buffer;
@@ -1239,7 +1244,7 @@
 /***********************************************************************
  *           FindWindow32W   (USER32.200)
  */
-HWND32 FindWindow32W( LPCWSTR className, LPCWSTR title )
+HWND32 WINAPI FindWindow32W( LPCWSTR className, LPCWSTR title )
 {
     return FindWindowEx32W( 0, 0, className, title );
 }
@@ -1257,7 +1262,7 @@
 /**********************************************************************
  *           GetDesktopWindow16   (USER.286)
  */
-HWND16 GetDesktopWindow16(void)
+HWND16 WINAPI GetDesktopWindow16(void)
 {
     return (HWND16)pWndDesktop->hwndSelf;
 }
@@ -1266,7 +1271,7 @@
 /**********************************************************************
  *           GetDesktopWindow32   (USER32.231)
  */
-HWND32 GetDesktopWindow32(void)
+HWND32 WINAPI GetDesktopWindow32(void)
 {
     return pWndDesktop->hwndSelf;
 }
@@ -1278,7 +1283,7 @@
  * Exactly the same thing as GetDesktopWindow(), but not documented.
  * Don't ask me why...
  */
-HWND16 GetDesktopHwnd(void)
+HWND16 WINAPI GetDesktopHwnd(void)
 {
     return (HWND16)pWndDesktop->hwndSelf;
 }
@@ -1287,7 +1292,7 @@
 /*******************************************************************
  *           EnableWindow16   (USER.34)
  */
-BOOL16 EnableWindow16( HWND16 hwnd, BOOL16 enable )
+BOOL16 WINAPI EnableWindow16( HWND16 hwnd, BOOL16 enable )
 {
     return EnableWindow32( hwnd, enable );
 }
@@ -1296,7 +1301,7 @@
 /*******************************************************************
  *           EnableWindow32   (USER32.171)
  */
-BOOL32 EnableWindow32( HWND32 hwnd, BOOL32 enable )
+BOOL32 WINAPI EnableWindow32( HWND32 hwnd, BOOL32 enable )
 {
     WND *wndPtr;
 
@@ -1326,7 +1331,7 @@
 /***********************************************************************
  *           IsWindowEnabled16   (USER.35)
  */ 
-BOOL16 IsWindowEnabled16(HWND16 hWnd)
+BOOL16 WINAPI IsWindowEnabled16(HWND16 hWnd)
 {
     return IsWindowEnabled32(hWnd);
 }
@@ -1335,7 +1340,7 @@
 /***********************************************************************
  *           IsWindowEnabled32   (USER32.348)
  */ 
-BOOL32 IsWindowEnabled32(HWND32 hWnd)
+BOOL32 WINAPI IsWindowEnabled32(HWND32 hWnd)
 {
     WND * wndPtr; 
 
@@ -1347,7 +1352,7 @@
 /***********************************************************************
  *           IsWindowUnicode   (USER32.349)
  */
-BOOL32 IsWindowUnicode( HWND32 hwnd )
+BOOL32 WINAPI IsWindowUnicode( HWND32 hwnd )
 {
     WND * wndPtr; 
 
@@ -1359,7 +1364,7 @@
 /**********************************************************************
  *	     GetWindowWord16    (USER.133)
  */
-WORD GetWindowWord16( HWND16 hwnd, INT16 offset )
+WORD WINAPI GetWindowWord16( HWND16 hwnd, INT16 offset )
 {
     return GetWindowWord32( hwnd, offset );
 }
@@ -1368,7 +1373,7 @@
 /**********************************************************************
  *	     GetWindowWord32    (USER32.313)
  */
-WORD GetWindowWord32( HWND32 hwnd, INT32 offset )
+WORD WINAPI GetWindowWord32( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return 0;
@@ -1383,7 +1388,7 @@
     }
     switch(offset)
     {
-    case GWW_ID:         return wndPtr->wIDmenu;
+    case GWW_ID:         return (WORD)wndPtr->wIDmenu;
     case GWW_HWNDPARENT: return wndPtr->parent ? wndPtr->parent->hwndSelf : 0;
     case GWW_HINSTANCE:  return (WORD)wndPtr->hInstance;
     default:
@@ -1407,7 +1412,7 @@
 /**********************************************************************
  *	     SetWindowWord16    (USER.134)
  */
-WORD SetWindowWord16( HWND16 hwnd, INT16 offset, WORD newval )
+WORD WINAPI SetWindowWord16( HWND16 hwnd, INT16 offset, WORD newval )
 {
     return SetWindowWord32( hwnd, offset, newval );
 }
@@ -1416,7 +1421,7 @@
 /**********************************************************************
  *	     SetWindowWord32    (USER32.523)
  */
-WORD SetWindowWord32( HWND32 hwnd, INT32 offset, WORD newval )
+WORD WINAPI SetWindowWord32( HWND32 hwnd, INT32 offset, WORD newval )
 {
     WORD *ptr, retval;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -1473,7 +1478,7 @@
         case GWL_USERDATA:   return wndPtr->userdata;
         case GWL_STYLE:      return wndPtr->dwStyle;
         case GWL_EXSTYLE:    return wndPtr->dwExStyle;
-        case GWL_ID:         return wndPtr->wIDmenu;
+        case GWL_ID:         return (LONG)wndPtr->wIDmenu;
         case GWL_WNDPROC:    return (LONG)WINPROC_GetProc( wndPtr->winproc,
                                                            type );
         case GWL_HWNDPARENT: return wndPtr->parent ?
@@ -1548,7 +1553,7 @@
 /**********************************************************************
  *	     GetWindowLong16    (USER.135)
  */
-LONG GetWindowLong16( HWND16 hwnd, INT16 offset )
+LONG WINAPI GetWindowLong16( HWND16 hwnd, INT16 offset )
 {
     return WIN_GetWindowLong( (HWND32)hwnd, offset, WIN_PROC_16 );
 }
@@ -1557,7 +1562,7 @@
 /**********************************************************************
  *	     GetWindowLong32A    (USER32.304)
  */
-LONG GetWindowLong32A( HWND32 hwnd, INT32 offset )
+LONG WINAPI GetWindowLong32A( HWND32 hwnd, INT32 offset )
 {
     return WIN_GetWindowLong( hwnd, offset, WIN_PROC_32A );
 }
@@ -1566,7 +1571,7 @@
 /**********************************************************************
  *	     GetWindowLong32W    (USER32.305)
  */
-LONG GetWindowLong32W( HWND32 hwnd, INT32 offset )
+LONG WINAPI GetWindowLong32W( HWND32 hwnd, INT32 offset )
 {
     return WIN_GetWindowLong( hwnd, offset, WIN_PROC_32W );
 }
@@ -1575,7 +1580,7 @@
 /**********************************************************************
  *	     SetWindowLong16    (USER.136)
  */
-LONG SetWindowLong16( HWND16 hwnd, INT16 offset, LONG newval )
+LONG WINAPI SetWindowLong16( HWND16 hwnd, INT16 offset, LONG newval )
 {
     return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_16 );
 }
@@ -1584,7 +1589,7 @@
 /**********************************************************************
  *	     SetWindowLong32A    (USER32.516)
  */
-LONG SetWindowLong32A( HWND32 hwnd, INT32 offset, LONG newval )
+LONG WINAPI SetWindowLong32A( HWND32 hwnd, INT32 offset, LONG newval )
 {
     return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_32A );
 }
@@ -1593,7 +1598,7 @@
 /**********************************************************************
  *	     SetWindowLong32W    (USER32.517)
  */
-LONG SetWindowLong32W( HWND32 hwnd, INT32 offset, LONG newval )
+LONG WINAPI SetWindowLong32W( HWND32 hwnd, INT32 offset, LONG newval )
 {
     return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_32W );
 }
@@ -1602,7 +1607,7 @@
 /*******************************************************************
  *	     GetWindowText16    (USER.36)
  */
-INT16 GetWindowText16( HWND16 hwnd, SEGPTR lpString, INT16 nMaxCount )
+INT16 WINAPI GetWindowText16( HWND16 hwnd, SEGPTR lpString, INT16 nMaxCount )
 {
     return (INT16)SendMessage16(hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString);
 }
@@ -1611,7 +1616,7 @@
 /*******************************************************************
  *	     GetWindowText32A    (USER32.308)
  */
-INT32 GetWindowText32A( HWND32 hwnd, LPSTR lpString, INT32 nMaxCount )
+INT32 WINAPI GetWindowText32A( HWND32 hwnd, LPSTR lpString, INT32 nMaxCount )
 {
     return (INT32)SendMessage32A( hwnd, WM_GETTEXT, nMaxCount,
                                   (LPARAM)lpString );
@@ -1621,7 +1626,7 @@
 /*******************************************************************
  *	     GetWindowText32W    (USER32.311)
  */
-INT32 GetWindowText32W( HWND32 hwnd, LPWSTR lpString, INT32 nMaxCount )
+INT32 WINAPI GetWindowText32W( HWND32 hwnd, LPWSTR lpString, INT32 nMaxCount )
 {
     return (INT32)SendMessage32W( hwnd, WM_GETTEXT, nMaxCount,
                                   (LPARAM)lpString );
@@ -1631,25 +1636,25 @@
 /*******************************************************************
  *	     SetWindowText16    (USER.37)
  */
-void SetWindowText16( HWND16 hwnd, SEGPTR lpString )
+void WINAPI SetWindowText16( HWND16 hwnd, SEGPTR lpString )
 {
     SendMessage16( hwnd, WM_SETTEXT, 0, (LPARAM)lpString );
 }
 
 
 /*******************************************************************
- *	     SetWindowText32A    (USER32.)
+ *	     SetWindowText32A    (USER32.521)
  */
-void SetWindowText32A( HWND32 hwnd, LPCSTR lpString )
+void WINAPI SetWindowText32A( HWND32 hwnd, LPCSTR lpString )
 {
     SendMessage32A( hwnd, WM_SETTEXT, 0, (LPARAM)lpString );
 }
 
 
 /*******************************************************************
- *	     SetWindowText32W    (USER32.)
+ *	     SetWindowText32W    (USER32.522)
  */
-void SetWindowText32W( HWND32 hwnd, LPCWSTR lpString )
+void WINAPI SetWindowText32W( HWND32 hwnd, LPCWSTR lpString )
 {
     SendMessage32W( hwnd, WM_SETTEXT, 0, (LPARAM)lpString );
 }
@@ -1658,7 +1663,7 @@
 /*******************************************************************
  *         GetWindowTextLength16    (USER.38)
  */
-INT16 GetWindowTextLength16( HWND16 hwnd )
+INT16 WINAPI GetWindowTextLength16( HWND16 hwnd )
 {
     return (INT16)SendMessage16( hwnd, WM_GETTEXTLENGTH, 0, 0 );
 }
@@ -1667,7 +1672,7 @@
 /*******************************************************************
  *         GetWindowTextLength32A   (USER32.309)
  */
-INT32 GetWindowTextLength32A( HWND32 hwnd )
+INT32 WINAPI GetWindowTextLength32A( HWND32 hwnd )
 {
     return SendMessage32A( hwnd, WM_GETTEXTLENGTH, 0, 0 );
 }
@@ -1675,7 +1680,7 @@
 /*******************************************************************
  *         GetWindowTextLength32W   (USER32.309)
  */
-INT32 GetWindowTextLength32W( HWND32 hwnd )
+INT32 WINAPI GetWindowTextLength32W( HWND32 hwnd )
 {
     return SendMessage32W( hwnd, WM_GETTEXTLENGTH, 0, 0 );
 }
@@ -1684,7 +1689,7 @@
 /*******************************************************************
  *         IsWindow16   (USER.47)
  */
-BOOL16 IsWindow16( HWND16 hwnd )
+BOOL16 WINAPI IsWindow16( HWND16 hwnd )
 {
     return IsWindow32( hwnd );
 }
@@ -1693,7 +1698,7 @@
 /*******************************************************************
  *         IsWindow32   (USER32.347)
  */
-BOOL32 IsWindow32( HWND32 hwnd )
+BOOL32 WINAPI IsWindow32( HWND32 hwnd )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     return ((wndPtr != NULL) && (wndPtr->dwMagic == WND_MAGIC));
@@ -1703,7 +1708,7 @@
 /*****************************************************************
  *         GetParent16   (USER.46)
  */
-HWND16 GetParent16( HWND16 hwnd )
+HWND16 WINAPI GetParent16( HWND16 hwnd )
 {
     return (HWND16)GetParent32( hwnd );
 }
@@ -1712,7 +1717,7 @@
 /*****************************************************************
  *         GetParent32   (USER32.277)
  */
-HWND32 GetParent32( HWND32 hwnd )
+HWND32 WINAPI GetParent32( HWND32 hwnd )
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
     if (!wndPtr) return 0;
@@ -1720,6 +1725,16 @@
     return wndPtr ? wndPtr->hwndSelf : 0;
 }
 
+/*****************************************************************
+ *         WIN_GetTopParent
+ *
+ * Get the top-level parent for a child window.
+ */
+WND* WIN_GetTopParentPtr( WND* pWnd )
+{
+    while( pWnd && (pWnd->dwStyle & WS_CHILD)) pWnd = pWnd->parent;
+    return pWnd;
+}
 
 /*****************************************************************
  *         WIN_GetTopParent
@@ -1728,8 +1743,7 @@
  */
 HWND32 WIN_GetTopParent( HWND32 hwnd )
 {
-    WND *wndPtr = WIN_FindWndPtr( hwnd );
-    while (wndPtr && (wndPtr->dwStyle & WS_CHILD)) wndPtr = wndPtr->parent;
+    WND *wndPtr = WIN_GetTopParentPtr ( WIN_FindWndPtr( hwnd ) );
     return wndPtr ? wndPtr->hwndSelf : 0;
 }
 
@@ -1737,7 +1751,7 @@
 /*****************************************************************
  *         SetParent16   (USER.233)
  */
-HWND16 SetParent16( HWND16 hwndChild, HWND16 hwndNewParent )
+HWND16 WINAPI SetParent16( HWND16 hwndChild, HWND16 hwndNewParent )
 {
     return SetParent32( hwndChild, hwndNewParent );
 }
@@ -1746,7 +1760,7 @@
 /*****************************************************************
  *         SetParent32   (USER32.494)
  */
-HWND32 SetParent32( HWND32 hwndChild, HWND32 hwndNewParent )
+HWND32 WINAPI SetParent32( HWND32 hwndChild, HWND32 hwndNewParent )
 {
     HWND32 oldParent;
 
@@ -1769,7 +1783,7 @@
 /*******************************************************************
  *         IsChild16    (USER.48)
  */
-BOOL16 IsChild16( HWND16 parent, HWND16 child )
+BOOL16 WINAPI IsChild16( HWND16 parent, HWND16 child )
 {
     return IsChild32(parent,child);
 }
@@ -1778,7 +1792,7 @@
 /*******************************************************************
  *         IsChild32    (USER32.338)
  */
-BOOL32 IsChild32( HWND32 parent, HWND32 child )
+BOOL32 WINAPI IsChild32( HWND32 parent, HWND32 child )
 {
     WND * wndPtr = WIN_FindWndPtr( child );
     while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
@@ -1793,7 +1807,7 @@
 /***********************************************************************
  *           IsWindowVisible16   (USER.49)
  */
-BOOL16 IsWindowVisible16( HWND16 hwnd )
+BOOL16 WINAPI IsWindowVisible16( HWND16 hwnd )
 {
     return IsWindowVisible32(hwnd);
 }
@@ -1802,7 +1816,7 @@
 /***********************************************************************
  *           IsWindowVisible32   (USER32.350)
  */
-BOOL32 IsWindowVisible32( HWND32 hwnd )
+BOOL32 WINAPI IsWindowVisible32( HWND32 hwnd )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
@@ -1836,7 +1850,7 @@
 /*******************************************************************
  *         GetTopWindow16    (USER.229)
  */
-HWND16 GetTopWindow16( HWND16 hwnd )
+HWND16 WINAPI GetTopWindow16( HWND16 hwnd )
 {
     return GetTopWindow32(hwnd);
 }
@@ -1845,7 +1859,7 @@
 /*******************************************************************
  *         GetTopWindow32    (USER.229)
  */
-HWND32 GetTopWindow32( HWND32 hwnd )
+HWND32 WINAPI GetTopWindow32( HWND32 hwnd )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     if (wndPtr && wndPtr->child) return wndPtr->child->hwndSelf;
@@ -1856,7 +1870,7 @@
 /*******************************************************************
  *         GetWindow16    (USER.262)
  */
-HWND16 GetWindow16( HWND16 hwnd, WORD rel )
+HWND16 WINAPI GetWindow16( HWND16 hwnd, WORD rel )
 {
     return GetWindow32( hwnd,rel );
 }
@@ -1865,7 +1879,7 @@
 /*******************************************************************
  *         GetWindow32    (USER32.301)
  */
-HWND32 GetWindow32( HWND32 hwnd, WORD rel )
+HWND32 WINAPI GetWindow32( HWND32 hwnd, WORD rel )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return 0;
@@ -1908,7 +1922,7 @@
 /*******************************************************************
  *         GetNextWindow16    (USER.230)
  */
-HWND16 GetNextWindow16( HWND16 hwnd, WORD flag )
+HWND16 WINAPI GetNextWindow16( HWND16 hwnd, WORD flag )
 {
     if ((flag != GW_HWNDNEXT) && (flag != GW_HWNDPREV)) return 0;
     return GetWindow16( hwnd, flag );
@@ -1917,7 +1931,7 @@
 /*******************************************************************
  *         ShowOwnedPopups16  (USER.265)
  */
-void ShowOwnedPopups16( HWND16 owner, BOOL16 fShow )
+void WINAPI ShowOwnedPopups16( HWND16 owner, BOOL16 fShow )
 {
     ShowOwnedPopups32( owner, fShow );
 }
@@ -1926,7 +1940,7 @@
 /*******************************************************************
  *         ShowOwnedPopups32  (USER32.530)
  */
-BOOL32 ShowOwnedPopups32( HWND32 owner, BOOL32 fShow )
+BOOL32 WINAPI ShowOwnedPopups32( HWND32 owner, BOOL32 fShow )
 {
     WND *pWnd = pWndDesktop->child;
     while (pWnd)
@@ -1943,7 +1957,7 @@
 /*******************************************************************
  *         GetLastActivePopup16   (USER.287)
  */
-HWND16 GetLastActivePopup16( HWND16 hwnd )
+HWND16 WINAPI GetLastActivePopup16( HWND16 hwnd )
 {
     return GetLastActivePopup32( hwnd );
 }
@@ -1951,7 +1965,7 @@
 /*******************************************************************
  *         GetLastActivePopup32   (USER32.255)
  */
-HWND32 GetLastActivePopup32( HWND32 hwnd )
+HWND32 WINAPI GetLastActivePopup32( HWND32 hwnd )
 {
     WND *wndPtr;
     wndPtr = WIN_FindWndPtr(hwnd);
@@ -2016,7 +2030,7 @@
 /*******************************************************************
  *           EnumWindows16   (USER.54)
  */
-BOOL16 EnumWindows16( WNDENUMPROC16 lpEnumFunc, LPARAM lParam )
+BOOL16 WINAPI EnumWindows16( WNDENUMPROC16 lpEnumFunc, LPARAM lParam )
 {
     WND **list, **ppWnd;
 
@@ -2042,7 +2056,7 @@
 /*******************************************************************
  *           EnumWindows32   (USER32.192)
  */
-BOOL32 EnumWindows32( WNDENUMPROC32 lpEnumFunc, LPARAM lParam )
+BOOL32 WINAPI EnumWindows32( WNDENUMPROC32 lpEnumFunc, LPARAM lParam )
 {
     return (BOOL32)EnumWindows16( (WNDENUMPROC16)lpEnumFunc, lParam );
 }
@@ -2051,7 +2065,8 @@
 /**********************************************************************
  *           EnumTaskWindows16   (USER.225)
  */
-BOOL16 EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func, LPARAM lParam )
+BOOL16 WINAPI EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func,
+                                 LPARAM lParam )
 {
     WND **list, **ppWnd;
     HQUEUE16 hQueue = GetTaskQueue( hTask );
@@ -2078,7 +2093,7 @@
 /**********************************************************************
  *           EnumThreadWindows   (USER32.189)
  */
-BOOL32 EnumThreadWindows( DWORD id, WNDENUMPROC32 func, LPARAM lParam )
+BOOL32 WINAPI EnumThreadWindows( DWORD id, WNDENUMPROC32 func, LPARAM lParam )
 {
     THDB	*tdb = (THDB*)id;
 
@@ -2116,7 +2131,8 @@
 /**********************************************************************
  *           EnumChildWindows16   (USER.55)
  */
-BOOL16 EnumChildWindows16( HWND16 parent, WNDENUMPROC16 func, LPARAM lParam )
+BOOL16 WINAPI EnumChildWindows16( HWND16 parent, WNDENUMPROC16 func,
+                                  LPARAM lParam )
 {
     WND **list, *pParent;
 
@@ -2131,7 +2147,8 @@
 /**********************************************************************
  *           EnumChildWindows32   (USER32.177)
  */
-BOOL32 EnumChildWindows32( HWND32 parent, WNDENUMPROC32 func, LPARAM lParam )
+BOOL32 WINAPI EnumChildWindows32( HWND32 parent, WNDENUMPROC32 func,
+                                  LPARAM lParam )
 {
     return (BOOL32)EnumChildWindows16( (HWND16)parent, (WNDENUMPROC16)func,
                                        lParam );
@@ -2141,7 +2158,7 @@
 /*******************************************************************
  *           AnyPopup16   (USER.52)
  */
-BOOL16 AnyPopup16(void)
+BOOL16 WINAPI AnyPopup16(void)
 {
     return AnyPopup32();
 }
@@ -2150,7 +2167,7 @@
 /*******************************************************************
  *           AnyPopup32   (USER32.3)
  */
-BOOL32 AnyPopup32(void)
+BOOL32 WINAPI AnyPopup32(void)
 {
     WND *wndPtr;
     for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
@@ -2162,7 +2179,7 @@
 /*******************************************************************
  *            FlashWindow16   (USER.105)
  */
-BOOL16 FlashWindow16( HWND16 hWnd, BOOL16 bInvert )
+BOOL16 WINAPI FlashWindow16( HWND16 hWnd, BOOL16 bInvert )
 {
     return FlashWindow32( hWnd, bInvert );
 }
@@ -2171,7 +2188,7 @@
 /*******************************************************************
  *            FlashWindow32   (USER32.201)
  */
-BOOL32 FlashWindow32( HWND32 hWnd, BOOL32 bInvert )
+BOOL32 WINAPI FlashWindow32( HWND32 hWnd, BOOL32 bInvert )
 {
     WND *wndPtr = WIN_FindWndPtr(hWnd);
 
@@ -2214,7 +2231,7 @@
 /*******************************************************************
  *           SetSysModalWindow16   (USER.188)
  */
-HWND16 SetSysModalWindow16( HWND16 hWnd )
+HWND16 WINAPI SetSysModalWindow16( HWND16 hWnd )
 {
     HWND32 hWndOldModal = hwndSysModal;
     hwndSysModal = hWnd;
@@ -2226,7 +2243,7 @@
 /*******************************************************************
  *           GetSysModalWindow16   (USER.52)
  */
-HWND16 GetSysModalWindow16(void)
+HWND16 WINAPI GetSysModalWindow16(void)
 {
     return hwndSysModal;
 }
@@ -2307,7 +2324,7 @@
 /*******************************************************************
  *             DragDetect   (USER.465)
  */
-BOOL16 DragDetect16( HWND16 hWnd, POINT16 pt )
+BOOL16 WINAPI DragDetect16( HWND16 hWnd, POINT16 pt )
 {
     POINT32 pt32;
     CONV_POINT16TO32( &pt, &pt32 );
@@ -2317,7 +2334,7 @@
 /*******************************************************************
  *             DragDetect32   (USER32.150)
  */
-BOOL32 DragDetect32( HWND32 hWnd, POINT32 pt )
+BOOL32 WINAPI DragDetect32( HWND32 hWnd, POINT32 pt )
 {
     MSG16 msg;
     RECT16  rect;
@@ -2356,8 +2373,8 @@
 /******************************************************************************
  *             DragObject16   (USER.464)
  */
-DWORD DragObject16( HWND16 hwndScope, HWND16 hWnd, UINT16 wObj,
-                    HANDLE16 hOfStruct, WORD szList, HCURSOR16 hCursor )
+DWORD WINAPI DragObject16( HWND16 hwndScope, HWND16 hWnd, UINT16 wObj,
+                           HANDLE16 hOfStruct, WORD szList, HCURSOR16 hCursor )
 {
     MSG16	msg;
     LPDRAGINFO	lpDragInfo;
diff --git a/windows/winhelp.c b/windows/winhelp.c
index 49ae2ca..856d2d5 100644
--- a/windows/winhelp.c
+++ b/windows/winhelp.c
@@ -14,8 +14,8 @@
 /**********************************************************************
  *             WinHelp16   (USER.171)
  */
-BOOL16 WinHelp16( HWND16 hWnd, LPCSTR lpHelpFile, UINT16 wCommand,
-                  DWORD dwData )
+BOOL16 WINAPI WinHelp16( HWND16 hWnd, LPCSTR lpHelpFile, UINT16 wCommand,
+                         DWORD dwData )
 {
     return WinHelp32A( hWnd, lpHelpFile, wCommand,
                        (DWORD)PTR_SEG_TO_LIN(dwData) );
@@ -25,8 +25,8 @@
 /**********************************************************************
  *             WinHelp32A   (USER32.578)
  */
-BOOL32 WinHelp32A( HWND32 hWnd, LPCSTR lpHelpFile, UINT32 wCommand,
-                   DWORD dwData )
+BOOL32 WINAPI WinHelp32A( HWND32 hWnd, LPCSTR lpHelpFile, UINT32 wCommand,
+                          DWORD dwData )
 {
 	static WORD WM_WINHELP=0;
 	HWND32 hDest;
@@ -103,8 +103,8 @@
 /**********************************************************************
  *             WinHelp32W   (USER32.579)
  */
-BOOL32 WinHelp32W( HWND32 hWnd, LPCWSTR helpFile, UINT32 command,
-                   DWORD dwData )
+BOOL32 WINAPI WinHelp32W( HWND32 hWnd, LPCWSTR helpFile, UINT32 command,
+                          DWORD dwData )
 {
     LPSTR file = HEAP_strdupWtoA( GetProcessHeap(), 0, helpFile );
     BOOL32 ret = WinHelp32A( hWnd, file, command, dwData );
diff --git a/windows/winpos.c b/windows/winpos.c
index 472b011..e418e7e 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -150,14 +150,14 @@
 /***********************************************************************
  *           ArrangeIconicWindows16   (USER.170)
  */
-UINT16 ArrangeIconicWindows16( HWND16 parent) 
+UINT16 WINAPI ArrangeIconicWindows16( HWND16 parent) 
 {
     return ArrangeIconicWindows32(parent);
 }
 /***********************************************************************
  *           ArrangeIconicWindows32   (USER32.6)
  */
-UINT32 ArrangeIconicWindows32( HWND32 parent )
+UINT32 WINAPI ArrangeIconicWindows32( HWND32 parent )
 {
     RECT32 rectParent;
     HWND32 hwndChild;
@@ -196,7 +196,7 @@
 /***********************************************************************
  *             SwitchToThisWindow16   (USER.172)
  */
-void SwitchToThisWindow16( HWND16 hwnd, BOOL16 restore )
+void WINAPI SwitchToThisWindow16( HWND16 hwnd, BOOL16 restore )
 {
     SwitchToThisWindow32( hwnd, restore );
 }
@@ -205,7 +205,7 @@
 /***********************************************************************
  *             SwitchToThisWindow32   (USER32.538)
  */
-void SwitchToThisWindow32( HWND32 hwnd, BOOL32 restore )
+void WINAPI SwitchToThisWindow32( HWND32 hwnd, BOOL32 restore )
 {
     ShowWindow32( hwnd, restore ? SW_RESTORE : SW_SHOWMINIMIZED );
 }
@@ -214,7 +214,7 @@
 /***********************************************************************
  *           GetWindowRect16   (USER.32)
  */
-void GetWindowRect16( HWND16 hwnd, LPRECT16 rect ) 
+void WINAPI GetWindowRect16( HWND16 hwnd, LPRECT16 rect ) 
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd ); 
     if (!wndPtr) return;
@@ -228,7 +228,7 @@
 /***********************************************************************
  *           GetWindowRect32   (USER.32)
  */
-void GetWindowRect32( HWND32 hwnd, LPRECT32 rect ) 
+void WINAPI GetWindowRect32( HWND32 hwnd, LPRECT32 rect ) 
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd ); 
     if (!wndPtr) return;
@@ -242,7 +242,7 @@
 /***********************************************************************
  *           GetClientRect16   (USER.33)
  */
-void GetClientRect16( HWND16 hwnd, LPRECT16 rect ) 
+void WINAPI GetClientRect16( HWND16 hwnd, LPRECT16 rect ) 
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
 
@@ -258,7 +258,7 @@
 /***********************************************************************
  *           GetClientRect32   (USER32.219)
  */
-void GetClientRect32( HWND32 hwnd, LPRECT32 rect ) 
+void WINAPI GetClientRect32( HWND32 hwnd, LPRECT32 rect ) 
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
 
@@ -274,7 +274,7 @@
 /*******************************************************************
  *         ClientToScreen16   (USER.28)
  */
-BOOL16 ClientToScreen16( HWND16 hwnd, LPPOINT16 lppnt )
+BOOL16 WINAPI ClientToScreen16( HWND16 hwnd, LPPOINT16 lppnt )
 {
     MapWindowPoints16( hwnd, 0, lppnt, 1 );
     return TRUE;
@@ -284,7 +284,7 @@
 /*******************************************************************
  *         ClientToScreen32   (USER32.51)
  */
-BOOL32 ClientToScreen32( HWND32 hwnd, LPPOINT32 lppnt )
+BOOL32 WINAPI ClientToScreen32( HWND32 hwnd, LPPOINT32 lppnt )
 {
     MapWindowPoints32( hwnd, 0, lppnt, 1 );
     return TRUE;
@@ -294,7 +294,7 @@
 /*******************************************************************
  *         ScreenToClient16   (USER.29)
  */
-void ScreenToClient16( HWND16 hwnd, LPPOINT16 lppnt )
+void WINAPI ScreenToClient16( HWND16 hwnd, LPPOINT16 lppnt )
 {
     MapWindowPoints16( 0, hwnd, lppnt, 1 );
 }
@@ -303,7 +303,7 @@
 /*******************************************************************
  *         ScreenToClient32   (USER32.446)
  */
-void ScreenToClient32( HWND32 hwnd, LPPOINT32 lppnt )
+void WINAPI ScreenToClient32( HWND32 hwnd, LPPOINT32 lppnt )
 {
     MapWindowPoints32( 0, hwnd, lppnt, 1 );
 }
@@ -388,7 +388,7 @@
 /*******************************************************************
  *         WindowFromPoint16   (USER.30)
  */
-HWND16  WindowFromPoint16( POINT16 pt )
+HWND16 WINAPI WindowFromPoint16( POINT16 pt )
 {
     WND *pWnd;
     WINPOS_WindowFromPoint( WIN_GetDesktop(), pt, &pWnd );
@@ -399,7 +399,7 @@
 /*******************************************************************
  *         WindowFromPoint32   (USER32.581)
  */
-HWND32 WindowFromPoint32( POINT32 pt )
+HWND32 WINAPI WindowFromPoint32( POINT32 pt )
 {
     WND *pWnd;
     POINT16 pt16;
@@ -412,7 +412,7 @@
 /*******************************************************************
  *         ChildWindowFromPoint16   (USER.191)
  */
-HWND16 ChildWindowFromPoint16( HWND16 hwndParent, POINT16 pt )
+HWND16 WINAPI ChildWindowFromPoint16( HWND16 hwndParent, POINT16 pt )
 {
     POINT32 pt32;
     CONV_POINT16TO32( &pt, &pt32 );
@@ -423,7 +423,7 @@
 /*******************************************************************
  *         ChildWindowFromPoint32   (USER32.48)
  */
-HWND32 ChildWindowFromPoint32( HWND32 hwndParent, POINT32 pt )
+HWND32 WINAPI ChildWindowFromPoint32( HWND32 hwndParent, POINT32 pt )
 {
     /* pt is in the client coordinates */
 
@@ -500,8 +500,8 @@
 /*******************************************************************
  *         MapWindowPoints16   (USER.258)
  */
-void MapWindowPoints16( HWND16 hwndFrom, HWND16 hwndTo,
-                        LPPOINT16 lppt, UINT16 count )
+void WINAPI MapWindowPoints16( HWND16 hwndFrom, HWND16 hwndTo,
+                               LPPOINT16 lppt, UINT16 count )
 {
     POINT32 offset;
 
@@ -518,8 +518,8 @@
 /*******************************************************************
  *         MapWindowPoints32   (USER32.385)
  */
-void MapWindowPoints32( HWND32 hwndFrom, HWND32 hwndTo,
-                        LPPOINT32 lppt, UINT32 count )
+void WINAPI MapWindowPoints32( HWND32 hwndFrom, HWND32 hwndTo,
+                               LPPOINT32 lppt, UINT32 count )
 {
     POINT32 offset;
 
@@ -536,14 +536,16 @@
 /***********************************************************************
  *           IsIconic16   (USER.31)
  */
-BOOL16 IsIconic16(HWND16 hWnd)
+BOOL16 WINAPI IsIconic16(HWND16 hWnd)
 {
     return IsIconic32(hWnd);
 }
+
+
 /***********************************************************************
  *           IsIconic32   (USER32.344)
  */
-BOOL32 IsIconic32(HWND32 hWnd)
+BOOL32 WINAPI IsIconic32(HWND32 hWnd)
 {
     WND * wndPtr = WIN_FindWndPtr(hWnd);
     if (wndPtr == NULL) return FALSE;
@@ -554,14 +556,16 @@
 /***********************************************************************
  *           IsZoomed   (USER.272)
  */
-BOOL16 IsZoomed16(HWND16 hWnd)
+BOOL16 WINAPI IsZoomed16(HWND16 hWnd)
 {
     return IsZoomed32(hWnd);
 }
+
+
 /***********************************************************************
  *           IsZoomed   (USER32.351)
  */
-BOOL32 IsZoomed32(HWND32 hWnd)
+BOOL32 WINAPI IsZoomed32(HWND32 hWnd)
 {
     WND * wndPtr = WIN_FindWndPtr(hWnd);
     if (wndPtr == NULL) return FALSE;
@@ -572,7 +576,7 @@
 /*******************************************************************
  *         GetActiveWindow    (USER.60)
  */
-HWND16 GetActiveWindow16(void)
+HWND16 WINAPI GetActiveWindow16(void)
 {
     return (HWND16)hwndActive;
 }
@@ -580,7 +584,7 @@
 /*******************************************************************
  *         GetActiveWindow    (USER32.204)
  */
-HWND32 GetActiveWindow32(void)
+HWND32 WINAPI GetActiveWindow32(void)
 {
     return (HWND32)hwndActive;
 }
@@ -591,22 +595,25 @@
  */
 static BOOL32 WINPOS_CanActivate(WND* pWnd)
 {
- return (pWnd) ? ((!(pWnd->dwStyle & WS_DISABLED) &&
-                     pWnd->dwStyle & WS_VISIBLE ) ? TRUE : FALSE) : FALSE;
+    if( pWnd && ((pWnd->dwStyle & (WS_DISABLED | WS_VISIBLE | WS_CHILD)) 
+	== WS_VISIBLE) ) return TRUE;
+    return FALSE;
 }
 
 
 /*******************************************************************
- *         SetActiveWindow    (USER.59)
+ *         SetActiveWindow16    (USER.59)
  */
-HWND16 SetActiveWindow16( HWND16 hwnd )
+HWND16 WINAPI SetActiveWindow16( HWND16 hwnd )
 {
     return SetActiveWindow32(hwnd);
 }
+
+
 /*******************************************************************
- *         SetActiveWindow    (USER.59)
+ *         SetActiveWindow32    (USER32.462)
  */
-HWND32 SetActiveWindow32( HWND32 hwnd )
+HWND32 WINAPI SetActiveWindow32( HWND32 hwnd )
 {
     HWND32 prev = hwndActive;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
@@ -619,35 +626,39 @@
 
 
 /***********************************************************************
- *           BringWindowToTop   (USER.45)
+ *           BringWindowToTop16   (USER.45)
  */
-BOOL16 BringWindowToTop16( HWND16 hwnd )
+BOOL16 WINAPI BringWindowToTop16( HWND16 hwnd )
 {
     return BringWindowToTop32(hwnd);
 }
+
+
 /***********************************************************************
- *           BringWindowToTop   (USER32.10)
+ *           BringWindowToTop32   (USER32.10)
  */
-BOOL32 BringWindowToTop32( HWND32 hwnd )
+BOOL32 WINAPI BringWindowToTop32( HWND32 hwnd )
 {
     return SetWindowPos32( hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );
 }
 
 
 /***********************************************************************
- *           MoveWindow   (USER.56)
+ *           MoveWindow16   (USER.56)
  */
-BOOL16 MoveWindow16(
-	HWND16 hwnd, INT16 x, INT16 y, INT16 cx, INT16 cy, BOOL16 repaint
-) {
+BOOL16 WINAPI MoveWindow16( HWND16 hwnd, INT16 x, INT16 y, INT16 cx, INT16 cy,
+                            BOOL16 repaint )
+{
     return MoveWindow32(hwnd,x,y,cx,cy,repaint);
 }
+
+
 /***********************************************************************
- *           MoveWindow   (USER32.398)
+ *           MoveWindow32   (USER32.398)
  */
-BOOL32 MoveWindow32(
-	HWND32 hwnd, INT32 x, INT32 y, INT32 cx, INT32 cy, BOOL32 repaint
-) {    
+BOOL32 WINAPI MoveWindow32( HWND32 hwnd, INT32 x, INT32 y, INT32 cx, INT32 cy,
+                            BOOL32 repaint )
+{    
     int flags = SWP_NOZORDER | SWP_NOACTIVATE;
     if (!repaint) flags |= SWP_NOREDRAW;
     dprintf_win(stddeb, "MoveWindow: %04x %d,%d %dx%d %d\n", 
@@ -900,16 +911,18 @@
 }
 
 /***********************************************************************
- *           ShowWindow   (USER.42)
+ *           ShowWindow16   (USER.42)
  */
-BOOL16 ShowWindow16( HWND16 hwnd, INT16 cmd ) 
+BOOL16 WINAPI ShowWindow16( HWND16 hwnd, INT16 cmd ) 
 {    
     return ShowWindow32(hwnd,cmd);
 }
+
+
 /***********************************************************************
- *           ShowWindow   (USER.42)
+ *           ShowWindow32   (USER.42)
  */
-BOOL32 ShowWindow32( HWND32 hwnd, INT32 cmd ) 
+BOOL32 WINAPI ShowWindow32( HWND32 hwnd, INT32 cmd ) 
 {    
     WND* 	wndPtr = WIN_FindWndPtr( hwnd );
     BOOL32 	wasVisible, showFlag;
@@ -1019,7 +1032,8 @@
 /***********************************************************************
  *           GetInternalWindowPos16   (USER.460)
  */
-UINT16 GetInternalWindowPos16( HWND16 hwnd, LPRECT16 rectWnd, LPPOINT16 ptIcon)
+UINT16 WINAPI GetInternalWindowPos16( HWND16 hwnd, LPRECT16 rectWnd,
+                                      LPPOINT16 ptIcon )
 {
     WINDOWPLACEMENT16 wndpl;
     if (GetWindowPlacement16( hwnd, &wndpl )) 
@@ -1035,7 +1049,8 @@
 /***********************************************************************
  *           GetInternalWindowPos32   (USER32.244)
  */
-UINT32 GetInternalWindowPos32( HWND32 hwnd, LPRECT32 rectWnd, LPPOINT32 ptIcon)
+UINT32 WINAPI GetInternalWindowPos32( HWND32 hwnd, LPRECT32 rectWnd,
+                                      LPPOINT32 ptIcon )
 {
     WINDOWPLACEMENT32 wndpl;
     if (GetWindowPlacement32( hwnd, &wndpl ))
@@ -1050,7 +1065,7 @@
 /***********************************************************************
  *           GetWindowPlacement16   (USER.370)
  */
-BOOL16 GetWindowPlacement16( HWND16 hwnd, WINDOWPLACEMENT16 *wndpl )
+BOOL16 WINAPI GetWindowPlacement16( HWND16 hwnd, WINDOWPLACEMENT16 *wndpl )
 {
     WND *pWnd = WIN_FindWndPtr( hwnd );
     if( pWnd )
@@ -1079,7 +1094,7 @@
 /***********************************************************************
  *           GetWindowPlacement32   (USER32.306)
  */
-BOOL32 GetWindowPlacement32( HWND32 hwnd, WINDOWPLACEMENT32 *pwpl32 )
+BOOL32 WINAPI GetWindowPlacement32( HWND32 hwnd, WINDOWPLACEMENT32 *pwpl32 )
 {
     if( pwpl32 )
     {
@@ -1152,15 +1167,16 @@
 /***********************************************************************
  *           SetWindowPlacement16   (USER.371)
  */
-BOOL16 SetWindowPlacement16( HWND16 hwnd, const WINDOWPLACEMENT16 *wndpl )
+BOOL16 WINAPI SetWindowPlacement16(HWND16 hwnd, const WINDOWPLACEMENT16 *wndpl)
 {
-    return WINPOS_SetPlacement( hwnd, wndpl, PLACE_MIN | PLACE_MAX | PLACE_RECT );
+    return WINPOS_SetPlacement( hwnd, wndpl,
+                                PLACE_MIN | PLACE_MAX | PLACE_RECT );
 }
 
 /***********************************************************************
  *           SetWindowPlacement32   (USER32.518)
  */
-BOOL32 SetWindowPlacement32( HWND32 hwnd, const WINDOWPLACEMENT32 *pwpl32 )
+BOOL32 WINAPI SetWindowPlacement32( HWND32 hwnd, const WINDOWPLACEMENT32 *pwpl32 )
 {
     if( pwpl32 )
     {
@@ -1180,8 +1196,8 @@
 /***********************************************************************
  *           SetInternalWindowPos16   (USER.461)
  */
-void SetInternalWindowPos16( HWND16 hwnd, UINT16 showCmd,
-                             LPRECT16 rect, LPPOINT16 pt )
+void WINAPI SetInternalWindowPos16( HWND16 hwnd, UINT16 showCmd,
+                                    LPRECT16 rect, LPPOINT16 pt )
 {
     if( IsWindow16(hwnd) )
     {
@@ -1211,8 +1227,8 @@
 /***********************************************************************
  *           SetInternalWindowPos32   (USER32.482)
  */
-void SetInternalWindowPos32( HWND32 hwnd, UINT32 showCmd,
-                             LPRECT32 rect, LPPOINT32 pt )
+void WINAPI SetInternalWindowPos32( HWND32 hwnd, UINT32 showCmd,
+                                    LPRECT32 rect, LPPOINT32 pt )
 {
     if( IsWindow32(hwnd) )
     {
@@ -1270,7 +1286,9 @@
 /*******************************************************************
  *	   WINPOS_SetActiveWindow
  *
- * back-end to SetActiveWindow
+ * SetActiveWindow() back-end. This is the only function that
+ * can assign active status to a window. It must be called only
+ * for the top level windows.
  */
 BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
 {
@@ -1282,10 +1300,9 @@
     /* paranoid checks */
     if( hWnd == GetDesktopWindow32() || hWnd == hwndActive ) return 0;
 
-/* if (wndPtr && (GetTaskQueue(0) != wndPtr->hmemTaskQ))
-	return 0;
-        */
-
+/*  if (wndPtr && (GetTaskQueue(0) != wndPtr->hmemTaskQ))
+ *	return 0;
+ */
     wndPtr = WIN_FindWndPtr(hWnd);
     hOldActiveQueue = (pActiveQueue)?pActiveQueue->self : 0;
 
@@ -1432,7 +1449,7 @@
 /*******************************************************************
  *         WINPOS_ActivateOtherWindow
  *
- * DestroyWindow() helper. pWnd must be a top-level window.
+ *  Activates window other than pWnd.
  */
 BOOL32 WINPOS_ActivateOtherWindow(WND* pWnd)
 {
@@ -1446,29 +1463,27 @@
     ( hwndActive || QUEUE_IsExitingQueue(pWnd->hmemTaskQ)) )
       return 0;
 
-  if( pWnd->dwStyle & WS_POPUP &&
-      WINPOS_CanActivate( pWnd->owner ) ) pWndTo = pWnd->owner;
-  else
+  if( !(pWnd->dwStyle & WS_POPUP) || !(pWnd->owner) ||
+      !WINPOS_CanActivate((pWndTo = WIN_GetTopParentPtr(pWnd->owner))) ) 
   {
-    WND* pWndPtr = pWnd;
+      WND* pWndPtr = WIN_GetTopParentPtr(pWnd);
 
-    pWndTo = WIN_FindWndPtr(hwndPrevActive);
+      pWndTo = WIN_FindWndPtr(hwndPrevActive);
 
-    while( !WINPOS_CanActivate(pWndTo) ) 
-    {
-      /* by now owned windows should've been taken care of */
+      while( !WINPOS_CanActivate(pWndTo) ) 
+      {
+	 /* by now owned windows should've been taken care of */
 
-      pWndTo = pWndPtr->next;
-      pWndPtr = pWndTo;
-      if( !pWndTo ) return 0;
-    }
+	  pWndTo = pWndPtr->next;
+	  pWndPtr = pWndTo;
+	  if( !pWndTo ) break;
+      }
   }
 
-  bRet = WINPOS_SetActiveWindow( pWndTo->hwndSelf, FALSE, TRUE );
+  bRet = WINPOS_SetActiveWindow( pWndTo ? pWndTo->hwndSelf : 0, FALSE, TRUE );
 
   /* switch desktop queue to current active */
-  if( pWndTo->parent == WIN_GetDesktop())
-      WIN_GetDesktop()->hmemTaskQ = pWndTo->hmemTaskQ;
+  if( pWndTo ) WIN_GetDesktop()->hmemTaskQ = pWndTo->hmemTaskQ;
 
   hwndPrevActive = 0;
   return bRet;  
@@ -1951,8 +1966,8 @@
 /***********************************************************************
  *           SetWindowPos   (USER.232)
  */
-BOOL16 SetWindowPos16( HWND16 hwnd, HWND16 hwndInsertAfter, INT16 x, INT16 y,
-                       INT16 cx, INT16 cy, WORD flags )
+BOOL16 WINAPI SetWindowPos16( HWND16 hwnd, HWND16 hwndInsertAfter,
+                              INT16 x, INT16 y, INT16 cx, INT16 cy, WORD flags)
 {
     return SetWindowPos32(hwnd,(INT32)(INT16)hwndInsertAfter,x,y,cx,cy,flags);
 }
@@ -1960,8 +1975,8 @@
 /***********************************************************************
  *           SetWindowPos   (USER32.519)
  */
-BOOL32 SetWindowPos32( HWND32 hwnd, HWND32 hwndInsertAfter, INT32 x, INT32 y,
-                       INT32 cx, INT32 cy, WORD flags )
+BOOL32 WINAPI SetWindowPos32( HWND32 hwnd, HWND32 hwndInsertAfter,
+                              INT32 x, INT32 y, INT32 cx, INT32 cy, WORD flags)
 {
     WINDOWPOS32 winpos;
     WND *	wndPtr;
@@ -2273,17 +2288,7 @@
 	if (hwnd == CARET_GetHwnd()) DestroyCaret32();
 
 	if (winpos.hwnd == hwndActive)
-	{
-	      /* Activate previously active window if possible */
-	    HWND32 newActive = hwndPrevActive;
-	    if (!IsWindow32(newActive) || (newActive == winpos.hwnd))
-	    {
-		newActive = GetTopWindow32( GetDesktopWindow32() );
-		if (newActive == winpos.hwnd)
-                    newActive = wndPtr->next ? wndPtr->next->hwndSelf : 0;
-	    }	    
-	    WINPOS_ChangeActiveWindow( newActive, FALSE );
-	}
+	    WINPOS_ActivateOtherWindow( wndPtr );
     }
 
       /* Activate the window */
@@ -2325,7 +2330,7 @@
 /***********************************************************************
  *           BeginDeferWindowPos16   (USER.259)
  */
-HDWP16 BeginDeferWindowPos16( INT16 count )
+HDWP16 WINAPI BeginDeferWindowPos16( INT16 count )
 {
     return BeginDeferWindowPos32( count );
 }
@@ -2334,7 +2339,7 @@
 /***********************************************************************
  *           BeginDeferWindowPos32   (USER32.8)
  */
-HDWP32 BeginDeferWindowPos32( INT32 count )
+HDWP32 WINAPI BeginDeferWindowPos32( INT32 count )
 {
     HDWP32 handle;
     DWP *pDWP;
@@ -2355,8 +2360,9 @@
 /***********************************************************************
  *           DeferWindowPos16   (USER.260)
  */
-HDWP16 DeferWindowPos16( HDWP16 hdwp, HWND16 hwnd, HWND16 hwndAfter,
-                         INT16 x, INT16 y, INT16 cx, INT16 cy, UINT16 flags )
+HDWP16 WINAPI DeferWindowPos16( HDWP16 hdwp, HWND16 hwnd, HWND16 hwndAfter,
+                                INT16 x, INT16 y, INT16 cx, INT16 cy,
+                                UINT16 flags )
 {
     return DeferWindowPos32( hdwp, hwnd, (INT32)(INT16)hwndAfter,
                              x, y, cx, cy, flags );
@@ -2366,8 +2372,9 @@
 /***********************************************************************
  *           DeferWindowPos32   (USER32.127)
  */
-HDWP32 DeferWindowPos32( HDWP32 hdwp, HWND32 hwnd, HWND32 hwndAfter,
-                         INT32 x, INT32 y, INT32 cx, INT32 cy, UINT32 flags )
+HDWP32 WINAPI DeferWindowPos32( HDWP32 hdwp, HWND32 hwnd, HWND32 hwndAfter,
+                                INT32 x, INT32 y, INT32 cx, INT32 cy,
+                                UINT32 flags )
 {
     DWP *pDWP;
     int i;
@@ -2439,7 +2446,7 @@
 /***********************************************************************
  *           EndDeferWindowPos16   (USER.261)
  */
-BOOL16 EndDeferWindowPos16( HDWP16 hdwp )
+BOOL16 WINAPI EndDeferWindowPos16( HDWP16 hdwp )
 {
     return EndDeferWindowPos32( hdwp );
 }
@@ -2448,7 +2455,7 @@
 /***********************************************************************
  *           EndDeferWindowPos32   (USER32.172)
  */
-BOOL32 EndDeferWindowPos32( HDWP32 hdwp )
+BOOL32 WINAPI EndDeferWindowPos32( HDWP32 hdwp )
 {
     DWP *pDWP;
     WINDOWPOS32 *winpos;
@@ -2471,7 +2478,7 @@
 /***********************************************************************
  *           TileChildWindows   (USER.199)
  */
-void TileChildWindows( HWND16 parent, WORD action )
+void WINAPI TileChildWindows( HWND16 parent, WORD action )
 {
     printf("STUB TileChildWindows(%04x, %d)\n", parent, action);
 }
@@ -2479,7 +2486,7 @@
 /***********************************************************************
  *           CascageChildWindows   (USER.198)
  */
-void CascadeChildWindows( HWND16 parent, WORD action )
+void WINAPI CascadeChildWindows( HWND16 parent, WORD action )
 {
     printf("STUB CascadeChildWindows(%04x, %d)\n", parent, action);
 }
diff --git a/windows/winproc.c b/windows/winproc.c
index 10139e6..b2a9207 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -143,6 +143,8 @@
 static LRESULT WINPROC_CallWndProc32( WNDPROC32 proc, HWND32 hwnd, UINT32 msg,
                                       WPARAM32 wParam, LPARAM lParam )
 {
+/*  dprintf_relay( stddeb, "CallTo32(wndproc=%p,hwnd=%08x,msg=%08x,wp=%08x,lp=%08lx)\n",
+                   proc, hwnd, msg, wParam, lParam ); */
     return proc( hwnd, msg, wParam, lParam );
 }
 
@@ -1843,8 +1845,8 @@
 /**********************************************************************
  *	     CallWindowProc16    (USER.122)
  */
-LRESULT CallWindowProc16( WNDPROC16 func, HWND16 hwnd, UINT16 msg,
-                          WPARAM16 wParam, LPARAM lParam )
+LRESULT WINAPI CallWindowProc16( WNDPROC16 func, HWND16 hwnd, UINT16 msg,
+                                 WPARAM16 wParam, LPARAM lParam )
 {
     LRESULT result;
     WND *wndPtr;
@@ -1899,8 +1901,8 @@
 /**********************************************************************
  *	     CallWindowProc32A    (USER32.17)
  */
-LRESULT CallWindowProc32A( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
-                           WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI CallWindowProc32A( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
+                                  WPARAM32 wParam, LPARAM lParam )
 {
     WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
 
@@ -1936,8 +1938,8 @@
 /**********************************************************************
  *	     CallWindowProc32W    (USER32.18)
  */
-LRESULT CallWindowProc32W( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
-                           WPARAM32 wParam, LPARAM lParam )
+LRESULT WINAPI CallWindowProc32W( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
+                                  WPARAM32 wParam, LPARAM lParam )
 {
     WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
 
diff --git a/wine.ini b/wine.ini
index af8f3ca..8da8b56 100644
--- a/wine.ini
+++ b/wine.ini
@@ -48,10 +48,8 @@
 AllocSystemColors=100
 
 [fonts]
-;Read documentation/fonts before changing this
-Alias0 = MS Sans Serif, -adobe-helvetica-
-;Alias1 = Arial, -adobe-helvetica-, subst
-;Alias2 = Times New Roman, -adobe-times-, subst
+;Read documentation/fonts before adding aliases
+Resolution = 96
 Default = -adobe-times-
 
 [serialports]
