Release 970914

Thu Sep 11 18:24:56 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [objects/dc.c]
	In DC_SetupGCForPatBlt, replace R2_NOT by GXxor with (black xor white).

Tue Sep  9 23:04:02 1997  U. Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>

	* [memory/virtual.c] 
	Do not write debugging info unconditionally to stderr.

	* [files/profile.c]
	Call PROFILE_GetSection in PROFILE_GetString for key_name "" too.

	* [misc/crtdll.c]
	Many new functions.

	* [include/windows.h] [windows/winpos.c]
	ClientToScreen16 doesn't have a return value.

Sun Sep  7 10:06:39 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [misc/main.c] [AUTHORS]
	Update the list of contributors. Please let me know if I forgot
	someone.

	* [if1632/*.spec] [if1632/builtin.c] [tools/build.c]
	Ordinal base for Win32 DLLs is now computed automatically from the
	lowest ordinal found.

	* [include/wintypes.h]
	WINAPI is now defined as attribute((stdcall)). This will require
	gcc to compile.

	* [if1632/thunk.c]
	Removed Win32 thunks (no longer needed with stdcall).

	* [if1632/crtdll.spec] [misc/crtdll.c]
	Make sure we only reference cdecl functions in the spec file.

	* [objects/dc.c]
	Use CapNotLast drawing style for 1-pixel wide lines.

	* [tools/build.c]
	Added 'double' argument type.
	Added 'varargs' function type for Win32.
	Made CallTo16_xxx functions stdcall.

Fri Sep  5 14:50:49 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [tools/build.c] [windows/win.c] [windows/event.c] [windows/message.c]
	More fixes to get message exchange closer to the original.

	* [misc/spy.c]
	Message logs now contain window names.

	* [loader/resource.c] [loader/ne_resource.c] [loader/task.c]
	  [objects/cursoricon.c] [windows/user.c]
	Added some obscure features to fix memory leaks.

Fri Sep  5 00:46:28 1997  Jan Willamowius <jan@janhh.shnet.org>

	* [if1632/kernel32.spec] [win32/newfns.c]
	Added stub for UTRegister() and UTUnRegister().

Thu Sep  4 12:03:12 1997  Frans van Dorsselaer <dorssel@rulhmpc49.LeidenUniv.nl>
	* [controls/edit.c]
	Allow ASCII codes > 127 in WM_CHAR.

Mon Sep  1 17:23:24 1997  Dimitrie O. Paun  <dimi@mail.cs.toronto.edu>

	* [controls/widgets.c]
	In InitCommonControls, remember the name of the class
	because lpszClassName was made to point to a local array
	Added the ProgressBar to the list of implemented controls.
	Call InitCommonControls from WIDGETS_Init to register all
	implemented Common Controls.
	
	* [include/commctrl.h]
	Added misc decl for the Progress Bar.

	* [controls/progress.c] [include/progress.h]
	First attempt at implementiong the Progress Bar class.

	* [objects/brush.h]
	Implementation for GetSysColorBrush[16|32]

	* [controls/status.c]
	Use DrawEdge to draw the borders and fill the background

	* [controls/uitools.c]
	Added DrawDiagEdge32 and DrawRectEdge32

	* [graphics/painting.c]
	Implement DrawEdge[16|32]
	Started DrawFrameControl32

Mon Sep  1 10:07:09 1997  Lawson Whitney <lawson_whitney@juno.com>

	* [misc/comm.c] [include/windows.h]
	SetCommEventMask returns a SEGPTR.

Sun Aug 31 23:28:32 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [loader/pe_image.c][loader/module.c][include/pe_image.h]
	  [include/module.h]
	Cleaned up the whole Win32 library mess (a bit).

	* [debugger/stabs.c]
	If 'wine' has no absolute path and isn't found, check $PATH too.

	* [misc/ole2nls.c]
	Some fixes.

	* [misc/ver.c]
	Added support for PE style version resources.

	* [memory/string.c]
	Check for NULL pointers to _lstr* functions, just as Windows95 does.

	* [multimedia/time.c]
	Made list of timers a simple linked list.

	* [loader/resource.c]
	Netscape 3 seems to pass NEGATIVE resource Ids (in an
	unsigned int, yes). Don't know why, fixed it anyway.

	* [objects/bitmap.c]
	LoadImageW added.

	* [include/win.h][windows/win.c]
	Change wIDmenu from UINT16 to UINT32 and changed the
	SetWindow(Long|Word) accordingly.

Thu Aug 28 19:30:08 1997  Morten Welinder  <terra@diku.dk>

	* [include/windows.h]
	Add a few more colors defined for Win95.
	Add a few more brush styles.

	* [windows/syscolor.c]
 	Add error checks for SYSCOLOR_SetColor, SYSCOLOR_Init,
	GetSysColor16, GetSysColor32.  Add support for above colors.

Sun Aug 24 16:22:57 1997  Andrew Taylor <andrew@riscan.com>

	* [multimedia/mmsystem.c]
	Changed mmioDescend to use mmio functions for file I/O, neccessary
	for memory files.
diff --git a/ANNOUNCE b/ANNOUNCE
index b22dffa..e22d153 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,15 +1,15 @@
-This is release 970824 of Wine, the MS Windows emulator.  This is still a
+This is release 970914 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-970824: (see ChangeLog for details)
-	- Better Win32 menu support.
-	- Improved Winsock.
-	- UpDown control.
-	- More undocumented Win95 hacks.
+WHAT'S NEW with Wine-970914: (see ChangeLog for details)
+	- Better resource handling.
+	- New Progress control.
+	- Improved PE module support.
+	- Many relay code changes.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -18,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-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
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970914.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970914.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970914.tar.gz
+  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970914.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/AUTHORS b/AUTHORS
index 1623686..e26d62a 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -4,28 +4,121 @@
 
 @c This is a list of the Wine authors and copyright holders.
 
-Wine is available thanks to the work of Bob Amstadt, Dag Asheim,
-Martin Ayotte, Peter Bajusz, Ross Biro, Uwe Bonnes, Erik Bos, Fons
-Botman, John Brezak, Andrew Bulhak, John Burton, Niels de Carpentier,
-Jimen Ching, Huw D. M. Davies, Roman Dolejsi, Frans van Dorsselaer,
-Paul Falstad, David Faure, Claus Fischer, Olaf Flebbe, Peter Galbavy,
-Ramon Garcia, Matthew Ghio, Hans de Graaff, Charles M. Hannum, John
-Harvey, Cameron Heide, Jochen Hoenicke, Onno Hovers, Jeffrey Hsu,
-Miguel de Icaza, Jukka Iivonen, Lee Jaekil, Alexandre Julliard, Bang
-Jun-Young, Pavel Kankovsky, Jochen Karrer, Andreas Kirschbaum,
-Albrecht Kleine, Jon Konrath, Alex Korobka, Greg Kreider, Anand
-Kumria, Scott A. Laird, Andrew Lewycky, Martin von Loewis, Kenneth
-MacDonald, Peter MacDonald, William Magro, Juergen Marquardt, Ricardo
-Massaro, Marcus Meissner, Graham Menhennitt, David Metcalfe, Bruce
-Milner, Steffen Moeller, Andreas Mohr, Philippe De Muyter, Itai
-Nahshon, Michael Patra, Jim Peterson, Robert Pouliot, Keith Reynolds,
-Slaven Rezic, John Richardson, Johannes Ruscheinski, Thomas Sandford,
-Constantine Sapuntzakis, Pablo Saratxaga, Daniel Schepler, Ulrich
-Schmid, Bernd Schmidt, Yngvi Sigurjonsson, Stephen Simmons, Rick
-Sladkey, William Smith, Dominik Strasser, Vadim Strizhevsky, Erik
-Svendsen, Tristan Tarrant, Andrew Taylor, Duncan C Thomson, Goran
-Thyni, Jimmy Tirtawangsa, Jon Tombs, Linus Torvalds, Gregory
-Trubetskoy, Petri Tuomola, Michael Veksler, Sven Verdoolaege, Ronan
-Waide, Eric Warnke, Manfred Weichel, Morten Welinder, Jan Willamowius,
-Carl Williams, Karl Guenter Wuensch, Eric Youngdale, James Youngman,
-Mikolaj Zalewski, and John Zero.
+Wine is available thanks to the work of:
+Bob Amstadt,
+Dag Asheim,
+Martin Ayotte,
+Peter Bajusz,
+Georg Beyerle,
+Ross Biro,
+Uwe Bonnes,
+Erik Bos,
+Fons Botman,
+John Brezak,
+Andrew Bulhak,
+John Burton,
+Niels de Carpentier,
+Jimen Ching,
+David A. Cuthbert,
+Huw D. M. Davies,
+Roman Dolejsi,
+Frans van Dorsselaer,
+Chris Faherty,
+Paul Falstad,
+David Faure,
+Claus Fischer,
+Olaf Flebbe,
+Chad Fraleigh,
+Peter Galbavy,
+Ramon Garcia,
+Matthew Ghio,
+Jody Goldberg,
+Hans de Graaff,
+Charles M. Hannum,
+Adrian Harvey,
+John Harvey,
+Cameron Heide,
+Jochen Hoenicke,
+Onno Hovers,
+Jeffrey Hsu,
+Miguel de Icaza,
+Jukka Iivonen,
+Lee Jaekil,
+Alexandre Julliard,
+Bang Jun-Young,
+Pavel Kankovsky,
+Jochen Karrer,
+Andreas Kirschbaum,
+Albrecht Kleine,
+Jon Konrath,
+Alex Korobka,
+Greg Kreider,
+Anand Kumria,
+Scott A. Laird,
+Andrew Lewycky,
+Martin von Loewis,
+Michiel van Loon,
+Kenneth MacDonald,
+Peter MacDonald,
+William Magro,
+Juergen Marquardt,
+Ricardo Massaro,
+Marcus Meissner,
+Graham Menhennitt,
+David Metcalfe,
+Bruce Milner,
+Steffen Moeller,
+Andreas Mohr,
+Philippe De Muyter,
+Itai Nahshon,
+Henrik Olsen,
+Michael Patra,
+Dimitrie O. Paun,
+Jim Peterson,
+Robert Pouliot,
+Keith Reynolds,
+Slaven Rezic,
+John Richardson,
+Rick Richardson,
+Doug Ridgway,
+Bernhard Rosenkraenzer,
+Johannes Ruscheinski,
+Thomas Sandford,
+Constantine Sapuntzakis,
+Pablo Saratxaga,
+Daniel Schepler,
+Peter Schlaile,
+Ulrich Schmid,
+Bernd Schmidt,
+Ingo Schneider,
+Victor Schneider,
+Yngvi Sigurjonsson,
+Stephen Simmons,
+Rick Sladkey,
+William Smith,
+Dominik Strasser,
+Vadim Strizhevsky,
+Erik Svendsen,
+Tristan Tarrant,
+Andrew Taylor,
+Duncan C Thomson,
+Goran Thyni,
+Jimmy Tirtawangsa,
+Jon Tombs,
+Linus Torvalds,
+Gregory Trubetskoy,
+Petri Tuomola,
+Michael Veksler,
+Sven Verdoolaege,
+Ronan Waide,
+Eric Warnke,
+Manfred Weichel,
+Morten Welinder,
+Lawson Whitney,
+Jan Willamowius,
+Carl Williams,
+Karl Guenter Wuensch,
+Eric Youngdale,
+James Youngman,
+Mikolaj Zalewski,
+and John Zero.
diff --git a/BUGS b/BUGS
index 05f5253..13a5ffd 100644
--- a/BUGS
+++ b/BUGS
@@ -5,10 +5,15 @@
 add new entries and, more importantly, remove those for the 
 bugs you fixed ;-)
 ------------------------------------------------------------
-As of June 1997 -
+As of Sept 1997 -
 
 General:
 
+ * LoadAccelerators() must not create any objects apart
+   from loading the resource.
+
+ * Catch/Throw() do not save SI and DI registers (quite fatal).
+
  * We need to do InsertMenuItem32[AW] and then code most of the other
    inserting function in terms of this.  Without this, we cannot support
    all the new extended menus.  Not hard, but slightly big.
@@ -36,6 +41,17 @@
 
 Miscellaneous:
 
+ * nBytesWidth in CURSORICONINFO is bogus for some bpp
+   (doesn't reflect the fact that bits are packed and 16-bit aligned).
+
+ * Progman and AOL complain about being unable to convert bitmaps
+   (probably because of bytes width stuff).
+
+ * Netscape displays partially downloaded inline graphics with
+   wrong offsets. Bitmap is missing in the splash-window.
+
+ * BCW 4.5 crashes after SwitchStackBack().
+
  * Text alignment problems in Word and Write (variable pitch fonts).
 
  * Font mapper weights
diff --git a/ChangeLog b/ChangeLog
index 94d3fd9..b9e775e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,154 @@
 ----------------------------------------------------------------------
+Thu Sep 11 18:24:56 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>
+
+	* [objects/dc.c]
+	In DC_SetupGCForPatBlt, replace R2_NOT by GXxor with (black xor white).
+
+Tue Sep  9 23:04:02 1997  U. Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>
+
+	* [memory/virtual.c] 
+	Do not write debugging info unconditionally to stderr.
+
+	* [files/profile.c]
+	Call PROFILE_GetSection in PROFILE_GetString for key_name "" too.
+
+	* [misc/crtdll.c]
+	Many new functions.
+
+	* [include/windows.h] [windows/winpos.c]
+	ClientToScreen16 doesn't have a return value.
+
+Sun Sep  7 10:06:39 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [misc/main.c] [AUTHORS]
+	Update the list of contributors. Please let me know if I forgot
+	someone.
+
+	* [if1632/*.spec] [if1632/builtin.c] [tools/build.c]
+	Ordinal base for Win32 DLLs is now computed automatically from the
+	lowest ordinal found.
+
+	* [include/wintypes.h]
+	WINAPI is now defined as attribute((stdcall)). This will require
+	gcc to compile.
+
+	* [if1632/thunk.c]
+	Removed Win32 thunks (no longer needed with stdcall).
+
+	* [if1632/crtdll.spec] [misc/crtdll.c]
+	Make sure we only reference cdecl functions in the spec file.
+
+	* [objects/dc.c]
+	Use CapNotLast drawing style for 1-pixel wide lines.
+
+	* [tools/build.c]
+	Added 'double' argument type.
+	Added 'varargs' function type for Win32.
+	Made CallTo16_xxx functions stdcall.
+
+Fri Sep  5 14:50:49 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>
+
+	* [tools/build.c] [windows/win.c] [windows/event.c] [windows/message.c]
+	More fixes to get message exchange closer to the original.
+
+	* [misc/spy.c]
+	Message logs now contain window names.
+
+	* [loader/resource.c] [loader/ne_resource.c] [loader/task.c]
+	  [objects/cursoricon.c] [windows/user.c]
+	Added some obscure features to fix memory leaks.
+
+Fri Sep  5 00:46:28 1997  Jan Willamowius <jan@janhh.shnet.org>
+
+	* [if1632/kernel32.spec] [win32/newfns.c]
+	Added stub for UTRegister() and UTUnRegister().
+
+Thu Sep  4 12:03:12 1997  Frans van Dorsselaer <dorssel@rulhmpc49.LeidenUniv.nl>
+	* [controls/edit.c]
+	Allow ASCII codes > 127 in WM_CHAR.
+
+Mon Sep  1 17:23:24 1997  Dimitrie O. Paun  <dimi@mail.cs.toronto.edu>
+
+	* [controls/widgets.c]
+	In InitCommonControls, remember the name of the class
+	because lpszClassName was made to point to a local array
+	Added the ProgressBar to the list of implemented controls.
+	Call InitCommonControls from WIDGETS_Init to register all
+	implemented Common Controls.
+	
+	* [include/commctrl.h]
+	Added misc decl for the Progress Bar.
+
+	* [controls/progress.c] [include/progress.h]
+	First attempt at implementiong the Progress Bar class.
+
+	* [objects/brush.h]
+	Implementation for GetSysColorBrush[16|32]
+
+	* [controls/status.c]
+	Use DrawEdge to draw the borders and fill the background
+
+	* [controls/uitools.c]
+	Added DrawDiagEdge32 and DrawRectEdge32
+
+	* [graphics/painting.c]
+	Implement DrawEdge[16|32]
+	Started DrawFrameControl32
+
+Mon Sep  1 10:07:09 1997  Lawson Whitney <lawson_whitney@juno.com>
+
+	* [misc/comm.c] [include/windows.h]
+	SetCommEventMask returns a SEGPTR.
+
+Sun Aug 31 23:28:32 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [loader/pe_image.c][loader/module.c][include/pe_image.h]
+	  [include/module.h]
+	Cleaned up the whole Win32 library mess (a bit).
+
+	* [debugger/stabs.c]
+	If 'wine' has no absolute path and isn't found, check $PATH too.
+
+	* [misc/ole2nls.c]
+	Some fixes.
+
+	* [misc/ver.c]
+	Added support for PE style version resources.
+
+	* [memory/string.c]
+	Check for NULL pointers to _lstr* functions, just as Windows95 does.
+
+	* [multimedia/time.c]
+	Made list of timers a simple linked list.
+
+	* [loader/resource.c]
+	Netscape 3 seems to pass NEGATIVE resource Ids (in an
+	unsigned int, yes). Don't know why, fixed it anyway.
+
+	* [objects/bitmap.c]
+	LoadImageW added.
+
+	* [include/win.h][windows/win.c]
+	Change wIDmenu from UINT16 to UINT32 and changed the
+	SetWindow(Long|Word) accordingly.
+
+Thu Aug 28 19:30:08 1997  Morten Welinder  <terra@diku.dk>
+
+	* [include/windows.h]
+	Add a few more colors defined for Win95.
+	Add a few more brush styles.
+
+	* [windows/syscolor.c]
+ 	Add error checks for SYSCOLOR_SetColor, SYSCOLOR_Init,
+	GetSysColor16, GetSysColor32.  Add support for above colors.
+
+Sun Aug 24 16:22:57 1997  Andrew Taylor <andrew@riscan.com>
+
+	* [multimedia/mmsystem.c]
+	Changed mmioDescend to use mmio functions for file I/O, neccessary
+	for memory files.
+
+----------------------------------------------------------------------
 Sat Aug 23 00:05:23 1997  Andreas Mohr <100.30936@germany.net>
 
 	* [if1632/kernel.spec] [if1632/mmsystem.spec]
diff --git a/controls/Makefile.in b/controls/Makefile.in
index 9d24345..9be0848 100644
--- a/controls/Makefile.in
+++ b/controls/Makefile.in
@@ -13,9 +13,11 @@
 	icontitle.c \
 	listbox.c \
 	menu.c \
+	progress.c \
 	scroll.c \
 	static.c \
 	status.c \
+	uitools.c \
 	updown.c \
 	widgets.c
 
diff --git a/controls/edit.c b/controls/edit.c
index 28373cd..7e32b57 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -982,11 +982,17 @@
 						segptr + start, index, count, action);
 		LocalUnlock16(hloc16);
 		return ret;
-	} else if (es->word_break_proc32A)
-		return (INT32)CallWordBreakProc32A((FARPROC32)es->word_break_proc32A,
-						es->text + start, index, count, action);
+	}
+        else if (es->word_break_proc32A)
+        {
+            dprintf_relay( stddeb, "CallTo32(wordbrk=%p,str='%s',idx=%d,cnt=%d,act=%d)\n",
+                           es->word_break_proc32A, es->text + start, index,
+                           count, action );
+            return (INT32)es->word_break_proc32A( es->text + start, index,
+                                                  count, action );
+        }
 	else
-		return EDIT_WordBreakProc(es->text + start, index, count, action);
+            return EDIT_WordBreakProc(es->text + start, index, count, action);
 }
 
 
@@ -2819,7 +2825,7 @@
 			EDIT_EM_ReplaceSel(wnd, es, TRUE, "\t");
 		break;
 	default:
-		if (!(es->style & ES_READONLY) && (c >= ' ') && (c != 127)) {
+		if (!(es->style & ES_READONLY) && ((BYTE)c >= ' ') && (c != 127)) {
 			char str[2];
  			str[0] = c;
  			str[1] = '\0';
diff --git a/controls/listbox.c b/controls/listbox.c
index 5466abe..1308e81 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -2462,7 +2462,7 @@
 
     default:
         if ((msg >= WM_USER) && (msg < 0xc000))
-            fprintf(stderr,"Listbox %04x: unknown msg %04x wp %08x lp %08lx\n",
+            dprintf_listbox(stddeb,"Listbox %04x: unknown msg %04x wp %08x lp %08lx\n",
                     hwnd, msg, wParam, lParam );
         return DefWindowProc32A( hwnd, msg, wParam, lParam );
     }
diff --git a/controls/menu.c b/controls/menu.c
index 5a1e28c..9e08d31 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -1141,48 +1141,44 @@
 /***********************************************************************
  *	     MENU_PatchResidentPopup
  */
-BOOL32 MENU_PatchResidentPopup( HQUEUE16 checkQueue, WND* wndOwner )
+BOOL32 MENU_PatchResidentPopup( HQUEUE16 checkQueue, WND* checkWnd )
 {
-   /* checkQueue tells us whether we have to disconnect top
-    * popup from the wndOwner or (if the latter is NULL) from 
-    * the checkQueue. If checkQueue is 0 then we need to set 
-    * popup owner to the wndOwner.
-    *
-    * This is supposed to be called when top popup is hidden. */
-
     if( pTopPopupWnd )
     {
 	HTASK16 hTask = 0;
 
-	dprintf_menu(stddeb,"patching resident popup: %04x, %08x\n", 
-				   checkQueue, (unsigned) wndOwner);
-	if( wndOwner )
-	{
-	    if( pTopPopupWnd->owner == wndOwner )
-	    {
-		if( checkQueue ) pTopPopupWnd->owner = NULL;
-		return TRUE;
-	    }
-	
-	    /* switch to the new owner */
+	dprintf_menu(stddeb,"patching resident popup: %04x %04x [%04x %04x]\n", 
+		checkQueue, checkWnd ? checkWnd->hwndSelf : 0, pTopPopupWnd->hmemTaskQ, 
+		pTopPopupWnd->owner ? pTopPopupWnd->owner->hwndSelf : 0);
 
-	    if( wndOwner->hmemTaskQ == pTopPopupWnd->hmemTaskQ ) 
-		return TRUE;
-	    hTask = QUEUE_GetQueueTask( wndOwner->hmemTaskQ );
-	} 
-	else if( pTopPopupWnd->hmemTaskQ == checkQueue )
+	switch( checkQueue )
 	{
-	    /* switch to the different task */
+	    case 0: /* checkWnd is the new popup owner */
+		 if( checkWnd )
+		 {
+		     pTopPopupWnd->owner = checkWnd;
+		     if( pTopPopupWnd->hmemTaskQ != checkWnd->hmemTaskQ )
+			 hTask = QUEUE_GetQueueTask( checkWnd->hmemTaskQ );
+		 }
+		 break;
 
-	    hTask = QUEUE_GetQueueTask( pTopPopupWnd->hmemTaskQ );
-	    hTask = TASK_GetNextTask( hTask );  
+	    case 0xFFFF: /* checkWnd is destroyed */
+		 if( pTopPopupWnd->owner == checkWnd )
+		     pTopPopupWnd->owner = NULL;
+		 return TRUE; 
+
+	    default: /* checkQueue is exiting */
+		 if( pTopPopupWnd->hmemTaskQ == checkQueue )
+		 {
+		     hTask = QUEUE_GetQueueTask( pTopPopupWnd->hmemTaskQ );
+		     hTask = TASK_GetNextTask( hTask );
+		 }
+		 break;
 	}
 
 	if( hTask )
 	{
 	    TDB* task = (TDB*)GlobalLock16( hTask );
-
-	    pTopPopupWnd->owner = wndOwner;
 	    if( task )
 	    {
 		pTopPopupWnd->hInstance = task->hInstance;
@@ -3537,7 +3533,7 @@
     if (!name) return 0;
     
     /* check for Win32 module */
-    instance = GetExePtr( instance );
+    instance = MODULE_HANDLEtoHMODULE16( instance );
     if (MODULE_GetPtr(instance)->flags & NE_FFLAGS_WIN32)
         return LoadMenu32A(instance,PTR_SEG_TO_LIN(name));
 
@@ -3837,7 +3833,7 @@
 
     miia.cbSize        = sizeof(miia);
     miia.fMask         = mii->fMask;
-    miia.dwTypeData    = miia.dwTypeData;
+    miia.dwTypeData    = mii->dwTypeData;
     miia.fType         = mii->fType;
     miia.fState        = mii->fState;
     miia.wID           = mii->wID;
diff --git a/controls/progress.c b/controls/progress.c
new file mode 100644
index 0000000..c0311e2
--- /dev/null
+++ b/controls/progress.c
@@ -0,0 +1,208 @@
+/*		
+ * Progress control
+ *
+ * Copyright 1997 Dimitrie O. Paun
+ *
+ * TODO:
+ *   - I do not know what to to on WM_[SG]ET_FONT
+ * Problems:
+ *   - I think I do not compute correctly the numer of leds to be drawn
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "windows.h"
+#include "syscolor.h"
+#include "sysmetrics.h"
+#include "progress.h"
+#include "graphics.h"
+#include "heap.h"
+#include "win.h"
+#include "stddebug.h"
+#include "debug.h"
+
+/* Control configuration constants */
+
+#define LED_WIDTH  8
+#define LED_GAP    2
+
+/* Work constants */
+
+#define UNKNOWN_PARAM(msg, wParam, lParam) dprintf_progress(stddeb, \
+        "Progress Ctrl: Unknown parameter(s) for message " #msg     \
+	"(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam); 
+
+#define PROGRESS_GetInfoPtr(wndPtr) ((PROGRESS_INFO *)wndPtr->wExtra)
+
+
+/***********************************************************************
+ *           PROGRESS_Paint
+ * Draw the arrows. The background need not be erased.
+ * If dc!=0, it draws on it
+ */
+static void PROGRESS_Paint(WND *wndPtr, HDC32 dc)
+{
+  PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr);
+  HBRUSH32 ledBrush;
+  int rightBar, rightMost;
+  PAINTSTRUCT32 ps;
+  RECT32 rect;
+  HDC32 hdc;
+
+  dprintf_progress(stddeb, "Progress Bar: paint pos=%d min=%d, max=%d\n",
+		   infoPtr->CurVal, infoPtr->MinVal, infoPtr->MaxVal);
+
+  /* get a dc */
+  hdc = dc==0 ? BeginPaint32(wndPtr->hwndSelf, &ps) : dc;
+
+  /* get the required brush */
+  ledBrush = GetSysColorBrush32(COLOR_HIGHLIGHT);
+
+  /* get rect for the bar, adjusted for the border */
+  GetClientRect32(wndPtr->hwndSelf, &rect);
+
+  /* draw the border */
+  DrawEdge32(hdc, &rect, BDR_SUNKENOUTER, BF_RECT|BF_ADJUST|BF_MIDDLE);
+  rect.left++; rect.right--; rect.top++; rect.bottom--;
+  rightMost = rect.right;
+
+  /* compute extent of progress bar */
+  rightBar = rect.left + 
+    MulDiv32(infoPtr->CurVal-infoPtr->MinVal,
+	     rect.right - rect.left,
+	     infoPtr->MaxVal-infoPtr->MinVal);
+
+  /* now draw the bar */
+  while(rect.left < rightBar) { 
+    rect.right = rect.left+LED_WIDTH;
+    FillRect32(hdc, &rect, ledBrush);
+    rect.left  = rect.right+LED_GAP;
+  }
+
+  /* clean-up */  
+  if(!dc)
+    EndPaint32(wndPtr->hwndSelf, &ps);
+}
+
+/***********************************************************************
+ *           PROGRESS_CoercePos
+ * Makes sure the current position (CUrVal) is within bounds.
+ */
+static void PROGRESS_CoercePos(WND *wndPtr)
+{
+  PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr); 
+
+  if(infoPtr->CurVal < infoPtr->MinVal)
+    infoPtr->CurVal = infoPtr->MinVal;
+  if(infoPtr->CurVal > infoPtr->MaxVal)
+    infoPtr->CurVal = infoPtr->MaxVal;
+}
+
+/***********************************************************************
+ *           ProgressWindowProc
+ */
+LRESULT WINAPI ProgressWindowProc(HWND32 hwnd, UINT32 message, 
+                                  WPARAM32 wParam, LPARAM lParam)
+{
+  WND *wndPtr = WIN_FindWndPtr(hwnd);
+  PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr); 
+  UINT32 temp;
+
+  switch(message)
+    {
+    case WM_CREATE:
+      /* initialize the info struct */
+      infoPtr->MinVal=0; 
+      infoPtr->MaxVal=100;
+      infoPtr->CurVal=0; 
+      infoPtr->Step=10;
+      dprintf_updown(stddeb, "Progress Ctrl creation, hwnd=%04x\n", hwnd);
+      break;
+    
+    case WM_DESTROY:
+      dprintf_updown(stddeb, "Progress Ctrl destruction, hwnd=%04x\n", hwnd);
+      break;
+
+    case WM_ERASEBKGND:
+      /* pretend to erase it here, but we will do it in the paint
+	 function to avoid flicker */
+      return 1;
+	
+    case WM_GETFONT:
+      /* FIXME: What do we need to do? */
+      break;
+
+    case WM_SETFONT:
+      /* FIXME: What do we need to do? */
+      break;
+
+    case WM_PAINT:
+      PROGRESS_Paint(wndPtr, wParam);
+      break;
+    
+    case PBM_DELTAPOS:
+      if(lParam)
+	UNKNOWN_PARAM(PBM_DELTAPOS, wParam, lParam);
+      temp = infoPtr->CurVal;
+      if(wParam != 0){
+	infoPtr->CurVal += (UINT16)wParam;
+	PROGRESS_CoercePos(wndPtr);
+	PROGRESS_Paint(wndPtr, 0);
+      }
+      return temp;
+
+    case PBM_SETPOS:
+      if (lParam)
+	UNKNOWN_PARAM(PBM_SETPOS, wParam, lParam);
+      temp = infoPtr->CurVal;
+      if(temp != wParam){
+	infoPtr->CurVal = (UINT16)wParam;
+	PROGRESS_CoercePos(wndPtr);
+	PROGRESS_Paint(wndPtr, 0);
+      }
+      return temp;          
+      
+    case PBM_SETRANGE:
+      if (wParam)
+	UNKNOWN_PARAM(PBM_SETRANGE, wParam, lParam);
+      temp = MAKELONG(infoPtr->MinVal, infoPtr->MaxVal);
+      if(temp != lParam){
+	infoPtr->MinVal = LOWORD(lParam); 
+	infoPtr->MaxVal = HIWORD(lParam);
+	if(infoPtr->MaxVal <= infoPtr->MinVal)
+	  infoPtr->MaxVal = infoPtr->MinVal+1;
+	PROGRESS_CoercePos(wndPtr);
+	PROGRESS_Paint(wndPtr, 0);
+      }
+      return temp;
+
+    case PBM_SETSTEP:
+      if (lParam)
+	UNKNOWN_PARAM(PBM_SETSTEP, wParam, lParam);
+      temp = infoPtr->Step;   
+      infoPtr->Step = (UINT16)wParam;   
+      return temp;
+
+    case PBM_STEPIT:
+      if (wParam || lParam)
+	UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam);
+      temp = infoPtr->CurVal;   
+      infoPtr->CurVal += infoPtr->Step;
+      if(infoPtr->CurVal > infoPtr->MaxVal)
+	infoPtr->CurVal = infoPtr->MinVal;
+      if(temp != infoPtr->CurVal)
+	PROGRESS_Paint(wndPtr, 0);
+      return temp;
+    
+    default: 
+      if (message >= WM_USER) 
+	fprintf( stderr, "Progress Ctrl: unknown msg %04x wp=%04x lp=%08lx\n", 
+		 message, wParam, lParam );
+      return DefWindowProc32A( hwnd, message, wParam, lParam ); 
+    } 
+
+    return 0;
+}
+
+
+
diff --git a/controls/status.c b/controls/status.c
index 0732664..df14c53 100644
--- a/controls/status.c
+++ b/controls/status.c
@@ -41,34 +41,29 @@
 void WINAPI DrawStatusText32A( HDC32 hdc, LPRECT32 lprc, LPCSTR text,
                                UINT32 style )
 {
-    RECT32		r, rt;
+    RECT32 r, rt;
     int	oldbkmode;
+    UINT32 border;
 
     r = *lprc;
 
-    if (style == 0 ||
-	style == SBT_POPOUT) {
-	InflateRect32(&r, -1, -1);
-	SelectObject32(hdc, sysColorObjects.hbrushScrollbar);
-	Rectangle32(hdc, r.left, r.top, r.right, r.bottom);
+    if(style == SBT_OWNERDRAW){
+      /* FIXME for SBT_OWNERDRAW, SBT_RTLREADING */
+    }
+    else{
+      DrawEdge32(hdc, &r, BDR_RAISEDINNER, BF_RECT|BF_ADJUST|BF_FLAT);
 
-	/* draw border */
-	SelectObject32(hdc, sysColorObjects.hpenWindowFrame);
-	if (style == 0)
-	    DrawEdge32(hdc, &r, EDGE_SUNKEN, BF_RECT);
-	else
-	    DrawEdge32(hdc, &r, EDGE_RAISED, BF_RECT);
-    }
-    else if (style == SBT_NOBORDERS) {
-	SelectObject32(hdc, sysColorObjects.hbrushScrollbar);
-	Rectangle32(hdc, r.left, r.top, r.right, r.bottom);
-    }
-    else {	/* fixme for SBT_OWNERDRAW, SBT_RTLREADING */
-	
-    }
+      if(style==SBT_POPOUT)
+	border = BDR_RAISEDOUTER;
+      else if(style==SBT_NOBORDERS)
+	border = 0;
+      else
+	border = BDR_SUNKENOUTER;
 
-    /* now draw text */
-    if ((style != SBT_OWNERDRAW) && text) {
+      DrawEdge32(hdc, &r, border, BF_RECT | BF_ADJUST | BF_MIDDLE);
+
+      /* now draw text */
+      if (text) {
 	SelectObject32(hdc, sysColorObjects.hpenWindowText);
 	oldbkmode = SetBkMode32(hdc, TRANSPARENT);
 	rt = r;
@@ -77,8 +72,10 @@
 		    &rt, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
 
 	if (oldbkmode != TRANSPARENT)
-	    SetBkMode32(hdc, oldbkmode);
+	  SetBkMode32(hdc, oldbkmode);
+      }
     }
+
 }
 
 static BOOL32 SW_Refresh( HWND32 hwnd, HDC32 hdc, STATUSWINDOWINFO *self )
diff --git a/controls/uitools.c b/controls/uitools.c
new file mode 100644
index 0000000..b245ebc
--- /dev/null
+++ b/controls/uitools.c
@@ -0,0 +1,390 @@
+/*
+ * User Interface Functions
+ *
+ * Copyright 1997 Dimitrie O. Paun
+ */
+
+#include <stdio.h>
+#include "windows.h"
+#include "debug.h"
+
+/***********************************************************************
+ *           UITOOLS_DrawDiagEdge
+ *
+ * Same as DrawEdge, but with BF_DIAGONAL
+ * I tested it extensively and as far as I can tell it is identical to the
+ * implementaion in Win95.
+ * I do not like that I create and
+ * use the 3 Pens to draw the diagonals. It would be better to draw them
+ * using the brushes returned by GetSysColorBrush func, but I did not have
+ * the patience to implement that yet.
+ */
+static BOOL32 UITOOLS_DrawDiagEdge(HDC32 hdc, RECT32 *rect, UINT32 edge,
+                                   UINT32 flags)
+{
+  HPEN32 facePen, shadowPen, lightPen, blackPen, grayPen, nullPen;
+  HPEN32 iPen, oPen, oldPen;
+  HBRUSH32 oldBrush, faceBrush;
+  int cl, cr, ct, cb;
+  BOOL32 mainDiag;
+  POINT32 tp;
+  RECT32 r;
+
+  /* If both rasied and sunken is specified, they anihilate one another */
+  if( !((flags & BF_MONO) || (flags & BF_FLAT)) ){
+    if( (edge & BDR_RAISEDOUTER) && (edge & BDR_SUNKENOUTER) )
+      return FALSE;
+    if( (edge & BDR_RAISEDINNER) && (edge & BDR_SUNKENINNER) )
+      return FALSE;
+  }
+
+  /* Create/get the tools of the trade... */
+  facePen = CreatePen32(PS_SOLID, 0, GetSysColor32(COLOR_BTNFACE));
+  shadowPen = CreatePen32(PS_SOLID, 0, GetSysColor32(COLOR_BTNSHADOW));
+  lightPen = CreatePen32(PS_SOLID, 0, GetSysColor32(COLOR_BTNHILIGHT));
+  grayPen = CreatePen32(PS_SOLID, 0, RGB(168, 152, 144));
+  blackPen = GetStockObject32(BLACK_PEN);
+  nullPen = GetStockObject32(NULL_PEN);
+  faceBrush = GetSysColorBrush32(COLOR_BTNFACE);
+  oldPen = SelectObject32(hdc, nullPen);
+  oldBrush = SelectObject32(hdc, faceBrush);
+
+  /* this is my working rectangle */
+  r = *rect;
+
+  if(flags & BF_MONO){
+    oPen = blackPen;
+    iPen = nullPen;
+  }else if(flags & BF_FLAT){
+    oPen = shadowPen;
+    iPen = facePen;
+  }else {
+    if(flags & BF_SOFT){
+      if(flags & BF_BOTTOM){
+	oPen = (edge & BDR_RAISEDOUTER) ? blackPen : lightPen;
+	iPen = (edge & BDR_RAISEDINNER) ? shadowPen : grayPen;
+      }
+      else{
+	oPen = (edge & BDR_RAISEDOUTER) ? lightPen : blackPen;
+	iPen = (edge & BDR_RAISEDINNER) ? grayPen : shadowPen;
+      }
+    }
+    else{
+      if(flags & BF_BOTTOM){
+	oPen = (edge & BDR_RAISEDOUTER) ? blackPen : lightPen;
+	iPen = (edge & BDR_RAISEDINNER) ? shadowPen : grayPen;
+      }
+      else{
+	oPen = (edge & BDR_RAISEDOUTER) ? grayPen : shadowPen;
+	iPen = (edge & BDR_RAISEDINNER) ? lightPen : blackPen;
+      }
+    }
+  }
+
+  if(flags & BF_BOTTOM){
+    if(flags & BF_LEFT){
+      cr = -1; cl =  0;
+      ct =  0; cb = -1;
+      mainDiag = TRUE;
+      tp.x = r.left; tp.y = r.top;
+    }
+    else{ /* RIGHT */
+      cr = -1; cl =  0;
+      ct =  1; cb =  0;
+      tp.x = r.left; tp.y = r.bottom-1;
+      mainDiag = FALSE;
+    }
+  }
+  else{  /* TOP */
+    if(flags & BF_LEFT){
+      cr =  0; cl =  1;
+      ct =  0; cb = -1;
+      mainDiag = FALSE;
+      tp.x = r.right; tp.y = r.top;
+    }
+    else{ /* RIGHT */
+      cr =  0; cl =  1;
+      ct =  1; cb =  0;
+      tp.x = r.right; tp.y = r.bottom-1;
+      mainDiag = TRUE;
+    }
+  }
+
+  /* if it has external edge, draw it */
+  if(edge & BDR_OUTER){
+    SelectObject32(hdc, oPen);
+    MoveToEx32(hdc, r.left, mainDiag ? r.bottom-1 : r.top, 0);
+    LineTo32(hdc, r.right, mainDiag ? r.top-1 : r.bottom);
+    r.left += cl; r.right += cr; r.top += ct; r.bottom += cb;
+  }
+
+  /* if it has internal edge, draw it */
+  if(edge & BDR_INNER){
+    SelectObject32(hdc, iPen);
+    MoveToEx32(hdc, r.left, mainDiag ? r.bottom-1 : r.top, 0);
+    LineTo32(hdc, r.right, mainDiag ? r.top-1 : r.bottom);
+    r.left += cl; r.right += cr; r.top += ct; r.bottom += cb;
+  }
+
+  if((flags & BF_MIDDLE) && !(flags & BF_MONO)){
+    POINT32 p[3];
+    p[0].x = mainDiag ? r.right: r.left;
+    p[0].y = r.top;
+    p[1].x = mainDiag ? r.left : r.right;
+    p[1].y = r.bottom;
+    p[2].x = tp.x;
+    p[2].y = tp.y;
+    SelectObject32(hdc, nullPen);
+    SelectObject32(hdc, faceBrush);
+    Polygon32(hdc, p, 3);
+  }
+
+  if(flags & BF_ADJUST)
+    *rect = r;
+
+  /* Restore the DC */
+  SelectObject32(hdc, oldPen);
+  SelectObject32(hdc, oldBrush);
+
+  /* Clean-up */
+  DeleteObject32(facePen);
+  DeleteObject32(shadowPen);
+  DeleteObject32(lightPen);
+  DeleteObject32(grayPen);
+
+  return TRUE;
+}
+
+
+/***********************************************************************
+ *           UITOOLS_DrawRectEdge
+ *
+ * Same as DrawEdge, but without BF_DIAGONAL
+ * I tested this function and it works very well. You should not change it
+ * unless you find a bug. If you don't like the colors, it it not its 
+ * fault - the system colors are not OK.
+ * Again, I tested this function on Win95 and I compared the output with the
+ * one generated by the native DrawEdge and it is identical on all cases that
+ * I tried, and I tried quite a few.
+ */
+static BOOL32 UITOOLS_DrawRectEdge(HDC32 hdc, RECT32 *rect,
+                                   UINT32 edge, UINT32 flags)
+{
+  HBRUSH32 faceBrush, shadowBrush, lightBrush, blackBrush, grayBrush, nullBrush;
+  HBRUSH32 iNBrush, iSBrush, iEBrush, iWBrush;
+  HBRUSH32 oNBrush, oSBrush, oEBrush, oWBrush;
+  HBRUSH32 oldBrush;
+  RECT32 r;
+
+  /* If both rasied and sunken is specified, they anihilate one another */
+  if( !((flags & BF_MONO) || (flags & BF_FLAT)) ){
+    if( (edge & BDR_RAISEDOUTER) && (edge & BDR_SUNKENOUTER) )
+      return FALSE;
+    if( (edge & BDR_RAISEDINNER) && (edge & BDR_SUNKENINNER) )
+      return FALSE;
+  }
+
+  faceBrush = GetSysColorBrush32(COLOR_BTNFACE);
+  shadowBrush = GetSysColorBrush32(COLOR_BTNSHADOW);
+  lightBrush = GetSysColorBrush32(COLOR_BTNHILIGHT);
+  blackBrush = GetStockObject32(BLACK_BRUSH);
+  grayBrush = GetStockObject32(LTGRAY_BRUSH);
+  nullBrush = GetStockObject32(NULL_BRUSH);
+  oldBrush = SelectObject32(hdc, nullBrush);
+
+  /* this is my working rectangle */
+  r = *rect;
+
+  if(flags & BF_MONO){
+    oNBrush = oSBrush = oEBrush = oWBrush = blackBrush;
+    iNBrush = iSBrush = iEBrush = iWBrush = nullBrush;
+  }else if(flags & BF_FLAT){
+    oNBrush = oSBrush = oEBrush = oWBrush = shadowBrush;
+    iNBrush = iSBrush = iEBrush = iWBrush = faceBrush;
+  }else {
+    if(flags & BF_SOFT){
+      oNBrush = oWBrush = (edge & BDR_RAISEDOUTER) ? lightBrush  : blackBrush;
+      oSBrush = oEBrush = (edge & BDR_RAISEDOUTER) ? blackBrush  : lightBrush;
+      iNBrush = iWBrush = (edge & BDR_RAISEDINNER) ? grayBrush   : shadowBrush;
+      iSBrush = iEBrush = (edge & BDR_RAISEDINNER) ? shadowBrush : grayBrush;
+    }
+    else{
+      oNBrush = oWBrush = (edge & BDR_RAISEDOUTER) ? grayBrush   : shadowBrush;
+      oSBrush = oEBrush = (edge & BDR_RAISEDOUTER) ? blackBrush  : lightBrush;
+      iNBrush = iWBrush = (edge & BDR_RAISEDINNER) ? lightBrush  : blackBrush;
+      iSBrush = iEBrush = (edge & BDR_RAISEDINNER) ? shadowBrush : grayBrush;
+    }
+  }
+
+  /* if it has external edge, draw it */
+  if(edge & BDR_OUTER){
+    if(flags & BF_RIGHT){
+      SelectObject32(hdc, oEBrush);
+      PatBlt32(hdc, r.right-1, r.top, 1, r.bottom - r.top, PATCOPY);
+      r.right--;
+    }
+    if(flags & BF_BOTTOM){
+      SelectObject32(hdc, oSBrush);
+      PatBlt32(hdc, r.left, r.bottom-1, r.right-r.left, 1, PATCOPY);
+      r.bottom--;
+    }
+    if(flags & BF_LEFT){
+      SelectObject32(hdc, oWBrush);
+      PatBlt32(hdc, r.left, r.top, 1, r.bottom - r.top, PATCOPY);
+      r.left++;
+    }
+    if(flags & BF_TOP){
+      SelectObject32(hdc, oNBrush);
+      PatBlt32(hdc, r.left, r.top, r.right-r.left, 1, PATCOPY);
+      r.top++;
+    }
+  }
+
+  /* if it has internal edge, draw it */
+  if(edge & BDR_INNER){
+    if(flags & BF_RIGHT){
+      SelectObject32(hdc, iEBrush);
+      PatBlt32(hdc, r.right-1, r.top, 1, r.bottom - r.top, PATCOPY);
+      r.right--;
+    }
+    if(flags & BF_BOTTOM){
+      SelectObject32(hdc, iSBrush);
+      PatBlt32(hdc, r.left, r.bottom-1, r.right-r.left, 1, PATCOPY);
+      r.bottom--;
+    }
+    if(flags & BF_LEFT){
+      SelectObject32(hdc, iWBrush);
+      PatBlt32(hdc, r.left, r.top, 1, r.bottom - r.top, PATCOPY);
+      r.left++;
+    }
+    if(flags & BF_TOP){
+      SelectObject32(hdc, iNBrush);
+      PatBlt32(hdc, r.left, r.top, r.right-r.left, 1, PATCOPY);
+      r.top++;
+    }
+  }
+
+  /* if we got to fill the middle, to it now */
+  if((flags & BF_MIDDLE) && !(flags & BF_MONO))
+    FillRect32(hdc, &r, faceBrush);
+
+  /* adjust the rectangle if required */
+  if(flags & BF_ADJUST)
+    *rect = r;
+
+  /* Restore the DC */
+  SelectObject32(hdc, oldBrush);
+
+  return TRUE;
+}
+
+
+/**********************************************************************
+ *          DrawEdge16   (USER.659)
+ */
+BOOL16 WINAPI DrawEdge16( HDC16 hdc, LPRECT16 rc, UINT16 edge, UINT16 flags )
+{
+    RECT32 rect32;
+    BOOL32 ret;
+
+    CONV_RECT16TO32( rc, &rect32 );
+    ret = DrawEdge32( hdc, &rect32, edge, flags );
+    CONV_RECT32TO16( &rect32, rc );
+    return ret;
+}
+
+/**********************************************************************
+ *          DrawEdge32   (USER32.154)
+ */
+BOOL32 WINAPI DrawEdge32( HDC32 hdc, LPRECT32 rc, UINT32 edge, UINT32 flags )
+{
+    dprintf_graphics( stddeb, "DrawEdge: %04x %d,%d-%d,%d %04x %04x\n",
+                      hdc, rc->left, rc->top, rc->right, rc->bottom,
+                      edge, flags );
+
+    if(flags & BF_DIAGONAL)
+      return UITOOLS_DrawDiagEdge(hdc, rc, edge, flags);
+    else
+      return UITOOLS_DrawRectEdge(hdc, rc, edge, flags);
+}
+
+
+/***********************************************************************
+ *           UITOOLS_DrawFrameButton
+ */
+static BOOL32 UITOOLS_DrawFrameButton(HDC32 hdc, LPRECT32 rc, UINT32 uState)
+{
+    fprintf( stdnimp,"DrawFrameButton(%x,%p,%x), empty stub!\n",
+             hdc,rc,uState );
+    return FALSE;
+}
+
+/***********************************************************************
+ *           UITOOLS_DrawFrameCaption
+ */
+static BOOL32 UITOOLS_DrawFrameCaption(HDC32 hdc, LPRECT32 rc, UINT32 uState)
+{
+    fprintf( stdnimp,"DrawFrameCaption(%x,%p,%x), empty stub!\n",
+             hdc,rc,uState );
+    return FALSE;
+}
+
+/***********************************************************************
+ *           UITOOLS_DrawFrameMenu
+ */
+static BOOL32 UITOOLS_DrawFrameMenu(HDC32 hdc, LPRECT32 rc, UINT32 uState)
+{
+    fprintf( stdnimp,"DrawFrameMenu32(%x,%p,%x), empty stub!\n",
+             hdc,rc,uState );
+    return FALSE;
+}
+
+/***********************************************************************
+ *           UITOOLS_DrawFrameScroll
+ */
+static BOOL32 UITOOLS_DrawFrameScroll(HDC32 hdc, LPRECT32 rc, UINT32 uState)
+{
+    fprintf( stdnimp,"DrawFrameScroll32(%x,%p,%x), empty stub!\n",
+             hdc,rc,uState );
+    return FALSE;
+}
+
+
+/**********************************************************************
+ *          DrawFrameControl16  (USER.656)
+ */
+BOOL16 WINAPI DrawFrameControl16( HDC16 hdc, LPRECT16 rc, UINT16 uType,
+                                  UINT16 uState )
+{
+    RECT32 rect32;
+    BOOL32 ret;
+
+    CONV_RECT16TO32( rc, &rect32 );
+    ret = DrawFrameControl32( hdc, &rect32, uType, uState );
+    CONV_RECT32TO16( &rect32, rc );
+    return ret;
+}
+
+
+/**********************************************************************
+ *          DrawFrameControl32  (USER32.157)
+ */
+BOOL32 WINAPI DrawFrameControl32( HDC32 hdc, LPRECT32 rc, UINT32 uType,
+                                  UINT32 uState )
+{
+    switch(uType)
+    {
+    case DFC_BUTTON:
+      return UITOOLS_DrawFrameButton(hdc, rc, uState);
+    case DFC_CAPTION:
+      return UITOOLS_DrawFrameCaption(hdc, rc, uState);
+    case DFC_MENU:
+      return UITOOLS_DrawFrameMenu(hdc, rc, uState);
+    case DFC_SCROLL:
+      return UITOOLS_DrawFrameScroll(hdc, rc, uState);
+    default:
+      fprintf( stdnimp,"DrawFrameControl32(%x,%p,%d,%x), bad type!\n",
+	       hdc,rc,uType,uState );
+    }
+    return FALSE;
+}
diff --git a/controls/updown.c b/controls/updown.c
index a3a75ef..4282300 100644
--- a/controls/updown.c
+++ b/controls/updown.c
@@ -8,6 +8,7 @@
  *     arrow keys
  *   - I am not sure about the default values for the Min, Max, Pos
  *     (in the UPDOWN_INFO the fields: MinVal, MaxVal, CurVal)
+ *   - I think I do not handle correctly the WS_BORDER style.
  * Testing:
  *   Not much. The following  have not been tested at all:
  *     - horizontal arrows
@@ -20,10 +21,7 @@
  *   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.
+ *   I do not like the arrows yet, I'll work more on them later on.
  */
 
 #include <stdlib.h>
@@ -47,10 +45,10 @@
 #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 */
+#define DEFAULT_WIDTH    14  /* default width of the ctrl */
+#define DEFAULT_XSEP      0  /* default separation between buddy and crtl */
+#define DEFAULT_ADDTOP    0  /* amount to extend above the buddy window */
+#define DEFAULT_ADDBOT    0  /* amount to extend below the buddy window */
 
 
 /* Work constants */
@@ -65,9 +63,6 @@
 
 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);
@@ -129,7 +124,7 @@
   if (wndPtr->dwStyle & UDS_HORZ) {
     len = rect->right - rect->left; /* compute the width */
     if (incr)
-      rect->left = len/2;
+      rect->left = len/2+1; 
     else
       rect->right = len/2;
   }
@@ -138,7 +133,7 @@
     if (incr)
       rect->bottom = len/2;
     else
-      rect->top = len/2;
+      rect->top = len/2+1;
   }
 }
 
@@ -290,48 +285,57 @@
 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];
+  const int rw = rect->right - rect->left;
+  const int rh = rect->bottom - rect->top;
+  int offset = pressed ? 1 : 0;
+  int th, x, y, len;
 
+  /* compute max extents of the triangle */
   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;
+    th = (3*rh)/5-2*4;
+    if(th > rw/2)
+      th = rw/2;
+    if(th < 2)
+      th = 2;
 
-    if(incr){
-      tmp = pts[2].x;
-      pts[2].x = pts[0].x;
-      pts[0].x = pts[1].x = tmp;
-    }
+    /* compute the position of the tip */
+    y = (rect->top+rect->bottom+1)/2 + offset; 
+    if(incr)
+      x = (rect->left+rect->right+1)/2 + (2*th)/3 + offset;
+    else
+      x = (rect->left+rect->right)/2 + th/3 + offset;
+
+    for(len=1; th>0; th--, len+=2){
+      MoveToEx32(hdc, x, y, 0);
+      LineTo32(hdc, x, y+len);
+      if(incr) x--;
+      else     x++;
+      y++;
+    }  
   }
   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;
+    th = (3*rw)/5-2*4;
+    if(th > rh/2)
+      th = rh/2;
+    if(th < 2)
+      th = 2;
 
-    if(incr){
-      tmp = pts[2].y;
-      pts[2].y = pts[0].y;
-      pts[0].y = pts[1].y = tmp;
+    /* compute the position of the tip */
+    x = (rect->left+rect->right+1)/2 + offset;
+    if(incr)
+      y = (rect->top+rect->bottom+1)/2 - th/3 + offset;
+    else
+      y = (rect->top+rect->bottom)/2 + (2*th)/3 + offset;
+
+    for(len=1; th>0; th--, len+=2){
+      MoveToEx32(hdc, x, y, 0);
+      LineTo32(hdc, x+len, y);
+      if(incr) y++;
+      else     y--;
+      x--;
     }
+    
   }
-  Polygon32(hdc, pts, 3);
 
 }
 
@@ -350,14 +354,6 @@
 
   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));
@@ -365,9 +361,12 @@
   /* 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);
+  DrawEdge32(hdc, &rect, prssed?EDGE_SUNKEN:EDGE_RAISED, BF_RECT|BF_MIDDLE);
   UPDOWN_DrawArrow(hdc, &rect, TRUE, prssed, wndPtr->dwStyle & UDS_HORZ);
+
+  /* Draw the space between the buttons */
+  rect.top = rect.bottom; rect.bottom++;
+  DrawEdge32(hdc, &rect, 0, BF_MIDDLE);
 		    
   /* Draw the decr button */
   UPDOWN_GetArrowRect(wndPtr, &rect, FALSE);
@@ -634,7 +633,7 @@
  *           UpDownWndProc
  */
 LRESULT WINAPI UpDownWindowProc(HWND32 hwnd, UINT32 message, WPARAM32 wParam,
-                                LPARAM lParam)
+				LPARAM lParam)
 {
   WND *wndPtr = WIN_FindWndPtr(hwnd);
   UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr); 
@@ -643,6 +642,9 @@
   switch(message)
     {
     case WM_CREATE:
+      /* get rid of border, if any */
+      wndPtr->dwStyle &= ~WS_BORDER;
+
       /* initialize the info struct */
       infoPtr->AccelCount=0; infoPtr->AccelVect=0; 
       infoPtr->CurVal=0; infoPtr->MinVal=0; infoPtr->MaxVal=100; /*FIXME*/
@@ -745,7 +747,7 @@
 	UNKNOWN_PARAM(UDM_GETACCEL, wParam, lParam);
 	return 0;
       }
-      temp = min(infoPtr->AccelCount, wParam);
+      temp = MIN(infoPtr->AccelCount, wParam);
       memcpy((void *)lParam, infoPtr->AccelVect, temp*sizeof(UDACCEL));
       return temp;
 
diff --git a/controls/widgets.c b/controls/widgets.c
index c8b9990..9c1d4a3 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -9,8 +9,10 @@
 #include "win.h"
 #include "commctrl.h"
 #include "button.h"
+#include "progress.h"
 #include "static.h"
 #include "status.h"
+#include "updown.h"
 #include "scroll.h"
 #include "updown.h"
 #include "desktop.h"
@@ -104,7 +106,9 @@
     { 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 }
+      sizeof(UPDOWN_INFO), 0, 0, 0, 0, 0, UPDOWN_CLASS32A },
+    { CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW, ProgressWindowProc, 0,
+      sizeof(PROGRESS_INFO), 0, 0, 0, 0, 0, PROGRESS_CLASS32A }
 };
 
 #define NB_COMMON_CONTROLS32 \
@@ -155,6 +159,8 @@
         if (!(bicAtomTable[i] = RegisterClass32A( class32 ))) return FALSE;
     }
 
+    /* FIXME: hack to enable using built-in controls with Windows COMCTL32 */
+    InitCommonControls();
     SEGPTR_FREE(name);
     return TRUE;
 }
@@ -167,15 +173,18 @@
 {
     int i;
     char name[30];
+    const char *old_name;
     WNDCLASS32A *class32 = WIDGETS_CommonControls32;
 
     for (i = 0; i < NB_COMMON_CONTROLS32; i++, class32++)
     {
         /* Just to make sure the string is > 0x10000 */
+        old_name = class32->lpszClassName;
         strcpy( name, (char *)class32->lpszClassName );
         class32->lpszClassName = name;
         class32->hCursor = LoadCursor16( 0, IDC_ARROW );
         RegisterClass32A( class32 );
+        class32->lpszClassName = old_name;	
     }
 }
 
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 39541c1..cd84c90 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -553,7 +553,7 @@
  */
 void DebugBreak32( CONTEXT *regs )
 {
-    const char *module = MODULE_GetModuleName( GetExePtr(GetCurrentTask()) );
+    const char *module = MODULE_GetModuleName( GetCurrentTask() );
     fprintf( stderr, "%s called DebugBreak\n", module ? module : "???" );
     DEBUG_context = *regs;
     DEBUG_Main( SIGTRAP );
@@ -564,7 +564,7 @@
  */
 void DebugBreak16( CONTEXT *regs )
 {
-    const char *module = MODULE_GetModuleName( GetExePtr(GetCurrentTask()) );
+    const char *module = MODULE_GetModuleName( GetCurrentTask() );
     fprintf( stderr, "%s called DebugBreak\n", module ? module : "???" );
     DEBUG_context = *regs;
     DEBUG_Main( SIGTRAP );
diff --git a/debugger/msc.c b/debugger/msc.c
index 61bab5a..3bc69af 100644
--- a/debugger/msc.c
+++ b/debugger/msc.c
@@ -886,8 +886,7 @@
  * We don't fully process it here for performance reasons.
  */
 int
-DEBUG_RegisterDebugInfo(int fd, struct pe_data * pe, 
-			int load_addr, u_long v_addr, u_long size)
+DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr, u_long v_addr, u_long size)
 {
   int			  has_codeview = FALSE;
   int			  rtn = FALSE;
@@ -957,10 +956,7 @@
 	   * to proceed if we know what we need to do next.
 	   */
 	  deefer->dbg_size = dbgptr->SizeOfData;
-	  deefer->dbg_info = (char *) xmalloc(dbgptr->SizeOfData);
-	  lseek(fd, dbgptr->PointerToRawData, SEEK_SET);
-	  read(fd, deefer->dbg_info, deefer->dbg_size);
-
+	  deefer->dbg_info = pe->mappeddll+dbgptr->PointerToRawData;
 	  deefer->load_addr = (char *) load_addr;
 	  deefer->dbgdir = dbgptr;
 	  deefer->next = dbglist;
diff --git a/debugger/registers.c b/debugger/registers.c
index 5ed74dd..c280bb7 100644
--- a/debugger/registers.c
+++ b/debugger/registers.c
@@ -128,7 +128,7 @@
  *
  * Set the register values from a sigcontext. 
  */
-extern void DEBUG_SetSigContext( const SIGCONTEXT *sigcontext )
+void DEBUG_SetSigContext( const SIGCONTEXT *sigcontext )
 {
     EAX_reg(&DEBUG_context) = EAX_sig(sigcontext);
     EBX_reg(&DEBUG_context) = EBX_sig(sigcontext);
@@ -164,7 +164,7 @@
  *
  * Build a sigcontext from the register values.
  */
-extern void DEBUG_GetSigContext( SIGCONTEXT *sigcontext )
+void DEBUG_GetSigContext( SIGCONTEXT *sigcontext )
 {
     EAX_sig(sigcontext) = EAX_reg(&DEBUG_context);
     EBX_sig(sigcontext) = EBX_reg(&DEBUG_context);
diff --git a/debugger/stabs.c b/debugger/stabs.c
index dcdeaeb..0fe8e41 100644
--- a/debugger/stabs.c
+++ b/debugger/stabs.c
@@ -1085,6 +1085,25 @@
   status = stat(filename, &statbuf);
   if( status == -1 )
     {
+      char *s,*t,*fn,*paths;
+      if (strchr(filename,'/'))
+      	goto leave;
+      paths = xstrdup(getenv("PATH"));
+      s = paths;
+      while (s && *s) {
+      	t = strchr(s,':');
+	if (t) *t='\0';
+	fn = (char*)xmalloc(strlen(filename)+1+strlen(s)+1);
+	strcpy(fn,s);
+	strcat(fn,"/");
+	strcat(fn,filename);
+	if ((rtn = DEBUG_ProcessElfObject(fn,load_offset))) {
+      		free(paths);
+		goto leave;
+	}
+	s = t+1;
+      }
+      free(paths);
       goto leave;
     }
 
diff --git a/files/profile.c b/files/profile.c
index eb15ace..a034d86 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -501,7 +501,7 @@
     PROFILEKEY *key = NULL;
 
     if (!def_val) def_val = "";
-    if (key_name)
+    if (key_name && key_name[0])
     {
         key = PROFILE_Find( &CurProfile.section, section, key_name, FALSE );
         PROFILE_CopyEntry( buffer, (key && key->value) ? key->value : def_val,
@@ -839,6 +839,14 @@
                                        buffer, len, wininiW );
 }
 
+/***********************************************************************
+ *           GetProfileSection32A   (KERNEL32.268)
+ */
+INT32 WINAPI GetProfileSection32A( LPCSTR section, LPSTR buffer, INT32 len )
+{
+    return GetPrivateProfileSection32A( section, buffer, len, "win.ini" );
+}
+
 
 /***********************************************************************
  *           WriteProfileString16   (KERNEL.59)
@@ -963,6 +971,16 @@
     return ret;
 }
 
+/***********************************************************************
+ *           GetPrivateProfileSection32A   (KERNEL32.255)
+ */
+INT32 WINAPI GetPrivateProfileSection32A( LPCSTR section, LPSTR buffer,
+                                         INT32 len, LPCSTR filename )
+{
+    if (PROFILE_Open( filename ))
+        return PROFILE_GetString( section, NULL, NULL, buffer, len );
+    return 0;
+}
 
 
 /***********************************************************************
diff --git a/graphics/fontengine.c b/graphics/fontengine.c
index 4dd6e1f..1676836 100644
--- a/graphics/fontengine.c
+++ b/graphics/fontengine.c
@@ -10,7 +10,7 @@
 /* GDI 300 */
 WORD WINAPI EngineEnumerateFont(LPSTR fontname, FARPROC16 proc, DWORD data )
 {
-    printf("In engineEnumerateFont for %s\n",(fontname)?fontname:"NULL");
+    fprintf(stderr,"EngineEnumerateFont(%s,%p,%d),stub\n",fontname,proc,data);
     return 0;
 }
 #ifdef NOTDEF
@@ -23,7 +23,7 @@
 /* GDI 302 */
 WORD WINAPI EngineRealizeFont(LPLOGFONT16 lplogFont, LPTEXTXFORM16 lptextxform, LPFONTINFO16 lpfontInfo)
 {
-    printf("In EngineRealizeFont\n");
+    fprintf(stderr,"EngineRealizeFont(%p,%p,%p),stub\n",lplogFont,lptextxform,lpfontInfo);
     
     return 0;
 }
diff --git a/graphics/painting.c b/graphics/painting.c
index efd785a..5fef330 100644
--- a/graphics/painting.c
+++ b/graphics/painting.c
@@ -25,6 +25,12 @@
 #include "debug.h"
 #include "xmalloc.h"
 
+BOOL32 DrawDiagEdge32(HDC32 hdc, RECT32 *rect, UINT32 edge, UINT32 flags);
+BOOL32 DrawRectEdge32(HDC32 hdc, RECT32 *rect, UINT32 edge, UINT32 flags);
+BOOL32 DrawFrameButton32(HDC32 hdc, LPRECT32 rc, UINT32 uState);
+BOOL32 DrawFrameCaption32(HDC32 hdc, LPRECT32 rc, UINT32 uState);
+BOOL32 DrawFrameMenu32(HDC32 hdc, LPRECT32 rc, UINT32 uState);
+BOOL32 DrawFrameScroll32(HDC32 hdc, LPRECT32 rc, UINT32 uState);
 
 /***********************************************************************
  *           LineTo16    (GDI.19)
@@ -659,127 +665,6 @@
 
 
 /**********************************************************************
- *          DrawEdge16   (USER.659)
- */
-BOOL16 WINAPI DrawEdge16( HDC16 hdc, LPRECT16 rc, UINT16 edge, UINT16 flags )
-{
-    RECT32 rect32;
-    BOOL32 ret;
-
-    CONV_RECT16TO32( rc, &rect32 );
-    ret = DrawEdge32( hdc, &rect32, edge, flags );
-    CONV_RECT32TO16( &rect32, rc );
-    return ret;
-}
-
-
-/**********************************************************************
- *          DrawEdge32   (USER32.154)
- */
-BOOL32 WINAPI DrawEdge32( HDC32 hdc, LPRECT32 rc, UINT32 edge, UINT32 flags )
-{
-    HBRUSH32 hbrushOld;
-
-    if (flags >= BF_DIAGONAL)
-        fprintf( stderr, "DrawEdge: unsupported flags %04x\n", flags );
-
-    dprintf_graphics( stddeb, "DrawEdge: %04x %d,%d-%d,%d %04x %04x\n",
-                      hdc, rc->left, rc->top, rc->right, rc->bottom,
-                      edge, flags );
-
-    /* First do all the raised edges */
-
-    hbrushOld = SelectObject32( hdc, sysColorObjects.hbrushBtnHighlight );
-    if (edge & BDR_RAISEDOUTER)
-    {
-        if (flags & BF_LEFT) PatBlt32( hdc, rc->left, rc->top,
-                                       1, rc->bottom - rc->top - 1, PATCOPY );
-        if (flags & BF_TOP) PatBlt32( hdc, rc->left, rc->top,
-                                      rc->right - rc->left - 1, 1, PATCOPY );
-    }
-    if (edge & BDR_SUNKENOUTER)
-    {
-        if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 1, rc->top,
-                                        1, rc->bottom - rc->top, PATCOPY );
-        if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left, rc->bottom - 1,
-                                         rc->right - rc->left, 1, PATCOPY );
-    }
-    if (edge & BDR_RAISEDINNER)
-    {
-        if (flags & BF_LEFT) PatBlt32( hdc, rc->left + 1, rc->top + 1, 
-                                       1, rc->bottom - rc->top - 2, PATCOPY );
-        if (flags & BF_TOP) PatBlt32( hdc, rc->left + 1, rc->top + 1,
-                                      rc->right - rc->left - 2, 1, PATCOPY );
-    }
-    if (edge & BDR_SUNKENINNER)
-    {
-        if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 2, rc->top + 1,
-                                        1, rc->bottom - rc->top - 2, PATCOPY );
-        if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left + 1, rc->bottom - 2,
-                                         rc->right - rc->left - 2, 1, PATCOPY );
-    }
-
-    /* Then do all the sunken edges */
-
-    SelectObject32( hdc, sysColorObjects.hbrushBtnShadow );
-    if (edge & BDR_SUNKENOUTER)
-    {
-        if (flags & BF_LEFT) PatBlt32( hdc, rc->left, rc->top,
-                                       1, rc->bottom - rc->top - 1, PATCOPY );
-        if (flags & BF_TOP) PatBlt32( hdc, rc->left, rc->top,
-                                      rc->right - rc->left - 1, 1, PATCOPY );
-    }
-    if (edge & BDR_RAISEDOUTER)
-    {
-        if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 1, rc->top,
-                                        1, rc->bottom - rc->top, PATCOPY );
-        if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left, rc->bottom - 1,
-                                         rc->right - rc->left, 1, PATCOPY );
-    }
-    if (edge & BDR_SUNKENINNER)
-    {
-        if (flags & BF_LEFT) PatBlt32( hdc, rc->left + 1, rc->top + 1, 
-                                       1, rc->bottom - rc->top - 2, PATCOPY );
-        if (flags & BF_TOP) PatBlt32( hdc, rc->left + 1, rc->top + 1,
-                                      rc->right - rc->left - 2, 1, PATCOPY );
-    }
-    if (edge & BDR_RAISEDINNER)
-    {
-        if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 2, rc->top + 1,
-                                        1, rc->bottom - rc->top - 2, PATCOPY );
-        if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left + 1, rc->bottom - 2,
-                                         rc->right - rc->left - 2, 1, PATCOPY );
-    }
-
-    SelectObject32( hdc, hbrushOld );
-    return TRUE;
-}
-
-
-/**********************************************************************
- *          DrawFrameControl16  (USER.656)
- */
-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 );
-    return TRUE;
-}
-
-
-/**********************************************************************
- *          DrawFrameControl32  (USER32.157)
- */
-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 );
-    return TRUE;
-}
-
-/**********************************************************************
  *          DrawFrameControl32  (USER32.152)
  */
 BOOL32 WINAPI DrawAnimatedRects32( HWND32 hwnd, int idAni,
@@ -795,7 +680,7 @@
 	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",
+	fprintf(stderr,"DrawStateA(%x,%x,%p,0x%08lx,0x%08x,%d,%d,%d,%d,%d),stub\n",
 		hdc,hbrush,drawstateproc,lparam,wparam,x,y,z,a,b
 	);
 	return TRUE;
diff --git a/graphics/win16drv/prtdrv.c b/graphics/win16drv/prtdrv.c
index 672dc89..086c41b 100644
--- a/graphics/win16drv/prtdrv.c
+++ b/graphics/win16drv/prtdrv.c
@@ -82,7 +82,7 @@
 	      pLPD = ptmpLPD;
 	}
     }
-    if (pLPD == NULL) printf("Couldn't find driver %s\n", pszDriver);
+    if (pLPD == NULL) fprintf(stderr,"Couldn't find driver %s\n", pszDriver);
     return pLPD;
 }
 
@@ -132,7 +132,7 @@
     }
     if (!bSlotFound)
     {
-	printf("Too many printers drivers loaded\n");
+	fprintf(stderr,"Too many printers drivers loaded\n");
 	return NULL;
     }
 
@@ -381,7 +381,7 @@
                                   lP1, lP2, lP3, lP4);
     }
     else 
-        printf("Failed to find device\n");
+        fprintf(stderr,"Failed to find device\n");
     
     dprintf_win16drv(stddeb, "PRTDRV_EnumDFonts: return %x\n", wRet);
     return wRet;
@@ -423,7 +423,7 @@
                                   lP1, wP2, lP3, lP4);
     }
     else 
-        printf("Failed to find device\n");
+        fprintf(stderr,"Failed to find device\n");
     
     dprintf_win16drv(stddeb, "PRTDRV_EnumDFonts: return %x\n", wRet);
     return wRet;
@@ -465,7 +465,7 @@
             nSize = sizeof(LOGFONT16); 
             break;
         default:
-	    printf("PRTDRV_RealizeObject: Object type %d not supported\n", wStyle);
+	    fprintf(stderr,"PRTDRV_RealizeObject: Object type %d not supported\n", wStyle);
             nSize = 0;
             
 	}
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index 4b112e2..7118cbe 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -2033,15 +2033,15 @@
 HFONT32 X11DRV_FONT_SelectObject( DC* dc, HFONT32 hfont, FONTOBJ* font )
 {
     HFONT32 hPrevFont = 0;
-    LOGFONT16	lf;
+    LOGFONT16 lf;
 
     if( CHECK_PFONT(dc->u.x.font) ) 
         XFONT_ReleaseCacheEntry( __PFONT(dc->u.x.font) );
 
     /* 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;
+    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;
diff --git a/if1632/advapi32.spec b/if1632/advapi32.spec
index 7920995..c776a65 100644
--- a/if1632/advapi32.spec
+++ b/if1632/advapi32.spec
@@ -1,6 +1,5 @@
 name	advapi32
 type	win32
-base	0
 
 0000 stub AbortSystemShutdownA
 0001 stub AbortSystemShutdownW
diff --git a/if1632/builtin.c b/if1632/builtin.c
index 6cc4527..0f2e4b9 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -33,6 +33,7 @@
     int                 size;       /* Number of functions */
     const void         *code_start; /* Start of DLL code */
     const void        **functions;  /* Pointer to functions table */
+    const void        **nodbg_functions;  /* Pointer to funcs without debug */
     const char * const *names;      /* Pointer to names table */
 } WIN32_DESCRIPTOR;
 
@@ -395,8 +396,8 @@
     relay = (BYTE *)relay - 11;  /* The relay entry point is 11 bytes long */
     funcs = dll->descr->u.win32.functions;
     for (i = 0; i < dll->descr->u.win32.size;i++) if (*funcs++ == relay) break;
-    sprintf( buffer, "%s.%d: %s",
-             dll->descr->name, i, dll->descr->u.win32.names[i] );
+    sprintf( buffer, "%s.%d: %s", dll->descr->name,
+             dll->descr->u.win32.base + i, dll->descr->u.win32.names[i] );
     return buffer;
 }
 
@@ -411,6 +412,7 @@
 {
     BUILTIN_DLL *dll = (BUILTIN_DLL *)pModule->pe_module;
     const WIN32_DESCRIPTOR *info = &dll->descr->u.win32;
+    WORD ordinal = 0;
 
     if (!dll) return NULL;
 
@@ -422,17 +424,25 @@
                         function, dll->descr->name );
         for (i = 0; i < info->size; i++)
             if (info->names[i] && !strcmp( function, info->names[i] ))
-                return (FARPROC32)info->functions[i];
+            {
+                ordinal = info->base + i;
+                break;
+            }
+        if (i >= info->size) return NULL;  /* not found */
     }
     else  /* Find function by ordinal */
     {
-        WORD ordinal = LOWORD(function);
+        ordinal = LOWORD(function);
         dprintf_module( stddeb, "Looking for ordinal %d in %s\n",
                         ordinal, dll->descr->name );
-        if (ordinal && ordinal < info->size)
-            return (FARPROC32)info->functions[ordinal - info->base];
+        if ((ordinal < info->base) || (ordinal >= info->base + info->size))
+            return NULL;  /* not found */
     }
-    return NULL;
+#if testing
+    if (!debugging_relay)
+        return (FARPROC32)info->nodbg_functions[ordinal - info->base];
+#endif
+    return (FARPROC32)info->functions[ordinal - info->base];
 }
 
 
diff --git a/if1632/comctl32.spec b/if1632/comctl32.spec
index d2f1efa..197247f 100644
--- a/if1632/comctl32.spec
+++ b/if1632/comctl32.spec
@@ -1,72 +1,71 @@
 name	comctl32
 type	win32
-base	2
 
 # Functions exported by the Win95 comctl32.dll 
 # (these need to have these exact ordinals, because some win95 dlls 
 #  import comctl32.dll by ordinal)
 
-00 stub MenuHelp
-01 stub ShowHideMenuCtl
-02 stub GetEffectiveClientRect
-03 stdcall DrawStatusTextA(long ptr ptr long) DrawStatusText32A
-04 stdcall CreateStatusWindowA(long ptr long long) CreateStatusWindow32A
-05 stub CreateToolbar
-06 stub CreateMappedBitmap
-07 stub Cctl1632_ThunkData32
-08 stub CreatePropertySheetPage
-09 stub CreatePropertySheetPageA
-10 stub CreatePropertySheetPageW
-11 stub MakeDragList
-12 stub LBItemFromPt
-13 stub DrawInsert
-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
-18 stub CreateToolbarEx
-19 stub DestroyPropertySheetPage
-20 stub DllGetVersion
-21 stub DrawStatusText
-22 stub DrawStatusTextW
-23 stub ImageList_Add
-24 stub ImageList_AddIcon
-25 stub ImageList_AddMasked
-26 stub ImageList_BeginDrag
-27 stub ImageList_Copy
-28 stub ImageList_Create
-29 stub ImageList_Destroy
-30 stub ImageList_DragEnter
-31 stub ImageList_DragLeave
-32 stub ImageList_DragMove
-33 stub ImageList_DragShowNolock
-34 stub ImageList_Draw
-35 stub ImageList_DrawEx
-36 stub ImageList_EndDrag
-37 stub ImageList_GetBkColor
-38 stub ImageList_GetDragImage
-39 stub ImageList_GetIcon
-40 stub ImageList_GetIconSize
-41 stub ImageList_GetImageCount
-42 stub ImageList_GetImageInfo
-43 stub ImageList_GetImageRect
-44 stub ImageList_LoadImage
-45 stub ImageList_LoadImageA
-46 stub ImageList_LoadImageW
-47 stub ImageList_Merge
-48 stub ImageList_Read
-49 stub ImageList_Remove
-50 stub ImageList_Replace
-51 stub ImageList_ReplaceIcon
-52 stub ImageList_SetBkColor
-53 stub ImageList_SetDragCursorImage
-54 stub ImageList_SetFilter
-55 stub ImageList_SetIconSize
-56 stub ImageList_SetImageCount
-57 stub ImageList_SetOverlayImage
-58 stub ImageList_Write
-59 stub InitCommonControlsEx
-60 stub PropertySheet
-61 stub PropertySheetA
-62 stub PropertySheetW
-63 stub _TrackMouseEvent
+  2 stub MenuHelp
+  3 stub ShowHideMenuCtl
+  4 stub GetEffectiveClientRect
+  5 stdcall DrawStatusTextA(long ptr ptr long) DrawStatusText32A
+  6 stdcall CreateStatusWindowA(long ptr long long) CreateStatusWindow32A
+  7 stub CreateToolbar
+  8 stub CreateMappedBitmap
+  9 stub Cctl1632_ThunkData32
+ 10 stub CreatePropertySheetPage
+ 11 stub CreatePropertySheetPageA
+ 12 stub CreatePropertySheetPageW
+ 13 stub MakeDragList
+ 14 stub LBItemFromPt
+ 15 stub DrawInsert
+ 16 stdcall CreateUpDownControl(long long long long long long long long long long long long) CreateUpDownControl
+ 17 stdcall InitCommonControls() InitCommonControls
+ 18 stub CreateStatusWindow
+ 19 stub CreateStatusWindowW
+ 20 stub CreateToolbarEx
+ 21 stub DestroyPropertySheetPage
+ 22 stub DllGetVersion
+ 23 stub DrawStatusText
+ 24 stub DrawStatusTextW
+ 25 stub ImageList_Add
+ 26 stub ImageList_AddIcon
+ 27 stub ImageList_AddMasked
+ 28 stub ImageList_BeginDrag
+ 29 stub ImageList_Copy
+ 30 stub ImageList_Create
+ 31 stub ImageList_Destroy
+ 32 stub ImageList_DragEnter
+ 33 stub ImageList_DragLeave
+ 34 stub ImageList_DragMove
+ 35 stub ImageList_DragShowNolock
+ 36 stub ImageList_Draw
+ 37 stub ImageList_DrawEx
+ 38 stub ImageList_EndDrag
+ 39 stub ImageList_GetBkColor
+ 40 stub ImageList_GetDragImage
+ 41 stub ImageList_GetIcon
+ 42 stub ImageList_GetIconSize
+ 43 stub ImageList_GetImageCount
+ 44 stub ImageList_GetImageInfo
+ 45 stub ImageList_GetImageRect
+ 46 stub ImageList_LoadImage
+ 47 stub ImageList_LoadImageA
+ 48 stub ImageList_LoadImageW
+ 49 stub ImageList_Merge
+ 50 stub ImageList_Read
+ 51 stub ImageList_Remove
+ 52 stub ImageList_Replace
+ 53 stub ImageList_ReplaceIcon
+ 54 stub ImageList_SetBkColor
+ 55 stub ImageList_SetDragCursorImage
+ 56 stub ImageList_SetFilter
+ 57 stub ImageList_SetIconSize
+ 58 stub ImageList_SetImageCount
+ 59 stub ImageList_SetOverlayImage
+ 60 stub ImageList_Write
+ 61 stub InitCommonControlsEx
+ 62 stub PropertySheet
+ 63 stub PropertySheetA
+ 64 stub PropertySheetW
+ 65 stub _TrackMouseEvent
diff --git a/if1632/comdlg32.spec b/if1632/comdlg32.spec
index a42e1a1..e7136ab 100644
--- a/if1632/comdlg32.spec
+++ b/if1632/comdlg32.spec
@@ -1,29 +1,28 @@
 name	comdlg32
 type	win32
-base	1
 
-0000 stub ArrowBtnWndProc
-0001 stub ChooseColorA
-0002 stub ChooseColorW
-0003 stub ChooseFontA
-0004 stub ChooseFontW
-0005 stdcall CommDlgExtendedError() CommDlgExtendedError
-0006 stub FindTextA
-0007 stub FindTextW
-0008 stdcall GetFileTitleA(ptr ptr long) GetFileTitle32A
-0009 stdcall GetFileTitleW(ptr ptr long) GetFileTitle32W
-0010 stdcall GetOpenFileNameA(ptr) GetOpenFileName32A
-0011 stdcall GetOpenFileNameW(ptr) GetOpenFileName32W
-0012 stdcall GetSaveFileNameA(ptr) GetSaveFileName32A
-0013 stdcall GetSaveFileNameW(ptr) GetSaveFileName32A
-0014 stub LoadAlterBitmap
-0015 stub PageSetupDlgA
-0016 stub PageSetupDlgW
-0017 return PrintDlgA 4 0
-0018 return PrintDlgW 4 0
-0019 stub ReplaceTextA
-0020 stub ReplaceTextW
-0021 stub WantArrows
-0022 stub dwLBSubclass
-0023 stub dwOKSubclass
+ 0 stub ArrowBtnWndProc
+ 1 stub ChooseColorA
+ 2 stub ChooseColorW
+ 3 stub ChooseFontA
+ 4 stub ChooseFontW
+ 5 stdcall CommDlgExtendedError() CommDlgExtendedError
+ 6 stub FindTextA
+ 7 stub FindTextW
+ 8 stdcall GetFileTitleA(ptr ptr long) GetFileTitle32A
+ 9 stdcall GetFileTitleW(ptr ptr long) GetFileTitle32W
+10 stdcall GetOpenFileNameA(ptr) GetOpenFileName32A
+11 stdcall GetOpenFileNameW(ptr) GetOpenFileName32W
+12 stdcall GetSaveFileNameA(ptr) GetSaveFileName32A
+13 stdcall GetSaveFileNameW(ptr) GetSaveFileName32A
+14 stub LoadAlterBitmap
+15 stub PageSetupDlgA
+16 stub PageSetupDlgW
+17 return PrintDlgA 4 0
+18 return PrintDlgW 4 0
+19 stub ReplaceTextA
+20 stub ReplaceTextW
+21 stub WantArrows
+22 stub dwLBSubclass
+23 stub dwOKSubclass
 
diff --git a/if1632/compobj.spec b/if1632/compobj.spec
index 3f81756..1969f38 100644
--- a/if1632/compobj.spec
+++ b/if1632/compobj.spec
@@ -18,9 +18,9 @@
 15 pascal CoDisconnectObject(ptr long) CoDisconnectObject
 16 stub CORELEASEMARSHALDATA
 17 stub COFREEUNUSEDLIBRARIES
-18 stub ISEQUALGUID
-19 pascal STRINGFROMCLSID(ptr ptr) StringFromCLSID
-20 pascal CLSIDFROMSTRING(str ptr) CLSIDFromString
+18 pascal16 IsEqualGUID(ptr ptr) IsEqualGUID
+19 pascal StringFromCLSID(ptr ptr) StringFromCLSID
+20 pascal CLSIDFromString(str ptr) CLSIDFromString
 21 stub ISVALIDPTRIN
 22 stub ISVALIDPTROUT
 23 stub ISVALIDINTERFACE
diff --git a/if1632/crtdll.spec b/if1632/crtdll.spec
index 5a61f97..993bb1d 100644
--- a/if1632/crtdll.spec
+++ b/if1632/crtdll.spec
@@ -1,107 +1,106 @@
 # C RunTime DLL. All functions use cdecl!
 name	crtdll
 type	win32
-base	1
 
-001 cdecl ??2@YAPAXI@Z(long) CRTDLL_new
-002 cdecl ??3@YAXPAX@Z(long) CRTDLL_delete
-003 cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) CRTDLL_set_new_handler
-004 stub _CIacos
-005 stub _CIasin
-006 stub _CIatan
-007 stub _CIatan2
-008 stub _CIcos
-009 stub _CIcosh
-010 stub _CIexp
-011 stub _CIfmod
-012 stub _CIlog
-013 stub _CIlog10
-014 stub _CIpow
-015 stub _CIsin
-016 stub _CIsinh
-017 stub _CIsqrt
-018 stub _CItan
-019 stub _CItanh
-020 stub _HUGE_dll
-021 stub _XcptFilter
-022 cdecl __GetMainArgs(ptr ptr ptr long) CRTDLL__GetMainArgs
-023 extern __argc_dll CRTDLL_argc_dll
-024 extern __argv_dll CRTDLL_argv_dll
-025 stub __dllonexit
-026 stub __doserrno
-027 stub __fpecode
-028 stub __isascii
-029 stub __iscsym
-030 stub __iscsymf
-031 stub __mb_cur_max_dll
-032 stub __pxcptinfoptrs
-033 stub __threadhandle
-034 stub __threadid
-035 stub __toascii
-036 stub _abnormal_termination
-037 stub _access
-038 extern _acmdln_dll CRTDLL_acmdln_dll
-039 stub _aexit_rtn_dll
-040 stub _amsg_exit
-041 stub _assert
-042 extern _basemajor_dll CRTDLL_basemajor_dll
-043 extern _baseminor_dll CRTDLL_baseminor_dll
-044 extern _baseversion_dll CRTDLL_baseversion_dll
-045 stub _beep
-046 stub _beginthread
-047 stub _c_exit
-048 stub _cabs
-049 stub _cexit
-050 stub _cgets
-051 cdecl _chdir(ptr) CRTDLL__chdir
-052 cdecl _chdrive(long) CRTDLL__chdrive
-053 stub _chgsign
-054 stub _chmod
-055 stub _chsize
-056 stub _clearfp
-057 stub _close
-058 stub _commit
-059 long _commode_dll(0)
-060 stub _control87
-061 stub _controlfp
-062 stub _copysign
-063 stub _cprintf
-064 stub _cpumode_dll
-065 stub _cputs
-066 stub _creat
-067 stub _cscanf
-068 stub _ctype
-069 stub _cwait
-070 stub _daylight_dll
-071 stub _dup
-072 stub _dup2
-073 stub _ecvt
-074 stub _endthread
-075 extern _environ_dll CRTDLL_environ_dll
-076 stub _eof
-077 cdecl _errno() CRTDLL__errno
-078 stub _except_handler2
-079 stub _execl
-080 stub _execle
-081 stub _execlp
-082 stub _execlpe
-083 stub _execv
-084 stub _execve
-085 stub _execvp
-086 stub _execvpe
-087 stub _exit
-088 stub _expand
-089 stub _fcloseall
-090 stub _fcvt
-091 stub _fdopen
-092 stub _fgetchar
-093 stub _fgetwchar
-094 stub _filbuf
-095 stub _fileinfo_dll
-096 stub _filelength
-097 stub _fileno
-098 stub _findclose
-099 stub _findfirst
+  1 cdecl ??2@YAPAXI@Z(long) CRTDLL_new
+  2 cdecl ??3@YAXPAX@Z(long) CRTDLL_delete
+  3 cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) CRTDLL_set_new_handler
+  4 stub _CIacos
+  5 stub _CIasin
+  6 stub _CIatan
+  7 stub _CIatan2
+  8 stub _CIcos
+  9 stub _CIcosh
+ 10 stub _CIexp
+ 11 stub _CIfmod
+ 12 stub _CIlog
+ 13 stub _CIlog10
+ 14 stub _CIpow
+ 15 stub _CIsin
+ 16 stub _CIsinh
+ 17 stub _CIsqrt
+ 18 stub _CItan
+ 19 stub _CItanh
+ 20 stub _HUGE_dll
+ 21 stub _XcptFilter
+ 22 cdecl __GetMainArgs(ptr ptr ptr long) CRTDLL__GetMainArgs
+ 23 extern __argc_dll CRTDLL_argc_dll
+ 24 extern __argv_dll CRTDLL_argv_dll
+ 25 stub __dllonexit
+ 26 stub __doserrno
+ 27 stub __fpecode
+ 28 stub __isascii
+ 29 stub __iscsym
+ 30 stub __iscsymf
+ 31 stub __mb_cur_max_dll
+ 32 stub __pxcptinfoptrs
+ 33 stub __threadhandle
+ 34 stub __threadid
+ 35 stub __toascii
+ 36 stub _abnormal_termination
+ 37 stub _access
+ 38 extern _acmdln_dll CRTDLL_acmdln_dll
+ 39 stub _aexit_rtn_dll
+ 40 stub _amsg_exit
+ 41 stub _assert
+ 42 extern _basemajor_dll CRTDLL_basemajor_dll
+ 43 extern _baseminor_dll CRTDLL_baseminor_dll
+ 44 extern _baseversion_dll CRTDLL_baseversion_dll
+ 45 stub _beep
+ 46 stub _beginthread
+ 47 stub _c_exit
+ 48 stub _cabs
+ 49 cdecl _cexit(long) CRTDLL__cexit
+ 50 stub _cgets
+ 51 cdecl _chdir(ptr) CRTDLL__chdir
+ 52 cdecl _chdrive(long) CRTDLL__chdrive
+ 53 stub _chgsign
+ 54 stub _chmod
+ 55 stub _chsize
+ 56 stub _clearfp
+ 57 cdecl _close(long) CRTDLL__close
+ 58 stub _commit
+ 59 long _commode_dll(0)
+ 60 stub _control87
+ 61 stub _controlfp
+ 62 stub _copysign
+ 63 stub _cprintf
+ 64 stub _cpumode_dll
+ 65 stub _cputs
+ 66 stub _creat
+ 67 stub _cscanf
+ 68 stub _ctype
+ 69 stub _cwait
+ 70 stub _daylight_dll
+ 71 stub _dup
+ 72 stub _dup2
+ 73 stub _ecvt
+ 74 stub _endthread
+ 75 extern _environ_dll CRTDLL_environ_dll
+ 76 stub _eof
+ 77 cdecl _errno() CRTDLL__errno
+ 78 stub _except_handler2
+ 79 stub _execl
+ 80 stub _execle
+ 81 stub _execlp
+ 82 stub _execlpe
+ 83 stub _execv
+ 84 stub _execve
+ 85 stub _execvp
+ 86 stub _execvpe
+ 87 stub _exit
+ 88 stub _expand
+ 89 stub _fcloseall
+ 90 stub _fcvt
+ 91 cdecl _fdopen(long ptr) CRTDLL__fdopen
+ 92 stub _fgetchar
+ 93 stub _fgetwchar
+ 94 stub _filbuf
+ 95 stub _fileinfo_dll
+ 96 stub _filelength
+ 97 stub _fileno
+ 98 stub _findclose
+ 99 stub _findfirst
 100 stub _findnext
 101 stub _finite
 102 stub _flsbuf
@@ -122,7 +121,7 @@
 117 stub _get_osfhandle
 118 stub _getch
 119 stub _getche
-120 stub _getcwd
+120 cdecl _getcwd(ptr long) CRTDLL__getcwd
 121 stub _getdcwd
 122 stub _getdiskfree
 123 stub _getdllprocaddr
@@ -167,7 +166,7 @@
 162 stub _ismbslead
 163 stub _ismbstrail
 164 stub _isnan
-165 stub _itoa
+165 cdecl _itoa(long ptr long) CRTDLL__itoa
 166 stub _itow
 167 stub _j0
 168 stub _j1
@@ -178,7 +177,7 @@
 173 register _local_unwind2(ptr long) CRTDLL__local_unwind2
 174 stub _locking
 175 stub _logb
-176 stub _lrotl
+176 cdecl _lrotl (long long) CRTDLL__lrotl
 177 stub _lrotr
 178 stub _lsearch
 179 stub _lseek
@@ -241,8 +240,8 @@
 236 stub _msize
 237 stub _nextafter
 238 stub _onexit
-239 stub _open
-240 stub _open_osfhandle
+239 cdecl _open(ptr long) CRTDLL__open
+240 cdecl _open_osfhandle(long long) CRTDLL__open_osfhandle
 241 extern _osmajor_dll CRTDLL_osmajor_dll
 242 extern _osminor_dll CRTDLL_osminor_dll
 243 long _osmode_dll(0)
@@ -269,7 +268,7 @@
 264 stub _setjmp
 265 cdecl _setmode(long long) CRTDLL__setmode
 266 stub _setsystime
-267 stub _sleep
+267 cdecl _sleep(long) sleep
 268 stub _snprintf
 269 stub _snwprintf
 270 stub _sopen
@@ -284,18 +283,18 @@
 279 stub _splitpath
 280 stub _stat
 281 stub _statusfp
-282 cdecl _strcmpi(ptr ptr) lstrcmpi32A
+282 cdecl _strcmpi(ptr ptr) CRTDLL__strcmpi
 283 stub _strdate
 284 stub _strdec
 285 cdecl _strdup(ptr) CRTDLL__strdup
 286 stub _strerror
-287 cdecl _stricmp(ptr ptr) lstrcmpi32A
+287 cdecl _stricmp(ptr ptr) CRTDLL__strcmpi
 288 stub _stricoll
 289 stub _strinc
-290 stub _strlwr
+290 cdecl _strlwr(ptr) CRTDLL__strlwr
 291 stub _strncnt
 292 stub _strnextc
-293 cdecl _strnicmp(ptr ptr long) lstrncmpi32A
+293 cdecl _strnicmp(ptr ptr long) CRTDLL__strnicmp
 294 stub _strninc
 295 stub _strnset
 296 stub _strrev
@@ -307,7 +306,7 @@
 302 stub _sys_errlist
 303 stub _sys_nerr_dll
 304 stub _tell
-305 stub _tempnam
+305 cdecl _tempnam(ptr ptr) CRTDLL__tempnam
 306 stub _timezone_dll
 307 stub _tolower
 308 stub _toupper
@@ -317,16 +316,16 @@
 312 stub _ultow
 313 stub _umask
 314 stub _ungetch
-315 stub _unlink
+315 cdecl _unlink(ptr) CRTDLL__unlink
 316 stub _unloaddll
 317 stub _utime
 318 stub _vsnprintf
 319 stub _vsnwprintf
 320 stub _wcsdup
-321 cdecl _wcsicmp(ptr ptr) lstrcmpi32W
+321 cdecl _wcsicmp(ptr ptr) CRTDLL__wcsicmp
 322 cdecl _wcsicoll(ptr ptr) CRTDLL__wcsicoll
 323 cdecl _wcslwr(ptr) CRTDLL__wcslwr
-324 stub _wcsnicmp
+324 cdecl _wcsnicmp(ptr ptr long) CRTDLL__wcsnicmp
 325 stub _wcsnset
 326 cdecl _wcsrev(ptr) CRTDLL__wcsrev
 327 stub _wcsset
@@ -341,72 +340,72 @@
 336 stub _y1
 337 stub _yn
 338 stub abort
-339 cdecl abs(long) CRTDLL_abs
-340 cdecl acos(long) CRTDLL_acos
+339 cdecl abs(long) abs
+340 cdecl acos(double) acos
 341 cdecl asctime(ptr) asctime
-342 cdecl asin(long) CRTDLL_asin
-343 cdecl atan(long) CRTDLL_atan
-344 cdecl atan2(long long) CRTDLL_atan2
+342 cdecl asin(double) asin
+343 cdecl atan(double) atan
+344 cdecl atan2(double double) atan2
 345 cdecl atexit(ptr) CRTDLL_atexit
-346 cdecl atof(ptr) CRTDLL_atof
-347 cdecl atoi(ptr) CRTDLL_atoi
-348 cdecl atol(ptr) CRTDLL_atol
+346 cdecl atof(ptr) atof
+347 cdecl atoi(ptr) atoi
+348 cdecl atol(ptr) atol
 349 stub bsearch
 350 cdecl calloc(long long) CRTDLL_calloc
 351 stub ceil
 352 stub clearerr
 353 cdecl clock() clock
-354 cdecl cos(long) CRTDLL_cos
-355 cdecl cosh(long) CRTDLL_cosh
+354 cdecl cos(double) cos
+355 cdecl cosh(double) cosh
 356 cdecl ctime(ptr) ctime
 357 stub difftime
 358 cdecl div(long long) div
 359 cdecl exit(long) CRTDLL_exit
-360 cdecl exp(long) CRTDLL_exp
-361 cdecl fabs(long) CRTDLL_fabs
+360 cdecl exp(double) exp
+361 cdecl fabs(double) fabs
 362 cdecl fclose(ptr) CRTDLL_fclose
-363 stub feof
+363 cdecl feof(ptr) CRTDLL_feof
 364 stub ferror
 365 cdecl fflush(ptr) CRTDLL_fflush
-366 stub fgetc
+366 cdecl fgetc(ptr) CRTDLL_fgetc
 367 stub fgetpos
-368 stub fgets
+368 cdecl fgets(ptr long ptr) CRTDLL_fgets
 369 stub fgetwc
 370 stub floor
-371 stub fmod
-372 stub fopen
-373 cdecl fprintf() CRTDLL_fprintf
-374 stub fputc
-375 stub fputs
+371 cdecl fmod(double double) fmod
+372 cdecl fopen(ptr ptr) CRTDLL_fopen
+373 varargs fprintf() CRTDLL_fprintf
+374 cdecl fputc(long ptr) CRTDLL_fputc
+375 cdecl fputs(ptr ptr) CRTDLL_fputs
 376 stub fputwc
-377 stub fread
+377 cdecl fread(ptr long long ptr) CRTDLL_fread
 378 cdecl free(ptr) CRTDLL_free
 379 stub freopen
 380 stub frexp
 381 stub fscanf
-382 stub fseek
+382 cdecl fseek(ptr long long) CRTDLL_fseek
 383 stub fsetpos
-384 stub ftell
+384 cdecl ftell(ptr) CRTDLL_ftell
 385 stub fwprintf
-386 stub fwrite
+386 cdecl fwrite(ptr long long ptr) CRTDLL_fwrite 
 387 stub fwscanf
-388 stub getc
+388 cdecl getc(ptr) CRTDLL_getc
 389 stub getchar
 390 stub getenv
 391 cdecl gets(ptr) CRTDLL_gets
 392 cdecl gmtime(ptr) gmtime
 393 stub is_wctype
-394 cdecl isalnum(long) CRTDLL_isalnum
-395 cdecl isalpha(long) CRTDLL_isalpha
-396 cdecl iscntrl(long) CRTDLL_iscntrl
-397 cdecl isdigit(long) CRTDLL_isdigit
-398 cdecl isgraph(long) CRTDLL_isgraph
+394 cdecl isalnum(long) isalnum
+395 cdecl isalpha(long) isalpha
+396 cdecl iscntrl(long) iscntrl
+397 cdecl isdigit(long) isdigit
+398 cdecl isgraph(long) isgraph
 399 stub isleadbyte
-400 cdecl islower(long) CRTDLL_islower
-401 cdecl isprint(long) CRTDLL_isprint
-402 cdecl ispunct(long) CRTDLL_ispunct
-403 cdecl isspace(long) CRTDLL_isspace
-404 cdecl isupper(long) CRTDLL_isupper
+400 cdecl islower(long) islower
+401 cdecl isprint(long) isprint
+402 cdecl ispunct(long) ispunct
+403 cdecl isspace(long) isspace
+404 cdecl isupper(long) isupper
 405 stub iswalnum
 406 stub iswalpha
 407 stub iswascii
@@ -420,19 +419,19 @@
 415 stub iswspace
 416 stub iswupper
 417 stub iswxdigit
-418 cdecl isxdigit(long) CRTDLL_isxdigit
-419 cdecl labs(long) CRTDLL_labs
+418 cdecl isxdigit(long) isxdigit
+419 cdecl labs(long) labs
 420 stub ldexp
 421 cdecl ldiv(long long) ldiv
 422 stub localeconv
 423 cdecl localtime(ptr) localtime
-424 cdecl log(long) CRTDLL_log
-425 cdecl log10(long) CRTDLL_log10
+424 cdecl log(double) log
+425 cdecl log10(double) log10
 426 stub longjmp
 427 cdecl malloc(ptr) CRTDLL_malloc
-428 stub mblen
+428 cdecl mblen(ptr long) CRTDLL_mblen
 429 cdecl mbstowcs(ptr ptr long) CRTDLL_mbstowcs
-430 cdecl mbtowc(long) CRTDLL_mbtowc
+430 cdecl mbtowc(ptr ptr long) CRTDLL_mbtowc
 431 cdecl memchr(ptr long long) memchr
 432 cdecl memcmp(ptr ptr long) memcmp
 433 cdecl memcpy(ptr ptr long) memcpy
@@ -441,11 +440,11 @@
 436 cdecl mktime(ptr) mktime
 437 stub modf
 438 stub perror
-439 cdecl pow(long long) CRTDLL_pow
-440 cdecl printf() CRTDLL_printf
-441 stub putc
+439 cdecl pow(double double) pow
+440 varargs printf() printf
+441 cdecl putc(long ptr) CRTDLL_putc
 442 cdecl putchar(long) CRTDLL_putchar
-443 stub puts
+443 cdecl puts(ptr) CRTDLL_puts
 444 cdecl qsort(ptr long long ptr) qsort
 445 stub raise
 446 cdecl rand() CRTDLL_rand
@@ -454,16 +453,16 @@
 449 stub rename
 450 stub rewind
 451 stub scanf
-452 stub setbuf
+452 cdecl setbuf(ptr ptr) CRTDLL_setbuf
 453 cdecl setlocale(long ptr) CRTDLL_setlocale
 454 stub setvbuf
 455 stub signal
-456 cdecl sin(long) CRTDLL_sin
-457 cdecl sinh(long) CRTDLL_sinh
-458 cdecl sprintf() CRTDLL_sprintf
-459 cdecl sqrt(long long) CRTDLL_sqrt
+456 cdecl sin(double) sin
+457 cdecl sinh(double) sinh
+458 varargs sprintf() wsprintf32A
+459 cdecl sqrt(double) sqrt
 460 cdecl srand(long) CRTDLL_srand
-461 cdecl sscanf() CRTDLL_sscanf
+461 varargs sscanf() sscanf
 462 cdecl strcat(ptr ptr) strcat
 463 cdecl strchr(ptr long) strchr
 464 cdecl strcmp(ptr ptr) strcmp
@@ -480,42 +479,42 @@
 475 cdecl strrchr(ptr long) strrchr
 476 cdecl strspn(ptr ptr) strspn
 477 cdecl strstr(ptr ptr) strstr
-478 stub strtod
+478 cdecl strtod(ptr ptr) strtod
 479 cdecl strtok(ptr ptr) strtok
 480 cdecl strtol(ptr ptr long) strtol
 481 cdecl strtoul(ptr ptr long) strtoul
 482 cdecl strxfrm(ptr ptr long) strxfrm
-483 cdecl swprintf() CRTDLL_swprintf
+483 varargs swprintf() wsprintf32W
 484 stub swscanf
-485 stub system
-486 cdecl tan(long) CRTDLL_tan
-487 cdecl tanh(long) CRTDLL_tanh
+485 cdecl system(ptr) CRTDLL_system
+486 cdecl tan(double) tan
+487 cdecl tanh(double) tanh
 488 cdecl time(ptr) CRTDLL_time
 489 stub tmpfile
-490 stub tmpnam
-491 cdecl tolower(long) CRTDLL_tolower
-492 cdecl toupper(long) CRTDLL_toupper
+490 cdecl tmpnam(ptr) CRTDLL_tmpnam
+491 cdecl tolower(long) tolower
+492 cdecl toupper(long) toupper
 493 stub towlower
 494 cdecl towupper(long) CRTDLL_towupper
 495 stub ungetc
 496 stub ungetwc
-497 stub vfprintf
+497 cdecl vfprintf(ptr ptr ptr) CRTDLL_vfprintf
 498 stub vfwprintf
 499 stub vprintf
-500 cdecl vsprintf() CRTDLL_vsprintf
-501 stub vswprintf
+500 cdecl vsprintf(ptr ptr ptr) CRTDLL_vsprintf
+501 cdecl vswprintf(ptr ptr ptr) CRTDLL_vswprintf
 502 stub vwprintf
-503 cdecl wcscat(ptr ptr) lstrcat32W
+503 cdecl wcscat(ptr ptr) CRTDLL_wcscat
 504 cdecl wcschr(ptr long) CRTDLL_wcschr
-505 stub wcscmp
+505 cdecl wcscmp(ptr ptr) CRTDLL_wcscmp
 506 cdecl wcscoll(ptr ptr) CRTDLL_wcscoll
-507 cdecl wcscpy(ptr ptr) lstrcpy32W
+507 cdecl wcscpy(ptr ptr) CRTDLL_wcscpy
 508 cdecl wcscspn(ptr ptr) CRTDLL_wcscspn
 509 stub wcsftime
-510 cdecl wcslen(ptr) lstrlen32W
-511 cdecl wcsncat(ptr ptr long) lstrcatn32W
-512 cdecl wcsncmp(ptr ptr long) lstrncmp32W
-513 cdecl wcsncpy(ptr ptr long) lstrcpyn32W
+510 cdecl wcslen(ptr) CRTDLL_wcslen
+511 cdecl wcsncat(ptr ptr long) CRTDLL_wcsncat
+512 cdecl wcsncmp(ptr ptr long) CRTDLL_wcsncmp
+513 cdecl wcsncpy(ptr ptr long) CRTDLL_wcsncpy
 514 stub wcspbrk
 515 cdecl wcsrchr(ptr long) CRTDLL_wcsrchr
 516 cdecl wcsspn(ptr ptr) CRTDLL_wcsspn
@@ -523,7 +522,7 @@
 518 stub wcstod
 519 stub wcstok
 520 stub wcstol
-521 stub wcstombs
+521 cdecl wcstombs(ptr ptr long) CRTDLL_wcstombs
 522 stub wcstoul
 523 stub wcsxfrm
 524 stub wctomb
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 1b0f157..eedf981 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -38,7 +38,7 @@
 30  pascal16 SaveDC(word) SaveDC16
 31  pascal   SetPixel(word s_word s_word long) SetPixel16
 32  pascal16 OffsetClipRgn(word s_word s_word) OffsetClipRgn16
-33  pascal16 TextOut(word s_word s_word ptr word) TextOut16
+33  pascal16 TextOut(word s_word s_word str word) TextOut16
 34  pascal16 BitBlt( word s_word s_word s_word s_word word s_word s_word long)
              BitBlt16
 35  pascal16 StretchBlt(word s_word s_word s_word s_word word s_word s_word
@@ -236,7 +236,7 @@
                    s_word s_word) Chord16
 349 pascal SetMapperFlags(word long) SetMapperFlags16
 350 pascal16 GetCharWidth(word word word ptr) GetCharWidth16
-351 pascal16 ExtTextOut(word s_word s_word word ptr ptr word ptr) ExtTextOut16
+351 pascal16 ExtTextOut(word s_word s_word word ptr str word ptr) ExtTextOut16
 352 stub GetPhysicalFontHandle
 353 stub GetAspectRatioFilter
 354 stub ShrinkGDIHeap
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index fd5c543..2baeae2 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -1,398 +1,397 @@
 name	gdi32
 type	win32
-base	1
 
-0000 stub AbortDoc
-0001 stub AbortPath
-0002 stdcall AddFontResourceA(ptr) AddFontResource32A
-0003 stub AddFontResourceTracking
-0004 stdcall AddFontResourceW(ptr) AddFontResource32W
-0005 stub AngleArc
-0006 stdcall AnimatePalette(long long long ptr) AnimatePalette32
-0007 stdcall Arc(long long long long long long long long long) Arc32
-0008 stub ArcTo
-0009 stub BeginPath
-0010 stdcall BitBlt(long long long long long long long long long) BitBlt32
-0011 stub CancelDC
-0012 stub CheckColorsInGamut
-0013 stub ChoosePixelFormat
-0014 stdcall Chord(long long long long long long long long long) Chord32
-0015 stub CloseEnhMetaFile
-0016 stub CloseFigure
-0017 stub CloseMetaFile
-0018 stub ColorMatchToTarget
-0019 stdcall CombineRgn(long long long long) CombineRgn32
-0020 stub CombineTransform
-0021 stub CopyEnhMetaFileA
-0022 stub CopyEnhMetaFileW
-0023 stdcall CopyMetaFileA(long ptr) CopyMetaFile32A
-0024 stdcall CopyMetaFileW(long ptr) CopyMetaFile32W
-0025 stdcall CreateBitmap(long long long long ptr) CreateBitmap32
-0026 stdcall CreateBitmapIndirect(ptr) CreateBitmapIndirect32
-0027 stdcall CreateBrushIndirect(ptr) CreateBrushIndirect32
-0028 stub CreateColorSpaceA
-0029 stub CreateColorSpaceW
-0030 stdcall CreateCompatibleBitmap(long long long) CreateCompatibleBitmap32
-0031 stdcall CreateCompatibleDC(long) CreateCompatibleDC32
-0032 stdcall CreateDCA(ptr ptr ptr ptr) CreateDC32A
-0033 stdcall CreateDCW(ptr ptr ptr ptr) CreateDC32W
-0034 stdcall CreateDIBPatternBrush(long long) CreateDIBPatternBrush32
-0035 stub CreateDIBPatternBrushPt
-0036 stub CreateDIBSection
-0037 stdcall CreateDIBitmap(long ptr long ptr ptr long) CreateDIBitmap32
-0038 stdcall CreateDiscardableBitmap(long long long) CreateDiscardableBitmap32
-0039 stdcall CreateEllipticRgn(long long long long) CreateEllipticRgn32
-0040 stdcall CreateEllipticRgnIndirect(ptr) CreateEllipticRgnIndirect32
-0041 stub CreateEnhMetaFileA
-0042 stub CreateEnhMetaFileW
-0043 stdcall CreateFontA(long long long long long long long long
+  0 stub AbortDoc
+  1 stub AbortPath
+  2 stdcall AddFontResourceA(ptr) AddFontResource32A
+  3 stub AddFontResourceTracking
+  4 stdcall AddFontResourceW(ptr) AddFontResource32W
+  5 stub AngleArc
+  6 stdcall AnimatePalette(long long long ptr) AnimatePalette32
+  7 stdcall Arc(long long long long long long long long long) Arc32
+  8 stub ArcTo
+  9 stub BeginPath
+ 10 stdcall BitBlt(long long long long long long long long long) BitBlt32
+ 11 stub CancelDC
+ 12 stub CheckColorsInGamut
+ 13 stub ChoosePixelFormat
+ 14 stdcall Chord(long long long long long long long long long) Chord32
+ 15 stub CloseEnhMetaFile
+ 16 stub CloseFigure
+ 17 stub CloseMetaFile
+ 18 stub ColorMatchToTarget
+ 19 stdcall CombineRgn(long long long long) CombineRgn32
+ 20 stub CombineTransform
+ 21 stub CopyEnhMetaFileA
+ 22 stub CopyEnhMetaFileW
+ 23 stdcall CopyMetaFileA(long ptr) CopyMetaFile32A
+ 24 stdcall CopyMetaFileW(long ptr) CopyMetaFile32W
+ 25 stdcall CreateBitmap(long long long long ptr) CreateBitmap32
+ 26 stdcall CreateBitmapIndirect(ptr) CreateBitmapIndirect32
+ 27 stdcall CreateBrushIndirect(ptr) CreateBrushIndirect32
+ 28 stub CreateColorSpaceA
+ 29 stub CreateColorSpaceW
+ 30 stdcall CreateCompatibleBitmap(long long long) CreateCompatibleBitmap32
+ 31 stdcall CreateCompatibleDC(long) CreateCompatibleDC32
+ 32 stdcall CreateDCA(ptr ptr ptr ptr) CreateDC32A
+ 33 stdcall CreateDCW(ptr ptr ptr ptr) CreateDC32W
+ 34 stdcall CreateDIBPatternBrush(long long) CreateDIBPatternBrush32
+ 35 stub CreateDIBPatternBrushPt
+ 36 stdcall CreateDIBSection(long ptr long ptr long long) CreateDIBSection
+ 37 stdcall CreateDIBitmap(long ptr long ptr ptr long) CreateDIBitmap32
+ 38 stdcall CreateDiscardableBitmap(long long long) CreateDiscardableBitmap32
+ 39 stdcall CreateEllipticRgn(long long long long) CreateEllipticRgn32
+ 40 stdcall CreateEllipticRgnIndirect(ptr) CreateEllipticRgnIndirect32
+ 41 stub CreateEnhMetaFileA
+ 42 stub CreateEnhMetaFileW
+ 43 stdcall CreateFontA(long long long long long long long long
                         long long long long long ptr) CreateFont32A
-0044 stdcall CreateFontIndirectA(ptr) CreateFontIndirect32A
-0045 stdcall CreateFontIndirectW(ptr) CreateFontIndirect32W
-0046 stdcall CreateFontW(long long long long long long long long
+ 44 stdcall CreateFontIndirectA(ptr) CreateFontIndirect32A
+ 45 stdcall CreateFontIndirectW(ptr) CreateFontIndirect32W
+ 46 stdcall CreateFontW(long long long long long long long long
                         long long long long long ptr) CreateFont32W
-0047 stub CreateHalftonePalette
-0048 stdcall CreateHatchBrush(long long) CreateHatchBrush32
-0049 stdcall CreateICA(ptr ptr ptr ptr) CreateIC32A
-0050 stdcall CreateICW(ptr ptr ptr ptr) CreateIC32W
-0051 stub CreateMetaFileA
-0052 stub CreateMetaFileW
-0053 stdcall CreatePalette(ptr) CreatePalette32
-0054 stdcall CreatePatternBrush(long) CreatePatternBrush32
-0055 stdcall CreatePen(long long long) CreatePen32
-0056 stdcall CreatePenIndirect(ptr) CreatePenIndirect32
-0057 stdcall CreatePolyPolygonRgn(ptr ptr long long) CreatePolyPolygonRgn32
-0058 stdcall CreatePolygonRgn(ptr long long) CreatePolygonRgn32
-0059 stdcall CreateRectRgn(long long long long) CreateRectRgn32
-0060 stdcall CreateRectRgnIndirect(ptr) CreateRectRgnIndirect32
-0061 stdcall CreateRoundRectRgn(long long long long long long)
+ 47 stub CreateHalftonePalette
+ 48 stdcall CreateHatchBrush(long long) CreateHatchBrush32
+ 49 stdcall CreateICA(ptr ptr ptr ptr) CreateIC32A
+ 50 stdcall CreateICW(ptr ptr ptr ptr) CreateIC32W
+ 51 stub CreateMetaFileA
+ 52 stub CreateMetaFileW
+ 53 stdcall CreatePalette(ptr) CreatePalette32
+ 54 stdcall CreatePatternBrush(long) CreatePatternBrush32
+ 55 stdcall CreatePen(long long long) CreatePen32
+ 56 stdcall CreatePenIndirect(ptr) CreatePenIndirect32
+ 57 stdcall CreatePolyPolygonRgn(ptr ptr long long) CreatePolyPolygonRgn32
+ 58 stdcall CreatePolygonRgn(ptr long long) CreatePolygonRgn32
+ 59 stdcall CreateRectRgn(long long long long) CreateRectRgn32
+ 60 stdcall CreateRectRgnIndirect(ptr) CreateRectRgnIndirect32
+ 61 stdcall CreateRoundRectRgn(long long long long long long)
              CreateRoundRectRgn32
-0062 stdcall CreateScalableFontResourceA(long ptr ptr ptr) CreateScalableFontResource32A
-0063 stdcall CreateScalableFontResourceW(long ptr ptr ptr) CreateScalableFontResource32W
-0064 stdcall CreateSolidBrush(long) CreateSolidBrush32
-0065 stdcall DPtoLP(long ptr long) DPtoLP32
-0066 stub DeleteColorSpace
-0067 stdcall DeleteDC(long) DeleteDC32
-0068 stub DeleteEnhMetaFile
-0069 stub DeleteMetaFile
-0070 stdcall DeleteObject(long)	DeleteObject32
-0071 stub DescribePixelFormat
-0072 stub DeviceCapabilitiesExA
-0073 stub DeviceCapabilitiesExW
-0074 stub DrawEscape
-0075 stdcall Ellipse(long long long long long) Ellipse32
-0076 stub EndDoc
-0077 stub EndPage
-0078 stub EndPath
-0079 stub EnumEnhMetaFile
-0080 stdcall EnumFontFamiliesA(long ptr ptr long) THUNK_EnumFontFamilies32A
-0081 stdcall EnumFontFamiliesExA(long ptr ptr long long) THUNK_EnumFontFamiliesEx32A
-0082 stdcall EnumFontFamiliesExW(long ptr ptr long long) THUNK_EnumFontFamiliesEx32W
-0083 stdcall EnumFontFamiliesW(long ptr ptr long) THUNK_EnumFontFamilies32W
-0084 stdcall EnumFontsA(long ptr ptr long) THUNK_EnumFonts32A
-0085 stdcall EnumFontsW(long ptr ptr long) THUNK_EnumFonts32W
-0086 stub EnumICMProfilesA
-0087 stub EnumICMProfilesW
-0088 stub EnumMetaFile
-0089 stdcall EnumObjects(long long ptr long) THUNK_EnumObjects32
-0090 stdcall EqualRgn(long long) EqualRgn32
-0091 stdcall Escape(long long long ptr ptr) Escape32
-0092 stdcall ExcludeClipRect(long long long long long) ExcludeClipRect32
-0093 stub ExtCreatePen
-0094 stub ExtCreateRegion
-0095 stub ExtEscape
-0096 stdcall ExtFloodFill(long long long long long) ExtFloodFill32
-0097 stub ExtSelectClipRgn
-0098 stdcall ExtTextOutA(long long long long ptr ptr long ptr) ExtTextOut32A
-0099 stdcall ExtTextOutW(long long long long ptr ptr long ptr) ExtTextOut32W
-0100 stub FillPath
-0101 stdcall FillRgn(long long long) FillRgn32
-0102 stub FixBrushOrgEx
-0103 stub FlattenPath
-0104 stdcall FloodFill(long long long long) FloodFill32
-0105 stdcall FrameRgn(long long long long long) FrameRgn32
-0106 stub FreeImageColorMatcher
-0107 stub GdiAssociateObject
-0108 stub GdiCleanCacheDC
-0109 stub GdiComment
-0110 stub GdiConvertAndCheckDC
-0111 stub GdiConvertBitmap
-0112 stub GdiConvertBrush
-0113 stub GdiConvertDC
-0114 stub GdiConvertEnhMetaFile
-0115 stub GdiConvertFont
-0116 stub GdiConvertMetaFilePict
-0117 stub GdiConvertPalette
-0118 stub GdiConvertRegion
-0119 stub GdiCreateLocalBitmap
-0120 stub GdiCreateLocalBrush
-0121 stub GdiCreateLocalEnhMetaFile
-0122 stub GdiCreateLocalFont
-0123 stub GdiCreateLocalMetaFilePict
-0124 stub GdiCreateLocalPalette
-0125 stub GdiCreateLocalRegion
-0126 stub GdiDeleteLocalDC
-0127 stub GdiDeleteLocalObject
-0128 stub GdiFlush
-0129 return GdiGetBatchLimit 0 1
-0130 stub GdiGetLocalBrush
-0131 stub GdiGetLocalDC
-0132 stub GdiGetLocalFont
-0133 stub GdiIsMetaFileDC
-0134 stub GdiPlayDCScript
-0135 stub GdiPlayJournal
-0136 stub GdiPlayScript
-0137 stub GdiReleaseLocalDC
-0138 stub GdiSetAttrs
-0139 return GdiSetBatchLimit 4 1
-0140 stub GdiSetServerAttr
-0141 stub GetArcDirection
-0142 stub GetAspectRatioFilterEx
-0143 stdcall GetBitmapBits(long long ptr) GetBitmapBits32
-0144 stdcall GetBitmapDimensionEx(long ptr) GetBitmapDimensionEx32
-0145 stdcall GetBkColor(long) GetBkColor32
-0146 stdcall GetBkMode(long) GetBkMode32
-0147 stub GetBoundsRect
-0148 stdcall GetBrushOrgEx(long ptr) GetBrushOrgEx32
-0149 stdcall GetCharABCWidthsA(long long long ptr) GetCharABCWidths32A
-0150 stub GetCharABCWidthsFloatA
-0151 stub GetCharABCWidthsFloatW
-0152 stdcall GetCharABCWidthsW(long long long ptr) GetCharABCWidths32W
-0153 stdcall GetCharWidth32A(long long long long) GetCharWidth32A
-0154 stdcall GetCharWidth32W(long long long long) GetCharWidth32W
-0155 stdcall GetCharWidthA(long long long long) GetCharWidth32A
-0156 stub GetCharWidthFloatA
-0157 stub GetCharWidthFloatW
-0158 stdcall GetCharWidthW(long long long long) GetCharWidth32W
-0159 stub GetCharWidthWOW
-0160 stub GetCharacterPlacementA
-0161 stub GetCharacterPlacementW
-0162 stdcall GetClipBox(long ptr) GetClipBox32
-0163 stdcall GetClipRgn(long long) GetClipRgn32
-0164 stub GetColorAdjustment
-0165 stub GetColorSpace
-0166 stub GetCurrentObject
-0167 stdcall GetCurrentPositionEx(long ptr) GetCurrentPositionEx32
-0168 stdcall GetDCOrgEx(long ptr) GetDCOrgEx
-0169 stub GetDIBColorTable
-0170 stdcall GetDIBits(long long long long ptr ptr long) GetDIBits32
-0171 stdcall GetDeviceCaps(long long) GetDeviceCaps32
-0172 stub GetDeviceGammaRamp
-0173 stub GetETM
-0174 stub GetEnhMetaFileA
-0175 stub GetEnhMetaFileBits
-0176 stub GetEnhMetaFileDescriptionA
-0177 stub GetEnhMetaFileDescriptionW
-0178 stub GetEnhMetaFileHeader
-0179 stub GetEnhMetaFilePaletteEntries
-0180 stub GetEnhMetaFileW
-0181 stub GetFontData
-0182 stub GetFontLanguageInfo
-0183 stub GetFontResourceInfo
-0184 stub GetFontResourceInfoW
-0185 stub GetGlyphOutline
-0186 stdcall GetGlyphOutlineA(long long long ptr long ptr ptr) GetGlyphOutline32A
-0187 stdcall GetGlyphOutlineW(long long long ptr long ptr ptr) GetGlyphOutline32W
-0188 return GetGraphicsMode 4 1 	# just return 1
-0189 stub GetICMProfileA
-0190 stub GetICMProfileW
-0191 stub GetKerningPairs
-0192 stdcall GetKerningPairsA(long long ptr) GetKerningPairs32A
-0193 stdcall GetKerningPairsW(long long ptr) GetKerningPairs32W
-0194 stub GetLogColorSpaceA
-0195 stub GetLogColorSpaceW
-0196 stdcall GetMapMode(long) GetMapMode32
-0197 stdcall GetMetaFileA(ptr) GetMetaFile32A
-0198 stub GetMetaFileBitsEx
-0199 stdcall GetMetaFileW(ptr) GetMetaFile32W
-0200 stub GetMetaRgn
-0201 stub GetMiterLimit
-0202 stdcall GetNearestColor(long long) GetNearestColor32
-0203 stdcall GetNearestPaletteIndex(long long) GetNearestPaletteIndex32
-0204 stdcall GetObjectA(long long ptr) GetObject32A
-0205 stub GetObjectType
-0206 stdcall GetObjectW(long long ptr) GetObject32W
-0207 stub GetOutlineTextMetricsA
-0208 stub GetOutlineTextMetricsW
-0209 stdcall GetPaletteEntries(long long long ptr) GetPaletteEntries32
-0210 stub GetPath
-0211 stdcall GetPixel(long long long) GetPixel32
-0212 stub GetPixelFormat
-0213 stdcall GetPolyFillMode(long) GetPolyFillMode32
-0214 stdcall GetROP2(long) GetROP232
-0215 stub GetRandomRgn
-0216 stdcall GetRasterizerCaps(ptr long) GetRasterizerCaps32
-0217 stub GetRegionData
-0218 stdcall GetRelAbs(long) GetRelAbs32
-0219 stdcall GetRgnBox(long ptr) GetRgnBox32
-0220 stdcall GetStockObject(long) GetStockObject32
-0221 stdcall GetStretchBltMode(long) GetStretchBltMode32
-0222 stdcall GetSystemPaletteEntries(long long long ptr) GetSystemPaletteEntries32
-0223 stdcall GetSystemPaletteUse() GetSystemPaletteUse32
-0224 stdcall GetTextAlign(long) GetTextAlign32
-0225 stdcall GetTextCharacterExtra(long) GetTextCharacterExtra32
-0226 stdcall GetTextCharset(long) GetTextCharset32
-0227 stdcall GetTextColor(long) GetTextColor32
-0228 stdcall GetTextExtentExPointA(long ptr long long ptr ptr ptr) GetTextExtentExPoint32A
-0229 stdcall GetTextExtentExPointW(long ptr long long ptr ptr ptr) GetTextExtentExPoint32W
-0230 stdcall GetTextExtentPoint32A(long ptr long ptr) GetTextExtentPoint32A
-0231 stdcall GetTextExtentPoint32W(long ptr long ptr) GetTextExtentPoint32W
-0232 stdcall GetTextExtentPointA(long ptr long ptr) GetTextExtentPoint32ABuggy
-0233 stdcall GetTextExtentPointW(long ptr long ptr) GetTextExtentPoint32WBuggy
-0234 stdcall GetTextFaceA(long long ptr) GetTextFace32A
-0235 stdcall GetTextFaceW(long long ptr) GetTextFace32W
-0236 stdcall GetTextMetricsA(long ptr) GetTextMetrics32A
-0237 stdcall GetTextMetricsW(long ptr) GetTextMetrics32W
-0238 stub GetTransform
-0239 stdcall GetViewportExtEx(long ptr) GetViewportExtEx32
-0240 stdcall GetViewportOrgEx(long ptr) GetViewportOrgEx32
-0241 stub GetWinMetaFileBits
-0242 stdcall GetWindowExtEx(long ptr) GetWindowExtEx32
-0243 stdcall GetWindowOrgEx(long ptr) GetWindowOrgEx32
-0244 return GetWorldTransform 8 0
-0245 stdcall IntersectClipRect(long long long long long) IntersectClipRect32
-0246 stdcall InvertRgn(long long) InvertRgn32
-0247 stdcall LPtoDP(long ptr long) LPtoDP32
-0248 stdcall LineDDA(long long long long ptr long) THUNK_LineDDA32
-0249 stdcall LineTo(long long long) LineTo32
-0250 stub LoadImageColorMatcherA
-0251 stub LoadImageColorMatcherW
-0252 stub MaskBlt
-0253 stub ModifyWorldTransform
-0254 stdcall MoveToEx(long long long ptr) MoveToEx32
-0255 stdcall OffsetClipRgn(long long long) OffsetClipRgn32
-0256 stdcall OffsetRgn(long long long) OffsetRgn32
-0257 stdcall OffsetViewportOrgEx(long long long ptr) OffsetViewportOrgEx32
-0258 stdcall OffsetWindowOrgEx(long long long ptr) OffsetWindowOrgEx32
-0259 stdcall PaintRgn(long long) PaintRgn32
-0260 stdcall PatBlt(long long long long long long) PatBlt32
-0261 stub PathToRegion
-0262 stdcall Pie(long long long long long long long long long) Pie32
-0263 stub PlayEnhMetaFile
-0264 stub PlayEnhMetaFileRecord
-0265 stdcall PlayMetaFile(long long) PlayMetaFile32
-0266 stub PlayMetaFileRecord
-0267 stub PlgBlt
-0268 stub PolyBezier
-0269 stub PolyBezierTo
-0270 stub PolyDraw
-0271 stdcall PolyPolygon(long ptr ptr long) PolyPolygon32
-0272 stub PolyPolyline
-0273 stub PolyTextOutA
-0274 stub PolyTextOutW
-0275 stdcall Polygon(long ptr long) Polygon32
-0276 stdcall Polyline(long ptr long) Polyline32
-0277 stub PolylineTo
-0278 stdcall PtInRegion(long long long) PtInRegion32
-0279 stdcall PtVisible(long long long) PtVisible32
-0280 stdcall RealizePalette(long) RealizePalette32
-0281 stdcall RectInRegion(long ptr) RectInRegion32
-0282 stdcall RectVisible(long ptr) RectVisible32
-0283 stdcall Rectangle(long long long long long) Rectangle32
-0284 stdcall RemoveFontResourceA(ptr) RemoveFontResource32A
-0285 stub RemoveFontResourceTracking
-0286 stdcall RemoveFontResourceW(ptr) RemoveFontResource32W
-0287 stdcall ResetDCA(long ptr) ResetDC32A
-0288 stdcall ResetDCW(long ptr) ResetDC32W
-0289 stdcall ResizePalette(long long) ResizePalette32
-0290 stdcall RestoreDC(long long) RestoreDC32
-0291 stdcall RoundRect(long long long long long long long) RoundRect32
-0292 stdcall SaveDC(long) SaveDC32
-0293 stdcall ScaleViewportExtEx(long long long long long ptr) ScaleViewportExtEx32
-0294 stdcall ScaleWindowExtEx(long long long long long ptr) ScaleWindowExtEx32
-0295 stub SelectBrushLocal
-0296 stub SelectClipPath
-0297 stdcall SelectClipRgn(long long) SelectClipRgn32
-0298 stub SelectFontLocal
-0299 stdcall SelectObject(long long) SelectObject32
-0300 stdcall SelectPalette(long long long) SelectPalette32
-0301 stub SetAbortProc
-0302 stub SetArcDirection
-0303 stdcall SetBitmapBits(long long ptr) SetBitmapBits32
-0304 stdcall SetBitmapDimensionEx(long long long ptr) SetBitmapDimensionEx32
-0305 stdcall SetBkColor(long long) SetBkColor32
-0306 stdcall SetBkMode(long long) SetBkMode32
-0307 stub SetBoundsRect
-0308 stdcall SetBrushOrgEx(long long long ptr) SetBrushOrgEx
-0309 stub SetColorAdjustment
-0310 stub SetColorSpace
-0311 stub SetDIBColorTable
-0312 stdcall SetDIBits(long long long long ptr ptr long) SetDIBits32
-0313 stdcall SetDIBitsToDevice(long long long long long long long long long
+ 62 stdcall CreateScalableFontResourceA(long ptr ptr ptr) CreateScalableFontResource32A
+ 63 stdcall CreateScalableFontResourceW(long ptr ptr ptr) CreateScalableFontResource32W
+ 64 stdcall CreateSolidBrush(long) CreateSolidBrush32
+ 65 stdcall DPtoLP(long ptr long) DPtoLP32
+ 66 stub DeleteColorSpace
+ 67 stdcall DeleteDC(long) DeleteDC32
+ 68 stub DeleteEnhMetaFile
+ 69 stub DeleteMetaFile
+ 70 stdcall DeleteObject(long)	DeleteObject32
+ 71 stub DescribePixelFormat
+ 72 stub DeviceCapabilitiesExA
+ 73 stub DeviceCapabilitiesExW
+ 74 stub DrawEscape
+ 75 stdcall Ellipse(long long long long long) Ellipse32
+ 76 stub EndDoc
+ 77 stub EndPage
+ 78 stub EndPath
+ 79 stub EnumEnhMetaFile
+ 80 stdcall EnumFontFamiliesA(long ptr ptr long) EnumFontFamilies32A
+ 81 stdcall EnumFontFamiliesExA(long ptr ptr long long) EnumFontFamiliesEx32A
+ 82 stdcall EnumFontFamiliesExW(long ptr ptr long long) EnumFontFamiliesEx32W
+ 83 stdcall EnumFontFamiliesW(long ptr ptr long) EnumFontFamilies32W
+ 84 stdcall EnumFontsA(long ptr ptr long) EnumFonts32A
+ 85 stdcall EnumFontsW(long ptr ptr long) EnumFonts32W
+ 86 stub EnumICMProfilesA
+ 87 stub EnumICMProfilesW
+ 88 stub EnumMetaFile
+ 89 stdcall EnumObjects(long long ptr long) EnumObjects32
+ 90 stdcall EqualRgn(long long) EqualRgn32
+ 91 stdcall Escape(long long long ptr ptr) Escape32
+ 92 stdcall ExcludeClipRect(long long long long long) ExcludeClipRect32
+ 93 stub ExtCreatePen
+ 94 stub ExtCreateRegion
+ 95 stub ExtEscape
+ 96 stdcall ExtFloodFill(long long long long long) ExtFloodFill32
+ 97 stub ExtSelectClipRgn
+ 98 stdcall ExtTextOutA(long long long long ptr ptr long ptr) ExtTextOut32A
+ 99 stdcall ExtTextOutW(long long long long ptr ptr long ptr) ExtTextOut32W
+100 stub FillPath
+101 stdcall FillRgn(long long long) FillRgn32
+102 stub FixBrushOrgEx
+103 stub FlattenPath
+104 stdcall FloodFill(long long long long) FloodFill32
+105 stdcall FrameRgn(long long long long long) FrameRgn32
+106 stub FreeImageColorMatcher
+107 stub GdiAssociateObject
+108 stub GdiCleanCacheDC
+109 stub GdiComment
+110 stub GdiConvertAndCheckDC
+111 stub GdiConvertBitmap
+112 stub GdiConvertBrush
+113 stub GdiConvertDC
+114 stub GdiConvertEnhMetaFile
+115 stub GdiConvertFont
+116 stub GdiConvertMetaFilePict
+117 stub GdiConvertPalette
+118 stub GdiConvertRegion
+119 stub GdiCreateLocalBitmap
+120 stub GdiCreateLocalBrush
+121 stub GdiCreateLocalEnhMetaFile
+122 stub GdiCreateLocalFont
+123 stub GdiCreateLocalMetaFilePict
+124 stub GdiCreateLocalPalette
+125 stub GdiCreateLocalRegion
+126 stub GdiDeleteLocalDC
+127 stub GdiDeleteLocalObject
+128 stub GdiFlush
+129 return GdiGetBatchLimit 0 1
+130 stub GdiGetLocalBrush
+131 stub GdiGetLocalDC
+132 stub GdiGetLocalFont
+133 stub GdiIsMetaFileDC
+134 stub GdiPlayDCScript
+135 stub GdiPlayJournal
+136 stub GdiPlayScript
+137 stub GdiReleaseLocalDC
+138 stub GdiSetAttrs
+139 return GdiSetBatchLimit 4 1
+140 stub GdiSetServerAttr
+141 stub GetArcDirection
+142 stub GetAspectRatioFilterEx
+143 stdcall GetBitmapBits(long long ptr) GetBitmapBits32
+144 stdcall GetBitmapDimensionEx(long ptr) GetBitmapDimensionEx32
+145 stdcall GetBkColor(long) GetBkColor32
+146 stdcall GetBkMode(long) GetBkMode32
+147 stub GetBoundsRect
+148 stdcall GetBrushOrgEx(long ptr) GetBrushOrgEx32
+149 stdcall GetCharABCWidthsA(long long long ptr) GetCharABCWidths32A
+150 stub GetCharABCWidthsFloatA
+151 stub GetCharABCWidthsFloatW
+152 stdcall GetCharABCWidthsW(long long long ptr) GetCharABCWidths32W
+153 stdcall GetCharWidth32A(long long long long) GetCharWidth32A
+154 stdcall GetCharWidth32W(long long long long) GetCharWidth32W
+155 stdcall GetCharWidthA(long long long long) GetCharWidth32A
+156 stub GetCharWidthFloatA
+157 stub GetCharWidthFloatW
+158 stdcall GetCharWidthW(long long long long) GetCharWidth32W
+159 stub GetCharWidthWOW
+160 stub GetCharacterPlacementA
+161 stub GetCharacterPlacementW
+162 stdcall GetClipBox(long ptr) GetClipBox32
+163 stdcall GetClipRgn(long long) GetClipRgn32
+164 stub GetColorAdjustment
+165 stub GetColorSpace
+166 stub GetCurrentObject
+167 stdcall GetCurrentPositionEx(long ptr) GetCurrentPositionEx32
+168 stdcall GetDCOrgEx(long ptr) GetDCOrgEx
+169 stub GetDIBColorTable
+170 stdcall GetDIBits(long long long long ptr ptr long) GetDIBits32
+171 stdcall GetDeviceCaps(long long) GetDeviceCaps32
+172 stub GetDeviceGammaRamp
+173 stub GetETM
+174 stub GetEnhMetaFileA
+175 stub GetEnhMetaFileBits
+176 stub GetEnhMetaFileDescriptionA
+177 stub GetEnhMetaFileDescriptionW
+178 stub GetEnhMetaFileHeader
+179 stub GetEnhMetaFilePaletteEntries
+180 stub GetEnhMetaFileW
+181 stub GetFontData
+182 stub GetFontLanguageInfo
+183 stub GetFontResourceInfo
+184 stub GetFontResourceInfoW
+185 stub GetGlyphOutline
+186 stdcall GetGlyphOutlineA(long long long ptr long ptr ptr) GetGlyphOutline32A
+187 stdcall GetGlyphOutlineW(long long long ptr long ptr ptr) GetGlyphOutline32W
+188 return GetGraphicsMode 4 1 	# just return 1
+189 stub GetICMProfileA
+190 stub GetICMProfileW
+191 stub GetKerningPairs
+192 stdcall GetKerningPairsA(long long ptr) GetKerningPairs32A
+193 stdcall GetKerningPairsW(long long ptr) GetKerningPairs32W
+194 stub GetLogColorSpaceA
+195 stub GetLogColorSpaceW
+196 stdcall GetMapMode(long) GetMapMode32
+197 stdcall GetMetaFileA(ptr) GetMetaFile32A
+198 stub GetMetaFileBitsEx
+199 stdcall GetMetaFileW(ptr) GetMetaFile32W
+200 stub GetMetaRgn
+201 stub GetMiterLimit
+202 stdcall GetNearestColor(long long) GetNearestColor32
+203 stdcall GetNearestPaletteIndex(long long) GetNearestPaletteIndex32
+204 stdcall GetObjectA(long long ptr) GetObject32A
+205 stub GetObjectType
+206 stdcall GetObjectW(long long ptr) GetObject32W
+207 stub GetOutlineTextMetricsA
+208 stub GetOutlineTextMetricsW
+209 stdcall GetPaletteEntries(long long long ptr) GetPaletteEntries32
+210 stub GetPath
+211 stdcall GetPixel(long long long) GetPixel32
+212 stub GetPixelFormat
+213 stdcall GetPolyFillMode(long) GetPolyFillMode32
+214 stdcall GetROP2(long) GetROP232
+215 stub GetRandomRgn
+216 stdcall GetRasterizerCaps(ptr long) GetRasterizerCaps32
+217 stub GetRegionData
+218 stdcall GetRelAbs(long) GetRelAbs32
+219 stdcall GetRgnBox(long ptr) GetRgnBox32
+220 stdcall GetStockObject(long) GetStockObject32
+221 stdcall GetStretchBltMode(long) GetStretchBltMode32
+222 stdcall GetSystemPaletteEntries(long long long ptr) GetSystemPaletteEntries32
+223 stdcall GetSystemPaletteUse() GetSystemPaletteUse32
+224 stdcall GetTextAlign(long) GetTextAlign32
+225 stdcall GetTextCharacterExtra(long) GetTextCharacterExtra32
+226 stdcall GetTextCharset(long) GetTextCharset32
+227 stdcall GetTextColor(long) GetTextColor32
+228 stdcall GetTextExtentExPointA(long ptr long long ptr ptr ptr) GetTextExtentExPoint32A
+229 stdcall GetTextExtentExPointW(long ptr long long ptr ptr ptr) GetTextExtentExPoint32W
+230 stdcall GetTextExtentPoint32A(long ptr long ptr) GetTextExtentPoint32A
+231 stdcall GetTextExtentPoint32W(long ptr long ptr) GetTextExtentPoint32W
+232 stdcall GetTextExtentPointA(long ptr long ptr) GetTextExtentPoint32ABuggy
+233 stdcall GetTextExtentPointW(long ptr long ptr) GetTextExtentPoint32WBuggy
+234 stdcall GetTextFaceA(long long ptr) GetTextFace32A
+235 stdcall GetTextFaceW(long long ptr) GetTextFace32W
+236 stdcall GetTextMetricsA(long ptr) GetTextMetrics32A
+237 stdcall GetTextMetricsW(long ptr) GetTextMetrics32W
+238 stub GetTransform
+239 stdcall GetViewportExtEx(long ptr) GetViewportExtEx32
+240 stdcall GetViewportOrgEx(long ptr) GetViewportOrgEx32
+241 stub GetWinMetaFileBits
+242 stdcall GetWindowExtEx(long ptr) GetWindowExtEx32
+243 stdcall GetWindowOrgEx(long ptr) GetWindowOrgEx32
+244 return GetWorldTransform 8 0
+245 stdcall IntersectClipRect(long long long long long) IntersectClipRect32
+246 stdcall InvertRgn(long long) InvertRgn32
+247 stdcall LPtoDP(long ptr long) LPtoDP32
+248 stdcall LineDDA(long long long long ptr long) LineDDA32
+249 stdcall LineTo(long long long) LineTo32
+250 stub LoadImageColorMatcherA
+251 stub LoadImageColorMatcherW
+252 stub MaskBlt
+253 stub ModifyWorldTransform
+254 stdcall MoveToEx(long long long ptr) MoveToEx32
+255 stdcall OffsetClipRgn(long long long) OffsetClipRgn32
+256 stdcall OffsetRgn(long long long) OffsetRgn32
+257 stdcall OffsetViewportOrgEx(long long long ptr) OffsetViewportOrgEx32
+258 stdcall OffsetWindowOrgEx(long long long ptr) OffsetWindowOrgEx32
+259 stdcall PaintRgn(long long) PaintRgn32
+260 stdcall PatBlt(long long long long long long) PatBlt32
+261 stub PathToRegion
+262 stdcall Pie(long long long long long long long long long) Pie32
+263 stub PlayEnhMetaFile
+264 stub PlayEnhMetaFileRecord
+265 stdcall PlayMetaFile(long long) PlayMetaFile32
+266 stub PlayMetaFileRecord
+267 stub PlgBlt
+268 stub PolyBezier
+269 stub PolyBezierTo
+270 stub PolyDraw
+271 stdcall PolyPolygon(long ptr ptr long) PolyPolygon32
+272 stub PolyPolyline
+273 stub PolyTextOutA
+274 stub PolyTextOutW
+275 stdcall Polygon(long ptr long) Polygon32
+276 stdcall Polyline(long ptr long) Polyline32
+277 stub PolylineTo
+278 stdcall PtInRegion(long long long) PtInRegion32
+279 stdcall PtVisible(long long long) PtVisible32
+280 stdcall RealizePalette(long) RealizePalette32
+281 stdcall RectInRegion(long ptr) RectInRegion32
+282 stdcall RectVisible(long ptr) RectVisible32
+283 stdcall Rectangle(long long long long long) Rectangle32
+284 stdcall RemoveFontResourceA(ptr) RemoveFontResource32A
+285 stub RemoveFontResourceTracking
+286 stdcall RemoveFontResourceW(ptr) RemoveFontResource32W
+287 stdcall ResetDCA(long ptr) ResetDC32A
+288 stdcall ResetDCW(long ptr) ResetDC32W
+289 stdcall ResizePalette(long long) ResizePalette32
+290 stdcall RestoreDC(long long) RestoreDC32
+291 stdcall RoundRect(long long long long long long long) RoundRect32
+292 stdcall SaveDC(long) SaveDC32
+293 stdcall ScaleViewportExtEx(long long long long long ptr) ScaleViewportExtEx32
+294 stdcall ScaleWindowExtEx(long long long long long ptr) ScaleWindowExtEx32
+295 stub SelectBrushLocal
+296 stub SelectClipPath
+297 stdcall SelectClipRgn(long long) SelectClipRgn32
+298 stub SelectFontLocal
+299 stdcall SelectObject(long long) SelectObject32
+300 stdcall SelectPalette(long long long) SelectPalette32
+301 stub SetAbortProc
+302 stub SetArcDirection
+303 stdcall SetBitmapBits(long long ptr) SetBitmapBits32
+304 stdcall SetBitmapDimensionEx(long long long ptr) SetBitmapDimensionEx32
+305 stdcall SetBkColor(long long) SetBkColor32
+306 stdcall SetBkMode(long long) SetBkMode32
+307 stub SetBoundsRect
+308 stdcall SetBrushOrgEx(long long long ptr) SetBrushOrgEx
+309 stub SetColorAdjustment
+310 stub SetColorSpace
+311 stub SetDIBColorTable
+312 stdcall SetDIBits(long long long long ptr ptr long) SetDIBits32
+313 stdcall SetDIBitsToDevice(long long long long long long long long long
                                ptr ptr long) SetDIBitsToDevice32
-0314 stub SetDeviceGammaRamp
-0315 stub SetEnhMetaFileBits
-0316 stub SetFontEnumeration
-0317 return SetGraphicsMode 8 1
-0318 stub SetICMMode
-0319 stub SetICMProfileA
-0320 stub SetICMProfileW
-0321 stdcall SetMapMode(long long) SetMapMode32
-0322 stdcall SetMapperFlags(long long) SetMapperFlags32
-0323 stub SetMetaFileBitsEx
-0324 stub SetMetaRgn
-0325 stub SetMiterLimit
-0326 stdcall SetPaletteEntries(long long long ptr) SetPaletteEntries32
-0327 stdcall SetPixel(long long long long) SetPixel32
-0328 stub SetPixelFormat
-0329 stub SetPixelV
-0330 stdcall SetPolyFillMode(long long) SetPolyFillMode32
-0331 stdcall SetROP2(long long) SetROP232
-0332 stdcall SetRectRgn(long long long long long) SetRectRgn32
-0333 stdcall SetRelAbs(long long) SetRelAbs32
-0334 stdcall SetStretchBltMode(long long) SetStretchBltMode32
-0335 stdcall SetSystemPaletteUse(long long) SetSystemPaletteUse32
-0336 stdcall SetTextAlign(long long) SetTextAlign32
-0337 stdcall SetTextCharacterExtra(long long) SetTextCharacterExtra32
-0338 stdcall SetTextColor(long long) SetTextColor32
-0339 stdcall SetTextJustification(long long long) SetTextJustification32
-0340 stdcall SetViewportExtEx(long long long ptr) SetViewportExtEx32
-0341 stdcall SetViewportOrgEx(long long long ptr) SetViewportOrgEx32
-0342 stub SetVirtualResolution
-0343 stub SetWinMetaFileBits
-0344 stdcall SetWindowExtEx(long long long ptr) SetWindowExtEx32
-0345 stdcall SetWindowOrgEx(long long long ptr) SetWindowOrgEx32
-0346 stub SetWorldTransform
-0347 stub StartDocA
-0348 stub StartDocW
-0349 stub StartPage
-0350 stdcall StretchBlt(long long long long long long long long long long long)
-             StretchBlt32
-0351 stdcall StretchDIBits(long long long long long long long long long
-                           ptr ptr long long) StretchDIBits32
-0352 stub StrokeAndFillPath
-0353 stub StrokePath
-0354 stub SwapBuffers
-0355 stdcall TextOutA(long long long ptr long) TextOut32A
-0356 stdcall TextOutW(long long long ptr long) TextOut32W
-0357 stub UnloadNetworkFonts
-0358 stdcall UnrealizeObject(long) UnrealizeObject32
-0359 stdcall UpdateColors(long) UpdateColors32
-0360 stub WidenPath
-0361 stub pstackConnect
+314 stub SetDeviceGammaRamp
+315 stub SetEnhMetaFileBits
+316 stub SetFontEnumeration
+317 return SetGraphicsMode 8 1
+318 stub SetICMMode
+319 stub SetICMProfileA
+320 stub SetICMProfileW
+321 stdcall SetMapMode(long long) SetMapMode32
+322 stdcall SetMapperFlags(long long) SetMapperFlags32
+323 stub SetMetaFileBitsEx
+324 stub SetMetaRgn
+325 stub SetMiterLimit
+326 stdcall SetPaletteEntries(long long long ptr) SetPaletteEntries32
+327 stdcall SetPixel(long long long long) SetPixel32
+328 stub SetPixelFormat
+329 stub SetPixelV
+330 stdcall SetPolyFillMode(long long) SetPolyFillMode32
+331 stdcall SetROP2(long long) SetROP232
+332 stdcall SetRectRgn(long long long long long) SetRectRgn32
+333 stdcall SetRelAbs(long long) SetRelAbs32
+334 stdcall SetStretchBltMode(long long) SetStretchBltMode32
+335 stdcall SetSystemPaletteUse(long long) SetSystemPaletteUse32
+336 stdcall SetTextAlign(long long) SetTextAlign32
+337 stdcall SetTextCharacterExtra(long long) SetTextCharacterExtra32
+338 stdcall SetTextColor(long long) SetTextColor32
+339 stdcall SetTextJustification(long long long) SetTextJustification32
+340 stdcall SetViewportExtEx(long long long ptr) SetViewportExtEx32
+341 stdcall SetViewportOrgEx(long long long ptr) SetViewportOrgEx32
+342 stub SetVirtualResolution
+343 stub SetWinMetaFileBits
+344 stdcall SetWindowExtEx(long long long ptr) SetWindowExtEx32
+345 stdcall SetWindowOrgEx(long long long ptr) SetWindowOrgEx32
+346 stub SetWorldTransform
+347 stub StartDocA
+348 stub StartDocW
+349 stub StartPage
+350 stdcall StretchBlt(long long long long long long long long long long long)
+            StretchBlt32
+351 stdcall StretchDIBits(long long long long long long long long long
+                          ptr ptr long long) StretchDIBits32
+352 stub StrokeAndFillPath
+353 stub StrokePath
+354 stub SwapBuffers
+355 stdcall TextOutA(long long long ptr long) TextOut32A
+356 stdcall TextOutW(long long long ptr long) TextOut32W
+357 stub UnloadNetworkFonts
+358 stdcall UnrealizeObject(long) UnrealizeObject32
+359 stdcall UpdateColors(long) UpdateColors32
+360 stub WidenPath
+361 stub pstackConnect
 #late additions
-0362 stub DeviceCapabilitiesEx
-0363 stub GdiDciBeginAccess
-0364 stub GdiDciCreateOffscreenSurface
-0365 stub GdiDciCreateOverlaySurface
-0366 stub GdiDciCreatePrimarySurface
-0367 stub GdiDciDestroySurface
-0368 stub GdiDciDrawSurface
-0369 stub GdiDciEndAccess
-0370 stub GdiDciEnumSurface
-0371 stub GdiDciInitialize
-0372 stub GdiDciSetClipList
-0373 stub GdiDciSetDestination
-0374 stub GdiDllInitialize
-0375 stub GdiGetLocalBitmap
-0376 stub GdiWinWatchClose
-0377 stub GdiWinWatchDidStatusChange
-0378 stub GdiWinWatchGetClipList
-0379 stub GdiWinWatchOpen
-0380 stub GetGlyphOutlineWow
-0381 stub GetTextCharsetInfo
-0382 stdcall TranslateCharsetInfo(ptr ptr long) TranslateCharSetInfo
-0383 stub UpdateICMRegKeyA
-0384 stub UpdateICMRegKeyW
-0385 stub gdiPlaySpoolStream
-0386 return SetObjectOwner 8 0
+362 stub DeviceCapabilitiesEx
+363 stub GdiDciBeginAccess
+364 stub GdiDciCreateOffscreenSurface
+365 stub GdiDciCreateOverlaySurface
+366 stub GdiDciCreatePrimarySurface
+367 stub GdiDciDestroySurface
+368 stub GdiDciDrawSurface
+369 stub GdiDciEndAccess
+370 stub GdiDciEnumSurface
+371 stub GdiDciInitialize
+372 stub GdiDciSetClipList
+373 stub GdiDciSetDestination
+374 stub GdiDllInitialize
+375 stub GdiGetLocalBitmap
+376 stub GdiWinWatchClose
+377 stub GdiWinWatchDidStatusChange
+378 stub GdiWinWatchGetClipList
+379 stub GdiWinWatchOpen
+380 stub GetGlyphOutlineWow
+381 stub GetTextCharsetInfo
+382 stdcall TranslateCharsetInfo(ptr ptr long) TranslateCharSetInfo
+383 stub UpdateICMRegKeyA
+384 stub UpdateICMRegKeyW
+385 stub gdiPlaySpoolStream
+386 return SetObjectOwner 8 0
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index e17ff9c..df6f2e7 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -39,7 +39,7 @@
 35  pascal16 GetTaskQueue(word) GetTaskQueue
 36  pascal   GetCurrentTask() WIN16_GetCurrentTask
 37  pascal GetCurrentPDB() GetCurrentPDB
-38  pascal   SetTaskSignalProc(word segptr) SetTaskSignalProc
+38  pascal   SetTaskSignalProc(word segptr) THUNK_SetTaskSignalProc
 41  return EnableDos 0 0
 42  return DisableDos 0 0
 45  pascal16 LoadModule(str ptr) LoadModule16
@@ -64,7 +64,7 @@
 64  pascal16 AccessResource(word word) AccessResource16
 65  pascal SizeofResource(word word) SizeofResource16
 66  pascal16 AllocResource(word word long) AllocResource16
-67  pascal SetResourceHandler(word segstr ptr) SetResourceHandler
+67  pascal SetResourceHandler(word segstr segptr) THUNK_SetResourceHandler
 68  pascal16 InitAtomTable(word) InitAtomTable16
 69  pascal16 FindAtom(segstr) FindAtom16
 70  pascal16 AddAtom(segstr) AddAtom16
@@ -89,12 +89,12 @@
 89  pascal   lstrcat(segstr str) lstrcat16
 90  pascal16 lstrlen(str) lstrlen16
 91  register InitTask() InitTask
-92  pascal   GetTempDrive(byte) WIN16_GetTempDrive
+92  pascal   GetTempDrive(word) WIN16_GetTempDrive
 93  pascal16 GetCodeHandle(segptr) GetCodeHandle
 94  stub DefineHandleTable
 95  pascal16 LoadLibrary(str) LoadLibrary16
 96  pascal16 FreeLibrary(word) FreeLibrary16
-97  pascal16 GetTempFileName(byte str word ptr) GetTempFileName16
+97  pascal16 GetTempFileName(word str word ptr) GetTempFileName16
 98  return GetLastDiskChange 0 0
 99  stub GetLPErrMode
 100 return ValidateCodeSegments 0 0
@@ -135,7 +135,7 @@
 133 pascal16 GetExePtr(word) GetExePtr
 134 pascal16 GetWindowsDirectory(ptr word) GetWindowsDirectory16
 135 pascal16 GetSystemDirectory(ptr word) GetSystemDirectory16
-136 pascal16 GetDriveType(byte) GetDriveType16
+136 pascal16 GetDriveType(word) GetDriveType16
 137 pascal16 FatalAppExit(word str) FatalAppExit16
 138 pascal GetHeapSpaces(word) GetHeapSpaces
 139 stub DoSignal
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 695a564..3b6243a 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -1,6 +1,5 @@
 name	kernel32
 type	win32
-base	1
 
 # Functions exported by the Win95 kernel32.dll 
 # (these need to have these exact ordinals, for some win95 dlls 
@@ -9,838 +8,838 @@
 
 # undocumented ordinal only calls (names taken from k32exp.h by Andrew
 # Schulman.
-0  stub VxDCall0
-1  stub VxDCall0
-2  stub VxDCall0
-3  stub VxDCall0
-4  stub VxDCall0
-5  stub VxDCall0
-6  stub VxDCall0
-7  stub VxDCall0
-8  stub VxDCall0
+  1 stub VxDCall0
+  2 stub VxDCall1
+  3 stub VxDCall2
+  4 stub VxDCall3
+  5 stub VxDCall4
+  6 stub VxDCall5
+  7 stub VxDCall6
+  8 stub VxDCall7
+  9 stub VxDCall8
  
-9  stub _KERNEL32_stringconv1 #ansi2oem or reverse?
+ 10 stub _KERNEL32_stringconv1 #ansi2oem or reverse?
  
-17  stdcall _KERNEL32_18(long long) _KERNEL32_18
-18  stub _KERNEL32_getheapsegment
+ 18 stdcall _KERNEL32_18(long long) _KERNEL32_18
+ 19 stub _KERNEL32_getheapsegment
  
-30  stub _KERNEL32_31
+ 31 stub _KERNEL32_31
  
-33  stdcall _KERNEL32_34() _KERNEL32_34
-34  stdcall LoadLibrary16(ptr) LoadLibrary16
-35  stub FreeLibrary16
-36  stdcall GetProcAddress16(long ptr) WIN32_GetProcAddress16
+ 34 stdcall _KERNEL32_34() _KERNEL32_34
+ 35 stdcall LoadLibrary16(ptr) LoadLibrary16
+ 36 stdcall FreeLibrary16(long) FreeLibrary16
+ 37 stdcall GetProcAddress16(long ptr) WIN32_GetProcAddress16
  
-39  stub _KERNEL32_40
-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() _KERNEL32_45 
-45  stdcall _KERNEL32_46(long long long long long) _KERNEL32_46
-46  stub _KERNEL32_47
+ 40 stub _KERNEL32_40
+ 41 stdcall _KERNEL32_41(long long long long long) _KERNEL32_41
+ 42 stub _KERNEL32_42
+ 43 stdcall _KERNEL32_43(long ptr long ptr ptr) _KERNEL32_43
+ 45 register _KERNEL32_45() _KERNEL32_45 
+ 46 stdcall _KERNEL32_46(long long long long long) _KERNEL32_46
+ 47 stub _KERNEL32_47
  
-49  stdcall AddAtomA(ptr) AddAtom32A
+ 50 stdcall AddAtomA(ptr) AddAtom32A
 
-51  register _KERNEL32_52(long) _KERNEL32_52
+ 52 register _KERNEL32_52(long) _KERNEL32_52
 
 # WOW calls
-53  stdcall WOWCallback16(long long) WOWCallback16
-54  stub WOWCallback16Ex
-55  stdcall WOWGetVDMPointer(long long long) WOWGetVDMPointer
-56  stub WOWHandle32
-57  stub WOWHandle16
-58  stub WOWGlobalAlloc16
-59  stub WOWGlobalLock16
-60  stub WOWGlobalUnlock16
-61  stub WOWGlobalFree16
-62  stdcall WOWGlobalAllocLock16(long long ptr) WOWGlobalAllocLock16
-63  stub WOWGlobalUnlockFree16
-64  stub WOWGlobalLockSize16
-65  stub WOWYield16
-66  stub WOWDirectedYield16
-67  stdcall WOWGetVDMPointerFix(long long long) WOWGetVDMPointerFix
-68  stdcall WOWGetVDMPointerUnfix(long) WOWGetVDMPointerUnfix
-69  stdcall WOW32_1(long long) WOW32_1
+ 54 stdcall WOWCallback16(long long) WOWCallback16
+ 55 stub WOWCallback16Ex
+ 56 stdcall WOWGetVDMPointer(long long long) WOWGetVDMPointer
+ 57 stub WOWHandle32
+ 58 stub WOWHandle16
+ 59 stub WOWGlobalAlloc16
+ 60 stub WOWGlobalLock16
+ 61 stub WOWGlobalUnlock16
+ 62 stub WOWGlobalFree16
+ 63 stdcall WOWGlobalAllocLock16(long long ptr) WOWGlobalAllocLock16
+ 64 stub WOWGlobalUnlockFree16
+ 65 stub WOWGlobalLockSize16
+ 66 stub WOWYield16
+ 67 stub WOWDirectedYield16
+ 68 stdcall WOWGetVDMPointerFix(long long long) WOWGetVDMPointerFix
+ 69 stdcall WOWGetVDMPointerUnfix(long) WOWGetVDMPointerUnfix
+ 70 stdcall WOW32_1(long long) WOW32_1
  
-71  stub RtlLargeIntegerAdd
-72  stub RtlEnlargedIntegerMultiply
-73  stub RtlEnlargedUnsignedMultiply
-74  stub RtlEnlargedUnsignedDivide
-75  stub RtlExtendedLargeIntegerDivide
-76  stub RtlExtendedMagicDivide
-77  stub RtlExtendedIntegerMultiply
-78  stub RtlLargeIntegerShiftLeft
-79  stub RtlLargeIntegerShiftRight
-80  stub RtlLargeIntegerArithmeticShift
-81  stub RtlLargeIntegerNegate
-82  stub RtlLargeIntegerSubtract
-83  stub RtlConvertLongToLargeInteger
-84  stub RtlConvertUlongToLargeInteger
+ 72 stub RtlLargeIntegerAdd
+ 73 stub RtlEnlargedIntegerMultiply
+ 74 stub RtlEnlargedUnsignedMultiply
+ 75 stub RtlEnlargedUnsignedDivide
+ 76 stub RtlExtendedLargeIntegerDivide
+ 77 stub RtlExtendedMagicDivide
+ 78 stub RtlExtendedIntegerMultiply
+ 79 stub RtlLargeIntegerShiftLeft
+ 80 stub RtlLargeIntegerShiftRight
+ 81 stub RtlLargeIntegerArithmeticShift
+ 82 stub RtlLargeIntegerNegate
+ 83 stub RtlLargeIntegerSubtract
+ 84 stub RtlConvertLongToLargeInteger
+ 85 stub RtlConvertUlongToLargeInteger
 
-86  stdcall _KERNEL32_87() _KERNEL32_87
-87  cdecl _KERNEL32_88() _KERNEL32_88
-88  stub _KERNEL32_89
-89  register _KERNEL32_90() _KERNEL32_90
-90  stub _KERNEL32_91
-91  stub _KERNEL32_92
-92  stdcall GETPWIN16LOCK(ptr) GetPWinLock
-96  stub ENTERSYSLEVEL
-97  stub LEAVESYSLEVEL
-98  stub _KERNEL32_98
-99  stub _KERNEL32_99
-100 stub _KERNEL32_100
+ 87 stdcall _KERNEL32_87() _KERNEL32_87
+ 88 varargs _KERNEL32_88() _KERNEL32_88
+ 89 stub _KERNEL32_89
+ 90 register _KERNEL32_90() _KERNEL32_90
+ 91 stub _KERNEL32_91
+ 92 stub _KERNEL32_92
+ 93 stdcall GETPWIN16LOCK(ptr) GetPWinLock
+ 97 stub ENTERSYSLEVEL
+ 98 stub LEAVESYSLEVEL
+ 99 stub _KERNEL32_98
+100 stub _KERNEL32_99
+101 stub _KERNEL32_100
 
 
-101   stdcall AddAtomW(ptr) AddAtom32W
-102   stub AllocConsole
-103   stub AllocLSCallback
-104   stub AllocSLCallback
-105   stdcall AreFileApisANSI() AreFileApisANSI
-106   stub BackupRead
-107   stub BackupSeek
-108   stub BackupWrite
-109   stdcall Beep(long long) Beep
-110   stub BeginUpdateResourceA
-111   stub BeginUpdateResourceW
-112   stdcall BuildCommDCBA(ptr ptr) BuildCommDCB32A
-113   stdcall BuildCommDCBAndTimeoutsA(ptr ptr ptr) BuildCommDCBAndTimeouts32A
-114   stdcall BuildCommDCBAndTimeoutsW(ptr ptr ptr) BuildCommDCBAndTimeouts32W
-115   stdcall BuildCommDCBW(ptr ptr) BuildCommDCB32W
-116   stub CallNamedPipeA
-117   stub CallNamedPipeW
-118   stub Callback12
-119   stub Callback16
-120   stub Callback20
-121   stub Callback24
-122   stub Callback28
-123   stub Callback32
-124   stub Callback36
-125   stub Callback40
-126   stub Callback44
-127   stub Callback48
-128   stub Callback4
-129   stub Callback52
-130   stub Callback56
-131   stub Callback60
-132   stub Callback64
-133   stub Callback8
-134   stdcall ClearCommBreak(long) ClearCommBreak32
-135   stdcall ClearCommError(long ptr ptr) ClearCommError
-136   stdcall CloseHandle(long) CloseHandle
-137   stub CloseProfileUserMapping
-138   stub CloseSystemHandle
-139   stub CommConfigDialogA
-140   stub CommConfigDialogW
-141   stdcall CompareFileTime(ptr ptr) CompareFileTime
-142   stdcall CompareStringA(long long ptr long ptr long) CompareString32A
-143   stdcall CompareStringW(long long ptr long ptr long) CompareString32W
-144   stub ConnectNamedPipe
-145   stdcall ContinueDebugEvent(long long long) ContinueDebugEvent
-146   stub ConvertDefaultLocale
-147   stdcall ConvertToGlobalHandle(long) ConvertToGlobalHandle
-148   stdcall CopyFileA(ptr ptr long) CopyFile32A
-149   stdcall CopyFileW(ptr ptr long) CopyFile32W
-150   stub CreateConsoleScreenBuffer
-151   stdcall CreateDirectoryA(ptr ptr) CreateDirectory32A
-152   stdcall CreateDirectoryExA(ptr ptr ptr) CreateDirectoryEx32A
-153   stdcall CreateDirectoryExW(ptr ptr ptr) CreateDirectoryEx32W
-154   stdcall CreateDirectoryW(ptr ptr) CreateDirectory32W
-155   stdcall CreateEventA(ptr long long ptr) CreateEvent32A
-156   stdcall CreateEventW(ptr long long ptr) CreateEvent32W
-157   stdcall CreateFileA(ptr long long ptr long long long) CreateFile32A
-158   stdcall CreateFileMappingA(long ptr long long long ptr) CreateFileMapping32A
-159   stdcall CreateFileMappingW(long ptr long long long ptr) CreateFileMapping32W
-160   stdcall CreateFileW(ptr long long ptr long long long) CreateFile32W
-161   stub CreateIoCompletionPort
-162   stub CreateKernelThread
-163   stub CreateMailslotA
-164   stub CreateMailslotW
-165   stdcall CreateMutexA(ptr long ptr) CreateMutex32A
-166   stdcall CreateMutexW(ptr long ptr) CreateMutex32W
-167   stub CreateNamedPipeA
-168   stub CreateNamedPipeW
-169   stub CreatePipe
-170   stdcall CreateProcessA(ptr ptr ptr ptr long long ptr ptr ptr ptr) CreateProcess32A
-171   stub CreateProcessW
-172   stub CreateRemoteThread
-173   stdcall CreateSemaphoreA(ptr long long ptr) CreateSemaphore32A
-174   stdcall CreateSemaphoreW(ptr long long ptr) CreateSemaphore32W
-175   stub CreateSocketHandle
-176   stub CreateTapePartition
-177   stdcall CreateThread(ptr long ptr long long ptr) CreateThread
-178   stub CreateToolhelp32Snapshot
-179   stub DebugActiveProcess
-180   stdcall DebugBreak() DebugBreak32
-181   stub DefineDosDeviceA
-182   stub DefineDosDeviceW
-183   stdcall DeleteAtom(long) DeleteAtom32
-184   stdcall DeleteCriticalSection(ptr)	DeleteCriticalSection
-185   stdcall DeleteFileA(ptr) DeleteFile32A
-186   stdcall DeleteFileW(ptr) DeleteFile32W
-187   stub DeviceIoControl
-188   stdcall DisableThreadLibraryCalls(long) DisableThreadLibraryCalls
-189   stub DisconnectNamedPipe
-190   stdcall DosDateTimeToFileTime(long long ptr) DosDateTimeToFileTime
-191   stdcall DuplicateHandle(long long long ptr long long long) DuplicateHandle
-192   stub EndUpdateResourceA
-193   stub EndUpdateResourceW
-194   stdcall EnterCriticalSection(ptr)	EnterCriticalSection
-195   stub EnumCalendarInfoA
-196   stub EnumCalendarInfoW
-197   stub EnumDateFormatsA
-198   stub EnumDateFormatsW
-199   stdcall EnumResourceLanguagesA(long ptr ptr ptr long) THUNK_EnumResourceLanguages32A
-200   stdcall EnumResourceLanguagesW(long ptr ptr ptr long) THUNK_EnumResourceLanguages32W
-201   stdcall EnumResourceNamesA(long ptr ptr long) THUNK_EnumResourceNames32A
-202   stdcall EnumResourceNamesW(long ptr ptr long) THUNK_EnumResourceNames32W
-203   stdcall EnumResourceTypesA(long ptr long) THUNK_EnumResourceTypes32A
-204   stdcall EnumResourceTypesW(long ptr long) THUNK_EnumResourceTypes32W
-205   stdcall EnumSystemCodePagesA(ptr long) THUNK_EnumSystemCodePages32A
-206   stdcall EnumSystemCodePagesW(ptr long) THUNK_EnumSystemCodePages32W
-207   stdcall EnumSystemLocalesA(ptr long) THUNK_EnumSystemLocales32A
-208   stdcall EnumSystemLocalesW(ptr long) THUNK_EnumSystemLocales32W
-209   stub EnumTimeFormatsA
-210   stub EnumTimeFormatsW
-211   stub EraseTape
-212   stdcall EscapeCommFunction(long long) EscapeCommFunction32
-213   stdcall ExitProcess(long) ExitProcess
-214   stub ExitThread
-215   stdcall ExpandEnvironmentStringsA(ptr ptr long) ExpandEnvironmentStrings32A
-216   stdcall ExpandEnvironmentStringsW(ptr ptr long) ExpandEnvironmentStrings32W
-217   stub FT_Exit0
-218   stub FT_Exit12
-219   stub FT_Exit16
-220   stub FT_Exit20
-221   stub FT_Exit24
-222   stub FT_Exit28
-223   stub FT_Exit32
-224   stub FT_Exit36
-226   stub FT_Exit40
-227   stub FT_Exit44
-228   stub FT_Exit48
-225   stub FT_Exit4
-229   stub FT_Exit52
-230   stub FT_Exit56
-231   stub FT_Exit8
-232   stub FT_Prolog
-233   stub FT_Thunk
-234   stdcall FatalAppExitA(long ptr) FatalAppExit32A
-235   stdcall FatalAppExitW(long ptr) FatalAppExit32W
-236   stub FatalExit
-237   stdcall FileTimeToDosDateTime(ptr ptr ptr) FileTimeToDosDateTime
-238   stdcall FileTimeToLocalFileTime(ptr ptr) FileTimeToLocalFileTime
-239   stdcall FileTimeToSystemTime(ptr ptr) FileTimeToSystemTime
-240   stub FillConsoleOutputAttribute
-241   stub FillConsoleOutputCharacterA
-242   stub FillConsoleOutputCharacterW
-243   stdcall FindAtomA(ptr) FindAtom32A
-244   stdcall FindAtomW(ptr) FindAtom32W
-246   stub FindCloseChangeNotification
-245   stdcall FindClose(long) FindClose32
-247   stub FindFirstChangeNotificationA
-248   stub FindFirstChangeNotificationW
-249   stdcall FindFirstFileA(ptr ptr) FindFirstFile32A
-250   stdcall FindFirstFileW(ptr ptr) FindFirstFile32W
-251   stub FindNextChangeNotification
-252   stdcall FindNextFileA(long ptr) FindNextFile32A
-253   stdcall FindNextFileW(long ptr) FindNextFile32W
-254   stdcall FindResourceA(long ptr ptr) FindResource32A
-255   stdcall FindResourceExA(long ptr ptr long) FindResourceEx32A
-256   stdcall FindResourceExW(long ptr ptr long) FindResourceEx32W
-257   stdcall FindResourceW(long ptr ptr) FindResource32W
-258   stdcall FlushConsoleInputBuffer(long) FlushConsoleInputBuffer
-259   stdcall FlushFileBuffers(long) FlushFileBuffers
-260   stub FlushInstructionCache
-261   stub FlushViewOfFile
-262   stub FoldStringA
-263   stub FoldStringW
-264   stdcall FormatMessageA() WIN32_FormatMessage32A
-265   stdcall FormatMessageW() WIN32_FormatMessage32W
-266   stub FreeConsole
-267   stdcall FreeEnvironmentStringsA(ptr) FreeEnvironmentStrings32A
-268   stdcall FreeEnvironmentStringsW(ptr) FreeEnvironmentStrings32W
-269   stub FreeLSCallback
-271   stub FreeLibraryAndExitThread
-270   stdcall FreeLibrary(long) FreeLibrary32
-272   stdcall FreeResource(long) FreeResource32
-273   stub FreeSLCallback
-274   stub GenerateConsoleCtrlEvent
-275   stdcall GetACP() GetACP
-276   stdcall GetAtomNameA(long ptr long) GetAtomName32A
-277   stdcall GetAtomNameW(long ptr long) GetAtomName32W
-278   stub GetBinaryType
-279   stub GetBinaryTypeA
-280   stub GetBinaryTypeW
-281   stdcall GetCPInfo(long ptr) GetCPInfo
-282   stub GetCommConfig
-283   stdcall GetCommMask(long ptr) GetCommMask
-284   stub GetCommModemStatus
-285   stub GetCommProperties
-286   stdcall GetCommState(long ptr) GetCommState32
-287   stdcall GetCommTimeouts(long ptr) GetCommTimeouts
-288   stdcall GetCommandLineA() GetCommandLine32A
-289   stdcall GetCommandLineW() GetCommandLine32W
-290   stub GetCompressedFileSizeA
-291   stub GetCompressedFileSizeW
-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
-299   stdcall GetConsoleTitleA(ptr long) GetConsoleTitle32A
-300   stdcall GetConsoleTitleW(ptr long) GetConsoleTitle32W
-301   stub GetCurrencyFormatA
-302   stub GetCurrencyFormatW
-303   stdcall GetCurrentDirectoryA(long ptr) GetCurrentDirectory32A
-304   stdcall GetCurrentDirectoryW(long ptr) GetCurrentDirectory32W
-305   stdcall GetCurrentProcess() GetCurrentProcess
-306   stdcall GetCurrentProcessId() GetCurrentProcessId
-307   stdcall GetCurrentThread() GetCurrentThread
-308   stdcall GetCurrentThreadId() GetCurrentThreadId
-309   stub GetDateFormatA
-310   stub GetDateFormatW
-311   stub GetDaylightFlag
-312   stub GetDefaultCommConfigA
-313   stub GetDefaultCommConfigW
-314   stdcall GetDiskFreeSpaceA(ptr ptr ptr ptr ptr) GetDiskFreeSpace32A
-315   stdcall GetDiskFreeSpaceW(ptr ptr ptr ptr ptr) GetDiskFreeSpace32W
-316   stdcall GetDriveTypeA(ptr) GetDriveType32A
-317   stdcall GetDriveTypeW(ptr) GetDriveType32W
-319   stdcall GetEnvironmentStringsA() GetEnvironmentStrings32A
-320   stdcall GetEnvironmentStringsW() GetEnvironmentStrings32W
-318   stdcall GetEnvironmentStrings() GetEnvironmentStrings32A
-321   stdcall GetEnvironmentVariableA(ptr ptr long) GetEnvironmentVariable32A
-322   stdcall GetEnvironmentVariableW(ptr ptr long) GetEnvironmentVariable32W
-323   stub GetErrorMode
-324   stub GetExitCodeProcess
-325   stub GetExitCodeThread
-326   stdcall GetFileAttributesA(ptr) GetFileAttributes32A
-327   stdcall GetFileAttributesW(ptr) GetFileAttributes32W
-328   stdcall GetFileInformationByHandle(long ptr) GetFileInformationByHandle
-329   stdcall GetFileSize(long ptr) GetFileSize
-330   stdcall GetFileTime(long ptr ptr ptr) GetFileTime
-331   stdcall GetFileType(long) GetFileType
-332   stdcall GetFullPathNameA(ptr long ptr ptr) GetFullPathName32A
-333   stdcall GetFullPathNameW(ptr long ptr ptr) GetFullPathName32W
-334   stub GetHandleContext
-335   stub GetHandleInformation
-336   stub GetLSCallbackTarget
-337   stub GetLSCallbackTemplate
-338   stdcall GetLargestConsoleWindowSize(long) GetLargestConsoleWindowSize
-339   stdcall GetLastError() GetLastError
-340   stdcall GetLocalTime(ptr) GetLocalTime
-341   stdcall GetLocaleInfoA(long long ptr long) GetLocaleInfo32A
-342   stdcall GetLocaleInfoW(long long ptr long) GetLocaleInfo32W
-343   stdcall GetLogicalDriveStringsA(long ptr) GetLogicalDriveStrings32A
-344   stdcall GetLogicalDriveStringsW(long ptr) GetLogicalDriveStrings32W
-345   stdcall GetLogicalDrives() GetLogicalDrives
-346   stub GetMailslotInfo
-347   stdcall GetModuleFileNameA(long ptr long) GetModuleFileName32A
-348   stdcall GetModuleFileNameW(long ptr long) GetModuleFileName32W
-349   stdcall GetModuleHandleA(ptr) WIN32_GetModuleHandleA
-350   stdcall GetModuleHandleW(ptr) WIN32_GetModuleHandleW
-351   stub GetNamedPipeHandleStateA
-352   stub GetNamedPipeHandleStateW
-353   stub GetNamedPipeInfo
-354   stub GetNumberFormatA
-355   stub GetNumberFormatW
-356   stdcall GetNumberOfConsoleInputEvents(long ptr) GetNumberOfConsoleInputEvents
-357   stub GetNumberOfConsoleMouseButtons
-358   stdcall GetOEMCP() GetOEMCP
-359   stub GetOverlappedResult
-360   stdcall GetPriorityClass(long) GetPriorityClass
-361   stdcall GetPrivateProfileIntA(ptr ptr long ptr) GetPrivateProfileInt32A
-362   stdcall GetPrivateProfileIntW(ptr ptr long ptr) GetPrivateProfileInt32W
-363   stub GetPrivateProfileSectionA
-364   stub GetPrivateProfileSectionNamesA
-365   stub GetPrivateProfileSectionNamesW
-366   stub GetPrivateProfileSectionW
-367   stdcall GetPrivateProfileStringA(ptr ptr ptr ptr long ptr) GetPrivateProfileString32A
-368   stdcall GetPrivateProfileStringW(ptr ptr ptr ptr long ptr) GetPrivateProfileString32W
-369   stub GetPrivateProfileStructA
-370   stub GetPrivateProfileStructW
-371   stdcall GetProcAddress(long ptr) GetProcAddress32
-372   stdcall GetProcessAffinityMask(long ptr ptr)	GetProcessAffinityMask
-373   stub GetProcessFlags
-374   stdcall GetProcessHeap() GetProcessHeap
-375   stub GetProcessHeaps
-376   stub GetProcessShutdownParameters
-377   stdcall GetProcessTimes(long ptr ptr ptr ptr) GetProcessTimes
-378   stdcall GetProcessVersion(long) GetProcessVersion
-379   stdcall GetProcessWorkingSetSize(long ptr ptr) GetProcessWorkingSetSize
-380   stub GetProductName
-381   stdcall GetProfileIntA(ptr ptr long) GetProfileInt32A
-382   stdcall GetProfileIntW(ptr ptr long) GetProfileInt32W
-383   stub GetProfileSectionA
-384   stub GetProfileSectionW
-385   stdcall GetProfileStringA(ptr ptr ptr ptr long) GetProfileString32A
-386   stdcall GetProfileStringW(ptr ptr ptr ptr long) GetProfileString32W
-387   stub GetQueuedCompletionStatus
-388   stub GetSLCallbackTarget
-389   stub GetSLCallbackTemplate
-390   stdcall GetShortPathNameA(ptr ptr long) GetShortPathName32A
-391   stdcall GetShortPathNameW(ptr ptr long) GetShortPathName32W
-392   stdcall GetStartupInfoA(ptr) GetStartupInfo32A
-393   stdcall GetStartupInfoW(ptr) GetStartupInfo32W
-394   stdcall GetStdHandle(long)	GetStdHandle
-395   stdcall GetStringTypeA(long long ptr long ptr) GetStringType32A
-396   stdcall GetStringTypeExA(long long ptr long ptr) GetStringTypeEx32A
-397   stdcall GetStringTypeExW(long long ptr long ptr) GetStringTypeEx32W
-398   stdcall GetStringTypeW(long ptr long ptr) GetStringType32W
-399   stdcall GetSystemDefaultLCID() GetSystemDefaultLCID
-400   stdcall GetSystemDefaultLangID() GetSystemDefaultLangID
-401   stdcall GetSystemDirectoryA(ptr long) GetSystemDirectory32A
-402   stdcall GetSystemDirectoryW(ptr long) GetSystemDirectory32W
-403   stdcall GetSystemInfo(ptr) GetSystemInfo
-404   stdcall GetSystemPowerStatus(ptr) GetSystemPowerStatus
-405   stdcall GetSystemTime(ptr) GetSystemTime
-406   stub GetSystemTimeAdjustment
-407   stub GetSystemTimeAsFileTime
-408   stub GetTapeParameters
-409   stub GetTapePosition
-410   stub GetTapeStatus
-411   stdcall GetTempFileNameA(ptr ptr long ptr) GetTempFileName32A
-412   stdcall GetTempFileNameW(ptr ptr long ptr) GetTempFileName32W
-413   stdcall GetTempPathA(long ptr) GetTempPath32A
-414   stdcall GetTempPathW(long ptr) GetTempPath32W
-415   stdcall GetThreadContext(long ptr) GetThreadContext
-416   stdcall GetThreadLocale() GetThreadLocale
-417   stdcall GetThreadPriority(long) GetThreadPriority
-418   stdcall GetThreadSelectorEntry(long long ptr) GetThreadSelectorEntry
-419   stub GetThreadTimes
-420   stdcall GetTickCount() GetTickCount
-421   stub GetTimeFormatA
-422   stub GetTimeFormatW
-423   stdcall GetTimeZoneInformation(ptr) GetTimeZoneInformation
-424   stdcall GetUserDefaultLCID() GetUserDefaultLCID
-425   stdcall GetUserDefaultLangID() GetUserDefaultLangID
-426   stdcall GetVersion() GetVersion32
-427   stdcall GetVersionExA(ptr) GetVersionEx32A
-428   stdcall GetVersionExW(ptr) GetVersionEx32W
-429   stdcall GetVolumeInformationA(ptr ptr long ptr ptr ptr ptr long) GetVolumeInformation32A
-430   stdcall GetVolumeInformationW(ptr ptr long ptr ptr ptr ptr long) GetVolumeInformation32W
-431   stdcall GetWindowsDirectoryA(ptr long) GetWindowsDirectory32A
-432   stdcall GetWindowsDirectoryW(ptr long) GetWindowsDirectory32W
-433   stdcall GlobalAddAtomA(ptr) GlobalAddAtom32A
-434   stdcall GlobalAddAtomW(ptr) GlobalAddAtom32W
-435   stdcall GlobalAlloc(long long) GlobalAlloc32
-436   stdcall GlobalCompact(long) GlobalCompact32
-437   stdcall GlobalDeleteAtom(long) GlobalDeleteAtom
-438   stdcall GlobalFindAtomA(ptr) GlobalFindAtom32A
-439   stdcall GlobalFindAtomW(ptr) GlobalFindAtom32W
-440   stdcall GlobalFix(long) GlobalFix32
-441   stdcall GlobalFlags(long) GlobalFlags32
-442   stdcall GlobalFree(long) GlobalFree32
-443   stdcall GlobalGetAtomNameA(long ptr long) GlobalGetAtomName32A
-444   stdcall GlobalGetAtomNameW(long ptr long) GlobalGetAtomName32W
-445   stdcall GlobalHandle(ptr) GlobalHandle32
-446   stdcall GlobalLock(long) GlobalLock32
-447   stdcall GlobalMemoryStatus(ptr) GlobalMemoryStatus
-448   stdcall GlobalReAlloc(long long long) GlobalReAlloc32
-449   stdcall GlobalSize(long) GlobalSize32
-450   stdcall GlobalUnWire(long) GlobalUnWire32
-451   stdcall GlobalUnfix(long) GlobalUnfix32
-452   stdcall GlobalUnlock(long) GlobalUnlock32
-453   stdcall GlobalWire(long) GlobalWire32
-454   stub Heap32First
-455   stub Heap32ListFirst
-456   stub Heap32ListNext
-457   stub Heap32Next
-458   stdcall HeapAlloc(long long long) HeapAlloc
-459   stdcall HeapCompact(long long) HeapCompact
-460   stdcall HeapCreate(long long long)	HeapCreate
-461   stdcall HeapDestroy(long) HeapDestroy
-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
-469   stdcall HeapWalk(long ptr) HeapWalk
-470   stub InitAtomTable
-471   stdcall InitializeCriticalSection(ptr) InitializeCriticalSection
-472   stdcall InterlockedDecrement(ptr) InterlockedDecrement
-473   stdcall InterlockedExchange(ptr long) InterlockedExchange
-474   stdcall InterlockedIncrement(ptr) InterlockedIncrement
-475   stub InvalidateNLSCache
-476   stdcall IsBadCodePtr(ptr) IsBadCodePtr32
-477   stdcall IsBadHugeReadPtr(ptr long) IsBadHugeReadPtr32
-478   stdcall IsBadHugeWritePtr(ptr long) IsBadHugeWritePtr32
-479   stdcall IsBadReadPtr(ptr long) IsBadReadPtr32
-480   stdcall IsBadStringPtrA(ptr long) IsBadStringPtr32A
-481   stdcall IsBadStringPtrW(ptr long) IsBadStringPtr32W
-482   stdcall IsBadWritePtr(ptr long) IsBadWritePtr32
-483   stdcall IsDBCSLeadByte(long) IsDBCSLeadByte32
-484   stdcall IsDBCSLeadByteEx(long long) IsDBCSLeadByteEx
-485   stub IsLSCallback
-486   stub IsSLCallback
-487   stdcall IsValidCodePage(long) IsValidCodePage
-488   stdcall IsValidLocale(long long) IsValidLocale
-489   stub K32Thk1632Epilog
-490   stub K32Thk1632Prolog
-491   stub LCMapStringA
-492   stub LCMapStringW
-493   stdcall LeaveCriticalSection(ptr)	LeaveCriticalSection
-494   stdcall LoadLibraryA(ptr) LoadLibrary32A
-495   stdcall LoadLibraryExA(ptr long long) LoadLibraryEx32A
-496   stub LoadLibraryExW
-497   stdcall LoadLibraryW(ptr) LoadLibrary32W
-498   stub LoadModule
-499   stdcall LoadResource(long long) LoadResource32
-500   stdcall LocalAlloc(long long) LocalAlloc32
-501   stdcall LocalCompact(long) LocalCompact32
-502   stdcall LocalFileTimeToFileTime(ptr ptr) LocalFileTimeToFileTime
-503   stdcall LocalFlags(long) LocalFlags32
-504   stdcall LocalFree(long) LocalFree32
-505   stdcall LocalHandle(ptr) LocalHandle32
-506   stdcall LocalLock(long) LocalLock32
-507   stdcall LocalReAlloc(long long long) LocalReAlloc32
-508   stdcall LocalShrink(long long) LocalShrink32
-509   stdcall LocalSize(long) LocalSize32
-510   stdcall LocalUnlock(long) LocalUnlock32
-511   stdcall LockFile(long long long long long) LockFile
-512   stub LockFileEx
-513   stdcall LockResource(long) LockResource32
-514   stdcall MakeCriticalSectionGlobal(ptr) MakeCriticalSectionGlobal
-515   stub MapHInstLS
-516   stub MapHInstLS_PN
-517   stub MapHInstSL
-518   stub MapHInstSL_PN
-519   stub MapHModuleLS
-520   stub MapHModuleSL
-521   stdcall MapLS(ptr) MapLS
-522   stdcall MapSL(long) MapSL
-523   stub MapSLFix
-524   stdcall MapViewOfFile(long long long long long) MapViewOfFile
-525   stdcall MapViewOfFileEx(long long long long long ptr) MapViewOfFileEx
-526   stub Module32First
-527   stub Module32Next
-528   stdcall MoveFileA(ptr ptr) MoveFile32A
-529   stdcall MoveFileExA(ptr ptr long) MoveFileEx32A
-530   stdcall MoveFileExW(ptr ptr long) MoveFileEx32W
-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
-538   stdcall OpenFileMappingA(long long ptr) OpenFileMapping32A
-539   stdcall OpenFileMappingW(long long ptr) OpenFileMapping32W
-540   stdcall OpenMutexA(long long ptr) OpenMutex32A
-541   stdcall OpenMutexW(long long ptr) OpenMutex32W
-542   stub OpenProcess
-543   stub OpenProfileUserMapping
-544   stdcall OpenSemaphoreA(long long ptr) OpenSemaphore32A
-545   stdcall OpenSemaphoreW(long long ptr) OpenSemaphore32W
-546   stub OpenVxDHandle
-547   stdcall OutputDebugStringA(ptr) OutputDebugString32A
-548   stdcall OutputDebugStringW(ptr) OutputDebugString32W
-549   stub PeekConsoleInputA
-550   stub PeekConsoleInputW
-551   stub PeekNamedPipe
-552   stub PostQueuedCompletionStatus
-553   stub PrepareTape
-554   stub Process32First
-555   stub Process32Next
-556   stub PulseEvent
-557   stub PurgeComm
-558   register QT_Thunk() QT_Thunk
-559   stdcall QueryDosDeviceA(ptr ptr long) QueryDosDevice32A
-560   stdcall QueryDosDeviceW(ptr ptr long) QueryDosDevice32W
-561   stub QueryNumberOfEventLogRecords
-562   stub QueryOldestEventLogRecord
-563   stdcall QueryPerformanceCounter(ptr) QueryPerformanceCounter
-564   stub QueryPerformanceFrequency
-565   stub QueueUserAPC
-566   register RaiseException(long long long ptr) RaiseException
-567   stdcall ReadConsoleA(long ptr long ptr ptr) ReadConsole32A
-568   stub ReadConsoleInputA
-569   stub ReadConsoleInputW
-570   stub ReadConsoleOutputA
-571   stub ReadConsoleOutputAttribute
-572   stub ReadConsoleOutputCharacterA
-573   stub ReadConsoleOutputCharacterW
-574   stub ReadConsoleOutputW
-575   stdcall ReadConsoleW(long ptr long ptr ptr) ReadConsole32W
-576   stdcall ReadFile(long ptr long ptr ptr) ReadFile
-577   stub ReadFileEx
-578   stdcall ReadProcessMemory(long ptr ptr long ptr) ReadProcessMemory
-579   stub RegisterServiceProcess
-580   stdcall ReinitializeCriticalSection(ptr) ReinitializeCriticalSection
-581   stdcall ReleaseMutex(long) ReleaseMutex
-582   stdcall ReleaseSemaphore(long long ptr) ReleaseSemaphore
-583   stdcall RemoveDirectoryA(ptr) RemoveDirectory32A
-584   stdcall RemoveDirectoryW(ptr) RemoveDirectory32W
-585   stdcall ResetEvent(long) ResetEvent
-586   stub ResumeThread
-587   stdcall RtlFillMemory(ptr long long) RtlFillMemory
-588   stdcall RtlMoveMemory(ptr ptr long) RtlMoveMemory
-589   register RtlUnwind(ptr long ptr long) RtlUnwind
-590   stdcall RtlZeroMemory(ptr long) RtlZeroMemory
-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
-604   stub SUnMapLS_IP_EBP_20
-605   stub SUnMapLS_IP_EBP_24
-606   stub SUnMapLS_IP_EBP_28
-607   stub SUnMapLS_IP_EBP_32
-608   stub SUnMapLS_IP_EBP_36
-609   stub SUnMapLS_IP_EBP_40
-610   stub SUnMapLS_IP_EBP_8
-611   stub ScrollConsoleScreenBufferA
-612   stub ScrollConsoleScreenBufferW
-613   stdcall SearchPathA(ptr ptr ptr long ptr ptr) SearchPath32A
-614   stdcall SearchPathW(ptr ptr ptr long ptr ptr) SearchPath32W
-615   stdcall SetCommBreak(long) SetCommBreak32
-616   stub SetCommConfig
-617   stdcall SetCommMask(long ptr) SetCommMask
-618   stdcall SetCommState(long ptr) SetCommState32
-619   stdcall SetCommTimeouts(long ptr) SetCommTimeouts
-620   stub SetComputerNameA
-621   stub SetComputerNameW
-622   stub SetConsoleActiveScreenBuffer
-623   stub SetConsoleCP
-624   stdcall SetConsoleCtrlHandler(ptr long) SetConsoleCtrlHandler
-625   stub SetConsoleCursorInfo
-626   stdcall SetConsoleCursorPosition(long long) SetConsoleCursorPosition
-627   stdcall SetConsoleMode(long long) SetConsoleMode
-628   stub SetConsoleOutputCP
-629   stub SetConsoleScreenBufferSize
-630   stub SetConsoleTextAttribute
-631   stdcall SetConsoleTitleA(ptr) SetConsoleTitle32A
-632   stdcall SetConsoleTitleW(ptr) SetConsoleTitle32W
-633   stub SetConsoleWindowInfo
-634   stdcall SetCurrentDirectoryA(ptr) SetCurrentDirectory32A
-635   stdcall SetCurrentDirectoryW(ptr) SetCurrentDirectory32W
-636   stub SetDaylightFlag
-637   stub SetDefaultCommConfigA
-638   stub SetDefaultCommConfigW
-639   stdcall SetEndOfFile(long) SetEndOfFile
-640   stdcall SetEnvironmentVariableA(ptr ptr) SetEnvironmentVariable32A
-641   stdcall SetEnvironmentVariableW(ptr ptr) SetEnvironmentVariable32W
-642   stdcall SetErrorMode(long) SetErrorMode32
-643   stdcall	SetEvent(long) SetEvent
-644   stdcall SetFileApisToANSI() SetFileApisToANSI
-645   stdcall SetFileApisToOEM() SetFileApisToOEM
-646   stdcall SetFileAttributesA(ptr long) SetFileAttributes32A
-647   stdcall SetFileAttributesW(ptr long) SetFileAttributes32W
-648   stdcall SetFilePointer(long long ptr long) SetFilePointer
-649   stdcall SetFileTime(long ptr ptr ptr) SetFileTime
-650   stub SetHandleContext
-651   stdcall SetHandleCount(long) SetHandleCount32
-652   stub SetHandleInformation
-653   stdcall SetLastError(long) SetLastError
-654   stub SetLocalTime
-655   stdcall SetLocaleInfoA(long long ptr) SetLocaleInfoA
-656   stub SetLocaleInfoW
-657   stub SetMailslotInfo
-658   stub SetNamedPipeHandleState
-659   stdcall SetPriorityClass(long long) SetPriorityClass
-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
-665   stub SetSystemTimeAdjustment
-666   stub SetTapeParameters
-667   stub SetTapePosition
-668   stdcall SetThreadAffinityMask(long long)	SetThreadAffinityMask
-669   stub SetThreadContext
-670   stub SetThreadLocale
-671   stdcall SetThreadPriority(long long) SetThreadPriority
-672   stdcall SetTimeZoneInformation(ptr) SetTimeZoneInformation
-673   stdcall SetUnhandledExceptionFilter(ptr) THUNK_SetUnhandledExceptionFilter
-674   stub SetVolumeLabelA
-675   stub SetVolumeLabelW
-676   stub SetupComm
-677   stdcall SizeofResource(long long) SizeofResource32
-678   stdcall Sleep(long) Sleep
-679   stub SleepEx
-680   stub SuspendThread
-681   stdcall SystemTimeToFileTime(ptr ptr) SystemTimeToFileTime
-682   stub SystemTimeToTzSpecificLocalTime
-683   stub TerminateProcess
-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
-693   stdcall TlsSetValue(long ptr) TlsSetValue
-694   stub Toolhelp32ReadProcessMemory
-695   stub TransactNamedPipe
-696   stdcall TransmitCommChar(long long) TransmitCommChar32
-697   stub UTRegister
-698   stub UTUnRegister
-699   stdcall UnMapLS(long) UnMapLS
-700   stub UnMapSLFixArray
-701   stdcall UnhandledExceptionFilter(ptr) UnhandledExceptionFilter
-702   stub UninitializeCriticalSection
-703   stdcall UnlockFile(long long long long long) UnlockFile
-704   stub UnlockFileEx
-705   stdcall UnmapViewOfFile(ptr) UnmapViewOfFile
-706   stub UpdateResourceA
-707   stub UpdateResourceW
-708   stub VerLanguageNameA
-709   stub VerLanguageNameW
-710   stdcall VirtualAlloc(ptr long long long) VirtualAlloc
-711   stdcall VirtualFree(ptr long long) VirtualFree
-712   stdcall VirtualLock(ptr long) VirtualLock
-713   stdcall VirtualProtect(ptr long long ptr) VirtualProtect
-714   stdcall VirtualProtectEx(long ptr long long ptr) VirtualProtectEx
-715   stdcall VirtualQuery(ptr ptr long) VirtualQuery
-716   stdcall VirtualQueryEx(long ptr ptr long) VirtualQueryEx
-717   stdcall VirtualUnlock(ptr long) VirtualUnlock
-718   stub WaitCommEvent
-719   stub WaitForDebugEvent
-720   stub WaitForMultipleObjects
-721   stub WaitForMultipleObjectsEx
-722   stdcall WaitForSingleObject(long long) WaitForSingleObject
-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
-727   stdcall WinExec(ptr long) WinExec32
-728   stdcall WriteConsoleA(long ptr long ptr ptr) WriteConsole32A
-729   stub WriteConsoleInputA
-730   stub WriteConsoleInputW
-731   stub WriteConsoleOutputA
-732   stub WriteConsoleOutputAttribute
-733   stub WriteConsoleOutputCharacterA
-734   stub WriteConsoleOutputCharacterW
-735   stub WriteConsoleOutputW
-736   stdcall WriteConsoleW(long ptr long ptr ptr) WriteConsole32W
-737   stdcall WriteFile(long ptr long ptr ptr) WriteFile
-738   stub WriteFileEx
-739   stub WritePrivateProfileSectionA
-740   stub WritePrivateProfileSectionW
-741   stdcall WritePrivateProfileStringA(ptr ptr ptr ptr) WritePrivateProfileString32A
-742   stdcall WritePrivateProfileStringW(ptr ptr ptr ptr) WritePrivateProfileString32W
-743   stub WritePrivateProfileStructA
-744   stub WritePrivateProfileStructW
-745   stub WriteProcessMemory
-746   stub WriteProfileSectionA
-747   stub WriteProfileSectionW
-748   stdcall WriteProfileStringA(ptr ptr ptr) WriteProfileString32A
-749   stdcall WriteProfileStringW(ptr ptr ptr) WriteProfileString32W
-750   stub WriteTapemark
-751   stub _DebugOut
-752   stub _DebugPrintf
-753   stdcall _hread(long ptr long) _hread32
-754   stdcall _hwrite(long ptr long) _hwrite32
-755   stdcall _lclose(long) _lclose32
-756   stdcall _lcreat(ptr long) _lcreat32
-757   stdcall _llseek(long long long) _llseek32
-758   stdcall _lopen(ptr long) _lopen32
-759   stdcall _lread(long ptr long) _lread32
-760   stdcall _lwrite(long ptr long) _lwrite32
-761   stub dprintf
-762   stdcall lstrcat(ptr ptr) lstrcat32A
-763   stdcall lstrcatA(ptr ptr) lstrcat32A
-764   stdcall lstrcatW(ptr ptr) lstrcat32W
-765   stdcall lstrcmp(ptr ptr) lstrcmp32A
-766   stdcall lstrcmpA(ptr ptr) lstrcmp32A
-767   stdcall lstrcmpW(ptr ptr) lstrcmp32W
-768   stdcall lstrcmpi(ptr ptr) lstrcmpi32A
-769   stdcall lstrcmpiA(ptr ptr) lstrcmpi32A
-770   stdcall lstrcmpiW(ptr ptr) lstrcmpi32W
-771   stdcall lstrcpy(ptr ptr) lstrcpy32A
-772   stdcall lstrcpyA(ptr ptr) lstrcpy32A
-773   stdcall lstrcpyW(ptr ptr) lstrcpy32W
-774   stdcall lstrcpyn(ptr ptr long) lstrcpyn32A
-775   stdcall lstrcpynA(ptr ptr long) lstrcpyn32A
-776   stdcall lstrcpynW(ptr ptr long) lstrcpyn32W
-777   stdcall lstrlen(ptr) lstrlen32A
-778   stdcall lstrlenA(ptr) lstrlen32A
-779   stdcall lstrlenW(ptr) lstrlen32W
+102 stdcall AddAtomW(ptr) AddAtom32W
+103 stub AllocConsole
+104 stub AllocLSCallback
+105 stub AllocSLCallback
+106 stdcall AreFileApisANSI() AreFileApisANSI
+107 stub BackupRead
+108 stub BackupSeek
+109 stub BackupWrite
+110 stdcall Beep(long long) Beep
+111 stub BeginUpdateResourceA
+112 stub BeginUpdateResourceW
+113 stdcall BuildCommDCBA(ptr ptr) BuildCommDCB32A
+114 stdcall BuildCommDCBAndTimeoutsA(ptr ptr ptr) BuildCommDCBAndTimeouts32A
+115 stdcall BuildCommDCBAndTimeoutsW(ptr ptr ptr) BuildCommDCBAndTimeouts32W
+116 stdcall BuildCommDCBW(ptr ptr) BuildCommDCB32W
+117 stub CallNamedPipeA
+118 stub CallNamedPipeW
+119 stub Callback12
+120 stub Callback16
+121 stub Callback20
+122 stub Callback24
+123 stub Callback28
+124 stub Callback32
+125 stub Callback36
+126 stub Callback40
+127 stub Callback44
+128 stub Callback48
+129 stub Callback4
+130 stub Callback52
+131 stub Callback56
+132 stub Callback60
+133 stub Callback64
+134 stub Callback8
+135 stdcall ClearCommBreak(long) ClearCommBreak32
+136 stdcall ClearCommError(long ptr ptr) ClearCommError
+137 stdcall CloseHandle(long) CloseHandle
+138 stub CloseProfileUserMapping
+139 stub CloseSystemHandle
+140 stub CommConfigDialogA
+141 stub CommConfigDialogW
+142 stdcall CompareFileTime(ptr ptr) CompareFileTime
+143 stdcall CompareStringA(long long ptr long ptr long) CompareString32A
+144 stdcall CompareStringW(long long ptr long ptr long) CompareString32W
+145 stub ConnectNamedPipe
+146 stdcall ContinueDebugEvent(long long long) ContinueDebugEvent
+147 stub ConvertDefaultLocale
+148 stdcall ConvertToGlobalHandle(long) ConvertToGlobalHandle
+149 stdcall CopyFileA(ptr ptr long) CopyFile32A
+150 stdcall CopyFileW(ptr ptr long) CopyFile32W
+151 stub CreateConsoleScreenBuffer
+152 stdcall CreateDirectoryA(ptr ptr) CreateDirectory32A
+153 stdcall CreateDirectoryExA(ptr ptr ptr) CreateDirectoryEx32A
+154 stdcall CreateDirectoryExW(ptr ptr ptr) CreateDirectoryEx32W
+155 stdcall CreateDirectoryW(ptr ptr) CreateDirectory32W
+156 stdcall CreateEventA(ptr long long ptr) CreateEvent32A
+157 stdcall CreateEventW(ptr long long ptr) CreateEvent32W
+158 stdcall CreateFileA(ptr long long ptr long long long) CreateFile32A
+159 stdcall CreateFileMappingA(long ptr long long long ptr) CreateFileMapping32A
+160 stdcall CreateFileMappingW(long ptr long long long ptr) CreateFileMapping32W
+161 stdcall CreateFileW(ptr long long ptr long long long) CreateFile32W
+162 stub CreateIoCompletionPort
+163 stub CreateKernelThread
+164 stub CreateMailslotA
+165 stub CreateMailslotW
+166 stdcall CreateMutexA(ptr long ptr) CreateMutex32A
+167 stdcall CreateMutexW(ptr long ptr) CreateMutex32W
+168 stub CreateNamedPipeA
+169 stub CreateNamedPipeW
+170 stub CreatePipe
+171 stdcall CreateProcessA(ptr ptr ptr ptr long long ptr ptr ptr ptr) CreateProcess32A
+172 stub CreateProcessW
+173 stub CreateRemoteThread
+174 stdcall CreateSemaphoreA(ptr long long ptr) CreateSemaphore32A
+175 stdcall CreateSemaphoreW(ptr long long ptr) CreateSemaphore32W
+176 stub CreateSocketHandle
+177 stub CreateTapePartition
+178 stdcall CreateThread(ptr long ptr long long ptr) CreateThread
+179 stub CreateToolhelp32Snapshot
+180 stub DebugActiveProcess
+181 register DebugBreak() DebugBreak32
+182 stub DefineDosDeviceA
+183 stub DefineDosDeviceW
+184 stdcall DeleteAtom(long) DeleteAtom32
+185 stdcall DeleteCriticalSection(ptr)	DeleteCriticalSection
+186 stdcall DeleteFileA(ptr) DeleteFile32A
+187 stdcall DeleteFileW(ptr) DeleteFile32W
+188 stub DeviceIoControl
+189 stdcall DisableThreadLibraryCalls(long) DisableThreadLibraryCalls
+190 stub DisconnectNamedPipe
+191 stdcall DosDateTimeToFileTime(long long ptr) DosDateTimeToFileTime
+192 stdcall DuplicateHandle(long long long ptr long long long) DuplicateHandle
+193 stub EndUpdateResourceA
+194 stub EndUpdateResourceW
+195 stdcall EnterCriticalSection(ptr)	EnterCriticalSection
+196 stub EnumCalendarInfoA
+197 stub EnumCalendarInfoW
+198 stub EnumDateFormatsA
+199 stub EnumDateFormatsW
+200 stdcall EnumResourceLanguagesA(long ptr ptr ptr long) EnumResourceLanguages32A
+201 stdcall EnumResourceLanguagesW(long ptr ptr ptr long) EnumResourceLanguages32W
+202 stdcall EnumResourceNamesA(long ptr ptr long) EnumResourceNames32A
+203 stdcall EnumResourceNamesW(long ptr ptr long) EnumResourceNames32W
+204 stdcall EnumResourceTypesA(long ptr long) EnumResourceTypes32A
+205 stdcall EnumResourceTypesW(long ptr long) EnumResourceTypes32W
+206 stdcall EnumSystemCodePagesA(ptr long) EnumSystemCodePages32A
+207 stdcall EnumSystemCodePagesW(ptr long) EnumSystemCodePages32W
+208 stdcall EnumSystemLocalesA(ptr long) EnumSystemLocales32A
+209 stdcall EnumSystemLocalesW(ptr long) EnumSystemLocales32W
+210 stub EnumTimeFormatsA
+211 stub EnumTimeFormatsW
+212 stub EraseTape
+213 stdcall EscapeCommFunction(long long) EscapeCommFunction32
+214 stdcall ExitProcess(long) ExitProcess
+215 stub ExitThread
+216 stdcall ExpandEnvironmentStringsA(ptr ptr long) ExpandEnvironmentStrings32A
+217 stdcall ExpandEnvironmentStringsW(ptr ptr long) ExpandEnvironmentStrings32W
+218 stub FT_Exit0
+219 stub FT_Exit12
+220 stub FT_Exit16
+221 stub FT_Exit20
+222 stub FT_Exit24
+223 stub FT_Exit28
+224 stub FT_Exit32
+225 stub FT_Exit36
+227 stub FT_Exit40
+228 stub FT_Exit44
+229 stub FT_Exit48
+226 stub FT_Exit4
+230 stub FT_Exit52
+231 stub FT_Exit56
+232 stub FT_Exit8
+233 stub FT_Prolog
+234 stub FT_Thunk
+235 stdcall FatalAppExitA(long ptr) FatalAppExit32A
+236 stdcall FatalAppExitW(long ptr) FatalAppExit32W
+237 stub FatalExit
+238 stdcall FileTimeToDosDateTime(ptr ptr ptr) FileTimeToDosDateTime
+239 stdcall FileTimeToLocalFileTime(ptr ptr) FileTimeToLocalFileTime
+240 stdcall FileTimeToSystemTime(ptr ptr) FileTimeToSystemTime
+241 stub FillConsoleOutputAttribute
+242 stub FillConsoleOutputCharacterA
+243 stub FillConsoleOutputCharacterW
+244 stdcall FindAtomA(ptr) FindAtom32A
+245 stdcall FindAtomW(ptr) FindAtom32W
+247 stub FindCloseChangeNotification
+246 stdcall FindClose(long) FindClose32
+248 stub FindFirstChangeNotificationA
+249 stub FindFirstChangeNotificationW
+250 stdcall FindFirstFileA(ptr ptr) FindFirstFile32A
+251 stdcall FindFirstFileW(ptr ptr) FindFirstFile32W
+252 stub FindNextChangeNotification
+253 stdcall FindNextFileA(long ptr) FindNextFile32A
+254 stdcall FindNextFileW(long ptr) FindNextFile32W
+255 stdcall FindResourceA(long ptr ptr) FindResource32A
+256 stdcall FindResourceExA(long ptr ptr long) FindResourceEx32A
+257 stdcall FindResourceExW(long ptr ptr long) FindResourceEx32W
+258 stdcall FindResourceW(long ptr ptr) FindResource32W
+259 stdcall FlushConsoleInputBuffer(long) FlushConsoleInputBuffer
+260 stdcall FlushFileBuffers(long) FlushFileBuffers
+261 stub FlushInstructionCache
+262 stub FlushViewOfFile
+263 stub FoldStringA
+264 stub FoldStringW
+265 stdcall FormatMessageA(long ptr long long ptr long ptr) FormatMessage32A
+266 stdcall FormatMessageW(long ptr long long ptr long ptr) FormatMessage32W
+267 stub FreeConsole
+268 stdcall FreeEnvironmentStringsA(ptr) FreeEnvironmentStrings32A
+269 stdcall FreeEnvironmentStringsW(ptr) FreeEnvironmentStrings32W
+270 stub FreeLSCallback
+272 stub FreeLibraryAndExitThread
+271 stdcall FreeLibrary(long) FreeLibrary32
+273 stdcall FreeResource(long) FreeResource32
+274 stub FreeSLCallback
+275 stub GenerateConsoleCtrlEvent
+276 stdcall GetACP() GetACP
+277 stdcall GetAtomNameA(long ptr long) GetAtomName32A
+278 stdcall GetAtomNameW(long ptr long) GetAtomName32W
+279 stub GetBinaryType
+280 stub GetBinaryTypeA
+281 stub GetBinaryTypeW
+282 stdcall GetCPInfo(long ptr) GetCPInfo
+283 stub GetCommConfig
+284 stdcall GetCommMask(long ptr) GetCommMask
+285 stub GetCommModemStatus
+286 stub GetCommProperties
+287 stdcall GetCommState(long ptr) GetCommState32
+288 stdcall GetCommTimeouts(long ptr) GetCommTimeouts
+289 stdcall GetCommandLineA() GetCommandLine32A
+290 stdcall GetCommandLineW() GetCommandLine32W
+291 stub GetCompressedFileSizeA
+292 stub GetCompressedFileSizeW
+293 stdcall GetComputerNameA(ptr ptr) GetComputerName32A
+294 stdcall GetComputerNameW(ptr ptr) GetComputerName32W
+295 stdcall GetConsoleCP() GetConsoleCP
+296 stub GetConsoleCursorInfo
+297 stdcall GetConsoleMode(long ptr) GetConsoleMode
+298 stdcall GetConsoleOutputCP() GetConsoleOutputCP
+299 stdcall GetConsoleScreenBufferInfo(long ptr) GetConsoleScreenBufferInfo
+300 stdcall GetConsoleTitleA(ptr long) GetConsoleTitle32A
+301 stdcall GetConsoleTitleW(ptr long) GetConsoleTitle32W
+302 stub GetCurrencyFormatA
+303 stub GetCurrencyFormatW
+304 stdcall GetCurrentDirectoryA(long ptr) GetCurrentDirectory32A
+305 stdcall GetCurrentDirectoryW(long ptr) GetCurrentDirectory32W
+306 stdcall GetCurrentProcess() GetCurrentProcess
+307 stdcall GetCurrentProcessId() GetCurrentProcessId
+308 stdcall GetCurrentThread() GetCurrentThread
+309 stdcall GetCurrentThreadId() GetCurrentThreadId
+310 stub GetDateFormatA
+311 stub GetDateFormatW
+312 stub GetDaylightFlag
+313 stub GetDefaultCommConfigA
+314 stub GetDefaultCommConfigW
+315 stdcall GetDiskFreeSpaceA(ptr ptr ptr ptr ptr) GetDiskFreeSpace32A
+316 stdcall GetDiskFreeSpaceW(ptr ptr ptr ptr ptr) GetDiskFreeSpace32W
+317 stdcall GetDriveTypeA(ptr) GetDriveType32A
+318 stdcall GetDriveTypeW(ptr) GetDriveType32W
+320 stdcall GetEnvironmentStringsA() GetEnvironmentStrings32A
+321 stdcall GetEnvironmentStringsW() GetEnvironmentStrings32W
+319 stdcall GetEnvironmentStrings() GetEnvironmentStrings32A
+322 stdcall GetEnvironmentVariableA(ptr ptr long) GetEnvironmentVariable32A
+323 stdcall GetEnvironmentVariableW(ptr ptr long) GetEnvironmentVariable32W
+324 stub GetErrorMode
+325 stub GetExitCodeProcess
+326 stdcall GetExitCodeThread(long ptr) GetExitCodeThread
+327 stdcall GetFileAttributesA(ptr) GetFileAttributes32A
+328 stdcall GetFileAttributesW(ptr) GetFileAttributes32W
+329 stdcall GetFileInformationByHandle(long ptr) GetFileInformationByHandle
+330 stdcall GetFileSize(long ptr) GetFileSize
+331 stdcall GetFileTime(long ptr ptr ptr) GetFileTime
+332 stdcall GetFileType(long) GetFileType
+333 stdcall GetFullPathNameA(ptr long ptr ptr) GetFullPathName32A
+334 stdcall GetFullPathNameW(ptr long ptr ptr) GetFullPathName32W
+335 stub GetHandleContext
+336 stub GetHandleInformation
+337 stub GetLSCallbackTarget
+338 stub GetLSCallbackTemplate
+339 stdcall GetLargestConsoleWindowSize(long) GetLargestConsoleWindowSize
+340 stdcall GetLastError() GetLastError
+341 stdcall GetLocalTime(ptr) GetLocalTime
+342 stdcall GetLocaleInfoA(long long ptr long) GetLocaleInfo32A
+343 stdcall GetLocaleInfoW(long long ptr long) GetLocaleInfo32W
+344 stdcall GetLogicalDriveStringsA(long ptr) GetLogicalDriveStrings32A
+345 stdcall GetLogicalDriveStringsW(long ptr) GetLogicalDriveStrings32W
+346 stdcall GetLogicalDrives() GetLogicalDrives
+347 stub GetMailslotInfo
+348 stdcall GetModuleFileNameA(long ptr long) GetModuleFileName32A
+349 stdcall GetModuleFileNameW(long ptr long) GetModuleFileName32W
+350 stdcall GetModuleHandleA(ptr) GetModuleHandle32A
+351 stdcall GetModuleHandleW(ptr) GetModuleHandle32W
+352 stub GetNamedPipeHandleStateA
+353 stub GetNamedPipeHandleStateW
+354 stub GetNamedPipeInfo
+355 stub GetNumberFormatA
+356 stub GetNumberFormatW
+357 stdcall GetNumberOfConsoleInputEvents(long ptr) GetNumberOfConsoleInputEvents
+358 stub GetNumberOfConsoleMouseButtons
+359 stdcall GetOEMCP() GetOEMCP
+360 stub GetOverlappedResult
+361 stdcall GetPriorityClass(long) GetPriorityClass
+362 stdcall GetPrivateProfileIntA(ptr ptr long ptr) GetPrivateProfileInt32A
+363 stdcall GetPrivateProfileIntW(ptr ptr long ptr) GetPrivateProfileInt32W
+364 stdcall GetPrivateProfileSectionA(ptr ptr long ptr) GetPrivateProfileSection32A
+365 stub GetPrivateProfileSectionNamesA
+366 stub GetPrivateProfileSectionNamesW
+367 stub GetPrivateProfileSectionW
+368 stdcall GetPrivateProfileStringA(ptr ptr ptr ptr long ptr) GetPrivateProfileString32A
+369 stdcall GetPrivateProfileStringW(ptr ptr ptr ptr long ptr) GetPrivateProfileString32W
+370 stub GetPrivateProfileStructA
+371 stub GetPrivateProfileStructW
+372 stdcall GetProcAddress(long ptr) GetProcAddress32
+373 stdcall GetProcessAffinityMask(long ptr ptr)	GetProcessAffinityMask
+374 stub GetProcessFlags
+375 stdcall GetProcessHeap() GetProcessHeap
+376 stub GetProcessHeaps
+377 stub GetProcessShutdownParameters
+378 stdcall GetProcessTimes(long ptr ptr ptr ptr) GetProcessTimes
+379 stdcall GetProcessVersion(long) GetProcessVersion
+380 stdcall GetProcessWorkingSetSize(long ptr ptr) GetProcessWorkingSetSize
+381 stub GetProductName
+382 stdcall GetProfileIntA(ptr ptr long) GetProfileInt32A
+383 stdcall GetProfileIntW(ptr ptr long) GetProfileInt32W
+384 stdcall GetProfileSectionA(ptr ptr long) GetProfileSection32A
+385 stub GetProfileSectionW
+386 stdcall GetProfileStringA(ptr ptr ptr ptr long) GetProfileString32A
+387 stdcall GetProfileStringW(ptr ptr ptr ptr long) GetProfileString32W
+388 stub GetQueuedCompletionStatus
+389 stub GetSLCallbackTarget
+390 stub GetSLCallbackTemplate
+391 stdcall GetShortPathNameA(ptr ptr long) GetShortPathName32A
+392 stdcall GetShortPathNameW(ptr ptr long) GetShortPathName32W
+393 stdcall GetStartupInfoA(ptr) GetStartupInfo32A
+394 stdcall GetStartupInfoW(ptr) GetStartupInfo32W
+395 stdcall GetStdHandle(long)	GetStdHandle
+396 stdcall GetStringTypeA(long long ptr long ptr) GetStringType32A
+397 stdcall GetStringTypeExA(long long ptr long ptr) GetStringTypeEx32A
+398 stdcall GetStringTypeExW(long long ptr long ptr) GetStringTypeEx32W
+399 stdcall GetStringTypeW(long ptr long ptr) GetStringType32W
+400 stdcall GetSystemDefaultLCID() GetSystemDefaultLCID
+401 stdcall GetSystemDefaultLangID() GetSystemDefaultLangID
+402 stdcall GetSystemDirectoryA(ptr long) GetSystemDirectory32A
+403 stdcall GetSystemDirectoryW(ptr long) GetSystemDirectory32W
+404 stdcall GetSystemInfo(ptr) GetSystemInfo
+405 stdcall GetSystemPowerStatus(ptr) GetSystemPowerStatus
+406 stdcall GetSystemTime(ptr) GetSystemTime
+407 stub GetSystemTimeAdjustment
+408 stub GetSystemTimeAsFileTime
+409 stub GetTapeParameters
+410 stub GetTapePosition
+411 stub GetTapeStatus
+412 stdcall GetTempFileNameA(ptr ptr long ptr) GetTempFileName32A
+413 stdcall GetTempFileNameW(ptr ptr long ptr) GetTempFileName32W
+414 stdcall GetTempPathA(long ptr) GetTempPath32A
+415 stdcall GetTempPathW(long ptr) GetTempPath32W
+416 stdcall GetThreadContext(long ptr) GetThreadContext
+417 stdcall GetThreadLocale() GetThreadLocale
+418 stdcall GetThreadPriority(long) GetThreadPriority
+419 stdcall GetThreadSelectorEntry(long long ptr) GetThreadSelectorEntry
+420 stub GetThreadTimes
+421 stdcall GetTickCount() GetTickCount
+422 stub GetTimeFormatA
+423 stub GetTimeFormatW
+424 stdcall GetTimeZoneInformation(ptr) GetTimeZoneInformation
+425 stdcall GetUserDefaultLCID() GetUserDefaultLCID
+426 stdcall GetUserDefaultLangID() GetUserDefaultLangID
+427 stdcall GetVersion() GetVersion32
+428 stdcall GetVersionExA(ptr) GetVersionEx32A
+429 stdcall GetVersionExW(ptr) GetVersionEx32W
+430 stdcall GetVolumeInformationA(ptr ptr long ptr ptr ptr ptr long) GetVolumeInformation32A
+431 stdcall GetVolumeInformationW(ptr ptr long ptr ptr ptr ptr long) GetVolumeInformation32W
+432 stdcall GetWindowsDirectoryA(ptr long) GetWindowsDirectory32A
+433 stdcall GetWindowsDirectoryW(ptr long) GetWindowsDirectory32W
+434 stdcall GlobalAddAtomA(ptr) GlobalAddAtom32A
+435 stdcall GlobalAddAtomW(ptr) GlobalAddAtom32W
+436 stdcall GlobalAlloc(long long) GlobalAlloc32
+437 stdcall GlobalCompact(long) GlobalCompact32
+438 stdcall GlobalDeleteAtom(long) GlobalDeleteAtom
+439 stdcall GlobalFindAtomA(ptr) GlobalFindAtom32A
+440 stdcall GlobalFindAtomW(ptr) GlobalFindAtom32W
+441 stdcall GlobalFix(long) GlobalFix32
+442 stdcall GlobalFlags(long) GlobalFlags32
+443 stdcall GlobalFree(long) GlobalFree32
+444 stdcall GlobalGetAtomNameA(long ptr long) GlobalGetAtomName32A
+445 stdcall GlobalGetAtomNameW(long ptr long) GlobalGetAtomName32W
+446 stdcall GlobalHandle(ptr) GlobalHandle32
+447 stdcall GlobalLock(long) GlobalLock32
+448 stdcall GlobalMemoryStatus(ptr) GlobalMemoryStatus
+449 stdcall GlobalReAlloc(long long long) GlobalReAlloc32
+450 stdcall GlobalSize(long) GlobalSize32
+451 stdcall GlobalUnWire(long) GlobalUnWire32
+452 stdcall GlobalUnfix(long) GlobalUnfix32
+453 stdcall GlobalUnlock(long) GlobalUnlock32
+454 stdcall GlobalWire(long) GlobalWire32
+455 stub Heap32First
+456 stub Heap32ListFirst
+457 stub Heap32ListNext
+458 stub Heap32Next
+459 stdcall HeapAlloc(long long long) HeapAlloc
+460 stdcall HeapCompact(long long) HeapCompact
+461 stdcall HeapCreate(long long long)	HeapCreate
+462 stdcall HeapDestroy(long) HeapDestroy
+463 stdcall HeapFree(long long ptr) HeapFree
+464 stdcall HeapLock(long) HeapLock
+465 stdcall HeapReAlloc(long long ptr long) HeapReAlloc
+466 stub HeapSetFlags
+467 stdcall HeapSize(long long ptr) HeapSize
+468 stdcall HeapUnlock(long) HeapUnlock
+469 stdcall HeapValidate(long long ptr) HeapValidate
+470 stdcall HeapWalk(long ptr) HeapWalk
+471 stub InitAtomTable
+472 stdcall InitializeCriticalSection(ptr) InitializeCriticalSection
+473 stdcall InterlockedDecrement(ptr) InterlockedDecrement
+474 stdcall InterlockedExchange(ptr long) InterlockedExchange
+475 stdcall InterlockedIncrement(ptr) InterlockedIncrement
+476 stub InvalidateNLSCache
+477 stdcall IsBadCodePtr(ptr) IsBadCodePtr32
+478 stdcall IsBadHugeReadPtr(ptr long) IsBadHugeReadPtr32
+479 stdcall IsBadHugeWritePtr(ptr long) IsBadHugeWritePtr32
+480 stdcall IsBadReadPtr(ptr long) IsBadReadPtr32
+481 stdcall IsBadStringPtrA(ptr long) IsBadStringPtr32A
+482 stdcall IsBadStringPtrW(ptr long) IsBadStringPtr32W
+483 stdcall IsBadWritePtr(ptr long) IsBadWritePtr32
+484 stdcall IsDBCSLeadByte(long) IsDBCSLeadByte32
+485 stdcall IsDBCSLeadByteEx(long long) IsDBCSLeadByteEx
+486 stub IsLSCallback
+487 stub IsSLCallback
+488 stdcall IsValidCodePage(long) IsValidCodePage
+489 stdcall IsValidLocale(long long) IsValidLocale
+490 stub K32Thk1632Epilog
+491 stub K32Thk1632Prolog
+492 stdcall LCMapStringA(long long ptr long ptr long) LCMapString32A
+493 stdcall LCMapStringW(long long ptr long ptr long) LCMapString32W
+494 stdcall LeaveCriticalSection(ptr)	LeaveCriticalSection
+495 stdcall LoadLibraryA(ptr) LoadLibrary32A
+496 stdcall LoadLibraryExA(ptr long long) LoadLibraryEx32A
+497 stub LoadLibraryExW
+498 stdcall LoadLibraryW(ptr) LoadLibrary32W
+499 stub LoadModule
+500 stdcall LoadResource(long long) LoadResource32
+501 stdcall LocalAlloc(long long) LocalAlloc32
+502 stdcall LocalCompact(long) LocalCompact32
+503 stdcall LocalFileTimeToFileTime(ptr ptr) LocalFileTimeToFileTime
+504 stdcall LocalFlags(long) LocalFlags32
+505 stdcall LocalFree(long) LocalFree32
+506 stdcall LocalHandle(ptr) LocalHandle32
+507 stdcall LocalLock(long) LocalLock32
+508 stdcall LocalReAlloc(long long long) LocalReAlloc32
+509 stdcall LocalShrink(long long) LocalShrink32
+510 stdcall LocalSize(long) LocalSize32
+511 stdcall LocalUnlock(long) LocalUnlock32
+512 stdcall LockFile(long long long long long) LockFile
+513 stub LockFileEx
+514 stdcall LockResource(long) LockResource32
+515 stdcall MakeCriticalSectionGlobal(ptr) MakeCriticalSectionGlobal
+516 stub MapHInstLS
+517 stub MapHInstLS_PN
+518 stub MapHInstSL
+519 stub MapHInstSL_PN
+520 stub MapHModuleLS
+521 stub MapHModuleSL
+522 stdcall MapLS(ptr) MapLS
+523 stdcall MapSL(long) MapSL
+524 stub MapSLFix
+525 stdcall MapViewOfFile(long long long long long) MapViewOfFile
+526 stdcall MapViewOfFileEx(long long long long long ptr) MapViewOfFileEx
+527 stub Module32First
+528 stub Module32Next
+529 stdcall MoveFileA(ptr ptr) MoveFile32A
+530 stdcall MoveFileExA(ptr ptr long) MoveFileEx32A
+531 stdcall MoveFileExW(ptr ptr long) MoveFileEx32W
+532 stdcall MoveFileW(ptr ptr) MoveFile32W
+533 stdcall MulDiv(long long long) MulDiv32
+534 stdcall MultiByteToWideChar(long long ptr long ptr long) MultiByteToWideChar
+535 stub NotifyNLSUserCache
+536 stdcall OpenEventA(long long ptr) OpenEvent32A
+537 stdcall OpenEventW(long long ptr) OpenEvent32W
+538 stdcall OpenFile(ptr ptr long) OpenFile32
+539 stdcall OpenFileMappingA(long long ptr) OpenFileMapping32A
+540 stdcall OpenFileMappingW(long long ptr) OpenFileMapping32W
+541 stdcall OpenMutexA(long long ptr) OpenMutex32A
+542 stdcall OpenMutexW(long long ptr) OpenMutex32W
+543 stub OpenProcess
+544 stub OpenProfileUserMapping
+545 stdcall OpenSemaphoreA(long long ptr) OpenSemaphore32A
+546 stdcall OpenSemaphoreW(long long ptr) OpenSemaphore32W
+547 stub OpenVxDHandle
+548 stdcall OutputDebugStringA(ptr) OutputDebugString32A
+549 stdcall OutputDebugStringW(ptr) OutputDebugString32W
+550 stub PeekConsoleInputA
+551 stub PeekConsoleInputW
+552 stub PeekNamedPipe
+553 stub PostQueuedCompletionStatus
+554 stub PrepareTape
+555 stub Process32First
+556 stub Process32Next
+557 stub PulseEvent
+558 stdcall PurgeComm(long long) PurgeComm
+559 register QT_Thunk() QT_Thunk
+560 stdcall QueryDosDeviceA(ptr ptr long) QueryDosDevice32A
+561 stdcall QueryDosDeviceW(ptr ptr long) QueryDosDevice32W
+562 stub QueryNumberOfEventLogRecords
+563 stub QueryOldestEventLogRecord
+564 stdcall QueryPerformanceCounter(ptr) QueryPerformanceCounter
+565 stub QueryPerformanceFrequency
+566 stub QueueUserAPC
+567 register RaiseException(long long long ptr) RaiseException
+568 stdcall ReadConsoleA(long ptr long ptr ptr) ReadConsole32A
+569 stub ReadConsoleInputA
+570 stub ReadConsoleInputW
+571 stub ReadConsoleOutputA
+572 stub ReadConsoleOutputAttribute
+573 stub ReadConsoleOutputCharacterA
+574 stub ReadConsoleOutputCharacterW
+575 stub ReadConsoleOutputW
+576 stdcall ReadConsoleW(long ptr long ptr ptr) ReadConsole32W
+577 stdcall ReadFile(long ptr long ptr ptr) ReadFile
+578 stub ReadFileEx
+579 stdcall ReadProcessMemory(long ptr ptr long ptr) ReadProcessMemory
+580 stub RegisterServiceProcess
+581 stdcall ReinitializeCriticalSection(ptr) ReinitializeCriticalSection
+582 stdcall ReleaseMutex(long) ReleaseMutex
+583 stdcall ReleaseSemaphore(long long ptr) ReleaseSemaphore
+584 stdcall RemoveDirectoryA(ptr) RemoveDirectory32A
+585 stdcall RemoveDirectoryW(ptr) RemoveDirectory32W
+586 stdcall ResetEvent(long) ResetEvent
+587 stdcall ResumeThread(long) ResumeThread
+588 stdcall RtlFillMemory(ptr long long) RtlFillMemory
+589 stdcall RtlMoveMemory(ptr ptr long) RtlMoveMemory
+590 register RtlUnwind(ptr long ptr long) RtlUnwind
+591 stdcall RtlZeroMemory(ptr long) RtlZeroMemory
+592 register SMapLS() SMapLS
+593 register SMapLS_IP_EBP_12() SMapLS_IP_EBP_12
+594 register SMapLS_IP_EBP_16() SMapLS_IP_EBP_16
+595 register SMapLS_IP_EBP_20() SMapLS_IP_EBP_20
+596 register SMapLS_IP_EBP_24() SMapLS_IP_EBP_24
+597 register SMapLS_IP_EBP_28() SMapLS_IP_EBP_28
+598 register SMapLS_IP_EBP_32() SMapLS_IP_EBP_32
+599 register SMapLS_IP_EBP_36() SMapLS_IP_EBP_36
+600 register SMapLS_IP_EBP_40() SMapLS_IP_EBP_40
+601 register SMapLS_IP_EBP_8() SMapLS_IP_EBP_8
+602 stub SUnMapLS
+603 stub SUnMapLS_IP_EBP_12
+604 stub SUnMapLS_IP_EBP_16
+605 stub SUnMapLS_IP_EBP_20
+606 stub SUnMapLS_IP_EBP_24
+607 stub SUnMapLS_IP_EBP_28
+608 stub SUnMapLS_IP_EBP_32
+609 stub SUnMapLS_IP_EBP_36
+610 stub SUnMapLS_IP_EBP_40
+611 stub SUnMapLS_IP_EBP_8
+612 stub ScrollConsoleScreenBufferA
+613 stub ScrollConsoleScreenBufferW
+614 stdcall SearchPathA(ptr ptr ptr long ptr ptr) SearchPath32A
+615 stdcall SearchPathW(ptr ptr ptr long ptr ptr) SearchPath32W
+616 stdcall SetCommBreak(long) SetCommBreak32
+617 stub SetCommConfig
+618 stdcall SetCommMask(long ptr) SetCommMask
+619 stdcall SetCommState(long ptr) SetCommState32
+620 stdcall SetCommTimeouts(long ptr) SetCommTimeouts
+621 stub SetComputerNameA
+622 stub SetComputerNameW
+623 stub SetConsoleActiveScreenBuffer
+624 stub SetConsoleCP
+625 stdcall SetConsoleCtrlHandler(ptr long) SetConsoleCtrlHandler
+626 stub SetConsoleCursorInfo
+627 stdcall SetConsoleCursorPosition(long long) SetConsoleCursorPosition
+628 stdcall SetConsoleMode(long long) SetConsoleMode
+629 stub SetConsoleOutputCP
+630 stub SetConsoleScreenBufferSize
+631 stub SetConsoleTextAttribute
+632 stdcall SetConsoleTitleA(ptr) SetConsoleTitle32A
+633 stdcall SetConsoleTitleW(ptr) SetConsoleTitle32W
+634 stub SetConsoleWindowInfo
+635 stdcall SetCurrentDirectoryA(ptr) SetCurrentDirectory32A
+636 stdcall SetCurrentDirectoryW(ptr) SetCurrentDirectory32W
+637 stub SetDaylightFlag
+638 stub SetDefaultCommConfigA
+639 stub SetDefaultCommConfigW
+640 stdcall SetEndOfFile(long) SetEndOfFile
+641 stdcall SetEnvironmentVariableA(ptr ptr) SetEnvironmentVariable32A
+642 stdcall SetEnvironmentVariableW(ptr ptr) SetEnvironmentVariable32W
+643 stdcall SetErrorMode(long) SetErrorMode32
+644 stdcall	SetEvent(long) SetEvent
+645 stdcall SetFileApisToANSI() SetFileApisToANSI
+646 stdcall SetFileApisToOEM() SetFileApisToOEM
+647 stdcall SetFileAttributesA(ptr long) SetFileAttributes32A
+648 stdcall SetFileAttributesW(ptr long) SetFileAttributes32W
+649 stdcall SetFilePointer(long long ptr long) SetFilePointer
+650 stdcall SetFileTime(long ptr ptr ptr) SetFileTime
+651 stub SetHandleContext
+652 stdcall SetHandleCount(long) SetHandleCount32
+653 stub SetHandleInformation
+654 stdcall SetLastError(long) SetLastError
+655 stub SetLocalTime
+656 stdcall SetLocaleInfoA(long long ptr) SetLocaleInfoA
+657 stub SetLocaleInfoW
+658 stub SetMailslotInfo
+659 stub SetNamedPipeHandleState
+660 stdcall SetPriorityClass(long long) SetPriorityClass
+661 stdcall SetProcessShutdownParameters(long long) SetProcessShutdownParameters
+662 stdcall SetProcessWorkingSetSize(long long long) SetProcessWorkingSetSize
+663 stdcall SetStdHandle(long long) SetStdHandle
+664 stdcall SetSystemPowerState(long long) SetSystemPowerState
+665 stdcall SetSystemTime(ptr) SetSystemTime
+666 stub SetSystemTimeAdjustment
+667 stub SetTapeParameters
+668 stub SetTapePosition
+669 stdcall SetThreadAffinityMask(long long)	SetThreadAffinityMask
+670 stub SetThreadContext
+671 stub SetThreadLocale
+672 stdcall SetThreadPriority(long long) SetThreadPriority
+673 stdcall SetTimeZoneInformation(ptr) SetTimeZoneInformation
+674 stdcall SetUnhandledExceptionFilter(ptr) SetUnhandledExceptionFilter
+675 stub SetVolumeLabelA
+676 stub SetVolumeLabelW
+677 stdcall SetupComm(long long long) SetupComm
+678 stdcall SizeofResource(long long) SizeofResource32
+679 stdcall Sleep(long) Sleep
+680 stub SleepEx
+681 stub SuspendThread
+682 stdcall SystemTimeToFileTime(ptr ptr) SystemTimeToFileTime
+683 stub SystemTimeToTzSpecificLocalTime
+684 stub TerminateProcess
+685 stdcall TerminateThread(long long) TerminateThread
+686 stub Thread32First
+687 stub Thread32Next
+688 stdcall ThunkConnect32(ptr ptr ptr ptr ptr ptr) ThunkConnect32
+689 stdcall TlsAlloc()	TlsAlloc
+690 stub TlsAllocInternal
+691 stdcall TlsFree(long) TlsFree
+692 stub TlsFreeInternal
+693 stdcall TlsGetValue(long) TlsGetValue
+694 stdcall TlsSetValue(long ptr) TlsSetValue
+695 stub Toolhelp32ReadProcessMemory
+696 stub TransactNamedPipe
+697 stdcall TransmitCommChar(long long) TransmitCommChar32
+698 stdcall UTRegister(long ptr ptr ptr ptr ptr ptr) UTRegister
+699 stdcall UTUnRegister(long) UTUnRegister
+700 stdcall UnMapLS(long) UnMapLS
+701 stub UnMapSLFixArray
+702 stdcall UnhandledExceptionFilter(ptr) UnhandledExceptionFilter
+703 stub UninitializeCriticalSection
+704 stdcall UnlockFile(long long long long long) UnlockFile
+705 stub UnlockFileEx
+706 stdcall UnmapViewOfFile(ptr) UnmapViewOfFile
+707 stub UpdateResourceA
+708 stub UpdateResourceW
+709 stub VerLanguageNameA
+710 stub VerLanguageNameW
+711 stdcall VirtualAlloc(ptr long long long) VirtualAlloc
+712 stdcall VirtualFree(ptr long long) VirtualFree
+713 stdcall VirtualLock(ptr long) VirtualLock
+714 stdcall VirtualProtect(ptr long long ptr) VirtualProtect
+715 stdcall VirtualProtectEx(long ptr long long ptr) VirtualProtectEx
+716 stdcall VirtualQuery(ptr ptr long) VirtualQuery
+717 stdcall VirtualQueryEx(long ptr ptr long) VirtualQueryEx
+718 stdcall VirtualUnlock(ptr long) VirtualUnlock
+719 stub WaitCommEvent
+720 stub WaitForDebugEvent
+721 stub WaitForMultipleObjects
+722 stub WaitForMultipleObjectsEx
+723 stdcall WaitForSingleObject(long long) WaitForSingleObject
+724 stdcall WaitForSingleObjectEx(long long long) WaitForSingleObjectEx
+725 stub WaitNamedPipeA
+726 stub WaitNamedPipeW
+727 stdcall WideCharToMultiByte(long long ptr long ptr long ptr ptr)	WideCharToMultiByte
+728 stdcall WinExec(ptr long) WinExec32
+729 stdcall WriteConsoleA(long ptr long ptr ptr) WriteConsole32A
+730 stub WriteConsoleInputA
+731 stub WriteConsoleInputW
+732 stub WriteConsoleOutputA
+733 stub WriteConsoleOutputAttribute
+734 stub WriteConsoleOutputCharacterA
+735 stub WriteConsoleOutputCharacterW
+736 stub WriteConsoleOutputW
+737 stdcall WriteConsoleW(long ptr long ptr ptr) WriteConsole32W
+738 stdcall WriteFile(long ptr long ptr ptr) WriteFile
+739 stub WriteFileEx
+740 stub WritePrivateProfileSectionA
+741 stub WritePrivateProfileSectionW
+742 stdcall WritePrivateProfileStringA(ptr ptr ptr ptr) WritePrivateProfileString32A
+743 stdcall WritePrivateProfileStringW(ptr ptr ptr ptr) WritePrivateProfileString32W
+744 stub WritePrivateProfileStructA
+745 stub WritePrivateProfileStructW
+746 stub WriteProcessMemory
+747 stub WriteProfileSectionA
+748 stub WriteProfileSectionW
+749 stdcall WriteProfileStringA(ptr ptr ptr) WriteProfileString32A
+750 stdcall WriteProfileStringW(ptr ptr ptr) WriteProfileString32W
+751 stub WriteTapemark
+752 stub _DebugOut
+753 stub _DebugPrintf
+754 stdcall _hread(long ptr long) _hread32
+755 stdcall _hwrite(long ptr long) _hwrite32
+756 stdcall _lclose(long) _lclose32
+757 stdcall _lcreat(ptr long) _lcreat32
+758 stdcall _llseek(long long long) _llseek32
+759 stdcall _lopen(ptr long) _lopen32
+760 stdcall _lread(long ptr long) _lread32
+761 stdcall _lwrite(long ptr long) _lwrite32
+762 stub dprintf
+763 stdcall lstrcat(ptr ptr) lstrcat32A
+764 stdcall lstrcatA(ptr ptr) lstrcat32A
+765 stdcall lstrcatW(ptr ptr) lstrcat32W
+766 stdcall lstrcmp(ptr ptr) lstrcmp32A
+767 stdcall lstrcmpA(ptr ptr) lstrcmp32A
+768 stdcall lstrcmpW(ptr ptr) lstrcmp32W
+769 stdcall lstrcmpi(ptr ptr) lstrcmpi32A
+770 stdcall lstrcmpiA(ptr ptr) lstrcmpi32A
+771 stdcall lstrcmpiW(ptr ptr) lstrcmpi32W
+772 stdcall lstrcpy(ptr ptr) lstrcpy32A
+773 stdcall lstrcpyA(ptr ptr) lstrcpy32A
+774 stdcall lstrcpyW(ptr ptr) lstrcpy32W
+775 stdcall lstrcpyn(ptr ptr long) lstrcpyn32A
+776 stdcall lstrcpynA(ptr ptr long) lstrcpyn32A
+777 stdcall lstrcpynW(ptr ptr long) lstrcpyn32W
+778 stdcall lstrlen(ptr) lstrlen32A
+779 stdcall lstrlenA(ptr) lstrlen32A
+780 stdcall lstrlenW(ptr) lstrlen32W
 # 
 # Functions exported by kernel32.dll in NT 3.51
 # 
-780   stub AddConsoleAliasA
-781   stub AddConsoleAliasW
-782   stub BaseAttachCompleteThunk
-783   stub BasepDebugDump
-784   stub CloseConsoleHandle
-785   stub CmdBatNotification
-786   stub ConsoleMenuControl
-787   stub ConsoleSubst
-788   stub CreateVirtualBuffer
-789   stub ExitVDM
-790   stub ExpungeConsoleCommandHistoryA
-791   stub ExpungeConsoleCommandHistoryW
-792   stub ExtendVirtualBuffer
-793   stub FreeVirtualBuffer
-794   stub GetConsoleAliasA
-795   stub GetConsoleAliasExesA
-796   stub GetConsoleAliasExesLengthA
-797   stub GetConsoleAliasExesLengthW
-798   stub GetConsoleAliasExesW
-799   stub GetConsoleAliasW
-800   stub GetConsoleAliasesA
-801   stub GetConsoleAliasesLengthA
-802   stub GetConsoleAliasesLengthW
-803   stub GetConsoleAliasesW
-804   stub GetConsoleCommandHistoryA
-805   stub GetConsoleCommandHistoryLengthA
-806   stub GetConsoleCommandHistoryLengthW
-807   stub GetConsoleCommandHistoryW
-810   stub GetConsoleDisplayMode
-811   stub GetConsoleFontInfo
-812   stub GetConsoleFontSize
-813   stub GetConsoleHardwareState
-814   stub GetConsoleInputWaitHandle
-815   stub GetCurrentConsoleFont
-816   stub GetNextVDMCommand
-817   stub GetNumberOfConsoleFonts
-818   stub GetVDMCurrentDirectories
-819   stub HeapCreateTagsW
-820   stub HeapExtend
-821   stub HeapQueryTagW
-823   stub HeapSummary
-824   stub HeapUsage
-825   stub InvalidateConsoleDIBits
-826   stub IsDebuggerPresent
-828   stub OpenConsoleW
-829   stub QueryWin31IniFilesMappedToRegistry
-830   stub RegisterConsoleVDM
-831   stub RegisterWaitForInputIdle
-832   stub RegisterWowBaseHandlers
-833   stub RegisterWowExec
-834   stub SetConsoleCommandHistoryMode
-835   stub SetConsoleCursor
-836   stub SetConsoleDisplayMode
-837   stub SetConsoleFont
-838   stub SetConsoleHardwareState
-839   stub SetConsoleKeyShortcuts
-840   stub SetConsoleMaximumWindowSize
-841   stub SetConsoleMenuClose
-842   stub SetConsoleNumberOfCommandsA
-843   stub SetConsoleNumberOfCommandsW
-844   stub SetConsolePalette
-845   stub SetLastConsoleEventActive
-846   stub SetVDMCurrentDirectories
-847   stub ShowConsoleCursor
-848   stub TrimVirtualBuffer
-849   stub VDMConsoleOperation
-850   stub VDMOperationStarted
-851   stub VerifyConsoleIoHandle
-852   stub VirtualBufferExceptionHandler
-853   stub WriteConsoleInputVDMA
-854   stub WriteConsoleInputVDMW
+781 stub AddConsoleAliasA
+782 stub AddConsoleAliasW
+783 stub BaseAttachCompleteThunk
+784 stub BasepDebugDump
+785 stub CloseConsoleHandle
+786 stub CmdBatNotification
+787 stub ConsoleMenuControl
+788 stub ConsoleSubst
+789 stub CreateVirtualBuffer
+790 stub ExitVDM
+791 stub ExpungeConsoleCommandHistoryA
+792 stub ExpungeConsoleCommandHistoryW
+793 stub ExtendVirtualBuffer
+794 stub FreeVirtualBuffer
+795 stub GetConsoleAliasA
+796 stub GetConsoleAliasExesA
+797 stub GetConsoleAliasExesLengthA
+798 stub GetConsoleAliasExesLengthW
+799 stub GetConsoleAliasExesW
+800 stub GetConsoleAliasW
+801 stub GetConsoleAliasesA
+802 stub GetConsoleAliasesLengthA
+803 stub GetConsoleAliasesLengthW
+804 stub GetConsoleAliasesW
+805 stub GetConsoleCommandHistoryA
+806 stub GetConsoleCommandHistoryLengthA
+807 stub GetConsoleCommandHistoryLengthW
+808 stub GetConsoleCommandHistoryW
+811 stub GetConsoleDisplayMode
+812 stub GetConsoleFontInfo
+813 stub GetConsoleFontSize
+814 stub GetConsoleHardwareState
+815 stub GetConsoleInputWaitHandle
+816 stub GetCurrentConsoleFont
+817 stub GetNextVDMCommand
+818 stub GetNumberOfConsoleFonts
+819 stub GetVDMCurrentDirectories
+820 stub HeapCreateTagsW
+821 stub HeapExtend
+822 stub HeapQueryTagW
+824 stub HeapSummary
+825 stub HeapUsage
+826 stub InvalidateConsoleDIBits
+827 stub IsDebuggerPresent
+829 stub OpenConsoleW
+830 stub QueryWin31IniFilesMappedToRegistry
+831 stub RegisterConsoleVDM
+832 stub RegisterWaitForInputIdle
+833 stub RegisterWowBaseHandlers
+834 stub RegisterWowExec
+835 stub SetConsoleCommandHistoryMode
+836 stub SetConsoleCursor
+837 stub SetConsoleDisplayMode
+838 stub SetConsoleFont
+839 stub SetConsoleHardwareState
+840 stub SetConsoleKeyShortcuts
+841 stub SetConsoleMaximumWindowSize
+842 stub SetConsoleMenuClose
+843 stub SetConsoleNumberOfCommandsA
+844 stub SetConsoleNumberOfCommandsW
+845 stub SetConsolePalette
+846 stub SetLastConsoleEventActive
+847 stub SetVDMCurrentDirectories
+848 stub ShowConsoleCursor
+849 stub TrimVirtualBuffer
+850 stub VDMConsoleOperation
+851 stub VDMOperationStarted
+852 stub VerifyConsoleIoHandle
+853 stub VirtualBufferExceptionHandler
+854 stub WriteConsoleInputVDMA
+855 stub WriteConsoleInputVDMW
diff --git a/if1632/keyboard.spec b/if1632/keyboard.spec
index b4b2c56..354c5af 100644
--- a/if1632/keyboard.spec
+++ b/if1632/keyboard.spec
@@ -12,8 +12,8 @@
 #126	pascal	GetTableSeg
 #127	pascal	NewTable
 128 pascal   OemKeyScan(word) OemKeyScan
-129 pascal16 VkKeyScan(byte) VkKeyScan16
-130 pascal16 GetKeyboardType(byte) GetKeyboardType16
+129 pascal16 VkKeyScan(word) VkKeyScan16
+130 pascal16 GetKeyboardType(word) GetKeyboardType16
 131 pascal16 MapVirtualKey(word word) MapVirtualKey16
 132 pascal16 GetKBCodePage() GetKBCodePage16
 133 pascal16 GetKeyNameText(long ptr word) GetKeyNameText16
diff --git a/if1632/mpr.spec b/if1632/mpr.spec
index 3acba59..ade7cba 100644
--- a/if1632/mpr.spec
+++ b/if1632/mpr.spec
@@ -48,7 +48,7 @@
 0067 stub WNetFormatNetworkNameA
 0068 stub WNetFormatNetworkNameW
 0069 stdcall WNetGetCachedPassword(ptr long ptr ptr long) WNetGetCachedPassword
-0070 stub WNetGetConnectionA
+0070 stdcall WNetGetConnectionA(ptr ptr ptr) WNetGetConnection32A
 0071 stub WNetGetConnectionW
 0072 stub WNetGetHomeDirectoryA
 0073 stub WNetGetHomeDirectoryW
diff --git a/if1632/ntdll.spec b/if1632/ntdll.spec
index 08d3941..ebe55e9 100644
--- a/if1632/ntdll.spec
+++ b/if1632/ntdll.spec
@@ -1,6 +1,5 @@
 name	ntdll
 type	win32
-base	0
 
 001 stub CsrAllocateCaptureBuffer
 002 stub CsrAllocateCapturePointer
@@ -873,82 +872,82 @@
 869 stub _snprintf
 870 stub _snwprintf
 871 stub _splitpath
-872 stub _strcmpi
-873 stdcall _stricmp(ptr ptr) lstrcmpi32A
+872 cdecl _strcmpi(ptr ptr) CRTDLL__strcmpi
+873 cdecl _stricmp(ptr ptr) CRTDLL__strcmpi
 874 stub _strlwr
-875 stub _strnicmp
-876 stdcall _strupr(ptr) CRTDLL__strupr
+875 cdecl _strnicmp(ptr ptr long) CRTDLL__strnicmp
+876 cdecl _strupr(ptr) CRTDLL__strupr
 877 stub _ultoa
 878 stub _vsnprintf
-879 stdcall _wcsicmp(ptr ptr) lstrcmpi32W
-880 stdcall _wcslwr(ptr) CRTDLL__wcslwr
-881 stdcall _wcsnicmp(ptr ptr long) lstrncmpi32W
-882 stdcall _wcsupr(ptr) CRTDLL__wcsupr
+879 cdecl _wcsicmp(ptr ptr) CRTDLL__wcsicmp
+880 cdecl _wcslwr(ptr) CRTDLL__wcslwr
+881 cdecl _wcsnicmp(ptr ptr long) CRTDLL__wcsnicmp
+882 cdecl _wcsupr(ptr) CRTDLL__wcsupr
 883 stub abs
 884 stub atan
-885 stdcall atoi(ptr) CRTDLL_atoi
-886 stdcall atol(ptr) CRTDLL_atol
+885 cdecl atoi(ptr) atoi
+886 cdecl atol(ptr) atol
 887 stub ceil
 888 stub cos
 889 stub fabs
 890 stub floor
-891 stdcall isalpha(long) CRTDLL_isalpha
-892 stdcall isdigit(long) CRTDLL_isdigit
-893 stdcall islower(long) CRTDLL_islower
-894 stdcall isprint(long) CRTDLL_isprint
-895 stdcall isspace(long) CRTDLL_isspace
-896 stdcall isupper(long) CRTDLL_isupper
+891 cdecl isalpha(long) isalpha
+892 cdecl isdigit(long) isdigit
+893 cdecl islower(long) islower
+894 cdecl isprint(long) isprint
+895 cdecl isspace(long) isspace
+896 cdecl isupper(long) isupper
 897 stub iswalpha
 898 stub iswctype
-899 stdcall isxdigit(long) CRTDLL_isxdigit
+899 cdecl isxdigit(long) isxdigit
 900 stub labs
 901 stub log
 902 stub mbstowcs
-903 stub memchr
-904 stub memcmp
-905 stub memcpy
-906 stdcall memmove(ptr ptr long) memmove
-907 stub memset
+903 cdecl memchr(ptr long long) memchr
+904 cdecl memcmp(ptr ptr long) memcmp
+905 cdecl memcpy(ptr ptr long) memcpy
+906 cdecl memmove(ptr ptr long) memmove
+907 cdecl memset(ptr long long) memset
 908 stub pow
 909 stub qsort
 910 stub sin
-911 stdcall sprintf() CRTDLL_sprintf
+911 varargs sprintf() wsprintf32A
 912 stub sqrt
-913 stdcall sscanf() CRTDLL_sscanf
-914 stub strcat
-915 stdcall strchr(ptr long) strchr
-916 stdcall strcmp(ptr ptr) lstrcmp32A
-917 stdcall strcpy(ptr ptr) lstrcpy32A
-918 stub strcspn
-919 stdcall strlen(ptr) lstrlen32A
-920 stub strncat
-921 stub strncmp
-922 stub strncpy
-923 stub strpbrk
-924 stdcall strrchr(ptr long) strrchr
-925 stub strspn
-926 stub strstr
-927 stdcall swprintf() CRTDLL_swprintf
+913 varargs sscanf() sscanf
+914 cdecl strcat(ptr ptr) strcat
+915 cdecl strchr(ptr long) strchr
+916 cdecl strcmp(ptr ptr) strcmp
+917 cdecl strcpy(ptr ptr) strcpy
+918 cdecl strcspn(ptr ptr) strcspn
+919 cdecl strlen(ptr) strlen
+920 cdecl strncat(ptr ptr long) strncat
+921 cdecl strncmp(ptr ptr long) strncmp
+922 cdecl strncpy(ptr ptr long) strncpy
+923 cdecl strpbrk(ptr ptr long) strpbrk
+924 cdecl strrchr(ptr long) strrchr
+925 cdecl strspn(ptr ptr) strspn
+926 cdecl strstr(ptr ptr) strstr
+927 varargs swprintf() wsprintf32W
 928 stub tan
-929 stdcall tolower(long) CRTDLL_tolower
-930 stdcall toupper(long) CRTDLL_toupper
+929 cdecl tolower(long) tolower
+930 cdecl toupper(long) toupper
 931 stub towlower
 932 stub towupper
-933 stub vsprintf
-934 stdcall wcscat(ptr ptr) lstrcat32W
-935 stdcall wcschr(ptr long) CRTDLL_wcschr
+933 cdecl vsprintf(ptr ptr ptr) CRTDLL_vsprintf
+934 cdecl wcscat(ptr ptr) CRTDLL_wcscat
+935 cdecl wcschr(ptr long) CRTDLL_wcschr
 936 stub wcscmp
-937 stdcall wcscpy(ptr ptr) lstrcpy32W
+937 cdecl wcscpy(ptr ptr) CRTDLL_wcscpy
 938 stub wcscspn
-939 stdcall wcslen(ptr) lstrlen32W
+939 cdecl wcslen(ptr) CRTDLL_wcslen
 940 stub wcsncat
 941 stub wcsncmp
-942 stdcall wcsncpy(ptr ptr long) lstrcpyn32W
+942 cdecl wcsncpy(ptr ptr long) CRTDLL_wcsncpy
 943 stub wcspbrk
-944 stdcall wcsrchr(ptr long) CRTDLL_wcsrchr
+944 cdecl wcsrchr(ptr long) CRTDLL_wcsrchr
 945 stub wcsspn
-946 stdcall wcsstr(ptr ptr) CRTDLL_wcsstr
+946 cdecl wcsstr(ptr ptr) CRTDLL_wcsstr
 947 stub wcstok
 948 stub wcstol
-949 stdcall wcstombs(ptr ptr) lstrcpyWtoA
+949 cdecl wcstombs(ptr ptr long) CRTDLL_wcstombs
 950 stub wcstoul
diff --git a/if1632/ole2.spec b/if1632/ole2.spec
index b86a0f8..5289929 100644
--- a/if1632/ole2.spec
+++ b/if1632/ole2.spec
@@ -74,7 +74,7 @@
 71 stub OLECONVERTOLESTREAMTOISTORAGE
 74 stub READFMTUSERTYPESTG
 75 stub WRITEFMTUSERTYPESTG
-76 stub OLEFLUSHCLIPBOARD
+76 pascal16 OleFlushClipboard() OleFlushClipboard
 77 stub OLEISCURRENTCLIPBOARD
 78 stub OLETRANSLATEACCELERATOR
 79 stub OLEDOAUTOCONVERT
diff --git a/if1632/ole32.spec b/if1632/ole32.spec
index 838a9d2..4595e4f 100644
--- a/if1632/ole32.spec
+++ b/if1632/ole32.spec
@@ -1,166 +1,165 @@
 name	ole32
 type	win32
-base	1
 
-0 stub BindMoniker
-1 stub CLSIDFromProgID
-2 stub CLSIDFromString
-3 stub CoBuildVersion
-4 stub CoCreateFreeThreadedMarshaler
-5 stub CoCreateGuid
-6 stub CoCreateInstance
-7 stub CoDisconnectObject
-8 stub CoDosDateTimeToFileTime
-9 stub CoFileTimeNow
-10 stub CoFileTimeToDosDateTime
-11 stub CoFreeAllLibraries
-12 stub CoFreeLibrary
-13 stub CoFreeUnusedLibraries
-14 stub CoGetCallerTID
-15 stub CoGetClassObject
-16 stub CoGetCurrentLogicalThreadId
-17 stub CoGetCurrentProcess
-18 stub CoGetInterfaceAndReleaseStream
-19 stub CoGetMalloc
-20 stub CoGetMarshalSizeMax
-21 stub CoGetPSClsid
-22 stub CoGetStandardMarshal
-23 stub CoGetState
-24 stub CoGetTreatAsClass
-25 stub CoInitialize
-26 stub CoInitializeWOW
-27 stub CoIsHandlerConnected
-28 stub CoIsOle1Class
-29 stub CoLoadLibrary
-30 stub CoLockObjectExternal
-31 stub CoMarshalHresult
-32 stub CoMarshalInterThreadInterfaceInStream
-33 stub CoMarshalInterface
-34 stub CoQueryReleaseObject
-35 stub CoRegisterClassObject
-36 stub CoRegisterMallocSpy
-37 stub CoRegisterMessageFilter
-38 stub CoReleaseMarshalData
-39 stub CoRevokeClassObject
-40 stub CoRevokeMallocSpy
-41 stub CoSetState
-42 stub CoTaskMemAlloc
-43 stub CoTaskMemFree
-44 stub CoTaskMemRealloc
-45 stub CoTreatAsClass
-46 stub CoUninitialize
-47 stub CoUnloadingWOW
-48 stub CoUnmarshalHresult
-49 stub CoUnmarshalInterface
-50 stub CreateAntiMoniker
-51 stub CreateBindCtx
-52 stub CreateDataAdviseHolder
-53 stub CreateDataCache
-54 stub CreateFileMoniker
-55 stub CreateGenericComposite
-56 stub CreateILockBytesOnHGlobal
-57 stub CreateItemMoniker
-58 stub CreateOleAdviseHolder
-59 stub CreatePointerMoniker
-60 stub CreateStreamOnHGlobal
-61 stub DllDebugObjectRPCHook
-62 stub DllGetClassObject
-63 stub DllGetClassObjectWOW
-64 stub DoDragDrop
-65 stub EnableHookObject
-66 stub GetClassFile
-67 stub GetConvertStg
-68 stub GetDocumentBitStg
-69 stub GetHGlobalFromILockBytes
-70 stub GetHGlobalFromStream
-71 stub GetHookInterface
-72 stub GetRunningObjectTable
-73 stub IIDFromString
-74 stub IsAccelerator
-75 stub IsEqualGUID
-76 stub IsValidIid
-77 stub IsValidInterface
-78 stub IsValidPtrIn
-79 stub IsValidPtrOut
-80 stub MkParseDisplayName
-81 stub MonikerCommonPrefixWith
-82 stub MonikerRelativePathTo
-83 stub OleBuildVersion
-84 stub OleConvertIStorageToOLESTREAM
-85 stub OleConvertIStorageToOLESTREAMEx
-86 stub OleConvertOLESTREAMToIStorage
-87 stub OleConvertOLESTREAMToIStorageEx
-88 stub OleCreate
-89 stub OleCreateDefaultHandler
-90 stub OleCreateEmbeddingHelper
-91 stub OleCreateFromData
-92 stub OleCreateFromFile
-93 stub OleCreateLink
-94 stub OleCreateLinkFromData
-95 stub OleCreateLinkToFile
-96 stub OleCreateMenuDescriptor
-97 stub OleCreateStaticFromData
-98 stub OleDestroyMenuDescriptor
-99 stub OleDoAutoConvert
-100 stub OleDraw
-101 stub OleDuplicateData
-102 stub OleFlushClipboard
-103 stub OleGetAutoConvert
-104 stub OleGetClipboard
-105 stub OleGetIconOfClass
-106 stub OleGetIconOfFile
-107 return OleInitialize 4 0
-108 stub OleInitializeWOW
-109 stub OleIsCurrentClipboard
-110 stub OleIsRunning
-111 stub OleLoad
-112 stub OleLoadFromStream
-113 stub OleLockRunning
-114 stub OleMetafilePictFromIconAndLabel
-115 stub OleNoteObjectVisible
-116 stub OleQueryCreateFromData
-117 stub OleQueryLinkFromData
-118 stub OleRegEnumFormatEtc
-119 stub OleRegEnumVerbs
-120 stub OleRegGetMiscStatus
-121 stub OleRegGetUserType
-122 stub OleRun
-123 stub OleSave
-124 stub OleSaveToStream
-125 stub OleSetAutoConvert
-126 stub OleSetClipboard
-127 stub OleSetContainedObject
-128 stub OleSetMenuDescriptor
-129 stub OleTranslateAccelerator
-130 return OleUninitialize 0 0
-131 stub OpenOrCreateStream
-132 stub ProgIDFromCLSID
-133 stub ReadClassStg
-134 stub ReadClassStm
-135 stub ReadFmtUserTypeStg
-136 stub ReadOleStg
-137 stub ReadStringStream
-138 stub RegisterDragDrop
-139 stub ReleaseStgMedium
-140 stub RevokeDragDrop
-141 stub SetConvertStg
-142 stub SetDocumentBitStg
-143 stub StgCreateDocfile
-144 stub StgCreateDocfileOnILockBytes
-145 stub StgIsStorageFile
-146 stub StgIsStorageILockBytes
-147 stub StgOpenStorage
-148 stub StgOpenStorageOnILockBytes
-149 stub StgSetTimes
-150 stub StringFromCLSID
-151 stub StringFromGUID2
-152 stub StringFromIID
-153 stub UtConvertDvtd16toDvtd32
-154 stub UtConvertDvtd32toDvtd16
-155 stub UtGetDvtd16Info
-156 stub UtGetDvtd32Info
-157 stub WriteClassStg
-158 stub WriteClassStm
-159 stub WriteFmtUserTypeStg
-160 stub WriteOleStg
-161 stub WriteStringStream
+  1 stub BindMoniker
+  2 stub CLSIDFromProgID
+  3 stub CLSIDFromString
+  4 stub CoBuildVersion
+  5 stub CoCreateFreeThreadedMarshaler
+  6 stub CoCreateGuid
+  7 stub CoCreateInstance
+  8 stub CoDisconnectObject
+  9 stub CoDosDateTimeToFileTime
+ 10 stub CoFileTimeNow
+ 11 stub CoFileTimeToDosDateTime
+ 12 stub CoFreeAllLibraries
+ 13 stub CoFreeLibrary
+ 14 stub CoFreeUnusedLibraries
+ 15 stub CoGetCallerTID
+ 16 stub CoGetClassObject
+ 17 stub CoGetCurrentLogicalThreadId
+ 18 stub CoGetCurrentProcess
+ 19 stub CoGetInterfaceAndReleaseStream
+ 20 stub CoGetMalloc
+ 21 stub CoGetMarshalSizeMax
+ 22 stub CoGetPSClsid
+ 23 stub CoGetStandardMarshal
+ 24 stub CoGetState
+ 25 stub CoGetTreatAsClass
+ 26 stub CoInitialize
+ 27 stub CoInitializeWOW
+ 28 stub CoIsHandlerConnected
+ 29 stub CoIsOle1Class
+ 30 stub CoLoadLibrary
+ 31 stub CoLockObjectExternal
+ 32 stub CoMarshalHresult
+ 33 stub CoMarshalInterThreadInterfaceInStream
+ 34 stub CoMarshalInterface
+ 35 stub CoQueryReleaseObject
+ 36 stub CoRegisterClassObject
+ 37 stub CoRegisterMallocSpy
+ 38 stub CoRegisterMessageFilter
+ 39 stub CoReleaseMarshalData
+ 40 stub CoRevokeClassObject
+ 41 stub CoRevokeMallocSpy
+ 42 stub CoSetState
+ 43 stub CoTaskMemAlloc
+ 44 stub CoTaskMemFree
+ 45 stub CoTaskMemRealloc
+ 46 stub CoTreatAsClass
+ 47 stub CoUninitialize
+ 48 stub CoUnloadingWOW
+ 49 stub CoUnmarshalHresult
+ 50 stub CoUnmarshalInterface
+ 51 stub CreateAntiMoniker
+ 52 stub CreateBindCtx
+ 53 stub CreateDataAdviseHolder
+ 54 stub CreateDataCache
+ 55 stub CreateFileMoniker
+ 56 stub CreateGenericComposite
+ 57 stub CreateILockBytesOnHGlobal
+ 58 stub CreateItemMoniker
+ 59 stub CreateOleAdviseHolder
+ 60 stub CreatePointerMoniker
+ 61 stub CreateStreamOnHGlobal
+ 62 stub DllDebugObjectRPCHook
+ 63 stub DllGetClassObject
+ 64 stub DllGetClassObjectWOW
+ 65 stub DoDragDrop
+ 66 stub EnableHookObject
+ 67 stub GetClassFile
+ 68 stub GetConvertStg
+ 69 stub GetDocumentBitStg
+ 70 stub GetHGlobalFromILockBytes
+ 71 stub GetHGlobalFromStream
+ 72 stub GetHookInterface
+ 73 stub GetRunningObjectTable
+ 74 stub IIDFromString
+ 75 stub IsAccelerator
+ 76 stub IsEqualGUID
+ 77 stub IsValidIid
+ 78 stub IsValidInterface
+ 79 stub IsValidPtrIn
+ 80 stub IsValidPtrOut
+ 81 stub MkParseDisplayName
+ 82 stub MonikerCommonPrefixWith
+ 83 stub MonikerRelativePathTo
+ 84 stub OleBuildVersion
+ 85 stub OleConvertIStorageToOLESTREAM
+ 86 stub OleConvertIStorageToOLESTREAMEx
+ 87 stub OleConvertOLESTREAMToIStorage
+ 88 stub OleConvertOLESTREAMToIStorageEx
+ 89 stub OleCreate
+ 90 stub OleCreateDefaultHandler
+ 91 stub OleCreateEmbeddingHelper
+ 92 stub OleCreateFromData
+ 93 stub OleCreateFromFile
+ 94 stub OleCreateLink
+ 95 stub OleCreateLinkFromData
+ 96 stub OleCreateLinkToFile
+ 97 stub OleCreateMenuDescriptor
+ 98 stub OleCreateStaticFromData
+ 99 stub OleDestroyMenuDescriptor
+100 stub OleDoAutoConvert
+101 stub OleDraw
+102 stub OleDuplicateData
+103 stub OleFlushClipboard
+104 stub OleGetAutoConvert
+105 stub OleGetClipboard
+106 stub OleGetIconOfClass
+107 stub OleGetIconOfFile
+108 return OleInitialize 4 0
+109 stub OleInitializeWOW
+110 stub OleIsCurrentClipboard
+111 stub OleIsRunning
+112 stub OleLoad
+113 stub OleLoadFromStream
+114 stub OleLockRunning
+115 stub OleMetafilePictFromIconAndLabel
+116 stub OleNoteObjectVisible
+117 stub OleQueryCreateFromData
+118 stub OleQueryLinkFromData
+119 stub OleRegEnumFormatEtc
+120 stub OleRegEnumVerbs
+121 stub OleRegGetMiscStatus
+122 stub OleRegGetUserType
+123 stub OleRun
+124 stub OleSave
+125 stub OleSaveToStream
+126 stub OleSetAutoConvert
+127 stub OleSetClipboard
+128 stub OleSetContainedObject
+129 stub OleSetMenuDescriptor
+130 stub OleTranslateAccelerator
+131 return OleUninitialize 0 0
+132 stub OpenOrCreateStream
+133 stub ProgIDFromCLSID
+134 stub ReadClassStg
+135 stub ReadClassStm
+136 stub ReadFmtUserTypeStg
+137 stub ReadOleStg
+138 stub ReadStringStream
+139 stub RegisterDragDrop
+140 stub ReleaseStgMedium
+141 stub RevokeDragDrop
+142 stub SetConvertStg
+143 stub SetDocumentBitStg
+144 stub StgCreateDocfile
+145 stub StgCreateDocfileOnILockBytes
+146 stub StgIsStorageFile
+147 stub StgIsStorageILockBytes
+148 stub StgOpenStorage
+149 stub StgOpenStorageOnILockBytes
+150 stub StgSetTimes
+151 stub StringFromCLSID
+152 stub StringFromGUID2
+153 stub StringFromIID
+154 stub UtConvertDvtd16toDvtd32
+155 stub UtConvertDvtd32toDvtd16
+156 stub UtGetDvtd16Info
+157 stub UtGetDvtd32Info
+158 stub WriteClassStg
+159 stub WriteClassStm
+160 stub WriteFmtUserTypeStg
+161 stub WriteOleStg
+162 stub WriteStringStream
diff --git a/if1632/relay.c b/if1632/relay.c
index f8e98c4..6ad7c32 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -352,15 +352,15 @@
      */
     /* FIXME: we need to save %si and %di */
 
-    lpbuf[0] = OFFSETOF(IF1632_Saved16_ss_sp);
-    lpbuf[1] = LOWORD(IF1632_Saved32_esp);
-    lpbuf[2] = HIWORD(IF1632_Saved32_esp);
-    lpbuf[3] = LOWORD(pFrame->saved_ss_sp);
-    lpbuf[4] = HIWORD(pFrame->saved_ss_sp);
-    lpbuf[5] = pFrame->ds;
-    lpbuf[6] = pFrame->bp;
-    lpbuf[7] = pFrame->ip;
-    lpbuf[8] = pFrame->cs;
+    lpbuf[0] = pFrame->ip;
+    lpbuf[1] = pFrame->cs;
+    lpbuf[2] = LOWORD(pFrame->saved_ss_sp);
+    lpbuf[3] = pFrame->bp;
+    lpbuf[4] = LOWORD(IF1632_Saved32_esp);
+    lpbuf[5] = HIWORD(IF1632_Saved32_esp);
+    lpbuf[6] = pFrame->ds;
+    lpbuf[7] = OFFSETOF(IF1632_Saved16_ss_sp);
+    lpbuf[8] = HIWORD(pFrame->saved_ss_sp);
     return 0;
 }
 
@@ -373,15 +373,15 @@
     STACK16FRAME *pFrame;
     WORD es = CURRENT_STACK16->es;
 
-    IF1632_Saved16_ss_sp = MAKELONG( lpbuf[0] - sizeof(WORD),
+    IF1632_Saved16_ss_sp = MAKELONG( lpbuf[7] - sizeof(WORD),
                                      HIWORD(IF1632_Saved16_ss_sp) );
-    IF1632_Saved32_esp = MAKELONG( lpbuf[1], lpbuf[2] );
+    IF1632_Saved32_esp = MAKELONG( lpbuf[4], lpbuf[5] );
     pFrame = CURRENT_STACK16;
-    pFrame->saved_ss_sp = MAKELONG( lpbuf[3], lpbuf[4] );
-    pFrame->ds          = lpbuf[5];
-    pFrame->bp          = lpbuf[6];
-    pFrame->ip          = lpbuf[7];
-    pFrame->cs          = lpbuf[8];
+    pFrame->saved_ss_sp = MAKELONG( lpbuf[2], lpbuf[8] );
+    pFrame->ds          = lpbuf[6];
+    pFrame->bp          = lpbuf[3];
+    pFrame->ip          = lpbuf[0];
+    pFrame->cs          = lpbuf[1];
     pFrame->es          = es;
     if (debugging_relay)  /* Make sure we have a valid entry point address */
     {
diff --git a/if1632/shell32.spec b/if1632/shell32.spec
index 14f5deb..ed55b9b 100644
--- a/if1632/shell32.spec
+++ b/if1632/shell32.spec
@@ -1,140 +1,153 @@
 name	shell32
 type	win32
-base	1
 
 # Functions exported by the Win95 shell32.dll 
 # (these need to have these exact ordinals, for some win95 dlls 
 #  import shell32.dll by ordinal)
 
-   1 stub CheckEscapesA
-   4 stub CheckEscapesW
-   5 stdcall CommandLineToArgvW(ptr ptr) CommandLineToArgvW
-   6 stub Control_FillCache_RunDLL
-  10 stub Control_RunDLL
-  12 stub DllGetClassObject
-  20 stub DoEnvironmentSubstA
-  36 stub DoEnvironmentSubstW
-  39 stdcall DragAcceptFiles(long long) DragAcceptFiles
-  40 stub DragFinish
-  42 stub DragQueryFile
+   3 stub CheckEscapesA
+   6 stub CheckEscapesW
+   7 stdcall CommandLineToArgvW(ptr ptr) CommandLineToArgvW
+   8 stub Control_FillCache_RunDLL
+  12 stdcall Control_RunDLL(long long long long) Control_RunDLL
+  14 stub DllGetClassObject
+  22 stub DoEnvironmentSubstA
+  33 stub SHELL32_33
+  34 stub SHELL32_34
+  35 stub SHELL32_35
+  38 stub DoEnvironmentSubstW
+  41 stdcall DragAcceptFiles(long long) DragAcceptFiles
+  42 stub DragFinish
+  44 stub DragQueryFile
+  46 stub SHELL32_46
   47 stub SHELL32_47
-  48 stub DragQueryFileA
-  51 stub DragQueryFileAorW
-  52 stub DragQueryFileW
-  74 stub DragQueryPoint
-  78 stub DuplicateIcon
-  80 stub ExtractAssociatedIconA
-  99 stub ExtractAssociatedIconExA
- 122 stub ExtractAssociatedIconExW
- 123 stub ExtractAssociatedIconW
- 131 stub ExtractIconA
- 133 stub ExtractIconEx
- 136 stub ExtractIconExA
- 146 stub ExtractIconResInfoA
- 148 stub ExtractIconResInfoW
- 154 stub SHELL32_154
- 155 stub SHELL32_155
+  48 stub SHELL32_48
+  49 stub SHELL32_49
+  50 stub DragQueryFileA
+  53 stub DragQueryFileAorW
+  54 stub DragQueryFileW
+  56 stub SHELL32_56
+  57 stub SHELL32_57
+  58 stub SHELL32_58
+  62 stub SHELL32_62
+  63 stub SHELL32_63
+  64 stub SHELL32_64
+  65 stub SHELL32_65
+  76 stub DragQueryPoint
+  80 stub DuplicateIcon
+  82 stub ExtractAssociatedIconA
+ 101 stub ExtractAssociatedIconExA
+ 124 stub ExtractAssociatedIconExW
+ 125 stub ExtractAssociatedIconW
+ 133 stub ExtractIconA
+ 135 stub ExtractIconEx
+ 138 stub ExtractIconExA
+ 148 stub ExtractIconResInfoA
+ 150 stub ExtractIconResInfoW
  156 stub SHELL32_156
+ 157 stub SHELL32_157
  158 stub SHELL32_158
- 178 stub ExtractIconW
- 180 stub ExtractVersionResource16W
- 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
- 188 stub InternalExtractIconListW
- 189 stub OpenAs_RunDLL
- 190 stub PrintersGetCommand_RunDLL
- 191 stub RealShellExecuteA
- 192 stub RealShellExecuteExA
- 201 stub RealShellExecuteExW
- 202 stub RealShellExecuteW
- 203 stub RegenerateUserEnvironment
- 204 stub SHAddToRecentDocs
- 205 stub SHAppBarMessage
- 206 stub SHBrowseForFolder
- 207 stub SHBrowseForFolderA
- 208 stub SHChangeNotify
- 209 stub SHFileOperation
- 210 stub SHFileOperationA
- 211 stub SHFormatDrive
- 212 stub SHFreeNameMappings
- 213 stub SHGetDataFromIDListA
- 214 stub SHGetDesktopFolder
- 215 stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfo32A
- 216 stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfo32A
- 217 stub SHGetInstanceExplorer
- 218 stub SHGetMalloc
- 219 stub SHGetPathFromIDList
- 220 stub SHGetPathFromIDListA
- 221 stub SHGetSpecialFolderLocation
- 222 stub SHHelpShortcuts_RunDLL
- 223 stub SHLoadInProc
- 224 stub SheChangeDirA
- 225 stub SheChangeDirExA
- 226 stub SheChangeDirExW
- 227 stub SheChangeDirW
- 228 stub SheConvertPathW
- 229 stub SheFullPathA
- 230 stub SheFullPathW
- 231 stub SheGetCurDrive
- 232 stub SheGetDirA
- 233 stub SheGetDirExW
- 234 stub SheGetDirW
- 235 stub SheGetPathOffsetW
- 236 stub SheRemoveQuotesA
- 237 stub SheRemoveQuotesW
- 238 stub SheSetCurDrive
- 239 stub SheShortenPathA
- 240 stub SheShortenPathW
- 241 stdcall ShellAboutA(long ptr ptr long) ShellAbout32A
- 242 stdcall ShellAboutW(long ptr ptr long) ShellAbout32W
- 243 stdcall ShellExecuteA(long ptr ptr ptr ptr long) ShellExecute32A
- 244 stub ShellExecuteEx
- 245 stub ShellExecuteExA
- 246 stub ShellExecuteW
- 247 stub Shell_NotifyIcon
- 248 stub Shell_NotifyIconA
- 249 stub Shl1632_ThunkData32
- 250 stub Shl3216_ThunkData32
-1023 stub ExtractIconExW # proper ordinal unknown
-1028 stub FindExeDlgProc # proper ordinal unknown
-1041 stub RegisterShellHook # proper ordinal unknown
-1046 stub SHBrowseForFolderW # proper ordinal unknown
-1050 stub SHFileOperationW # proper ordinal unknown
-1056 stub SHGetFileInfoW # proper ordinal unknown
-1061 stub SHGetPathFromIDListW # proper ordinal unknown
-1087 stub ShellExecuteExW # proper ordinal unknown
-1089 stub ShellHookProc # proper ordinal unknown
-1092 stub Shell_NotifyIconW # proper ordinal unknown
-1093 stub StrChrA # proper ordinal unknown
-1094 stub StrChrIA # proper ordinal unknown
-1095 stub StrChrIW # proper ordinal unknown
-1096 stub StrChrW # proper ordinal unknown
-1097 stub StrCmpNA # proper ordinal unknown
-1098 stub StrCmpNIA # proper ordinal unknown
-1099 stub StrCmpNIW # proper ordinal unknown
-1100 stub StrCmpNW # proper ordinal unknown
-1101 stub StrCpyNA # proper ordinal unknown
-1102 stub StrCpyNW # proper ordinal unknown
-1103 stub StrNCmpA # proper ordinal unknown
-1104 stub StrNCmpIA # proper ordinal unknown
-1105 stub StrNCmpIW # proper ordinal unknown
-1106 stub StrNCmpW # proper ordinal unknown
-1107 stub StrNCpyA # proper ordinal unknown
-1108 stub StrNCpyW # proper ordinal unknown
-1109 stub StrRChrA # proper ordinal unknown
-1110 stub StrRChrIA # proper ordinal unknown
-1111 stub StrRChrIW # proper ordinal unknown
-1112 stub StrRChrW # proper ordinal unknown
-1113 stub StrRStrA # proper ordinal unknown
-1114 stub StrRStrIA # proper ordinal unknown
-1115 stub StrRStrIW # proper ordinal unknown
-1116 stub StrRStrW # proper ordinal unknown
-1117 stub StrStrA # proper ordinal unknown
-1118 stub StrStrIA # proper ordinal unknown
-1119 stub StrStrIW # proper ordinal unknown
-1120 stub StrStrW # proper ordinal unknown
-1121 stub WOWShellExecute # proper ordinal unknown
+ 159 stub SHELL32_159
+ 160 stub SHELL32_160
+ 180 stub ExtractIconW
+ 182 stub ExtractVersionResource16W
+ 184 stub SHELL32_184
+ 185 stub SHELL32_185
+ 186 stdcall FindExecutableA(ptr ptr ptr) FindExecutable32A
+ 187 stub FindExecutableW
+ 188 return FreeIconList 4 0
+ 189 stub InternalExtractIconListA
+ 190 stub InternalExtractIconListW
+ 191 stub OpenAs_RunDLL
+ 192 stub PrintersGetCommand_RunDLL
+ 193 stub RealShellExecuteA
+ 194 stub RealShellExecuteExA
+ 203 stub RealShellExecuteExW
+ 204 stub RealShellExecuteW
+ 205 stub RegenerateUserEnvironment
+ 206 stub SHAddToRecentDocs
+ 207 stub SHAppBarMessage
+ 208 stub SHBrowseForFolder
+ 209 stub SHBrowseForFolderA
+ 210 stub SHChangeNotify
+ 211 stub SHFileOperation
+ 212 stub SHFileOperationA
+ 213 stub SHFormatDrive
+ 214 stub SHFreeNameMappings
+ 215 stub SHGetDataFromIDListA
+ 216 stub SHGetDesktopFolder
+ 217 stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfo32A
+ 218 stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfo32A
+ 219 stub SHGetInstanceExplorer
+ 220 stub SHGetMalloc
+ 221 stub SHGetPathFromIDList
+ 222 stub SHGetPathFromIDListA
+ 223 stub SHGetSpecialFolderLocation
+ 224 stub SHHelpShortcuts_RunDLL
+ 225 stub SHLoadInProc
+ 226 stub SheChangeDirA
+ 227 stub SheChangeDirExA
+ 228 stub SheChangeDirExW
+ 229 stub SheChangeDirW
+ 230 stub SheConvertPathW
+ 231 stub SheFullPathA
+ 232 stub SheFullPathW
+ 233 stub SheGetCurDrive
+ 234 stub SheGetDirA
+ 235 stub SheGetDirExW
+ 236 stub SheGetDirW
+ 237 stub SheGetPathOffsetW
+ 238 stub SheRemoveQuotesA
+ 239 stub SheRemoveQuotesW
+ 240 stub SheSetCurDrive
+ 241 stub SheShortenPathA
+ 242 stub SheShortenPathW
+ 243 stdcall ShellAboutA(long ptr ptr long) ShellAbout32A
+ 244 stdcall ShellAboutW(long ptr ptr long) ShellAbout32W
+ 245 stdcall ShellExecuteA(long ptr ptr ptr ptr long) ShellExecute32A
+ 246 stub ShellExecuteEx
+ 247 stub ShellExecuteExA
+ 248 stub ShellExecuteW
+ 249 stub Shell_NotifyIcon
+ 250 stub Shell_NotifyIconA
+ 251 stub Shl1632_ThunkData32
+ 252 stub Shl3216_ThunkData32
+1025 stub ExtractIconExW # proper ordinal unknown
+1030 stub FindExeDlgProc # proper ordinal unknown
+1043 stub RegisterShellHook # proper ordinal unknown
+1048 stub SHBrowseForFolderW # proper ordinal unknown
+1052 stub SHFileOperationW # proper ordinal unknown
+1058 stub SHGetFileInfoW # proper ordinal unknown
+1063 stub SHGetPathFromIDListW # proper ordinal unknown
+1089 stub ShellExecuteExW # proper ordinal unknown
+1091 stub ShellHookProc # proper ordinal unknown
+1094 stub Shell_NotifyIconW # proper ordinal unknown
+1095 stub StrChrA # proper ordinal unknown
+1096 stub StrChrIA # proper ordinal unknown
+1097 stub StrChrIW # proper ordinal unknown
+1098 stub StrChrW # proper ordinal unknown
+1099 stub StrCmpNA # proper ordinal unknown
+1100 stub StrCmpNIA # proper ordinal unknown
+1101 stub StrCmpNIW # proper ordinal unknown
+1102 stub StrCmpNW # proper ordinal unknown
+1103 stub StrCpyNA # proper ordinal unknown
+1104 stub StrCpyNW # proper ordinal unknown
+1105 stub StrNCmpA # proper ordinal unknown
+1106 stub StrNCmpIA # proper ordinal unknown
+1107 stub StrNCmpIW # proper ordinal unknown
+1108 stub StrNCmpW # proper ordinal unknown
+1109 stub StrNCpyA # proper ordinal unknown
+1110 stub StrNCpyW # proper ordinal unknown
+1111 stub StrRChrA # proper ordinal unknown
+1112 stub StrRChrIA # proper ordinal unknown
+1113 stub StrRChrIW # proper ordinal unknown
+1114 stub StrRChrW # proper ordinal unknown
+1115 stub StrRStrA # proper ordinal unknown
+1116 stub StrRStrIA # proper ordinal unknown
+1117 stub StrRStrIW # proper ordinal unknown
+1118 stub StrRStrW # proper ordinal unknown
+1119 stub StrStrA # proper ordinal unknown
+1120 stub StrStrIA # proper ordinal unknown
+1121 stub StrStrIW # proper ordinal unknown
+1122 stub StrStrW # proper ordinal unknown
+1123 stub WOWShellExecute # proper ordinal unknown
diff --git a/if1632/signal.c b/if1632/signal.c
index 62a6395..06890db 100644
--- a/if1632/signal.c
+++ b/if1632/signal.c
@@ -30,7 +30,7 @@
 #include "options.h"
 #include "sig_context.h"
 #include "miscemu.h"
-
+#include "thread.h"
 
 /* Signal handler declaration */
 
@@ -104,6 +104,115 @@
 }
 
 
+/***********************************************************************
+ *           SIGNAL_SetContext
+ *
+ * Set the register values from a sigcontext. 
+ */
+static void SIGNAL_SetSigContext( const SIGCONTEXT *sigcontext,
+                                  CONTEXT *context )
+{
+    EAX_reg(context) = EAX_sig(sigcontext);
+    EBX_reg(context) = EBX_sig(sigcontext);
+    ECX_reg(context) = ECX_sig(sigcontext);
+    EDX_reg(context) = EDX_sig(sigcontext);
+    ESI_reg(context) = ESI_sig(sigcontext);
+    EDI_reg(context) = EDI_sig(sigcontext);
+    EBP_reg(context) = EBP_sig(sigcontext);
+    EFL_reg(context) = EFL_sig(sigcontext);
+    EIP_reg(context) = EIP_sig(sigcontext);
+    ESP_reg(context) = ESP_sig(sigcontext);
+    CS_reg(context)  = LOWORD(CS_sig(sigcontext));
+    DS_reg(context)  = LOWORD(DS_sig(sigcontext));
+    ES_reg(context)  = LOWORD(ES_sig(sigcontext));
+    SS_reg(context)  = LOWORD(SS_sig(sigcontext));
+#ifdef FS_sig
+    FS_reg(context)  = LOWORD(FS_sig(sigcontext));
+#else
+    __asm__("movw %%fs,%w0":"=r" (FS_reg(&DEBUG_context)));
+    FS_reg(context) &= 0xffff;
+#endif
+#ifdef GS_sig
+    GS_reg(context)  = LOWORD(GS_sig(sigcontext));
+#else
+    __asm__("movw %%gs,%w0":"=r" (GS_reg(&DEBUG_context)));
+    GS_reg(context) &= 0xffff;
+#endif
+}
+
+
+/***********************************************************************
+ *           SIGNAL_GetSigContext
+ *
+ * Build a sigcontext from the register values.
+ */
+static void SIGNAL_GetSigContext( SIGCONTEXT *sigcontext,
+                                  const CONTEXT *context )
+{
+    EAX_sig(sigcontext) = EAX_reg(context);
+    EBX_sig(sigcontext) = EBX_reg(context);
+    ECX_sig(sigcontext) = ECX_reg(context);
+    EDX_sig(sigcontext) = EDX_reg(context);
+    ESI_sig(sigcontext) = ESI_reg(context);
+    EDI_sig(sigcontext) = EDI_reg(context);
+    EBP_sig(sigcontext) = EBP_reg(context);
+    EFL_sig(sigcontext) = EFL_reg(context);
+    EIP_sig(sigcontext) = EIP_reg(context);
+    ESP_sig(sigcontext) = ESP_reg(context);
+    CS_sig(sigcontext)  = CS_reg(context);
+    DS_sig(sigcontext)  = DS_reg(context);
+    ES_sig(sigcontext)  = ES_reg(context);
+    SS_sig(sigcontext)  = SS_reg(context);
+#ifdef FS_sig
+    FS_sig(sigcontext)  = FS_reg(context);
+#else
+    __asm__("movw %w0,%%fs"::"r" (FS_reg(context)));
+#endif
+#ifdef GS_sig
+    GS_sig(sigcontext)  = GS_reg(context);
+#else
+    __asm__("movw %w0,%%gs"::"r" (GS_reg(context)));
+#endif
+}
+
+
+/***********************************************************************
+ *           SIGNAL_InfoRegisters
+ *
+ * Display registers information. 
+ */
+void SIGNAL_InfoRegisters( CONTEXT *context )
+{
+    fprintf( stderr," CS:%04x SS:%04x DS:%04x ES:%04x FS:%04x GS:%04x",
+             (WORD)CS_reg(context), (WORD)SS_reg(context),
+             (WORD)DS_reg(context), (WORD)ES_reg(context),
+             (WORD)FS_reg(context), (WORD)GS_reg(context) );
+    fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n", 
+             EIP_reg(context), ESP_reg(context),
+             EBP_reg(context), EFL_reg(context) );
+    fprintf( stderr, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n", 
+             EAX_reg(context), EBX_reg(context),
+             ECX_reg(context), EDX_reg(context) );
+    fprintf( stderr, " ESI:%08lx EDI:%08lx\n",
+             ESI_reg(context), EDI_reg(context) );
+}
+
+
+/**********************************************************************
+ *		SIGNAL_tick
+ *
+ * Tick handler.
+ */
+static HANDLER_DEF(SIGNAL_tick)
+{
+    HANDLER_PROLOG
+    CONTEXT nt_context;
+    SIGNAL_SetSigContext( context, &nt_context );
+    if (THREAD_SwitchThread( &nt_context ))
+        SIGNAL_GetSigContext( context, &nt_context );
+    HANDLER_EPILOG
+}
+
 /**********************************************************************
  *		SIGNAL_InitEmulator
  *
@@ -111,14 +220,25 @@
  */
 BOOL32 SIGNAL_InitEmulator(void)
 {
+    struct itimerval vt_timer;
+
     SIGNAL_SetHandler( SIGINT,  (void (*)())SIGNAL_break, 1);
     SIGNAL_SetHandler( SIGSEGV, (void (*)())SIGNAL_fault, 1);
     SIGNAL_SetHandler( SIGILL,  (void (*)())SIGNAL_fault, 1);
     SIGNAL_SetHandler( SIGFPE,  (void (*)())SIGNAL_fault, 1);
+    SIGNAL_SetHandler( SIGVTALRM, (void (*)())SIGNAL_tick,  0);
     SIGNAL_SetHandler( SIGTRAP, (void (*)())SIGNAL_trap,  1); /* debugger */
     SIGNAL_SetHandler( SIGHUP,  (void (*)())SIGNAL_trap,  1); /* forced break*/
 #ifdef SIGBUS
     SIGNAL_SetHandler( SIGBUS,  (void (*)())SIGNAL_fault, 1);
 #endif
+
+    /* Start the tick timer */
+#if 0
+    vt_timer.it_interval.tv_sec = 0;
+    vt_timer.it_interval.tv_usec = 10000;
+    vt_timer.it_value = vt_timer.it_interval;
+    setitimer( ITIMER_VIRTUAL, &vt_timer, NULL );
+#endif
     return TRUE;
 }
diff --git a/if1632/thunk.c b/if1632/thunk.c
index a28c665..901a9bb 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -7,6 +7,9 @@
 
 #include "windows.h"
 #include "callback.h"
+#include "resource.h"
+#include "task.h"
+#include "user.h"
 #include "heap.h"
 #include "hook.h"
 #include "module.h"
@@ -50,7 +53,6 @@
 {
     /* Set the window proc calling functions */
     WINPROC_SetCallWndProc16( THUNK_CallWndProc16 );
-    WINPROC_SetCallWndProc32( (WINPROC_CALLWNDPROC32)CallTo32_4 );
     return TRUE;
 }
 
@@ -115,20 +117,20 @@
 static LRESULT THUNK_CallWndProc16( WNDPROC16 proc, HWND16 hwnd, UINT16 msg,
                                     WPARAM16 wParam, LPARAM lParam )
 {
-    if ((msg == WM_CREATE) || (msg == WM_NCCREATE))
+    if (((msg == WM_CREATE) || (msg == WM_NCCREATE)) && lParam)
     {
         CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
         /* Build the CREATESTRUCT on the 16-bit stack. */
         /* This is really ugly, but some programs (notably the */
         /* "Undocumented Windows" examples) want it that way.  */
-        return CallTo16_long_lllllllwlwwwl( (FARPROC16)proc,
+        return CallTo16_wndp_lllllllwlwwwl( (FARPROC16)proc,
                          cs->dwExStyle, cs->lpszClass, cs->lpszName, cs->style,
                          MAKELONG( cs->y, cs->x ), MAKELONG( cs->cy, cs->cx ),
                          MAKELONG( cs->hMenu, cs->hwndParent ), cs->hInstance,
                          (LONG)cs->lpCreateParams, hwnd, msg, wParam,
                          IF1632_Saved16_ss_sp - sizeof(CREATESTRUCT16) );
     }
-    return CallTo16_long_wwwl( (FARPROC16)proc, hwnd, msg, wParam, lParam );
+    return CallTo16_wndp_wwwl( (FARPROC16)proc, hwnd, msg, wParam, lParam );
 }
 
 
@@ -143,17 +145,6 @@
 }
 
 
-/***********************************************************************
- *           THUNK_EnumObjects32   (GDI32.89)
- */
-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 );
-}
-
-
 /*************************************************************************
  *           THUNK_EnumFonts16   (GDI.70)
  */
@@ -164,26 +155,6 @@
     return EnumFonts16( hdc, lpFaceName, (FONTENUMPROC16)&thunk, lParam );
 }
 
-/*************************************************************************
- *           THUNK_EnumFonts32A   (GDI32.84)
- */
-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 );
-}
-
-/*************************************************************************
- *           THUNK_EnumFonts32W   (GDI32.85)
- */
-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 );
-}
-
 /******************************************************************
  *           THUNK_EnumMetaFile16   (GDI.175)
  */
@@ -207,27 +178,6 @@
 
 
 /*************************************************************************
- *           THUNK_EnumFontFamilies32A   (GDI32.80)
- */
-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);
-}
-
-
-/*************************************************************************
- *           THUNK_EnumFontFamilies32W   (GDI32.83)
- */
-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);
-}
-
-/*************************************************************************
  *           THUNK_EnumFontFamiliesEx16   (GDI.613)
  */
 INT16 WINAPI THUNK_EnumFontFamiliesEx16( HDC16 hdc, LPLOGFONT16 lpLF,
@@ -240,32 +190,6 @@
 }
 
 
-/*************************************************************************
- *           THUNK_EnumFontFamiliesEx32A   (GDI32.81)
- */
-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,
-                                  lParam, reserved );
-}
-
-
-/*************************************************************************
- *           THUNK_EnumFontFamiliesEx32W   (GDI32.82)
- */
-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,
-                                  lParam, reserved );
-}
-
-
 /**********************************************************************
  *           THUNK_LineDDA16   (GDI.100)
  */
@@ -277,18 +201,6 @@
 }
 
 
-/**********************************************************************
- *           THUNK_LineDDA32   (GDI32.248)
- */
-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,
-                      (LINEDDAPROC32)&thunk, lParam );
-}
-
-
 /*******************************************************************
  *           THUNK_EnumWindows16   (USER.54)
  */
@@ -299,16 +211,6 @@
 }
 
 
-/*******************************************************************
- *           THUNK_EnumWindows32   (USER32.192)
- */
-BOOL32 WINAPI THUNK_EnumWindows32( WNDENUMPROC32 func, LPARAM lParam )
-{
-    DECL_THUNK( thunk, func, CallTo32_2 );
-    return EnumWindows32( (WNDENUMPROC32)&thunk, lParam );
-}
-
-
 /**********************************************************************
  *           THUNK_EnumChildWindows16   (USER.55)
  */
@@ -321,17 +223,6 @@
 
 
 /**********************************************************************
- *           THUNK_EnumChildWindows32   (USER32.177)
- */
-BOOL32 WINAPI THUNK_EnumChildWindows32( HWND32 parent, WNDENUMPROC32 func,
-                                        LPARAM lParam )
-{
-    DECL_THUNK( thunk, func, CallTo32_2 );
-    return EnumChildWindows32( parent, (WNDENUMPROC32)&thunk, lParam );
-}
-
-
-/**********************************************************************
  *           THUNK_EnumTaskWindows16   (USER.225)
  */
 BOOL16 WINAPI THUNK_EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func,
@@ -342,17 +233,6 @@
 }
 
 
-/**********************************************************************
- *           THUNK_EnumThreadWindows   (USER32.189)
- */
-BOOL32 WINAPI THUNK_EnumThreadWindows( DWORD id, WNDENUMPROC32 func,
-                                       LPARAM lParam )
-{
-    DECL_THUNK( thunk, func, CallTo32_2 );
-    return EnumThreadWindows( id, (WNDENUMPROC32)&thunk, lParam );
-}
-
-
 /***********************************************************************
  *           THUNK_EnumProps16   (USER.27)
  */
@@ -364,154 +244,6 @@
 
 
 /***********************************************************************
- *           THUNK_EnumProps32A   (USER32.185)
- */
-INT32 WINAPI THUNK_EnumProps32A( HWND32 hwnd, PROPENUMPROC32A func )
-{
-    DECL_THUNK( thunk, func, CallTo32_3 );
-    return EnumProps32A( hwnd, (PROPENUMPROC32A)&thunk );
-}
-
-
-/***********************************************************************
- *           THUNK_EnumProps32W   (USER32.188)
- */
-INT32 WINAPI THUNK_EnumProps32W( HWND32 hwnd, PROPENUMPROC32W func )
-{
-    DECL_THUNK( thunk, func, CallTo32_3 );
-    return EnumProps32W( hwnd, (PROPENUMPROC32W)&thunk );
-}
-
-
-/***********************************************************************
- *           THUNK_EnumPropsEx32A   (USER32.186)
- */
-INT32 WINAPI THUNK_EnumPropsEx32A( HWND32 hwnd, PROPENUMPROCEX32A func,
-                                   LPARAM lParam)
-{
-    DECL_THUNK( thunk, func, CallTo32_4 );
-    return EnumPropsEx32A( hwnd, (PROPENUMPROCEX32A)&thunk, lParam );
-}
-
-
-/***********************************************************************
- *           THUNK_EnumPropsEx32W   (USER32.187)
- */
-INT32 WINAPI THUNK_EnumPropsEx32W( HWND32 hwnd, PROPENUMPROCEX32W func,
-                                   LPARAM lParam)
-{
-    DECL_THUNK( thunk, func, CallTo32_4 );
-    return EnumPropsEx32W( hwnd, (PROPENUMPROCEX32W)&thunk, lParam );
-}
-
-
-/***********************************************************************
- *           THUNK_EnumSystemCodePages32A	(KERNEL32.92)
- */
-BOOL32 WINAPI THUNK_EnumSystemCodePages32A( CODEPAGE_ENUMPROC32A func,
-                                            DWORD flags )
-{
-    DECL_THUNK( thunk, func, CallTo32_1 );
-    return EnumSystemCodePages32A( (CODEPAGE_ENUMPROC32A)&thunk, flags );
-}
-
-
-/***********************************************************************
- *           THUNK_EnumSystemCodePages32W	(KERNEL32.93)
- */
-BOOL32 WINAPI THUNK_EnumSystemCodePages32W( CODEPAGE_ENUMPROC32W func,
-                                            DWORD flags )
-{
-    DECL_THUNK( thunk, func, CallTo32_1 );
-    return EnumSystemCodePages32W( (CODEPAGE_ENUMPROC32W)&thunk, flags );
-}
-
-/***********************************************************************
- *           THUNK_EnumSystemLocales32A   (KERNEL32.92)
- */
-BOOL32 WINAPI THUNK_EnumSystemLocales32A( LOCALE_ENUMPROC32A func, DWORD flags)
-{
-    DECL_THUNK( thunk, func, CallTo32_1 );
-    return EnumSystemLocales32A( (LOCALE_ENUMPROC32A)&thunk, flags );
-}
-
-
-/***********************************************************************
- *           THUNK_EnumSystemLocales32W   (KERNEL32.93)
- */
-BOOL32 WINAPI THUNK_EnumSystemLocales32W( LOCALE_ENUMPROC32W func, DWORD flags)
-{
-    DECL_THUNK( thunk, func, CallTo32_1 );
-    return EnumSystemLocales32W( (LOCALE_ENUMPROC32W)&thunk, flags );
-}
-
-/***********************************************************************
- *           THUNK_EnumResourceLanguages32W   (KERNEL32.87)
- */
-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 );
-}
-
-/***********************************************************************
- *           THUNK_EnumResourceLanguages32A   (KERNEL32.86)
- */
-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 );
-}
-
-/***********************************************************************
- *           THUNK_EnumResourceNames32A   (KERNEL32.88)
- */
-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 );
-}
-
-/***********************************************************************
- *           THUNK_EnumResourceNames32W   (KERNEL32.89)
- */
-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);
-}
-
-/***********************************************************************
- *           THUNK_EnumResourceTypes32A   (KERNEL32.90)
- */
-BOOL32 WINAPI THUNK_EnumResourceTypes32A( HMODULE32 hmod,
-                                          ENUMRESTYPEPROC32A func, LONG lParam)
-{
-    DECL_THUNK( thunk, func, CallTo32_3 );
-    return EnumResourceTypes32A( hmod,(ENUMRESTYPEPROC32A)&thunk, lParam );
-}
-
-/***********************************************************************
- *           THUNK_EnumResourceTypes32W   (KERNEL32.91)
- */
-BOOL32 WINAPI THUNK_EnumResourceTypes32W( HMODULE32 hmod,
-                                          ENUMRESTYPEPROC32W func,
-                                          LONG lParam )
-{
-    DECL_THUNK( thunk, func, CallTo32_3 );
-    return EnumResourceTypes32W( hmod,(ENUMRESTYPEPROC32W)&thunk, lParam );
-}
-
-
-/***********************************************************************
  *           THUNK_GrayString16   (USER.185)
  */
 BOOL16 WINAPI THUNK_GrayString16( HDC16 hdc, HBRUSH16 hbr,
@@ -529,40 +261,6 @@
 
 
 /***********************************************************************
- *           THUNK_GrayString32A   (USER32.314)
- */
-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)
-        return GrayString32A( hdc, hbr, NULL, lParam, cch, x, y, cx, cy );
-    else
-        return GrayString32A( hdc, hbr, (GRAYSTRINGPROC32)&thunk, lParam, cch,
-                              x, y, cx, cy );
-}
-
-
-/***********************************************************************
- *           THUNK_GrayString32W   (USER32.315)
- */
-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)
-        return GrayString32W( hdc, hbr, NULL, lParam, cch, x, y, cx, cy );
-    else
-        return GrayString32W( hdc, hbr, (GRAYSTRINGPROC32)&thunk, lParam, cch,
-                              x, y, cx, cy );
-}
-
-
-/***********************************************************************
  *           THUNK_SetWindowsHook16   (USER.121)
  */
 FARPROC16 WINAPI THUNK_SetWindowsHook16( INT16 id, HOOKPROC16 proc )
@@ -639,24 +337,6 @@
 }
 
 
-/***********************************************************************
- *            THUNK_SetUnhandledExceptionFilter   (KERNEL32.516)
- */
-LPTOP_LEVEL_EXCEPTION_FILTER WINAPI THUNK_SetUnhandledExceptionFilter(
-                                          LPTOP_LEVEL_EXCEPTION_FILTER filter )
-{
-    LPTOP_LEVEL_EXCEPTION_FILTER old;
-    THUNK *thunk = THUNK_Alloc( (FARPROC16)filter, (RELAY)CallTo32_1 );
-    if (!thunk) return NULL;
-    old = SetUnhandledExceptionFilter( (LPTOP_LEVEL_EXCEPTION_FILTER)thunk );
-    if (!old) return NULL;
-    thunk = (THUNK *)old;
-    old = (LPTOP_LEVEL_EXCEPTION_FILTER)thunk->proc;
-    THUNK_Free( thunk );
-    return old;
-}
-
-
 static FARPROC16 defDCHookProc = NULL;
 
 /***********************************************************************
@@ -705,6 +385,93 @@
     return ret;
 }
 
+
+/***********************************************************************
+ *           THUNK_SetTaskSignalProc (KERNEL.38)
+ */
+FARPROC16 WINAPI THUNK_SetTaskSignalProc( HTASK16 hTask, FARPROC16 proc )
+{
+    static FARPROC16 defSignalProc16 = NULL;
+
+    THUNK *thunk = NULL;
+
+    if( !defSignalProc16 )
+	defSignalProc16 = MODULE_GetEntryPoint(GetModuleHandle16("USER"), 314 );
+
+    if( proc == defSignalProc16 )
+	thunk = (THUNK*)SetTaskSignalProc( hTask, (FARPROC16)&USER_SignalProc );
+    else 
+    {
+	thunk = THUNK_Alloc( proc, (RELAY)CallTo16_word_wwwww );
+	if( !thunk ) return FALSE;
+	thunk = (THUNK*)SetTaskSignalProc( hTask, (FARPROC16)thunk );
+    }
+
+    if( thunk != (THUNK*)USER_SignalProc )
+    {
+	if( !thunk ) return NULL;
+
+	proc = thunk->proc;
+	THUNK_Free( thunk );
+	return proc;
+    }
+    return defSignalProc16;
+}
+
+
+/***********************************************************************
+ *           THUNK_SetResourceHandler	(KERNEL.67)
+ */
+FARPROC16 WINAPI THUNK_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, FARPROC16 proc )
+{
+    /* loader/ne_resource.c */
+    extern HGLOBAL16 WINAPI NE_DefResourceHandler(HGLOBAL16,HMODULE16,HRSRC16);
+
+    static FARPROC16 defDIBIconLoader16 = NULL;
+    static FARPROC16 defDIBCursorLoader16 = NULL;
+    static FARPROC16 defResourceLoader16 = NULL;
+
+    THUNK *thunk = NULL;
+
+    if( !defResourceLoader16 )
+    {
+	HMODULE16 hUser = GetModuleHandle16("USER");
+	defDIBIconLoader16 = MODULE_GetEntryPoint( hUser, 357 );
+	defDIBCursorLoader16 = MODULE_GetEntryPoint( hUser, 356 );
+	defResourceLoader16 = MODULE_GetWndProcEntry16( "DefResourceHandler" );
+    }
+
+    if( proc == defResourceLoader16 )
+	thunk = (THUNK*)&NE_DefResourceHandler;
+    else if( proc == defDIBIconLoader16 )
+	thunk = (THUNK*)&LoadDIBIconHandler;
+    else if( proc == defDIBCursorLoader16 )
+	thunk = (THUNK*)&LoadDIBCursorHandler;
+    else
+    {
+	thunk = THUNK_Alloc( proc, (RELAY)CallTo16_word_www );
+	if( !thunk ) return FALSE;
+    }
+
+    thunk = (THUNK*)SetResourceHandler( hModule, typeId, (FARPROC16)thunk );
+
+    if( thunk == (THUNK*)&NE_DefResourceHandler )
+	return defResourceLoader16;
+    if( thunk == (THUNK*)&LoadDIBIconHandler )
+	return defDIBIconLoader16;
+    if( thunk == (THUNK*)&LoadDIBCursorHandler )
+	return defDIBCursorLoader16;
+
+    if( thunk )
+    {
+	proc = thunk->proc;
+	THUNK_Free( thunk );
+	return proc;
+    }
+    return NULL;
+}
+
+
 /***********************************************************************
  *                                                                     *
  *                 Win95 internal thunks                               *
@@ -726,7 +493,7 @@
 	*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++	= 0x68; *(DWORD*)x = (DWORD)GetProcAddress32(GetModuleHandle32A("KERNEL32"),"FT_Prolog");
 	x+=4; 	/* push FT_Prolog */
 	*x++	= 0xC3;		/* lret */
 	/* fill rest with 0xCC / int 3 */
@@ -749,7 +516,7 @@
 	*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++	= 0xB8; *(DWORD*)x = (DWORD)GetProcAddress32(GetModuleHandle32A("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 */
@@ -1020,7 +787,7 @@
 LPVOID WINAPI _KERNEL32_41(LPBYTE thunk,LPCSTR thkbuf,DWORD len,LPCSTR dll16,
                            LPCSTR dll32)
 {
-	HMODULE32	hkrnl32 = WIN32_GetModuleHandleA("KERNEL32");
+	HMODULE32	hkrnl32 = GetModuleHandle32A("KERNEL32");
 	HMODULE16	hmod;
 	LPDWORD		addr,addr2;
 	DWORD		segaddr;
@@ -1130,44 +897,41 @@
  *
  * And YES, I've seen nr=48 (somewhere in the Win95 32<->16 OLE coupling)
  */
-DWORD WINAPI _KERNEL32_88(DWORD *args)
+DWORD WINAPIV _KERNEL32_88( DWORD nr, DWORD flags, FARPROC32 fun, ... )
 {
-    DWORD	nr = args[0];
-    DWORD	flags = args[1];
-    FARPROC32	fun = (FARPROC32)args[2];
-    DWORD	i,ret;
+    DWORD i,ret;
+    DWORD *args = ((DWORD *)&fun) + 1;
 
     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]);
+    for (i=0;i<nr/4;i++) fprintf(stderr,"0x%08lx,",args[i]);
     fprintf(stderr,"])");
 #ifndef WINELIB
     switch (nr) {
     case 0:	ret = CallTo32_0(fun);
 		break;
-    case 4:	ret = CallTo32_1(fun,args[3]);
+    case 4:	ret = CallTo32_1(fun,args[0]);
 		break;
-    case 8:	ret = CallTo32_2(fun,args[3],args[4]);
+    case 8:	ret = CallTo32_2(fun,args[0],args[1]);
 		break;
-    case 12:	ret = CallTo32_3(fun,args[3],args[4],args[5]);
+    case 12:	ret = CallTo32_3(fun,args[0],args[1],args[2]);
 		break;
-    case 16:	ret = CallTo32_4(fun,args[3],args[4],args[5],args[6]);
+    case 16:	ret = CallTo32_4(fun,args[0],args[1],args[2],args[3]);
 		break;
-    case 20:	ret = CallTo32_5(fun,args[3],args[4],args[5],args[6],args[7]);
+    case 20:	ret = CallTo32_5(fun,args[0],args[1],args[2],args[3],args[4]);
 		break;
-    case 24:	ret = CallTo32_6(fun,args[3],args[4],args[5],args[6],args[7],args[8]);
+    case 24:	ret = CallTo32_6(fun,args[0],args[1],args[2],args[3],args[4],args[5]);
 		break;
-    case 28:	ret = CallTo32_7(fun,args[3],args[4],args[5],args[6],args[7],args[8],args[9]);
+    case 28:	ret = CallTo32_7(fun,args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
 		break;
-    case 32:	ret = CallTo32_8(fun,args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10]);
+    case 32:	ret = CallTo32_8(fun,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
 		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]);
+    case 36:	ret = CallTo32_9(fun,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
 		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]);
+    case 40:	ret = CallTo32_10(fun,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9]);
 		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]);
+    case 44:	ret = CallTo32_11(fun,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10]);
 		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]);
+    case 48:	ret = CallTo32_12(fun,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11]);
 		break;
     default:
 	fprintf(stderr,"    unsupported nr of arguments, %ld\n",nr);
diff --git a/if1632/user.spec b/if1632/user.spec
index 6465424..a354415 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -86,7 +86,7 @@
 82  pascal16 InvertRect(word ptr) InvertRect16
 83  pascal16 FrameRect(word ptr word) FrameRect16
 84  pascal16 DrawIcon(word s_word s_word word) DrawIcon16
-85  pascal16 DrawText(word ptr s_word ptr word) DrawText16
+85  pascal16 DrawText(word str s_word ptr word) DrawText16
 87  pascal16 DialogBox(word segstr word segptr) DialogBox16
 88  pascal16 EndDialog(word s_word) EndDialog16
 89  pascal16 CreateDialog(word segstr word segptr) CreateDialog16
@@ -207,13 +207,13 @@
 203 pascal16 GetCommError(word ptr) GetCommError
 204 pascal16 ReadComm(word ptr word) ReadComm
 205 pascal16 WriteComm(word ptr word) WriteComm
-206 pascal16 TransmitCommChar(word byte) TransmitCommChar16
+206 pascal16 TransmitCommChar(word word) TransmitCommChar16
 207 pascal16 CloseComm(word) CloseComm
 208 pascal   SetCommEventMask(word word) SetCommEventMask
 209 pascal16 GetCommEventMask(word word) GetCommEventMask
 210 pascal16 SetCommBreak(word) SetCommBreak16
 211 pascal16 ClearCommBreak(word) ClearCommBreak16
-212 pascal16 UngetCommChar(word byte) UngetCommChar
+212 pascal16 UngetCommChar(word word) UngetCommChar
 213 pascal16 BuildCommDCB(ptr ptr) BuildCommDCB16
 214 pascal   EscapeCommFunction(word word) EscapeCommFunction16
 215 pascal16 FlushComm(word word) FlushComm
@@ -305,7 +305,7 @@
 #306 BEAR306
 308 pascal   DefDlgProc(word word word long) DefDlgProc16
 309 pascal16 GetClipCursor(ptr) GetClipCursor16
-314 stub SignalProc
+314 pascal16 SignalProc(word word word word word) USER_SignalProc
 319 pascal16 ScrollWindowEx(word s_word s_word ptr ptr word ptr word) ScrollWindowEx16
 320 stub SysErrorBox
 321 stub SetEventHook
@@ -316,19 +316,19 @@
 326 pascal16 GetControlBrush(word word word) GetControlBrush
 331 pascal16 EnableHardwareInput(word) EnableHardwareInput
 332 pascal16 UserYield() UserYield
-333 stub IsUserIdle
+333 pascal16 IsUserIdle() IsUserIdle
 334 pascal   GetQueueStatus(word) GetQueueStatus16
 335 pascal16 GetInputState() GetInputState16
-336 stub LoadCursorIconHandler
+336 pascal16 LoadCursorIconHandler(word word word) LoadCursorIconHandler
 337 pascal   GetMouseEventProc() GetMouseEventProc
 #341 _FFFE_FARFRAME
 343 stub GetFilePortName
-356 stub LoadDIBCursorHandler
-357 stub LoadDIBIconHandler
+356 pascal16 LoadDIBCursorHandler(word word word) LoadDIBCursorHandler
+357 pascal16 LoadDIBIconHandler(word word word) LoadDIBIconHandler
 358 pascal16 IsMenu(word) IsMenu16
 359 pascal16 GetDCEx(word word long) GetDCEx16
 362 pascal16 DCHook(word word long long) DCHook
-364 stub LookupIconIDFromDirectoryEx
+364 pascal16 LookupIconIdFromDirectoryEx(ptr word word word word) LookupIconIdFromDirectoryEx16
 368 pascal16 CopyIcon(word word) CopyIcon16
 369 pascal16 CopyCursor(word word) CopyCursor16
 370 pascal16 GetWindowPlacement(word ptr) GetWindowPlacement16
@@ -381,10 +381,10 @@
 430 pascal16 lstrcmp(str str) lstrcmp16
 431 pascal   AnsiUpper(segstr) AnsiUpper16
 432 pascal   AnsiLower(segstr) AnsiLower16
-433 pascal16 IsCharAlpha(byte) IsCharAlpha16
-434 pascal16 IsCharAlphaNumeric(byte) IsCharAlphaNumeric16
-435 pascal16 IsCharUpper(byte) IsCharUpper16
-436 pascal16 IsCharLower(byte) IsCharLower16
+433 pascal16 IsCharAlpha(word) IsCharAlpha16
+434 pascal16 IsCharAlphaNumeric(word) IsCharAlphaNumeric16
+435 pascal16 IsCharUpper(word) IsCharUpper16
+436 pascal16 IsCharLower(word) IsCharLower16
 437 pascal16 AnsiUpperBuff(ptr word) AnsiUpperBuff16
 438 pascal16 AnsiLowerBuff(ptr word) AnsiLowerBuff16
 441 pascal16 InsertMenuItem(word word word ptr) InsertMenuItem16
@@ -394,7 +394,7 @@
 447 pascal   DefMDIChildProc(word word word long) DefMDIChildProc16
 448 stub DrawAnimatedRects
 449 stub DrawState
-450 stub CreateIconFromResourceEx
+450 pascal16 CreateIconFromResourceEx(ptr long word long word word word) CreateIconFromResourceEx16
 451 pascal16 TranslateMDISysAccel(word ptr) TranslateMDISysAccel16
 452 pascal16 CreateWindowEx(long str str long s_word s_word s_word s_word
                             word word word segptr) CreateWindowEx16
@@ -442,7 +442,7 @@
 509 pascal16 WNetUnwatchQueue(word ptr ptr word) WNetUnwatchQueue
 510 pascal16 WNetLockQueueData(ptr ptr ptr) WNetLockQueueData
 511 pascal16 WNetUnlockQueueData(ptr) WNetUnlockQueueData
-512 pascal16 WNetGetConnection(ptr ptr ptr) WNetGetConnection
+512 pascal16 WNetGetConnection(ptr ptr ptr) WNetGetConnection16
 513 pascal16 WNetGetCaps(word) WNetGetCaps
 514 pascal16 WNetDeviceMode(word) WNetDeviceMode
 515 pascal16 WNetBrowseDialog(word word ptr) WNetBrowseDialog
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 78b5f23..b00e5d8 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -1,608 +1,607 @@
 name	user32
 type	win32
-base	1
 
-0000 stub ActivateKeyboardLayout
-0001 stdcall AdjustWindowRect(ptr long long) AdjustWindowRect32
-0002 stdcall AdjustWindowRectEx(ptr long long long) AdjustWindowRectEx32
-0003 stdcall AnyPopup() AnyPopup32
-0004 stdcall AppendMenuA(long long long ptr) AppendMenu32A
-0005 stdcall AppendMenuW(long long long ptr) AppendMenu32W
-0006 stdcall ArrangeIconicWindows(long) ArrangeIconicWindows32
-0007 stub AttachThreadInput
-0008 stdcall BeginDeferWindowPos(long) BeginDeferWindowPos32
-0009 stdcall BeginPaint(long ptr) BeginPaint32
-0010 stdcall BringWindowToTop(long) BringWindowToTop32
-0011 stub BroadcastSystemMessage
-0012 stub CalcChildScroll
-0013 stub CallMsgFilter
-0014 stdcall CallMsgFilterA(ptr long) CallMsgFilter32A
-0015 stdcall CallMsgFilterW(ptr long) CallMsgFilter32W
-0016 stdcall CallNextHookEx(long long long long) CallNextHookEx32
-0017 stdcall CallWindowProcA(ptr long long long long) CallWindowProc32A
-0018 stdcall CallWindowProcW(ptr long long long long) CallWindowProc32W
-0019 stub CascadeChildWindows
-0020 stub CascadeWindows
-0021 stdcall ChangeClipboardChain(long long) ChangeClipboardChain32
-0022 stdcall ChangeMenuA(long long ptr long long) ChangeMenu32A
-0023 stdcall ChangeMenuW(long long ptr long long) ChangeMenu32W
-0024 stdcall CharLowerA(ptr) CharLower32A
-0025 stdcall CharLowerBuffA(ptr long) CharLowerBuff32A
-0026 stdcall CharLowerBuffW(ptr long) CharLowerBuff32W
-0027 stdcall CharLowerW(ptr) CharLower32W
-0028 stdcall CharNextA(ptr) CharNext32A
-0029 stdcall CharNextExA(long ptr long) CharNextEx32A
-0030 stdcall CharNextExW(long ptr long) CharNextEx32W
-0031 stdcall CharNextW(ptr) CharNext32W
-0032 stdcall CharPrevA(ptr ptr) CharPrev32A
-0033 stdcall CharPrevExA(long ptr ptr long) CharPrevEx32A
-0034 stdcall CharPrevExW(long ptr ptr long) CharPrevEx32W
-0035 stdcall CharPrevW(ptr ptr) CharPrev32W
-0036 stdcall CharToOemA(ptr ptr) CharToOem32A
-0037 stdcall CharToOemBuffA(ptr ptr long) CharToOemBuff32A
-0038 stdcall CharToOemBuffW(ptr ptr long) CharToOemBuff32W
-0039 stdcall CharToOemW(ptr ptr) CharToOem32W
-0040 stdcall CharUpperA(ptr) CharUpper32A
-0041 stdcall CharUpperBuffA(ptr long) CharUpperBuff32A
-0042 stdcall CharUpperBuffW(ptr long) CharUpperBuff32W
-0043 stdcall CharUpperW(ptr) CharUpper32W
-0044 stdcall CheckDlgButton(long long long) CheckDlgButton32
-0045 stdcall CheckMenuItem(long long long) CheckMenuItem32
-0046 stub CheckMenuRadioItem
-0047 stdcall CheckRadioButton(long long long long) CheckRadioButton32
-0048 stdcall ChildWindowFromPoint(long long long) ChildWindowFromPoint32
-0049 stub ChildWindowFromPointEx
-0050 stub ClientThreadConnect
-0051 stdcall ClientToScreen(long ptr) ClientToScreen32
-0052 stdcall ClipCursor(ptr) ClipCursor32
-0053 stdcall CloseClipboard() CloseClipboard32
-0054 stub CloseDesktop
-0055 stdcall CloseWindow(long) CloseWindow32
-0056 stub CloseWindowStation
-0057 stub CopyAcceleratorTableA
-0058 stub CopyAcceleratorTableW
-0059 stdcall CopyIcon(long) CopyIcon32
-0060 stdcall CopyImage(long long long long long) CopyImage32
-0061 stdcall CopyRect(ptr ptr) CopyRect32
-0062 stdcall CountClipboardFormats() CountClipboardFormats32
-0063 stub CreateAcceleratorTableA
-0064 stub CreateAcceleratorTableW
-0065 stdcall CreateCaret(long long long long) CreateCaret32
-0066 stdcall CreateCursor(long long long long long ptr ptr) CreateCursor32
-0067 stub CreateDesktopA
-0068 stub CreateDesktopW
-0069 stdcall CreateDialogIndirectParamA(long ptr long ptr long) CreateDialogIndirectParam32A
-0070 stub CreateDialogIndirectParamAorW
-0071 stdcall CreateDialogIndirectParamW(long ptr long ptr long) CreateDialogIndirectParam32W
-0072 stdcall CreateDialogParamA(long ptr long ptr long) CreateDialogParam32A
-0073 stdcall CreateDialogParamW(long ptr long ptr long) CreateDialogParam32W
-0074 stdcall CreateIcon(long long long long long ptr ptr) CreateIcon32
-0075 stub CreateIconFromResource
-0076 stub CreateIconFromResourceEx
-0077 stub CreateIconIndirect
-0078 stub CreateMDIWindowA
-0079 stub CreateMDIWindowW
-0080 stdcall CreateMenu() CreateMenu32
-0081 stdcall CreatePopupMenu() CreatePopupMenu32
-0082 stdcall CreateWindowExA(long ptr ptr long long long long long 
-				long long long ptr) CreateWindowEx32A
-0083 stdcall CreateWindowExW(long ptr ptr long long long long long 
-				long long long ptr) CreateWindowEx32W
-0084 stub CreateWindowStationA
-0085 stub CreateWindowStationW
-0086 stub DdeAbandonTransaction
-0087 stub DdeAccessData
-0088 stub DdeAddData
-0089 return DdeClientTransaction 32 0
-0090 stub DdeCmpStringHandles
-0091 return DdeConnect 16 0
-0092 stub DdeConnectList
-0093 stub DdeCreateDataHandle
-0094 return DdeCreateStringHandleA 12 0
-0095 return DdeCreateStringHandleW 12 0
-0096 return DdeDisconnect 4 0
-0097 stub DdeDisconnectList
-0098 stub DdeEnableCallback
-0099 return DdeFreeDataHandle 4 1
-0100 return DdeFreeStringHandle 8 0
-0101 stub DdeGetData
-0102 return DdeGetLastError 4 0
-0103 stub DdeGetQualityOfService
-0104 stub DdeImpersonateClient
-0105 return DdeInitializeA 16 0
-0106 return DdeInitializeW 16 0
-0107 stub DdeKeepStringHandle
-0108 return DdeNameService 16 0
-0109 stub DdePostAdvise
-0110 stub DdeQueryConvInfo
-0111 stub DdeQueryNextServer
-0112 stub DdeQueryStringA
-0113 stub DdeQueryStringW
-0114 stub DdeReconnect
-0115 stub DdeSetQualityOfService
-0116 stub DdeSetUserHandle
-0117 stub DdeUnaccessData
-0118 return DdeUninitialize 4 0
-0119 stdcall DefDlgProcA(long long long long) DefDlgProc32A
-0120 stdcall DefDlgProcW(long long long long) DefDlgProc32W
-0121 stdcall DefFrameProcA(long long long long long) DefFrameProc32A
-0122 stdcall DefFrameProcW(long long long long long) DefFrameProc32W
-0123 stdcall DefMDIChildProcA(long long long long) DefMDIChildProc32A
-0124 stdcall DefMDIChildProcW(long long long long) DefMDIChildProc32W
-0125 stdcall DefWindowProcA(long long long long) DefWindowProc32A
-0126 stdcall DefWindowProcW(long long long long) DefWindowProc32W
-0127 stdcall DeferWindowPos(long long long long long long long long) DeferWindowPos32
-0128 stdcall DeleteMenu(long long long) DeleteMenu32
-0129 stub DestroyAcceleratorTable
-0130 stdcall DestroyCaret() DestroyCaret32
-0131 stdcall DestroyCursor(long) DestroyCursor32
-0132 stdcall DestroyIcon(long) DestroyIcon32
-0133 stdcall DestroyMenu(long) DestroyMenu32
-0134 stdcall DestroyWindow(long) DestroyWindow32
-0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long) DialogBoxIndirectParam32A
-0136 stdcall DialogBoxIndirectParamAorW(long ptr long ptr long) DialogBoxIndirectParam32A
-0137 stdcall DialogBoxIndirectParamW(long ptr long ptr long) DialogBoxIndirectParam32W
-0138 stdcall DialogBoxParamA(long ptr long ptr long) DialogBoxParam32A
-0139 stdcall DialogBoxParamW(long ptr long ptr long) DialogBoxParam32W
-0140 stdcall DispatchMessageA(ptr) DispatchMessage32A
-0141 stdcall DispatchMessageW(ptr) DispatchMessage32W
-0142 stdcall DlgDirListA(long ptr long long long) DlgDirList32A
-0143 stdcall DlgDirListComboBoxA(long ptr long long long) DlgDirListComboBox32A
-0144 stdcall DlgDirListComboBoxW(long ptr long long long) DlgDirListComboBox32W
-0145 stdcall DlgDirListW(long ptr long long long) DlgDirList32W
-0146 stdcall DlgDirSelectComboBoxExA(long ptr long long) DlgDirSelectComboBoxEx32A
-0147 stdcall DlgDirSelectComboBoxExW(long ptr long long) DlgDirSelectComboBoxEx32W
-0148 stdcall DlgDirSelectExA(long ptr long long) DlgDirSelectEx32A
-0149 stdcall DlgDirSelectExW(long ptr long long) DlgDirSelectEx32W
-0150 stdcall DragDetect(long long long) DragDetect32
-0151 stub DragObject
-0152 stdcall DrawAnimatedRects(long long ptr ptr) DrawAnimatedRects32
-0153 stub DrawCaption
-0154 stdcall DrawEdge(long ptr long long) DrawEdge32
-0155 stdcall DrawFocusRect(long ptr) DrawFocusRect32
-0156 stub DrawFrame
-0157 stdcall DrawFrameControl(long ptr long long) DrawFrameControl32
-0158 stdcall DrawIcon(long long long long) DrawIcon32
-0159 stub DrawIconEx
-0160 stdcall DrawMenuBar(long) DrawMenuBar32
-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
-0165 stub DrawTextExW
-0166 stdcall DrawTextW(long ptr long ptr long) DrawText32W
-0167 stub EditWndProc
-0168 stdcall EmptyClipboard() EmptyClipboard32
-0169 stdcall EnableMenuItem(long long long) EnableMenuItem32
-0170 stdcall EnableScrollBar(long long long) EnableScrollBar32
-0171 stdcall EnableWindow(long long) EnableWindow32
-0172 stdcall EndDeferWindowPos(long) EndDeferWindowPos32
-0173 stdcall EndDialog(long long) EndDialog32
-0174 stdcall EndMenu() EndMenu
-0175 stdcall EndPaint(long ptr) EndPaint32
-0176 stub EndTask
-0177 stdcall EnumChildWindows(long ptr long) THUNK_EnumChildWindows32
-0178 stdcall EnumClipboardFormats(long) EnumClipboardFormats32
-0179 stub EnumDesktopsA
-0180 stub EnumDesktopsW
-0181 stub EnumDisplayDeviceModesA
-0182 stub EnumDisplayDeviceModesW
-0183 stub EnumDisplayDevicesA
-0184 stub EnumDisplayDevicesW
-0185 stdcall EnumPropsA(long ptr) THUNK_EnumProps32A
-0186 stdcall EnumPropsExA(long ptr long) THUNK_EnumPropsEx32A
-0187 stdcall EnumPropsExW(long ptr long) THUNK_EnumPropsEx32W
-0188 stdcall EnumPropsW(long ptr) THUNK_EnumProps32W
-0189 stdcall EnumThreadWindows(long ptr long) THUNK_EnumThreadWindows
-0190 stub EnumWindowStationsA
-0191 stub EnumWindowStationsW
-0192 stdcall EnumWindows(ptr long) THUNK_EnumWindows32
-0193 stdcall EqualRect(ptr ptr) EqualRect32
-0194 stdcall ExcludeUpdateRgn(long long) ExcludeUpdateRgn32
-0195 stdcall ExitWindowsEx(long long) ExitWindowsEx
-0196 stdcall FillRect(long ptr long) FillRect32
-0197 stdcall FindWindowA(ptr ptr) FindWindow32A
-0198 stdcall FindWindowExA(long long ptr ptr) FindWindowEx32A
-0199 stdcall FindWindowExW(long long ptr ptr) FindWindowEx32W
-0200 stdcall FindWindowW(ptr ptr) FindWindow32W
-0201 stdcall FlashWindow(long long) FlashWindow32
-0202 stdcall FrameRect(long ptr long) FrameRect32
-0203 stub FreeDDElParam
-0204 stdcall GetActiveWindow() GetActiveWindow32
-0205 stdcall GetAppCompatFlags(long) GetAppCompatFlags32
-0206 stdcall GetAsyncKeyState(long) GetAsyncKeyState32
-0207 stdcall GetCapture() GetCapture32
-0208 stdcall GetCaretBlinkTime() GetCaretBlinkTime32
-0209 stdcall GetCaretPos(ptr) GetCaretPos32
-0210 stdcall GetClassInfoA(long ptr ptr) GetClassInfo32A
-0211 stdcall GetClassInfoExA(long ptr ptr) GetClassInfoEx32A
-0212 stdcall GetClassInfoExW(long ptr ptr) GetClassInfoEx32W
-0213 stdcall GetClassInfoW(long ptr ptr) GetClassInfo32W
-0214 stdcall GetClassLongA(long long) GetClassLong32A
-0215 stdcall GetClassLongW(long long) GetClassLong32W
-0216 stdcall GetClassNameA(long ptr long) GetClassName32A
-0217 stdcall GetClassNameW(long ptr long) GetClassName32W
-0218 stdcall GetClassWord(long long) GetClassWord32
-0219 stdcall GetClientRect(long long) GetClientRect32
-0220 stdcall GetClipCursor(ptr) GetClipCursor32
-0221 stdcall GetClipboardData(long) GetClipboardData32
-0222 stdcall GetClipboardFormatNameA(long ptr long) GetClipboardFormatName32A
-0223 stdcall GetClipboardFormatNameW(long ptr long) GetClipboardFormatName32W
-0224 stdcall GetClipboardOwner() GetClipboardOwner32
-0225 stdcall GetClipboardViewer(long) GetClipboardViewer32
-0226 stdcall GetCursor() GetCursor32
-0227 stub GetCursorInfo
-0228 stdcall GetCursorPos(ptr) GetCursorPos32
-0229 stdcall GetDC(long) GetDC32
-0230 stdcall GetDCEx(long long long) GetDCEx32
-0231 stdcall GetDesktopWindow() GetDesktopWindow32
-0232 stdcall GetDialogBaseUnits() GetDialogBaseUnits
-0233 stdcall GetDlgCtrlID(long) GetDlgCtrlID32
-0234 stdcall GetDlgItem(long long) GetDlgItem32
-0235 stdcall GetDlgItemInt(long long ptr long) GetDlgItemInt32
-0236 stdcall GetDlgItemTextA(long long ptr long) GetDlgItemText32A
-0237 stdcall GetDlgItemTextW(long long ptr long) GetDlgItemText32W
-0238 stdcall GetDoubleClickTime() GetDoubleClickTime32
-0239 stdcall GetFocus() GetFocus32
-0240 return GetForegroundWindow 0 0		#FIXME
-0241 stub GetIconInfo
-0242 stub GetInputDesktop
-0243 stdcall GetInputState() GetInputState32
-0244 stdcall GetInternalWindowPos(long ptr ptr) GetInternalWindowPos32
-0245 stdcall GetKBCodePage() GetKBCodePage32
-0246 stdcall GetKeyNameTextA(long ptr long) GetKeyNameText32A
-0247 stdcall GetKeyNameTextW(long ptr long) GetKeyNameText32W
-0248 stdcall GetKeyState(long) GetKeyState32
-0249 stdcall GetKeyboardLayout(long) GetKeyboardLayout
-0250 stub GetKeyboardLayoutList
-0251 stub GetKeyboardLayoutNameA
-0252 stub GetKeyboardLayoutNameW
-0253 stdcall GetKeyboardState(ptr) GetKeyboardState
-0254 stdcall GetKeyboardType(long) GetKeyboardType32
-0255 stdcall GetLastActivePopup(long) GetLastActivePopup32
-0256 stdcall GetMenu(long) GetMenu32
-0257 stdcall GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions
-0258 stub GetMenuContextHelpId
-0259 stub GetMenuDefaultItem
-0260 stub GetMenuIndex
-0261 stdcall GetMenuItemCount(long) GetMenuItemCount32
-0262 stdcall GetMenuItemID(long long) GetMenuItemID32
-0263 stdcall GetMenuItemInfoA(long long long ptr) GetMenuItemInfo32A
-0264 stdcall GetMenuItemInfoW(long long long ptr) GetMenuItemInfo32W
-0265 stub GetMenuItemRect
-0266 stdcall GetMenuState(long long long) GetMenuState32
-0267 stdcall GetMenuStringA(long long ptr long long) GetMenuString32A
-0268 stdcall GetMenuStringW(long long ptr long long) GetMenuString32W
-0269 stdcall GetMessageA(ptr long long long) GetMessage32A
-0270 stdcall GetMessageExtraInfo() GetMessageExtraInfo
-0271 stdcall GetMessagePos() GetMessagePos
-0272 stdcall GetMessageTime() GetMessageTime
-0273 stdcall GetMessageW(ptr long long long) GetMessage32W
-0274 stdcall GetNextDlgGroupItem(long long long) GetNextDlgGroupItem32
-0275 stdcall GetNextDlgTabItem(long long long) GetNextDlgTabItem32
-0276 stdcall GetOpenClipboardWindow() GetOpenClipboardWindow32
-0277 stdcall GetParent(long) GetParent32
-0278 stub GetPriorityClipboardFormat
-0279 stub GetProcessWindowStation
-0280 stdcall GetPropA(long ptr) GetProp32A
-0281 stdcall GetPropW(long ptr) GetProp32W
-0282 stub GetQueueStatus
-0283 stdcall GetScrollInfo(long long ptr) GetScrollInfo32
-0284 stdcall GetScrollPos(long long) GetScrollPos32
-0285 stdcall GetScrollRange(long long ptr ptr) GetScrollRange32
-0286 return GetShellWindow 0 0
-0287 stdcall GetSubMenu(long long) GetSubMenu32
-0288 stdcall GetSysColor(long) GetSysColor32
-0289 stdcall GetSysColorBrush(long) GetSysColorBrush32
-0290 stdcall GetSystemMenu(long long) GetSystemMenu32
-0291 stdcall GetSystemMetrics(long) GetSystemMetrics32
-0292 stdcall GetTabbedTextExtentA(long ptr long long ptr) GetTabbedTextExtent32A
-0293 stdcall GetTabbedTextExtentW(long ptr long long ptr) GetTabbedTextExtent32W
-0294 stub GetThreadDesktop
-0295 stdcall GetTopWindow(long) GetTopWindow32
-0296 stdcall GetUpdateRect(long ptr long) GetUpdateRect32
-0297 stdcall GetUpdateRgn(long long long) GetUpdateRgn32
-0298 stub GetUserObjectInformationA
-0299 stub GetUserObjectInformationW
-0300 stub GetUserObjectSecurity
-0301 stdcall GetWindow(long long) GetWindow32
-0302 stub GetWindowContextHelpId
-0303 stdcall GetWindowDC(long) GetWindowDC32
-0304 stdcall GetWindowLongA(long long) GetWindowLong32A
-0305 stdcall GetWindowLongW(long long) GetWindowLong32W
-0306 stdcall GetWindowPlacement(long ptr) GetWindowPlacement32
-0307 stdcall GetWindowRect(long ptr) GetWindowRect32
-0308 stdcall GetWindowTextA(long ptr long) GetWindowText32A
-0309 stdcall GetWindowTextLengthA(long) GetWindowTextLength32A
-0310 stdcall GetWindowTextLengthW(long) GetWindowTextLength32W
-0311 stdcall GetWindowTextW(long ptr long) GetWindowText32W
-0312 stdcall GetWindowThreadProcessId(long ptr) GetWindowThreadProcessId
-0313 stdcall GetWindowWord(long long) GetWindowWord32
-0314 stdcall GrayStringA(long long ptr long long long long long long) THUNK_GrayString32A
-0315 stdcall GrayStringW(long long ptr long long long long long long) THUNK_GrayString32W
-0316 stdcall HideCaret(long) HideCaret32
-0317 stdcall HiliteMenuItem(long long long long) HiliteMenuItem32
-0318 stub ImpersonateDdeClientWindow
-0319 stdcall InSendMessage() InSendMessage32
-0320 stdcall InflateRect(ptr long long) InflateRect32
-0321 stdcall InsertMenuA(long long long long ptr) InsertMenu32A
-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
-0327 stdcall InvalidateRect(long ptr long) InvalidateRect32
-0328 stdcall InvalidateRgn(long long long) InvalidateRgn32
-0329 stdcall InvertRect(long ptr) InvertRect32
-0330 stdcall IsCharAlphaA(long) IsCharAlpha32A
-0331 stdcall IsCharAlphaNumericA(long) IsCharAlphaNumeric32A
-0332 stdcall IsCharAlphaNumericW(long) IsCharAlphaNumeric32W
-0333 stdcall IsCharAlphaW(long) IsCharAlpha32W
-0334 stdcall IsCharLowerA(long) IsCharLower32A
-0335 stdcall IsCharLowerW(long) IsCharLower32W
-0336 stdcall IsCharUpperA(long) IsCharUpper32A
-0337 stdcall IsCharUpperW(long) IsCharUpper32W
-0338 stdcall IsChild(long long) IsChild32
-0339 stdcall IsClipboardFormatAvailable(long) IsClipboardFormatAvailable32
-0340 stub IsDialogMessage
-0341 stdcall IsDialogMessageA(long ptr) IsDialogMessage32A
-0342 stdcall IsDialogMessageW(long ptr) IsDialogMessage32W
-0343 stdcall IsDlgButtonChecked(long long) IsDlgButtonChecked32
-0344 stdcall IsIconic(long) IsIconic32
-0345 stdcall IsMenu(long) IsMenu32
-0346 stdcall IsRectEmpty(ptr) IsRectEmpty32
-0347 stdcall IsWindow(long) IsWindow32
-0348 stdcall IsWindowEnabled(long) IsWindowEnabled32
-0349 stdcall IsWindowUnicode(long) IsWindowUnicode
-0350 stdcall IsWindowVisible(long) IsWindowVisible32
-0351 stdcall IsZoomed(long) IsZoomed32
-0352 stdcall KillSystemTimer(long long) KillSystemTimer32
-0353 stdcall KillTimer(long long) KillTimer32
-0354 stdcall LoadAcceleratorsA(long ptr) LoadAccelerators32A
-0355 stdcall LoadAcceleratorsW(long ptr) LoadAccelerators32W
-0356 stdcall LoadBitmapA(long ptr) LoadBitmap32A
-0357 stdcall LoadBitmapW(long ptr) LoadBitmap32W
-0358 stdcall LoadCursorA(long ptr) LoadCursor32A
-0359 stub LoadCursorFromFileA
-0360 stub LoadCursorFromFileW
-0361 stdcall LoadCursorW(long ptr) LoadCursor32W
-0362 stdcall LoadIconA(long ptr) LoadIcon32A
-0363 stdcall LoadIconW(long ptr) LoadIcon32W
-0364 stdcall LoadImageA(long ptr long long long long) LoadImage32A
-0365 stub LoadImageW
-0366 stub LoadKeyboardLayoutA
-0367 stub LoadKeyboardLayoutW
-0368 stub LoadLocalFonts
-0369 stdcall LoadMenuA(long ptr) LoadMenu32A
-0370 stdcall LoadMenuIndirectA(ptr) LoadMenuIndirect32A
-0371 stdcall LoadMenuIndirectW(ptr) LoadMenuIndirect32W
-0372 stdcall LoadMenuW(long ptr) LoadMenu32W
-0373 stub LoadRemoteFonts
-0374 stdcall LoadStringA(long long ptr long) LoadString32A
-0375 stdcall LoadStringW(long long ptr long) LoadString32W
-0376 stub LockWindowStation
-0377 stdcall LockWindowUpdate(long) LockWindowUpdate32
-0378 stub LookupIconIdFromDirectory
-0379 stub LookupIconIdFromDirectoryEx
-0380 stub MBToWCSEx
-0381 stdcall MapDialogRect(long ptr) MapDialogRect32
-0382 stdcall MapVirtualKeyA(long long) MapVirtualKey32A
-0383 stub MapVirtualKeyExA
-0384 stdcall MapVirtualKeyW(long long) MapVirtualKey32A
-0385 stdcall MapWindowPoints(long long ptr long) MapWindowPoints32
-0386 stub MenuItemFromPoint
-0387 stub MenuWindowProcA
-0388 stub MenuWindowProcW
-0389 stdcall MessageBeep(long) MessageBeep32
-0390 stdcall MessageBoxA(long ptr ptr long) MessageBox32A
-0391 stdcall MessageBoxExA(long ptr ptr long long) MessageBoxEx32A
-0392 stdcall MessageBoxExW(long ptr ptr long long) MessageBoxEx32W
-0393 stub MessageBoxIndirectA
-0394 stub MessageBoxIndirectW
-0395 stdcall MessageBoxW(long ptr ptr long) MessageBox32W
-0396 stdcall ModifyMenuA(long long long long ptr) ModifyMenu32A
-0397 stdcall ModifyMenuW(long long long long ptr) ModifyMenu32W
-0398 stdcall MoveWindow(long long long long long long) MoveWindow32
-0399 stdcall MsgWaitForMultipleObjects(long ptr long long long) MsgWaitForMultipleObjects
-0400 stdcall OemKeyScan(long) OemKeyScan
-0401 stdcall OemToCharA(ptr ptr) OemToChar32A
-0402 stdcall OemToCharBuffA(ptr ptr long) OemToCharBuff32A
-0403 stdcall OemToCharBuffW(ptr ptr long) OemToCharBuff32W
-0404 stdcall OemToCharW(ptr ptr) OemToChar32W
-0405 stdcall OffsetRect(ptr long long) OffsetRect32
-0406 stdcall OpenClipboard(long) OpenClipboard32
-0407 stub OpenDesktopA
-0408 stub OpenDesktopW
-0409 stdcall OpenIcon(long) OpenIcon32
-0410 stub OpenInputDesktop
-0411 stub OpenWindowStationA
-0412 stub OpenWindowStationW
-0413 stub PackDDElParam
-0414 stub PaintDesktop
-0415 stdcall PeekMessageA(ptr long long long long) PeekMessage32A
-0416 stdcall PeekMessageW(ptr long long long long) PeekMessage32W
-0417 stub PlaySoundEvent
-0418 stdcall PostMessageA(long long long long) PostMessage32A
-0419 stdcall PostMessageW(long long long long) PostMessage32W
-0420 stdcall PostQuitMessage(long) PostQuitMessage32
-0421 stub PostThreadMessageA
-0422 stub PostThreadMessageW
-0423 stdcall PtInRect(ptr long long) PtInRect32
-0424 stub QuerySendMessage
-0425 stdcall RedrawWindow(long ptr long long) RedrawWindow32
-0426 stdcall RegisterClassA(ptr) RegisterClass32A
-0427 stdcall RegisterClassExA(ptr) RegisterClassEx32A
-0428 stdcall RegisterClassExW(ptr) RegisterClassEx32W
-0429 stdcall RegisterClassW(ptr) RegisterClass32W
-0430 stdcall RegisterClipboardFormatA(ptr) RegisterClipboardFormat32A
-0431 stdcall RegisterClipboardFormatW(ptr) RegisterClipboardFormat32W
-0432 stub RegisterHotKey
-0433 stub RegisterLogonProcess
-0434 stub RegisterSystemThread
-0435 stub RegisterTasklist
-0436 stdcall RegisterWindowMessageA(ptr) RegisterWindowMessage32A
-0437 stdcall RegisterWindowMessageW(ptr) RegisterWindowMessage32W
-0438 stdcall ReleaseCapture() ReleaseCapture
-0439 stdcall ReleaseDC(long long) ReleaseDC32
-0440 stdcall RemoveMenu(long long long) RemoveMenu32
-0441 stdcall RemovePropA(long ptr) RemoveProp32A
-0442 stdcall RemovePropW(long ptr) RemoveProp32W
-0443 stub ReplyMessage
-0444 stub ResetDisplay
-0445 stub ReuseDDElParam
-0446 stdcall ScreenToClient(long ptr) ScreenToClient32
-0447 stdcall ScrollChildren(long long long long) ScrollChildren32
-0448 stdcall ScrollDC(long long long ptr ptr long ptr) ScrollDC32
-0449 stdcall ScrollWindow(long long long ptr ptr) ScrollWindow32
-0450 stdcall ScrollWindowEx(long long long ptr ptr long ptr long) ScrollWindowEx32
-0451 stdcall SendDlgItemMessageA(long long long long long) SendDlgItemMessage32A
-0452 stdcall SendDlgItemMessageW(long long long long long) SendDlgItemMessage32W
-0453 stdcall SendMessageA(long long long long) SendMessage32A
-0454 stub SendMessageCallbackA
-0455 stub SendMessageCallbackW
-0456 stub SendMessageTimeoutA
-0457 stub SendMessageTimeoutW
-0458 stdcall SendMessageW(long long long long) SendMessage32W
-0459 stub SendNotifyMessageA
-0460 stub SendNotifyMessageW
-0461 stub ServerSetFunctionPointers
-0462 stdcall SetActiveWindow(long) SetActiveWindow32
-0463 stdcall SetCapture(long) SetCapture32
-0464 stdcall SetCaretBlinkTime(long) SetCaretBlinkTime32
-0465 stdcall SetCaretPos(long long) SetCaretPos32
-0466 stdcall SetClassLongA(long long long) SetClassLong32A
-0467 stdcall SetClassLongW(long long long) SetClassLong32W
-0468 stdcall SetClassWord(long long long) SetClassWord32
-0469 stdcall SetClipboardData(long long) SetClipboardData32
-0470 stdcall SetClipboardViewer(long) SetClipboardViewer32
-0471 stdcall SetCursor(long) SetCursor32
-0472 stub SetCursorContents
-0473 stdcall SetCursorPos(long long) SetCursorPos32
-0474 stub SetDebugErrorLevel
-0475 stdcall SetDeskWallPaper(ptr) SetDeskWallPaper32
-0476 stdcall SetDlgItemInt(long long long long) SetDlgItemInt32
-0477 stdcall SetDlgItemTextA(long long ptr) SetDlgItemText32A
-0478 stdcall SetDlgItemTextW(long long ptr) SetDlgItemText32W
-0479 stdcall SetDoubleClickTime(long) SetDoubleClickTime32
-0480 stdcall SetFocus(long) SetFocus32
-0481 return SetForegroundWindow 4 0
-0482 stdcall SetInternalWindowPos(long long ptr ptr) SetInternalWindowPos32
-0483 stdcall SetKeyboardState(ptr) SetKeyboardState
-0484 stdcall SetLastErrorEx(long long) SetLastErrorEx
-0485 stub SetLogonNotifyWindow
-0486 stdcall SetMenu(long long) SetMenu32
-0487 stub SetMenuContextHelpId
-0488 stdcall SetMenuDefaultItem(long long long) SetMenuDefaultItem32
-0489 stdcall SetMenuItemBitmaps(long long long long long) SetMenuItemBitmaps32
-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
-0495 stub SetProcessWindowStation
-0496 stdcall SetPropA(long ptr long) SetProp32A
-0497 stdcall SetPropW(long ptr long) SetProp32W
-0498 stdcall SetRect(ptr long long long long) SetRect32
-0499 stdcall SetRectEmpty(ptr) SetRectEmpty32
-0500 stdcall SetScrollInfo(long long ptr long) SetScrollInfo32
-0501 stdcall SetScrollPos(long long long long) SetScrollPos32
-0502 stdcall SetScrollRange(long long long long long) SetScrollRange32
-0503 stub SetShellWindow
-0504 stdcall SetSysColors(long ptr ptr) SetSysColors32
-0505 stub SetSysColorsTemp
-0506 stub SetSystemCursor
-0507 stdcall SetSystemMenu(long long) SetSystemMenu32
-0508 stdcall SetSystemTimer(long long long ptr) SetSystemTimer32
-0509 stub SetThreadDesktop
-0510 stdcall SetTimer(long long long ptr) SetTimer32
-0511 stub SetUserObjectInformationA
-0512 stub SetUserObjectInformationW
-0513 stub SetUserObjectSecurity
-0514 stub SetWindowContextHelpId
-0515 stub SetWindowFullScreenState
-0516 stdcall SetWindowLongA(long long long) SetWindowLong32A
-0517 stdcall SetWindowLongW(long long long) SetWindowLong32W
-0518 stdcall SetWindowPlacement(long ptr) SetWindowPlacement32
-0519 stdcall SetWindowPos(long long long long long long long) SetWindowPos32
-0520 stub SetWindowStationUser
-0521 stdcall SetWindowTextA(long ptr) SetWindowText32A
-0522 stdcall SetWindowTextW(long ptr) SetWindowText32W
-0523 stdcall SetWindowWord(long long long) SetWindowWord32
-0524 stdcall SetWindowsHookA(long ptr) SetWindowsHook32A
-0525 stdcall SetWindowsHookExA(long long long long) SetWindowsHookEx32A
-0526 stdcall SetWindowsHookExW(long long long long) SetWindowsHookEx32W
-0527 stdcall SetWindowsHookW(long long long long) SetWindowsHook32W
-0528 stdcall ShowCaret(long) ShowCaret32
-0529 stdcall ShowCursor(long) ShowCursor32
-0530 stdcall ShowOwnedPopups(long long) ShowOwnedPopups32
-0531 stdcall ShowScrollBar(long long long) ShowScrollBar32
-0532 stub ShowStartGlass
-0533 stdcall ShowWindow(long long) ShowWindow32
-0534 stub ShowWindowAsync
-0535 stdcall SubtractRect(ptr ptr ptr) SubtractRect32
-0536 stdcall SwapMouseButton(long) SwapMouseButton32
-0537 stub SwitchDesktop
-0538 stdcall SwitchToThisWindow(long long) SwitchToThisWindow32
-0539 stdcall SystemParametersInfoA(long long ptr long) SystemParametersInfo32A
-0540 stdcall SystemParametersInfoW(long long ptr long) SystemParametersInfo32W
-0541 stdcall TabbedTextOutA(long long long ptr long long ptr long) TabbedTextOut32A
-0542 stdcall TabbedTextOutW(long long long ptr long long ptr long) TabbedTextOut32W
-0543 stub TileChildWindows
-0544 stub TileWindows
-0545 stdcall ToAscii(long long ptr ptr long) ToAscii32
-0546 stub ToAsciiEx
-0547 stub ToUnicode
-0548 stdcall TrackPopupMenu(long long long long long long ptr) TrackPopupMenu32
-0549 stdcall TrackPopupMenuEx(long long long long long ptr) TrackPopupMenuEx
-0550 stdcall TranslateAccelerator(long long ptr) TranslateAccelerator32
-0551 stdcall TranslateAcceleratorA(long long ptr) TranslateAccelerator32
-0552 stdcall TranslateAcceleratorW(long long ptr) TranslateAccelerator32
-0553 stub TranslateCharsetInfo
-0554 stdcall TranslateMDISysAccel(long ptr) TranslateMDISysAccel32
-0555 stdcall TranslateMessage(ptr) TranslateMessage32
-0556 stdcall UnhookWindowsHook(long ptr) UnhookWindowsHook32
-0557 stdcall UnhookWindowsHookEx(long) UnhookWindowsHookEx32
-0558 stdcall UnionRect(ptr ptr ptr) UnionRect32
-0559 stub UnloadKeyboardLayout
-0560 stub UnlockWindowStation
-0561 stub UnpackDDElParam
-0562 stdcall UnregisterClassA(ptr long) UnregisterClass32A
-0563 stdcall UnregisterClassW(ptr long) UnregisterClass32W
-0564 stub UnregisterHotKey
-0565 stub UpdatePerUserSystemParameters
-0566 stdcall UpdateWindow(long) UpdateWindow32
-0567 stub UserClientDllInitialize
-0568 stub UserRealizePalette
-0569 stub UserRegisterWowHandlers
-0570 stdcall ValidateRect(long ptr) ValidateRect32
-0571 stdcall ValidateRgn(long long) ValidateRgn32
-0572 stdcall VkKeyScanA(long) VkKeyScan32A
-0573 stub VkKeyScanExA
-0574 stub VkKeyScanExW
-0575 stdcall VkKeyScanW(long) VkKeyScan32W
-0576 stub WaitForInputIdle
-0577 stdcall WaitMessage() WaitMessage
-0578 stdcall WinHelpA(long ptr long long) WinHelp32A
-0579 stdcall WinHelpW(long ptr long long) WinHelp32W
-0580 stdcall WindowFromDC(long) WindowFromDC32
-0581 stdcall WindowFromPoint(long long) WindowFromPoint32
-0582 stub keybd_event
-0583 stub mouse_event
-0584 stdcall wsprintfA() WIN32_wsprintf32A
-0585 stdcall wsprintfW() WIN32_wsprintf32W
-0586 stdcall wvsprintfA(ptr ptr ptr) wvsprintf32A
-0587 stdcall wvsprintfW(ptr ptr ptr) wvsprintf32W
+  1 stub ActivateKeyboardLayout
+  2 stdcall AdjustWindowRect(ptr long long) AdjustWindowRect32
+  3 stdcall AdjustWindowRectEx(ptr long long long) AdjustWindowRectEx32
+  4 stdcall AnyPopup() AnyPopup32
+  5 stdcall AppendMenuA(long long long ptr) AppendMenu32A
+  6 stdcall AppendMenuW(long long long ptr) AppendMenu32W
+  7 stdcall ArrangeIconicWindows(long) ArrangeIconicWindows32
+  8 stub AttachThreadInput
+  9 stdcall BeginDeferWindowPos(long) BeginDeferWindowPos32
+ 10 stdcall BeginPaint(long ptr) BeginPaint32
+ 11 stdcall BringWindowToTop(long) BringWindowToTop32
+ 12 stub BroadcastSystemMessage
+ 13 stub CalcChildScroll
+ 14 stub CallMsgFilter
+ 15 stdcall CallMsgFilterA(ptr long) CallMsgFilter32A
+ 16 stdcall CallMsgFilterW(ptr long) CallMsgFilter32W
+ 17 stdcall CallNextHookEx(long long long long) CallNextHookEx32
+ 18 stdcall CallWindowProcA(ptr long long long long) CallWindowProc32A
+ 19 stdcall CallWindowProcW(ptr long long long long) CallWindowProc32W
+ 20 stub CascadeChildWindows
+ 21 stub CascadeWindows
+ 22 stdcall ChangeClipboardChain(long long) ChangeClipboardChain32
+ 23 stdcall ChangeMenuA(long long ptr long long) ChangeMenu32A
+ 24 stdcall ChangeMenuW(long long ptr long long) ChangeMenu32W
+ 25 stdcall CharLowerA(ptr) CharLower32A
+ 26 stdcall CharLowerBuffA(ptr long) CharLowerBuff32A
+ 27 stdcall CharLowerBuffW(ptr long) CharLowerBuff32W
+ 28 stdcall CharLowerW(ptr) CharLower32W
+ 29 stdcall CharNextA(ptr) CharNext32A
+ 30 stdcall CharNextExA(long ptr long) CharNextEx32A
+ 31 stdcall CharNextExW(long ptr long) CharNextEx32W
+ 32 stdcall CharNextW(ptr) CharNext32W
+ 33 stdcall CharPrevA(ptr ptr) CharPrev32A
+ 34 stdcall CharPrevExA(long ptr ptr long) CharPrevEx32A
+ 35 stdcall CharPrevExW(long ptr ptr long) CharPrevEx32W
+ 36 stdcall CharPrevW(ptr ptr) CharPrev32W
+ 37 stdcall CharToOemA(ptr ptr) CharToOem32A
+ 38 stdcall CharToOemBuffA(ptr ptr long) CharToOemBuff32A
+ 39 stdcall CharToOemBuffW(ptr ptr long) CharToOemBuff32W
+ 40 stdcall CharToOemW(ptr ptr) CharToOem32W
+ 41 stdcall CharUpperA(ptr) CharUpper32A
+ 42 stdcall CharUpperBuffA(ptr long) CharUpperBuff32A
+ 43 stdcall CharUpperBuffW(ptr long) CharUpperBuff32W
+ 44 stdcall CharUpperW(ptr) CharUpper32W
+ 45 stdcall CheckDlgButton(long long long) CheckDlgButton32
+ 46 stdcall CheckMenuItem(long long long) CheckMenuItem32
+ 47 stub CheckMenuRadioItem
+ 48 stdcall CheckRadioButton(long long long long) CheckRadioButton32
+ 49 stdcall ChildWindowFromPoint(long long long) ChildWindowFromPoint32
+ 50 stub ChildWindowFromPointEx
+ 51 stub ClientThreadConnect
+ 52 stdcall ClientToScreen(long ptr) ClientToScreen32
+ 53 stdcall ClipCursor(ptr) ClipCursor32
+ 54 stdcall CloseClipboard() CloseClipboard32
+ 55 stub CloseDesktop
+ 56 stdcall CloseWindow(long) CloseWindow32
+ 57 stub CloseWindowStation
+ 58 stub CopyAcceleratorTableA
+ 59 stub CopyAcceleratorTableW
+ 60 stdcall CopyIcon(long) CopyIcon32
+ 61 stdcall CopyImage(long long long long long) CopyImage32
+ 62 stdcall CopyRect(ptr ptr) CopyRect32
+ 63 stdcall CountClipboardFormats() CountClipboardFormats32
+ 64 stub CreateAcceleratorTableA
+ 65 stub CreateAcceleratorTableW
+ 66 stdcall CreateCaret(long long long long) CreateCaret32
+ 67 stdcall CreateCursor(long long long long long ptr ptr) CreateCursor32
+ 68 stub CreateDesktopA
+ 69 stub CreateDesktopW
+ 70 stdcall CreateDialogIndirectParamA(long ptr long ptr long) CreateDialogIndirectParam32A
+ 71 stub CreateDialogIndirectParamAorW
+ 72 stdcall CreateDialogIndirectParamW(long ptr long ptr long) CreateDialogIndirectParam32W
+ 73 stdcall CreateDialogParamA(long ptr long ptr long) CreateDialogParam32A
+ 74 stdcall CreateDialogParamW(long ptr long ptr long) CreateDialogParam32W
+ 75 stdcall CreateIcon(long long long long long ptr ptr) CreateIcon32
+ 76 stub CreateIconFromResource
+ 77 stdcall CreateIconFromResourceEx(ptr long long long long long long) CreateIconFromResourceEx32
+ 78 stub CreateIconIndirect
+ 79 stub CreateMDIWindowA
+ 80 stub CreateMDIWindowW
+ 81 stdcall CreateMenu() CreateMenu32
+ 82 stdcall CreatePopupMenu() CreatePopupMenu32
+ 83 stdcall CreateWindowExA(long ptr ptr long long long long long 
+                            long long long ptr) CreateWindowEx32A
+ 84 stdcall CreateWindowExW(long ptr ptr long long long long long 
+                            long long long ptr) CreateWindowEx32W
+ 85 stub CreateWindowStationA
+ 86 stub CreateWindowStationW
+ 87 stub DdeAbandonTransaction
+ 88 stub DdeAccessData
+ 89 stub DdeAddData
+ 90 return DdeClientTransaction 32 0
+ 91 stub DdeCmpStringHandles
+ 92 return DdeConnect 16 0
+ 93 stub DdeConnectList
+ 94 stub DdeCreateDataHandle
+ 95 return DdeCreateStringHandleA 12 0
+ 96 return DdeCreateStringHandleW 12 0
+ 97 return DdeDisconnect 4 0
+ 98 stub DdeDisconnectList
+ 99 stub DdeEnableCallback
+100 return DdeFreeDataHandle 4 1
+101 return DdeFreeStringHandle 8 0
+102 stub DdeGetData
+103 return DdeGetLastError 4 0
+104 stub DdeGetQualityOfService
+105 stub DdeImpersonateClient
+106 return DdeInitializeA 16 0
+107 return DdeInitializeW 16 0
+108 stub DdeKeepStringHandle
+109 return DdeNameService 16 0
+110 stub DdePostAdvise
+111 stub DdeQueryConvInfo
+112 stub DdeQueryNextServer
+113 stub DdeQueryStringA
+114 stub DdeQueryStringW
+115 stub DdeReconnect
+116 stub DdeSetQualityOfService
+117 stub DdeSetUserHandle
+118 stub DdeUnaccessData
+119 return DdeUninitialize 4 0
+120 stdcall DefDlgProcA(long long long long) DefDlgProc32A
+121 stdcall DefDlgProcW(long long long long) DefDlgProc32W
+122 stdcall DefFrameProcA(long long long long long) DefFrameProc32A
+123 stdcall DefFrameProcW(long long long long long) DefFrameProc32W
+124 stdcall DefMDIChildProcA(long long long long) DefMDIChildProc32A
+125 stdcall DefMDIChildProcW(long long long long) DefMDIChildProc32W
+126 stdcall DefWindowProcA(long long long long) DefWindowProc32A
+127 stdcall DefWindowProcW(long long long long) DefWindowProc32W
+128 stdcall DeferWindowPos(long long long long long long long long) DeferWindowPos32
+129 stdcall DeleteMenu(long long long) DeleteMenu32
+130 stub DestroyAcceleratorTable
+131 stdcall DestroyCaret() DestroyCaret32
+132 stdcall DestroyCursor(long) DestroyCursor32
+133 stdcall DestroyIcon(long) DestroyIcon32
+134 stdcall DestroyMenu(long) DestroyMenu32
+135 stdcall DestroyWindow(long) DestroyWindow32
+136 stdcall DialogBoxIndirectParamA(long ptr long ptr long) DialogBoxIndirectParam32A
+137 stdcall DialogBoxIndirectParamAorW(long ptr long ptr long) DialogBoxIndirectParam32A
+138 stdcall DialogBoxIndirectParamW(long ptr long ptr long) DialogBoxIndirectParam32W
+139 stdcall DialogBoxParamA(long ptr long ptr long) DialogBoxParam32A
+140 stdcall DialogBoxParamW(long ptr long ptr long) DialogBoxParam32W
+141 stdcall DispatchMessageA(ptr) DispatchMessage32A
+142 stdcall DispatchMessageW(ptr) DispatchMessage32W
+143 stdcall DlgDirListA(long ptr long long long) DlgDirList32A
+144 stdcall DlgDirListComboBoxA(long ptr long long long) DlgDirListComboBox32A
+145 stdcall DlgDirListComboBoxW(long ptr long long long) DlgDirListComboBox32W
+146 stdcall DlgDirListW(long ptr long long long) DlgDirList32W
+147 stdcall DlgDirSelectComboBoxExA(long ptr long long) DlgDirSelectComboBoxEx32A
+148 stdcall DlgDirSelectComboBoxExW(long ptr long long) DlgDirSelectComboBoxEx32W
+149 stdcall DlgDirSelectExA(long ptr long long) DlgDirSelectEx32A
+150 stdcall DlgDirSelectExW(long ptr long long) DlgDirSelectEx32W
+151 stdcall DragDetect(long long long) DragDetect32
+152 stub DragObject
+153 stdcall DrawAnimatedRects(long long ptr ptr) DrawAnimatedRects32
+154 stub DrawCaption
+155 stdcall DrawEdge(long ptr long long) DrawEdge32
+156 stdcall DrawFocusRect(long ptr) DrawFocusRect32
+157 stub DrawFrame
+158 stdcall DrawFrameControl(long ptr long long) DrawFrameControl32
+159 stdcall DrawIcon(long long long long) DrawIcon32
+160 stub DrawIconEx
+161 stdcall DrawMenuBar(long) DrawMenuBar32
+162 stdcall DrawStateA(long long ptr long long long long long long long) DrawState32A
+163 stub DrawStateW
+164 stdcall DrawTextA(long ptr long ptr long) DrawText32A
+165 stdcall DrawTextExA(long ptr long ptr long ptr) DrawTextEx32A
+166 stdcall DrawTextExW(long ptr long ptr long ptr) DrawTextEx32W
+167 stdcall DrawTextW(long ptr long ptr long) DrawText32W
+168 stub EditWndProc
+169 stdcall EmptyClipboard() EmptyClipboard32
+170 stdcall EnableMenuItem(long long long) EnableMenuItem32
+171 stdcall EnableScrollBar(long long long) EnableScrollBar32
+172 stdcall EnableWindow(long long) EnableWindow32
+173 stdcall EndDeferWindowPos(long) EndDeferWindowPos32
+174 stdcall EndDialog(long long) EndDialog32
+175 stdcall EndMenu() EndMenu
+176 stdcall EndPaint(long ptr) EndPaint32
+177 stub EndTask
+178 stdcall EnumChildWindows(long ptr long) EnumChildWindows32
+179 stdcall EnumClipboardFormats(long) EnumClipboardFormats32
+180 stub EnumDesktopsA
+181 stub EnumDesktopsW
+182 stub EnumDisplayDeviceModesA
+183 stub EnumDisplayDeviceModesW
+184 stub EnumDisplayDevicesA
+185 stub EnumDisplayDevicesW
+186 stdcall EnumPropsA(long ptr) EnumProps32A
+187 stdcall EnumPropsExA(long ptr long) EnumPropsEx32A
+188 stdcall EnumPropsExW(long ptr long) EnumPropsEx32W
+189 stdcall EnumPropsW(long ptr) EnumProps32W
+190 stdcall EnumThreadWindows(long ptr long) EnumThreadWindows
+191 stub EnumWindowStationsA
+192 stub EnumWindowStationsW
+193 stdcall EnumWindows(ptr long) EnumWindows32
+194 stdcall EqualRect(ptr ptr) EqualRect32
+195 stdcall ExcludeUpdateRgn(long long) ExcludeUpdateRgn32
+196 stdcall ExitWindowsEx(long long) ExitWindowsEx
+197 stdcall FillRect(long ptr long) FillRect32
+198 stdcall FindWindowA(ptr ptr) FindWindow32A
+199 stdcall FindWindowExA(long long ptr ptr) FindWindowEx32A
+200 stdcall FindWindowExW(long long ptr ptr) FindWindowEx32W
+201 stdcall FindWindowW(ptr ptr) FindWindow32W
+202 stdcall FlashWindow(long long) FlashWindow32
+203 stdcall FrameRect(long ptr long) FrameRect32
+204 stub FreeDDElParam
+205 stdcall GetActiveWindow() GetActiveWindow32
+206 stdcall GetAppCompatFlags(long) GetAppCompatFlags32
+207 stdcall GetAsyncKeyState(long) GetAsyncKeyState32
+208 stdcall GetCapture() GetCapture32
+209 stdcall GetCaretBlinkTime() GetCaretBlinkTime32
+210 stdcall GetCaretPos(ptr) GetCaretPos32
+211 stdcall GetClassInfoA(long ptr ptr) GetClassInfo32A
+212 stdcall GetClassInfoExA(long ptr ptr) GetClassInfoEx32A
+213 stdcall GetClassInfoExW(long ptr ptr) GetClassInfoEx32W
+214 stdcall GetClassInfoW(long ptr ptr) GetClassInfo32W
+215 stdcall GetClassLongA(long long) GetClassLong32A
+216 stdcall GetClassLongW(long long) GetClassLong32W
+217 stdcall GetClassNameA(long ptr long) GetClassName32A
+218 stdcall GetClassNameW(long ptr long) GetClassName32W
+219 stdcall GetClassWord(long long) GetClassWord32
+220 stdcall GetClientRect(long long) GetClientRect32
+221 stdcall GetClipCursor(ptr) GetClipCursor32
+222 stdcall GetClipboardData(long) GetClipboardData32
+223 stdcall GetClipboardFormatNameA(long ptr long) GetClipboardFormatName32A
+224 stdcall GetClipboardFormatNameW(long ptr long) GetClipboardFormatName32W
+225 stdcall GetClipboardOwner() GetClipboardOwner32
+226 stdcall GetClipboardViewer(long) GetClipboardViewer32
+227 stdcall GetCursor() GetCursor32
+228 stub GetCursorInfo
+229 stdcall GetCursorPos(ptr) GetCursorPos32
+230 stdcall GetDC(long) GetDC32
+231 stdcall GetDCEx(long long long) GetDCEx32
+232 stdcall GetDesktopWindow() GetDesktopWindow32
+233 stdcall GetDialogBaseUnits() GetDialogBaseUnits
+234 stdcall GetDlgCtrlID(long) GetDlgCtrlID32
+235 stdcall GetDlgItem(long long) GetDlgItem32
+236 stdcall GetDlgItemInt(long long ptr long) GetDlgItemInt32
+237 stdcall GetDlgItemTextA(long long ptr long) GetDlgItemText32A
+238 stdcall GetDlgItemTextW(long long ptr long) GetDlgItemText32W
+239 stdcall GetDoubleClickTime() GetDoubleClickTime32
+240 stdcall GetFocus() GetFocus32
+241 return GetForegroundWindow 0 0		#FIXME
+242 stub GetIconInfo
+243 stub GetInputDesktop
+244 stdcall GetInputState() GetInputState32
+245 stdcall GetInternalWindowPos(long ptr ptr) GetInternalWindowPos32
+246 stdcall GetKBCodePage() GetKBCodePage32
+247 stdcall GetKeyNameTextA(long ptr long) GetKeyNameText32A
+248 stdcall GetKeyNameTextW(long ptr long) GetKeyNameText32W
+249 stdcall GetKeyState(long) GetKeyState32
+250 stdcall GetKeyboardLayout(long) GetKeyboardLayout
+251 stdcall GetKeyboardLayoutList(long ptr) GetKeyboardLayoutList
+252 stub GetKeyboardLayoutNameA
+253 stub GetKeyboardLayoutNameW
+254 stdcall GetKeyboardState(ptr) GetKeyboardState
+255 stdcall GetKeyboardType(long) GetKeyboardType32
+256 stdcall GetLastActivePopup(long) GetLastActivePopup32
+257 stdcall GetMenu(long) GetMenu32
+258 stdcall GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions
+259 stub GetMenuContextHelpId
+260 stub GetMenuDefaultItem
+261 stub GetMenuIndex
+262 stdcall GetMenuItemCount(long) GetMenuItemCount32
+263 stdcall GetMenuItemID(long long) GetMenuItemID32
+264 stdcall GetMenuItemInfoA(long long long ptr) GetMenuItemInfo32A
+265 stdcall GetMenuItemInfoW(long long long ptr) GetMenuItemInfo32W
+266 stub GetMenuItemRect
+267 stdcall GetMenuState(long long long) GetMenuState32
+268 stdcall GetMenuStringA(long long ptr long long) GetMenuString32A
+269 stdcall GetMenuStringW(long long ptr long long) GetMenuString32W
+270 stdcall GetMessageA(ptr long long long) GetMessage32A
+271 stdcall GetMessageExtraInfo() GetMessageExtraInfo
+272 stdcall GetMessagePos() GetMessagePos
+273 stdcall GetMessageTime() GetMessageTime
+274 stdcall GetMessageW(ptr long long long) GetMessage32W
+275 stdcall GetNextDlgGroupItem(long long long) GetNextDlgGroupItem32
+276 stdcall GetNextDlgTabItem(long long long) GetNextDlgTabItem32
+277 stdcall GetOpenClipboardWindow() GetOpenClipboardWindow32
+278 stdcall GetParent(long) GetParent32
+279 stub GetPriorityClipboardFormat
+280 stub GetProcessWindowStation
+281 stdcall GetPropA(long ptr) GetProp32A
+282 stdcall GetPropW(long ptr) GetProp32W
+283 stub GetQueueStatus
+284 stdcall GetScrollInfo(long long ptr) GetScrollInfo32
+285 stdcall GetScrollPos(long long) GetScrollPos32
+286 stdcall GetScrollRange(long long ptr ptr) GetScrollRange32
+287 return GetShellWindow 0 0
+288 stdcall GetSubMenu(long long) GetSubMenu32
+289 stdcall GetSysColor(long) GetSysColor32
+290 stdcall GetSysColorBrush(long) GetSysColorBrush32
+291 stdcall GetSystemMenu(long long) GetSystemMenu32
+292 stdcall GetSystemMetrics(long) GetSystemMetrics32
+293 stdcall GetTabbedTextExtentA(long ptr long long ptr) GetTabbedTextExtent32A
+294 stdcall GetTabbedTextExtentW(long ptr long long ptr) GetTabbedTextExtent32W
+295 stub GetThreadDesktop
+296 stdcall GetTopWindow(long) GetTopWindow32
+297 stdcall GetUpdateRect(long ptr long) GetUpdateRect32
+298 stdcall GetUpdateRgn(long long long) GetUpdateRgn32
+299 stub GetUserObjectInformationA
+300 stub GetUserObjectInformationW
+301 stub GetUserObjectSecurity
+302 stdcall GetWindow(long long) GetWindow32
+303 stub GetWindowContextHelpId
+304 stdcall GetWindowDC(long) GetWindowDC32
+305 stdcall GetWindowLongA(long long) GetWindowLong32A
+306 stdcall GetWindowLongW(long long) GetWindowLong32W
+307 stdcall GetWindowPlacement(long ptr) GetWindowPlacement32
+308 stdcall GetWindowRect(long ptr) GetWindowRect32
+309 stdcall GetWindowTextA(long ptr long) GetWindowText32A
+310 stdcall GetWindowTextLengthA(long) GetWindowTextLength32A
+311 stdcall GetWindowTextLengthW(long) GetWindowTextLength32W
+312 stdcall GetWindowTextW(long ptr long) GetWindowText32W
+313 stdcall GetWindowThreadProcessId(long ptr) GetWindowThreadProcessId
+314 stdcall GetWindowWord(long long) GetWindowWord32
+315 stdcall GrayStringA(long long ptr long long long long long long) GrayString32A
+316 stdcall GrayStringW(long long ptr long long long long long long) GrayString32W
+317 stdcall HideCaret(long) HideCaret32
+318 stdcall HiliteMenuItem(long long long long) HiliteMenuItem32
+319 stub ImpersonateDdeClientWindow
+320 stdcall InSendMessage() InSendMessage32
+321 stdcall InflateRect(ptr long long) InflateRect32
+322 stdcall InsertMenuA(long long long long ptr) InsertMenu32A
+323 stdcall InsertMenuItemA(long long long ptr) InsertMenuItem32A
+324 stdcall InsertMenuItemW(long long long ptr) InsertMenuItem32W
+325 stdcall InsertMenuW(long long long long ptr) InsertMenu32W
+326 stub InternalGetWindowText
+327 stdcall IntersectRect(ptr ptr ptr) IntersectRect32
+328 stdcall InvalidateRect(long ptr long) InvalidateRect32
+329 stdcall InvalidateRgn(long long long) InvalidateRgn32
+330 stdcall InvertRect(long ptr) InvertRect32
+331 stdcall IsCharAlphaA(long) IsCharAlpha32A
+332 stdcall IsCharAlphaNumericA(long) IsCharAlphaNumeric32A
+333 stdcall IsCharAlphaNumericW(long) IsCharAlphaNumeric32W
+334 stdcall IsCharAlphaW(long) IsCharAlpha32W
+335 stdcall IsCharLowerA(long) IsCharLower32A
+336 stdcall IsCharLowerW(long) IsCharLower32W
+337 stdcall IsCharUpperA(long) IsCharUpper32A
+338 stdcall IsCharUpperW(long) IsCharUpper32W
+339 stdcall IsChild(long long) IsChild32
+340 stdcall IsClipboardFormatAvailable(long) IsClipboardFormatAvailable32
+341 stub IsDialogMessage
+342 stdcall IsDialogMessageA(long ptr) IsDialogMessage32A
+343 stdcall IsDialogMessageW(long ptr) IsDialogMessage32W
+344 stdcall IsDlgButtonChecked(long long) IsDlgButtonChecked32
+345 stdcall IsIconic(long) IsIconic32
+346 stdcall IsMenu(long) IsMenu32
+347 stdcall IsRectEmpty(ptr) IsRectEmpty32
+348 stdcall IsWindow(long) IsWindow32
+349 stdcall IsWindowEnabled(long) IsWindowEnabled32
+350 stdcall IsWindowUnicode(long) IsWindowUnicode
+351 stdcall IsWindowVisible(long) IsWindowVisible32
+352 stdcall IsZoomed(long) IsZoomed32
+353 stdcall KillSystemTimer(long long) KillSystemTimer32
+354 stdcall KillTimer(long long) KillTimer32
+355 stdcall LoadAcceleratorsA(long ptr) LoadAccelerators32A
+356 stdcall LoadAcceleratorsW(long ptr) LoadAccelerators32W
+357 stdcall LoadBitmapA(long ptr) LoadBitmap32A
+358 stdcall LoadBitmapW(long ptr) LoadBitmap32W
+359 stdcall LoadCursorA(long ptr) LoadCursor32A
+360 stub LoadCursorFromFileA
+361 stub LoadCursorFromFileW
+362 stdcall LoadCursorW(long ptr) LoadCursor32W
+363 stdcall LoadIconA(long ptr) LoadIcon32A
+364 stdcall LoadIconW(long ptr) LoadIcon32W
+365 stdcall LoadImageA(long ptr long long long long) LoadImage32A
+366 stdcall LoadImageW(long ptr long long long long) LoadImage32W
+367 stub LoadKeyboardLayoutA
+368 stub LoadKeyboardLayoutW
+369 stub LoadLocalFonts
+370 stdcall LoadMenuA(long ptr) LoadMenu32A
+371 stdcall LoadMenuIndirectA(ptr) LoadMenuIndirect32A
+372 stdcall LoadMenuIndirectW(ptr) LoadMenuIndirect32W
+373 stdcall LoadMenuW(long ptr) LoadMenu32W
+374 stub LoadRemoteFonts
+375 stdcall LoadStringA(long long ptr long) LoadString32A
+376 stdcall LoadStringW(long long ptr long) LoadString32W
+377 stub LockWindowStation
+378 stdcall LockWindowUpdate(long) LockWindowUpdate32
+378 stdcall LookupIconIdFromDirectory(ptr long) LookupIconIdFromDirectory
+379 stdcall LookupIconIdFromDirectoryEx(ptr long long long long) LookupIconIdFromDirectoryEx32
+381 stub MBToWCSEx
+382 stdcall MapDialogRect(long ptr) MapDialogRect32
+383 stdcall MapVirtualKeyA(long long) MapVirtualKey32A
+384 stub MapVirtualKeyExA
+385 stdcall MapVirtualKeyW(long long) MapVirtualKey32A
+386 stdcall MapWindowPoints(long long ptr long) MapWindowPoints32
+387 stub MenuItemFromPoint
+388 stub MenuWindowProcA
+389 stub MenuWindowProcW
+390 stdcall MessageBeep(long) MessageBeep32
+391 stdcall MessageBoxA(long ptr ptr long) MessageBox32A
+392 stdcall MessageBoxExA(long ptr ptr long long) MessageBoxEx32A
+393 stdcall MessageBoxExW(long ptr ptr long long) MessageBoxEx32W
+394 stub MessageBoxIndirectA
+395 stub MessageBoxIndirectW
+396 stdcall MessageBoxW(long ptr ptr long) MessageBox32W
+397 stdcall ModifyMenuA(long long long long ptr) ModifyMenu32A
+398 stdcall ModifyMenuW(long long long long ptr) ModifyMenu32W
+399 stdcall MoveWindow(long long long long long long) MoveWindow32
+400 stdcall MsgWaitForMultipleObjects(long ptr long long long) MsgWaitForMultipleObjects
+401 stdcall OemKeyScan(long) OemKeyScan
+402 stdcall OemToCharA(ptr ptr) OemToChar32A
+403 stdcall OemToCharBuffA(ptr ptr long) OemToCharBuff32A
+404 stdcall OemToCharBuffW(ptr ptr long) OemToCharBuff32W
+405 stdcall OemToCharW(ptr ptr) OemToChar32W
+406 stdcall OffsetRect(ptr long long) OffsetRect32
+407 stdcall OpenClipboard(long) OpenClipboard32
+408 stub OpenDesktopA
+409 stub OpenDesktopW
+410 stdcall OpenIcon(long) OpenIcon32
+411 stub OpenInputDesktop
+412 stub OpenWindowStationA
+413 stub OpenWindowStationW
+414 stub PackDDElParam
+415 stub PaintDesktop
+416 stdcall PeekMessageA(ptr long long long long) PeekMessage32A
+417 stdcall PeekMessageW(ptr long long long long) PeekMessage32W
+418 stub PlaySoundEvent
+419 stdcall PostMessageA(long long long long) PostMessage32A
+420 stdcall PostMessageW(long long long long) PostMessage32W
+421 stdcall PostQuitMessage(long) PostQuitMessage32
+422 stub PostThreadMessageA
+423 stub PostThreadMessageW
+424 stdcall PtInRect(ptr long long) PtInRect32
+425 stub QuerySendMessage
+426 stdcall RedrawWindow(long ptr long long) RedrawWindow32
+427 stdcall RegisterClassA(ptr) RegisterClass32A
+428 stdcall RegisterClassExA(ptr) RegisterClassEx32A
+429 stdcall RegisterClassExW(ptr) RegisterClassEx32W
+430 stdcall RegisterClassW(ptr) RegisterClass32W
+431 stdcall RegisterClipboardFormatA(ptr) RegisterClipboardFormat32A
+432 stdcall RegisterClipboardFormatW(ptr) RegisterClipboardFormat32W
+433 stub RegisterHotKey
+434 stub RegisterLogonProcess
+435 stub RegisterSystemThread
+436 stub RegisterTasklist
+437 stdcall RegisterWindowMessageA(ptr) RegisterWindowMessage32A
+438 stdcall RegisterWindowMessageW(ptr) RegisterWindowMessage32W
+439 stdcall ReleaseCapture() ReleaseCapture
+440 stdcall ReleaseDC(long long) ReleaseDC32
+441 stdcall RemoveMenu(long long long) RemoveMenu32
+442 stdcall RemovePropA(long ptr) RemoveProp32A
+443 stdcall RemovePropW(long ptr) RemoveProp32W
+444 stub ReplyMessage
+445 stub ResetDisplay
+446 stub ReuseDDElParam
+447 stdcall ScreenToClient(long ptr) ScreenToClient32
+448 stdcall ScrollChildren(long long long long) ScrollChildren32
+449 stdcall ScrollDC(long long long ptr ptr long ptr) ScrollDC32
+450 stdcall ScrollWindow(long long long ptr ptr) ScrollWindow32
+451 stdcall ScrollWindowEx(long long long ptr ptr long ptr long) ScrollWindowEx32
+452 stdcall SendDlgItemMessageA(long long long long long) SendDlgItemMessage32A
+453 stdcall SendDlgItemMessageW(long long long long long) SendDlgItemMessage32W
+454 stdcall SendMessageA(long long long long) SendMessage32A
+455 stub SendMessageCallbackA
+456 stub SendMessageCallbackW
+457 stub SendMessageTimeoutA
+458 stub SendMessageTimeoutW
+459 stdcall SendMessageW(long long long long) SendMessage32W
+460 stub SendNotifyMessageA
+461 stub SendNotifyMessageW
+462 stub ServerSetFunctionPointers
+463 stdcall SetActiveWindow(long) SetActiveWindow32
+464 stdcall SetCapture(long) SetCapture32
+465 stdcall SetCaretBlinkTime(long) SetCaretBlinkTime32
+466 stdcall SetCaretPos(long long) SetCaretPos32
+467 stdcall SetClassLongA(long long long) SetClassLong32A
+468 stdcall SetClassLongW(long long long) SetClassLong32W
+469 stdcall SetClassWord(long long long) SetClassWord32
+470 stdcall SetClipboardData(long long) SetClipboardData32
+471 stdcall SetClipboardViewer(long) SetClipboardViewer32
+472 stdcall SetCursor(long) SetCursor32
+473 stub SetCursorContents
+474 stdcall SetCursorPos(long long) SetCursorPos32
+475 stub SetDebugErrorLevel
+476 stdcall SetDeskWallPaper(ptr) SetDeskWallPaper32
+477 stdcall SetDlgItemInt(long long long long) SetDlgItemInt32
+478 stdcall SetDlgItemTextA(long long ptr) SetDlgItemText32A
+479 stdcall SetDlgItemTextW(long long ptr) SetDlgItemText32W
+480 stdcall SetDoubleClickTime(long) SetDoubleClickTime32
+481 stdcall SetFocus(long) SetFocus32
+482 return SetForegroundWindow 4 0
+483 stdcall SetInternalWindowPos(long long ptr ptr) SetInternalWindowPos32
+484 stdcall SetKeyboardState(ptr) SetKeyboardState
+485 stdcall SetLastErrorEx(long long) SetLastErrorEx
+486 stub SetLogonNotifyWindow
+487 stdcall SetMenu(long long) SetMenu32
+488 stub SetMenuContextHelpId
+489 stdcall SetMenuDefaultItem(long long long) SetMenuDefaultItem32
+490 stdcall SetMenuItemBitmaps(long long long long long) SetMenuItemBitmaps32
+491 stdcall SetMenuItemInfoA(long long long ptr) SetMenuItemInfo32A
+492 stdcall SetMenuItemInfoW(long long long ptr) SetMenuItemInfo32W
+493 stub SetMessageExtraInfo
+494 stdcall SetMessageQueue(long) SetMessageQueue32
+495 stdcall SetParent(long long) SetParent32
+496 stub SetProcessWindowStation
+497 stdcall SetPropA(long ptr long) SetProp32A
+498 stdcall SetPropW(long ptr long) SetProp32W
+499 stdcall SetRect(ptr long long long long) SetRect32
+500 stdcall SetRectEmpty(ptr) SetRectEmpty32
+501 stdcall SetScrollInfo(long long ptr long) SetScrollInfo32
+502 stdcall SetScrollPos(long long long long) SetScrollPos32
+503 stdcall SetScrollRange(long long long long long) SetScrollRange32
+504 stub SetShellWindow
+505 stdcall SetSysColors(long ptr ptr) SetSysColors32
+506 stub SetSysColorsTemp
+507 stub SetSystemCursor
+508 stdcall SetSystemMenu(long long) SetSystemMenu32
+509 stdcall SetSystemTimer(long long long ptr) SetSystemTimer32
+510 stub SetThreadDesktop
+511 stdcall SetTimer(long long long ptr) SetTimer32
+512 stub SetUserObjectInformationA
+513 stub SetUserObjectInformationW
+514 stub SetUserObjectSecurity
+515 stub SetWindowContextHelpId
+516 stub SetWindowFullScreenState
+517 stdcall SetWindowLongA(long long long) SetWindowLong32A
+518 stdcall SetWindowLongW(long long long) SetWindowLong32W
+519 stdcall SetWindowPlacement(long ptr) SetWindowPlacement32
+520 stdcall SetWindowPos(long long long long long long long) SetWindowPos32
+521 stub SetWindowStationUser
+522 stdcall SetWindowTextA(long ptr) SetWindowText32A
+523 stdcall SetWindowTextW(long ptr) SetWindowText32W
+524 stdcall SetWindowWord(long long long) SetWindowWord32
+525 stdcall SetWindowsHookA(long ptr) SetWindowsHook32A
+526 stdcall SetWindowsHookExA(long long long long) SetWindowsHookEx32A
+527 stdcall SetWindowsHookExW(long long long long) SetWindowsHookEx32W
+528 stdcall SetWindowsHookW(long long long long) SetWindowsHook32W
+529 stdcall ShowCaret(long) ShowCaret32
+530 stdcall ShowCursor(long) ShowCursor32
+531 stdcall ShowOwnedPopups(long long) ShowOwnedPopups32
+532 stdcall ShowScrollBar(long long long) ShowScrollBar32
+533 stub ShowStartGlass
+534 stdcall ShowWindow(long long) ShowWindow32
+535 stub ShowWindowAsync
+536 stdcall SubtractRect(ptr ptr ptr) SubtractRect32
+537 stdcall SwapMouseButton(long) SwapMouseButton32
+538 stub SwitchDesktop
+539 stdcall SwitchToThisWindow(long long) SwitchToThisWindow32
+540 stdcall SystemParametersInfoA(long long ptr long) SystemParametersInfo32A
+541 stdcall SystemParametersInfoW(long long ptr long) SystemParametersInfo32W
+542 stdcall TabbedTextOutA(long long long ptr long long ptr long) TabbedTextOut32A
+543 stdcall TabbedTextOutW(long long long ptr long long ptr long) TabbedTextOut32W
+544 stub TileChildWindows
+545 stub TileWindows
+546 stdcall ToAscii(long long ptr ptr long) ToAscii32
+547 stub ToAsciiEx
+548 stub ToUnicode
+549 stdcall TrackPopupMenu(long long long long long long ptr) TrackPopupMenu32
+550 stdcall TrackPopupMenuEx(long long long long long ptr) TrackPopupMenuEx
+551 stdcall TranslateAccelerator(long long ptr) TranslateAccelerator32
+552 stdcall TranslateAcceleratorA(long long ptr) TranslateAccelerator32
+553 stdcall TranslateAcceleratorW(long long ptr) TranslateAccelerator32
+554 stub TranslateCharsetInfo
+555 stdcall TranslateMDISysAccel(long ptr) TranslateMDISysAccel32
+556 stdcall TranslateMessage(ptr) TranslateMessage32
+557 stdcall UnhookWindowsHook(long ptr) UnhookWindowsHook32
+558 stdcall UnhookWindowsHookEx(long) UnhookWindowsHookEx32
+559 stdcall UnionRect(ptr ptr ptr) UnionRect32
+560 stub UnloadKeyboardLayout
+561 stub UnlockWindowStation
+562 stub UnpackDDElParam
+563 stdcall UnregisterClassA(ptr long) UnregisterClass32A
+564 stdcall UnregisterClassW(ptr long) UnregisterClass32W
+565 stub UnregisterHotKey
+566 stub UpdatePerUserSystemParameters
+567 stdcall UpdateWindow(long) UpdateWindow32
+568 stub UserClientDllInitialize
+569 stub UserRealizePalette
+570 stub UserRegisterWowHandlers
+571 stdcall ValidateRect(long ptr) ValidateRect32
+572 stdcall ValidateRgn(long long) ValidateRgn32
+573 stdcall VkKeyScanA(long) VkKeyScan32A
+574 stub VkKeyScanExA
+575 stub VkKeyScanExW
+576 stdcall VkKeyScanW(long) VkKeyScan32W
+577 stub WaitForInputIdle
+578 stdcall WaitMessage() WaitMessage
+579 stdcall WinHelpA(long ptr long long) WinHelp32A
+580 stdcall WinHelpW(long ptr long long) WinHelp32W
+581 stdcall WindowFromDC(long) WindowFromDC32
+582 stdcall WindowFromPoint(long long) WindowFromPoint32
+583 stub keybd_event
+584 stub mouse_event
+585 varargs wsprintfA() wsprintf32A
+586 varargs wsprintfW() wsprintf32W
+587 stdcall wvsprintfA(ptr ptr ptr) wvsprintf32A
+588 stdcall wvsprintfW(ptr ptr ptr) wvsprintf32W
 #late additions
-0588 stub ChangeDisplaySettingsA
-0589 stub ChangeDisplaySettingsW
-0590 stub EnumDesktopWindows
-0591 stub EnumDisplaySettingsA
-0592 stub EnumDisplaySettingsW
-0593 stub GetWindowRgn
-0594 stub MapVirtualKeyExW
-0595 stub RegisterServicesProcess
-0596 stub SetWindowRgn
-0597 stub ToUnicodeEx
-0598 stub DrawCaptionTempA
-0599 stub RegisterNetworkCapabilities
-0600 stub WNDPROC_CALLBACK
+589 stub ChangeDisplaySettingsA
+590 stub ChangeDisplaySettingsW
+591 stub EnumDesktopWindows
+592 stub EnumDisplaySettingsA
+593 stub EnumDisplaySettingsW
+594 stub GetWindowRgn
+595 stub MapVirtualKeyExW
+596 stub RegisterServicesProcess
+597 stub SetWindowRgn
+598 stub ToUnicodeEx
+599 stub DrawCaptionTempA
+600 stub RegisterNetworkCapabilities
+601 stub WNDPROC_CALLBACK
diff --git a/if1632/ver.spec b/if1632/ver.spec
index 11aa1e0..759f1ed 100644
--- a/if1632/ver.spec
+++ b/if1632/ver.spec
@@ -3,14 +3,14 @@
 
 #1 DLLENTRYPOINT
 
-2 pascal GetFileResourceSize(ptr segptr segptr ptr) GetFileResourceSize
-3 pascal GetFileResource(ptr segptr segptr long long ptr) GetFileResource
-6 pascal GetFileVersionInfoSize(ptr ptr) GetFileVersionInfoSize16
-7 pascal GetFileVersionInfo(ptr long long ptr) GetFileVersionInfo16
-8 pascal VerFindFile(word ptr ptr ptr ptr ptr ptr ptr) VerFindFile16
-9 pascal VerInstallFile(word ptr ptr ptr ptr ptr ptr ptr) VerInstallFile16
+2 pascal GetFileResourceSize(str segptr segptr ptr) GetFileResourceSize
+3 pascal GetFileResource(str segptr segptr long long ptr) GetFileResource
+6 pascal GetFileVersionInfoSize(str ptr) GetFileVersionInfoSize16
+7 pascal GetFileVersionInfo(str long long ptr) GetFileVersionInfo16
+8 pascal VerFindFile(word str str str ptr ptr ptr ptr) VerFindFile16
+9 pascal VerInstallFile(word str str str str str ptr ptr) VerInstallFile16
 10 pascal VerLanguageName(word ptr word) VerLanguageName16
-11 pascal VerQueryValue(segptr ptr ptr ptr) VerQueryValue16
+11 pascal VerQueryValue(segptr str ptr ptr) VerQueryValue16
 20 stub GETFILEVERSIONINFORAW
 #21 VERFTHK_THUNKDATA16
 #22 VERTHKSL_THUNKDATA16
diff --git a/if1632/winmm.spec b/if1632/winmm.spec
index 44a0691..3ee913f 100644
--- a/if1632/winmm.spec
+++ b/if1632/winmm.spec
@@ -1,6 +1,7 @@
 name winmm
 type win32
 
+0001 stub PlaySoundA
 0004 stub CloseDriver
 0005 stub DefDriverProc
 0006 stub DriverCallback
@@ -15,7 +16,6 @@
 0015 stub OpenDriver
 0016 stub OpenDriverA
 0017 stub PlaySound
-0001 stub PlaySoundA
 0018 stub PlaySoundW
 0019 stub SendDriverMessage
 0020 stub auxGetDevCapsA
diff --git a/if1632/winspool.spec b/if1632/winspool.spec
index ccc6dc7..41c15cd 100644
--- a/if1632/winspool.spec
+++ b/if1632/winspool.spec
@@ -1,127 +1,126 @@
 name	winspool
 type	win32
-base	100
 
-001 stub ADVANCEDSETUPDIALOG
-002 stub AbortPrinter
-003 stub AddFormA
-004 stub AddFormW
-005 stub AddJobA
-006 stub AddJobW
-007 stub AddMonitorA
-008 stub AddMonitorW
-009 stub AddPortA
-010 stub AddPortExA
-011 stub AddPortExW
-012 stub AddPortW
-013 stub AddPrintProcessorA
-014 stub AddPrintProcessorW
-015 stub AddPrintProvidorA
-016 stub AddPrintProvidorW
-017 stub AddPrinterA
-018 stub AddPrinterConnectionA
-019 stub AddPrinterConnectionW
-020 stub AddPrinterDriverA
-021 stub AddPrinterDriverW
-022 stub AddPrinterW
-023 stub AdvancedDocumentPropertiesA
-024 stub AdvancedDocumentPropertiesW
-025 stub AdvancedSetupDialog
-026 stub ClosePrinter
-027 stub ConfigurePortA
-028 stub ConfigurePortW
-029 stub ConnectToPrinterDlg
-030 stub CreatePrinterIC
-031 stub DEVICECAPABILITIES
-032 stub DEVICEMODE
-033 stub DeleteFormA
-034 stub DeleteFormW
-035 stub DeleteMonitorA
-036 stub DeleteMonitorW
-037 stub DeletePortA
-038 stub DeletePortW
-039 stub DeletePrintProcessorA
-040 stub DeletePrintProcessorW
-041 stub DeletePrintProvidorA
-042 stub DeletePrintProvidorW
-043 stub DeletePrinter
-044 stub DeletePrinterConnectionA
-045 stub DeletePrinterConnectionW
-046 stub DeletePrinterDriverA
-047 stub DeletePrinterDriverW
-048 stub DeletePrinterIC
-049 stub DevQueryPrint
-050 stub DeviceCapabilities
-051 stdcall DeviceCapabilitiesA(ptr ptr long ptr ptr) DeviceCapabilities32A
-052 stub DeviceCapabilitiesW
-053 stub DeviceMode
-054 stub DocumentEvent
-055 stdcall DocumentPropertiesA(long long ptr ptr ptr long) DocumentProperties32A
-056 stub DocumentPropertiesW
-057 stub EXTDEVICEMODE
-058 stub EndDocPrinter
-059 stub EndPagePrinter
-060 stub EnumFormsA
-061 stub EnumFormsW
-062 stub EnumJobsA
-063 stub EnumJobsW
-064 stub EnumMonitorsA
-065 stub EnumMonitorsW
-066 stub EnumPortsA
-067 stub EnumPortsW
-068 stub EnumPrintProcessorDatatypesA
-069 stub EnumPrintProcessorDatatypesW
-070 stub EnumPrintProcessorsA
-071 stub EnumPrintProcessorsW
-072 stub EnumPrinterDriversA
-073 stub EnumPrinterDriversW
-074 stub EnumPrintersA
-075 stub EnumPrintersW
-076 stub ExtDeviceMode
-077 stub FindClosePrinterChangeNotification
-078 stub FindFirstPrinterChangeNotification
-079 stub FindNextPrinterChangeNotification
-080 stub FreePrinterNotifyInfo
-081 stub GetFormA
-082 stub GetFormW
-083 stub GetJobA
-084 stub GetJobW
-085 stub GetPrintProcessorDirectoryA
-086 stub GetPrintProcessorDirectoryW
-087 stub GetPrinterA
-088 stub GetPrinterDataA
-089 stub GetPrinterDataW
-090 stub GetPrinterDriverA
-091 stub GetPrinterDriverDirectoryA
-092 stub GetPrinterDriverDirectoryW
-093 stub GetPrinterDriverW
-094 stub GetPrinterW
-095 stub InitializeDll
-096 stub OpenPrinterA
-097 stub OpenPrinterW
-098 stub PlayGdiScriptOnPrinterIC
-099 stub PrinterMessageBoxA
-100 stub PrinterMessageBoxW
-101 stub PrinterProperties
-102 stub ReadPrinter
-103 stub ResetPrinterA
-104 stub ResetPrinterW
-105 stub ScheduleJob
-106 stub SetAllocFailCount
-107 stub SetFormA
-108 stub SetFormW
-109 stub SetJobA
-110 stub SetJobW
-111 stub SetPrinterA
-112 stub SetPrinterDataA
-113 stub SetPrinterDataW
-114 stub SetPrinterW
-115 stub SpoolerDevQueryPrintW
-116 stub SpoolerInit
-117 stub StartDocDlgA
-118 stub StartDocDlgW
-119 stub StartDocPrinterA
-120 stub StartDocPrinterW
-121 stub StartPagePrinter
-122 stub WaitForPrinterChange
-123 stub WritePrinter
+101 stub ADVANCEDSETUPDIALOG
+102 stub AbortPrinter
+103 stub AddFormA
+104 stub AddFormW
+105 stub AddJobA
+106 stub AddJobW
+107 stub AddMonitorA
+108 stub AddMonitorW
+109 stub AddPortA
+110 stub AddPortExA
+111 stub AddPortExW
+112 stub AddPortW
+113 stub AddPrintProcessorA
+114 stub AddPrintProcessorW
+115 stub AddPrintProvidorA
+116 stub AddPrintProvidorW
+117 stub AddPrinterA
+118 stub AddPrinterConnectionA
+119 stub AddPrinterConnectionW
+120 stub AddPrinterDriverA
+121 stub AddPrinterDriverW
+122 stub AddPrinterW
+123 stub AdvancedDocumentPropertiesA
+124 stub AdvancedDocumentPropertiesW
+125 stub AdvancedSetupDialog
+126 stub ClosePrinter
+127 stub ConfigurePortA
+128 stub ConfigurePortW
+129 stub ConnectToPrinterDlg
+130 stub CreatePrinterIC
+131 stub DEVICECAPABILITIES
+132 stub DEVICEMODE
+133 stub DeleteFormA
+134 stub DeleteFormW
+135 stub DeleteMonitorA
+136 stub DeleteMonitorW
+137 stub DeletePortA
+138 stub DeletePortW
+139 stub DeletePrintProcessorA
+140 stub DeletePrintProcessorW
+141 stub DeletePrintProvidorA
+142 stub DeletePrintProvidorW
+143 stub DeletePrinter
+144 stub DeletePrinterConnectionA
+145 stub DeletePrinterConnectionW
+146 stub DeletePrinterDriverA
+147 stub DeletePrinterDriverW
+148 stub DeletePrinterIC
+149 stub DevQueryPrint
+150 stub DeviceCapabilities
+151 stdcall DeviceCapabilitiesA(ptr ptr long ptr ptr) DeviceCapabilities32A
+152 stub DeviceCapabilitiesW
+153 stub DeviceMode
+154 stub DocumentEvent
+155 stdcall DocumentPropertiesA(long long ptr ptr ptr long) DocumentProperties32A
+156 stub DocumentPropertiesW
+157 stub EXTDEVICEMODE
+158 stub EndDocPrinter
+159 stub EndPagePrinter
+160 stub EnumFormsA
+161 stub EnumFormsW
+162 stub EnumJobsA
+163 stub EnumJobsW
+164 stub EnumMonitorsA
+165 stub EnumMonitorsW
+166 stub EnumPortsA
+167 stub EnumPortsW
+168 stub EnumPrintProcessorDatatypesA
+169 stub EnumPrintProcessorDatatypesW
+170 stub EnumPrintProcessorsA
+171 stub EnumPrintProcessorsW
+172 stub EnumPrinterDriversA
+173 stub EnumPrinterDriversW
+174 stub EnumPrintersA
+175 stub EnumPrintersW
+176 stub ExtDeviceMode
+177 stub FindClosePrinterChangeNotification
+178 stub FindFirstPrinterChangeNotification
+179 stub FindNextPrinterChangeNotification
+180 stub FreePrinterNotifyInfo
+181 stub GetFormA
+182 stub GetFormW
+183 stub GetJobA
+184 stub GetJobW
+185 stub GetPrintProcessorDirectoryA
+186 stub GetPrintProcessorDirectoryW
+187 stub GetPrinterA
+188 stub GetPrinterDataA
+189 stub GetPrinterDataW
+190 stub GetPrinterDriverA
+191 stub GetPrinterDriverDirectoryA
+192 stub GetPrinterDriverDirectoryW
+193 stub GetPrinterDriverW
+194 stub GetPrinterW
+195 stub InitializeDll
+196 stub OpenPrinterA
+197 stub OpenPrinterW
+198 stub PlayGdiScriptOnPrinterIC
+199 stub PrinterMessageBoxA
+200 stub PrinterMessageBoxW
+201 stub PrinterProperties
+202 stub ReadPrinter
+203 stub ResetPrinterA
+204 stub ResetPrinterW
+205 stub ScheduleJob
+206 stub SetAllocFailCount
+207 stub SetFormA
+208 stub SetFormW
+209 stub SetJobA
+210 stub SetJobW
+211 stub SetPrinterA
+212 stub SetPrinterDataA
+213 stub SetPrinterDataW
+214 stub SetPrinterW
+215 stub SpoolerDevQueryPrintW
+216 stub SpoolerInit
+217 stub StartDocDlgA
+218 stub StartDocDlgW
+219 stub StartDocPrinterA
+220 stub StartDocPrinterW
+221 stub StartPagePrinter
+222 stub WaitForPrinterChange
+223 stub WritePrinter
diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec
index 48c1b4b..ea41aeb 100644
--- a/if1632/wprocs.spec
+++ b/if1632/wprocs.spec
@@ -12,6 +12,7 @@
 24 pascal16 TASK_Reschedule() TASK_Reschedule
 27 pascal EntryAddrProc(word word) EntryAddrProc
 28 pascal MyAlloc(word word word) MODULE_AllocateSegment
+29 pascal DefResourceHandler(word word word) NE_DefResourceHandler
 30 pascal FormatCharDlgProc(word word word long) FormatCharDlgProc
  
 # Interrupt vectors 0-255 are ordinals 100-355
diff --git a/if1632/wsock32.spec b/if1632/wsock32.spec
index 1b36974..6269b17 100644
--- a/if1632/wsock32.spec
+++ b/if1632/wsock32.spec
@@ -1,6 +1,5 @@
 name	wsock32
 type	win32
-base	0
 
 001 stdcall accept(long ptr ptr) WINSOCK_accept32
 002 stdcall bind(long ptr long) WINSOCK_bind32
diff --git a/include/bitmap.h b/include/bitmap.h
index 6ec1ad0..ae02e76 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -49,11 +49,13 @@
 }
 
   /* objects/bitmap.c */
-extern BOOL32 BITMAP_Init(void);
-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 BOOL32  BITMAP_Init(void);
+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 );
+extern INT32   BITMAP_GetBitsPadding( int width, int depth );
+extern INT32   BITMAP_GetBitsWidth( int width, int depth );
 
   /* objects/dib.c */
 extern int DIB_GetDIBWidthBytes( int width, int depth );
diff --git a/include/callback.h b/include/callback.h
index 4efb4e4..9bd9049 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -22,34 +22,36 @@
 
 #ifndef WINELIB
 
-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 );
-extern WORD CallTo16_word_www  ( FARPROC16, WORD, WORD, WORD );
-extern WORD CallTo16_word_wwl  ( FARPROC16, WORD, WORD, LONG );
-extern WORD CallTo16_word_wlw  ( FARPROC16, WORD, LONG, WORD );
-extern LONG CallTo16_long_wwl  ( FARPROC16, WORD, WORD, LONG );
-extern WORD CallTo16_word_llwl ( FARPROC16, LONG, LONG, WORD, LONG );
-extern LONG CallTo16_long_wwwl ( FARPROC16, WORD, WORD, WORD, LONG );
-extern WORD CallTo16_word_lwww ( FARPROC16, LONG, WORD, WORD, WORD );
-extern WORD CallTo16_word_wwll ( FARPROC16, WORD, WORD, LONG, LONG );
-extern WORD CallTo16_word_wllwl( FARPROC16, WORD, LONG, LONG, WORD, LONG );
-extern LONG CallTo16_long_lwwll( FARPROC16, LONG, WORD, WORD, LONG, LONG );
-extern WORD CallTo16_word_wwlll( FARPROC16, WORD, WORD, LONG, LONG, LONG );
-extern LONG CallTo16_long_lllllllwlwwwl( FARPROC16, LONG, LONG, LONG,
-                                         LONG, LONG, LONG, LONG, WORD, LONG,
-                                         WORD, WORD, WORD, LONG );
-extern WORD CallTo16_word_lwll ( FARPROC16, LONG, WORD, LONG, LONG);
-extern WORD CallTo16_word_lwlll( FARPROC16, LONG, WORD, LONG, LONG, LONG );
-extern WORD CallTo16_word_llll ( FARPROC16, LONG, LONG, LONG, LONG);
-extern LONG CallTo16_long_lwlll( FARPROC16, LONG, WORD, LONG, LONG, LONG );
-extern LONG CallTo16_long_lwwllwlllllw( FARPROC16, LONG, WORD, WORD, LONG, 
-				       LONG, WORD, LONG, LONG, LONG, LONG, 
-				       LONG, WORD);
+extern LONG CALLBACK CallTo16_regs_     (const CONTEXT *context);
+extern WORD CALLBACK CallTo16_word_     (FARPROC16);
+extern WORD CALLBACK CallTo16_word_w    (FARPROC16,WORD);
+extern LONG CALLBACK CallTo16_long_l    (FARPROC16,LONG);
+extern WORD CALLBACK CallTo16_word_ww   (FARPROC16,WORD,WORD);
+extern WORD CALLBACK CallTo16_word_wl   (FARPROC16,WORD,LONG);
+extern WORD CALLBACK CallTo16_word_ll   (FARPROC16,LONG,LONG);
+extern WORD CALLBACK CallTo16_word_www  (FARPROC16,WORD,WORD,WORD);
+extern WORD CALLBACK CallTo16_word_wwl  (FARPROC16,WORD,WORD,LONG);
+extern WORD CALLBACK CallTo16_word_wlw  (FARPROC16,WORD,LONG,WORD);
+extern LONG CALLBACK CallTo16_long_wwl  (FARPROC16,WORD,WORD,LONG);
+extern WORD CALLBACK CallTo16_word_llwl (FARPROC16,LONG,LONG,WORD,LONG);
+extern WORD CALLBACK CallTo16_word_lwll (FARPROC16,LONG,WORD,LONG,LONG);
+extern LONG CALLBACK CallTo16_long_wwwl (FARPROC16,WORD,WORD,WORD,LONG);
+extern LONG CALLBACK CallTo16_wndp_wwwl (FARPROC16,WORD,WORD,WORD,LONG);
+extern WORD CALLBACK CallTo16_word_lwww (FARPROC16,LONG,WORD,WORD,WORD);
+extern WORD CALLBACK CallTo16_word_wwll (FARPROC16,WORD,WORD,LONG,LONG);
+extern WORD CALLBACK CallTo16_word_wllwl(FARPROC16,WORD,LONG,LONG,WORD,LONG);
+extern LONG CALLBACK CallTo16_long_lwwll(FARPROC16,LONG,WORD,WORD,LONG,LONG);
+extern WORD CALLBACK CallTo16_word_wwlll(FARPROC16,WORD,WORD,LONG,LONG,LONG);
+extern WORD CALLBACK CallTo16_word_wwwww(FARPROC16,WORD,WORD,WORD,WORD,WORD);
+extern LONG CALLBACK CallTo16_wndp_lllllllwlwwwl(FARPROC16,LONG,LONG,LONG,LONG,
+                                                 LONG,LONG,LONG,WORD,LONG,WORD,
+                                                 WORD,WORD,LONG);
+extern WORD CALLBACK CallTo16_word_lwlll(FARPROC16,LONG,WORD,LONG,LONG,LONG);
+extern WORD CALLBACK CallTo16_word_llll (FARPROC16,LONG,LONG,LONG,LONG);
+extern LONG CALLBACK CallTo16_long_lwlll(FARPROC16,LONG,WORD,LONG,LONG,LONG);
+extern LONG CALLBACK CallTo16_long_lwwllwlllllw(FARPROC16,LONG,WORD,WORD,LONG,
+                                                LONG,WORD,LONG,LONG,LONG,LONG,
+                                                LONG,WORD);
 
 #define CallDriverProc( func, dwId, msg, hdrvr, lparam1, lparam2 ) \
     CallTo16_long_lwwll( func, dwId, msg, hdrvr, lparam1, lparam2 )
@@ -66,28 +68,20 @@
 /* List of the 32-bit callback functions. This list is used  */
 /* by the build program to generate the file if1632/callto32.S */
 
-extern LONG CallTo32_0( FARPROC32 );
-extern LONG CallTo32_1( FARPROC32, DWORD );
-extern LONG CallTo32_2( FARPROC32, DWORD, DWORD );
-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 )
-#define CallDLLEntryProc32( func, hmodule, a, b ) \
-    CallTo32_3( func, hmodule, a, b )
-#define CallWordBreakProc32A( func, lpch, ichCurrent, cch, code ) \
-    CallTo32_4( func, (DWORD)lpch, ichCurrent, cch, code )
-
+extern LONG CALLBACK CallTo32_0( FARPROC32 );
+extern LONG CALLBACK CallTo32_1( FARPROC32, DWORD );
+extern LONG CALLBACK CallTo32_2( FARPROC32, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_3( FARPROC32, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_4( FARPROC32, DWORD, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_5( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_6( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_7( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_8( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_9( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_10( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_11( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_12( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
+extern LONG CALLBACK CallTo32_13( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD );
 
 #else  /* WINELIB */
 
@@ -101,8 +95,6 @@
     (*func)( nExitType )
 #define CallWordBreakProc16( func, lpch, ichCurrent, cch, code ) \
     (*func)( lpch, ichCurrent, cch, code )
-#define CallWordBreakProc32A( func, lpch, ichCurrent, cch, code ) \
-    (*func)( lpch, ichCurrent, cch, code )
 
 #endif  /* WINELIB */
 
diff --git a/include/class.h b/include/class.h
index faa94c7..cf110aa 100644
--- a/include/class.h
+++ b/include/class.h
@@ -38,6 +38,6 @@
 extern void CLASS_DumpClass( CLASS *class );
 extern void CLASS_WalkClasses(void);
 extern void CLASS_FreeModuleClasses( HMODULE16 hModule );
-extern CLASS *CLASS_FindClassByAtom( ATOM atom, HINSTANCE16 hinstance );
+extern CLASS *CLASS_FindClassByAtom( ATOM atom, HINSTANCE32 hinstance );
 
 #endif  /* __WINE_CLASS_H */
diff --git a/include/commctrl.h b/include/commctrl.h
index 7e6d09d..80a3898 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -41,25 +41,18 @@
 #define CCS_BOTTOM            0x0003
 #define SBARS_SIZEGRIP        0x0100
 
-/* UpDown control */
+/* UpDown */
 
-#define UPDOWN_CLASS32A  "msctls_updown32"
-#define UPDOWN_CLASS32W  "msctls_updown32"
-#define UPDOWN_CLASS16   "msctls_updown"
-#define UPDOWN_CLASS WINELIB_NAME_AW(UPDOWN_CLASS)
+#define UPDOWN_CLASS32A       "msctls_updown32"
+#define UPDOWN_CLASS32W      L"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
@@ -74,7 +67,7 @@
 #define UDS_NOTHOUSANDS    0x0080
 
 #define UDN_FIRST          (0U-721)
-#define UDN_DELTAPOS       (UDN_FIRST - 1)
+#define UDN_DELTAPOS       (UDN_FIRST-1)
 
 #define UDM_SETRANGE       (WM_USER+101)
 #define UDM_GETRANGE       (WM_USER+102)
@@ -87,13 +80,28 @@
 #define UDM_SETBASE        (WM_USER+109)
 #define UDM_GETBASE        (WM_USER+110)
 
+/* Progress Bar */
+
+#define PROGRESS_CLASS32A   "msctls_progress32"
+#define PROGRESS_CLASS32W  L"msctls_progress32"
+#define PROGRESS_CLASS16    "msctls_progress"
+
+#define PROGRESS_CLASS      WINELIB_NAME_AW(PROGRESS_CLASS)
+
+#define PBM_SETRANGE        (WM_USER+1)
+#define PBM_SETPOS          (WM_USER+2)
+#define PBM_DELTAPOS        (WM_USER+3)
+#define PBM_SETSTEP         (WM_USER+4)
+#define PBM_STEPIT          (WM_USER+5)
+ 
 /* Functions prototypes */
 
 HWND32     WINAPI CreateStatusWindow32A(INT32,LPCSTR,HWND32,UINT32);
 HWND32     WINAPI CreateStatusWindow32W(INT32,LPCWSTR,HWND32,UINT32);
 #define    CreateStatusWindow WINELIB_NAME_AW(CreateStatusWindow)
-HWND32     WINAPI CreateUpDownControl(DWORD,INT32,INT32,INT32,INT32,HWND32,
-                                   INT32,HINSTANCE32,HWND32,INT32,INT32,INT32);
+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)
diff --git a/include/compobj.h b/include/compobj.h
index fb0d7ad..09fa2fc 100644
--- a/include/compobj.h
+++ b/include/compobj.h
@@ -1,14 +1,16 @@
 #if !defined(COMPOBJ_H)
 #define COMPOBJ_H
 
-struct tagCLSID {
-  DWORD	Data1;
-  WORD	Data2;
-  WORD  Data3;
-  BYTE	Data4[8];
+struct tagGUID
+{
+    DWORD Data1;
+    WORD  Data2;
+    WORD  Data3;
+    BYTE  Data4[8];
 };
 
-typedef struct tagCLSID CLSID;
+typedef struct tagGUID	GUID;
+typedef struct tagGUID	CLSID;
 
 OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR);
 OLESTATUS WINAPI CLSIDFromString(const LPCSTR, CLSID *);
diff --git a/include/debug.h b/include/debug.h
index 9cc2e9a..fc4dae8 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -63,6 +63,7 @@
 #undef DEBUG_OLE
 #undef DEBUG_PALETTE
 #undef DEBUG_PROFILE
+#undef DEBUG_PROGRESS
 #undef DEBUG_PROP
 #undef DEBUG_REG
 #undef DEBUG_REGION
@@ -148,6 +149,7 @@
 #define DEBUG_OLE
 #define DEBUG_PALETTE
 #define DEBUG_PROFILE
+#define DEBUG_PROGRESS
 #define DEBUG_PROP
 #define DEBUG_REG
 #define DEBUG_REGION
@@ -463,6 +465,11 @@
 #else
     0,
 #endif
+#ifdef DEBUG_PROGRESS
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_PROP
     1,
 #else
@@ -1337,8 +1344,21 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_prop if(!debug_msg_enabled[57]) ; else fprintf
-#define debugging_prop debug_msg_enabled[57]
+#define dprintf_progress if(!debug_msg_enabled[57]) ; else fprintf
+#define debugging_progress debug_msg_enabled[57]
+#else
+#ifdef DEBUG_PROGRESS
+#define dprintf_progress fprintf
+#define debugging_progress 1
+#else
+#define dprintf_progress while(0) fprintf
+#define debugging_progress 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_prop if(!debug_msg_enabled[58]) ; else fprintf
+#define debugging_prop debug_msg_enabled[58]
 #else
 #ifdef DEBUG_PROP
 #define dprintf_prop fprintf
@@ -1350,8 +1370,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_reg if(!debug_msg_enabled[58]) ; else fprintf
-#define debugging_reg debug_msg_enabled[58]
+#define dprintf_reg if(!debug_msg_enabled[59]) ; else fprintf
+#define debugging_reg debug_msg_enabled[59]
 #else
 #ifdef DEBUG_REG
 #define dprintf_reg fprintf
@@ -1363,8 +1383,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_region if(!debug_msg_enabled[59]) ; else fprintf
-#define debugging_region debug_msg_enabled[59]
+#define dprintf_region if(!debug_msg_enabled[60]) ; else fprintf
+#define debugging_region debug_msg_enabled[60]
 #else
 #ifdef DEBUG_REGION
 #define dprintf_region fprintf
@@ -1376,8 +1396,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_relay if(!debug_msg_enabled[60]) ; else fprintf
-#define debugging_relay debug_msg_enabled[60]
+#define dprintf_relay if(!debug_msg_enabled[61]) ; else fprintf
+#define debugging_relay debug_msg_enabled[61]
 #else
 #ifdef DEBUG_RELAY
 #define dprintf_relay fprintf
@@ -1389,8 +1409,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_resource if(!debug_msg_enabled[61]) ; else fprintf
-#define debugging_resource debug_msg_enabled[61]
+#define dprintf_resource if(!debug_msg_enabled[62]) ; else fprintf
+#define debugging_resource debug_msg_enabled[62]
 #else
 #ifdef DEBUG_RESOURCE
 #define dprintf_resource fprintf
@@ -1402,8 +1422,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_scroll if(!debug_msg_enabled[62]) ; else fprintf
-#define debugging_scroll debug_msg_enabled[62]
+#define dprintf_scroll if(!debug_msg_enabled[63]) ; else fprintf
+#define debugging_scroll debug_msg_enabled[63]
 #else
 #ifdef DEBUG_SCROLL
 #define dprintf_scroll fprintf
@@ -1415,8 +1435,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_selector if(!debug_msg_enabled[63]) ; else fprintf
-#define debugging_selector debug_msg_enabled[63]
+#define dprintf_selector if(!debug_msg_enabled[64]) ; else fprintf
+#define debugging_selector debug_msg_enabled[64]
 #else
 #ifdef DEBUG_SELECTOR
 #define dprintf_selector fprintf
@@ -1428,8 +1448,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_sem if(!debug_msg_enabled[64]) ; else fprintf
-#define debugging_sem debug_msg_enabled[64]
+#define dprintf_sem if(!debug_msg_enabled[65]) ; else fprintf
+#define debugging_sem debug_msg_enabled[65]
 #else
 #ifdef DEBUG_SEM
 #define dprintf_sem fprintf
@@ -1441,8 +1461,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_sendmsg if(!debug_msg_enabled[65]) ; else fprintf
-#define debugging_sendmsg debug_msg_enabled[65]
+#define dprintf_sendmsg if(!debug_msg_enabled[66]) ; else fprintf
+#define debugging_sendmsg debug_msg_enabled[66]
 #else
 #ifdef DEBUG_SENDMSG
 #define dprintf_sendmsg fprintf
@@ -1454,8 +1474,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_shm if(!debug_msg_enabled[66]) ; else fprintf
-#define debugging_shm debug_msg_enabled[66]
+#define dprintf_shm if(!debug_msg_enabled[67]) ; else fprintf
+#define debugging_shm debug_msg_enabled[67]
 #else
 #ifdef DEBUG_SHM
 #define dprintf_shm fprintf
@@ -1467,8 +1487,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_stress if(!debug_msg_enabled[67]) ; else fprintf
-#define debugging_stress debug_msg_enabled[67]
+#define dprintf_stress if(!debug_msg_enabled[68]) ; else fprintf
+#define debugging_stress debug_msg_enabled[68]
 #else
 #ifdef DEBUG_STRESS
 #define dprintf_stress fprintf
@@ -1480,8 +1500,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_string if(!debug_msg_enabled[68]) ; else fprintf
-#define debugging_string debug_msg_enabled[68]
+#define dprintf_string if(!debug_msg_enabled[69]) ; else fprintf
+#define debugging_string debug_msg_enabled[69]
 #else
 #ifdef DEBUG_STRING
 #define dprintf_string fprintf
@@ -1493,8 +1513,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_task if(!debug_msg_enabled[69]) ; else fprintf
-#define debugging_task debug_msg_enabled[69]
+#define dprintf_task if(!debug_msg_enabled[70]) ; else fprintf
+#define debugging_task debug_msg_enabled[70]
 #else
 #ifdef DEBUG_TASK
 #define dprintf_task fprintf
@@ -1506,8 +1526,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_text if(!debug_msg_enabled[70]) ; else fprintf
-#define debugging_text debug_msg_enabled[70]
+#define dprintf_text if(!debug_msg_enabled[71]) ; else fprintf
+#define debugging_text debug_msg_enabled[71]
 #else
 #ifdef DEBUG_TEXT
 #define dprintf_text fprintf
@@ -1519,8 +1539,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_timer if(!debug_msg_enabled[71]) ; else fprintf
-#define debugging_timer debug_msg_enabled[71]
+#define dprintf_timer if(!debug_msg_enabled[72]) ; else fprintf
+#define debugging_timer debug_msg_enabled[72]
 #else
 #ifdef DEBUG_TIMER
 #define dprintf_timer fprintf
@@ -1532,8 +1552,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_toolhelp if(!debug_msg_enabled[72]) ; else fprintf
-#define debugging_toolhelp debug_msg_enabled[72]
+#define dprintf_toolhelp if(!debug_msg_enabled[73]) ; else fprintf
+#define debugging_toolhelp debug_msg_enabled[73]
 #else
 #ifdef DEBUG_TOOLHELP
 #define dprintf_toolhelp fprintf
@@ -1545,8 +1565,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_tweak if(!debug_msg_enabled[73]) ; else fprintf
-#define debugging_tweak debug_msg_enabled[73]
+#define dprintf_tweak if(!debug_msg_enabled[74]) ; else fprintf
+#define debugging_tweak debug_msg_enabled[74]
 #else
 #ifdef DEBUG_TWEAK
 #define dprintf_tweak fprintf
@@ -1558,8 +1578,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_updown if(!debug_msg_enabled[74]) ; else fprintf
-#define debugging_updown debug_msg_enabled[74]
+#define dprintf_updown if(!debug_msg_enabled[75]) ; else fprintf
+#define debugging_updown debug_msg_enabled[75]
 #else
 #ifdef DEBUG_UPDOWN
 #define dprintf_updown fprintf
@@ -1571,8 +1591,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_ver if(!debug_msg_enabled[75]) ; else fprintf
-#define debugging_ver debug_msg_enabled[75]
+#define dprintf_ver if(!debug_msg_enabled[76]) ; else fprintf
+#define debugging_ver debug_msg_enabled[76]
 #else
 #ifdef DEBUG_VER
 #define dprintf_ver fprintf
@@ -1584,8 +1604,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_virtual if(!debug_msg_enabled[76]) ; else fprintf
-#define debugging_virtual debug_msg_enabled[76]
+#define dprintf_virtual if(!debug_msg_enabled[77]) ; else fprintf
+#define debugging_virtual debug_msg_enabled[77]
 #else
 #ifdef DEBUG_VIRTUAL
 #define dprintf_virtual fprintf
@@ -1597,8 +1617,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_vxd if(!debug_msg_enabled[77]) ; else fprintf
-#define debugging_vxd debug_msg_enabled[77]
+#define dprintf_vxd if(!debug_msg_enabled[78]) ; else fprintf
+#define debugging_vxd debug_msg_enabled[78]
 #else
 #ifdef DEBUG_VXD
 #define dprintf_vxd fprintf
@@ -1610,8 +1630,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win if(!debug_msg_enabled[78]) ; else fprintf
-#define debugging_win debug_msg_enabled[78]
+#define dprintf_win if(!debug_msg_enabled[79]) ; else fprintf
+#define debugging_win debug_msg_enabled[79]
 #else
 #ifdef DEBUG_WIN
 #define dprintf_win fprintf
@@ -1623,8 +1643,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win16drv if(!debug_msg_enabled[79]) ; else fprintf
-#define debugging_win16drv debug_msg_enabled[79]
+#define dprintf_win16drv if(!debug_msg_enabled[80]) ; else fprintf
+#define debugging_win16drv debug_msg_enabled[80]
 #else
 #ifdef DEBUG_WIN16DRV
 #define dprintf_win16drv fprintf
@@ -1636,8 +1656,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win32 if(!debug_msg_enabled[80]) ; else fprintf
-#define debugging_win32 debug_msg_enabled[80]
+#define dprintf_win32 if(!debug_msg_enabled[81]) ; else fprintf
+#define debugging_win32 debug_msg_enabled[81]
 #else
 #ifdef DEBUG_WIN32
 #define dprintf_win32 fprintf
@@ -1649,8 +1669,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_winsock if(!debug_msg_enabled[81]) ; else fprintf
-#define debugging_winsock debug_msg_enabled[81]
+#define dprintf_winsock if(!debug_msg_enabled[82]) ; else fprintf
+#define debugging_winsock debug_msg_enabled[82]
 #else
 #ifdef DEBUG_WINSOCK
 #define dprintf_winsock fprintf
@@ -1722,6 +1742,7 @@
     "ole",
     "palette",
     "profile",
+    "progress",
     "prop",
     "reg",
     "region",
diff --git a/include/debugger.h b/include/debugger.h
index bf9ee7a..9117373 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -265,7 +265,7 @@
 extern int DEBUG_ReadExecutableDbgInfo(void);
 
   /* debugger/msc.c */
-extern int DEBUG_RegisterDebugInfo(int, struct pe_data *pe,
+extern int DEBUG_RegisterDebugInfo(struct pe_data *pe,
 				   int, unsigned long, unsigned long);
 extern int DEBUG_ProcessDeferredDebug(void);
 extern int DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name);
diff --git a/include/handle32.h b/include/handle32.h
index 9fa3021..9e5fca0 100644
--- a/include/handle32.h
+++ b/include/handle32.h
@@ -40,8 +40,27 @@
     DWORD         refcount;
 } K32OBJ;
 
+/* Kernel object list entry */
+typedef struct _K32OBJ_ENTRY
+{
+    K32OBJ               *obj;
+    struct _K32OBJ_ENTRY *next;
+    struct _K32OBJ_ENTRY *prev;
+} K32OBJ_ENTRY;
+
+/* Kernel object list */
+typedef struct
+{
+    K32OBJ_ENTRY *head;
+    K32OBJ_ENTRY *tail;
+} K32OBJ_LIST;
+
 extern void K32OBJ_IncCount( K32OBJ *ptr );
 extern void K32OBJ_DecCount( K32OBJ *ptr );
+extern void K32OBJ_AddHead( K32OBJ_LIST *list, K32OBJ *ptr );
+extern void K32OBJ_AddTail( K32OBJ_LIST *list, K32OBJ *ptr );
+extern void K32OBJ_Remove( K32OBJ_LIST *list, K32OBJ *ptr );
+extern K32OBJ *K32OBJ_RemoveHead( K32OBJ_LIST *list );
 extern BOOL32 K32OBJ_AddName( K32OBJ *obj, LPCSTR name );
 extern K32OBJ *K32OBJ_FindName( LPCSTR name );
 extern K32OBJ *K32OBJ_FindNameType( LPCSTR name, K32OBJ_TYPE type );
diff --git a/include/module.h b/include/module.h
index 563a2d8..1416362 100644
--- a/include/module.h
+++ b/include/module.h
@@ -111,22 +111,25 @@
                     ((NE_WIN32_EXTRAINFO *)((pModule) + 1))->pe_module : 0))
 
 /* module.c */
-extern NE_MODULE *MODULE_GetPtr( HMODULE16 hModule );
-extern void MODULE_DumpModule( HMODULE16 hmodule );
+extern NE_MODULE *MODULE_GetPtr( HMODULE32 hModule );
+extern HMODULE16 MODULE_HANDLEtoHMODULE16( HANDLE32 handle );
+extern HMODULE32 MODULE_HANDLEtoHMODULE32( HANDLE32 handle );
+extern void MODULE_DumpModule( HMODULE32 hmodule );
 extern void MODULE_WalkModules(void);
-extern int MODULE_OpenFile( HMODULE16 hModule );
-extern LPSTR MODULE_GetModuleName( HMODULE16 hModule );
+extern int MODULE_OpenFile( HMODULE32 hModule );
+extern LPSTR MODULE_GetModuleName( HMODULE32 hModule );
 extern void MODULE_RegisterModule( NE_MODULE *pModule );
-extern HMODULE16 MODULE_FindModule( LPCSTR path );
-extern HINSTANCE16 MODULE_GetInstance( HMODULE16 hModule );
-extern HMODULE16 MODULE_CreateDummyModule( const OFSTRUCT *ofs );
-extern HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, BOOL32 first );
-extern WORD MODULE_GetOrdinal( HMODULE16 hModule, const char *name );
-extern FARPROC16 MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal );
-extern BOOL16 MODULE_SetEntryPoint( HMODULE16 hModule, WORD ordinal,
+extern HMODULE32 MODULE_FindModule( LPCSTR path );
+extern HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, LOADPARAMS* paramBlock );
+extern HINSTANCE16 MODULE_GetInstance( HMODULE32 hModule );
+extern HMODULE32 MODULE_CreateDummyModule( const OFSTRUCT *ofs );
+extern HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 flags );
+extern WORD MODULE_GetOrdinal( HMODULE32 hModule, const char *name );
+extern FARPROC16 MODULE_GetEntryPoint( HMODULE32 hModule, WORD ordinal );
+extern BOOL16 MODULE_SetEntryPoint( HMODULE32 hModule, WORD ordinal,
                                     WORD offset );
 extern FARPROC16 MODULE_GetWndProcEntry16( const char *name );
-extern FARPROC16 WIN32_GetProcAddress16( HMODULE16 hmodule, LPSTR name );
+extern FARPROC16 WIN32_GetProcAddress16( HMODULE32 hmodule, LPSTR name );
 
 /* builtin.c */
 extern BOOL16 BUILTIN_Init(void);
diff --git a/include/neexe.h b/include/neexe.h
index ead7623..5378fd9 100644
--- a/include/neexe.h
+++ b/include/neexe.h
@@ -88,6 +88,10 @@
 #define NE_FFLAGS_MULTIPLEDATA	0x0002
 #define NE_FFLAGS_WIN32         0x0010
 #define NE_FFLAGS_BUILTIN       0x0020  /* Wine built-in module */
+#define NE_FFLAGS_IMPLICIT	0x0040
+#define NE_FFLAGS_FRAMEBUF	0x0100  /* OS/2 fullscreen app */
+#define NE_FFLAGS_CONSOLE	0x0200  /* OS/2 console app */
+#define NE_FFLAGS_GUI		0x0300	/* right, (NE_FFLAGS_FRAMEBUF | NE_FFLAGS_CONSOLE) */
 #define NE_FFLAGS_SELFLOAD	0x0800
 #define NE_FFLAGS_LINKERROR	0x2000
 #define NE_FFLAGS_CALLWEP       0x4000
@@ -225,7 +229,7 @@
 {
     unsigned short type_id;	/* Type identifier */
     unsigned short count;	/* Number of resources of this type */
-    unsigned long  reserved;
+    DWORD	   resloader;	/* SetResourceHandler() */
     /*
      * Name info array.
      */
@@ -244,7 +248,4 @@
 #define NE_RSCTYPE_RCDATA		0x800a
 #define NE_RSCTYPE_STRING		0x8006
 
-int  load_typeinfo  (int, struct resource_typeinfo_s *);
-int  load_nameinfo  (int, struct resource_nameinfo_s *);
-
 #endif  /* __WINE_NEEXE_H */
diff --git a/include/pe_image.h b/include/pe_image.h
index 433bcdc..482c0f3 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -6,20 +6,34 @@
 #include "winnt.h"
 #include "peexe.h"
 
+/* This struct is used for loaded PE .dlls */
 struct pe_data {
-	LPIMAGE_NT_HEADERS			pe_header;
-	LPIMAGE_SECTION_HEADER			pe_seg;
-	LPIMAGE_IMPORT_DESCRIPTOR		pe_import;
-	LPIMAGE_EXPORT_DIRECTORY		pe_export;
-	LPIMAGE_RESOURCE_DIRECTORY		pe_resource;
-	LPIMAGE_BASE_RELOCATION			pe_reloc;
-	int base_addr;
-	int load_addr;
-	int vma_size;
+	LPIMAGE_NT_HEADERS	pe_header;
+	LPIMAGE_SECTION_HEADER	pe_seg;
+	HMODULE32		mappeddll;
 };
 
 typedef struct pe_data PE_MODULE;
 
+/* modreference used for attached processes
+ * all section are calculated here, relocations etc.
+ */
+struct pe_modref {
+	struct pe_modref		*next;
+	PE_MODULE			*pe_module;
+	unsigned long int		load_addr;
+	LPIMAGE_IMPORT_DESCRIPTOR	pe_import;
+	LPIMAGE_EXPORT_DIRECTORY	pe_export;
+	LPIMAGE_RESOURCE_DIRECTORY	pe_resource;
+	LPIMAGE_BASE_RELOCATION		pe_reloc;
+	int				flags;
+#define PE_MODREF_PROCESS_ATTACHED	0x00000001
+#define PE_MODREF_NO_DLL_CALLS		0x00000002
+#define PE_MODREF_RELOCS_DONE		0x00000004
+};
+
+typedef struct pe_modref PE_MODREF;
+
 extern int PE_unloadImage(HMODULE32 hModule);
 extern FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName);
 extern void my_wcstombs(char * result, u_short * source, int len);
@@ -31,7 +45,10 @@
 extern BOOL32 PE_EnumResourceLanguages32W(HMODULE32,LPCWSTR,LPCWSTR,ENUMRESLANGPROC32W,LONG);
 extern HRSRC32 PE_FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD);
 extern DWORD PE_SizeofResource32(HINSTANCE32,HRSRC32);
+extern HMODULE32 PE_LoadLibraryEx32A(LPCSTR,HFILE32,DWORD);
 extern HGLOBAL32 PE_LoadResource32(HINSTANCE32,HRSRC32);
-extern void PE_InitializeDLLs(HMODULE16,DWORD,LPVOID);
+
+struct _PDB32; /* forward definition */
+extern void PE_InitializeDLLs(struct _PDB32*,DWORD,LPVOID);
 
 #endif /* __WINE_PE_IMAGE_H */
diff --git a/include/peexe.h b/include/peexe.h
index bc13148..49d7cf9 100644
--- a/include/peexe.h
+++ b/include/peexe.h
@@ -323,7 +323,7 @@
 	DWORD	OffsetToData;
 	DWORD	Size;
 	DWORD	CodePage;
-	DWORD	Reserved;
+	DWORD	ResourceHandle;
 } IMAGE_RESOURCE_DATA_ENTRY,*LPIMAGE_RESOURCE_DATA_ENTRY;
 
 typedef struct _IMAGE_BASE_RELOCATION
diff --git a/include/process.h b/include/process.h
index dc6b421..3cbd14c 100644
--- a/include/process.h
+++ b/include/process.h
@@ -11,6 +11,7 @@
 #include "winbase.h"
 #include "winnt.h"
 #include "handle32.h"
+#include "pe_image.h"
 #include "task.h"
 
 /* Process handle entry */
@@ -71,7 +72,7 @@
     ENVDB           *env_db;           /* 40 Environment database */
     HANDLE_TABLE    *handle_table;     /* 44 Handle table */
     struct _PDB32   *parent;           /* 48 Parent process */
-    void            *modref_list;      /* 4c MODREF list */
+    PE_MODREF       *modref_list;      /* 4c MODREF list */
     void            *thread_list;      /* 50 List of threads */
     void            *debuggee_CB;      /* 54 Debuggee context block */
     void            *local_heap_free;  /* 58 Head of local heap free list */
@@ -82,7 +83,7 @@
     DWORD            tls_bits[2];      /* 88 TLS in-use bits */
     DWORD            process_dword;    /* 90 Unknown */
     struct _PDB32   *group;            /* 94 Process group */
-    void            *exe_modref;       /* 98 MODREF for the process EXE */
+    PE_MODREF       *exe_modref;       /* 98 MODREF for the process EXE */
     LPTOP_LEVEL_EXCEPTION_FILTER top_filter; /* 9c Top exception filter */
     DWORD            priority;         /* a0 Priority level */
     HANDLE32         heap_list;        /* a4 Head of process heap list */
@@ -101,7 +102,7 @@
 extern K32OBJ *PROCESS_GetObjPtr( HANDLE32 handle, K32OBJ_TYPE type );
 extern BOOL32 PROCESS_SetObjPtr( HANDLE32 handle, K32OBJ *ptr, DWORD flags );
 
-extern PDB32 *PROCESS_Create( TDB *pTask );
+extern PDB32 *PROCESS_Create( TDB *pTask, LPCSTR cmd_line );
 extern void PROCESS_Destroy( K32OBJ *ptr );
 
 extern PDB32 *pCurrentProcess;
diff --git a/include/progress.h b/include/progress.h
new file mode 100644
index 0000000..0aadb15
--- /dev/null
+++ b/include/progress.h
@@ -0,0 +1,23 @@
+/*
+ * Progress class extra info
+ *
+ * Copyright 1997 Dimitrie O. Paun
+ */
+
+#ifndef __WINE_PROGRESS_H
+#define __WINE_PROGRESS_H
+
+#include "windows.h"
+#include "commctrl.h"
+
+typedef struct
+{
+  INT32       CurVal;       /* Current progress value */
+  INT32       MinVal;       /* Minimum progress value */
+  INT32       MaxVal;       /* Maximum progress value */
+  INT32       Step;         /* Step to use on PMB_STEPIT */
+} PROGRESS_INFO;
+
+LRESULT WINAPI ProgressWindowProc(HWND32, UINT32, WPARAM32, LPARAM);
+
+#endif  /* __WINE_PROGRESS_H */
diff --git a/include/resource.h b/include/resource.h
index 02a6dd4..50bd60a 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -44,14 +44,21 @@
 #define WINE_CONSTRUCTOR
 #endif
 
+typedef HGLOBAL16 (CALLBACK *RESOURCEHANDLER16)(HGLOBAL16, HMODULE16, HRSRC16 );
+
+/* FIXME: convert all NE_ functions to accept NE_MODULE pointer instead
+ * of redundant hModule (which is always verified prior to calling these).
+ */
+
 extern int NE_AccessResource( HMODULE16 hModule, HRSRC16 hRsrc );
 extern BOOL32 NE_FreeResource( HMODULE16 hModule, HGLOBAL16 handle );
 extern HRSRC16 NE_FindResource(HMODULE16 hModule, SEGPTR typeId, SEGPTR resId);
 extern DWORD NE_SizeofResource( HMODULE16 hModule, HRSRC16 hRsrc );
 extern SEGPTR NE_LockResource( HMODULE16 hModule, HGLOBAL16 handle );
-extern HGLOBAL16 NE_AllocResource( HMODULE16 hModule, HRSRC16 hRsrc,
-                                   DWORD size );
+extern HGLOBAL16 NE_AllocResource( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size );
 extern HGLOBAL16 NE_LoadResource( HMODULE16 hModule,  HRSRC16 hRsrc );
+extern BOOL32 NE_InitResourceHandler( HMODULE16 hModule );
+extern FARPROC32 NE_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, FARPROC32 handler);
 
 extern HGLOBAL16 SYSRES_LoadResource( SYSTEM_RESOURCE id );
 extern void SYSRES_FreeResource( HGLOBAL16 handle );
diff --git a/include/spy.h b/include/spy.h
index a221ab8..bb6f776 100644
--- a/include/spy.h
+++ b/include/spy.h
@@ -18,6 +18,9 @@
 #define SPY_RESULT_OK32           0x0001
 #define SPY_RESULT_INVALIDHWND16  0x0002
 #define SPY_RESULT_INVALIDHWND32  0x0003
+#define SPY_RESULT_DEFWND16       0x0004
+#define SPY_RESULT_DEFWND32       0x0005
+
 
 extern const char *SPY_GetMsgName( UINT32 msg );
 extern void SPY_EnterMessage( INT32 iFlag, HWND32 hwnd, UINT32 msg,
diff --git a/include/stackframe.h b/include/stackframe.h
index 1e3711e..09cdb85 100644
--- a/include/stackframe.h
+++ b/include/stackframe.h
@@ -37,9 +37,10 @@
     DWORD   edx;
     DWORD   ecx;
     DWORD   ebx;
+    DWORD   restore_addr;   /* return address for restoring code selector */
+    DWORD   codeselector;   /* code selector to restore */
     DWORD   ebp;            /* saved 32-bit frame pointer */
-    DWORD   retaddr;        /* return address */
-    DWORD   codeselector;   /* code selector for return address */
+    DWORD   retaddr;        /* actual return address */
     DWORD   args[1];        /* arguments to 16-bit function */
 } STACK32FRAME;
 
diff --git a/include/stddebug.h b/include/stddebug.h
index 819ae53..c5ac25b 100644
--- a/include/stddebug.h
+++ b/include/stddebug.h
@@ -133,6 +133,7 @@
 #undef DEBUG_OLE
 #undef DEBUG_PALETTE
 #undef DEBUG_PROFILE
+#undef DEBUG_PROGRESS
 #undef DEBUG_PROP
 #undef DEBUG_REG
 #undef DEBUG_REGION
@@ -218,6 +219,7 @@
 #define DEBUG_OLE
 #define DEBUG_PALETTE
 #define DEBUG_PROFILE
+#define DEBUG_PROGRESS
 #define DEBUG_PROP
 #define DEBUG_REG
 #define DEBUG_REGION
diff --git a/include/struct32.h b/include/struct32.h
index 81a60e1..70875bf 100644
--- a/include/struct32.h
+++ b/include/struct32.h
@@ -23,45 +23,4 @@
                                       MDICREATESTRUCT16*);
 void STRUCT32_MDICREATESTRUCT16to32A( const MDICREATESTRUCT16*,
                                       MDICREATESTRUCT32A*);
-
-#pragma pack(1)
-
-typedef struct {
-	BYTE   bWidth;
-	BYTE   bHeight;
-	BYTE   bColorCount;
-	BYTE   bReserved;
-	WORD   wPlanes;
-	WORD   wBitCount;
-	DWORD  dwBytesInRes;
-	WORD   wResId WINE_PACKED;
-	/*WORD   padding;	Spec is wrong, no padding here*/
-} ICONDIRENTRY32;
-
-typedef struct {
-	WORD   wWidth;
-	WORD   wHeight;
-	WORD   wPlanes;
-	WORD   wBitCount;
-	DWORD  dwBytesInRes;
-	WORD   wResId WINE_PACKED;
-	/*WORD   padding;*/
-} CURSORDIRENTRY32;
-
-typedef union{
-	ICONDIRENTRY32	icon;
-	CURSORDIRENTRY32	cursor;
-} CURSORICONDIRENTRY32;
-
-typedef struct {
-	WORD    idReserved;
-	WORD    idType;
-	WORD    idCount;
-	/*WORD	padding;*/
-	CURSORICONDIRENTRY32	idEntries[1];
-} CURSORICONDIR32;
-
-
-#pragma pack(4)
-
 #endif  /* __WINE_STRUCT32_H */
diff --git a/include/syscolor.h b/include/syscolor.h
index f8bd654..a212336 100644
--- a/include/syscolor.h
+++ b/include/syscolor.h
@@ -32,6 +32,10 @@
                                      /* COLOR_BTNTEXT             */
                                      /* COLOR_INACTIVECAPTIONTEXT */
     HBRUSH32 hbrushBtnHighlight;     /* COLOR_BTNHIGHLIGHT        */
+                                     /* COLOR_3DDKSHADOW          */
+                                     /* COLOR_3DLIGHT             */
+                                     /* COLOR_INFOTEXT            */
+                                     /* COLOR_INFOBK              */
 };
 
 extern void SYSCOLOR_Init(void);
diff --git a/include/task.h b/include/task.h
index 5712979..1fe0a2c 100644
--- a/include/task.h
+++ b/include/task.h
@@ -51,11 +51,15 @@
 struct _THDB;
 struct _WSINFO;
 
+  /* signal proc typedef */
+typedef void (CALLBACK *USERSIGNALPROC)(HANDLE16, UINT16, UINT16,
+                                        HINSTANCE16, HQUEUE16);
+
   /* 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
+typedef struct _TDB
 {
     HTASK16   hNext;                      /* 00 Selector of next TDB */
     DWORD     ss_sp WINE_PACKED;          /* 02 Stack pointer of task */
@@ -75,7 +79,7 @@
     HTASK16   hParent;                    /* 22 Selector of TDB of parent */
     WORD      signal_flags;               /* 24 Flags for signal handler */
     FARPROC16 sighandler WINE_PACKED;     /* 26 Signal handler */
-    FARPROC16 userhandler WINE_PACKED;    /* 2a USER signal handler */
+    USERSIGNALPROC userhandler WINE_PACKED; /* 2a USER signal handler */
     FARPROC16 discardhandler WINE_PACKED; /* 2e Handler for GlobalNotify() */
     DWORD     int0 WINE_PACKED;           /* 32 int 0 (divide by 0) handler */
     DWORD     int2 WINE_PACKED;           /* 36 int 2 (NMI) handler */
@@ -112,6 +116,12 @@
 #define TDBF_OS2APP     0x0008
 #define TDBF_WIN32      0x0010
 
+  /* USER signals */
+#define USIG_TERMINATION	0x0020
+#define USIG_DLL_LOAD		0x0040
+#define USIG_DLL_UNLOAD		0x0080
+#define USIG_GPF		0x0666
+
 #pragma pack(4)
 
 extern BOOL32 TASK_Init(void);
diff --git a/include/thread.h b/include/thread.h
index ec3fa4a..347019e 100644
--- a/include/thread.h
+++ b/include/thread.h
@@ -79,6 +79,8 @@
 extern THDB *THREAD_Create( PDB32 *pdb, DWORD stack_size,
                             LPTHREAD_START_ROUTINE start_addr );
 extern void THREAD_Destroy( K32OBJ *ptr );
+extern THDB *THREAD_Current(void);
+extern THDB *THREAD_SwitchThread( CONTEXT *context );
 
 extern THDB *pCurrentThread;
 
diff --git a/include/updown.h b/include/updown.h
index 07b132e..bb56e13 100644
--- a/include/updown.h
+++ b/include/updown.h
@@ -22,7 +22,14 @@
   INT32       Flags;        /* Internal Flags FLAG_* */
 } UPDOWN_INFO;
 
-LRESULT WINAPI UpDownWindowProc( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
-                                 LPARAM lParam);
+typedef struct tagNM_UPDOWN
+{
+  NMHDR hdr;
+  int iPos;
+  int iDelta;
+} NM_UPDOWN;
+
+LRESULT WINAPI UpDownWindowProc(HWND32 hwnd, UINT32 message, WPARAM32 wParam,
+                                LPARAM lParam);
 
 #endif  /* __WINE_UPDOWN_H */
diff --git a/include/user.h b/include/user.h
index cfb068b..68e023f 100644
--- a/include/user.h
+++ b/include/user.h
@@ -23,4 +23,6 @@
 #define USER_HEAP_SEG_ADDR(handle)  \
          ((handle) ? PTR_SEG_OFF_TO_SEGPTR(USER_HeapSel, (handle)) : (SEGPTR)0)
 
+void USER_SignalProc(HANDLE16, UINT16, UINT16, HINSTANCE16, HQUEUE16);
+
 #endif  /* __WINE_USER_H */
diff --git a/include/win.h b/include/win.h
index c952000..128a20f 100644
--- a/include/win.h
+++ b/include/win.h
@@ -61,7 +61,7 @@
     HWINDOWPROC    winproc;       /* Window procedure */
     DWORD          dwMagic;       /* Magic number (must be WND_MAGIC) */
     HWND32         hwndSelf;      /* Handle of this window */
-    HINSTANCE16    hInstance;     /* Window hInstance (from CreateWindow) */
+    HINSTANCE32    hInstance;     /* Window hInstance (from CreateWindow) */
     RECT32         rectClient;    /* Client area rel. to parent client area */
     RECT32         rectWindow;    /* Whole window rel. to parent client area */
     LPSTR          text;          /* Window text */
@@ -119,14 +119,12 @@
 extern BOOL32 WIN_UnlinkWindow( HWND32 hwnd );
 extern BOOL32 WIN_LinkWindow( HWND32 hwnd, HWND32 hwndInsertAfter );
 extern HWND32 WIN_FindWinToRepaint( HWND32 hwnd, HQUEUE16 hQueue );
-extern void   WIN_SendParentNotify( HWND32 hwnd, WORD event,
-                                    WORD idChild, LPARAM lValue );
-extern void   WIN_ResetQueueWindows( WND* wnd, HQUEUE16 hQueue, HQUEUE16 hNew );
+extern BOOL32 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 HINSTANCE32 WIN_GetWindowInstance( HWND32 hwnd );
 extern WND**  WIN_BuildWinArray( WND *wndPtr, UINT32 bwa, UINT32* pnum );
 
 extern void DEFWND_SetText( WND *wndPtr, LPCSTR text );		      /* windows/defwnd.c */
diff --git a/include/windows.h b/include/windows.h
index 139c33b..e2afd45 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -5,6 +5,7 @@
 extern "C" {
 #endif
 
+#include <stdarg.h>
 #include "wintypes.h"
 
 #pragma pack(1)
@@ -904,6 +905,16 @@
 #define COLOR_BTNTEXT		   18
 #define COLOR_INACTIVECAPTIONTEXT  19
 #define COLOR_BTNHIGHLIGHT         20
+#define COLOR_3DDKSHADOW           21
+#define COLOR_3DLIGHT              22
+#define COLOR_INFOTEXT             23
+#define COLOR_INFOBK               24
+#define COLOR_DESKTOP              COLOR_BACKGROUND
+#define COLOR_3DFACE               COLOR_BTNFACE
+#define COLOR_3DSHADOW             COLOR_BTNSHADOW
+#define COLOR_3DHIGHLIGHT          COLOR_BTNHIGHLIGHT
+#define COLOR_3DHILIGHT            COLOR_BTNHIGHLIGHT
+#define COLOR_BTNHILIGHT           COLOR_BTNHIGHLIGHT
 
   /* WM_CTLCOLOR values */
 #define CTLCOLOR_MSGBOX             0
@@ -968,6 +979,10 @@
 #define BS_PATTERN	    3
 #define BS_INDEXED	    4
 #define	BS_DIBPATTERN	    5
+#define	BS_DIBPATTERNPT	    6
+#define BS_PATTERN8X8	    7
+#define	BS_DIBPATTERN8X8    8
+#define BS_MONOPATTERN      9
 
   /* Hatch styles */
 #define HS_HORIZONTAL       0
@@ -1875,6 +1890,15 @@
 #define DIB_PAL_COLORS   1
 #define CBM_INIT         4
 
+typedef struct 
+{
+	BITMAP32		dsBm;
+	BITMAPINFOHEADER	dsBmih;
+	DWORD			dsBitfields[3];
+	HANDLE32		dshSection;
+	DWORD			dsOffset;
+} DIBSECTION,*LPDIBSECTION;
+
 
   /* Cursors / Icons */
 
@@ -4618,6 +4642,15 @@
 #define HELP_PARTIALKEY     0x0105
 #define HELP_MULTIKEY       0x0201
 #define HELP_SETWINPOS      0x0203
+#define HELP_CONTEXTMENU    0x000a
+#define HELP_FINDER	    0x000b
+#define HELP_WM_HELP	    0x000c
+#define HELP_SETPOPUP_POS   0x000d
+
+#define HELP_TCARD	    0x8000
+#define HELP_TCARD_DATA	    0x0010
+#define HELP_TCARD_OTHER_CALLER 0x0011
+
 
 /* ExitWindows() flags */
 #define EW_RESTARTWINDOWS   0x0042
@@ -5168,6 +5201,15 @@
     UINT32  code;
 } NMHDR, *LPNMHDR;
 
+typedef struct
+{
+	UINT32	cbSize;
+	INT32	iTabLength;
+	INT32	iLeftMargin;
+	INT32	iRightMargin;
+	UINT32	uiLengthDrawn;
+} DRAWTEXTPARAMS,*LPDRAWTEXTPARAMS;
+
 #pragma pack(4)
 
 /* Declarations for functions that exist only in Win16 */
@@ -5260,9 +5302,13 @@
 BOOL16      WINAPI IsSharedSelector(HANDLE16);
 BOOL16      WINAPI IsTask(HTASK16);
 HTASK16     WINAPI IsTaskLocked(void);
+BOOL16      WINAPI IsUserIdle(void);
 BOOL16      WINAPI IsValidMetaFile(HMETAFILE16);
 VOID        WINAPI LogError(UINT16, LPVOID);
 VOID        WINAPI LogParamError(UINT16,FARPROC16,LPVOID);
+HGLOBAL16   WINAPI LoadCursorIconHandler(HGLOBAL16,HMODULE16,HRSRC16);
+HGLOBAL16   WINAPI LoadDIBCursorHandler(HGLOBAL16,HMODULE16,HRSRC16);
+HGLOBAL16   WINAPI LoadDIBIconHandler(HGLOBAL16,HMODULE16,HRSRC16);
 WORD        WINAPI LocalCountFree(void);
 WORD        WINAPI LocalHandleDelta(WORD);
 WORD        WINAPI LocalHeapSize(void);
@@ -5290,7 +5336,7 @@
 INT16       WINAPI SelectVisRgn(HDC16,HRGN16);
 DWORD       WINAPI SetBitmapDimension(HBITMAP16,INT16,INT16);
 DWORD       WINAPI SetBrushOrg(HDC16,INT16,INT16);
-UINT16*     WINAPI SetCommEventMask(INT16,UINT16);
+SEGPTR      WINAPI SetCommEventMask(INT16,UINT16);
 BOOL16      WINAPI SetDCHook(HDC16,FARPROC16,DWORD);
 DWORD       WINAPI SetDCOrg(HDC16,INT16,INT16);
 VOID        WINAPI SetDCState(HDC16,HDC16);
@@ -5582,7 +5628,11 @@
 LONG        WINAPI GetMessageExtraInfo(void);
 DWORD       WINAPI GetMessagePos(void);
 LONG        WINAPI GetMessageTime(void);
+LANGID      WINAPI GetSystemDefaultLangID(void);
+LCID        WINAPI GetSystemDefaultLCID(void);
 DWORD       WINAPI GetTickCount(void);
+LANGID      WINAPI GetUserDefaultLangID(void);
+LCID        WINAPI GetUserDefaultLCID(void);
 ATOM        WINAPI GlobalDeleteAtom(ATOM);
 VOID        WINAPI LZDone(void);
 DWORD       WINAPI OemKeyScan(WORD);
@@ -5752,7 +5802,7 @@
 INT16       WINAPI ClearCommBreak16(INT16);
 BOOL32      WINAPI ClearCommBreak32(INT32);
 #define     ClearCommBreak WINELIB_NAME(ClearCommBreak)
-BOOL16      WINAPI ClientToScreen16(HWND16,LPPOINT16);
+VOID        WINAPI ClientToScreen16(HWND16,LPPOINT16);
 BOOL32      WINAPI ClientToScreen32(HWND32,LPPOINT32);
 #define     ClientToScreen WINELIB_NAME(ClientToScreen)
 BOOL16      WINAPI ClipCursor16(const RECT16*);
@@ -5889,6 +5939,9 @@
 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)
+HICON16     WINAPI CreateIconFromResourceEx16(LPBYTE,UINT16,BOOL16,DWORD,INT16,INT16,UINT16);
+HICON32     WINAPI CreateIconFromResourceEx32(LPBYTE,UINT32,BOOL32,DWORD,INT32,INT32,UINT32);
+#define     CreateIconFromResourceEx WINELIB_NAME(CreateIconFromResourceEx)
 HMENU16     WINAPI CreateMenu16(void);
 HMENU32     WINAPI CreateMenu32(void);
 #define     CreateMenu WINELIB_NAME(CreateMenu)
@@ -6477,7 +6530,7 @@
 #define     GetModuleFileName WINELIB_NAME_AW(GetModuleFileName)
 HMODULE16   WINAPI GetModuleHandle16(LPCSTR);
 HMODULE32   WINAPI GetModuleHandle32A(LPCSTR);
-HMODULE32   WINAPI GetModuleHandle32W(LPCSTR);
+HMODULE32   WINAPI GetModuleHandle32W(LPCWSTR);
 #define     GetModuleHandle WINELIB_NAME_AW(GetModuleHandle)
 DWORD       WINAPI GetNearestColor16(HDC16,DWORD);
 DWORD       WINAPI GetNearestColor32(HDC32,DWORD);
@@ -6910,9 +6963,12 @@
 HICON32     WINAPI LoadIcon32W(HINSTANCE32,LPCWSTR);
 #define     LoadIcon WINELIB_NAME_AW(LoadIcon)
 HINSTANCE16 WINAPI LoadLibrary16(LPCSTR);
-HINSTANCE32 WINAPI LoadLibrary32A(LPCSTR);
-HINSTANCE32 WINAPI LoadLibrary32W(LPCWSTR);
+HMODULE32   WINAPI LoadLibrary32A(LPCSTR);
+HMODULE32   WINAPI LoadLibrary32W(LPCWSTR);
 #define     LoadLibrary WINELIB_NAME_AW(LoadLibrary)
+HMODULE32   WINAPI LoadLibraryEx32A(LPCSTR,HFILE32,DWORD);
+HMODULE32   WINAPI LoadLibraryEx32W(LPCWSTR,HFILE32,DWORD);
+#define     LoadLibraryEx WINELIB_NAME_AW(LoadLibraryEx)
 HMENU16     WINAPI LoadMenu16(HINSTANCE16,SEGPTR);
 HMENU32     WINAPI LoadMenu32A(HINSTANCE32,LPCSTR);
 HMENU32     WINAPI LoadMenu32W(HINSTANCE32,LPCWSTR);
@@ -7699,12 +7755,12 @@
 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);
+INT32       WINAPI wvsnprintf32A(LPSTR,UINT32,LPCSTR,va_list);
+INT32       WINAPI wvsnprintf32W(LPWSTR,UINT32,LPCWSTR,va_list);
 #define     wvsnprintf WINELIB_NAME_AW(wvsnprintf)
 INT16       WINAPI wvsprintf16(LPSTR,LPCSTR,LPCVOID);
-INT32       WINAPI wvsprintf32A(LPSTR,LPCSTR,LPCVOID);
-INT32       WINAPI wvsprintf32W(LPWSTR,LPCWSTR,LPCVOID);
+INT32       WINAPI wvsprintf32A(LPSTR,LPCSTR,va_list);
+INT32       WINAPI wvsprintf32W(LPWSTR,LPCWSTR,va_list);
 #define     wvsprintf WINELIB_NAME_AW(wvsprintf)
 LONG        WINAPI _hread16(HFILE16,LPVOID,LONG);
 LONG        WINAPI _hread32(HFILE32,LPVOID,LONG);
diff --git a/include/winnls.h b/include/winnls.h
index b0bb86b..11704ab 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -1,6 +1,10 @@
 #ifndef __WINE_WINNLS_H
 #define __WINE_WINNLS_H
 
+/* flags to GetLocaleInfo */
+#define	LOCALE_NOUSEROVERRIDE	    0x80000000
+#define	LOCALE_USE_CP_ACP	    0x40000000
+
 /* When adding new defines, don't forget to add an entry to the
  * locale2id map in misc/ole2nls.c
  */
@@ -103,6 +107,8 @@
 #define LOCALE_IPOSSEPBYSPACE       0x00000055   
 #define LOCALE_INEGSYMPRECEDES      0x00000056   
 #define LOCALE_INEGSEPBYSPACE       0x00000057   
+#define	LOCALE_FONTSIGNATURE        0x00000058
+
 
 #define NORM_IGNORECASE				1
 #define NORM_IGNORENONSPACE			2
@@ -129,4 +135,15 @@
 #define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))
 #define LOCALE_USER_DEFAULT   (MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT)) 
 
+/* Locale Dependent Mapping Flags */
+#define LCMAP_LOWERCASE	0x00000100	/* lower case letters */
+#define LCMAP_UPPERCASE	0x00000200	/* upper case letters */
+#define LCMAP_SORTKEY	0x00000400	/* WC sort key (normalize) */
+#define LCMAP_BYTEREV	0x00000800	/* byte reversal */
+
+#define LCMAP_HIRAGANA	0x00100000	/* map katakana to hiragana */
+#define LCMAP_KATAKANA	0x00200000	/* map hiragana to katakana */
+#define LCMAP_HALFWIDTH	0x00400000	/* map double byte to single byte */
+#define LCMAP_FULLWIDTH	0x00800000	/* map single byte to double byte */
+
 #endif  /* __WINE_WINNLS_H */
diff --git a/include/winnt.h b/include/winnt.h
index dc6b7cd..6664527 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -278,7 +278,7 @@
  * function pointer to a exception filter
  */
 
-typedef LONG (*PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
+typedef LONG (CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
 
 DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
diff --git a/include/winproc.h b/include/winproc.h
index c601898..592b357 100644
--- a/include/winproc.h
+++ b/include/winproc.h
@@ -77,8 +77,6 @@
                                      LPARAM lParam, MSGPARAM16* pm16 );
 
 typedef LRESULT (*WINPROC_CALLWNDPROC16)(WNDPROC16,HWND16,UINT16,WPARAM16,LPARAM);
-typedef LRESULT (*WINPROC_CALLWNDPROC32)(WNDPROC32,HWND32,UINT32,WPARAM32,LPARAM);
 extern void WINPROC_SetCallWndProc16( WINPROC_CALLWNDPROC16 proc );
-extern void WINPROC_SetCallWndProc32( WINPROC_CALLWNDPROC32 proc );
 
 #endif  /* __WINE_WINPROC_H */
diff --git a/include/wintypes.h b/include/wintypes.h
index 2626921..f420b39 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -66,27 +66,20 @@
 
 /* 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__))
+#  define __RESTORE_ES  __asm__ __volatile__("pushw %ds\n\tpopw %es")
 # else
 #  error You need gcc >= 2.7 to build Wine on a 386
 # endif  /* __GNUC__ */
 #else  /* __i386__ */
-#  define __stdcall /* nothing */
-#  define __cdecl   /* nothing */
+# define __stdcall
+# define __cdecl
+# define __RESTORE_ES
 #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
@@ -131,6 +124,7 @@
 typedef HANDLE32        HKEY;
 typedef HANDLE32        HMIXEROBJ;
 typedef DWORD           LCID;
+typedef WORD            LANGID;
 typedef DWORD           LCTYPE;
 
 /* Pointers types. These are the same for emulator and library. */
@@ -195,6 +189,7 @@
 DECLARE_HANDLE(HWAVEIN);
 DECLARE_HANDLE(HWAVEOUT);
 DECLARE_HANDLE(HWND);
+DECLARE_HANDLE(HKL);
 #undef DECLARE_HANDLE
 
 /* Callback function pointers types */
diff --git a/library/Makefile.in b/library/Makefile.in
index dce38c7..c2bd7e8 100644
--- a/library/Makefile.in
+++ b/library/Makefile.in
@@ -9,8 +9,7 @@
 LIB_SRCS = \
 	arch.c \
 	libres.c \
-	miscstubs.c \
-	sup.c
+	miscstubs.c
 
 STUB_SRCS = winestub.c
 
diff --git a/library/miscstubs.c b/library/miscstubs.c
index c472441..091a4b1 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -15,7 +15,6 @@
 
 /* for windows/winproc.c */
 void CallFrom16_long_wwwll(void) {}
-void CallFrom32_stdcall_5(void) {}
 
 extern LRESULT ColorDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
 extern LRESULT FileOpenDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
diff --git a/library/sup.c b/library/sup.c
deleted file mode 100644
index 5245618..0000000
--- a/library/sup.c
+++ /dev/null
@@ -1,104 +0,0 @@
-#include <stdio.h>
-#include <unistd.h>
-#include "windows.h"
-#include "arch.h"
-#include "neexe.h"
-
-/*
- * Header loading routines for WineLib.
- */
-
-/* LOADSHORT Calls LOAD and swaps the high and the low bytes */
-
-#define LOAD(x)  read (fd, &TAB->x, sizeof (TAB->x))
-#define LOADSHORT(x) LOAD(x); TAB->x = CONV_SHORT (TAB->x);
-#define LOADLONG(x) LOAD(x);  TAB->x = CONV_LONG (TAB->x);
-
-void load_mz_header (int fd, LPIMAGE_DOS_HEADER mz_header)
-{
-#define TAB mz_header
-	LOAD(e_magic);
-	LOADSHORT(e_cblp);
-	LOADSHORT(e_cp);
-	LOADSHORT(e_crlc);
-	LOADSHORT(e_cparhdr);
-	LOADSHORT(e_minalloc);
-	LOADSHORT(e_maxalloc);
-	LOADSHORT(e_ss);
-	LOADSHORT(e_sp);
-	LOADSHORT(e_csum);
-	LOADSHORT(e_ip);
-	LOADSHORT(e_cs);
-	LOADSHORT(e_lfarlc);
-	LOADSHORT(e_ovno);
-	LOAD(e_res);
-	LOADSHORT(e_oemid);
-	LOADSHORT(e_oeminfo);
-	LOAD(e_res2);
-	LOADLONG(e_lfanew);
-}
-
-void load_ne_header (int fd, LPIMAGE_OS2_HEADER ne_header)
-{
-#undef TAB
-#define TAB ne_header
-    LOAD (ne_magic);
-    LOADSHORT (linker_version);
-    LOADSHORT (linker_revision);
-    LOADSHORT (entry_tab_offset);
-    LOADSHORT (entry_tab_length);
-    LOAD (reserved1);
-    LOADSHORT (format_flags);
-    LOADSHORT (auto_data_seg);
-    LOADSHORT (local_heap_length);
-    LOADSHORT (stack_length);
-    LOADSHORT (ip);
-    LOADSHORT (cs);
-    LOADSHORT (sp);
-    LOADSHORT (ss);
-    LOADSHORT (n_segment_tab);
-    LOADSHORT (n_mod_ref_tab);
-    LOADSHORT (nrname_tab_length);
-    LOADSHORT (segment_tab_offset);
-    LOADSHORT (resource_tab_offset);
-    LOADSHORT (rname_tab_offset);
-    LOADSHORT (moduleref_tab_offset);
-    LOADSHORT (iname_tab_offset);
-    LOADLONG (nrname_tab_offset);
-    LOADSHORT (n_mov_entry_points);
-    LOADSHORT (align_shift_count);
-    LOADSHORT (n_resource_seg);
-    LOAD (operating_system);
-    LOAD (additional_flags);
-    LOADSHORT (fastload_offset);
-    LOADSHORT (fastload_length);
-    LOADSHORT (reserved2);
-    LOADSHORT (expect_version);
-}
-
-/*
- * Typeinfo loading routines for non PC-architectures.
- */
-
-int load_typeinfo (int fd, struct resource_typeinfo_s *typeinfo)
-{
-#undef TAB
-#define TAB typeinfo
-    LOADSHORT (type_id);
-    LOADSHORT (count);
-    LOADLONG  (reserved);
-    return 1;
-}
-
-int load_nameinfo (int fd, struct resource_nameinfo_s *nameinfo)
-{
-#undef TAB
-#define TAB nameinfo
-    LOADSHORT (offset);
-    LOADSHORT (length);
-    LOADSHORT (flags);
-    LOADSHORT (id);
-    LOADSHORT (handle);
-    LOADSHORT (usage);
-    return 0;
-}
diff --git a/loader/module.c b/loader/module.c
index a41ce37..c40d240 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -18,6 +18,7 @@
 #include "hook.h"
 #include "module.h"
 #include "neexe.h"
+#include "resource.h"
 #include "selectors.h"
 #include "stackframe.h"
 #include "task.h"
@@ -26,7 +27,7 @@
 #include "debug.h"
 #include "callback.h"
 
-extern HINSTANCE16 PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params );
+extern HINSTANCE16 PE_LoadModule( HFILE32 hf, OFSTRUCT *ofs, LOADPARAMS* params );
 
 static HMODULE16 hFirstModule = 0;
 static HMODULE16 hCachedModule = 0;  /* Module cached by MODULE_OpenFile */
@@ -35,19 +36,70 @@
 /***********************************************************************
  *           MODULE_GetPtr
  */
-NE_MODULE *MODULE_GetPtr( HMODULE16 hModule )
+NE_MODULE *MODULE_GetPtr( HMODULE32 hModule )
 {
-    NE_MODULE *pModule = (NE_MODULE *)GlobalLock16( hModule );
-    if (!pModule || (pModule->magic != IMAGE_OS2_SIGNATURE) ||
-        (pModule->self != hModule)) return NULL;
-    return pModule;
+    HMODULE16 hnd =MODULE_HANDLEtoHMODULE16(hModule);
+
+    if (!hnd)
+    	return NULL;
+    return (NE_MODULE*)GlobalLock16(hnd);
 }
 
+/***********************************************************************
+ *           MODULE_HANDLEtoHMODULE16
+ */
+HMODULE16
+MODULE_HANDLEtoHMODULE16(HANDLE32 handle) {
+    NE_MODULE	*pModule;
+
+    if (HIWORD(handle)) {
+	/* this is a HMODULE32 aka pe->mappeddll */
+
+        /* walk the list looking for the correct startaddress */
+    	pModule = (NE_MODULE *)GlobalLock16( hFirstModule );
+	while (pModule) { 
+		if (	((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) &&
+			pModule->pe_module &&
+			((HMODULE32)pModule->pe_module->mappeddll == handle)
+		)
+			return pModule->self;
+		pModule=(NE_MODULE*)GlobalLock16(pModule->next);
+	}
+	return 0;
+    }
+    return GetExePtr(handle);
+}
+
+/***********************************************************************
+ *           MODULE_HANDLEtoHMODULE32
+ * return HMODULE32, if possible, HMODULE16 otherwise
+ */
+HMODULE32
+MODULE_HANDLEtoHMODULE32(HANDLE32 handle) {
+    NE_MODULE *pModule;
+
+    if (HIWORD(handle))
+    	return (HMODULE32)handle;
+    else {
+    	handle = GetExePtr(handle);
+	if (!handle)
+	    return 0;
+    	pModule = (NE_MODULE *)GlobalLock16( handle );
+	if (!pModule)
+	    return 0;
+	
+	if (	((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) &&
+		pModule->pe_module
+	)
+		return (HMODULE32)pModule->pe_module->mappeddll;
+	return handle;
+    }
+}
 
 /***********************************************************************
  *           MODULE_DumpModule
  */
-void MODULE_DumpModule( HMODULE16 hModule )
+void MODULE_DumpModule( HMODULE32 hModule )
 {
     int i, ordinal;
     SEGTABLEENTRY *pSeg;
@@ -210,7 +262,7 @@
 /***********************************************************************
  *           MODULE_OpenFile
  */
-int MODULE_OpenFile( HMODULE16 hModule )
+int MODULE_OpenFile( HMODULE32 hModule )
 {
     NE_MODULE *pModule;
     DOS_FULL_NAME full_name;
@@ -218,7 +270,7 @@
 
     static int cachedfd = -1;
 
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE16(hModule);
     dprintf_module( stddeb, "MODULE_OpenFile(%04x) cache: mod=%04x fd=%d\n",
                     hModule, hCachedModule, cachedfd );
     if (!(pModule = MODULE_GetPtr( hModule ))) return -1;
@@ -275,7 +327,7 @@
 /***********************************************************************
  *           MODULE_CreateSegments
  */
-static BOOL32 MODULE_CreateSegments( HMODULE16 hModule )
+static BOOL32 MODULE_CreateSegments( HMODULE32 hModule )
 {
     SEGTABLEENTRY *pSegment;
     NE_MODULE *pModule;
@@ -306,7 +358,7 @@
 /***********************************************************************
  *           MODULE_GetInstance
  */
-HINSTANCE16 MODULE_GetInstance( HMODULE16 hModule )
+HINSTANCE16 MODULE_GetInstance( HMODULE32 hModule )
 {
     SEGTABLEENTRY *pSegment;
     NE_MODULE *pModule;
@@ -359,12 +411,13 @@
  *
  * Create a dummy NE module for Win32 or Winelib.
  */
-HMODULE16 MODULE_CreateDummyModule( const OFSTRUCT *ofs )
+HMODULE32 MODULE_CreateDummyModule( const OFSTRUCT *ofs )
 {
-    HMODULE16 hModule;
+    HMODULE32 hModule;
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegment;
-    char *pStr,*basename,*s;
+    char *pStr,*s;
+    const char* basename;
 
     INT32 of_size = sizeof(OFSTRUCT) - sizeof(ofs->szPathName)
                     + strlen(ofs->szPathName) + 1;
@@ -379,7 +432,7 @@
                  8;
 
     hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
-    if (!hModule) return (HMODULE16)11;  /* invalid exe */
+    if (!hModule) return (HMODULE32)11;  /* invalid exe */
 
     FarSetOwner( hModule, hModule );
     pModule = (NE_MODULE *)GlobalLock16( hModule );
@@ -432,7 +485,7 @@
     *pStr = strlen(basename);
     if (*pStr>8) *pStr=8;
     strncpy( pStr+1, basename, 8 );
-    free(basename);
+    free((void*)basename);
     pStr += 9;
 
     /* All tables zero terminated */
@@ -447,12 +500,12 @@
 /***********************************************************************
  *           MODULE_LoadExeHeader
  */
-static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
+static HMODULE32 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
 {
     IMAGE_DOS_HEADER mz_header;
     IMAGE_OS2_HEADER ne_header;
     int size;
-    HMODULE16 hModule;
+    HMODULE32 hModule;
     NE_MODULE *pModule;
     BYTE *pData;
     char *buffer, *fastload = NULL;
@@ -469,18 +522,18 @@
     _llseek32( hFile, 0, SEEK_SET );
     if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
         (mz_header.e_magic != IMAGE_DOS_SIGNATURE))
-        return (HMODULE16)11;  /* invalid exe */
+        return (HMODULE32)11;  /* invalid exe */
 
     _llseek32( hFile, mz_header.e_lfanew, SEEK_SET );
     if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
-        return (HMODULE16)11;  /* invalid exe */
+        return (HMODULE32)11;  /* invalid exe */
 
-    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_NT_SIGNATURE) return (HMODULE32)21;  /* win32 exe */
+    if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return (HMODULE32)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;
+      return (HMODULE32)11;
     }
     /* We now have a valid NE header */
 
@@ -501,7 +554,7 @@
            ne_header.entry_tab_length;
 
     hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
-    if (!hModule) return (HMODULE16)11;  /* invalid exe */
+    if (!hModule) return (HMODULE32)11;  /* invalid exe */
     FarSetOwner( hModule, hModule );
     pModule = (NE_MODULE *)GlobalLock16( hModule );
     memcpy( pModule, &ne_header, sizeof(ne_header) );
@@ -560,7 +613,7 @@
             HeapFree( SystemHeap, 0, buffer );
             if (fastload) HeapFree( SystemHeap, 0, fastload );
             GlobalFree16( hModule );
-            return (HMODULE16)11;  /* invalid exe */
+            return (HMODULE32)11;  /* invalid exe */
         }
         pSeg = (struct ne_segment_table_entry_s *)buffer;
         for (i = ne_header.n_segment_tab; i > 0; i--, pSeg++)
@@ -574,7 +627,7 @@
     {
         if (fastload) HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
-        return (HMODULE16)11;  /* invalid exe */
+        return (HMODULE32)11;  /* invalid exe */
     }
 
     /* Get the resource table */
@@ -584,8 +637,9 @@
         pModule->res_table = (int)pData - (int)pModule;
         if (!READ(mz_header.e_lfanew + ne_header.resource_tab_offset,
                   ne_header.rname_tab_offset - ne_header.resource_tab_offset,
-                  pData )) return (HMODULE16)11;  /* invalid exe */
+                  pData )) return (HMODULE32)11;  /* invalid exe */
         pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset;
+	NE_InitResourceHandler( hModule );
     }
     else pModule->res_table = 0;  /* No resource table */
 
@@ -598,7 +652,7 @@
     {
         if (fastload) HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
-        return (HMODULE16)11;  /* invalid exe */
+        return (HMODULE32)11;  /* invalid exe */
     }
     pData += ne_header.moduleref_tab_offset - ne_header.rname_tab_offset;
 
@@ -613,7 +667,7 @@
         {
             if (fastload) HeapFree( SystemHeap, 0, fastload );
             GlobalFree16( hModule );
-            return (HMODULE16)11;  /* invalid exe */
+            return (HMODULE32)11;  /* invalid exe */
         }
         pData += ne_header.n_mod_ref_tab * sizeof(WORD);
     }
@@ -628,7 +682,7 @@
     {
         if (fastload) HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
-        return (HMODULE16)11;  /* invalid exe */
+        return (HMODULE32)11;  /* invalid exe */
     }
     pData += ne_header.entry_tab_offset - ne_header.iname_tab_offset;
 
@@ -641,7 +695,7 @@
     {
         if (fastload) HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
-        return (HMODULE16)11;  /* invalid exe */
+        return (HMODULE32)11;  /* invalid exe */
     }
     pData += ne_header.entry_tab_length;
 
@@ -659,7 +713,7 @@
         if (!pModule->nrname_handle)
         {
             GlobalFree16( hModule );
-            return (HMODULE16)11;  /* invalid exe */
+            return (HMODULE32)11;  /* invalid exe */
         }
         buffer = GlobalLock16( pModule->nrname_handle );
         _llseek32( hFile, ne_header.nrname_tab_offset, SEEK_SET );
@@ -668,7 +722,7 @@
         {
             GlobalFree16( pModule->nrname_handle );
             GlobalFree16( hModule );
-            return (HMODULE16)11;  /* invalid exe */
+            return (HMODULE32)11;  /* invalid exe */
         }
     }
     else pModule->nrname_handle = 0;
@@ -678,13 +732,13 @@
     if (pModule->modref_count)
     {
         pModule->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,
-                                    (pModule->modref_count+1)*sizeof(HMODULE16),
+                                    (pModule->modref_count+1)*sizeof(HMODULE32),
                                     hModule, FALSE, FALSE, FALSE );
         if (!pModule->dlls_to_init)
         {
             if (pModule->nrname_handle) GlobalFree16( pModule->nrname_handle );
             GlobalFree16( hModule );
-            return (HMODULE16)11;  /* invalid exe */
+            return (HMODULE32)11;  /* invalid exe */
         }
     }
     else pModule->dlls_to_init = 0;
@@ -699,7 +753,7 @@
  *
  * Lookup the ordinal for a given name.
  */
-WORD MODULE_GetOrdinal( HMODULE16 hModule, const char *name )
+WORD MODULE_GetOrdinal( HMODULE32 hModule, const char *name )
 {
     unsigned char buffer[256], *cpnt;
     BYTE len;
@@ -763,7 +817,7 @@
  *
  * Return the entry point for a given ordinal.
  */
-FARPROC16 MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal )
+FARPROC16 MODULE_GetEntryPoint( HMODULE32 hModule, WORD ordinal )
 {
     NE_MODULE *pModule;
     WORD curOrdinal = 1;
@@ -823,7 +877,7 @@
  * Change the value of an entry point. Use with caution!
  * It can only change the offset value, not the selector.
  */
-BOOL16 MODULE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset )
+BOOL16 MODULE_SetEntryPoint( HMODULE32 hModule, WORD ordinal, WORD offset )
 {
     NE_MODULE *pModule;
     WORD curOrdinal = 1;
@@ -872,7 +926,7 @@
 {
     WORD ordinal;
     FARPROC16 ret;
-    static HMODULE16 hModule = 0;
+    static HMODULE32 hModule = 0;
 
     if (!hModule) hModule = GetModuleHandle16( "WPROCS" );
     ordinal = MODULE_GetOrdinal( hModule, name );
@@ -886,7 +940,7 @@
 /***********************************************************************
  *           MODULE_GetModuleName
  */
-LPSTR MODULE_GetModuleName( HMODULE16 hModule )
+LPSTR MODULE_GetModuleName( HMODULE32 hModule )
 {
     NE_MODULE *pModule;
     BYTE *p, len;
@@ -916,9 +970,9 @@
  *
  * Find a module from a path name.
  */
-HMODULE16 MODULE_FindModule( LPCSTR path )
+HMODULE32 MODULE_FindModule( LPCSTR path )
 {
-    HMODULE16 hModule = hFirstModule;
+    HMODULE32 hModule = hFirstModule;
     LPCSTR filename, dotptr, modulepath, modulename;
     BYTE len, *name_table;
 
@@ -973,7 +1027,7 @@
  *
  * Remove a module from memory.
  */
-static void MODULE_FreeModule( HMODULE16 hModule )
+BOOL16 MODULE_FreeModule( HMODULE32 hModule, TDB* pTaskContext )
 {
     HMODULE16 *hPrevModule;
     NE_MODULE *pModule;
@@ -981,17 +1035,28 @@
     HMODULE16 *pModRef;
     int i;
 
-    if (!(pModule = MODULE_GetPtr( hModule ))) return;
+    if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE;
+    hModule = pModule->self;
+
+    if (((INT16)(--pModule->count)) > 0 ) return TRUE;
+    else pModule->count = 0;
+
     if (pModule->flags & NE_FFLAGS_BUILTIN)
-        return;  /* Can't free built-in module */
+        return FALSE;  /* Can't free built-in module */
 
-    if (pModule->flags & NE_FFLAGS_LIBMODULE) MODULE_CallWEP( hModule );
+    if (pModule->flags & NE_FFLAGS_LIBMODULE) 
+    {
+	MODULE_CallWEP( hModule );
 
-    /* Free the objects owned by the module */
+	/* Free the objects owned by the DLL module */
 
-    HOOK_FreeModuleHooks( hModule );
-    CLASS_FreeModuleClasses( hModule );
-
+	if( pTaskContext && pTaskContext->userhandler )
+	{
+            pTaskContext->userhandler( hModule, USIG_DLL_UNLOAD, 0,
+                                       pTaskContext->hInstance,
+                                       pTaskContext->hQueue );
+	}
+    }
     /* Clear magic number just in case */
 
     pModule->magic = pModule->self = 0;
@@ -1030,6 +1095,8 @@
       /* Remove module from cache */
 
     if (hCachedModule == hModule) hCachedModule = 0;
+
+    return TRUE;
 }
 
 
@@ -1038,7 +1105,7 @@
  *
  * Implementation of LoadModule()
  */
-HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, BOOL32 first )
+HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
 {
     HMODULE16 hModule;
     HINSTANCE16 hInstance, hPrevInstance;
@@ -1080,10 +1147,9 @@
         hModule = MODULE_LoadExeHeader( hFile, &ofs );
         if (hModule < 32)
         {
-            /* Note: PE_LoadModule closes the file */
             if (hModule == 21)
                 hModule = PE_LoadModule( hFile, &ofs, paramBlock );
-            else _lclose32( hFile );
+	    else _lclose32( hFile );
 
             if (hModule < 32)
                 fprintf( stderr, "LoadModule: can't load '%s', error=%d\n",
@@ -1092,6 +1158,7 @@
         }
         _lclose32( hFile );
         pModule = MODULE_GetPtr( hModule );
+	pModule->flags |= uFlags; /* stamp implicitly loaded modules */
 
           /* Allocate the segments for this module */
 
@@ -1117,7 +1184,7 @@
                 /* its handle in the list of DLLs to initialize.   */
                 HMODULE16 hDLL;
 
-                if ((hDLL = MODULE_Load( buffer, (LPVOID)-1, FALSE )) == 2)
+                if ((hDLL = MODULE_Load( buffer, (LPVOID)-1, NE_FFLAGS_IMPLICIT )) == 2)
                 {
                     /* file not found */
                     char *p;
@@ -1127,15 +1194,17 @@
                     if (!(p = strrchr( buffer, '\\' ))) p = buffer;
                     memcpy( p + 1, pstr + 1, *pstr );
                     strcpy( p + 1 + *pstr, ".dll" );
-                    hDLL = MODULE_Load( buffer, (LPVOID)-1, FALSE );
+                    hDLL = MODULE_Load( buffer, (LPVOID)-1, NE_FFLAGS_IMPLICIT );
                 }
                 if (hDLL < 32)
                 {
+		    /* FIXME: cleanup what was done */
+
                     fprintf( stderr, "Could not load '%s' required by '%s', error = %d\n",
                              buffer, name, hDLL );
                     return 2;  /* file not found */
                 }
-                *pModRef = GetExePtr( hDLL );
+                *pModRef = MODULE_HANDLEtoHMODULE16( hDLL );
                 *pDLLs++ = *pModRef;
             }
             else  /* Increment the reference count of the DLL */
@@ -1158,11 +1227,12 @@
 		HMODULE16 hselfload = GetModuleHandle16("WPROCS");
                 DWORD oldstack;
 		WORD saved_dgroup = pSegTable[pModule->dgroup - 1].selector;
-		fprintf (stderr, "Warning:  %*.*s is a self-loading module\n"
-                                "Support for self-loading modules is very experimental\n",
-                *((BYTE*)pModule + pModule->name_table),
-                *((BYTE*)pModule + pModule->name_table),
-                (char *)pModule + pModule->name_table + 1);
+
+		dprintf_module(stddeb, "MODULE_Load: %*.*s is a self-loading module!\n",
+					*((BYTE*)pModule + pModule->name_table),
+					*((BYTE*)pModule + pModule->name_table),
+					 (char *)pModule + pModule->name_table + 1);
+
 		NE_LoadSegment( hModule, 1 );
 		selfloadheader = (SELFLOADHEADER *)
 			PTR_SEG_OFF_TO_LIN(pSegTable->selector, 0);
@@ -1210,7 +1280,8 @@
 		  frame32->ecx = 0;
 		  frame32->ebx = 0;
 		  frame32->ebp = 0;
-		  frame32->retaddr = 0;
+		  frame32->restore_addr = 0;
+		  frame32->retaddr      = 0;
 		  frame32->codeselector = WINE_CODE_SELECTOR;
 		  /* pTask->esp = (DWORD)frame32; */
 		}
@@ -1242,10 +1313,14 @@
 
         pModule->count = 1;
 
-        if (first && (pModule->flags & NE_FFLAGS_LIBMODULE))
-            NE_InitializeDLLs( hModule );
+	  /* Call initialization rountines for all loaded DLLs. Note that
+	   * when we load implicitly linked DLLs this will be done by the InitTask().
+	   */
+
+        if ((pModule->flags & (NE_FFLAGS_LIBMODULE | NE_FFLAGS_IMPLICIT)) ==
+			       NE_FFLAGS_LIBMODULE ) NE_InitializeDLLs( hModule );
     }
-    else
+    else /* module is already loaded, just create a new data segment if it's a task */
     {
         pModule = MODULE_GetPtr( hModule );
         hPrevInstance = MODULE_GetInstance( hModule );
@@ -1254,6 +1329,7 @@
             NE_LoadSegment( hModule, pModule->dgroup );
         pModule->count++;
     }
+
 #else
     lstrcpyn32A( ofs.szPathName, name, sizeof(ofs.szPathName) );
     if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) return hModule;
@@ -1269,6 +1345,8 @@
 	HTASK16 hTask;
         WORD	showcmd;
 
+	pModule->flags |= NE_FFLAGS_GUI;
+
 	/* PowerPoint passes NULL as showCmd */
 	if (params->showCmd)
 		showcmd = *((WORD *)PTR_SEG_TO_LIN(params->showCmd)+1);
@@ -1292,7 +1370,7 @@
  */
 HINSTANCE16 LoadModule16( LPCSTR name, LPVOID paramBlock )
 {
-    return MODULE_Load( name, paramBlock, TRUE );
+    return MODULE_Load( name, paramBlock, 0 );
 }
 
 
@@ -1303,13 +1381,11 @@
 {
     NE_MODULE *pModule;
 
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE;
-
     dprintf_module( stddeb, "FreeModule16: %s count %d\n", 
 		    MODULE_GetModuleName(hModule), pModule->count );
-    if (--pModule->count == 0) MODULE_FreeModule( hModule );
-    return TRUE;
+
+    return MODULE_FreeModule( hModule, GlobalLock16(GetCurrentTask()) );
 }
 
 
@@ -1318,7 +1394,7 @@
  */
 HMODULE16 WINAPI WIN16_GetModuleHandle( SEGPTR name )
 {
-    if (HIWORD(name) == 0) return GetExePtr( (HINSTANCE16)name );
+    if (HIWORD(name) == 0) return MODULE_HANDLEtoHMODULE16( (HINSTANCE16)name );
     return MODULE_FindModule( PTR_SEG_TO_LIN(name) );
 }
 
@@ -1327,6 +1403,33 @@
     return MODULE_FindModule( name );
 }
 
+/***********************************************************************
+ *              GetModuleHandle         (KERNEL32.237)
+ */
+HMODULE32 WINAPI GetModuleHandle32A(LPCSTR module)
+{
+    HMODULE32	hModule;
+
+    dprintf_win32(stddeb, "GetModuleHandleA: %s\n", module ? module : "NULL");
+/* Freecell uses the result of GetModuleHandleA(0) as the hInstance in
+all calls to e.g. CreateWindowEx. */
+    if (module == NULL) {
+	TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
+	hModule = pTask->hInstance;
+    } else
+	hModule = MODULE_FindModule(module);
+    return MODULE_HANDLEtoHMODULE32(hModule);
+}
+
+HMODULE32 WINAPI GetModuleHandle32W(LPCWSTR module)
+{
+    HMODULE32 hModule;
+    LPSTR modulea = HEAP_strdupWtoA( GetProcessHeap(), 0, module );
+    hModule = GetModuleHandle32A( modulea );
+    HeapFree( GetProcessHeap(), 0, modulea );
+    return hModule;
+}
+
 
 /**********************************************************************
  *	    GetModuleUsage    (KERNEL.48)
@@ -1335,7 +1438,6 @@
 {
     NE_MODULE *pModule;
 
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     dprintf_module( stddeb, "GetModuleUsage(%04x): returning %d\n",
                     hModule, pModule->count );
@@ -1352,7 +1454,6 @@
     NE_MODULE *pModule;
 
     if (!hModule) hModule = GetCurrentTask();
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     lstrcpyn32A( lpFileName, NE_MODULE_NAME(pModule), nSize );
     dprintf_module( stddeb, "GetModuleFileName16: %s\n", lpFileName );
@@ -1373,7 +1474,6 @@
         TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
         hModule = pTask->hInstance;
     }
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     lstrcpyn32A( lpFileName, NE_MODULE_NAME(pModule), size );
     dprintf_module( stddeb, "GetModuleFileName32A: %s\n", lpFileName );
@@ -1410,17 +1510,73 @@
 
 /***********************************************************************
  *           LoadLibraryEx32W   (KERNEL.513)
+ * FIXME
  */
-HINSTANCE16 WINAPI LoadLibraryEx32W16( LPCSTR libname, HANDLE16 hf,
+HMODULE32 WINAPI LoadLibraryEx32W16( LPCSTR libname, HANDLE16 hf,
                                        DWORD flags )
 {
     fprintf(stderr,"LoadLibraryEx32W(%s,%d,%08lx)\n",libname,hf,flags);
-    if (!flags && !hf)
-    	return LoadLibrary32A(libname);
-    return 0;
+    return LoadLibraryEx32A(libname,hf,flags);
 }
 
 /***********************************************************************
+ *           LoadLibraryEx32A   (KERNEL32)
+ */
+HMODULE32 WINAPI LoadLibraryEx32A(LPCSTR libname,HFILE32 hfile,DWORD flags)
+{
+    HMODULE32 hmod;
+    
+    hmod = PE_LoadLibraryEx32A(libname,hfile,flags);
+    if (hmod <= 32) {
+	char buffer[256];
+
+	strcpy( buffer, libname );
+	strcat( buffer, ".dll" );
+	hmod = PE_LoadLibraryEx32A(buffer,hfile,flags);
+    }
+    /* initialize all DLLs, which haven't been initialized yet. */
+    PE_InitializeDLLs( GetCurrentProcessId(), DLL_PROCESS_ATTACH, NULL);
+    return hmod;
+}
+
+/***********************************************************************
+ *           LoadLibraryA         (KERNEL32)
+ */
+HMODULE32 WINAPI LoadLibrary32A(LPCSTR libname) {
+	return LoadLibraryEx32A(libname,0,0);
+}
+
+/***********************************************************************
+ *           LoadLibraryW         (KERNEL32)
+ */
+HMODULE32 WINAPI LoadLibrary32W(LPCWSTR libnameW)
+{
+    return LoadLibraryEx32W(libnameW,0,0);
+}
+
+/***********************************************************************
+ *           LoadLibraryExW       (KERNEL32)
+ */
+HMODULE32 WINAPI LoadLibraryEx32W(LPCWSTR libnameW,HFILE32 hfile,DWORD flags)
+{
+    LPSTR libnameA = HEAP_strdupWtoA( GetProcessHeap(), 0, libnameW );
+    HMODULE32 ret = LoadLibraryEx32A( libnameA , hfile, flags );
+
+    HeapFree( GetProcessHeap(), 0, libnameA );
+    return ret;
+}
+
+/***********************************************************************
+ *           FreeLibrary
+ */
+BOOL32 WINAPI FreeLibrary32(HINSTANCE32 hLibModule)
+{
+	fprintf(stderr,"FreeLibrary: empty stub\n");
+	return TRUE;
+}
+
+
+/***********************************************************************
  *           LoadLibrary   (KERNEL.95)
  */
 HINSTANCE16 WINAPI LoadLibrary16( LPCSTR libname )
@@ -1434,17 +1590,13 @@
     }
     dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
 
-    /* This does not increment the module reference count, and will
-     * therefore cause crashes on FreeLibrary calls.
-    if ((handle = MODULE_FindModule( libname )) != 0) return handle;
-     */
-    handle = MODULE_Load( libname, (LPVOID)-1, TRUE );
+    handle = MODULE_Load( libname, (LPVOID)-1, 0 );
     if (handle == (HINSTANCE16)2)  /* file not found */
     {
         char buffer[256];
         lstrcpyn32A( buffer, libname, 252 );
         strcat( buffer, ".dll" );
-        handle = MODULE_Load( buffer, (LPVOID)-1, TRUE );
+        handle = MODULE_Load( buffer, (LPVOID)-1, 0 );
     }
     return handle;
 }
@@ -1486,7 +1638,7 @@
         return 2;  /* File not found */
     if (!(cmdShowHandle = GlobalAlloc16( 0, 2 * sizeof(WORD) )))
         return 8;  /* Out of memory */
-    if (!(cmdLineHandle = GlobalAlloc16( 0, 256 )))
+    if (!(cmdLineHandle = GlobalAlloc16( 0, 1024 )))
     {
         GlobalFree16( cmdShowHandle );
         return 8;  /* Out of memory */
@@ -1531,7 +1683,7 @@
 	}
 
 	if (*p)
-	    lstrcpyn32A( cmdline + 1, p + 1, 127 );
+	    lstrcpyn32A( cmdline + 1, p + 1, 1023 );
 	else
 	    cmdline[1] = '\0';
 
@@ -1645,7 +1797,7 @@
  *           WIN32_GetProcAddress16   (KERNEL32.36)
  * Get procaddress in 16bit module from win32... (kernel32 undoc. ordinal func)
  */
-FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE16 hModule, LPSTR name )
+FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE32 hModule, LPSTR name )
 {
     WORD	ordinal;
     FARPROC16	ret;
@@ -1654,7 +1806,7 @@
     	fprintf(stderr,"WIN32_GetProcAddress16: hModule may not be 0!\n");
 	return (FARPROC16)0;
     }
-    hModule = GetExePtr(hModule);
+    hModule = MODULE_HANDLEtoHMODULE16(hModule);
     if (HIWORD(name)) {
         ordinal = MODULE_GetOrdinal( hModule, name );
         dprintf_module( stddeb, "WIN32_GetProcAddress16: %04x '%s'\n",
@@ -1679,7 +1831,7 @@
     FARPROC16 ret;
 
     if (!hModule) hModule = GetCurrentTask();
-    hModule = GetExePtr( hModule );
+    hModule = MODULE_HANDLEtoHMODULE16( hModule );
 
     if (HIWORD(name) != 0)
     {
@@ -1714,13 +1866,16 @@
 	dprintf_win32(stddeb,"GetProcAddress32(%08lx,%s)\n",(DWORD)hModule,function);
     else
 	dprintf_win32(stddeb,"GetProcAddress32(%08lx,%p)\n",(DWORD)hModule,function);
-    hModule = GetExePtr( hModule );
     if (!(pModule = MODULE_GetPtr( hModule )))
         return (FARPROC32)0;
-    if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->pe_module)
-        return (FARPROC32)0;
     if (pModule->flags & NE_FFLAGS_BUILTIN)
         return BUILTIN_GetProcAddress32( pModule, function );
+    if (!pModule->pe_module) {
+    	fprintf(stderr,"Oops, Module 0x%08lx has got no pe_module?\n",
+		(DWORD)MODULE_HANDLEtoHMODULE32(hModule)
+	);
+	return (FARPROC32)0;
+    }
     return PE_FindExportedFunction( pModule->pe_module, function );
 #else
     return NULL;
@@ -1732,14 +1887,20 @@
  */
 LPIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE32 hModule)
 {
+    /* basically:
+     * return  hModule+(((IMAGE_DOS_HEADER*)hModule)->e_lfanew); 
+     * but we could get HMODULE16 or the like (think builtin modules)
+     */
+
 #ifndef WINELIB
     NE_MODULE *pModule;
 
-    hModule = GetExePtr( hModule );
     if (!(pModule = MODULE_GetPtr( hModule )))
         return (LPIMAGE_NT_HEADERS)0;
     if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->pe_module)
         return (LPIMAGE_NT_HEADERS)0;
+    if (pModule->flags & NE_FFLAGS_BUILTIN)
+        return (LPIMAGE_NT_HEADERS)0;
     return pModule->pe_module->pe_header;
 #else
     return NULL;
@@ -1763,7 +1924,7 @@
 BOOL16 WINAPI IsSharedSelector( HANDLE16 selector )
 {
     /* Check whether the selector belongs to a DLL */
-    NE_MODULE *pModule = MODULE_GetPtr( GetExePtr( selector ));
+    NE_MODULE *pModule = MODULE_GetPtr( selector );
     if (!pModule) return FALSE;
     return (pModule->flags & NE_FFLAGS_LIBMODULE) != 0;
 }
@@ -1815,7 +1976,7 @@
  */
 BOOL16 WINAPI ModuleFindHandle( MODULEENTRY *lpme, HMODULE16 hModule )
 {
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE16( hModule );
     lpme->wNext = hModule;
     return ModuleNext( lpme );
 }
diff --git a/loader/ne_image.c b/loader/ne_image.c
index dd0ff09..e1631e9 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -17,6 +17,7 @@
 #include <errno.h>
 #include "neexe.h"
 #include "windows.h"
+#include "task.h"
 #include "arch.h"
 #include "selectors.h"
 #include "callback.h"
@@ -455,7 +456,7 @@
  *
  * Call the DLL initialization code
  */
-static BOOL32 NE_InitDLL( HMODULE16 hModule )
+static BOOL32 NE_InitDLL( TDB* pTask, HMODULE16 hModule )
 {
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable;
@@ -473,6 +474,17 @@
 
     if (!(pModule->flags & NE_FFLAGS_LIBMODULE) ||
         (pModule->flags & NE_FFLAGS_WIN32)) return TRUE; /*not a library*/
+
+    /* Call USER signal handler. This is necessary to install a
+     * proper loader for HICON and HCURSOR resources that this DLL 
+     * may contain. InitApp() does this for task modules. */
+
+    if (pTask && pTask->userhandler)
+    {
+        pTask->userhandler( hModule, USIG_DLL_LOAD, 0, pTask->hInstance,
+                            pTask->hQueue );
+    }
+
     if (!pModule->cs) return TRUE;  /* no initialization code */
 
     memset( &context, 0, sizeof(context) );
@@ -516,10 +528,12 @@
 /***********************************************************************
  *           NE_InitializeDLLs
  *
- * Initialize the loaded DLLs.
+ * Recursively initialize all DLLs (according to the order in which 
+ * they where loaded).
  */
 void NE_InitializeDLLs( HMODULE16 hModule )
 {
+    TDB* pTask = (TDB*)GlobalLock16(GetCurrentTask());
     NE_MODULE *pModule;
     HMODULE16 *pDLL;
 
@@ -529,6 +543,7 @@
 /*        PE_InitializeDLLs(hModule); */
         return;
     }
+
     if (pModule->dlls_to_init)
     {
 	HGLOBAL16 to_init = pModule->dlls_to_init;
@@ -539,7 +554,7 @@
         }
         GlobalFree16( to_init );
     }
-    NE_InitDLL( hModule );
+    NE_InitDLL( pTask, hModule );
 }
 
 
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index cf885e8..7121b18 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -3,6 +3,7 @@
  *
  * Copyright 1993 Robert J. Amstadt
  * Copyright 1995 Alexandre Julliard
+ *	     1997 Alex Korobka
  */
 
 #include <stdio.h>
@@ -22,6 +23,8 @@
 #include "stddebug.h"
 #include "debug.h"
 
+#define  NEXT_TYPEINFO(pTypeInfo) ((NE_TYPEINFO *)((char*)((pTypeInfo) + 1) + \
+                                   (pTypeInfo)->count * sizeof(NE_NAMEINFO)))
 
 /***********************************************************************
  *           NE_FindNameTableId
@@ -29,29 +32,26 @@
  * Find the type and resource id from their names.
  * Return value is MAKELONG( typeId, resId ), or 0 if not found.
  */
-static DWORD NE_FindNameTableId( HMODULE16 hModule, SEGPTR typeId, SEGPTR resId )
+static DWORD NE_FindNameTableId( NE_MODULE *pModule, SEGPTR typeId, SEGPTR resId )
 {
-    NE_MODULE *pModule;
-    NE_TYPEINFO *pTypeInfo;
+    NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
     NE_NAMEINFO *pNameInfo;
     HGLOBAL16 handle;
     WORD *p;
     DWORD ret = 0;
     int count;
 
-    if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
-    pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
     for (; pTypeInfo->type_id != 0;
-             pTypeInfo = (NE_TYPEINFO *)((char*)(pTypeInfo+1) +
-                                       pTypeInfo->count * sizeof(NE_NAMEINFO)))
+	   pTypeInfo = (NE_TYPEINFO *)((char*)(pTypeInfo+1) +
+					pTypeInfo->count * sizeof(NE_NAMEINFO)))
     {
-        if (pTypeInfo->type_id != 0x800f) continue;
-        pNameInfo = (NE_NAMEINFO *)(pTypeInfo + 1);
-        for (count = pTypeInfo->count; count > 0; count--, pNameInfo++)
-        {
+	if (pTypeInfo->type_id != 0x800f) continue;
+	pNameInfo = (NE_NAMEINFO *)(pTypeInfo + 1);
+	for (count = pTypeInfo->count; count > 0; count--, pNameInfo++)
+	{
             dprintf_resource( stddeb, "NameTable entry: type=%04x id=%04x\n",
                               pTypeInfo->type_id, pNameInfo->id );
-            handle = LoadResource16( hModule, 
+            handle = LoadResource16( pModule->self, 
 				   (HRSRC16)((int)pNameInfo - (int)pModule) );
             for(p = (WORD*)LockResource16(handle); p && *p; p = (WORD *)((char*)p+*p))
             {
@@ -89,11 +89,56 @@
             }
             FreeResource16( handle );
             if (ret) return ret;
-        }
+	}
     }
     return 0;
 }
 
+/***********************************************************************
+ *           NE_FindTypeSection
+ *
+ * Find header struct for a particular resource type.
+ */
+static NE_TYPEINFO* NE_FindTypeSection( NE_MODULE *pModule, 
+					NE_TYPEINFO *pTypeInfo, SEGPTR typeId )
+{
+    /* start from pTypeInfo */
+
+    if (HIWORD(typeId) != 0)  /* Named type */
+    {
+	char *str = (char *)PTR_SEG_TO_LIN( typeId );
+	BYTE len = strlen( str );
+	while (pTypeInfo->type_id)
+	{
+	    if (!(pTypeInfo->type_id & 0x8000))
+	    {
+		BYTE *p = (BYTE*)pModule + pModule->res_table + pTypeInfo->type_id;
+		if ((*p == len) && !lstrncmpi32A( p+1, str, len ))
+		{
+		    dprintf_resource( stddeb, "  Found type '%s'\n", str );
+		    return pTypeInfo;
+		}
+	    }
+	    dprintf_resource( stddeb, "  Skipping type %04x\n", pTypeInfo->type_id );
+	    pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
+	}
+    }
+    else  /* Numeric type id */
+    {
+	WORD id = LOWORD(typeId) | 0x8000;
+	while (pTypeInfo->type_id)
+	{
+            if (pTypeInfo->type_id == id)
+	    {
+		dprintf_resource( stddeb, "  Found type %04x\n", id );
+		return pTypeInfo;
+	    }
+	    dprintf_resource( stddeb, "  Skipping type %04x\n", pTypeInfo->type_id );
+	    pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
+	}
+    }
+    return NULL;
+}
 
 /***********************************************************************
  *           NE_FindResourceFromType
@@ -131,6 +176,83 @@
 
 
 /***********************************************************************
+ *           NE_DefResourceHandler
+ *
+ * This is the default LoadProc() function. 
+ */
+HGLOBAL16 WINAPI NE_DefResourceHandler( HGLOBAL16 hMemObj, HMODULE16 hModule,
+                                        HRSRC16 hRsrc )
+{
+    int  fd;
+    NE_MODULE* pModule = MODULE_GetPtr( hModule );
+    if ( pModule && (fd = MODULE_OpenFile( hModule )) >= 0)
+    {
+	HGLOBAL16 handle;
+	WORD sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
+	NE_NAMEINFO* pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
+
+        dprintf_resource( stddeb, "NEResourceHandler: loading, pos=%d, len=%d\n",
+                         (int)pNameInfo->offset << sizeShift,
+                         (int)pNameInfo->length << sizeShift );
+	if( hMemObj )
+	    handle = GlobalReAlloc16( hMemObj, pNameInfo->length << sizeShift, 0 );
+	else
+	    handle = NE_AllocResource( hModule, hRsrc, 0 );
+
+	if( handle )
+	{
+            lseek( fd, (int)pNameInfo->offset << sizeShift, SEEK_SET );
+            read( fd, GlobalLock16( handle ), (int)pNameInfo->length << sizeShift );
+	}
+	return handle;
+    }
+    return (HGLOBAL16)0;
+}
+
+/***********************************************************************
+ *           NE_InitResourceHandler
+ *
+ * Fill in 'resloader' fields in the resource table.
+ */
+BOOL32 NE_InitResourceHandler( HMODULE16 hModule )
+{
+    NE_MODULE *pModule = MODULE_GetPtr( hModule );
+    NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
+
+    dprintf_resource(stddeb,"InitResourceHandler[%04x]\n", hModule );
+
+    while(pTypeInfo->type_id)
+    {
+	pTypeInfo->resloader = (DWORD)&NE_DefResourceHandler;
+	pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
+    }
+    return TRUE;
+}
+
+/***********************************************************************
+ *           NE_SetResourceHandler
+ */
+FARPROC32 NE_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, 
+				 FARPROC32 resourceHandler )
+{
+    NE_MODULE *pModule = MODULE_GetPtr( hModule );
+    NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
+    FARPROC32  prevHandler = NULL;
+
+    do
+    {
+	pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, typeId );
+        if( pTypeInfo )
+        {
+	    prevHandler = (FARPROC32)pTypeInfo->resloader;
+	    pTypeInfo->resloader = (DWORD)resourceHandler;
+	    pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
+        }
+    } while( pTypeInfo );
+    return prevHandler;
+}
+
+/***********************************************************************
  *           NE_FindResource
  */
 HRSRC16 NE_FindResource( HMODULE16 hModule, SEGPTR typeId, SEGPTR resId )
@@ -142,10 +264,12 @@
     if (!pModule || !pModule->res_table) return 0;
     pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
 
-    if (HIWORD(typeId) || HIWORD(resId))
+    if ((pModule->expected_version < 0x030a) && (HIWORD(typeId) || HIWORD(resId)))
     {
-        /* Search the names in the nametable */
-        DWORD id = NE_FindNameTableId( hModule, typeId, resId );
+        /* Search the names in the nametable (which is not present 
+         * since Windows 3.1).  */
+
+        DWORD id = NE_FindNameTableId( pModule, typeId, resId );
         if (id)  /* found */
         {
             typeId = LOWORD(id);
@@ -153,60 +277,27 @@
         }
     }
 
-    if (HIWORD(typeId) != 0)  /* Named type */
+    do
     {
-        char *str = (char *)PTR_SEG_TO_LIN( typeId );
-        BYTE len = strlen( str );
-        while (pTypeInfo->type_id)
-        {
-            if (!(pTypeInfo->type_id & 0x8000))
-            {
-                BYTE *p = (BYTE*)pModule+pModule->res_table+pTypeInfo->type_id;
-                if ((*p == len) && !lstrncmpi32A( p+1, str, len ))
-                {
-                    dprintf_resource( stddeb, "  Found type '%s'\n", str );
-                    hRsrc = NE_FindResourceFromType(pModule, pTypeInfo, resId);
-                    if (hRsrc)
-                    {
-                        dprintf_resource( stddeb, "    Found id %08lx\n", resId );
-                        return hRsrc;
-                    }
-                    dprintf_resource( stddeb, "    Not found, going on\n" );
-                }
-            }
-            dprintf_resource( stddeb, "  Skipping type %04x\n",
-                              pTypeInfo->type_id );
-            pTypeInfo = (NE_TYPEINFO *)((char*)(pTypeInfo+1) +
-                                       pTypeInfo->count * sizeof(NE_NAMEINFO));
-        }
-    }
-    else  /* Numeric type id */
-    {
-        WORD id = LOWORD(typeId) | 0x8000;
-        while (pTypeInfo->type_id)
-        {
-            if (pTypeInfo->type_id == id)
-            {
-                dprintf_resource( stddeb, "  Found type %04x\n", id );
-                hRsrc = NE_FindResourceFromType( pModule, pTypeInfo, resId );
-                if (hRsrc)
-                {
-                    dprintf_resource( stddeb, "    Found id %08lx\n", resId );
-                    return hRsrc;
-                }
-                dprintf_resource( stddeb, "    Not found, going on\n" );
-            }
-            dprintf_resource( stddeb, "  Skipping type %04x\n",
-                              pTypeInfo->type_id );
-            pTypeInfo = (NE_TYPEINFO *)((char*)(pTypeInfo+1) +
-                                       pTypeInfo->count * sizeof(NE_NAMEINFO));
-        }
-    }
+	pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, typeId );
+        if( pTypeInfo )
+	{
+	    hRsrc = NE_FindResourceFromType(pModule, pTypeInfo, resId);
+	    if( hRsrc )
+	    {
+		dprintf_resource( stddeb, "    Found id %08lx\n", resId );
+		return hRsrc;
+	    }
+	    dprintf_resource( stddeb, "    Not found, going on\n" );
+	    pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
+	}
+    } while( pTypeInfo );
+
+    dprintf_resource( stddeb, "failed!\n");
     return 0;
 }
 
 
-
 /***********************************************************************
  *           NE_AllocResource
  */
@@ -273,33 +364,67 @@
  */
 HGLOBAL16 NE_LoadResource( HMODULE16 hModule,  HRSRC16 hRsrc )
 {
-    NE_NAMEINFO *pNameInfo=NULL;
-    WORD sizeShift;
-    int fd;
-
+    NE_TYPEINFO *pTypeInfo;
+    NE_NAMEINFO *pNameInfo = NULL;
     NE_MODULE *pModule = MODULE_GetPtr( hModule );
-    if (!pModule || !pModule->res_table) return 0;
+    int d;
+
+    if (!hRsrc || !pModule || !pModule->res_table) return 0;
+
+    /* First, verify hRsrc (just an offset from pModule to the needed pNameInfo) */
+
+    d = pModule->res_table + 2;
+    pTypeInfo = (NE_TYPEINFO *)((char *)pModule + d);
 #ifndef WINELIB
-    pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
-#endif
-    if (pNameInfo->handle)
+    while( hRsrc > d )
     {
-        pNameInfo->usage++;
-        dprintf_resource( stddeb, "  Already loaded, new count=%d\n",
-                          pNameInfo->usage );
-        return pNameInfo->handle;
+	if (pTypeInfo->type_id == 0)
+		break; /* terminal entry */
+	d += sizeof(NE_TYPEINFO) + pTypeInfo->count * sizeof(NE_NAMEINFO);
+	if (hRsrc < d)
+	{
+	    if( ((d - hRsrc)%sizeof(NE_NAMEINFO)) == 0 )
+	    {
+		pNameInfo = (NE_NAMEINFO *)(((char *)pModule) + hRsrc);
+		break;
+	    }
+	    else 
+		break; /* NE_NAMEINFO boundary mismatch */
+	}
+	pTypeInfo = (NE_TYPEINFO *)(((char *)pModule) + d);
     }
-    sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
-    dprintf_resource( stddeb, "  Loading, pos=%d, len=%d\n",
-                      (int)pNameInfo->offset << sizeShift,
-                      (int)pNameInfo->length << sizeShift );
-    if ((fd = MODULE_OpenFile( hModule )) == -1) return 0;
-    pNameInfo->handle = NE_AllocResource( hModule, hRsrc, 0 );
-    pNameInfo->usage = 1;
-    lseek( fd, (int)pNameInfo->offset << sizeShift, SEEK_SET );
-    read( fd, GlobalLock16( pNameInfo->handle ),
-          (int)pNameInfo->length << sizeShift );
-    return pNameInfo->handle;
+#endif
+    if (pNameInfo)
+    {
+	RESOURCEHANDLER16 __r16loader;
+	if (pNameInfo->handle
+	    && !(GlobalFlags16(pNameInfo->handle) & GMEM_DISCARDED))
+	{
+	    pNameInfo->usage++;
+	    dprintf_resource( stddeb, "  Already loaded, new count=%d\n",
+			      pNameInfo->usage );
+	}
+	else
+	{
+	    if (pTypeInfo->resloader)
+	  	__r16loader = (RESOURCEHANDLER16)pTypeInfo->resloader;
+	    else /* this is really bad */
+	    {
+		fprintf( stderr, "[%04x]: Missing resource handler!!!...\n", hModule);
+		__r16loader = NE_DefResourceHandler;
+	    }
+
+	    /* Finally call resource loader */
+
+	    if ((pNameInfo->handle = __r16loader(pNameInfo->handle, hModule, hRsrc)))
+	    {
+		pNameInfo->usage++;
+		pNameInfo->flags |= NE_SEGFLAGS_LOADED;
+	    }
+	}
+	return pNameInfo->handle;
+    }
+    return 0;
 }
 
 
@@ -324,7 +449,7 @@
     WORD count;
 
     NE_MODULE *pModule = MODULE_GetPtr( hModule );
-    if (!pModule || !pModule->res_table) return handle;
+    if (!handle || !pModule || !pModule->res_table) return handle;
     pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
     while (pTypeInfo->type_id)
     {
@@ -345,7 +470,10 @@
         }
         pTypeInfo = (NE_TYPEINFO *)pNameInfo;
     }
-    fprintf( stderr, "NE_FreeResource: %04x %04x not found!\n", hModule, handle );
+
+    dprintf_resource(stddeb, "NE_FreeResource[%04x]: no intrinsic resource for %04x\n", 
+			      hModule, handle );
+    GlobalFree16( handle ); /* it could have been DirectResAlloc()'ed */
     return handle;
 }
 #endif /* WINELIB */
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 223348b..415094f 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -17,11 +17,14 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
 #include "windows.h"
 #include "winbase.h"
 #include "callback.h"
 #include "neexe.h"
 #include "peexe.h"
+#include "process.h"
 #include "pe_image.h"
 #include "module.h"
 #include "global.h"
@@ -33,8 +36,7 @@
 #include "debugger.h"
 #include "xmalloc.h"
 
-static void PE_InitDLL(HMODULE16 hModule, DWORD type, LPVOID lpReserved);
-
+static void PE_InitDLL(PE_MODREF* modref, DWORD type, LPVOID lpReserved);
 
 /* convert PE image VirtualAddress to Real Address */
 #define RVA(x) ((unsigned int)load_addr+(unsigned int)(x))
@@ -91,25 +93,40 @@
  */
 FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
 {
-	IMAGE_EXPORT_DIRECTORY * exports = pe->pe_export;
-	unsigned load_addr = pe->load_addr;
-	u_short * ordinal;
-	u_long * function;
-	u_char ** name, *ename;
-	int i;
+	IMAGE_EXPORT_DIRECTORY 		*exports;
+	unsigned			load_addr;
+	u_short				* ordinal;
+	u_long				* function;
+	u_char				** name, *ename;
+	int				i;
+	PDB32				*process=(PDB32*)GetCurrentProcessId();
+	PE_MODREF			*pem;
+
+	pem = process->modref_list;
+	while (pem && (pem->pe_module != pe))
+		pem=pem->next;
+	if (!pem) {
+		fprintf(stderr,"No MODREF found for PE_MODULE %p in process %p\n",pe,process);
+		return NULL;
+	}
+	load_addr	= pem->load_addr;
+	exports		= pem->pe_export;
 
 	if (HIWORD(funcName))
 		dprintf_win32(stddeb,"PE_FindExportedFunction(%s)\n",funcName);
 	else
 		dprintf_win32(stddeb,"PE_FindExportedFunction(%d)\n",(int)funcName);
-	if (!exports)
+	if (!exports) {
+		fprintf(stderr,"Module %p/MODREF %p doesn't have a exports table.\n",pe,pem);
 		return NULL;
-	ordinal=(u_short*) RVA(exports->AddressOfNameOrdinals);
-	function=(u_long*) RVA(exports->AddressOfFunctions);
-	name=(u_char **) RVA(exports->AddressOfNames);
+	}
+	ordinal	= (u_short*)  RVA(exports->AddressOfNameOrdinals);
+	function= (u_long*)   RVA(exports->AddressOfFunctions);
+	name	= (u_char **) RVA(exports->AddressOfNames);
+
 	if (HIWORD(funcName)) {
 		for(i=0; i<exports->NumberOfNames; i++) {
-			ename=(char*) RVA(*name);
+			ename=(char*)RVA(*name);
 			if(!strcmp(ename,funcName))
 				return (FARPROC32) RVA(function[*ordinal]);
 			ordinal++;
@@ -127,18 +144,17 @@
 }
 
 void 
-fixup_imports (struct pe_data *pe, HMODULE16 hModule)
+fixup_imports (PDB32 *process,PE_MODREF *pem)
 {
-    IMAGE_IMPORT_DESCRIPTOR *pe_imp;
-    int	fixup_failed = 0;
-    unsigned int load_addr = pe->load_addr;
-    int i;
-    NE_MODULE *ne_mod;
-    HMODULE16 *mod_ptr;
-    char *modname;
+    PE_MODULE			*pe = pem->pe_module;
+    IMAGE_IMPORT_DESCRIPTOR	*pe_imp;
+    int	fixup_failed		= 0;
+    unsigned int load_addr	= pem->load_addr;
+    int				i;
+    char			*modname;
     
-    if (pe->pe_export)
-    	modname = (char*) RVA(pe->pe_export->Name);
+    if (pem->pe_export)
+    	modname = (char*) RVA(pem->pe_export->Name);
     else
         modname = "<unknown>";
 
@@ -146,40 +162,77 @@
     dprintf_win32 (stddeb, "\nDumping imports list\n");
 
     /* first, count the number of imported non-internal modules */
-    pe_imp = pe->pe_import;
+    pe_imp = pem->pe_import;
+    if (!pe_imp) 
+    	fprintf(stderr,"no import directory????\n");
 
     /* FIXME: should terminate on 0 Characteristics */
     for (i = 0; pe_imp->Name; pe_imp++)
 	i++;
 
-    /* Now, allocate memory for dlls_to_init */
-    ne_mod = GlobalLock16 (hModule);
-    ne_mod->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT, (i+1)*sizeof(HMODULE16),
-                                        hModule, FALSE, FALSE, FALSE);
-    mod_ptr = GlobalLock16 (ne_mod->dlls_to_init);
-    /* load the modules and put their handles into the list */
+    /* load the imported modules. They are automatically 
+     * added to the modref list of the process.
+     */
  
-     /* FIXME: should terminate on 0 Characteristics */
-     for (i = 0, pe_imp = pe->pe_import; pe_imp->Name; pe_imp++) {
+    /* FIXME: should terminate on 0 Characteristics */
+    for (i = 0, pe_imp = pem->pe_import; pe_imp->Name; pe_imp++) {
+    	HMODULE32	res;
+	PE_MODREF	*xpem,**ypem;
+
+
  	char *name = (char *) RVA(pe_imp->Name);
-	mod_ptr[i] = MODULE_Load( name, (LPVOID)-1, FALSE );
-	if (mod_ptr[i] <= (HMODULE16) 32) {
+
+	/* don't use MODULE_Load, Win32 creates new task differently */
+	res = PE_LoadLibraryEx32A( name, 0, 0 );
+	if (res <= (HMODULE32) 32) {
 	    char *p, buffer[256];
 
 	    /* Try with prepending the path of the current module */
-	    GetModuleFileName16 (hModule, buffer, sizeof (buffer));
+	    GetModuleFileName32A (pe->mappeddll, buffer, sizeof (buffer));
 	    if (!(p = strrchr (buffer, '\\')))
 		p = buffer;
 	    strcpy (p + 1, name);
-	    mod_ptr[i] = MODULE_Load( buffer, (LPVOID)-1, FALSE );
+	    res = PE_LoadLibraryEx32A( buffer, 0, 0 );
 	}
-	if (mod_ptr[i] <= (HMODULE16) 32) {
+	if (res <= (HMODULE32) 32) {
 	    fprintf (stderr, "Module %s not found\n", name);
 	    exit (0);
 	}
+	res = MODULE_HANDLEtoHMODULE32(res);
+	xpem = pem->next;
+	while (xpem) {
+		if (xpem->pe_module->mappeddll == res)
+			break;
+		xpem = xpem->next;
+	}
+	if (xpem) {
+		/* it has been loaded *BEFORE* us, so we have to init
+		 * it before us. we just swap the two modules which should
+		 * work.
+		 */
+		/* unlink xpem from chain */
+		ypem = &(process->modref_list);
+		while (*ypem) {
+			if ((*ypem)==xpem)
+				break;
+			ypem = &((*ypem)->next);
+		}
+		*ypem		= xpem->next;
+
+		/* link it directly before pem */
+		ypem		= &(process->modref_list);
+		while (*ypem) {
+			if ((*ypem)==pem)
+				break;
+			ypem = &((*ypem)->next);
+		}
+		*ypem		= xpem;
+		xpem->next	= pem;
+		
+	}
 	i++;
     }
-    pe_imp = pe->pe_import;
+    pe_imp = pem->pe_import;
     while (pe_imp->Name) {
 	char			*Module;
 	IMAGE_IMPORT_BY_NAME	*pe_name;
@@ -269,9 +322,9 @@
     if (fixup_failed) exit(1);
 }
 
-static void calc_vma_size(struct pe_data *pe)
+static int calc_vma_size(struct pe_data *pe)
 {
-  int i;
+  int i,vma_size = 0;
 
   dprintf_win32(stddeb, "Dump of segment table\n");
   dprintf_win32(stddeb, "   Name    VSz  Vaddr     SzRaw   Fileadr  *Reloc *Lineum #Reloc #Linum Char\n");
@@ -288,19 +341,21 @@
 	     pe->pe_seg[i].NumberOfRelocations,
 	     pe->pe_seg[i].NumberOfLinenumbers,
 	     pe->pe_seg[i].Characteristics);
-	  pe->vma_size = MAX(pe->vma_size,
+	  vma_size = MAX(vma_size,
 	  		pe->pe_seg[i].VirtualAddress + 
 			pe->pe_seg[i].SizeOfRawData);
     }
+    return vma_size;
 }
 
-static void do_relocations(struct pe_data *pe)
+static void do_relocations(PE_MODREF *pem)
 {
-	int delta = pe->load_addr - pe->base_addr;
-	unsigned int load_addr = pe->load_addr;
-	IMAGE_BASE_RELOCATION	*r = pe->pe_reloc;
-	int hdelta = (delta >> 16) & 0xFFFF;
-	int ldelta = delta & 0xFFFF;
+	int delta = pem->load_addr - pem->pe_module->pe_header->OptionalHeader.ImageBase;
+
+	unsigned int			load_addr= pem->load_addr;
+	IMAGE_BASE_RELOCATION		*r = pem->pe_reloc;
+	int				hdelta = (delta >> 16) & 0xFFFF;
+	int				ldelta = delta & 0xFFFF;
 
 	/* int reloc_size = */
 
@@ -360,27 +415,47 @@
 
 /**********************************************************************
  *			PE_LoadImage
- * Load one PE format executable into memory
+ * Load one PE format DLL/EXE into memory
+ * 
+ * Unluckily we can't just mmap the sections where we want them, for 
+ * (at least) Linux does only support offset with are multiples of the
+ * underlying filesystemblocksize, but PE DLLs usually have alignments of 512
+ * byte. This fails for instance when you try to map from CDROM (bsize 2048).
+ *
+ * BUT we have to map the whole image anyway, for Win32 programs sometimes
+ * want to access them. (HMODULE32 point to the start of it)
  */
-static void PE_LoadImage( struct pe_data **ret_pe, int fd, HMODULE16 hModule, WORD offset, OFSTRUCT *ofs )
+static PE_MODULE *PE_LoadImage( int fd )
 {
 	struct pe_data		*pe;
-	int			i, result;
-	int			load_addr;
-	IMAGE_DATA_DIRECTORY	dir;
-	char			buffer[200];
 	DBG_ADDR		daddr;
-	char			*modname;
+	struct stat		stbuf;
 
 	daddr.seg=0;
 	daddr.type = NULL;
+	if (-1==fstat(fd,&stbuf)) {
+		perror("PE_LoadImage:fstat");
+		return NULL;
+	}
 	pe = xmalloc(sizeof(struct pe_data));
 	memset(pe,0,sizeof(struct pe_data));
-	pe->pe_header = xmalloc(sizeof(IMAGE_NT_HEADERS));
 
-	/* read PE header */
-	lseek( fd, offset, SEEK_SET);
-	read( fd, pe->pe_header, sizeof(IMAGE_NT_HEADERS));
+	/* map the PE image somewhere */
+	pe->mappeddll = (HMODULE32)mmap(NULL,stbuf.st_size,PROT_READ,MAP_SHARED,fd,0);
+	if (!pe->mappeddll || pe->mappeddll==-1) {
+		perror("PE_LoadImage:mmap");
+		free(pe);
+		return NULL;
+	}
+	/* link PE header */
+	pe->pe_header = (IMAGE_NT_HEADERS*)(pe->mappeddll+(((IMAGE_DOS_HEADER*)pe->mappeddll)->e_lfanew));
+	if (pe->pe_header->Signature!=IMAGE_NT_SIGNATURE) {
+		fprintf(stderr,"image doesn't have PE signature, but 0x%08lx\n",
+			pe->pe_header->Signature
+		);
+		free(pe);
+		return NULL;
+	}
 
 	if (pe->pe_header->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) {
 		fprintf(stderr,"trying to load PE image for unsupported architecture (");
@@ -403,48 +478,66 @@
 			fprintf(stderr,"Unknown-%04x",pe->pe_header->FileHeader.Machine);break;
 		}
 		fprintf(stderr,")\n");
-		return;
+		return NULL;
 	}
-/* FIXME: this is a *horrible* hack to make COMDLG32.DLL load OK. The
- * problem needs to be fixed properly at some stage 
+	pe->pe_seg = (IMAGE_SECTION_HEADER*)(((LPBYTE)(pe->pe_header+1))-
+		 (16 - pe->pe_header->OptionalHeader.NumberOfRvaAndSizes) * sizeof(IMAGE_DATA_DIRECTORY));
+
+/* FIXME: the (16-...) is a *horrible* hack to make COMDLG32.DLL load OK. The
+ * 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);
+ 	return pe;
+}
+
+/**********************************************************************
+ * This maps a loaded PE dll into the address space of the specified process.
+ */
+void
+PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
+	PE_MODREF		*pem;
+	int			i, result;
+	int			load_addr;
+	IMAGE_DATA_DIRECTORY	dir;
+	char			buffer[200];
+	DBG_ADDR		daddr;
+	char			*modname;
+	int			vma_size;
+	
+	pem		= (PE_MODREF*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*pem));
+	/* NOTE: fixup_imports takes care of the correct order */
+	pem->next	= process->modref_list;
+	process->modref_list = pem;
+
+	pem->pe_module	= pe;
+	if (!(pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL)) {
+		if (process->exe_modref)
+			fprintf(stderr,"overwriting old exe_modref... arrgh\n");
+		process->exe_modref = pem;
 	}
 
-	/* read sections */
-	pe->pe_seg = xmalloc(sizeof(IMAGE_SECTION_HEADER) * 
-				   pe->pe_header->FileHeader.NumberOfSections);
-	read( fd, pe->pe_seg, sizeof(IMAGE_SECTION_HEADER) * 
-			pe->pe_header->FileHeader.NumberOfSections);
-
-	load_addr = pe->pe_header->OptionalHeader.ImageBase;
-	pe->base_addr=load_addr;
-	pe->vma_size=0;
+	load_addr 	= pe->pe_header->OptionalHeader.ImageBase;
 	dprintf_win32(stddeb, "Load addr is %x\n",load_addr);
-	calc_vma_size(pe);
-	load_addr = (int) VirtualAlloc( (void*)pe->base_addr, pe->vma_size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
-        pe->load_addr = load_addr;
+	vma_size = calc_vma_size(pe);
+	load_addr 	= (int) VirtualAlloc( (void*)load_addr, vma_size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
+        pem->load_addr	= load_addr;
 
-	dprintf_win32(stddeb, "Load addr is really %x, range %x\n",
-		pe->load_addr, pe->vma_size);
+	dprintf_win32(stddeb, "Load addr is really %lx, range %x\n",
+		pem->load_addr, vma_size);
 	
 
 	for(i=0; i < pe->pe_header->FileHeader.NumberOfSections; i++)
 	{
-		/* load only non-BSS segments */
-		if(!(pe->pe_seg[i].Characteristics & 
-			IMAGE_SCN_CNT_UNINITIALIZED_DATA))
-                {
-                    if(lseek(fd,pe->pe_seg[i].PointerToRawData,SEEK_SET) == -1
-                       || read(fd,(char*)RVA(pe->pe_seg[i].VirtualAddress),
-                               pe->pe_seg[i].SizeOfRawData) != pe->pe_seg[i].SizeOfRawData)
-                    {
-			fprintf(stderr,"Failed to load section %x\n", i);
-			exit(0);
-                    }
-                }
+		/* memcpy only non-BSS segments */
+		/* FIXME: this should be done by mmap(..MAP_PRIVATE|MAP_FIXED..)
+		 * but it is not possible for (at least) Linux needs an offset
+		 * aligned to a block on the filesystem.
+		 */
+		if(!(pe->pe_seg[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA))
+		    memcpy((char*)RVA(pe->pe_seg[i].VirtualAddress),
+		    	(char*)(pe->mappeddll+pe->pe_seg[i].PointerToRawData),
+			pe->pe_seg[i].SizeOfRawData
+		    );
+
 		result = RVA (pe->pe_seg[i].VirtualAddress);
 #if 1
 		/* not needed, memory is zero */
@@ -456,16 +549,16 @@
 #endif
 
 		if(strcmp(pe->pe_seg[i].Name, ".idata") == 0)
-			pe->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) result;
+			pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) result;
 
 		if(strcmp(pe->pe_seg[i].Name, ".edata") == 0)
-			pe->pe_export = (LPIMAGE_EXPORT_DIRECTORY) result;
+			pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) result;
 
 		if(strcmp(pe->pe_seg[i].Name, ".rsrc") == 0)
-			pe->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) result;
+			pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) result;
 
 		if(strcmp(pe->pe_seg[i].Name, ".reloc") == 0)
-			pe->pe_reloc = (LPIMAGE_BASE_RELOCATION) result;
+			pem->pe_reloc = (LPIMAGE_BASE_RELOCATION) result;
 	}
 
 	/* There is word that the actual loader does not care about the
@@ -473,26 +566,26 @@
 	dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
 	if(dir.Size)
 	{
-		if(pe->pe_export && (int)pe->pe_export!=RVA(dir.VirtualAddress))
+		if(pem->pe_export && (int)pem->pe_export!=RVA(dir.VirtualAddress))
 			fprintf(stderr,"wrong export directory??\n");
 		/* always trust the directory */
-		pe->pe_export = (LPIMAGE_EXPORT_DIRECTORY) RVA(dir.VirtualAddress);
+		pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) RVA(dir.VirtualAddress);
 	}
 
 	dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
 	if(dir.Size)
 	{
-		if(pe->pe_import && (int)pe->pe_import!=RVA(dir.VirtualAddress))
+		if(pem->pe_import && (int)pem->pe_import!=RVA(dir.VirtualAddress))
 			fprintf(stderr,"wrong import directory??\n");
-		pe->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) RVA(dir.VirtualAddress);
+		pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) RVA(dir.VirtualAddress);
 	}
 
 	dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
 	if(dir.Size)
 	{
-		if(pe->pe_resource && (int)pe->pe_resource!=RVA(dir.VirtualAddress))
+		if(pem->pe_resource && (int)pem->pe_resource!=RVA(dir.VirtualAddress))
 			fprintf(stderr,"wrong resource directory??\n");
-		pe->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) RVA(dir.VirtualAddress);
+		pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) RVA(dir.VirtualAddress);
 	}
 
 	if(pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size)
@@ -506,15 +599,15 @@
 	dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
 	if(dir.Size)
 	{
-		if(pe->pe_reloc && (int)pe->pe_reloc!= RVA(dir.VirtualAddress))
+		if(pem->pe_reloc && (int)pem->pe_reloc!= RVA(dir.VirtualAddress))
 			fprintf(stderr,"wrong relocation list??\n");
-		pe->pe_reloc = (void *) RVA(dir.VirtualAddress);
+		pem->pe_reloc = (void *) RVA(dir.VirtualAddress);
 	}
 
 	if(pe->pe_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_DEBUG].Size)
 	  {
-	    DEBUG_RegisterDebugInfo(fd, pe, load_addr, 
+	    DEBUG_RegisterDebugInfo(pe, load_addr, 
 			pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress,
 			pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size);
 	  }
@@ -549,18 +642,12 @@
 	if(pe->pe_header->OptionalHeader.DataDirectory[15].Size)
 		dprintf_win32(stdnimp,"Unknown directory 15 ignored\n");
 
-	if(pe->pe_reloc) do_relocations(pe);
-
-	/* Do exports before imports because fixup_imports
-	 * may load a module that references this module.
-	 */
-
-	if(pe->pe_export) dump_exports(pe->pe_export,load_addr);
-	*ret_pe = pe;	/* make export list available for GetProcAddress */
-	if(pe->pe_import) fixup_imports(pe, hModule);
+	if(pem->pe_reloc)	do_relocations(pem);
+	if(pem->pe_export)	dump_exports(pem->pe_export,load_addr);
+	if(pem->pe_import)	fixup_imports(process,pem);
   		
-	if (pe->pe_export)
-		modname = (char*)RVA(pe->pe_export->Name);
+	if (pem->pe_export)
+		modname = (char*)RVA(pem->pe_export->Name);
 	else {
 		char *s;
 		modname = s = ofs->szPathName;
@@ -587,31 +674,70 @@
 
 HINSTANCE16 MODULE_CreateInstance(HMODULE16 hModule,LOADPARAMS *params);
 
+/******************************************************************************
+ * The PE Library Loader frontend. 
+ * FIXME: handle the flags.
+ */
+HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
+	OFSTRUCT	ofs;
+	HMODULE32	hModule;
+	NE_MODULE	*pModule;
+
+	if ((hModule = MODULE_FindModule( name )))
+		return hModule;
+
+	/* try to load builtin, enabled modules first */
+	if ((hModule = BUILTIN_LoadModule( name, FALSE )))
+		return hModule;
+
+	/* try to open the specified file */
+	if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) {
+		/* Now try the built-in even if disabled */
+		if ((hModule = BUILTIN_LoadModule( name, TRUE ))) {
+			fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
+			return hModule;
+		}
+		return 1;
+	}
+	if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) {
+		_lclose32(hFile);
+		return hModule;
+	}
+
+	pModule		= (NE_MODULE *)GlobalLock16( hModule );
+	pModule->flags	= NE_FFLAGS_WIN32;
+
+	/* FIXME: check if pe image loaded already ... */
+	pModule->pe_module = PE_LoadImage( FILE_GetUnixHandle(hFile) );
+	_lclose32(hFile);
+	if (!pModule->pe_module)
+		return 21;
+	/* recurse */
+	PE_MapImage(pModule->pe_module,(PDB32*)GetCurrentProcessId(),&ofs,flags);
+	return pModule->pe_module->mappeddll;
+}
+
+/*****************************************************************************
+ * Load the PE main .EXE. All other loading is done by PE_LoadLibraryEx32A
+ * FIXME: this function should use PE_LoadLibraryEx32A, but currently can't
+ * due to the TASK_CreateTask stuff.
+ */
 HINSTANCE16 PE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, LOADPARAMS* params )
 {
     HMODULE16 hModule;
     HINSTANCE16 hInstance;
     NE_MODULE *pModule;
-    IMAGE_DOS_HEADER mz_header;
-    int fd;
 
     if ((hModule = MODULE_CreateDummyModule( ofs )) < 32) return hModule;
     pModule = (NE_MODULE *)GlobalLock16( hModule );
     pModule->flags = NE_FFLAGS_WIN32;
 
-    /* FIXME: Hack because PE_LoadModule is recursive */
-    fd = dup( FILE_GetUnixHandle(hFile) );
-    _lclose32( hFile );
-    lseek( fd, 0, SEEK_SET );
-    read( fd, &mz_header, sizeof(mz_header) );
-
-    PE_LoadImage( &pModule->pe_module, fd, hModule, mz_header.e_lfanew, ofs );
+    pModule->pe_module = PE_LoadImage( FILE_GetUnixHandle(hFile) );
+    _lclose32(hFile);
     if (!pModule->pe_module)
     	return 21;
-    close( fd );
 
     hInstance = MODULE_CreateInstance( hModule, params );
-
     if (!(pModule->pe_module->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL))
     {
         TASK_CreateTask( hModule, hInstance, 0,
@@ -619,10 +745,11 @@
                          (LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
                          *((WORD*)PTR_SEG_TO_LIN(params->showCmd) + 1) );
     }
+    PE_MapImage(pModule->pe_module,(PDB32*)GetCurrentProcessId(),ofs,0);
     return hInstance;
 }
 
-int PE_UnloadImage( HMODULE16 hModule )
+int PE_UnloadImage( HMODULE32 hModule )
 {
 	printf("PEunloadImage() called!\n");
 	/* free resources, image, unmap */
@@ -634,19 +761,13 @@
  * DLL_PROCESS_ATTACH. Only new created threads do DLL_THREAD_ATTACH
  * (SDK)
  */
-static void PE_InitDLL(HMODULE16 hModule, DWORD type,LPVOID lpReserved)
+static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved)
 {
-    NE_MODULE *pModule;
-    PE_MODULE *pe;
-    unsigned int load_addr;
+    PE_MODULE		*pe = pem->pe_module;
+    unsigned int	load_addr = pem->load_addr;
 
-    hModule = GetExePtr(hModule);
-    if (!(pModule = MODULE_GetPtr(hModule))) return;
-    if (!(pModule->flags & NE_FFLAGS_WIN32) || !(pe = pModule->pe_module))
-        return;
-
-    load_addr = pe->load_addr;
-
+    if (type==DLL_PROCESS_ATTACH)
+	pem->flags |= PE_MODREF_PROCESS_ATTACHED;
 #ifndef WINELIB
     if (Options.debug) {
             DBG_ADDR addr = { NULL, 0, RVA(pe->pe_header->OptionalHeader.AddressOfEntryPoint) };
@@ -666,58 +787,81 @@
     if (	(pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
 		(pe->pe_header->OptionalHeader.AddressOfEntryPoint)
     ) {
-	printf("InitPEDLL() called!\n");
-	CallDLLEntryProc32( 
-	    (FARPROC32)RVA(pe->pe_header->OptionalHeader.AddressOfEntryPoint),
-	    hModule,
-	    type,
-	    (DWORD)lpReserved
-	);
+        FARPROC32 entry = (FARPROC32)RVA(pe->pe_header->OptionalHeader.AddressOfEntryPoint);
+        dprintf_relay( stddeb, "CallTo32(entryproc=%p,module=%d,type=%ld,res=%p)\n",
+                       entry, pe->mappeddll, type, lpReserved );
+        entry( pe->mappeddll, type, lpReserved );
     }
 }
 
-void PE_InitializeDLLs(HMODULE16 hModule,DWORD type,LPVOID lpReserved)
-{
-	NE_MODULE *pModule;
-	HMODULE16 *pDLL;
-	pModule = MODULE_GetPtr( GetExePtr(hModule) );
-	if (pModule->dlls_to_init)
-	{
-		HGLOBAL16 to_init = pModule->dlls_to_init;
-		pModule->dlls_to_init = 0;
-	
-		for (pDLL = (HMODULE16 *)GlobalLock16( to_init ); *pDLL; pDLL++)
-		{
-                    PE_InitializeDLLs( *pDLL, type, lpReserved);
+/* Call the DLLentry function of all dlls used by that process.
+ * (NOTE: this may recursively call this function (if a library calls
+ * LoadLibrary) ... but it won't matter)
+ */
+void PE_InitializeDLLs(PDB32 *process,DWORD type,LPVOID lpReserved) {
+	PE_MODREF	*pem;
+
+	pem = process->modref_list;
+	while (pem) {
+		if (pem->flags & PE_MODREF_NO_DLL_CALLS) {
+			pem = pem->next;
+			continue;
 		}
-		GlobalFree16( to_init );
+		if (type==DLL_PROCESS_ATTACH) {
+			if (pem->flags & PE_MODREF_PROCESS_ATTACHED) {
+				pem = pem->next;
+				continue;
+			}
+		}
+		PE_InitDLL( pem, type, lpReserved );
+		pem = pem->next;
 	}
-	PE_InitDLL( hModule, type, lpReserved );
 }
 
-void PE_InitTls( PE_MODULE *module )
+void PE_InitTls(PDB32 *pdb)
 {
-   /* FIXME: tls callbacks ??? */
-   DWORD  index;
-   DWORD  datasize;
-   DWORD  size;
-   LPVOID mem;
-   LPIMAGE_TLS_DIRECTORY pdir;
+	/* FIXME: tls callbacks ??? */
+	PE_MODREF		*pem;
+	IMAGE_NT_HEADERS	*peh;
+	DWORD			size,datasize,index;
+	LPVOID			mem;
+	LPIMAGE_TLS_DIRECTORY	pdir;
 
-    if (!module->pe_header->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress)
-        return;
+	pem = pdb->modref_list;
+	while (pem) {
+		peh = pem->pe_module->pe_header;
+		if (!peh->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress) {
+			pem = pem->next;
+			continue;
+		}
+		pdir = (LPVOID)(pem->load_addr + peh->OptionalHeader.
+			DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress);
+		index	= TlsAlloc();
+		datasize= pdir->EndAddressOfRawData-pdir->StartAddressOfRawData;
+		size	= datasize + pdir->SizeOfZeroFill;
+		mem=VirtualAlloc(0,size,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
+		memcpy(mem,(LPVOID) pdir->StartAddressOfRawData, datasize);
+		TlsSetValue(index,mem);
+		*(pdir->AddressOfIndex)=index;   
+		pem=pem->next;
+	}
+}
 
-    pdir = (LPVOID)(module->load_addr + module->pe_header->OptionalHeader.
-               DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress);
-    index = TlsAlloc();
-    datasize = pdir->EndAddressOfRawData-pdir->StartAddressOfRawData;
-    size     = datasize + pdir->SizeOfZeroFill;
-        
-    mem = VirtualAlloc(0,size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE );
-    
-    memcpy(mem,(LPVOID) pdir->StartAddressOfRawData, datasize);
-    TlsSetValue(index,mem);
-    *(pdir->AddressOfIndex)=index;   
+/****************************************************************************
+ *		DisableThreadLibraryCalls (KERNEL32.74)
+ * Don't call DllEntryPoint for DLL_THREAD_{ATTACH,DETACH} if set.
+ */
+BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32 hModule)
+{
+	PDB32	*process = (PDB32*)GetCurrentProcessId();
+	PE_MODREF	*pem = process->modref_list;
+
+	while (pem) {
+		if (pem->pe_module->mappeddll == hModule)
+			pem->flags|=PE_MODREF_NO_DLL_CALLS;
+		pem = pem->next;
+	}
+	return TRUE;
 }
 
 #endif /* WINELIB */
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index 2d2bbaf..9b8ae7e 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -18,6 +18,8 @@
 #include "pe_image.h"
 #include "module.h"
 #include "heap.h"
+#include "task.h"
+#include "process.h"
 #include "libres.h"
 #include "stackframe.h"
 #include "neexe.h"
@@ -25,20 +27,24 @@
 #include "debug.h"
 
 /**********************************************************************
- *  HMODULE32toPE_MODULE 
+ *  HMODULE32toPE_MODREF 
  *
- * small helper function to get a PE_MODULE from a passed HMODULE32
+ * small helper function to get a PE_MODREF from a passed HMODULE32
  */
-static PE_MODULE*
-HMODULE32toPE_MODULE(HMODULE32 hmod) {
+static PE_MODREF*
+HMODULE32toPE_MODREF(HMODULE32 hmod) {
 	NE_MODULE	*pModule;
+	PDB32		*pdb = (PDB32*)GetCurrentProcessId();
+	PE_MODREF	*pem;
 
 	if (!hmod) hmod = GetTaskDS(); /* FIXME: correct? */
-	hmod = GetExePtr( hmod );  /* In case we were passed an hInstance */
-
+	hmod = MODULE_HANDLEtoHMODULE32( hmod );
+	if (!hmod) return NULL;
 	if (!(pModule = MODULE_GetPtr( hmod ))) return 0;
-	if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;
-	return pModule->pe_module;
+	pem = pdb->modref_list;
+	while (pem && pem->pe_module->mappeddll != hmod)
+		pem=pem->next;
+	return pem;
 }
 
 /**********************************************************************
@@ -106,12 +112,12 @@
     LPIMAGE_RESOURCE_DIRECTORY resdirptr;
     DWORD root;
     HANDLE32 result;
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hModule);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hModule);
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return 0;
 
-    resdirptr = pe->pe_resource;
+    resdirptr = pem->pe_resource;
     root = (DWORD) resdirptr;
     if ((resdirptr = GetResDirEntryW(resdirptr, type, root)) == NULL)
 	return 0;
@@ -130,13 +136,13 @@
  */
 HANDLE32 PE_LoadResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
 {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hModule);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hModule);
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return 0;
     if (!hRsrc)
    	 return 0;
-    return (HANDLE32) (pe->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+    return (HANDLE32) (pem->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
 }
 
 
@@ -169,21 +175,21 @@
 
 DWORD PE_SizeofResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
 {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hModule);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hModule);
     DWORD	max,data;
     IMAGE_DATA_DIRECTORY	dir;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return 0;
     if (!hRsrc) return 0;
 
     max=(DWORD)-1;
-    dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
+    dir=pem->pe_module->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
     if(dir.Size)
-    	max=(DWORD)pe->pe_resource+dir.Size;
+    	max=(DWORD)pem->pe_resource+dir.Size;
 
-    data=((DWORD)pe->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
-    walk_resdir(pe->load_addr,(DWORD)pe->pe_resource,0,data,0,&max);
+    data=((DWORD)pem->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+    walk_resdir(pem->load_addr,(DWORD)pem->pe_resource,0,data,0,&max);
     return max-data;
 }
 
@@ -192,24 +198,24 @@
  */
 BOOL32
 PE_EnumResourceTypes32A(HMODULE32 hmod,ENUMRESTYPEPROC32A lpfun,LONG lparam) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
     BOOL32	ret;
     HANDLE32	heap = GetProcessHeap();	
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
     ret = FALSE;
     for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
     	LPSTR	name;
 
 	if (HIWORD(et[i].u1.Name))
-		name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name));
+		name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.Name));
 	else
 		name = (LPSTR)et[i].u1.Name;
 	ret = lpfun(hmod,name,lparam);
@@ -226,22 +232,22 @@
  */
 BOOL32
 PE_EnumResourceTypes32W(HMODULE32 hmod,ENUMRESTYPEPROC32W lpfun,LONG lparam) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
     BOOL32	ret;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
     ret = FALSE;
     for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
 	LPWSTR	type;
     	if (HIWORD(et[i].u1.Name))
-		type = (LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name);
+		type = (LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.Name);
 	else
 		type = (LPWSTR)et[i].u1.Name;
 
@@ -259,7 +265,7 @@
 PE_EnumResourceNames32A(
 	HMODULE32 hmod,LPCSTR type,ENUMRESNAMEPROC32A lpfun,LONG lparam
 ) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
@@ -267,14 +273,14 @@
     HANDLE32	heap = GetProcessHeap();	
     LPWSTR	typeW;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
     if (HIWORD(type))
 	typeW = HEAP_strdupAtoW(heap,0,type);
     else
 	typeW = (LPWSTR)type;
-    resdir = GetResDirEntryW(resdir,typeW,(DWORD)pe->pe_resource);
+    resdir = GetResDirEntryW(resdir,typeW,(DWORD)pem->pe_resource);
     if (HIWORD(typeW))
     	HeapFree(heap,0,typeW);
     if (!resdir)
@@ -285,7 +291,7 @@
     	LPSTR	name;
 
 	if (HIWORD(et[i].u1.Name))
-	    name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name));
+	    name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.Name));
 	else
 	    name = (LPSTR)et[i].u1.Name;
 	ret = lpfun(hmod,type,name,lparam);
@@ -303,17 +309,17 @@
 PE_EnumResourceNames32W(
 	HMODULE32 hmod,LPCWSTR type,ENUMRESNAMEPROC32W lpfun,LONG lparam
 ) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
     BOOL32	ret;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
-    resdir = GetResDirEntryW(resdir,type,(DWORD)pe->pe_resource);
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
+    resdir = GetResDirEntryW(resdir,type,(DWORD)pem->pe_resource);
     if (!resdir)
     	return FALSE;
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
@@ -321,7 +327,7 @@
     for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
 	LPWSTR	name;
     	if (HIWORD(et[i].u1.Name))
-		name = (LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name);
+		name = (LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.Name);
 	else
 		name = (LPWSTR)et[i].u1.Name;
 	ret = lpfun(hmod,type,name,lparam);
@@ -339,7 +345,7 @@
 	HMODULE32 hmod,LPCSTR name,LPCSTR type,ENUMRESLANGPROC32A lpfun,
 	LONG lparam
 ) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
@@ -347,15 +353,15 @@
     HANDLE32	heap = GetProcessHeap();	
     LPWSTR	nameW,typeW;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
     if (HIWORD(name))
 	nameW = HEAP_strdupAtoW(heap,0,name);
     else
     	nameW = (LPWSTR)name;
-    resdir = GetResDirEntryW(resdir,nameW,(DWORD)pe->pe_resource);
+    resdir = GetResDirEntryW(resdir,nameW,(DWORD)pem->pe_resource);
     if (HIWORD(nameW))
     	HeapFree(heap,0,nameW);
     if (!resdir)
@@ -364,7 +370,7 @@
 	typeW = HEAP_strdupAtoW(heap,0,type);
     else
 	typeW = (LPWSTR)type;
-    resdir = GetResDirEntryW(resdir,typeW,(DWORD)pe->pe_resource);
+    resdir = GetResDirEntryW(resdir,typeW,(DWORD)pem->pe_resource);
     if (HIWORD(typeW))
     	HeapFree(heap,0,typeW);
     if (!resdir)
@@ -372,7 +378,7 @@
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
     ret = FALSE;
     for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
-    	/* languages are just ids... I hope */
+    	/* languages are just ids... I hopem */
 	ret = lpfun(hmod,name,type,et[i].u1.Id,lparam);
 	if (!ret)
 		break;
@@ -388,20 +394,20 @@
 	HMODULE32 hmod,LPCWSTR name,LPCWSTR type,ENUMRESLANGPROC32W lpfun,
 	LONG lparam
 ) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
     BOOL32	ret;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
-    resdir = GetResDirEntryW(resdir,name,(DWORD)pe->pe_resource);
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
+    resdir = GetResDirEntryW(resdir,name,(DWORD)pem->pe_resource);
     if (!resdir)
     	return FALSE;
-    resdir = GetResDirEntryW(resdir,type,(DWORD)pe->pe_resource);
+    resdir = GetResDirEntryW(resdir,type,(DWORD)pem->pe_resource);
     if (!resdir)
     	return FALSE;
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
diff --git a/loader/resource.c b/loader/resource.c
index 31c6453..2654396 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -18,6 +18,7 @@
 #include "global.h"
 #include "heap.h"
 #include "neexe.h"
+#include "task.h"
 #include "accel.h"
 #include "module.h"
 #include "resource.h"
@@ -33,6 +34,11 @@
 
 extern WORD WINE_LanguageId;
 
+/* error message when 16-bit resource function is called for Win32 module */
+static const char* NEWin32FailureString = "fails with Win32 module\n";
+/* error message when 32-bit resource function is called for Win16 module */
+static const char* PEWin16FailureString = "fails with Win16 module\n";
+
 /**********************************************************************
  *	    FindResource16    (KERNEL.60)
  */
@@ -40,9 +46,10 @@
 {
     NE_MODULE *pModule;
 
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE16( hModule ); 
     dprintf_resource(stddeb, "FindResource16: module=%04x type=", hModule );
     PrintId( type );
+
     if (HIWORD(name))  /* Check for '#xxx' name */
     {
 	char *ptr = PTR_SEG_TO_LIN( name );
@@ -50,20 +57,23 @@
 	    if (!(name = (SEGPTR)atoi( ptr + 1 ))) return 0;
 	}
     }
+
     dprintf_resource( stddeb, " name=" );
     PrintId( name );
     dprintf_resource( stddeb, "\n" );
-    if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
-#ifndef WINELIB
-    if (pModule->flags & NE_FFLAGS_WIN32)
+
+    if ((pModule = MODULE_GetPtr( hModule )))
     {
-        fprintf(stderr,"Don't know how to FindResource16() for Win32 module\n");
-        return 0;
-    }
-    return NE_FindResource( hModule, type, name );
+#ifndef WINELIB
+	if (pModule->flags & NE_FFLAGS_WIN32)
+	    fprintf(stderr,"FindResource16: %s", NEWin32FailureString);
+	else
+	    return NE_FindResource( hModule, type, name );
 #else
-    return LIBRES_FindResource16( hModule, name, type );
+	return LIBRES_FindResource16( hModule, name, type );
 #endif
+    }
+    return 0;
 }
 
 
@@ -109,7 +119,7 @@
     NE_MODULE *pModule;
 
     if (!hModule) hModule = GetTaskDS();
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE32( hModule );
     dprintf_resource(stddeb, "FindResource32W: module=%08x type=", hModule );
     if (HIWORD(type))
     	dprintf_resource(stddeb,"%p",type);
@@ -145,21 +155,22 @@
 {
     NE_MODULE *pModule;
 
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE16( hModule );
     dprintf_resource(stddeb, "LoadResource16: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
-    if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
-#ifndef WINELIB
-    if (pModule->flags & NE_FFLAGS_WIN32)
+    if ((pModule = MODULE_GetPtr( hModule )))
     {
-        fprintf(stderr,"Don't know how to LoadResource16() for Win32 module\n");
-        return 0;
-    }
-    return NE_LoadResource( hModule, hRsrc );
+#ifndef WINELIB
+	if (pModule->flags & NE_FFLAGS_WIN32)
+	    fprintf(stderr,"LoadResource16: %s", NEWin32FailureString);
+	else
+	    return NE_LoadResource( hModule, hRsrc );
 #else
-    return LIBRES_LoadResource( hModule, hRsrc );
+	return LIBRES_LoadResource( hModule, hRsrc );
 #endif
+    }
+    return 0;
 }
 
 /**********************************************************************
@@ -171,7 +182,7 @@
     NE_MODULE *pModule;
 
     if (!hModule) hModule = GetTaskDS(); /* FIXME: see FindResource32W */
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE32( hModule );
     dprintf_resource(stddeb, "LoadResource32: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
@@ -179,7 +190,7 @@
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     if (!(pModule->flags & NE_FFLAGS_WIN32))
     {
-    	fprintf(stderr,"LoadResource32: tried to load a non win32 resource.\n");
+    	fprintf(stderr,"LoadResource32: %s", PEWin16FailureString );
    	return 0;  /* FIXME? */
     }
     return PE_LoadResource32(hModule,hRsrc);
@@ -201,11 +212,11 @@
 
     dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
     if (!handle) return (SEGPTR)0;
-    hModule = GetExePtr( handle );
+    hModule = MODULE_HANDLEtoHMODULE16( handle );
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to LockResource() for Win32 module\n");
+        fprintf(stderr,"LockResource16: %s", NEWin32FailureString);
         return 0;
     }
     return NE_LockResource( hModule, handle );
@@ -223,11 +234,11 @@
 
     dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
     if (!handle) return NULL;
-    hModule = GetExePtr( handle );
+    hModule = MODULE_HANDLEtoHMODULE16( handle );
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to LockResource16() for Win32 module\n");
+        fprintf(stderr,"LockResource16: %s", NEWin32FailureString);
         return 0;
     }
     return (LPSTR)PTR_SEG_TO_LIN( NE_LockResource( hModule, handle ) );
@@ -257,11 +268,11 @@
 
     dprintf_resource(stddeb, "FreeResource16: handle=%04x\n", handle );
     if (!handle) return FALSE;
-    hModule = GetExePtr( handle );
+    hModule = MODULE_HANDLEtoHMODULE16( handle );
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to FreeResource16() for Win32 module\n");
+        fprintf(stderr,"FreeResource16: %s", NEWin32FailureString);
         return 0;
     }
     return NE_FreeResource( hModule, handle );
@@ -287,7 +298,7 @@
 {
     NE_MODULE *pModule;
 
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE16( hModule );
     dprintf_resource(stddeb, "AccessResource16: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
@@ -295,7 +306,7 @@
 #ifndef WINELIB
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to AccessResource16() for Win32 module\n");
+        fprintf(stderr,"AccessResource16: %s", NEWin32FailureString);
         return 0;
     }
     return NE_AccessResource( hModule, hRsrc );
@@ -310,7 +321,7 @@
  */
 INT32 WINAPI AccessResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE32( hModule );
     dprintf_resource(stddeb, "AccessResource: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
@@ -326,14 +337,14 @@
 {
     NE_MODULE *pModule;
 
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE16( hModule );
     dprintf_resource(stddeb, "SizeofResource16: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
 #ifndef WINELIB
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to SizeOfResource16() for Win32 module\n");
+        fprintf(stderr,"SizeOfResource16: %s", NEWin32FailureString);
         return 0;
     }
     return NE_SizeofResource( hModule, hRsrc );
@@ -348,7 +359,7 @@
  */
 DWORD WINAPI SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE32( hModule );
     dprintf_resource(stddeb, "SizeofResource32: module=%04x res=%04x\n",
                      hModule, hRsrc );
 #ifndef WINELIB
@@ -367,7 +378,7 @@
 {
     NE_MODULE *pModule;
 
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    hModule = MODULE_HANDLEtoHMODULE16( hModule );
     dprintf_resource(stddeb, "AllocResource: module=%04x res=%04x size=%ld\n",
                      hModule, hRsrc, size );
     if (!hRsrc) return 0;
@@ -375,7 +386,7 @@
 #ifndef WINELIB
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to AllocResource() for Win32 module\n");
+        fprintf(stderr,"AllocResource16: %s", NEWin32FailureString);
         return 0;
     }
     return NE_AllocResource( hModule, hRsrc, size );
@@ -394,7 +405,7 @@
 {
     dprintf_resource(stddeb,"DirectResAlloc(%04x,%04x,%04x)\n",
                      hInstance, wType, wSize );
-    hInstance = GetExePtr(hInstance);
+    hInstance = MODULE_HANDLEtoHMODULE16(hInstance);
     if(!hInstance)return 0;
     if(wType != 0x10)	/* 0x10 is the only observed value, passed from
                            CreateCursorIndirect. */
@@ -405,6 +416,9 @@
 
 /**********************************************************************
  *			LoadAccelerators16	[USER.177]
+ *
+ * FIXME: this code leaks memory because HACCEL must be a result of LoadResource()
+ *        (see TWIN for hints).
  */
 HACCEL16 WINAPI LoadAccelerators16(HINSTANCE16 instance, SEGPTR lpTableName)
 {
@@ -578,6 +592,8 @@
     int string_num;
     int i;
 
+    if (HIWORD(resource_id)==0xFFFF) /* netscape 3 passes this */
+	resource_id = (UINT32)(-((INT32)resource_id));
     dprintf_resource(stddeb, "LoadString: instance = %04x, id = %04x, buffer = %08x, "
 	   "length = %d\n", instance, (int)resource_id, (int) buffer, buflen);
 
@@ -747,15 +763,24 @@
 /**********************************************************************
  *	SetResourceHandler	(KERNEL.43)
  */
-FARPROC16 WINAPI SetResourceHandler( HINSTANCE16 instance, SEGPTR s,
-                                     FARPROC16 farproc )
+FARPROC16 WINAPI SetResourceHandler( HMODULE16 hModule, SEGPTR s,
+                                     FARPROC16 resourceHandler )
 {
-    if (HIWORD(s))
-	fprintf(stderr,"SetResourceHandler(%04x,%s,%p), empty STUB!\n",
-		instance,(char*)PTR_SEG_TO_LIN(s),farproc);
-    else
-	fprintf(stderr,"SetResourceHandler(%04x,0x%04x,%p), empty STUB!\n",
-		instance,LOWORD(s),farproc);
+    NE_MODULE *pModule;
+
+    hModule = GetExePtr( hModule );
+
+    dprintf_resource(stddeb, "SetResourceHandler: module=%04x type=", hModule );
+    PrintId( s );
+    dprintf_resource( stddeb, "\n" );
+
+    if ((pModule = MODULE_GetPtr( hModule )))
+    {
+	if (pModule->flags & NE_FFLAGS_WIN32)
+	    fprintf(stderr,"SetResourceHandler: %s", NEWin32FailureString);
+	else if (pModule->res_table)
+	    return NE_SetResourceHandler( hModule, s, resourceHandler );
+    }
     return NULL;
 }
 
diff --git a/loader/task.c b/loader/task.c
index 467548c..3266976 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -9,7 +9,7 @@
 #include <string.h>
 
 #include "windows.h"
-#include "task.h"
+#include "user.h"
 #include "callback.h"
 #include "file.h"
 #include "global.h"
@@ -40,9 +40,9 @@
   /* Min. number of thunks allocated when creating a new segment */
 #define MIN_THUNKS  32
 
-extern INT32 WINSOCK_DeleteTaskWSI( TDB* pTask, struct _WSINFO* pwsi );
-extern void  USER_AppExit( HTASK16, HINSTANCE16, HQUEUE16 );
-extern void  PE_InitTls( PE_MODULE *module );
+extern INT32 WINSOCK_DeleteTaskWSI( TDB* pTask, struct _WSINFO* );
+extern BOOL32 MODULE_FreeModule( HMODULE16 hModule, TDB* ptaskContext );
+extern void PE_InitTls( PDB32 *pdb32 );
 
   /* Saved 16-bit stack for current process (Win16 only) */
 DWORD IF1632_Saved16_ss_sp = 0;
@@ -370,12 +370,16 @@
 
         extern void InitTask( CONTEXT *context );
 
+        FARPROC32 entry = (FARPROC32)(pCurrentProcess->exe_modref->load_addr + 
+                 pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
+
         InitTask( NULL );
         InitApp( pTask->hModule );
         __asm__ __volatile__("movw %w0,%%fs"::"r" (pCurrentThread->teb_sel));
-        PE_InitializeDLLs( pTask->hModule, DLL_PROCESS_ATTACH, (LPVOID)-1 );
-        exit_code = CallTaskStart32((FARPROC32)(pModule->pe_module->load_addr + 
-                pModule->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint) );
+
+        PE_InitializeDLLs( pCurrentProcess, DLL_PROCESS_ATTACH, (LPVOID)-1 );
+        dprintf_relay( stddeb, "CallTo32(entryproc=%p)\n", entry );
+        exit_code = entry();
         TASK_KillCurrentTask( exit_code );
     }
     else
@@ -437,6 +441,7 @@
     STACK32FRAME *frame32;
 #ifndef WINELIB32
     extern DWORD CALLTO16_RetAddr_word;
+    extern void CALLTO16_Restore();
 #endif
     
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
@@ -546,18 +551,21 @@
 
     /* Create the Win32 part of the task */
 
-    pdb32 = PROCESS_Create( pTask );
+    pCurrentProcess = pdb32 = PROCESS_Create( pTask, cmdLine );
     pdb32->task = hTask;
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
+    /*
         LPTHREAD_START_ROUTINE start =
-            (LPTHREAD_START_ROUTINE)(pModule->pe_module->load_addr +
-            pModule->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
-        pTask->thdb = THREAD_Create( pdb32, 0, start );
+            (LPTHREAD_START_ROUTINE)(
+	    	pCurrentProcess->exe_modref->load_addr +
+		pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
+     */
+        pTask->thdb = THREAD_Create( pdb32, 0, 0 );
 #ifndef WINELIB
         /* FIXME: should not be done here */
         pCurrentThread = pTask->thdb;
-        PE_InitTls( pModule->pe_module );
+        PE_InitTls( pdb32 );
 #endif
     }
     else
@@ -575,6 +583,7 @@
     frame32->ebx = 0;
     frame32->ebp = 0;
 #ifndef WINELIB
+    frame32->restore_addr = (DWORD)CALLTO16_Restore;
     frame32->retaddr = (DWORD)TASK_CallToStart;
     frame32->codeselector = WINE_CODE_SELECTOR;
 #endif
@@ -613,10 +622,12 @@
     {
         if (pModule->flags & NE_FFLAGS_WIN32)
         {
-            DBG_ADDR addr = { NULL, 0, pModule->pe_module->load_addr + 
-                              pModule->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint };
+	/*
+            DBG_ADDR addr = { NULL, 0, pCurrentProcess->exe_modref->load_addr + 
+                              pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint };
             fprintf( stderr, "Win32 task '%s': ", name );
             DEBUG_AddBreakpoint( &addr );
+	 */
         }
         else
         {
@@ -656,7 +667,7 @@
 
     /* Free the task module */
 
-    FreeModule16( pTask->hModule );
+    MODULE_FreeModule( pTask->hModule, pTask );
 
     /* Free the selector aliases */
 
@@ -691,17 +702,16 @@
 
     dprintf_task(stddeb, "Killing task %04x\n", hCurrentTask );
 
-    /* Clean up sockets */
+    /* Delete active sockets */
 
-    if( pTask->pwsi ) 
-    {
-	dprintf_task(stddeb, "\tremoving socket table\n");
+    if( pTask->pwsi )
 	WINSOCK_DeleteTaskWSI( pTask, pTask->pwsi );
-    }
 
     /* Perform USER cleanup */
 
-    USER_AppExit( hCurrentTask, pTask->hInstance, pTask->hQueue );
+    if (pTask->userhandler)
+        pTask->userhandler( hCurrentTask, USIG_TERMINATION, 0,
+                            pTask->hInstance, pTask->hQueue );
 
     if (hTaskToKill && (hTaskToKill != hCurrentTask))
     {
@@ -867,6 +877,8 @@
 
 /***********************************************************************
  *           InitTask  (KERNEL.91)
+ *
+ * Called by the application startup code.
  */
 void WINAPI InitTask( CONTEXT *context )
 {
@@ -880,7 +892,13 @@
     if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return;
     if (!(pModule = MODULE_GetPtr( pTask->hModule ))) return;
 
+    /* This is a hack to install task USER signal handler before 
+     * implicitly loaded DLLs are initialized (see windows/user.c) */
+
+    pTask->userhandler = (USERSIGNALPROC)&USER_SignalProc;
+
 #ifndef WINELIB
+    /* Initialize implicitly loaded DLLs */
     NE_InitializeDLLs( pTask->hModule );
 #endif
 
@@ -1374,6 +1392,8 @@
 
 /***********************************************************************
  *           SetTaskSignalProc   (KERNEL.38)
+ *
+ * Real 16-bit interface is provided by the THUNK_SetTaskSignalProc.
  */
 FARPROC16 WINAPI SetTaskSignalProc( HTASK16 hTask, FARPROC16 proc )
 {
@@ -1382,8 +1402,8 @@
 
     if (!hTask) hTask = hCurrentTask;
     if (!(pTask = (TDB *)GlobalLock16( hTask ))) return NULL;
-    oldProc = pTask->userhandler;
-    pTask->userhandler = proc;
+    oldProc = (FARPROC16)pTask->userhandler;
+    pTask->userhandler = (USERSIGNALPROC)proc;
     return oldProc;
 }
 
@@ -1464,7 +1484,6 @@
     return 0;
 }
 
-
 /***********************************************************************
  *           TaskFirst   (TOOLHELP.63)
  */
diff --git a/memory/global.c b/memory/global.c
index 45088c2..ce11ed2 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -17,6 +17,7 @@
 #include "miscemu.h"
 #include "dde_mem.h"
 #include "stackframe.h"
+#include "module.h"
 #include "options.h"
 #include "stddebug.h"
 #include "debug.h"
@@ -206,6 +207,7 @@
     {
 	ptr = HeapAlloc( SystemHeap, 0, size );
     }
+      /* FIXME: free discardable blocks and try again? */
     if (!ptr) return 0;
 
       /* Allocate the selector(s) */
@@ -274,7 +276,7 @@
     HANDLE16 owner = GetCurrentPDB();
 
     if (flags & GMEM_DDESHARE)
-        owner = GetExePtr(owner);  /* Make it a module handle */
+        owner = MODULE_HANDLEtoHMODULE16(owner);  /* Make it a module handle */
     return GLOBAL_Alloc( flags, size, owner, FALSE, FALSE, FALSE );
 }
 
@@ -313,8 +315,11 @@
             (pArena->lockCount > 0) || (pArena->pageLockCount > 0)) return 0;
         HeapFree( SystemHeap, 0, (void *)pArena->base );
         pArena->base = 0;
-        /* Note: we rely on the fact that SELECTOR_ReallocBlock won't */
-        /* change the selector if we are shrinking the block */
+
+        /* Note: we rely on the fact that SELECTOR_ReallocBlock won't 
+         * change the selector if we are shrinking the block.
+	 * FIXME: shouldn't we keep selectors until the block is deleted?
+	 */
         SELECTOR_ReallocBlock( sel, 0, 1, SEGMENT_DATA, 0, 0 );
         return handle;
     }
@@ -411,15 +416,20 @@
 {
     dprintf_global( stddeb, "WIN16_GlobalLock16(%04x) -> %08lx\n",
                     handle, MAKELONG( 0, GlobalHandleToSel(handle)) );
-    if (!handle) return 0;
+    if (handle)
+    {
+	if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
 
 #ifdef CONFIG_IPC
-    if (is_dde_handle(handle))
-        return PTR_SEG_OFF_TO_SEGPTR( DDE_GlobalHandleToSel(handle), 0 );
+	if (is_dde_handle(handle))
+	    return PTR_SEG_OFF_TO_SEGPTR( DDE_GlobalHandleToSel(handle), 0 );
 #endif  /* CONFIG_IPC */
 
-    if (!GET_ARENA_PTR(handle)->base) return (SEGPTR)0;
-    return PTR_SEG_OFF_TO_SEGPTR( GlobalHandleToSel(handle), 0 );
+	if (!GET_ARENA_PTR(handle)->base) return (SEGPTR)0;
+	return PTR_SEG_OFF_TO_SEGPTR( GlobalHandleToSel(handle), 0 );
+	/* FIXME: put segment value in CX as well */
+    }
+    return (SEGPTR)0;
 }
 
 
diff --git a/memory/local.c b/memory/local.c
index 894beba..c0062dc 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -16,6 +16,7 @@
 #include <string.h>
 #include "windows.h"
 #include "ldt.h"
+#include "task.h"
 #include "global.h"
 #include "heap.h"
 #include "instance.h"
@@ -333,7 +334,7 @@
     if (start == 0) {
       /* Check if the segment is the DGROUP of a module */
 
-	if ((pModule = MODULE_GetPtr( GetExePtr( selector ) )))
+	if ((pModule = MODULE_GetPtr( selector )))
 	{
 	    SEGTABLEENTRY *pSeg = NE_SEG_TABLE( pModule ) + pModule->dgroup - 1;
 	    if (pModule->dgroup && (pSeg->selector == selector)) {
@@ -1582,7 +1583,6 @@
     NE_MODULE *pModule;
     WORD ds;
 
-    module = GetExePtr( module );
     if (!(pModule = MODULE_GetPtr( module ))) return 0;
     ds = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector;
     return MAKELONG( LOCAL_CountFree( ds ), LOCAL_HeapSize( ds ) );
diff --git a/memory/string.c b/memory/string.c
index 72efb86..60194a3 100644
--- a/memory/string.c
+++ b/memory/string.c
@@ -8,6 +8,7 @@
 #include <ctype.h>
 #include <string.h>
 #include "windows.h"
+#include "winerror.h"
 #include "ldt.h"
 #include "stddebug.h"
 #include "debug.h"
@@ -147,6 +148,12 @@
  */
 INT32 WINAPI lstrcmp32A( LPCSTR str1, LPCSTR str2 )
 {
+    /* Win95 KERNEL32.DLL does it that way. Hands off! */
+    if (!str1 || !str2) {
+    	SetLastError(ERROR_INVALID_PARAMETER);
+	return 0;
+    }
+
     dprintf_string(stddeb,"strcmp: '%s' and '%s'\n",
 		 (str1)?str1:"NULL",(str2)?str2:"NULL");
     return (INT32)strcmp( str1, str2 );
@@ -158,6 +165,10 @@
  */
 INT32 WINAPI lstrcmp32W( LPCWSTR str1, LPCWSTR str2 )
 {
+    if (!str1 || !str2) {
+    	SetLastError(ERROR_INVALID_PARAMETER);
+	return 0;
+    }
     while (*str1 && (*str1 == *str2)) { str1++; str2++; }
     return (INT32)(*str1 - *str2);
 }
@@ -179,6 +190,10 @@
 {
     INT32 res;
 
+    if (!str1 || !str2) {
+    	SetLastError(ERROR_INVALID_PARAMETER);
+	return 0;
+    }
     dprintf_string(stddeb,"strcmpi '%s' and '%s'\n",
 		 (str1)?str1:"NULL",(str2)?str2:"NULL");
     while (*str1)
@@ -198,6 +213,10 @@
 {
     INT32 res;
 
+    if (!str1 || !str2) {
+    	SetLastError(ERROR_INVALID_PARAMETER);
+	return 0;
+    }
     while (*str1)
     {
         /* FIXME: Unicode */
diff --git a/memory/virtual.c b/memory/virtual.c
index f3765b2..0788836 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -118,19 +118,19 @@
     UINT32 addr = view->base;
     BYTE prot = view->prot[0];
 
-    fprintf( stderr, "View: %08x - %08x%s",
+    dprintf_virtual( stddeb, "View: %08x - %08x%s",
              view->base, view->base + view->size - 1,
              (view->flags & VFLAG_SYSTEM) ? " (system)" : "" );
     if (view->mapping && view->mapping->file)
-        fprintf( stderr, " %s @ %08x\n",
+        dprintf_virtual( stddeb, " %s @ %08x\n",
                  view->mapping->file->unix_name, view->offset );
     else
-        fprintf( stderr, " (anonymous)\n");
+        dprintf_virtual( stddeb, " (anonymous)\n");
 
     for (count = i = 1; i < view->size >> page_shift; i++, count++)
     {
         if (view->prot[i] == prot) continue;
-        fprintf( stderr, "      %08x - %08x %s\n",
+        dprintf_virtual( stddeb, "      %08x - %08x %s\n",
                  addr, addr + (count << page_shift) - 1,
                  VIRTUAL_GetProtStr(prot) );
         addr += (count << page_shift);
@@ -138,7 +138,7 @@
         count = 0;
     }
     if (count)
-        fprintf( stderr, "      %08x - %08x %s\n",
+        dprintf_virtual( stddeb, "      %08x - %08x %s\n",
                  addr, addr + (count << page_shift) - 1,
                  VIRTUAL_GetProtStr(prot) );
 }
@@ -150,7 +150,7 @@
 void VIRTUAL_Dump(void)
 {
     FILE_VIEW *view = VIRTUAL_FirstView;
-    fprintf( stderr, "\nDump of all virtual memory views:\n\n" );
+    dprintf_virtual( stddeb, "\nDump of all virtual memory views:\n\n" );
     while (view)
     {
         VIRTUAL_DumpView( view );
diff --git a/misc/comm.c b/misc/comm.c
index f23666f..22e16c9 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -1,4 +1,4 @@
-/*
+ /*
  * DEC 93 Erik Bos <erik@xs4all.nl>
  *
  * Copyright 1996 Marcus Meissner
@@ -11,6 +11,9 @@
  *   IMHO, they are still wrong, but they at least implement the RXCHAR
  *   event and return I/O queue sizes, which makes the app I'm interested
  *   in (analog devices EZKIT DSP development system) work.
+ *
+ * August 12, 1997.  Take a bash at SetCommEventMask - Lawson Whitney
+ *                                     <lawson_whitney@juno.com>
  */
 
 #include <stdio.h>
@@ -38,7 +41,7 @@
 #ifndef TIOCINQ
 #define	TIOCINQ FIONREAD
 #endif
-
+#define msr  35       /* offset in unknown structure commMask */
 /*
  * [RER] These are globals are wrong.  They should be in DosDeviceStruct
  * on a per port basis.
@@ -47,6 +50,7 @@
 
 struct DosDeviceStruct COM[MAX_PORTS];
 struct DosDeviceStruct LPT[MAX_PORTS];
+LPCVOID *unknown[MAX_PORTS];
 
 void COMM_Init(void)
 {
@@ -126,6 +130,18 @@
 	return NULL;
 }
 
+int    GetCommPort(int fd)
+{
+        int x;
+        
+        for (x=0; x<MAX_PORTS; x++) {
+             if (COM[x].fd == fd)
+                 return x;
+       }
+       
+       return -1;
+} 
+
 int ValidCOMPort(int x)
 {
 	return(x < MAX_PORTS ? (int) COM[x].devicename : 0); 
@@ -436,6 +452,8 @@
 			commerror = WinError();
 			return -1;
 		} else {
+                        unknown[port] = SEGPTR_ALLOC(40);
+                        bzero(unknown[port],40);
 			COM[port].fd = fd;	
 			return fd;
 		}
@@ -470,16 +488,16 @@
  */
 INT16 WINAPI CloseComm(INT16 fd)
 {
-	struct DosDeviceStruct *ptr;
-
+        int port;
     	dprintf_comm(stddeb,"CloseComm: fd %d\n", fd);
-	if ((ptr = GetDeviceStruct(fd)) == NULL) {
+       	if ((port = GetCommPort(fd)) !=-1) {  /* [LW]       */
+    	        SEGPTR_FREE(unknown[port]); 
+    	        COM[port].fd = 0;       /*  my adaptation of RER's fix   */  
+        }  else {  	        
 		commerror = IE_BADID;
 		return -1;
 	}
 
-	ptr->fd = 0;	/* [RER] Really, -1 would be a better value */
-
 	if (close(fd) == -1) {
 		commerror = WinError();
 		return -1;
@@ -738,7 +756,17 @@
 	}
 }  
 
-/*****************************************************************************
+/********************************************************************
+ *      PurgeComm        (KERNEL32.557)
+ */
+BOOL32 WINAPI PurgeComm( HANDLE32 hFile, DWORD flags) 
+{
+    dprintf_comm(stdnimp, "PurgeComm(%08x %08lx) unimplemented stub\n",
+                 hFile, flags);
+    return 0;
+}
+
+/********************************************************************
  *	GetCommError	(USER.203)
  */
 INT16 WINAPI GetCommError(INT16 fd,LPCOMSTAT lpStat)
@@ -794,11 +822,26 @@
 /*****************************************************************************
  *	SetCommEventMask	(USER.208)
  */
-UINT16* WINAPI SetCommEventMask(INT16 fd,UINT16 fuEvtMask)
+SEGPTR WINAPI SetCommEventMask(INT16 fd,UINT16 fuEvtMask)
 {
+        unsigned char *stol;
+        int act;
+        int repid;
+        unsigned int mstat;
     	dprintf_comm(stddeb,"SetCommEventMask:fd %d,mask %d\n",fd,fuEvtMask);
 	eventmask |= fuEvtMask;
-	return (UINT16 *)&eventmask;	/* FIXME, should be SEGPTR */
+        if ((act = GetCommPort(fd)) == -1) {
+            dprintf_comm(stddeb," fd %d not comm port\n",act);
+            return NULL;}
+        stol =  unknown[act];
+        stol += msr;    
+	repid = ioctl(fd,TIOCMGET,&mstat);
+	dprintf_comm(stddeb,
+	" ioctl  %d, msr %x at %lx %lx\n",repid,mstat,stol,unknown[act]);
+	if ((mstat&TIOCM_CAR)) {*stol |= 0x80;}
+	     else {*stol &=0x7f;}
+	dprintf_comm(stddeb," modem dcd construct %x\n",*stol);
+	return SEGPTR_GET(unknown[act]);	
 }
 
 /*****************************************************************************
@@ -846,6 +889,15 @@
 }
 
 /*****************************************************************************
+ *      SetupComm       (KERNEL32.676)
+ */
+BOOL32 WINAPI SetupComm( HANDLE32 hFile, DWORD insize, DWORD outsize)
+{
+        dprintf_comm(stdnimp, "SetupComm: insize %ld outsize %ld unimplemented stub\n", insize, outsize);
+       return FALSE;
+} 
+
+/*****************************************************************************
  *	GetCommMask	(KERNEL32.156)
  */
 BOOL32 WINAPI GetCommMask(INT32 fd,LPDWORD evtmask)
@@ -1599,7 +1651,7 @@
  */
 INT16 WINAPI ReadComm(INT16 fd,LPSTR lpvBuf,INT16 cbRead)
 {
-	int status, length;
+	int status, x, length;
 	struct DosDeviceStruct *ptr;
 
     	dprintf_comm(stddeb,
@@ -1634,6 +1686,9 @@
                         return length;
                 }
  	} else {
+                for (x=0; x < length+status; x++)  	
+ 	        dprintf_comm(stddeb,"%c",*(lpvBuf+x));
+ 	        dprintf_comm(stddeb,"\nthus  endeth\n");
 		commerror = 0;
 		return length + status;
 	}
@@ -1661,7 +1716,7 @@
 	
 	for (x=0; x != cbWrite ; x++)
         dprintf_comm(stddeb,"%c", *(lpvBuf + x) );
-
+        dprintf_comm(stddeb,"\n");
 	length = write(fd, (void *) lpvBuf, cbWrite);
 	
 	if (length == -1) {
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 34f91a7..f21978e 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -58,7 +58,7 @@
  */
 BOOL16 WINAPI GetOpenFileName16( SEGPTR ofn )
 {
-    HINSTANCE16 hInst;
+    HINSTANCE32 hInst;
     HANDLE32 hDlgTmpl = 0, hResInfo;
     BOOL32 bRet = FALSE, win32Format = FALSE;
     HWND32 hwndDialog;
@@ -148,7 +148,7 @@
  */
 BOOL16 WINAPI GetSaveFileName16( SEGPTR ofn)
 {
-    HINSTANCE16 hInst;
+    HINSTANCE32 hInst;
     HANDLE32 hDlgTmpl = 0;
     BOOL32 bRet = FALSE, win32Format = FALSE;
     LPOPENFILENAME16 lpofn = (LPOPENFILENAME16)PTR_SEG_TO_LIN(ofn);
@@ -3028,7 +3028,8 @@
 	memset(ofn16,'\0',sizeof(*ofn16));				\
 	ofn16->lStructSize = sizeof(*ofn16);				\
 	ofn16->hwndOwner = ofn->hwndOwner;				\
-	ofn16->hInstance = ofn->hInstance;				\
+	/* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */	\
+	ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance);	\
 	if (ofn->lpstrFilter) {						\
 		LPSTR	s,x;						\
 									\
@@ -3107,7 +3108,8 @@
 	memset(ofn16,'\0',sizeof(*ofn16));				\
 	ofn16->lStructSize = sizeof(*ofn16);				\
 	ofn16->hwndOwner = ofn->hwndOwner;				\
-	ofn16->hInstance = ofn->hInstance;				\
+	/* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */	\
+	ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance);	\
 	if (ofn->lpstrFilter) {						\
 		LPWSTR	s;						\
 		LPSTR	x,y;						\
@@ -3119,7 +3121,7 @@
 			s = s+lstrlen32W(s)+1;				\
 		s++;							\
 		n = s - ofn->lpstrFilter; /* already divides by 2. ptr magic */\
-		x = y = (LPSTR)SEGPTR_ALLOC(n);			\
+		x = y = (LPSTR)SEGPTR_ALLOC(n);				\
 		s = (LPWSTR)ofn->lpstrFilter;				\
 		while (*s) {						\
 			lstrcpyWtoA(x,s);				\
diff --git a/misc/compobj.c b/misc/compobj.c
index 6fa4010..40c9444 100644
--- a/misc/compobj.c
+++ b/misc/compobj.c
@@ -72,6 +72,14 @@
 }
 
 /***********************************************************************
+ *           IsEqualGUID [COMPOBJ.18]
+ */
+BOOL16 WINAPI IsEqualGUID(GUID* g1, GUID* g2)
+{
+    return !memcmp( g1, g2, sizeof(GUID) );
+}
+
+/***********************************************************************
  *           CLSIDFromString [COMPOBJ.20]
  */
 
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 707e479..7ba7d07 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -5,8 +5,21 @@
  *
  * Copyright 1996 Marcus Meissner
  * Copyright 1996 Jukka Iivonen
+ * Copyright 1997 Uwe Bonnes
  */
 
+/*
+Unresolved issues Uwe Bonnes 970904:
+- Handling of Binary/Text Files is crude. If in doubt, use fromdos or recode
+- Arguments in crtdll.spec for functions with double argument
+- system-call calls another wine process, but without debugging arguments
+              and uses the first wine executable in the path
+- tested with ftp://ftp.remcomp.com/pub/remcomp/lcc-win32.zip, a C-Compiler
+ 		for Win32, based on lcc, from Jacob Navia
+*/
+
+/* FIXME: all the file handling is hopelessly broken -- AJ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
@@ -15,6 +28,7 @@
 #include <time.h>
 #include <ctype.h>
 #include <math.h>
+#include <fcntl.h>
 #include "win.h"
 #include "windows.h"
 #include "stddebug.h"
@@ -24,6 +38,11 @@
 #include "heap.h"
 #include "crtdll.h"
 #include "drive.h"
+#include "file.h"
+
+extern int FILE_GetUnixHandle( HFILE32  );
+
+static DOS_FULL_NAME CRTDLL_tmpname;
 
 extern INT32 WIN32_wsprintf32W( DWORD *args );
 
@@ -49,18 +68,20 @@
 /*********************************************************************
  *                  _GetMainArgs  (CRTDLL.022)
  */
-DWORD
-CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv,LPSTR *environ,DWORD flag)
+DWORD __cdecl CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv,
+                                LPSTR *environ,DWORD flag)
 {
         char *cmdline;
         char  **xargv;
 	int	xargc,i,afterlastspace;
 	DWORD	version;
 
-	dprintf_crtdll(stderr,"__GetMainArgs(%p,%p,%p,%ld).\n",
+	dprintf_crtdll(stddeb,"CRTDLL__GetMainArgs(%p,%p,%p,%ld).\n",
 		argc,argv,environ,flag
 	);
 	CRTDLL_acmdln_dll = cmdline = xstrdup( GetCommandLine32A() );
+ 	dprintf_crtdll(stddeb,"CRTDLL__GetMainArgs got \"%s\"\n",
+		cmdline);
 
 	version	= GetVersion32();
 	CRTDLL_osver_dll       = version >> 16;
@@ -98,6 +119,8 @@
 	CRTDLL_argv_dll	= xargv;
 	*argv		= xargv;
 
+	dprintf_crtdll(stddeb,"CRTDLL__GetMainArgs found %d arguments\n",
+		CRTDLL_argc_dll);
 	/* FIXME ... use real environment */
 	*environ	= xmalloc(sizeof(LPSTR));
 	CRTDLL_environ_dll = *environ;
@@ -105,12 +128,13 @@
 	return 0;
 }
 
+
 typedef void (*_INITTERMFUN)();
 
 /*********************************************************************
  *                  _initterm     (CRTDLL.135)
  */
-DWORD CRTDLL__initterm(_INITTERMFUN *start,_INITTERMFUN *end)
+DWORD __cdecl CRTDLL__initterm(_INITTERMFUN *start,_INITTERMFUN *end)
 {
 	_INITTERMFUN	*current;
 
@@ -124,9 +148,208 @@
 }
 
 /*********************************************************************
+ *                  _fdopen     (CRTDLL.91)
+ */
+DWORD __cdecl CRTDLL__fdopen(INT32 handle, LPCSTR mode)
+{
+  FILE *file;
+
+  switch (handle) 
+    {
+    case 0 : file=stdin;
+      break;
+    case 1 : file=stdout;
+      break;
+    case 2 : file=stderr;
+      break;
+    default:
+      file=fdopen(handle,mode);
+    }
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fdopen open handle %d mode %s  got file %p\n",
+		 handle, mode, file);
+  return (DWORD)file;
+}
+
+/*********************************************************************
+ *                  fopen     (CRTDLL.372)
+ */
+DWORD __cdecl CRTDLL_fopen(LPCSTR path, LPCSTR mode)
+{
+  FILE *file;
+  HFILE32 dos_fildes;
+#if 0
+  DOS_FULL_NAME full_name;
+  
+  if (!DOSFS_GetFullName( path, FALSE, &full_name )) {
+    dprintf_crtdll(stddeb,"CRTDLL_fopen file %s bad name\n",path);
+   return 0;
+  }
+  
+  file=fopen(full_name.long_name ,mode);
+#endif
+  INT32 flagmode=0;
+  int unix_fildes=0;
+
+  if ((strchr(mode,'r')&&strchr(mode,'a'))||
+      (strchr(mode,'r')&&strchr(mode,'w'))||
+      (strchr(mode,'w')&&strchr(mode,'a')))
+    return 0;
+       
+  if (strstr(mode,"r+")) flagmode=O_RDWR;
+  else if (strchr(mode,'r')) flagmode = O_RDONLY;
+  else if (strstr(mode,"w+")) flagmode= O_RDWR | O_TRUNC | O_CREAT;
+  else if (strchr(mode,'w')) flagmode = O_WRONLY | O_TRUNC | O_CREAT;
+  else if (strstr(mode,"a+")) flagmode= O_RDWR | O_CREAT | O_APPEND;
+  else if (strchr(mode,'w')) flagmode = O_RDWR | O_CREAT | O_APPEND;
+  else if (strchr(mode,'b'))
+    dprintf_crtdll(stderr,
+		   "CRTDLL_fopen %s in BINARY mode\n",path);
+      
+  dos_fildes=FILE_Open(path, flagmode);
+  unix_fildes=FILE_GetUnixHandle(dos_fildes);
+  file = fdopen(unix_fildes,mode);
+
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fopen file %s mode %s got ufh %d dfh %d file %p\n",
+		 path,mode,unix_fildes,dos_fildes,file);
+  return (DWORD)file;
+}
+
+/*********************************************************************
+ *                  fread     (CRTDLL.377)
+ */
+DWORD __cdecl CRTDLL_fread(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID file)
+{
+  size_t ret=1;
+#if 0
+  int i=0;
+  void *temp=ptr;
+
+  /* If we would honour CR/LF <-> LF translation, we could do it like this.
+     We should keep track of all files opened, and probably files with \
+     known binary extensions must be unchanged */
+  while ( (i < (nmemb*size)) && (ret==1)) {
+    ret=fread(temp,1,1,file);
+    dprintf_crtdll(stddeb,
+		 "CRTDLL_fread got %c 0x%02x ret %d\n",
+		   (isalpha(*(unsigned char*)temp))? *(unsigned char*)temp:
+		    ' ',*(unsigned char*)temp, ret);
+    if (*(unsigned char*)temp != 0xd) { /* skip CR */
+      temp++;
+      i++;
+    }
+    else
+      dprintf_crtdll(stddeb, "CRTDLL_fread skipping ^M\n");
+  }
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fread 0x%08x items of size %d from file %p to %p%s\n",
+		 nmemb,size,file,ptr,(i!=nmemb)?" failed":"");
+  return i;
+#else
+    
+  ret=fread(ptr,size,nmemb,file);
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fread 0x%08x items of size %d from file %p to %p%s\n",
+		 nmemb,size,file,ptr,(ret!=nmemb)?" failed":"");
+  return ret;
+#endif
+}
+  
+/*********************************************************************
+ *                  fseek     (CRTDLL.382)
+ */
+LONG __cdecl CRTDLL_fseek(LPVOID stream, LONG offset, INT32 whence)
+{
+  long ret;
+
+  ret=fseek(stream,offset,whence);
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fseek file %p to 0x%08lx pos %s%s\n",
+		 stream,offset,(whence==SEEK_SET)?"SEEK_SET":
+		 (whence==SEEK_CUR)?"SEEK_CUR":
+		 (whence==SEEK_END)?"SEEK_END":"UNKNOWN",
+		 (ret)?"failed":"");
+  return ret;
+}
+  
+/*********************************************************************
+ *                  ftell     (CRTDLL.384)
+ */
+LONG __cdecl CRTDLL_ftell(LPVOID stream)
+{
+  long ret;
+
+  ret=ftell(stream);
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_ftell file %p at 0x%08lx\n",
+		 stream,ret);
+  return ret;
+}
+  
+/*********************************************************************
+ *                  fwrite     (CRTDLL.386)
+ */
+DWORD __cdecl CRTDLL_fwrite(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID file)
+{
+  size_t ret;
+
+  ret=fwrite(ptr,size,nmemb,file);
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fwrite 0x%08x items of size %d from %p to file %p%s\n",
+		 nmemb,size,ptr,file,(ret!=nmemb)?" failed":"");
+  return ret;
+}
+
+/*********************************************************************
+ *                  setbuf     (CRTDLL.452)
+ */
+INT32 __cdecl CRTDLL_setbuf(LPVOID file, LPSTR buf)
+{
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_setbuf(file %p buf %p)\n",
+		 file,buf);
+  /* this doesn't work:"void value not ignored as it ought to be" 
+  return setbuf(file,buf); 
+  */
+  setbuf(file,buf);
+  return 0;
+}
+
+/*********************************************************************
+ *                  _open_osfhandle         (CRTDLL.240)
+ */
+HFILE32 __cdecl CRTDLL__open_osfhandle(LONG osfhandle, INT32 flags)
+{
+HFILE32 handle;
+ 
+	switch (osfhandle) {
+	case STD_INPUT_HANDLE :
+	case 0 :
+	  handle=0;
+	  break;
+ 	case STD_OUTPUT_HANDLE:
+ 	case 1:
+	  handle=1;
+	  break;
+	case STD_ERROR_HANDLE:
+	case 2:
+	  handle=2;
+	  break;
+	default:
+	  return (-1);
+	}
+	dprintf_crtdll(stddeb,
+		       "CRTDLL_open_osfhandle(handle %08lx,flags %d) return %d\n",
+		       osfhandle,flags,handle);
+	return handle;
+	
+}
+
+/*********************************************************************
  *                  srand         (CRTDLL.460)
  */
-void CRTDLL_srand(DWORD seed)
+void __cdecl CRTDLL_srand(DWORD seed)
 {
 	/* FIXME: should of course be thread? process? local */
 	srand(seed);
@@ -135,35 +358,29 @@
 /*********************************************************************
  *                  fprintf       (CRTDLL.373)
  */
-int CRTDLL_fprintf(DWORD *args)
+INT32 __cdecl CRTDLL_fprintf( FILE *file, LPSTR format, ... )
 {
-	/* FIXME: use args[0] */
-	/* CMF - This makes a BIG assumption about va_list */
-	return vfprintf(stderr, (LPSTR) args[1], (va_list) &args[2]);
+    va_list valist;
+    INT32 res;
+
+    va_start( valist, format );
+    res = vfprintf( file, format, valist );
+    va_end( valist );
+    return res;
 }
 
 /*********************************************************************
- *                  printf        (CRTDLL.440)
+ *                  vfprintf       (CRTDLL.373)
  */
-int CRTDLL_printf(DWORD *args)
+INT32 __cdecl CRTDLL_vfprintf( FILE *file, LPSTR format, va_list args )
 {
-	/* CMF - This makes a BIG assumption about va_list */
-	return vfprintf(stdout, (LPSTR) args[0], (va_list) &args[1]);
-}
-
-/*********************************************************************
- *                  sprintf        (CRTDLL.458)
- */
-int CRTDLL_sprintf(DWORD *args)
-{
-	/* CMF - This makes a BIG assumption about va_list */
-	return vsprintf((LPSTR) args[0], (LPSTR) args[1], (va_list) &args[2]);
+    return vfprintf( file, format, args );
 }
 
 /*********************************************************************
  *                  time          (CRTDLL.488)
  */
-time_t CRTDLL_time(time_t *timeptr)
+time_t __cdecl CRTDLL_time(time_t *timeptr)
 {
 	time_t	curtime = time(NULL);
 
@@ -175,7 +392,7 @@
 /*********************************************************************
  *                  _isatty       (CRTDLL.137)
  */
-BOOL32 CRTDLL__isatty(DWORD x)
+BOOL32 __cdecl CRTDLL__isatty(DWORD x)
 {
 	dprintf_crtdll(stderr,"CRTDLL__isatty(%ld)\n",x);
 	return TRUE;
@@ -184,22 +401,45 @@
 /*********************************************************************
  *                  _write        (CRTDLL.332)
  */
-INT32 CRTDLL__write(DWORD x,LPVOID buf,DWORD len)
+INT32 __cdecl CRTDLL__write(INT32 fd,LPCVOID buf,UINT32 count)
 {
-	if (x<=2)
-		return write(x,buf,len);
-	/* hmm ... */
-	dprintf_crtdll(stderr,"CRTDLL__write(%ld,%p,%ld)\n",x,buf,len);
+        INT32 len=0;
+
+	if (fd == -1)
+	  len = -1;
+	else if (fd<=2)
+	  len = (UINT32)write(fd,buf,(LONG)len);
+	else
+	  len = _lwrite32(fd,buf,count);
+	dprintf_crtdll(stddeb,"CRTDLL_write %d/%d byte to dfh %d from %p,\n",
+		       len,count,fd,buf);
 	return len;
 }
 
 
 /*********************************************************************
+ *                  _cexit          (CRTDLL.49)
+ *
+ *  FIXME: What the heck is the difference between 
+ *  FIXME           _c_exit         (CRTDLL.47)
+ *  FIXME           _cexit          (CRTDLL.49)
+ *  FIXME           _exit           (CRTDLL.87)
+ *  FIXME           exit            (CRTDLL.359)
+ *
+ */
+void __cdecl CRTDLL__cexit(INT32 ret)
+{
+        dprintf_crtdll(stddeb,"CRTDLL__cexit(%d)\n",ret);
+	ExitProcess(ret);
+}
+
+
+/*********************************************************************
  *                  exit          (CRTDLL.359)
  */
-void CRTDLL_exit(DWORD ret)
+void __cdecl CRTDLL_exit(DWORD ret)
 {
-        dprintf_crtdll(stderr,"CRTDLL_exit(%ld)\n",ret);
+        dprintf_crtdll(stddeb,"CRTDLL_exit(%ld)\n",ret);
 	ExitProcess(ret);
 }
 
@@ -207,16 +447,20 @@
 /*********************************************************************
  *                  fflush        (CRTDLL.365)
  */
-void CRTDLL_fflush(DWORD x)
+INT32 __cdecl CRTDLL_fflush(LPVOID stream)
 {
-    dprintf_crtdll(stderr,"CRTDLL_fflush(%ld)\n",x);
+    int ret;
+
+    ret = fflush(stream);
+    dprintf_crtdll(stddeb,"CRTDLL_fflush %p returnd %d %s\n",stream,ret,(ret)?"":" failed");
+    return ret;
 }
 
 
 /*********************************************************************
  *                  gets          (CRTDLL.391)
  */
-LPSTR CRTDLL_gets(LPSTR buf)
+LPSTR __cdecl CRTDLL_gets(LPSTR buf)
 {
   /* BAD, for the whole WINE process blocks... just done this way to test
    * windows95's ftp.exe.
@@ -226,335 +470,131 @@
 
 
 /*********************************************************************
- *                  abs           (CRTDLL.339)
- */
-INT32 CRTDLL_abs(INT32 x)
-{
-    return abs(x);
-}
-
-
-/*********************************************************************
- *                  acos          (CRTDLL.340)
- */
-float CRTDLL_acos(float x)
-{
-    return acos(x);
-}
-
-
-/*********************************************************************
- *                  asin          (CRTDLL.342)
- */
-float CRTDLL_asin(float x)
-{
-    return asin(x);
-}
-
-
-/*********************************************************************
- *                  atan          (CRTDLL.343)
- */
-float CRTDLL_atan(float x)
-{
-    return atan(x);
-}
-
-
-/*********************************************************************
- *                  atan2         (CRTDLL.344)
- */
-float CRTDLL_atan2(float x, float y)
-{
-    return atan2(x,y);
-}
-
-
-/*********************************************************************
- *                  atof          (CRTDLL.346)
- */
-float CRTDLL_atof(LPCSTR x)
-{
-    return atof(x);
-}
-
-
-/*********************************************************************
- *                  atoi          (CRTDLL.347)
- */
-INT32 CRTDLL_atoi(LPCSTR x)
-{
-    if (!x) return 0;
-    return atoi(x);
-}
-
-
-/*********************************************************************
- *                  atol          (CRTDLL.348)
- */
-LONG CRTDLL_atol(LPCSTR x)
-{
-    if (!x) return 0;
-    return atol(x);
-}
-
-
-/*********************************************************************
- *                  cos           (CRTDLL.354)
- */
-float CRTDLL_cos(float x)
-{
-    return cos(x);
-}
-
-
-/*********************************************************************
- *                  cosh          (CRTDLL.355)
- */
-float CRTDLL_cosh(float x)
-{
-    return cosh(x);
-}
-
-
-/*********************************************************************
- *                  exp           (CRTDLL.360)
- */
-float CRTDLL_exp(float x)
-{
-    return exp(x);
-}
-
-
-/*********************************************************************
- *                  fabs          (CRTDLL.361)
- */
-float CRTDLL_fabs(float x)
-{
-    return fabs(x);
-}
-
-
-/*********************************************************************
- *                  isalnum       (CRTDLL.394)
- */
-CHAR CRTDLL_isalnum(CHAR x)
-{
-    return isalnum(x);
-}
-
-
-/*********************************************************************
- *                  isalpha       (CRTDLL.395)
- */
-CHAR CRTDLL_isalpha(CHAR x)
-{
-    return isalpha(x);
-}
-
-
-/*********************************************************************
- *                  iscntrl       (CRTDLL.396)
- */
-CHAR CRTDLL_iscntrl(CHAR x)
-{
-    return iscntrl(x);
-}
-
-
-/*********************************************************************
- *                  isdigit       (CRTDLL.397)
- */
-CHAR CRTDLL_isdigit(CHAR x)
-{
-    return isdigit(x);
-}
-
-
-/*********************************************************************
- *                  isgraph       (CRTDLL.398)
- */
-CHAR CRTDLL_isgraph(CHAR x)
-{
-    return isgraph(x);
-}
-
-
-/*********************************************************************
- *                  islower       (CRTDLL.400)
- */
-CHAR CRTDLL_islower(CHAR x)
-{
-    return islower(x);
-}
-
-
-/*********************************************************************
- *                  isprint       (CRTDLL.401)
- */
-CHAR CRTDLL_isprint(CHAR x)
-{
-    return isprint(x);
-}
-
-
-/*********************************************************************
- *                  ispunct       (CRTDLL.402)
- */
-CHAR CRTDLL_ispunct(CHAR x)
-{
-    return ispunct(x);
-}
-
-
-/*********************************************************************
- *                  isspace       (CRTDLL.403)
- */
-CHAR CRTDLL_isspace(CHAR x)
-{
-    return isspace(x);
-}
-
-
-/*********************************************************************
- *                  isupper       (CRTDLL.404)
- */
-CHAR CRTDLL_isupper(CHAR x)
-{
-    return isupper(x);
-}
-
-
-/*********************************************************************
- *                  isxdigit      (CRTDLL.418)
- */
-CHAR CRTDLL_isxdigit(CHAR x)
-{
-    return isxdigit(x);
-}
-
-
-/*********************************************************************
- *                  labs          (CRTDLL.419)
- */
-LONG CRTDLL_labs(LONG x)
-{
-    return labs(x);
-}
-
-
-/*********************************************************************
- *                  log           (CRTDLL.424)
- */
-float CRTDLL_log(float x)
-{
-    return log(x);
-}
-
-
-/*********************************************************************
- *                  log10         (CRTDLL.425)
- */
-float CRTDLL_log10(float x)
-{
-    return log10(x);
-}
-
-
-/*********************************************************************
- *                  pow           (CRTDLL.439)
- */
-float CRTDLL_pow(float x, float y)
-{
-    return pow(x,y);
-}
-
-
-/*********************************************************************
  *                  rand          (CRTDLL.446)
  */
-INT32 CRTDLL_rand()
+INT32 __cdecl CRTDLL_rand()
 {
     return rand();
 }
 
 
 /*********************************************************************
- *                  sin           (CRTDLL.456)
- */
-float CRTDLL_sin(float x)
-{
-    return sin(x);
-}
-
-
-/*********************************************************************
- *                  sinh          (CRTDLL.457)
- */
-float CRTDLL_sinh(float x)
-{
-    return sinh(x);
-}
-
-
-/*********************************************************************
- *                  sqrt          (CRTDLL.459)
- */
-double CRTDLL_sqrt(double x)
-{
-    return sqrt(x);
-}
-
-
-/*********************************************************************
- *                  tan           (CRTDLL.486)
- */
-float CRTDLL_tan(float x)
-{
-    return tan(x);
-}
-
-
-/*********************************************************************
- *                  tanh          (CRTDLL.487)
- */
-float CRTDLL_tanh(float x)
-{
-    return tanh(x);
-}
-
-
-/*********************************************************************
- *                  tolower       (CRTDLL.491)
- */
-CHAR CRTDLL_tolower(CHAR x)
-{
-    return tolower(x);
-}
-
-
-/*********************************************************************
- *                  toupper       (CRTDLL.492)
- */
-CHAR CRTDLL_toupper(CHAR x)
-{
-    return toupper(x);
-}
-
-
-/*********************************************************************
  *                  putchar       (CRTDLL.442)
  */
-void CRTDLL_putchar(INT32 x)
+void __cdecl CRTDLL_putchar( INT32 x )
 {
     putchar(x);
 }
 
 
 /*********************************************************************
+ *                  fputc       (CRTDLL.374)
+ */
+INT32 __cdecl CRTDLL_fputc( INT32 c, FILE *stream )
+{
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fputc %c to file %p\n",c,stream);
+    return fputc(c,stream);
+}
+
+
+/*********************************************************************
+ *                  fputs       (CRTDLL.375)
+ */
+INT32 __cdecl CRTDLL_fputs( LPCSTR s, FILE *stream )
+{
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fputs %s to file %p\n",s,stream);
+    return fputs(s,stream);
+}
+
+
+/*********************************************************************
+ *                  puts       (CRTDLL.443)
+ */
+INT32 __cdecl CRTDLL_puts(LPCSTR s)
+{
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fputs %s \n",s);
+    return puts(s);
+}
+
+
+/*********************************************************************
+ *                  putc       (CRTDLL.441)
+ */
+INT32 __cdecl CRTDLL_putc(INT32 c, FILE *stream)
+{
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_putc %c to file %p\n",c,stream);
+    return fputc(c,stream);
+}
+/*********************************************************************
+ *                  fgetc       (CRTDLL.366)
+ */
+INT32 __cdecl CRTDLL_fgetc( FILE *stream )
+{
+  int ret= fgetc(stream);
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fgetc got %d\n",ret);
+  return ret;
+}
+
+
+/*********************************************************************
+ *                  getc       (CRTDLL.388)
+ */
+INT32 __cdecl CRTDLL_getc( FILE *stream )
+{
+  int ret= fgetc(stream);
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_getc got %d\n",ret);
+  return ret;
+}
+
+/*********************************************************************
+ *                  _lrotl          (CRTDLL.176)
+ */
+DWORD __cdecl CRTDLL__lrotl(DWORD x,INT32 shift)
+{
+   unsigned long ret = (x >> shift)|( x >>((sizeof(x))-shift));
+
+   dprintf_crtdll(stddeb,
+		  "CRTDLL_lrotl got 0x%08lx rot %d ret 0x%08lx\n",
+		  x,shift,ret);
+   return ret;
+    
+}
+
+
+/*********************************************************************
+ *                  fgets       (CRTDLL.368)
+ */
+CHAR* __cdecl CRTDLL_fgets(LPSTR s,INT32 size, LPVOID stream)
+{
+  char * ret;
+  char * control_M;
+  
+  ret=fgets(s, size,stream);
+  /*FIXME: Control with CRTDLL_setmode */
+  control_M= strrchr(s,'\r');
+  /*delete CR if we read a DOS File */
+  if (control_M)
+    {
+      *control_M='\n';
+      *(control_M+1)=0;
+    }
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_fgets got %s for %d chars from file %p%s\n",
+		 s,size,stream,(ret)?"":" failed");
+  return ret;
+}
+
+
+/*********************************************************************
  *                  _mbsicmp      (CRTDLL.204)
  */
-int CRTDLL__mbsicmp(unsigned char *x,unsigned char *y)
+int __cdecl CRTDLL__mbsicmp(unsigned char *x,unsigned char *y)
 {
     do {
 	if (!*x)
@@ -573,7 +613,7 @@
 /*********************************************************************
  *                  _mbsinc       (CRTDLL.205)
  */
-unsigned char* CRTDLL__mbsinc(unsigned char *x)
+unsigned char * __cdecl CRTDLL__mbsinc(unsigned char *x)
 {
     /* FIXME: mbcs */
     return x++;
@@ -583,27 +623,25 @@
 /*********************************************************************
  *                  vsprintf      (CRTDLL.500)
  */
-int CRTDLL_vsprintf(DWORD *args)
+INT32 __cdecl CRTDLL_vsprintf( LPSTR buffer, LPCSTR spec, va_list args )
 {
-	/* CMF - This makes a BIG assumption about va_list */
-	return vsprintf((char *) args[0], (char *) args[1], (va_list) &args[2]);
+    return wvsprintf32A( buffer, spec, args );
 }
 
 /*********************************************************************
- *                  vsprintf      (CRTDLL.500) (NTDLL.913)
+ *                  vswprintf      (CRTDLL.501)
  */
-int CRTDLL_sscanf(DWORD *args)
+INT32 __cdecl CRTDLL_vswprintf( LPWSTR buffer, LPCWSTR spec, va_list args )
 {
-	/* CMF - This makes a BIG assumption about va_list */
-	return vsscanf((char *) args[0], (char *) args[1], (va_list) &args[2]);
+    return wvsprintf32W( buffer, spec, args );
 }
 
-
 /*********************************************************************
  *                  _mbscpy       (CRTDLL.200)
  */
-unsigned char* CRTDLL__mbscpy(unsigned char *x,unsigned char *y)
+unsigned char* __cdecl CRTDLL__mbscpy(unsigned char *x,unsigned char *y)
 {
+    dprintf_crtdll(stddeb,"CRTDLL_mbscpy %s and %s\n",x,y);
     return strcpy(x,y);
 }
 
@@ -611,15 +649,96 @@
 /*********************************************************************
  *                  _mbscat       (CRTDLL.197)
  */
-unsigned char* CRTDLL__mbscat(unsigned char *x,unsigned char *y)
+unsigned char* __cdecl CRTDLL__mbscat(unsigned char *x,unsigned char *y)
 {
     return strcat(x,y);
 }
 
+
+/*********************************************************************
+ *                  _strcmpi   (CRTDLL.282) (CRTDLL.287)
+ */
+INT32 __cdecl CRTDLL__strcmpi( LPCSTR s1, LPCSTR s2 )
+{
+    return lstrcmpi32A( s1, s2 );
+}
+
+
+/*********************************************************************
+ *                  _strnicmp   (CRTDLL.293)
+ */
+INT32 __cdecl CRTDLL__strnicmp( LPCSTR s1, LPCSTR s2, INT32 n )
+{
+    return lstrncmpi32A( s1, s2, n );
+}
+
+
+/*********************************************************************
+ *                  _strlwr      (CRTDLL.293)
+ *
+ * convert a string in place to lowercase 
+ */
+LPSTR CRTDLL__strlwr(LPSTR x)
+{
+  unsigned char *y =x;
+  
+  dprintf_crtdll(stddeb,
+		 "CRTDLL_strlwr got %s",x);
+  while (*y) {
+    if ((*y > 0x40) && (*y< 0x5b))
+      *y = *y + 0x20;
+    y++;
+  }
+  dprintf_crtdll(stddeb," returned %s\n",x);
+		 
+  return x;
+}
+
+/*********************************************************************
+ *                  system       (CRTDLL.485)
+ */
+INT32 CRTDLL_system(LPSTR x)
+{
+#define SYSBUF_LENGTH 1500
+  char buffer[SYSBUF_LENGTH]="wine \"";
+  unsigned char *y =x;
+  unsigned char *bp =buffer+strlen(buffer);
+  int i =strlen(buffer) + strlen(x) +2;
+
+  /* Calculate needed buffer size tp prevent overflow*/
+  while (*y) {
+    if (*y =='\\') i++;
+    y++;
+  }
+  /* if buffer to short, exit */
+  if (i > SYSBUF_LENGTH) {
+    dprintf_crtdll(stddeb,"_system buffer to small\n");
+    return 127;
+  }
+  
+  y =x;
+
+  while (*y) {
+    *bp = *y;
+    bp++; y++;
+    if (*(y-1) =='\\') *bp++ = '\\';
+  }
+  /* remove spaces from end of string */
+  while (*(y-1) == ' ') {
+    bp--;y--;
+  }
+  *bp++ = '"';
+  *bp = 0;
+  dprintf_crtdll(stddeb,
+		 "_system got \"%s\", executing \"%s\"\n",x,buffer);
+
+  return system(buffer);
+}
+
 /*********************************************************************
  *                  _strupr       (CRTDLL.300)
  */
-LPSTR CRTDLL__strupr(LPSTR x)
+LPSTR __cdecl CRTDLL__strupr(LPSTR x)
 {
 	LPSTR	y=x;
 
@@ -633,7 +752,7 @@
 /*********************************************************************
  *                  _wcsupr       (CRTDLL.328)
  */
-LPWSTR CRTDLL__wcsupr(LPWSTR x)
+LPWSTR __cdecl CRTDLL__wcsupr(LPWSTR x)
 {
 	LPWSTR	y=x;
 
@@ -647,7 +766,7 @@
 /*********************************************************************
  *                  _wcslwr       (CRTDLL.323)
  */
-LPWSTR CRTDLL__wcslwr(LPWSTR x)
+LPWSTR __cdecl CRTDLL__wcslwr(LPWSTR x)
 {
 	LPWSTR	y=x;
 
@@ -662,7 +781,7 @@
 /*********************************************************************
  *                  malloc        (CRTDLL.427)
  */
-VOID* CRTDLL_malloc(DWORD size)
+VOID* __cdecl CRTDLL_malloc(DWORD size)
 {
     return HeapAlloc(GetProcessHeap(),0,size);
 }
@@ -670,7 +789,7 @@
 /*********************************************************************
  *                  new           (CRTDLL.001)
  */
-VOID* CRTDLL_new(DWORD size)
+VOID* __cdecl CRTDLL_new(DWORD size)
 {
     VOID* result;
     if(!(result = HeapAlloc(GetProcessHeap(),0,size)) && new_handler)
@@ -681,7 +800,7 @@
 /*********************************************************************
  *                  set_new_handler(CRTDLL.003)
  */
-new_handler_type CRTDLL_set_new_handler(new_handler_type func)
+new_handler_type __cdecl CRTDLL_set_new_handler(new_handler_type func)
 {
     new_handler_type old_handler = new_handler;
     new_handler = func;
@@ -691,7 +810,7 @@
 /*********************************************************************
  *                  calloc        (CRTDLL.350)
  */
-VOID* CRTDLL_calloc(DWORD size, DWORD count)
+VOID* __cdecl CRTDLL_calloc(DWORD size, DWORD count)
 {
     return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size * count );
 }
@@ -699,7 +818,7 @@
 /*********************************************************************
  *                  realloc        (CRTDLL.447)
  */
-VOID* CRTDLL_realloc( VOID *ptr, DWORD size )
+VOID* __cdecl CRTDLL_realloc( VOID *ptr, DWORD size )
 {
     return HeapReAlloc( GetProcessHeap(), 0, ptr, size );
 }
@@ -707,7 +826,7 @@
 /*********************************************************************
  *                  free          (CRTDLL.427)
  */
-VOID CRTDLL_free(LPVOID ptr)
+VOID __cdecl CRTDLL_free(LPVOID ptr)
 {
     HeapFree(GetProcessHeap(),0,ptr);
 }
@@ -715,7 +834,7 @@
 /*********************************************************************
  *                  delete       (CRTDLL.002)
  */
-VOID CRTDLL_delete(VOID* ptr)
+VOID __cdecl CRTDLL_delete(VOID* ptr)
 {
     HeapFree(GetProcessHeap(),0,ptr);
 }
@@ -723,24 +842,108 @@
 /*********************************************************************
  *                  _strdup          (CRTDLL.285)
  */
-LPSTR CRTDLL__strdup(LPSTR ptr)
+LPSTR __cdecl CRTDLL__strdup(LPSTR ptr)
 {
     return HEAP_strdupA(GetProcessHeap(),0,ptr);
 }
 
+
 /*********************************************************************
  *                  fclose           (CRTDLL.362)
  */
-DWORD CRTDLL_fclose(LPVOID x)
+INT32 __cdecl CRTDLL_fclose( FILE *stream )
 {
-    dprintf_crtdll(stdnimp,"fclose(%p)\n",x);
-    return 0;
+    int unix_handle=fileno(stream);
+    HFILE32 dos_handle=3;
+    HFILE32 ret=EOF;
+
+    if (unix_handle<4) ret= fclose(stream);
+    else {
+      while(FILE_GetUnixHandle(dos_handle) != unix_handle) dos_handle++;
+      fclose(stream);
+      ret = _lclose32( dos_handle);
+    }
+    dprintf_crtdll(stddeb,"CRTDLL_fclose(%p) ufh %d dfh %d%s\n",
+		   stream,unix_handle,dos_handle,(ret)?" failed":"");
+    return ret;
+}
+
+/*********************************************************************
+ *                  _unlink           (CRTDLL.315)
+ */
+INT32 __cdecl CRTDLL__unlink(LPCSTR pathname)
+{
+    int ret=0;
+    DOS_FULL_NAME full_name;
+
+    if (!DOSFS_GetFullName( pathname, FALSE, &full_name )) {
+      dprintf_crtdll(stddeb,"CRTDLL_unlink file %s bad name\n",pathname);
+      return EOF;
+    }
+  
+    ret=unlink(full_name.long_name);
+    dprintf_crtdll(stddeb,"CRTDLL_unlink(%s unix %s)%s\n",
+		   pathname,full_name.long_name, (ret)?" failed":"");
+    return ret;
+}
+
+/*********************************************************************
+ *                  _open           (CRTDLL.239)
+ */
+HFILE32 __cdecl CRTDLL__open(LPCSTR path,INT32 flags)
+{
+    HFILE32 ret=0;
+    int wineflags=0;
+    
+    /* FIXME:
+       the flags in lcc's header differ from the ones in Linux, e.g.
+       Linux: define O_APPEND         02000   (= 0x400)
+       lcc:  define _O_APPEND       0x0008  
+       so here a scheme to translate them
+       Probably lcc is wrong here, but at least a hack to get is going
+       */
+    wineflags = (flags & 3);
+    if (flags & 0x0008 ) wineflags |= O_APPEND;
+    if (flags & 0x0100 ) wineflags |= O_CREAT;
+    if (flags & 0x0200 ) wineflags |= O_TRUNC;
+    if (flags & 0x0400 ) wineflags |= O_EXCL;
+    if (flags & 0xf0f4 ) 
+      dprintf_crtdll(stddeb,"CRTDLL_open file unsupported flags 0x%04x\n",flags);
+    /* End Fixme */
+
+    ret = FILE_Open(path,wineflags);
+    dprintf_crtdll(stddeb,"CRTDLL_open file %s mode 0x%04x (lccmode 0x%04x) got dfh %d\n",
+		   path,wineflags,flags,ret);
+    return ret;
+}
+
+/*********************************************************************
+ *                  _close           (CRTDLL.57)
+ */
+INT32 __cdecl CRTDLL__close(HFILE32 fd)
+{
+    int ret=_lclose32(fd);
+
+    dprintf_crtdll(stddeb,"CRTDLL_close(%d)%s\n",fd,(ret)?" failed":"");
+    return ret;
+}
+
+/*********************************************************************
+ *                  feof           (CRTDLL.363)
+ */
+INT32 __cdecl CRTDLL_feof( FILE *stream )
+{
+    int ret;
+    
+    ret=feof(stream);
+    dprintf_crtdll(stddeb,"CRTDLL_feof(%p) %s\n",stream,(ret)?"true":"false");
+    return ret;
 }
 
 /*********************************************************************
  *                  setlocale           (CRTDLL.453)
  */
-LPSTR CRTDLL_setlocale(INT32 category,LPCSTR locale)
+LPSTR __cdecl CRTDLL_setlocale(INT32 category,LPCSTR locale)
 {
 	LPSTR categorystr;
 
@@ -753,31 +956,53 @@
 	case CRTDLL_LC_TIME: categorystr="LC_TIME";break;
 	default: categorystr = "UNKNOWN?";break;
 	}
-	fprintf(stderr,"CRTDLL.setlocale(%s,%s),stub!\n",categorystr,locale);
+	fprintf(stderr,"CRTDLL_setlocale(%s,%s),stub!\n",categorystr,locale);
 	return "C";
 }
 
 /*********************************************************************
- *                  wcsspn           (CRTDLL.516)
+ *                  wcscat           (CRTDLL.503)
  */
-INT32 CRTDLL_wcsspn(LPWSTR str,LPWSTR accept)
+LPWSTR __cdecl CRTDLL_wcscat( LPWSTR s1, LPCWSTR s2 )
 {
-	LPWSTR	s,t;
+    return lstrcat32W( s1, s2 );
+}
+
+/*********************************************************************
+ *                  wcschr           (CRTDLL.504)
+ */
+LPWSTR __cdecl CRTDLL_wcschr(LPWSTR str,WCHAR xchar)
+{
+	LPWSTR	s;
 
 	s=str;
 	do {
-		t=accept;
-		while (*t) { if (*t==*s) break;t++;}
-		if (!*t) break;
-		s++;
-	} while (*s);
-	return s-str; /* nr of wchars */
+		if (*s==xchar)
+			return s;
+	} while (*s++);
+	return NULL;
+}
+
+/*********************************************************************
+ *                  wcscmp           (CRTDLL.505)
+ */
+INT32 __cdecl CRTDLL_wcscmp( LPCWSTR s1, LPCWSTR s2 )
+{
+    return lstrcmp32W( s1, s2 );
+}
+
+/*********************************************************************
+ *                  wcscpy           (CRTDLL.507)
+ */
+LPWSTR __cdecl CRTDLL_wcscpy( LPWSTR s1, LPCWSTR s2 )
+{
+    return lstrcpy32W( s1, s2 );
 }
 
 /*********************************************************************
  *                  wcscspn           (CRTDLL.508)
  */
-INT32 CRTDLL_wcscspn(LPWSTR str,LPWSTR reject)
+INT32 __cdecl CRTDLL_wcscspn(LPWSTR str,LPWSTR reject)
 {
 	LPWSTR	s,t;
 
@@ -792,49 +1017,91 @@
 }
 
 /*********************************************************************
- *                  wcschr           (CRTDLL.504)
+ *                  wcslen           (CRTDLL.510)
  */
-LPWSTR CRTDLL_wcschr(LPWSTR str,WCHAR xchar)
+INT32 __cdecl CRTDLL_wcslen( LPCWSTR s )
 {
-	LPWSTR	s;
+    return lstrlen32W( s );
+}
+
+/*********************************************************************
+ *                  wcsncat           (CRTDLL.511)
+ */
+LPWSTR __cdecl CRTDLL_wcsncat( LPWSTR s1, LPCWSTR s2, INT32 n )
+{
+    return lstrcatn32W( s1, s2, n );
+}
+
+/*********************************************************************
+ *                  wcsncmp           (CRTDLL.512)
+ */
+INT32 __cdecl CRTDLL_wcsncmp( LPCWSTR s1, LPCWSTR s2, INT32 n )
+{
+    return lstrncmp32W( s1, s2, n );
+}
+
+/*********************************************************************
+ *                  wcsncpy           (CRTDLL.513)
+ */
+LPWSTR __cdecl CRTDLL_wcsncpy( LPWSTR s1, LPCWSTR s2, INT32 n )
+{
+    return lstrcpyn32W( s1, s2, n );
+}
+
+/*********************************************************************
+ *                  wcsspn           (CRTDLL.516)
+ */
+INT32 __cdecl CRTDLL_wcsspn(LPWSTR str,LPWSTR accept)
+{
+	LPWSTR	s,t;
 
 	s=str;
 	do {
-		if (*s==xchar)
-			return s;
-	} while (*s++);
-	return NULL;
+		t=accept;
+		while (*t) { if (*t==*s) break;t++;}
+		if (!*t) break;
+		s++;
+	} while (*s);
+	return s-str; /* nr of wchars */
 }
 
 /*********************************************************************
  *                  towupper           (CRTDLL.494)
  */
-WCHAR CRTDLL_towupper(WCHAR x)
+WCHAR __cdecl CRTDLL_towupper(WCHAR x)
 {
     return (WCHAR)toupper((CHAR)x);
 }
 
 /*********************************************************************
- *                  swprintf           (CRTDLL.483)
+ *                  _wcsicmp           (CRTDLL.321)
  */
-DWORD CRTDLL_swprintf(DWORD *args)
+DWORD __cdecl CRTDLL__wcsicmp( LPCWSTR s1, LPCWSTR s2 )
 {
-    return WIN32_wsprintf32W(args);
+    return lstrcmpi32W( s1, s2 );
 }
 
 /*********************************************************************
  *                  _wcsicoll           (CRTDLL.322)
  */
-DWORD CRTDLL__wcsicoll(LPWSTR a1,LPWSTR a2)
+DWORD __cdecl CRTDLL__wcsicoll(LPCWSTR a1,LPCWSTR a2)
 {
     /* FIXME: handle collates */
     return lstrcmpi32W(a1,a2);
 }
 
 /*********************************************************************
+ *                  _wcsnicmp           (CRTDLL.324)
+ */
+DWORD __cdecl CRTDLL__wcsnicmp( LPCWSTR s1, LPCWSTR s2, INT32 len )
+{
+    return lstrncmpi32W( s1, s2, len );
+}
+
+/*********************************************************************
  *                  wcscoll           (CRTDLL.506)
  */
-DWORD CRTDLL_wcscoll(LPWSTR a1,LPWSTR a2)
+DWORD __cdecl CRTDLL_wcscoll(LPWSTR a1,LPWSTR a2)
 {
     /* FIXME: handle collates */
     return lstrcmp32W(a1,a2);
@@ -843,7 +1110,7 @@
 /*********************************************************************
  *                  _wcsrev           (CRTDLL.326)
  */
-VOID CRTDLL__wcsrev(LPWSTR s) {
+VOID __cdecl CRTDLL__wcsrev(LPWSTR s) {
 	LPWSTR	e;
 
 	e=s;
@@ -860,7 +1127,7 @@
 /*********************************************************************
  *                  wcsstr           (CRTDLL.517)
  */
-LPWSTR CRTDLL_wcsstr(LPWSTR s,LPWSTR b)
+LPWSTR __cdecl CRTDLL_wcsstr(LPWSTR s,LPWSTR b)
 {
 	LPWSTR	x,y,c;
 
@@ -878,9 +1145,18 @@
 }
 
 /*********************************************************************
+ *                  wcstombs   (CRTDLL.521)
+ */
+INT32 __cdecl CRTDLL_wcstombs( LPSTR dst, LPCWSTR src, INT32 len )
+{
+    lstrcpynWtoA( dst, src, len );
+    return strlen(dst);  /* FIXME: is this right? */
+}
+
+/*********************************************************************
  *                  wcsrchr           (CRTDLL.515)
  */
-LPWSTR CRTDLL_wcsrchr(LPWSTR str,WCHAR xchar)
+LPWSTR __cdecl CRTDLL_wcsrchr(LPWSTR str,WCHAR xchar)
 {
 	LPWSTR	s;
 
@@ -895,52 +1171,115 @@
 
 /*********************************************************************
  *                  _setmode           (CRTDLL.265)
- * FIXME: dunno what this is.
+ * FIXME: At present we ignore the request to translate CR/LF to LF.
+ *
+ * We allways translate when we read with fgets, we never do with fread
+ *
  */
-DWORD
-CRTDLL__setmode(LPVOID x,INT32 y) {
+INT32 __cdecl CRTDLL__setmode( INT32 fh,INT32 mode)
+{
 	/* FIXME */
-	fprintf(stdnimp,"CRTDLL._setmode(%p,%d), STUB.\n",x,y);
-	return 0;
+#define O_TEXT     0x4000
+#define O_BINARY   0x8000
+
+	dprintf_crtdll(stddeb,
+		       "CRTDLL._setmode on fhandle %d mode %s, STUB.\n",
+		fh,(mode=O_TEXT)?"O_TEXT":
+		(mode=O_BINARY)?"O_BINARY":"UNKNOWN");
+	return -1;
 }
 
 /*********************************************************************
  *                  atexit           (CRTDLL.345)
  */
-INT32
-CRTDLL_atexit(LPVOID x) {
+INT32 __cdecl CRTDLL_atexit(LPVOID x)
+{
 	/* FIXME */
 	fprintf(stdnimp,"CRTDLL.atexit(%p), STUB.\n",x);
 	return 0; /* successful */
 }
 
 /*********************************************************************
+ *                  mblen          (CRTDLL.428)
+ * FIXME: check multibyte support
+ */
+WCHAR  __cdecl CRTDLL_mblen(CHAR *mb,INT32 size)
+{
+
+    int ret=1;
+    
+    if (!mb)
+      ret = 0;
+    else if ((size<1)||(!*(mb+1)))
+      ret = -1;
+    else if (!(*mb))
+      ret =0;
+      
+    dprintf_crtdll(stderr,"CRTDLL_mlen %s for max %d bytes ret %d\n",mb,size,ret);
+
+    return ret;
+}
+
+/*********************************************************************
  *                  mbstowcs           (CRTDLL.429)
  * FIXME: check multibyte support
  */
-INT32
-CRTDLL_mbstowcs(LPWSTR a,LPSTR b,INT32 nr) {
-	int	i;
-	for (i=0;(i<nr) && b[i];i++) {
-		a[i] = (WCHAR)b[i];
+INT32 __cdecl CRTDLL_mbstowcs(LPWSTR wcs, LPCSTR mbs, INT32 size)
+{
+
+/* Slightly modified lstrcpynAtoW functions from memory/strings.c
+ *  We need the numberr of characters transfered 
+ *  FIXME: No multibyte support yet
+ */
+
+    LPWSTR p = wcs;
+    LPCSTR src= mbs;
+    int ret, n=size;
+
+    while ((n-- > 0) && *src) {
+      *p++ = (WCHAR)(unsigned char)*src++;
 	}
-	return i;
+    p++;
+    ret = (p -wcs);
+          
+    dprintf_crtdll(stddeb,"CRTDLL_mbstowcs %s for %d chars put %d wchars\n",
+		   mbs,size,ret);
+    return ret;
 }
 
 /*********************************************************************
  *                  mbtowc           (CRTDLL.430)
  * FIXME: check multibyte support
  */
-WCHAR
-CRTDLL_mbtowc(CHAR a) {
-	return a;
+WCHAR __cdecl CRTDLL_mbtowc(WCHAR* wc,CHAR* mb,INT32 size) 
+{
+   int ret;
+
+   if (!mb)
+     ret = 0;
+   else if (!wc)
+     ret =-1;
+   else 
+     if ( (ret = mblen(mb,size)) != -1 )
+       {
+	 if (ret <= sizeof(char))
+	   *wc = (WCHAR) ((unsigned char)*mb);
+        else
+        ret=   -1;
+        }   
+     else
+       ret = -1;
+   
+   dprintf_crtdll(stderr,"CRTDLL_mbtowc %s for %d chars\n",mb,size);
+         
+   return ret;
 }
 
 /*********************************************************************
  *                  _isctype           (CRTDLL.138)
  */
-BOOL32
-CRTDLL__isctype(CHAR x,CHAR type) {
+BOOL32 __cdecl CRTDLL__isctype(CHAR x,CHAR type)
+{
 	if ((type & CRTDLL_SPACE) && isspace(x))
 		return TRUE;
 	if ((type & CRTDLL_PUNCT) && ispunct(x))
@@ -962,8 +1301,8 @@
 /*********************************************************************
  *                  _chdrive           (CRTDLL.52)
  */
-BOOL32
-CRTDLL__chdrive(INT32 newdrive) {
+BOOL32 __cdecl CRTDLL__chdrive(INT32 newdrive)
+{
 	/* FIXME: generates errnos */
 	return DRIVE_SetCurrentDrive(newdrive);
 }
@@ -971,18 +1310,51 @@
 /*********************************************************************
  *                  _chdir           (CRTDLL.51)
  */
-INT32
-CRTDLL__chdir(LPCSTR newdir) {
+INT32 __cdecl CRTDLL__chdir(LPCSTR newdir)
+{
 	if (!SetCurrentDirectory32A(newdir))
 		return -1;
 	return 0;
 }
 
 /*********************************************************************
+ *                  _getcwd           (CRTDLL.120)
+ */
+CHAR* __cdecl CRTDLL__getcwd(LPSTR buf, INT32 size)
+{
+  DOS_FULL_NAME full_name;
+  char *ret;
+
+  dprintf_crtdll(stddeb,"CRTDLL_getcwd for buf %p size %d\n",
+		 buf,size);
+  if (buf == NULL)
+    {
+      dprintf_crtdll(stderr,"CRTDLL_getcwd malloc unsupported\n");
+      printf("CRTDLL_getcwd malloc unsupported\n");
+      return 0;
+    }
+  ret = getcwd(buf,size);
+  if (!DOSFS_GetFullName( buf, FALSE, &full_name )) 
+    {
+      dprintf_crtdll(stddeb,"CRTDLL_getcwd failed\n");
+      return 0;
+    }
+  if (strlen(full_name.short_name)>size) 
+    {
+      dprintf_crtdll(stddeb,"CRTDLL_getcwd string too long\n");
+      return 0;
+    }
+  ret=strcpy(buf,full_name.short_name);
+  if (ret) 
+    dprintf_crtdll(stddeb,"CRTDLL_getcwd returned:%s\n",ret);
+  return ret;
+}
+
+/*********************************************************************
  *                  _mkdir           (CRTDLL.234)
  */
-INT32
-CRTDLL__mkdir(LPCSTR newdir) {
+INT32 __cdecl CRTDLL__mkdir(LPCSTR newdir)
+{
 	if (!CreateDirectory32A(newdir,NULL))
 		return -1;
 	return 0;
@@ -992,8 +1364,8 @@
  *                  _errno           (CRTDLL.52)
  * Yes, this is a function.
  */
-LPINT32
-CRTDLL__errno() {
+LPINT32 __cdecl CRTDLL__errno()
+{
 	static	int crtdllerrno;
 	extern int LastErrorToErrno(DWORD);
 
@@ -1001,3 +1373,83 @@
 	crtdllerrno = LastErrorToErrno(GetLastError());
 	return &crtdllerrno;
 }
+
+/*********************************************************************
+ *                  _tempnam           (CRTDLL.305)
+ * 
+ */
+LPSTR __cdecl CRTDLL__tempnam(LPCSTR dir, LPCSTR prefix)
+{
+
+     char *ret;
+     DOS_FULL_NAME tempname;
+     
+     if ((ret = tempnam(dir,prefix))==NULL) {
+       dprintf_crtdll(stddeb,
+		      "CRTDLL_tempnam Unable to get unique filename\n");
+       return NULL;
+     }
+     if (!DOSFS_GetFullName(ret,FALSE,&tempname))
+     {
+       dprintf_crtdll(stddeb,
+		      "CRTDLL_tempnam Wrong path?\n");
+       return NULL;
+     }
+     free(ret);
+     if ((ret = CRTDLL_malloc(strlen(tempname.short_name)+1)) == NULL) {
+	 dprintf_crtdll(stddeb,
+			"CRTDLL_tempnam CRTDL_malloc for shortname failed\n");
+	 return NULL;
+     }
+     if ((ret = strcpy(ret,tempname.short_name)) == NULL) { 
+       dprintf_crtdll(stddeb,
+		      "CRTDLL_tempnam Malloc for shortname failed\n");
+       return NULL;
+     }
+     
+     dprintf_crtdll(stddeb,"CRTDLL_tempnam dir %s prefix %s got %s\n",
+		    dir,prefix,ret);
+     return ret;
+
+}
+/*********************************************************************
+ *                  tmpnam           (CRTDLL.490)
+ *
+ * lcclnk from lcc-win32 relies on a terminating dot in the name returned
+ * 
+ */
+LPSTR __cdecl CRTDLL_tmpnam(LPSTR s)
+{
+     char *ret;
+
+     if ((ret =tmpnam(s))== NULL) {
+       dprintf_crtdll(stddeb,
+		      "CRTDLL_tmpnam Unable to get unique filename\n");
+       return NULL;
+     }
+     if (!DOSFS_GetFullName(ret,FALSE,&CRTDLL_tmpname))
+     {
+       dprintf_crtdll(stddeb,
+		      "CRTDLL_tmpnam Wrong path?\n");
+       return NULL;
+     }
+     strcat(CRTDLL_tmpname.short_name,".");
+     dprintf_crtdll(stddeb,"CRTDLL_tmpnam for buf %p got %s\n",
+		    s,CRTDLL_tmpname.short_name);
+     dprintf_crtdll(stddeb,"CRTDLL_tmpnam long got %s\n",
+		    CRTDLL_tmpname.long_name);
+     if ( s != NULL) 
+       return strcpy(s,CRTDLL_tmpname.short_name);
+     else 
+       return CRTDLL_tmpname.short_name;
+
+}
+
+/*********************************************************************
+ *                  _itoa           (CRTDLL.165)
+ */
+LPSTR  __cdecl CRTDLL__itoa(INT32 x,LPSTR buf,INT32 buflen)
+{
+    wsnprintf32A(buf,buflen,"%d",x);
+    return buf;
+}
diff --git a/misc/lstr.c b/misc/lstr.c
index 64190c3..f2fd7c6 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -137,7 +137,7 @@
     for (p = buffer; *str; str++) if (*str != '\r') *p++ = *str;
     *p = '\0';
     if ((p > buffer) && (p[-1] == '\n')) p[1] = '\0'; /* Remove trailing \n */
-    module = MODULE_GetModuleName( GetExePtr(GetCurrentTask()) );
+    module = MODULE_GetModuleName( GetCurrentTask() );
     fprintf( stderr, "OutputDebugString: %s says '%s'\n",
              module ? module : "???", buffer );
     HeapFree( GetProcessHeap(), 0, buffer );
@@ -475,7 +475,7 @@
 }
 
 /***********************************************************************
- *           FormatMessageA   (KERNEL32.138) Library Version
+ *           FormatMessage32A   (KERNEL32.138)
  * FIXME: missing wrap,FROM_SYSTEM message-loading,
  */
 DWORD WINAPI FormatMessage32A(
@@ -577,10 +577,7 @@
 						if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY)
 							argliststart=args+insertnr-1;
 						else
-							/* FIXME: not sure that this is
-							 * correct for unix-c-varargs.
-							 */
-							argliststart=((DWORD*)&args)+insertnr-1;
+                                                    argliststart=(*(DWORD**)args)+insertnr-1;
 
 						if (fmtstr[strlen(fmtstr)]=='s')
 							sprintfbuf=HeapAlloc(GetProcessHeap(),0,strlen((LPSTR)argliststart[0])+1);
@@ -643,44 +640,10 @@
 }
 #undef ADD_TO_T
 
+
 /***********************************************************************
- *           FormatMessageA   (KERNEL32.138) Emulator Version
+ *           FormatMessage32W   (KERNEL32.138)
  */
-DWORD WINAPI WIN32_FormatMessage32A(DWORD *args)
-{
-	DWORD	dwFlags		= args[0];
-	LPCVOID	lpSource	= (LPCVOID)args[1];
-	DWORD	dwMessageId	= args[2];
-	DWORD	dwLanguageId	= args[3];
-	LPSTR	lpBuffer	= (LPSTR)args[4];
-	DWORD	nSize		= args[5];
-	DWORD	*xargs;
-
-	/* convert possible varargs to an argument array look-a-like */
-
-	if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY) {
-		xargs=(DWORD*)args[6];
-	} else {
-		/* args[6] is a pointer to a pointer to the start of 
-		 * a list of arguments.
-		 */
-		if (args[6])
-			xargs=(DWORD*)(((DWORD*)args[6])[0]);
-		else
-			xargs=NULL;
-		dwFlags|=FORMAT_MESSAGE_ARGUMENT_ARRAY;
-	}
-	return FormatMessage32A(
-		dwFlags,
-		lpSource,
-		dwMessageId,
-		dwLanguageId,
-		lpBuffer,
-		nSize,
-		xargs
-	);
-}
-
 DWORD WINAPI FormatMessage32W(
 	DWORD	dwFlags,
 	LPCVOID	lpSource,
@@ -781,10 +744,7 @@
 					if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY)
 						argliststart=args+insertnr-1;
 					else
-						/* FIXME: not sure that this is
-						 * correct for unix-c-varargs.
-						 */
-						argliststart=((DWORD*)&args)+insertnr-1;
+						argliststart=(*(DWORD**)args)+insertnr-1;
 
 					if (fmtstr[strlen(fmtstr)]=='s') {
 						DWORD	xarr[3];
@@ -847,41 +807,3 @@
 			lstrlen32W(lpBuffer);
 }
 #undef ADD_TO_T
-
-/***********************************************************************
- *           FormatMessageW   (KERNEL32.138) Emulator Version
- */
-DWORD WINAPI WIN32_FormatMessage32W(DWORD *args)
-{
-	DWORD	dwFlags		= args[0];
-	LPCVOID	lpSource	= (LPCVOID)args[1];
-	DWORD	dwMessageId	= args[2];
-	DWORD	dwLanguageId	= args[3];
-	LPWSTR	lpBuffer	= (LPWSTR)args[4];
-	DWORD	nSize		= args[5];
-	DWORD	*xargs;
-
-	/* convert possible varargs to an argument array look-a-like */
-
-	if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY) {
-		xargs=(DWORD*)args[6];
-	} else {
-		/* args[6] is a pointer to a pointer to the start of 
-		 * a list of arguments.
-		 */
-		if (args[6])
-			xargs=(DWORD*)(((DWORD*)args[6])[0]);
-		else
-			xargs=NULL;
-		dwFlags|=FORMAT_MESSAGE_ARGUMENT_ARRAY;
-	}
-	return FormatMessage32W(
-		dwFlags,
-		lpSource,
-		dwMessageId,
-		dwLanguageId,
-		lpBuffer,
-		nSize,
-		xargs
-	);
-}
diff --git a/misc/main.c b/misc/main.c
index 3ef3384..c158941 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -35,31 +35,123 @@
 #include "xmalloc.h"
 
 const char people[] = "Wine is available thanks to the work of "
-"Bob Amstadt, Dag Asheim, Martin Ayotte, Peter Bajusz, Ross Biro, "
-"Uwe Bonnes, Erik Bos, Fons Botman, John Brezak, Andrew Bulhak, "
-"John Burton, Niels de Carpentier, Jimen Ching, Huw D. M. Davies, "
-"Roman Dolejsi, Frans van Dorsselaer, Paul Falstad, David Faure, "
-"Olaf Flebbe, Peter Galbavy, Ramon Garcia, Matthew Ghio, "
-"Hans de Graaff, Charles M. Hannum, John Harvey, Cameron Heide, "
-"Jochen Hoenicke, Onno Hovers, Jeffrey Hsu, Miguel de Icaza, "
-"Jukka Iivonen, Lee Jaekil, Alexandre Julliard, Bang Jun-Young, "
-"Pavel Kankovsky, Jochen Karrer, Andreas Kirschbaum, Albrecht Kleine, "
-"Jon Konrath, Alex Korobka, Greg Kreider, Anand Kumria, Scott A. Laird, "
-"Andrew Lewycky, Martin von Loewis, Kenneth MacDonald, Peter MacDonald, "
-"William Magro, Juergen Marquardt, Ricardo Massaro, Marcus Meissner, "
-"Graham Menhennitt, David Metcalfe, Bruce Milner, Steffen Moeller, "
-"Andreas Mohr, Philippe De Muyter, Itai Nahshon, Michael Patra, "
-"Jim Peterson, Robert Pouliot, Keith Reynolds, Slaven Rezic, "
-"John Richardson, Johannes Ruscheinski, Thomas Sandford, "
-"Constantine Sapuntzakis, Pablo Saratxaga, Daniel Schepler, "
-"Ulrich Schmid, Bernd Schmidt, Yngvi Sigurjonsson, Stephen Simmons, "
-"Rick Sladkey, William Smith, Dominik Strasser, Vadim Strizhevsky, "
-"Erik Svendsen, Tristan Tarrant, Andrew Taylor, Duncan C Thomson, "
-"Goran Thyni, Jimmy Tirtawangsa, Jon Tombs, Linus Torvalds, "
-"Gregory Trubetskoy, Petri Tuomola, Michael Veksler, Sven Verdoolaege, "
-"Ronan Waide, Eric Warnke, Manfred Weichel, Morten Welinder, "
-"Jan Willamowius, Carl Williams, Karl Guenter Wuensch, Eric Youngdale, "
-"James Youngman, Mikolaj Zalewski, and John Zero.";
+"Bob Amstadt, "
+"Dag Asheim, "
+"Martin Ayotte, "
+"Peter Bajusz, "
+"Georg Beyerle, "
+"Ross Biro, "
+"Uwe Bonnes, "
+"Erik Bos, "
+"Fons Botman, "
+"John Brezak, "
+"Andrew Bulhak, "
+"John Burton, "
+"Niels de Carpentier, "
+"Jimen Ching, "
+"David A. Cuthbert, "
+"Huw D. M. Davies, "
+"Roman Dolejsi, "
+"Frans van Dorsselaer, "
+"Chris Faherty, "
+"Paul Falstad, "
+"David Faure, "
+"Claus Fischer, "
+"Olaf Flebbe, "
+"Chad Fraleigh, "
+"Peter Galbavy, "
+"Ramon Garcia, "
+"Matthew Ghio, "
+"Jody Goldberg, "
+"Hans de Graaff, "
+"Charles M. Hannum, "
+"Adrian Harvey, "
+"John Harvey, "
+"Cameron Heide, "
+"Jochen Hoenicke, "
+"Onno Hovers, "
+"Jeffrey Hsu, "
+"Miguel de Icaza, "
+"Jukka Iivonen, "
+"Lee Jaekil, "
+"Alexandre Julliard, "
+"Bang Jun-Young, "
+"Pavel Kankovsky, "
+"Jochen Karrer, "
+"Andreas Kirschbaum, "
+"Albrecht Kleine, "
+"Jon Konrath, "
+"Alex Korobka, "
+"Greg Kreider, "
+"Anand Kumria, "
+"Scott A. Laird, "
+"Andrew Lewycky, "
+"Martin von Loewis, "
+"Michiel van Loon, "
+"Kenneth MacDonald, "
+"Peter MacDonald, "
+"William Magro, "
+"Juergen Marquardt, "
+"Ricardo Massaro, "
+"Marcus Meissner, "
+"Graham Menhennitt, "
+"David Metcalfe, "
+"Bruce Milner, "
+"Steffen Moeller, "
+"Andreas Mohr, "
+"Philippe De Muyter, "
+"Itai Nahshon, "
+"Henrik Olsen, "
+"Michael Patra, "
+"Dimitrie O. Paun, "
+"Jim Peterson, "
+"Robert Pouliot, "
+"Keith Reynolds, "
+"Slaven Rezic, "
+"John Richardson, "
+"Rick Richardson, "
+"Doug Ridgway, "
+"Bernhard Rosenkraenzer, "
+"Johannes Ruscheinski, "
+"Thomas Sandford, "
+"Constantine Sapuntzakis, "
+"Pablo Saratxaga, "
+"Daniel Schepler, "
+"Peter Schlaile, "
+"Ulrich Schmid, "
+"Bernd Schmidt, "
+"Ingo Schneider, "
+"Victor Schneider, "
+"Yngvi Sigurjonsson, "
+"Stephen Simmons, "
+"Rick Sladkey, "
+"William Smith, "
+"Dominik Strasser, "
+"Vadim Strizhevsky, "
+"Erik Svendsen, "
+"Tristan Tarrant, "
+"Andrew Taylor, "
+"Duncan C Thomson, "
+"Goran Thyni, "
+"Jimmy Tirtawangsa, "
+"Jon Tombs, "
+"Linus Torvalds, "
+"Gregory Trubetskoy, "
+"Petri Tuomola, "
+"Michael Veksler, "
+"Sven Verdoolaege, "
+"Ronan Waide, "
+"Eric Warnke, "
+"Manfred Weichel, "
+"Morten Welinder, "
+"Lawson Whitney, "
+"Jan Willamowius, "
+"Carl Williams, "
+"Karl Guenter Wuensch, "
+"Eric Youngdale, "
+"James Youngman, "
+"Mikolaj Zalewski, "
+"and John Zero.";
 
 const WINE_LANGUAGE_DEF Languages[] =
 {
diff --git a/misc/network.c b/misc/network.c
index 3768fc9..4ebd1ff 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -153,8 +153,8 @@
 /**************************************************************************
  *				WNetGetConnection	[USER.512]
  */
-int WINAPI WNetGetConnection(LPSTR lpLocalName, 
-                             LPSTR lpRemoteName, UINT16 *cbRemoteName)
+int WINAPI WNetGetConnection16(LPSTR lpLocalName, 
+                               LPSTR lpRemoteName, UINT16 *cbRemoteName)
 {
     const char *path;
 
@@ -402,4 +402,11 @@
 }
 
 
-
+DWORD
+WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen)
+{
+	UINT16	x;
+	DWORD	ret = WNetGetConnection16(localname,remotename,&x);
+	*buflen = x;
+	return ret;
+}
diff --git a/misc/ntdll.c b/misc/ntdll.c
index 43b6a5d..aeef87a 100644
--- a/misc/ntdll.c
+++ b/misc/ntdll.c
@@ -510,3 +510,27 @@
 	/* returns file io completion status */
 	return 0;
 }
+/*
+These functions were originally in CRTDLL. CRTFLL now call the C-Lib 
+function directly. So they were moved here
+*/
+
+/*********************************************************************
+ *                  atoi          (NDLL.885)
+ */
+INT32 NTDLL_atoi(LPCSTR x)
+{
+    if (!x) return 0;
+    return atoi(x);
+}
+
+/*********************************************************************
+ *                  atol          (NTDLL.886)
+ */
+LONG NTDLL_atol(LPCSTR x)
+{
+    if (!x) return 0;
+    return atol(x);
+}
+
+
diff --git a/misc/ole2.c b/misc/ole2.c
index 5f65195..8996ce9 100644
--- a/misc/ole2.c
+++ b/misc/ole2.c
@@ -17,8 +17,8 @@
  */
 DWORD WINAPI OleBuildVersion()
 {
-	dprintf_ole(stddeb,"OleBuildVersion()\n");
-	return (rmm<<16)+rup;
+    dprintf_ole(stddeb,"OleBuildVersion()\n");
+    return (rmm<<16)+rup;
 }
 
 /***********************************************************************
@@ -35,5 +35,14 @@
  */
 void WINAPI OleUninitialize()
 {
-	dprintf_ole(stdnimp,"OleUninitialize()\n");
+    dprintf_ole(stdnimp,"OleUninitialize()\n");
 }
+
+/***********************************************************************
+ *           OleFlushClipboard   [OLE2.76]
+ */
+HRESULT WINAPI OleFlushClipboard()
+{
+    return S_OK;
+}
+
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index df08c93..5fd924e 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -125,6 +125,7 @@
 	LOCALE_ENTRY(IPOSSEPBYSPACE),
 	LOCALE_ENTRY(INEGSYMPRECEDES),
 	LOCALE_ENTRY(INEGSEPBYSPACE),
+/*	LOCALE_ENTRY(FONTSIGNATURE),*/
 	{NULL,0},
 };
 
@@ -183,7 +184,7 @@
 /***********************************************************************
  *           GetUserDefaultLCID       (OLE2NLS.1)
  */
-DWORD WINAPI GetUserDefaultLCID()
+LCID WINAPI GetUserDefaultLCID()
 {
 /* Default sorting, neutral sublanguage */
     switch(Options.language)
@@ -224,7 +225,7 @@
 /***********************************************************************
  *         GetSystemDefaultLCID       (OLE2NLS.2)
  */
-DWORD WINAPI GetSystemDefaultLCID()
+LCID WINAPI GetSystemDefaultLCID()
 {
 	return GetUserDefaultLCID();
 }
@@ -232,7 +233,7 @@
 /***********************************************************************
  *         GetUserDefaultLangID       (OLE2NLS.3)
  */
-WORD WINAPI GetUserDefaultLangID()
+LANGID WINAPI GetUserDefaultLangID()
 {
 	return (WORD)GetUserDefaultLCID();
 }
@@ -240,7 +241,7 @@
 /***********************************************************************
  *         GetSystemDefaultLangID     (OLE2NLS.4)
  */
-WORD WINAPI GetSystemDefaultLangID()
+LANGID WINAPI GetSystemDefaultLangID()
 {
 	return GetUserDefaultLangID();
 }
@@ -261,6 +262,9 @@
 
 	dprintf_ole(stddeb,"GetLocaleInfo32A(%8lX,%8lX,%p,%4X)\n",
 			lcid,LCType,buf,len);
+
+	LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
+
 	/* As an option, we could obtain the value from win.ini.
 	   This would not match the Wine compile-time option.
 	   Also, not all identifiers are available from win.ini */
@@ -303,8 +307,8 @@
 LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland")
 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"851")
 /* Dunno
-LOCVAL(LOCALE_IDEFAULTCODEPAGE)
 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
 */
 LOCVAL(LOCALE_SLIST,";")
@@ -522,8 +526,6 @@
 
     case LANG_En:
     	switch (LCType) {
-/* This definitions apply to Germany only. Users in Austria 
-   or Switzerland might want to modify them */
 LOCVAL(LOCALE_ILANGUAGE,"9")
 LOCVAL(LOCALE_SLANGUAGE,"English")
 LOCVAL(LOCALE_SENGLANGUAGE,"English")
@@ -536,8 +538,8 @@
 LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland")
 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"437")
 /* Dunno
-LOCVAL(LOCALE_IDEFAULTCODEPAGE)
 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
 */
 LOCVAL(LOCALE_SLIST,";")
@@ -1685,7 +1687,8 @@
 	if(!found) {
 		fprintf(stderr,"'%s' not supported for your language.\n",
 			retString);
-		return 0;
+		retString = "<WINE-NLS-unknown>";
+		/*return 0;*/
 	}
 	if (buf)
 		lstrcpyn32A(buf,retString,len);
@@ -2029,3 +2032,59 @@
 	return strlen(languages[i].langname); /* same as strlenW(langname); */
 }
 
+
+INT32 WINAPI LCMapString32A(
+	LCID lcid,DWORD mapflags,LPCSTR srcstr,INT32 srclen,LPSTR dststr,
+	INT32 dstlen
+) {
+	int	i,len;
+
+	fprintf(stderr,"LCMapStringA(0x%04lx,0x%08lx,%s,%d,%p,%d)\n",
+		lcid,mapflags,srcstr,srclen,dststr,dstlen
+	);
+	if (!dstlen || !dststr) {
+		dststr = srcstr;
+	}
+	if (!srclen) srclen = strlen(srcstr);
+	if (!dstlen) dstlen = strlen(dststr);
+	len = dstlen;
+	if (srclen < len)
+		len = srclen;
+	if (mapflags & LCMAP_LOWERCASE) {
+		for (i=0;i<len;i++)
+			dststr[i]=tolower(srcstr[i]);
+		mapflags &= ~LCMAP_LOWERCASE;
+	}
+	if (mapflags)
+		fprintf(stderr,"	unimplemented flags: 0x%08lx\n",mapflags);
+	return len;
+}
+
+/* FIXME: implement everyhting & correct */
+
+INT32 WINAPI LCMapString32W(
+	LCID lcid,DWORD mapflags,LPCWSTR srcstr,INT32 srclen,LPWSTR dststr,
+	INT32 dstlen
+) {
+	int	i,len;
+
+	fprintf(stderr,"LCMapStringW(0x%04lx,0x%08lx,%p,%d,%p,%d)\n",
+		lcid,mapflags,srcstr,srclen,dststr,dstlen
+	);
+	if (!dstlen || !dststr) {
+		dststr = srcstr;
+	}
+	if (!srclen) srclen = strlen(srcstr);
+	if (!dstlen) dstlen = strlen(dststr);
+	len = dstlen;
+	if (srclen < len)
+		len = srclen;
+	if (mapflags & LCMAP_LOWERCASE) {
+		for (i=0;i<len;i++)
+			dststr[i]=tolower(srcstr[i]);
+		mapflags &= ~LCMAP_LOWERCASE;
+	}
+	if (mapflags)
+		fprintf(stderr,"	unimplemented flags: 0x%08lx\n",mapflags);
+	return len;
+}
diff --git a/misc/printdrv.c b/misc/printdrv.c
index 2a6cc30..1ad9e09 100644
--- a/misc/printdrv.c
+++ b/misc/printdrv.c
@@ -83,7 +83,7 @@
                                 LPSTR pDeviceName, LPDEVMODE32A pDevModeOutput,
                                   LPDEVMODE32A pDevModeInput,DWORD fMode )
 {
-    fprintf(stderr,"DocumentPropertiesA(%d,%d,%s,%p,%p,%d)\n",
+    fprintf(stderr,"DocumentPropertiesA(%d,%d,%s,%p,%p,%ld)\n",
 	hWnd,hPrinter,pDeviceName,pDevModeOutput,pDevModeInput,fMode
     );
     return 1;
diff --git a/misc/registry.c b/misc/registry.c
index 56dea7d..e14b342 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -2093,11 +2093,33 @@
 		hkey,lpszValueName,lpdwReserved,lpdwType,lpbData,
 		lpcbData?*lpcbData:0
 	);
+	if (lpszValueName)
+		lpszValueNameW=strdupA2W(lpszValueName);
+	else 
+		lpszValueNameW=NULL;
+
+	if (lpdwType)
+		type=*lpdwType;
+
 	if (lpbData) {
-		/* double buffer */
-		buf	= (LPBYTE)xmalloc((*lpcbData)*2);
-		myxlen	= *lpcbData*2;
+		myxlen  = 0;
 		mylen	= &myxlen;
+		buf	= xmalloc(4);
+		ret=RegQueryValueEx32W(
+			hkey,
+			lpszValueNameW,
+			lpdwReserved,
+			&type,
+			buf,
+			mylen
+		);
+		free(buf);
+		if (ret==ERROR_MORE_DATA) {
+			buf	= (LPBYTE)xmalloc(*mylen);
+		} else {
+			buf	= (LPBYTE)xmalloc(2*(*lpcbData));
+			myxlen  = 2*(*lpcbData);
+		}
 	} else {
 		buf=NULL;
 		if (lpcbData) {
@@ -2106,13 +2128,6 @@
 		} else
 			mylen	= NULL;
 	}
-	if (lpszValueName)
-		lpszValueNameW=strdupA2W(lpszValueName);
-	else 
-		lpszValueNameW=NULL;
-
-	if (lpdwType)
-		type=*lpdwType;
 	ret=RegQueryValueEx32W(
 		hkey,
 		lpszValueNameW,
diff --git a/misc/shell.c b/misc/shell.c
index b3a9ffe..63e618a 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -46,7 +46,7 @@
 
 #pragma pack(4)
 
-extern HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16, HINSTANCE16, BOOL32);
+extern HICON16   LoadIconHandler( HGLOBAL16 hResource, BOOL16 bNew );
 extern WORD 	 GetIconID( HGLOBAL16 hResource, DWORD resType );
 
 static const char*	lpstrMsgWndCreated = "OTHERWINDOWCREATED";
@@ -688,34 +688,40 @@
       if( nIconIndex == (UINT16)-1 ) RetPtr[0] = iconDirCount;
       else if( nIconIndex < iconDirCount )
       {
-	   UINT16   i, icon;
+	  UINT16   i, icon;
 
-	   if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
+	  if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
 
-	   for( i = nIconIndex; i < nIconIndex + n; i++ ) 
-	   {
-	       /* .ICO files have only one icon directory */
+	  for( i = nIconIndex; i < nIconIndex + n; i++ ) 
+	  {
+	      /* .ICO files have only one icon directory */
 
-	       if( lpiID == NULL )
+	      if( lpiID == NULL )
 	           hIcon = SHELL_LoadResource( hInstance, hFile, pIconDir + i, 
 							      *(WORD*)pData );
-	       RetPtr[i-nIconIndex] = GetIconID( hIcon, 3 );
-	       GlobalFree16(hIcon); 
-           }
+	      RetPtr[i-nIconIndex] = GetIconID( hIcon, 3 );
+	      GlobalFree16(hIcon); 
+          }
 
-	   for( icon = nIconIndex; icon < nIconIndex + n; icon++ )
-	   {
-	       hIcon = 0;
-	       if( lpiID )
+	  for( icon = nIconIndex; icon < nIconIndex + n; icon++ )
+	  {
+	      hIcon = 0;
+	      if( lpiID )
 		   hIcon = ICO_LoadIcon( hInstance, hFile, 
 					 lpiID->idEntries + RetPtr[icon-nIconIndex]);
-	       else
+	      else
 	         for( i = 0; i < iconCount; i++ )
 		   if( pIconStorage[i].id == (RetPtr[icon-nIconIndex] | 0x8000) )
 		     hIcon = SHELL_LoadResource( hInstance, hFile, pIconStorage + i,
 								    *(WORD*)pData );
-	       RetPtr[icon-nIconIndex] = (hIcon)?CURSORICON_LoadHandler( hIcon, hInstance, FALSE ):0;
-	   }
+	      if( hIcon )
+	      {
+		  RetPtr[icon-nIconIndex] = LoadIconHandler( hIcon, TRUE ); 
+		  FarSetOwner( RetPtr[icon-nIconIndex], GetExePtr(hInstance) );
+	      }
+	      else
+		  RetPtr[icon-nIconIndex] = 0;
+	  }
       }
     if( lpiID ) HeapFree( GetProcessHeap(), 0, lpiID);
     else HeapFree( GetProcessHeap(), 0, pData);
@@ -1030,3 +1036,9 @@
 	*numargs=i;
 	return argv;
 }
+
+void WINAPI Control_RunDLL(DWORD a1,DWORD a2,LPSTR a3,DWORD a4) {
+	fprintf(stderr,"Control_RunDLL(0x%08lx,0x%08lx,%s,0x%08lx)\n",
+		a1,a2,a3,a4
+	);
+}
diff --git a/misc/spy.c b/misc/spy.c
index 65490b9..56cebfe 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -9,6 +9,7 @@
 #include <stdio.h>
 #include <string.h>
 #include "windows.h"
+#include "win.h"
 #include "module.h"
 #include "options.h"
 #include "stddebug.h"
@@ -568,6 +569,7 @@
 
 
 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
+static BOOL16 SPY_ExcludeDWP = 0;
 static int SPY_IndentLevel  = 0;
 
 #define SPY_EXCLUDE(msg) \
@@ -578,17 +580,56 @@
  */
 const char *SPY_GetMsgName( UINT32 msg )
 {
-    static char buffer[20];
+    static char msg_buffer[20];
 
     if (msg <= SPY_MAX_MSGNUM)
     {
         if (!MessageTypeNames[msg]) return "???";
         return MessageTypeNames[msg];
     }
-    sprintf( buffer, "WM_USER+%04x", msg - WM_USER );
-    return buffer;
+    sprintf( msg_buffer, "WM_USER+%04x", msg - WM_USER );
+    return msg_buffer;
 }
 
+/***********************************************************************
+ *           SPY_GetWndName
+ */
+const char *SPY_GetWndName( HWND32 hwnd )
+{
+    static char wnd_buffer[16];
+
+    WND* pWnd = WIN_FindWndPtr( hwnd );
+    if( pWnd )
+    {
+	INT32 n = sizeof(wnd_buffer) - 6;
+	LPSTR p = wnd_buffer;
+	LPSTR src;
+	
+        char  postfix;
+	
+	if( pWnd->text && pWnd->text[0] != '\0' )
+	{
+	    src = pWnd->text;
+	    *(p++) = postfix = '\"';
+	    while ((n-- > 1) && *src) *p++ = *src++;
+	}
+	else /* get class name */
+	{
+	    INT32 len;
+
+	    *(p++)='{';
+	    GlobalGetAtomName32A( pWnd->class->atomName, p, n + 1);
+	    src = p += (len = lstrlen32A(p));
+	    if( len >= n ) src = wnd_buffer;	/* something nonzero */
+	    postfix = '}';
+	}
+	if( *src ) for( n = 0; n < 3; n++ ) *(p++)='.';
+	*(p++) = postfix;
+	*(p++) = '\0';
+    }
+    else lstrcpy32A( wnd_buffer, "\"NULL\"" );
+    return wnd_buffer;
+}
 
 /***********************************************************************
  *           SPY_EnterMessage
@@ -596,20 +637,24 @@
 void SPY_EnterMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg,
                        WPARAM32 wParam, LPARAM lParam )
 {
+    LPCSTR pname;
+
     if (!debugging_message || SPY_EXCLUDE(msg)) return;
 
     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
     switch(iFlag)
     {
     case SPY_DISPATCHMESSAGE16:
-        dprintf_message(stddeb,"%*s(%04x) message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
-                        SPY_IndentLevel, "", hWnd, msg, SPY_GetMsgName( msg ),
+	pname = SPY_GetWndName(hWnd);
+        dprintf_message(stddeb,"%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
+                        SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
                         wParam, lParam);
         break;
 
     case SPY_DISPATCHMESSAGE32:
-        dprintf_message(stddeb,"%*s(%08x) message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
-                        SPY_IndentLevel, "", hWnd, msg, SPY_GetMsgName( msg ),
+	pname = SPY_GetWndName(hWnd);
+        dprintf_message(stddeb,"%*s(%08x) %-16s message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
+                        SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
                         wParam, lParam);
         break;
 
@@ -618,32 +663,36 @@
         {
             char taskName[30];
             HTASK16 hTask = GetWindowTask16(hWnd);
+
             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
             else if (!hTask) strcpy( taskName, "Wine" );
             else sprintf( taskName, "task %04x %s",
-                          hTask, MODULE_GetModuleName( GetExePtr(hTask) ) );
+                          hTask, MODULE_GetModuleName(hTask) );
+	    pname = SPY_GetWndName(hWnd);
 
             if (iFlag == SPY_SENDMESSAGE16)
-                dprintf_message(stddeb,"%*s(%04x) message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
-                                SPY_IndentLevel, "", hWnd, msg,
-                                SPY_GetMsgName( msg ), taskName, wParam,
-                                lParam );
+                dprintf_message(stddeb,
+				"%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
+                                SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
+				taskName, wParam, lParam );
             else
-                dprintf_message(stddeb,"%*s(%08x) message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
-                                SPY_IndentLevel, "", hWnd, msg,
-                                SPY_GetMsgName( msg ), taskName, wParam,
-                                lParam );
+                dprintf_message(stddeb,
+				"%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
+                                SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
+				taskName, wParam, lParam );
         }
         break;   
 
     case SPY_DEFWNDPROC16:
-        dprintf_message(stddeb, "%*s(%04x) DefWindowProc: %s [%04x]  wp=%04x lp=%08lx\n",
+	if( SPY_ExcludeDWP ) return;
+        dprintf_message(stddeb, "%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04x lp=%08lx\n",
                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
                         msg, wParam, lParam );
         break;
 
     case SPY_DEFWNDPROC32:
-        dprintf_message(stddeb, "%*s(%08x) DefWindowProc: %s [%04x]  wp=%08x lp=%08lx\n",
+	if( SPY_ExcludeDWP ) return;
+        dprintf_message(stddeb, "%*s(%08x)  DefWindowProc32: %s [%04x]  wp=%08x lp=%08lx\n",
                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
                         msg, wParam, lParam );
         break;
@@ -657,29 +706,51 @@
  */
 void SPY_ExitMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg, LRESULT lReturn )
 {
-    if (!debugging_message || SPY_EXCLUDE(msg)) return;
+    LPCSTR pname;
+
+    if (!debugging_message || SPY_EXCLUDE(msg) ||
+	(SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND32)) )
+	return;
+
     if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
 
     switch(iFlag)
     {
+    case SPY_RESULT_DEFWND16:
+	dprintf_message(stddeb,"%*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",
+			SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
+	break;
+
+    case SPY_RESULT_DEFWND32:
+	dprintf_message(stddeb,"%*s(%08x)  DefWindowProc32: %s [%04x] returned %08lx\n",
+			SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
+	break;
+
     case SPY_RESULT_OK16:
-        dprintf_message(stddeb,"%*s(%04x) message [%04x] %s returned %08lx\n",
-                        SPY_IndentLevel, "", hWnd, msg,
+	pname = SPY_GetWndName(hWnd);
+        dprintf_message(stddeb,"%*s(%04x) %-16s message [%04x] %s returned %08lx\n",
+                        SPY_IndentLevel, "", hWnd, pname, msg,
                         SPY_GetMsgName( msg ), lReturn );
         break;
+
     case SPY_RESULT_OK32:
-        dprintf_message(stddeb,"%*s(%08x) message [%04x] %s returned %08lx\n",
-                        SPY_IndentLevel, "", hWnd, msg,
+	pname = SPY_GetWndName(hWnd);
+        dprintf_message(stddeb,"%*s(%08x) %-16s message [%04x] %s returned %08lx\n",
+                        SPY_IndentLevel, "", hWnd, pname, msg,
                         SPY_GetMsgName( msg ), lReturn );
         break; 
+
     case SPY_RESULT_INVALIDHWND16:
-        dprintf_message(stddeb,"%*s(%04x) message [%04x] %s HAS INVALID HWND\n",
-                        SPY_IndentLevel, "", hWnd, msg,
+	pname = SPY_GetWndName(hWnd);
+        dprintf_message(stddeb,"%*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
+                        SPY_IndentLevel, "", hWnd, pname, msg,
                         SPY_GetMsgName( msg ) );
         break;
+
     case SPY_RESULT_INVALIDHWND32:
-        dprintf_message(stddeb,"%*s(%08x) message [%04x] %s HAS INVALID HWND\n",
-                        SPY_IndentLevel, "", hWnd, msg,
+	pname = SPY_GetWndName(hWnd);
+        dprintf_message(stddeb,"%*s(%08x) %-16s message [%04x] %s HAS INVALID HWND\n",
+                        SPY_IndentLevel, "", hWnd, pname, msg,
                         SPY_GetMsgName( msg ) );
         break;
    }
@@ -712,5 +783,8 @@
             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
     }
+
+    SPY_ExcludeDWP = PROFILE_GetWineIniInt( "Spy", "ExcludeDWP", 0 );
+
     return 1;
 }
diff --git a/misc/ver.c b/misc/ver.c
index 89426ca..dc6836c 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -1,7 +1,8 @@
 /* 
  * Implementation of VER.DLL
  * 
- * Copyright 1996 Marcus Meissner
+ * Copyright 1996,1997 Marcus Meissner
+ * Copyright 1997 David Cuthbert
  */
 #include <stdlib.h>
 #include <stdio.h>
@@ -166,8 +167,9 @@
 
 
 int
-read_ne_header(HFILE32 lzfd,LPIMAGE_OS2_HEADER nehd) {
+read_xx_header(HFILE32 lzfd) {
 	IMAGE_DOS_HEADER	mzh;
+	char			magic[2];
 
 	LZSeek32(lzfd,0,SEEK_SET);
 	if (sizeof(mzh)!=LZRead32(lzfd,&mzh,sizeof(mzh)))
@@ -175,22 +177,24 @@
 	if (mzh.e_magic!=IMAGE_DOS_SIGNATURE)
 		return 0;
 	LZSeek32(lzfd,mzh.e_lfanew,SEEK_SET);
-	LZREAD(nehd);
-	if (nehd->ne_magic == IMAGE_OS2_SIGNATURE) {
-		LZSeek32(lzfd,mzh.e_lfanew,SEEK_SET);
-		return 1;
-	}
-	fprintf(stderr,"misc/ver.c:read_ne_header:can't handle PE files yet.\n");
-	/* must handle PE files too. Later. */
+	if (2!=LZRead32(lzfd,magic,2))
+		return 0;
+	LZSeek32(lzfd,mzh.e_lfanew,SEEK_SET);
+	if (magic[0] == 'N' && magic[1] == 'E')
+		return IMAGE_OS2_SIGNATURE;
+	if (magic[0] == 'P' && magic[1] == 'E')
+		return IMAGE_NT_SIGNATURE;
+	fprintf(stderr,"misc/ver.c:read_ne_header:can't handle %*s files.\n",2,magic);
 	return 0;
 }
 
 
 int
 find_ne_resource(
-	HFILE32 lzfd,LPIMAGE_OS2_HEADER nehd,SEGPTR typeid,SEGPTR resid,
+	HFILE32 lzfd,SEGPTR typeid,SEGPTR resid,
 	BYTE **resdata,int *reslen,DWORD *off
 ) {
+	IMAGE_OS2_HEADER nehd;
 	NE_TYPEINFO	ti;
 	NE_NAMEINFO	ni;
 	int		i;
@@ -198,7 +202,12 @@
 	DWORD		nehdoffset;
 
 	nehdoffset = LZTELL(lzfd);
-	LZSeek32(lzfd,nehd->resource_tab_offset,SEEK_CUR);
+	LZREAD(&nehd);
+	if (nehd.resource_tab_offset==nehd.rname_tab_offset) {
+		dprintf_ver(stddeb,"no resources in NE dll\n");
+		return 0;
+	}
+	LZSeek32(lzfd,nehd.resource_tab_offset+nehdoffset,SEEK_SET);
 	LZREAD(&shiftcount);
 	dprintf_ver(stddeb,"shiftcount is %d\n",shiftcount);
 	dprintf_ver(stddeb,"reading resource typeinfo dir.\n");
@@ -212,6 +221,7 @@
 		if (!ti.type_id)
 			return 0;
 		dprintf_ver(stddeb,"    ti.typeid =%04x,count=%d\n",ti.type_id,ti.count);
+
 		skipflag=0;
 		if (!HIWORD(typeid)) {
 			if ((ti.type_id&0x8000)&&(typeid!=ti.type_id))
@@ -227,7 +237,7 @@
 				whereleft = LZTELL(lzfd);
 				LZSeek32(
 					lzfd,
-					nehdoffset+nehd->resource_tab_offset+ti.type_id,
+					nehdoffset+nehd.resource_tab_offset+ti.type_id,
 					SEEK_SET
 				);
 				LZREAD(&len);
@@ -268,7 +278,7 @@
 					whereleft = LZTELL(lzfd);
 					  LZSeek32(
 						lzfd,
-						nehdoffset+nehd->resource_tab_offset+ni.id,
+						nehdoffset+nehd.resource_tab_offset+ni.id,
 						SEEK_SET
 					);
 					LZREAD(&len);
@@ -302,31 +312,135 @@
 	}
 }
 
+extern LPIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(
+	LPIMAGE_RESOURCE_DIRECTORY resdirptr,LPCWSTR name,DWORD root
+);
+
+/* Loads the specified PE resource.
+ * FIXME: shouldn't load the whole image
+ */
+int
+find_pe_resource(
+	HFILE32 lzfd,LPWSTR typeid,LPWSTR resid,
+	BYTE **resdata,int *reslen,DWORD *off
+) {
+	IMAGE_NT_HEADERS pehd;
+	int		i;
+	UINT32		nrofsections;
+	DWORD		imagesize,pehdoffset;
+	BYTE		*image;
+	IMAGE_DATA_DIRECTORY		resdir;
+	LPIMAGE_RESOURCE_DIRECTORY	resourcedir,xresdir;
+	LPIMAGE_RESOURCE_DATA_ENTRY	xresdata;
+	LPIMAGE_SECTION_HEADER		sections;
+
+	pehdoffset = LZTELL(lzfd);
+	LZREAD(&pehd);
+	resdir = pehd.OptionalHeader.DataDirectory[IMAGE_FILE_RESOURCE_DIRECTORY];
+	dprintf_ver(stddeb,"find_pe_resource(.,%p,%p,....)\n",typeid,resid);
+	if (!resdir.Size) {
+		fprintf(stderr,"misc/ver.c:find_pe_resource() no resource directory found in PE file.\n");
+		return 0;
+	}
+	imagesize = pehd.OptionalHeader.SizeOfImage;
+	image = HeapAlloc(GetProcessHeap(),0,imagesize);
+	nrofsections = pehd.FileHeader.NumberOfSections;
+
+	sections = (LPIMAGE_SECTION_HEADER)HeapAlloc(GetProcessHeap(),0,pehd.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER));
+	LZSeek32(lzfd,
+		pehdoffset+
+		sizeof(DWORD)+	/* Signature */
+		sizeof(IMAGE_FILE_HEADER)+	
+		pehd.FileHeader.SizeOfOptionalHeader,
+		SEEK_SET
+	);
+	if (	nrofsections*sizeof(IMAGE_SECTION_HEADER)!=
+		LZRead32(lzfd,sections,nrofsections*sizeof(IMAGE_SECTION_HEADER))
+	) {
+		HeapFree(GetProcessHeap(),0,image);
+		return 0;
+	}
+	for (i=0;i<nrofsections;i++) {
+		if (sections[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
+			continue;
+		LZSeek32(lzfd,sections[i].PointerToRawData,SEEK_SET);
+		if (	sections[i].SizeOfRawData!=
+			LZRead32(lzfd,image+sections[i].VirtualAddress,sections[i].SizeOfRawData)
+		)
+			continue;
+	}
+	resourcedir = (LPIMAGE_RESOURCE_DIRECTORY)(image+resdir.VirtualAddress);
+	xresdir = GetResDirEntryW(resourcedir,typeid,(DWORD)resourcedir);
+	if (!xresdir) {
+		dprintf_ver(stddeb,"...no typeid entry found for %p\n",typeid);
+		HeapFree(GetProcessHeap(),0,image);
+		return 0;
+	}
+	xresdir = GetResDirEntryW(xresdir,resid,(DWORD)resourcedir);
+	if (!xresdir) {
+		dprintf_ver(stddeb,"...no resid entry found for %p\n",resid);
+		HeapFree(GetProcessHeap(),0,image);
+		return 0;
+	}
+	
+	xresdir = GetResDirEntryW(xresdir,0,(DWORD)resourcedir);
+	if (!xresdir) {
+		dprintf_ver(stddeb,"...no 0 (default language) entry found for %p\n",resid);
+		HeapFree(GetProcessHeap(),0,image);
+		return 0;
+	}
+	xresdata = (LPIMAGE_RESOURCE_DATA_ENTRY)xresdir;
+	*reslen	= xresdata->Size;
+	*resdata= (LPBYTE)xmalloc(*reslen);
+	memcpy(*resdata,image+xresdata->OffsetToData,*reslen);
+	/* find physical address for virtual offset */
+	for (i=0;i<nrofsections;i++) {
+		if (sections[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
+			continue;
+		if (	(xresdata->OffsetToData >= sections[i].VirtualAddress)&&
+			(xresdata->OffsetToData < sections[i].VirtualAddress+sections[i].SizeOfRawData)
+		) {
+			*off = (DWORD)(xresdata->OffsetToData)-(DWORD)(sections[i].VirtualAddress)+(DWORD)(sections[i].PointerToRawData);
+			break;
+		}
+	}
+	HeapFree(GetProcessHeap(),0,image);
+	HeapFree(GetProcessHeap(),0,sections);
+	return 1;
+}
+
 /* GetFileResourceSize				[VER.2] */
 DWORD WINAPI GetFileResourceSize(LPCSTR filename,SEGPTR restype,SEGPTR resid,
                                  LPDWORD off)
 {
 	HFILE32			lzfd;
 	OFSTRUCT		ofs;
-	BYTE			*resdata;
-	int			reslen;
-	IMAGE_OS2_HEADER	nehd;
+	BYTE			*resdata = NULL;
+	int			reslen,res;
 
 	dprintf_ver(stddeb,"GetFileResourceSize(%s,%lx,%lx,%p)\n",
 		filename,(LONG)restype,(LONG)resid,off
 	);
 	lzfd=LZOpenFile32A(filename,&ofs,OF_READ);
-	if (lzfd==0)
+	if (!lzfd)
 		return 0;
-	if (!read_ne_header(lzfd,&nehd)) {
-		LZClose32(lzfd);
-		return 0;
+	switch (read_xx_header(lzfd)) {
+	case 0:
+	    res=0;
+	    break;
+	case IMAGE_OS2_SIGNATURE:
+	    res=find_ne_resource(lzfd,restype,resid,&resdata,&reslen,off);
+	    break;
+	case IMAGE_NT_SIGNATURE:
+	    res=find_pe_resource(lzfd,(LPWSTR)restype,(LPWSTR)resid,&resdata,&reslen,off);
+	    break;
 	}
-	if (!find_ne_resource(lzfd,&nehd,restype,resid,&resdata,&reslen,off)) {
-		LZClose32(lzfd);
-		return 0;
+	if (!res) {
+	    LZClose32(lzfd);
+	    return 0;
 	}
-	free(resdata);
+	if (resdata)
+		free(resdata);
 	LZClose32(lzfd);
 	return reslen;
 }
@@ -337,9 +451,9 @@
 {
 	HFILE32			lzfd;
 	OFSTRUCT		ofs;
-	BYTE			*resdata;
-	int			reslen=datalen;
-	IMAGE_OS2_HEADER	nehd;
+	BYTE			*resdata=NULL;
+	int			res,reslen=datalen;
+
 	dprintf_ver(stddeb,"GetFileResource(%s,%lx,%lx,%ld,%ld,%p)\n",
 		filename,(LONG)restype,(LONG)resid,off,datalen,data
 	);
@@ -348,20 +462,26 @@
 	if (lzfd==0)
 		return 0;
 	if (!off) {
-		if (!read_ne_header(lzfd,&nehd)) {
-			LZClose32(lzfd);
-			return 0;
+		switch (read_xx_header(lzfd)) {
+		case 0:	res=0;
+			break;
+		case IMAGE_OS2_SIGNATURE:
+			res= find_ne_resource(lzfd,restype,resid,&resdata,&reslen,&off);
+			break;
+		case IMAGE_NT_SIGNATURE:
+			res= find_pe_resource(lzfd,restype,resid,&resdata,&reslen,&off);
+			break;
 		}
-		if (!find_ne_resource(lzfd,&nehd,restype,resid,&resdata,&reslen,&off)) {
-			LZClose32(lzfd);
+		LZClose32(lzfd);
+		if (!res)
 			return 0;
-		}
+		if (reslen>datalen) reslen = datalen;
+		memcpy(data,resdata,reslen);
 		free(resdata);
+		return reslen;
 	}
 	LZSeek32(lzfd,off,SEEK_SET);
-	if (reslen>datalen)
-		reslen=datalen;
-	LZRead32(lzfd,data,reslen);
+	reslen = LZRead32(lzfd,data,datalen);
 	LZClose32(lzfd);
 	return reslen;
 }
@@ -369,8 +489,8 @@
 /* GetFileVersionInfoSize			[VER.6] */
 DWORD WINAPI GetFileVersionInfoSize16(LPCSTR filename,LPDWORD handle)
 {
-	DWORD	len,ret;
-	BYTE	buf[72];
+	DWORD	len,ret,isuni=0;
+	BYTE	buf[144];
 	VS_FIXEDFILEINFO *vffi;
 
 	dprintf_ver(stddeb,"GetFileVersionInfoSize16(%s,%p)\n",filename,handle);
@@ -384,15 +504,41 @@
 		return 0;
 
 	vffi=(VS_FIXEDFILEINFO*)(buf+0x14);
-	if (vffi->dwSignature != VS_FFI_SIGNATURE)
-		return 0;
+	if (vffi->dwSignature != VS_FFI_SIGNATURE) {
+		/* unicode resource */
+		if (vffi->dwSignature == 0x004f0049) {
+			isuni = 1;
+			vffi = (VS_FIXEDFILEINFO*)(buf+0x28);
+		} else {
+			fprintf(stderr,"vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n",
+				vffi->dwSignature,VS_FFI_SIGNATURE
+			);
+			return 0;
+		}
+	}
 	if (*(WORD*)buf < len)
 		len = *(WORD*)buf;
-	dprintf_ver(stddeb,"->strucver=%ld.%ld,filever=%ld.%ld,productver=%ld.%ld,flagmask=%lx,flags=%lx,OS=",
+	dprintf_ver(stddeb,"	structversion=0x%lx.0x%lx,\n    fileversion=0x%lx.0x%lx,\n    productversion=0x%lx.0x%lx,\n    flagmask=0x%lx,\n    flags=",
 		(vffi->dwStrucVersion>>16),vffi->dwStrucVersion&0xFFFF,
 		vffi->dwFileVersionMS,vffi->dwFileVersionLS,
 		vffi->dwProductVersionMS,vffi->dwProductVersionLS,
-		vffi->dwFileFlagsMask,vffi->dwFileFlags
+		vffi->dwFileFlagsMask
+	);
+	if (vffi->dwFileFlags & VS_FF_DEBUG) 
+		dprintf_ver(stddeb,"DEBUG,");
+	if (vffi->dwFileFlags & VS_FF_PRERELEASE)
+		dprintf_ver(stddeb,"PRERELEASE,");
+	if (vffi->dwFileFlags & VS_FF_PATCHED)
+		dprintf_ver(stddeb,"PATCHED,");
+	if (vffi->dwFileFlags & VS_FF_PRIVATEBUILD)
+		dprintf_ver(stddeb,"PRIVATEBUILD,");
+	if (vffi->dwFileFlags & VS_FF_INFOINFERRED)
+		dprintf_ver(stddeb,"INFOINFERRED,");
+	if (vffi->dwFileFlags & VS_FF_SPECIALBUILD)
+		dprintf_ver(stddeb,"SPECIALBUILD,");
+	dprintf_ver(stddeb,"\n    OS=0x%lx.0x%lx (",
+		(vffi->dwFileOS&0xFFFF0000)>>16,
+		vffi->dwFileOS&0x0000FFFF
 	);
 	switch (vffi->dwFileOS&0xFFFF0000) {
 	case VOS_DOS:dprintf_ver(stddeb,"DOS,");break;
@@ -401,7 +547,7 @@
 	case VOS_NT:dprintf_ver(stddeb,"NT,");break;
 	case VOS_UNKNOWN:
 	default:
-		dprintf_ver(stddeb,"UNKNOWN(%ld),",vffi->dwFileOS&0xFFFF0000);break;
+		dprintf_ver(stddeb,"UNKNOWN(0x%lx),",vffi->dwFileOS&0xFFFF0000);break;
 	}
 	switch (vffi->dwFileOS & 0xFFFF) {
 	case VOS__BASE:dprintf_ver(stddeb,"BASE");break;
@@ -409,21 +555,22 @@
 	case VOS__WINDOWS32:dprintf_ver(stddeb,"WIN32");break;
 	case VOS__PM16:dprintf_ver(stddeb,"PM16");break;
 	case VOS__PM32:dprintf_ver(stddeb,"PM32");break;
-	default:dprintf_ver(stddeb,"UNKNOWN(%ld)",vffi->dwFileOS&0xFFFF);break;
+	default:dprintf_ver(stddeb,"UNKNOWN(0x%lx)",vffi->dwFileOS&0xFFFF);break;
 	}
+	dprintf_ver(stddeb,")\n    ");
 	switch (vffi->dwFileType) {
 	default:
 	case VFT_UNKNOWN:
-		dprintf_ver(stddeb,"filetype=Unknown(%ld)",vffi->dwFileType);
+		dprintf_ver(stddeb,"filetype=Unknown(0x%lx)",vffi->dwFileType);
 		break;
-	case VFT_APP:dprintf_ver(stddeb,"filetype=APP");break;
-	case VFT_DLL:dprintf_ver(stddeb,"filetype=DLL");break;
+	case VFT_APP:dprintf_ver(stddeb,"filetype=APP,");break;
+	case VFT_DLL:dprintf_ver(stddeb,"filetype=DLL,");break;
 	case VFT_DRV:
 		dprintf_ver(stddeb,"filetype=DRV,");
 		switch(vffi->dwFileSubtype) {
 		default:
 		case VFT2_UNKNOWN:
-			dprintf_ver(stddeb,"UNKNOWN(%ld)",vffi->dwFileSubtype);
+			dprintf_ver(stddeb,"UNKNOWN(0x%lx)",vffi->dwFileSubtype);
 			break;
 		case VFT2_DRV_PRINTER:
 			dprintf_ver(stddeb,"PRINTER");
@@ -464,7 +611,7 @@
 		dprintf_ver(stddeb,"filetype=FONT.");
 		switch (vffi->dwFileSubtype) {
 		default:
-			dprintf_ver(stddeb,"UNKNOWN(%ld)",vffi->dwFileSubtype);
+			dprintf_ver(stddeb,"UNKNOWN(0x%lx)",vffi->dwFileSubtype);
 			break;
 		case VFT2_FONT_RASTER:dprintf_ver(stddeb,"RASTER");break;
 		case VFT2_FONT_VECTOR:dprintf_ver(stddeb,"VECTOR");break;
@@ -474,7 +621,7 @@
 	case VFT_VXD:dprintf_ver(stddeb,"filetype=VXD");break;
 	case VFT_STATIC_LIB:dprintf_ver(stddeb,"filetype=STATIC_LIB");break;
 	}
-	dprintf_ver(stddeb,"filedata=%lx.%lx\n",vffi->dwFileDateMS,vffi->dwFileDateLS);
+	dprintf_ver(stddeb,"\n    filedata=0x%lx.0x%lx\n",vffi->dwFileDateMS,vffi->dwFileDateLS);
 	return len;
 }
 
@@ -749,7 +896,7 @@
 
 /* VerInstallFileA				[VERSION.7] */
 static LPBYTE
-_fetch_versioninfo(LPSTR fn) {
+_fetch_versioninfo(LPSTR fn,VS_FIXEDFILEINFO **vffi) {
     DWORD	alloclen;
     LPBYTE	buf;
     DWORD	ret;
@@ -766,8 +913,14 @@
 	    free(buf);
 	    alloclen = *(WORD*)buf;
 	    buf = xmalloc(alloclen);
-	} else
+	} else {
+	    *vffi = (VS_FIXEDFILEINFO*)(buf+0x14);
+	    if ((*vffi)->dwSignature == 0x004f0049) /* hack to detect unicode */
+	    	*vffi = (VS_FIXEDFILEINFO*)(buf+0x28);
+	    if ((*vffi)->dwSignature != VS_FFI_SIGNATURE)
+	    	fprintf(stderr,"_fetch_versioninfo:bad VS_FIXEDFILEINFO signature 0x%08lx\n",(*vffi)->dwSignature);
 	    return buf;
+	}
     }
 }
 
@@ -868,16 +1021,14 @@
     }
     xret = 0;
     if (!(flags & VIFF_FORCEINSTALL)) {
-    	buf1 = _fetch_versioninfo(destfn);
+	VS_FIXEDFILEINFO *destvffi,*tmpvffi;
+    	buf1 = _fetch_versioninfo(destfn,&destvffi);
 	if (buf1) {
-	    buf2 = _fetch_versioninfo(tmpfn);
+	    buf2 = _fetch_versioninfo(tmpfn,&tmpvffi);
 	    if (buf2) {
 	    	char	*tbuf1,*tbuf2;
-		VS_FIXEDFILEINFO *destvffi,*tmpvffi;
 		UINT32	len1,len2;
 
-		destvffi= (VS_FIXEDFILEINFO*)(buf1+0x14);
-		tmpvffi = (VS_FIXEDFILEINFO*)(buf2+0x14);
 		len1=len2=40;
 
 		/* compare file versions */
@@ -974,7 +1125,7 @@
 
 
 /* FIXME: UNICODE? */
-struct db {
+struct dbA {
 	WORD	nextoff;
 	WORD	datalen;
 /* in memory structure... */
@@ -985,11 +1136,25 @@
  */
 };
 
+/* FIXME: UNICODE? */
+struct dbW {
+	WORD	nextoff;
+	WORD	datalen;
+	WORD	btext;		/* type of data */
+/* in memory structure... */
+	WCHAR	name[1]; 	/* padded to dword alignment */
+/* .... 
+	WCHAR	data[datalen];     padded to dword alignment
+	BYTE	subdirdata[];      until nextoff
+ */
+};
+
+/* this one used for Win16 resources, which are always in ASCII format */
 static BYTE*
-_find_data(BYTE *block,LPCSTR str, WORD buff_remain) {
+_find_dataA(BYTE *block,LPCSTR str, WORD buff_remain) {
 	char	*nextslash;
 	int	substrlen, inc_size;
-	struct	db	*db;
+	struct	dbA	*db;
 
 	while (*str && *str=='\\')
 		str++;
@@ -1006,7 +1171,7 @@
 
 
 	while (1) {
-		db=(struct db*)block;
+		db=(struct dbA*)block;
 		dprintf_ver(stddeb,"db=%p,db->nextoff=%d,db->datalen=%d,db->name=%s,db->data=%s\n",
 			db,db->nextoff,db->datalen,db->name,(char*)((char*)db+4+((strlen(db->name)+4)&~3))
 		);
@@ -1018,7 +1183,7 @@
 			if (nextslash) {
 				inc_size = 4+((strlen(db->name)+4)&~3)+((db->datalen+3)&~3);
 
-				return _find_data( block+inc_size ,nextslash,
+				return _find_dataA( block+inc_size ,nextslash,
 							buff_remain - inc_size);
 			}
 			else
@@ -1030,13 +1195,54 @@
 	}
 }
 
+/* this one used for Win32 resources, which are always in UNICODE format */
+extern LPWSTR CRTDLL_wcschr(LPWSTR str,WCHAR xchar);
+static BYTE*
+_find_dataW(BYTE *block,LPCWSTR str, WORD buff_remain) {
+	LPWSTR	nextslash;
+	int	substrlen, inc_size;
+	struct	dbW	*db;
+
+	while (*str && *str=='\\')
+		str++;
+	if (NULL!=(nextslash=CRTDLL_wcschr(str,'\\')))
+		substrlen=nextslash-str;
+	else
+		substrlen=lstrlen32W(str);
+	if (nextslash!=NULL) {
+		while (*nextslash && *nextslash=='\\')
+			nextslash++;
+		if (!*nextslash)
+			nextslash=NULL;
+	}
+
+
+	while (1) {
+		db=(struct dbW*)block;
+		if ((!db->nextoff) || (!buff_remain)) /* no more entries ? */
+			return NULL;
+
+		if (!lstrncmp32W(db->name,str,substrlen)) {
+			if (nextslash) {
+				inc_size = 8+((lstrlen32W(db->name)*sizeof(WCHAR)+4)&~3)+((db->datalen+3)&~3);
+
+				return _find_dataW( block+inc_size ,nextslash,
+							buff_remain - inc_size);
+			} else
+				return block;
+		}
+		inc_size=((db->nextoff+3)&~3);
+		block=block+inc_size;
+		buff_remain=buff_remain-inc_size;
+	}
+}
+
 /* VerQueryValue 			[VER.11] */
 /* take care, 'buffer' is NOT a SEGPTR, it just points to one */
 DWORD WINAPI VerQueryValue16(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer,
                              UINT16 *buflen)
 {
 	BYTE	*block=PTR_SEG_TO_LIN(segblock),*b;
-	struct	db	*db;
 	char	*s;
 
 	dprintf_ver(stddeb,"VerQueryValue16(%p,%s,%p,%d)\n",
@@ -1044,16 +1250,36 @@
 	);
 	s=(char*)xmalloc(strlen("VS_VERSION_INFO\\")+strlen(subblock)+1);
 	strcpy(s,"VS_VERSION_INFO\\");strcat(s,subblock);
-	b=_find_data(block, s, *(WORD *)block);
-	if (b==NULL) {
-		*buflen=0;
-		return 0;
+
+	/* check for UNICODE version */
+	if (	(*(DWORD*)(block+0x14) != VS_FFI_SIGNATURE) && 
+		(*(DWORD*)(block+0x28) == VS_FFI_SIGNATURE)
+	) {
+		struct	dbW	*db;
+		LPWSTR	wstr;
+		wstr = HEAP_strdupAtoW(GetProcessHeap(),0,s);
+		b=_find_dataW(block, wstr, *(WORD *)block);
+		HeapFree(GetProcessHeap(),0,wstr);
+		if (!b) {
+			fprintf(stderr,"key %s not found in versionresource.\n",subblock);
+			*buflen=0;
+			return 0;
+		}
+		db=(struct dbW*)b;
+		b	= b+8+((lstrlen32W(db->name)*sizeof(WCHAR)+4)&~3);
+		*buflen	= db->datalen;
+	} else {
+		struct	dbA	*db;
+		b=_find_dataA(block, s, *(WORD *)block);
+		if (!b) {
+			fprintf(stderr,"key %s not found in versionresource.\n",subblock);
+			*buflen=0;
+			return 0;
+		}
+		db=(struct dbA*)b;
+		b	= b+4+((lstrlen32A(db->name)+4)&~3);
+		*buflen	= db->datalen;
 	}
-	db=(struct db*)b;
-	*buflen	= db->datalen;
-	/* let b point to data area */
-	b	= b+4+((strlen(db->name)+4)&~3);
-	/* now look up what the resp. SEGPTR would be ... */
 	*buffer	= (b-block)+segblock;
 	dprintf_ver(stddeb,"	-> %s=%s\n",subblock,b);
 	return 1;
@@ -1063,23 +1289,42 @@
                               LPVOID *vbuffer,UINT32 *buflen)
 {
 	BYTE	*b,*block=(LPBYTE)vblock,**buffer=(LPBYTE*)vbuffer;
-	struct	db	*db;
-	char	*s;
+	LPSTR	s;
 
 	dprintf_ver(stddeb,"VerQueryValue32A(%p,%s,%p,%d)\n",
 		block,subblock,buffer,*buflen
 	);
 	s=(char*)xmalloc(strlen("VS_VERSION_INFO\\")+strlen(subblock)+1);
 	strcpy(s,"VS_VERSION_INFO\\");strcat(s,subblock);
-	b=_find_data(block, s, *(WORD *)block);
-	if (b==NULL) {
-		*buflen=0;
-		return 0;
+	/* check for UNICODE version */
+	if (	(*(DWORD*)(block+0x14) != VS_FFI_SIGNATURE) && 
+		(*(DWORD*)(block+0x28) == VS_FFI_SIGNATURE)
+	) {
+		LPWSTR	wstr;
+		struct	dbW	*db;
+		wstr = HEAP_strdupAtoW(GetProcessHeap(),0,s);
+		b=_find_dataW(block, wstr, *(WORD *)block);
+		HeapFree(GetProcessHeap(),0,wstr);
+		if (!b) {
+			fprintf(stderr,"key %s not found in versionresource.\n",subblock);
+			*buflen=0;
+			return 0;
+		}
+		db=(struct dbW*)b;
+		*buflen	= db->datalen;
+		b	= b+8+((lstrlen32W(db->name)*sizeof(WCHAR)+4)&~3);
+	} else {
+		struct	dbA	*db;
+		b=_find_dataA(block, s, *(WORD *)block);
+		if (!b) {
+			fprintf(stderr,"key %s not found in versionresource.\n",subblock);
+			*buflen=0;
+			return 0;
+		}
+		db=(struct dbA*)b;
+		*buflen	= db->datalen;
+		b	= b+4+((lstrlen32A(db->name)+4)&~3);
 	}
-	db=(struct db*)b;
-	*buflen	= db->datalen;
-	/* let b point to data area */
-	b	= b+4+((strlen(db->name)+4)&~3);
 	*buffer	= b;
 	dprintf_ver(stddeb,"	-> %s=%s\n",subblock,b);
 	return 1;
@@ -1088,30 +1333,11 @@
 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?
-	 * And what about UNICODE version info?
-	 * And the NAMES of the values?
-	 */
-	BYTE		*b,**buffer=(LPBYTE*)vbuffer,*block=(LPBYTE)vblock;
-	struct	db	*db;
-	char		*s,*sb;
+	LPSTR		sb;
+	DWORD		ret;
 
 	sb = HEAP_strdupWtoA( GetProcessHeap(), 0, subblock );
-	s=(char*)xmalloc(strlen("VS_VERSION_INFO\\")+strlen(sb)+1);
-	strcpy(s,"VS_VERSION_INFO\\");strcat(s,sb);
-	b=_find_data(block, s, *(WORD *)block);
-	if (b==NULL) {
-		*buflen=0;
-		HeapFree( GetProcessHeap(), 0, sb );
-		return 0;
-	}
-	db=(struct db*)b;
-	*buflen	= db->datalen;
-	/* let b point to data area */
-	b	= b+4+((strlen(db->name)+4)&~3);
-	*buffer	= b;
-	dprintf_ver(stddeb,"	-> %s=%s\n",sb,b);
+	ret = VerQueryValue32A(vblock,sb,vbuffer,buflen);
         HeapFree( GetProcessHeap(), 0, sb );
 	return 1;
 }
diff --git a/misc/winsock.c b/misc/winsock.c
index 3246b41..bec016c 100644
--- a/misc/winsock.c
+++ b/misc/winsock.c
@@ -342,7 +342,11 @@
 
 INT32 WINSOCK_DeleteTaskWSI( TDB* pTask, LPWSINFO pwsi )
 {
-    /* WSACleanup() backend, called on task termination as well. */
+    /* WSACleanup() backend, called on task termination as well.
+     * Real DLL would have registered its own signal handler with
+     * TaskSetSignalHandler() and waited until USIG_TERMINATION/USIG_GPF
+     * but this scheme is much more straightforward.
+     */
 
     int	i, j, n;
 
diff --git a/misc/wsprintf.c b/misc/wsprintf.c
index f347fd5..9f11e07 100644
--- a/misc/wsprintf.c
+++ b/misc/wsprintf.c
@@ -331,7 +331,7 @@
  *           wvsnprintf32A   (Not a Windows API)
  */
 INT32 WINAPI wvsnprintf32A( LPSTR buffer, UINT32 maxlen, LPCSTR spec,
-                            LPCVOID args )
+                            va_list args )
 {
     WPRINTF_FORMAT format;
     LPSTR p = buffer;
@@ -351,21 +351,24 @@
         switch(format.type)
         {
         case WPR_WCHAR:
-            if ((*p = (CHAR)*(WCHAR *)args)) p++;
+            if ((*p = (CHAR)va_arg( args, WCHAR ))) p++;
             else if (format.width > 1) *p++ = ' ';
             else len = 0;
             break;
         case WPR_CHAR:
-            if ((*p = *(CHAR *)args)) p++;
+            if ((*p = va_arg( args, CHAR ))) p++;
             else if (format.width > 1) *p++ = ' ';
             else len = 0;
             break;
         case WPR_STRING:
-            if (len) memcpy( p, *(LPCSTR *)args, len );
+            if (len) memcpy( p, va_arg( args, LPCSTR ), len );
             p += len;
             break;
         case WPR_WSTRING:
-            for (i = 0; i < len; i++) *p++ = (CHAR)*(*(LPCWSTR *)args + i);
+            {
+                LPCWSTR ptr = va_arg( args, LPCWSTR );
+                for (i = 0; i < len; i++) *p++ = (CHAR)*ptr++;
+            }
             break;
         case WPR_HEXA:
             if ((format.flags & WPRINTF_PREFIX_HEX) && (maxlen > 3))
@@ -383,12 +386,12 @@
             for (i = len; i < format.precision; i++, maxlen--) *p++ = '0';
             if (len) memcpy( p, number, len );
             p += len;
+            (void)va_arg( args, INT32 ); /* Go to the next arg */
             break;
         }
         if (format.flags & WPRINTF_LEFTALIGN)
             for (i = format.precision; i < format.width; i++, maxlen--)
                 *p++ = ' ';
-        args = (INT32 *)args + 1;
         maxlen -= len;
     }
     *p = 0;
@@ -400,7 +403,7 @@
  *           wvsnprintf32W   (Not a Windows API)
  */
 INT32 WINAPI wvsnprintf32W( LPWSTR buffer, UINT32 maxlen, LPCWSTR spec,
-                            LPCVOID args )
+                            va_list args )
 {
     WPRINTF_FORMAT format;
     LPWSTR p = buffer;
@@ -420,20 +423,23 @@
         switch(format.type)
         {
         case WPR_WCHAR:
-            if ((*p = *(WCHAR *)args)) p++;
+            if ((*p = va_arg( args, WCHAR ))) p++;
             else if (format.width > 1) *p++ = ' ';
             else len = 0;
             break;
         case WPR_CHAR:
-            if ((*p = (WCHAR)*(CHAR *)args)) p++;
+            if ((*p = (WCHAR)va_arg( args, CHAR ))) p++;
             else if (format.width > 1) *p++ = ' ';
             else len = 0;
             break;
         case WPR_STRING:
-            for (i = 0; i < len; i++) *p++ = (WCHAR)*(*(LPCSTR *)args + i);
+            {
+                LPCSTR ptr = va_arg( args, LPCSTR );
+                for (i = 0; i < len; i++) *p++ = (WCHAR)*ptr++;
+            }
             break;
         case WPR_WSTRING:
-            if (len) memcpy( p, *(LPCWSTR *)args, len * sizeof(WCHAR) );
+            if (len) memcpy( p, va_arg( args, LPCWSTR ), len * sizeof(WCHAR) );
             p += len;
             break;
         case WPR_HEXA:
@@ -451,12 +457,12 @@
         case WPR_UNSIGNED:
             for (i = len; i < format.precision; i++, maxlen--) *p++ = '0';
             for (i = 0; i < len; i++) *p++ = (WCHAR)number[i];
+            (void)va_arg( args, INT32 ); /* Go to the next arg */
             break;
         }
         if (format.flags & WPRINTF_LEFTALIGN)
             for (i = format.precision; i < format.width; i++, maxlen--)
                 *p++ = ' ';
-        args = (INT32 *)args + 1;
         maxlen -= len;
     }
     *p = 0;
@@ -476,7 +482,7 @@
 /***********************************************************************
  *           wvsprintf32A   (USER32.586)
  */
-INT32 WINAPI wvsprintf32A( LPSTR buffer, LPCSTR spec, LPCVOID args )
+INT32 WINAPI wvsprintf32A( LPSTR buffer, LPCSTR spec, va_list args )
 {
     return wvsnprintf32A( buffer, 0xffffffff, spec, args );
 }
@@ -485,7 +491,7 @@
 /***********************************************************************
  *           wvsprintf32W   (USER32.587)
  */
-INT32 WINAPI wvsprintf32W( LPWSTR buffer, LPCWSTR spec, LPCVOID args )
+INT32 WINAPI wvsprintf32W( LPWSTR buffer, LPCWSTR spec, va_list args )
 {
     return wvsnprintf32W( buffer, 0xffffffff, spec, args );
 }
@@ -502,7 +508,7 @@
 
     va_start( valist, spec );
     /* Note: we call the 32-bit version, because the args are 32-bit */
-    res = (INT16)wvsprintf32A( buffer, spec, (LPCVOID)valist );
+    res = (INT16)wvsprintf32A( buffer, spec, valist );
     va_end( valist );
     return res;
 }
@@ -519,44 +525,75 @@
 
 
 /***********************************************************************
- *           wsprintf32A   (USER32.584)
+ *           wsprintf32A   (USER32.585)
  */
-/* Winelib version */
 INT32 WINAPIV wsprintf32A( LPSTR buffer, LPCSTR spec, ... )
 {
     va_list valist;
     INT32 res;
 
     va_start( valist, spec );
-    res = wvsprintf32A( buffer, spec, (LPCVOID)valist );
+    res = wvsprintf32A( buffer, spec, valist );
     va_end( valist );
     return res;
 }
 
-/* Emulator version */
-INT32 WINAPIV WIN32_wsprintf32A( DWORD *args )
-{
-    return wvsprintf32A( (LPSTR)args[0], (LPCSTR)args[1], (LPCVOID)&args[2] );
-}
-
 
 /***********************************************************************
- *           wsprintf32W   (USER32.585)
+ *           wsprintf32W   (USER32.586)
  */
-/* Winelib version */
 INT32 WINAPIV wsprintf32W( LPWSTR buffer, LPCWSTR spec, ... )
 {
     va_list valist;
     INT32 res;
 
     va_start( valist, spec );
-    res = wvsprintf32W( buffer, spec, (LPCVOID)valist );
+    res = wvsprintf32W( buffer, spec, valist );
     va_end( valist );
     return res;
 }
 
-/* Emulator version */
-INT32 WINAPIV WIN32_wsprintf32W( DWORD *args )
+
+/***********************************************************************
+ *           wsnprintf16   (Not a Windows API)
+ */
+INT16 WINAPIV wsnprintf16( LPSTR buffer, UINT16 maxlen, LPCSTR spec, ... )
 {
-    return wvsprintf32W( (LPWSTR)args[0], (LPCWSTR)args[1], (LPCVOID)&args[2]);
+    va_list valist;
+    INT16 res;
+
+    va_start( valist, spec );
+    res = wvsnprintf16( buffer, maxlen, spec, valist );
+    va_end( valist );
+    return res;
+}
+
+
+/***********************************************************************
+ *           wsnprintf32A   (Not a Windows API)
+ */
+INT32 WINAPIV wsnprintf32A( LPSTR buffer, UINT32 maxlen, LPCSTR spec, ... )
+{
+    va_list valist;
+    INT32 res;
+
+    va_start( valist, spec );
+    res = wvsnprintf32A( buffer, maxlen, spec, valist );
+    va_end( valist );
+    return res;
+}
+
+
+/***********************************************************************
+ *           wsnprintf32W   (Not a Windows API)
+ */
+INT32 WINAPIV wsnprintf32W( LPWSTR buffer, UINT32 maxlen, LPCWSTR spec, ... )
+{
+    va_list valist;
+    INT32 res;
+
+    va_start( valist, spec );
+    res = wvsnprintf32W( buffer, maxlen, spec, valist );
+    va_end( valist );
+    return res;
 }
diff --git a/miscemu/instr.c b/miscemu/instr.c
index 9e414c4..c101d21 100644
--- a/miscemu/instr.c
+++ b/miscemu/instr.c
@@ -187,7 +187,9 @@
     }
     if (segprefix != -1) seg = segprefix;
 
-    /* FIXME: should check limit of the segment here */
+    /* Make sure the segment and offset are valid */
+    if (((seg & 7) != 7) || IS_SELECTOR_FREE(seg)) return NULL;
+    if (GET_SEL_LIMIT(seg) < (base + (index << ss))) return NULL;
     return (BYTE *)PTR_SEG_OFF_TO_LIN( seg, (base + (index << ss)) );
 #undef GET_VAL
 }
diff --git a/msdos/int21.c b/msdos/int21.c
index d01e61f..8bcb950 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -102,15 +102,6 @@
 }
 
 
-static void ChopOffWhiteSpace(char *string)
-{
-	int length;
-
-	for (length = strlen(string) ; length ; length--)
-		if (string[length] == ' ')
-			string[length] = '\0';
-}
-
 void CreateBPB(int drive, BYTE *data)
 {
 	if (drive > 1) {
@@ -760,87 +751,11 @@
 static void DeleteFileFCB( CONTEXT *context )
 {
     fprintf( stderr, "DeleteFileFCB: not implemented yet\n" );
-#if 0
-	BYTE *fcb = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
-	struct dosdirent *dp;
-	char temp[256], *ptr;
-        int drive = DOS_GET_DRIVE( *fcb );
-
-	DumpFCB( fcb );
-
-        temp[0] = '\\';
-	strcpy(temp+1, DRIVE_GetDosCwd(drive));
-	strcat(temp, "\\");
-	strncat(temp, fcb + 1, 8);
-	ChopOffWhiteSpace(temp);
-	strncat(temp, fcb + 9, 3);
-	ChopOffWhiteSpace(temp);
-
-	if ((dp = DOS_opendir(temp)) == NULL) {
-		Error(InvalidDrive, EC_MediaError , EL_Disk);
-		AX_reg(context) = 0xff;
-		return;
-	}
-
-        temp[0] = '\\';
-	strcpy(temp+1, DRIVE_GetDosCwd(drive) );
-	strcat(temp, "\\");
-	
-	ptr = temp + strlen(temp);
-	
-	while (DOS_readdir(dp) != NULL)
-	{
-		strcpy(ptr, dp->filename);
-		dprintf_int(stddeb, "int21: delete file %s\n", temp);
-		/* unlink(DOS_GetUnixFileName(temp)); */
-	}
-	DOS_closedir(dp);
-	AX_reg(context) = 0;
-#endif
 }
 
 static void RenameFileFCB( CONTEXT *context )
 {
     fprintf( stderr, "RenameFileFCB: not implemented yet\n" );
-#if 0
-	BYTE *fcb = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
-	struct dosdirent *dp;
-	char temp[256], oldname[256], newname[256], *oldnameptr, *newnameptr;
-        int drive = DOS_GET_DRIVE( *fcb );
-
-	DumpFCB( fcb );
-
-        temp[0] = '\\';
-	strcpy(temp+1, DRIVE_GetDosCwd(drive) );
-	strcat(temp, "\\");
-	strncat(temp, fcb + 1, 8);
-	ChopOffWhiteSpace(temp);
-	strncat(temp, fcb + 9, 3);
-	ChopOffWhiteSpace(temp);
-
-	if ((dp = DOS_opendir(temp)) == NULL) {
-		Error(InvalidDrive, EC_MediaError , EL_Disk);
-		AX_reg(context) = 0xff;
-		return;
-	}
-
-        oldname[0] = '\\';
-	strcpy(oldname+1, DRIVE_GetDosCwd(drive) );
-	strcat(oldname, "\\");
-        strcpy( newname, oldname );
-	oldnameptr = oldname + strlen(oldname);
-	newnameptr = newname + strlen(newname);
-	
-	while (DOS_readdir(dp) != NULL)
-	{
-		strcpy(oldnameptr, dp->filename);
-		strcpy(newnameptr, fcb + 1);
-		dprintf_int(stddeb, "int21: renamefile %s -> %s\n",
-			oldname, newname);
-	}
-	DOS_closedir(dp);
-	AX_reg(context) = 0;
-#endif
 }
 
 
@@ -1627,6 +1542,14 @@
 	    }
 	    break;
         case 0x41:  /* Delete file */
+	    if (!DeleteFile32A(PTR_SEG_OFF_TO_LIN(
+	    				DS_reg(context),
+					DX_reg(context))
+	    )) {
+		SET_CFLAG(context);
+		AL_reg(context) = DOS_ExtendedError;
+	    }
+	    break;
         case 0x56:  /* Move (rename) file */
         default:
             fprintf( stderr, "Unimplemented int21 long file name function:\n");
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index b13221f..06b9743 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -2304,22 +2304,23 @@
                           const MMCKINFO * lpckParent, UINT16 uFlags)
 {
 	DWORD	dwfcc, dwOldPos;
-	LPMMIOINFO	lpmminfo;
+
 	dprintf_mmio(stddeb, "mmioDescend(%04X, %p, %p, %04X);\n", 
 				hmmio, lpck, lpckParent, uFlags);
-	if (lpck == NULL) return 0;
-	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
-	if (lpmminfo == NULL) return 0;
+
+	if (lpck == NULL)
+	    return 0;
+
 	dwfcc = lpck->ckid;
 	dprintf_mmio(stddeb, "mmioDescend // dwfcc=%08lX\n", dwfcc);
-	dprintf_mmio(stddeb, "mmioDescend // hfile = %ld\n", lpmminfo->dwReserved2);
-	dwOldPos = _llseek32((HFILE32)lpmminfo->dwReserved2, 0, SEEK_CUR);
+
+	dwOldPos = mmioSeek(hmmio, 0, SEEK_CUR);
 	dprintf_mmio(stddeb, "mmioDescend // dwOldPos=%ld\n", dwOldPos);
+
 	if (lpckParent != NULL) {
 		dprintf_mmio(stddeb, "mmioDescend // seek inside parent at %ld !\n", lpckParent->dwDataOffset);
-		dwOldPos = _llseek32((HFILE32)lpmminfo->dwReserved2,
-					lpckParent->dwDataOffset, SEEK_SET);
-		}
+		dwOldPos = mmioSeek(hmmio, lpckParent->dwDataOffset, SEEK_SET);
+	}
 /*
 
    It seems to be that FINDRIFF should not be treated the same as the 
@@ -2331,44 +2332,43 @@
 	if ((uFlags & MMIO_FINDCHUNK) || (uFlags & MMIO_FINDLIST)) {
 		dprintf_mmio(stddeb, "mmioDescend // MMIO_FINDxxxx dwfcc=%08lX !\n", dwfcc);
 		while (TRUE) {
-		        size_t ix;
+		        LONG ix;
 
-			ix =_lread32((HFILE32)lpmminfo->dwReserved2, (LPSTR)lpck, sizeof(MMCKINFO));
-			dprintf_mmio(stddeb, "mmioDescend // after _lread32 ix = %d req = %d, errno = %d\n",ix,sizeof(MMCKINFO),errno);
+			ix = mmioRead(hmmio, (LPSTR)lpck, sizeof(MMCKINFO));
+			dprintf_mmio(stddeb, "mmioDescend // after _lread32 ix = %ld req = %d, errno = %d\n",ix,sizeof(MMCKINFO),errno);
 			if (ix < sizeof(MMCKINFO)) {
 
-				_llseek32((HFILE32)lpmminfo->dwReserved2, dwOldPos, SEEK_SET);
-				GlobalUnlock16(hmmio);
+				mmioSeek(hmmio, dwOldPos, SEEK_SET);
 				dprintf_mmio(stddeb, "mmioDescend // return ChunkNotFound\n");
 				return MMIOERR_CHUNKNOTFOUND;
-				}
+			}
 			dprintf_mmio(stddeb, "mmioDescend // dwfcc=%08lX ckid=%08lX cksize=%08lX !\n", 
 									dwfcc, lpck->ckid, lpck->cksize);
-			if (dwfcc == lpck->ckid) break;
+			if (dwfcc == lpck->ckid)
+				break;
+
 			dwOldPos += lpck->cksize + 2 * sizeof(DWORD);
 			if (lpck->ckid == FOURCC_RIFF || lpck->ckid == FOURCC_LIST) 
 				dwOldPos += sizeof(DWORD);
-			_llseek32((HFILE32)lpmminfo->dwReserved2, dwOldPos, SEEK_SET);
-			}
+			mmioSeek(hmmio, dwOldPos, SEEK_SET);
 		}
+	}
 	else {
-		if (_lread32(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck, 
-				sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
-                    _llseek32((HFILE32)lpmminfo->dwReserved2, dwOldPos, SEEK_SET);
-			GlobalUnlock16(hmmio);
- 		        dprintf_mmio(stddeb, "mmioDescend // return ChunkNotFound 2nd\n");
+		if (mmioRead(hmmio, (LPSTR)lpck, sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
+			mmioSeek(hmmio, dwOldPos, SEEK_SET);
+			dprintf_mmio(stddeb, "mmioDescend // return ChunkNotFound 2nd\n");
 			return MMIOERR_CHUNKNOTFOUND;
-			}
 		}
+	}
 	lpck->dwDataOffset = dwOldPos + 2 * sizeof(DWORD);
 	if (lpck->ckid == FOURCC_RIFF || lpck->ckid == FOURCC_LIST) 
 		lpck->dwDataOffset += sizeof(DWORD);
-	lpmminfo->lDiskOffset = _llseek32((HFILE32)lpmminfo->dwReserved2, 
-                                          lpck->dwDataOffset, SEEK_SET);
-	GlobalUnlock16(hmmio);
+	mmioSeek(hmmio, lpck->dwDataOffset, SEEK_SET);
+
 	dprintf_mmio(stddeb, "mmioDescend // lpck->ckid=%08lX lpck->cksize=%ld !\n", 
 								lpck->ckid, lpck->cksize);
 	dprintf_mmio(stddeb, "mmioDescend // lpck->fccType=%08lX !\n", lpck->fccType);
+
 	return 0;
 }
 
diff --git a/multimedia/time.c b/multimedia/time.c
index 6242f85..cf4905a 100644
--- a/multimedia/time.c
+++ b/multimedia/time.c
@@ -32,7 +32,6 @@
     WORD wTimerID;
     WORD wCurTime;
     struct tagTIMERENTRY *Next;
-    struct tagTIMERENTRY *Prev;
 } TIMERENTRY, *LPTIMERENTRY;
 
 static LPTIMERENTRY lpTimerList = NULL;
@@ -137,23 +136,16 @@
 		  wDelay, wResol, lpFunc, dwUser, wFlags);
     if (!mmTimeStarted)
 	StartMMTime();
-    lpNewTimer = (LPTIMERENTRY) malloc(sizeof(TIMERENTRY));
+    lpNewTimer = (LPTIMERENTRY)xmalloc(sizeof(TIMERENTRY));
     if (lpNewTimer == NULL)
 	return 0;
     while (lpTimer != NULL) {
 	wNewID = MAX(wNewID, lpTimer->wTimerID);
-	if (lpTimer->Next == NULL)
-	    break;
 	lpTimer = lpTimer->Next;
     }
-    if (lpTimerList == NULL) {
-	lpTimerList = lpNewTimer;
-	lpNewTimer->Prev = NULL;
-    } else {
-	lpTimer->Next = lpNewTimer;
-	lpNewTimer->Prev = lpTimer;
-    }
-    lpNewTimer->Next = NULL;
+
+    lpNewTimer->Next = lpTimerList;
+    lpTimerList = lpNewTimer;
     lpNewTimer->wTimerID = wNewID + 1;
     lpNewTimer->wCurTime = wDelay;
     lpNewTimer->wDelay = wDelay;
@@ -173,19 +165,15 @@
  */
 WORD WINAPI timeKillEvent(WORD wID)
 {
-    LPTIMERENTRY lpTimer = lpTimerList;
-    while (lpTimer != NULL) {
-	if (wID == lpTimer->wTimerID) {
-	    if (lpTimer->Prev != NULL)
-		lpTimer->Prev->Next = lpTimer->Next;
-	    if (lpTimer->Next != NULL)
-		lpTimer->Next->Prev = lpTimer->Prev;
-	    free(lpTimer);
-	    if (lpTimer==lpTimerList)
-	    	lpTimerList=NULL;
+    LPTIMERENTRY xlptimer,*lpTimer = &lpTimerList;
+    while (*lpTimer) {
+	if (wID == (*lpTimer)->wTimerID) {
+	    xlptimer = (*lpTimer)->Next;
+	    free(*lpTimer);
+	    *lpTimer = xlptimer;
 	    return TRUE;
 	}
-	lpTimer = lpTimer->Next;
+	lpTimer = &((*lpTimer)->Next);
     }
     return 0;
 }
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 6fe7a98..18df983 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -49,6 +49,80 @@
                       descr->image, 0, 0, 0, 0, descr->width, descr->height );
 }
 
+/***********************************************************************
+ *           BITMAP_GetBitsPadding
+ *
+ * Return number of bytes to pad a scanline of 16-bit aligned Windows DDB data.
+ */
+INT32 BITMAP_GetBitsPadding( int bmWidth, int bpp )
+{
+    INT32 pad;
+
+    switch (bpp) 
+    {
+    case 1:
+	if (!(bmWidth & 15)) pad = 0;
+	else pad = ((16 - (bmWidth & 15)) + 7) / 8;
+	break;
+
+    case 8:
+	pad = (2 - (bmWidth & 1)) & 1;
+	break;
+
+    case 24:
+	pad = (bmWidth*3) & 1;
+	break;
+
+    case 32:
+    case 16:
+    case 15:
+	pad = 0; /* we have 16bit alignment already */
+	break;
+
+    case 4:
+	if (!(bmWidth & 3)) pad = 0;
+	else pad = ((4 - (bmWidth & 3)) + 1) / 2;
+	break;
+
+    default:
+	fprintf(stderr,"GetBitsPadding: unknown depth %d, please report.\n", bpp );
+        return -1;
+    }
+    return pad;
+}
+
+/***********************************************************************
+ *           BITMAP_GetBitsWidth
+ *
+ * Return number of bytes taken by a scanline of 16-bit aligned Windows DDB data.
+ */
+INT32 BITMAP_GetBitsWidth( int bmWidth, int bpp )
+{
+    switch(bpp)
+    {
+    case 1:
+	return 2 * ((bmWidth+15) >> 4);
+
+    case 24:
+	bmWidth *= 3; /* fall through */
+    case 8:
+	return bmWidth + (bmWidth & 1);
+
+    case 32:
+	return bmWidth * 4;
+
+    case 16:
+    case 15:
+	return bmWidth * 2;
+
+    case 4:
+	return 2 * ((bmWidth+3) >> 2);
+
+    default:
+	fprintf(stderr,"GetBitsPadding: unknown depth %d, please report.\n", bpp );
+    }
+    return -1;
+}
 
 /***********************************************************************
  *           CreateBitmap16    (GDI.48)
@@ -200,46 +274,19 @@
       /* Only get entire lines */
     height = count / bmp->bitmap.bmWidthBytes;
     if (height > bmp->bitmap.bmHeight) height = bmp->bitmap.bmHeight;
+
     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) 
+
+    pad = BITMAP_GetBitsPadding( bmp->bitmap.bmWidth, bmp->bitmap.bmBitsPixel );
+
+    if (!height || (pad == -1))
     {
       GDI_HEAP_UNLOCK( hbitmap );
       return 0;
     }
 
-    switch (bmp->bitmap.bmBitsPixel) {
-    case 1:
-	if (!(bmp->bitmap.bmWidth & 15))
-		pad = 0;
-	else
-		pad = ((16 - (bmp->bitmap.bmWidth & 15)) + 7) / 8;
-    	break;
-    case 4:
-	if (!(bmp->bitmap.bmWidth & 3))
-	    pad = 0;
-	else
-	    pad = ((4 - (bmp->bitmap.bmWidth & 3)) + 1) / 2;
-	break;
-    case 8:
-    	pad = (2 - (bmp->bitmap.bmWidth & 1)) & 1;
-    	break;
-    case 15:
-    case 16:
-    	pad = 0; /* we have 16bit alignment already */
-	break;
-    case 24:
-    	pad = (bmp->bitmap.bmWidth*3) & 1;
-    	break;
-    default:
-	fprintf(stderr,"GetBitMapBits32: unknown depth %d, please report.\n",
-		bmp->bitmap.bmBitsPixel
-	);
-	GDI_HEAP_UNLOCK( hbitmap );
-	return 0;
-    }
-
     /* Hack: change the bitmap height temporarily to avoid */
     /*       getting unnecessary bitmap rows. */
     old_height = bmp->bitmap.bmHeight;
@@ -354,41 +401,15 @@
       /* Only set entire lines */
     height = count / bmp->bitmap.bmWidthBytes;
     if (height > bmp->bitmap.bmHeight) height = bmp->bitmap.bmHeight;
-    if (!height) 
+
+    pad = BITMAP_GetBitsPadding( bmp->bitmap.bmWidth, bmp->bitmap.bmBitsPixel );
+
+    if (!height || (pad == -1)) 
     {
       GDI_HEAP_UNLOCK( hbitmap );
       return 0;
     }
 	
-    switch (bmp->bitmap.bmBitsPixel) {
-    case 1:
-	if (!(bmp->bitmap.bmWidth & 15))
-		pad = 0;
-	else
-		pad = ((16 - (bmp->bitmap.bmWidth & 15)) + 7) / 8;
-    	break;
-    case 4:
-	if (!(bmp->bitmap.bmWidth & 3))
-	    pad = 0;
-	else
-	    pad = ((4 - (bmp->bitmap.bmWidth & 3)) + 1) / 2;
-	break;
-    case 8:
-    	pad = (2 - (bmp->bitmap.bmWidth & 1)) & 1;
-    	break;
-    case 15:
-    case 16:
-    	pad = 0; /* we have 16bit alignment already */
-	break;
-    case 24:
-    	pad = (bmp->bitmap.bmWidth*3) & 1;
-    	break;
-    default:
-	fprintf(stderr,"SetBitMapBits32: unknown depth %d, please report.\n",
-		bmp->bitmap.bmBitsPixel
-	);
-	return 0;
-    }
     sbuf = (LPBYTE)buffer;
 
     widthbytes	= DIB_GetXImageWidthBytes(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
@@ -497,6 +518,29 @@
 	return 0;
 }
 
+HANDLE32 WINAPI LoadImage32W( HINSTANCE32 hinst, LPCWSTR name, UINT32 type,
+                              INT32 desiredx, INT32 desiredy, UINT32 loadflags)
+{
+	if (HIWORD(name)) {
+		dprintf_resource(stddeb,"LoadImage32W(0x%04x,%p,%d,%d,%d,0x%08x)\n",
+			hinst,name,type,desiredx,desiredy,loadflags
+		);
+	} else {
+		dprintf_resource(stddeb,"LoadImage32W(0x%04x,%p,%d,%d,%d,0x%08x)\n",
+			hinst,name,type,desiredx,desiredy,loadflags
+		);
+	}
+	switch (type) {
+	case IMAGE_BITMAP:
+		return LoadBitmap32W(hinst,name);
+	case IMAGE_ICON:
+		return LoadIcon32W(hinst,name);
+	case IMAGE_CURSOR:
+		return LoadCursor32W(hinst,name);
+	}
+	return 0;
+}
+
 /**********************************************************************
  *	    CopyImage32    (USER32.60)
  *
diff --git a/objects/brush.c b/objects/brush.c
index 5f216f2..b3fdb31 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -7,6 +7,7 @@
 #include <stdlib.h>
 #include "brush.h"
 #include "bitmap.h"
+#include "syscolor.h"
 #include "metafile.h"
 #include "color.h"
 #include "stddebug.h"
@@ -241,18 +242,80 @@
  */
 HBRUSH16 WINAPI GetSysColorBrush16( INT16 index )
 {
-    fprintf( stderr, "Unimplemented stub: GetSysColorBrush16(%d)\n", index );
-    return GetStockObject32(LTGRAY_BRUSH);
+    return (HBRUSH16)GetSysColorBrush32(index);
 }
 
 
 /***********************************************************************
  *           GetSysColorBrush32    (USER32.289)
  */
-HBRUSH32 WINAPI GetSysColorBrush32( INT32 index)
+HBRUSH32 WINAPI GetSysColorBrush32( INT32 index )
 {
-    fprintf( stderr, "Unimplemented stub: GetSysColorBrush32(%d)\n", index );
-    return GetStockObject32(LTGRAY_BRUSH);
+  switch(index){
+  case COLOR_SCROLLBAR:
+    return sysColorObjects.hbrushScrollbar;
+  case COLOR_BACKGROUND: /* same as COLOR_DESKTOP */
+    return sysColorObjects.hbrushScrollbar; /*FIXME*/
+  case COLOR_ACTIVECAPTION:
+    return sysColorObjects.hbrushActiveCaption;
+  case COLOR_INACTIVECAPTION:
+    return sysColorObjects.hbrushInactiveCaption;
+  case COLOR_MENU:
+    return sysColorObjects.hbrushMenu;
+  case COLOR_WINDOW:
+    return sysColorObjects.hbrushWindow;
+  case COLOR_WINDOWFRAME:
+    fprintf( stderr, "GetSysColorBrush32: Unimplemented index(%d)\n", index );
+    break;
+  case COLOR_MENUTEXT:
+    fprintf( stderr, "GetSysColorBrush32: Unimplemented index(%d)\n", index );
+    break;
+  case COLOR_WINDOWTEXT:
+    fprintf( stderr, "GetSysColorBrush32: Unimplemented index(%d)\n", index );
+    break;
+  case COLOR_CAPTIONTEXT:
+    fprintf( stderr, "GetSysColorBrush32: Unimplemented index(%d)\n", index );
+    break;
+  case COLOR_ACTIVEBORDER:
+    return sysColorObjects.hbrushActiveBorder;
+  case COLOR_INACTIVEBORDER:
+    return sysColorObjects.hbrushInactiveBorder;
+  case COLOR_APPWORKSPACE:
+    return sysColorObjects.hbrushActiveBorder; /*FIXME*/
+  case COLOR_HIGHLIGHT:
+    return sysColorObjects.hbrushHighlight;
+  case COLOR_HIGHLIGHTTEXT:
+    return sysColorObjects.hbrushHighlight; /*FIXME*/
+  case COLOR_BTNFACE: /* same as COLOR_3DFACE */
+    return sysColorObjects.hbrushBtnFace;
+  case COLOR_BTNSHADOW: /* same as COLOR_3DSHADOW */
+    return sysColorObjects.hbrushBtnShadow;
+  case COLOR_GRAYTEXT:
+    return sysColorObjects.hbrushBtnShadow; /*FIXME*/
+  case COLOR_BTNTEXT:
+    return sysColorObjects.hbrushBtnShadow; /*FIXME*/
+  case COLOR_INACTIVECAPTIONTEXT:
+    return sysColorObjects.hbrushBtnShadow; /*FIXME*/
+  case COLOR_BTNHIGHLIGHT: /* same as COLOR_(3DHIGH|3DHI|BTNHI)LIGHT */
+    return sysColorObjects.hbrushBtnHighlight;
+    /*  case COLOR_3DDKSHADOW: FIXME
+    fprintf( stderr, "GetSysColorBrush32: Unimplemented index(%d)\n", index );
+    break;
+  case COLOR_3DLIGHT:
+    fprintf( stderr, "GetSysColorBrush32: Unimplemented index(%d)\n", index );
+    break;
+  case COLOR_INFOTEXT:
+    fprintf( stderr, "GetSysColorBrush32: Unimplemented index(%d)\n", index );
+    break;
+  case COLOR_INFOBK:
+    fprintf( stderr, "GetSysColorBrush32: Unimplemented index(%d)\n", index );
+    break;*/
+  default:
+    fprintf( stderr, "GetSysColorBrush32: Unknown index(%d)\n", index );
+  }
+
+  return GetStockObject32(LTGRAY_BRUSH);
+
 }
 
 
@@ -299,5 +362,3 @@
     memcpy( buffer, &brush->logbrush, count );
     return count;
 }
-
-
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 317f163..fb02109 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -2,6 +2,8 @@
  * Cursor and icon support
  *
  * Copyright 1995 Alexandre Julliard
+ *           1996 Martin Von Loewis
+ *           1997 Alex Korobka
  */
 
 /*
@@ -26,18 +28,22 @@
 
 #include <string.h>
 #include <stdlib.h>
+#include "heap.h"
 #include "windows.h"
+#include "peexe.h"
 #include "color.h"
 #include "bitmap.h"
 #include "callback.h"
 #include "cursoricon.h"
 #include "sysmetrics.h"
+#include "module.h"
 #include "win.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "task.h"
 
 extern UINT16 COLOR_GetSystemPaletteSize();
+extern HGLOBAL16 USER_CallDefaultRsrcHandler( HGLOBAL16, HMODULE16, HRSRC16 );
 
 Cursor CURSORICON_XCursor = None;    /* Current X cursor */
 static HCURSOR32 hActiveCursor = 0;  /* Active cursor */
@@ -196,15 +202,14 @@
 
 
 /**********************************************************************
- *	    CURSORICON_LoadDirEntry
+ *	    CURSORICON_LoadDirEntry16
  *
  * Load the icon/cursor directory for a given resource name and find the
  * best matching entry.
  */
-static BOOL32 CURSORICON_LoadDirEntry( HINSTANCE32 hInstance, SEGPTR name,
-                                       INT32 width, INT32 height,
-                                       INT32 colors, BOOL32 fCursor,
-                                       CURSORICONDIRENTRY *dirEntry )
+static BOOL32 CURSORICON_LoadDirEntry16( HINSTANCE32 hInstance, SEGPTR name,
+                                         INT32 width, INT32 height, INT32 colors, 
+					 BOOL32 fCursor, CURSORICONDIRENTRY *dirEntry )
 {
     HRSRC16 hRsrc;
     HGLOBAL16 hMem;
@@ -231,30 +236,76 @@
 
 
 /**********************************************************************
- *	    CURSORICON_LoadHandler 
+ *          CURSORICON_LoadDirEntry32
  *
- * Create a cursor or icon from a resource.
+ * Load the icon/cursor directory for a given resource name and find the
+ * best matching entry.
  */
-HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16 handle, HINSTANCE16 hInstance,
-                                  BOOL32 fCursor )
+static BOOL32 CURSORICON_LoadDirEntry32( HINSTANCE32 hInstance, LPCWSTR name,
+                                         INT32 width, INT32 height, INT32 colors,
+                                         BOOL32 fCursor, CURSORICONDIRENTRY *dirEntry )
 {
-    static char* __loadhandlerStr = "CURSORICON_LoadHandler";
+    HANDLE32 hRsrc;
+    HANDLE32 hMem;
+    CURSORICONDIR *dir;
+    CURSORICONDIRENTRY *entry = NULL;
 
+    if (!(hRsrc = FindResource32W( hInstance, name,
+                (LPCWSTR)(fCursor ? RT_GROUP_CURSOR : RT_GROUP_ICON) )))
+        return FALSE;
+    if (!(hMem = LoadResource32( hInstance, hRsrc ))) return FALSE;
+    if ((dir = (CURSORICONDIR*)LockResource32( hMem )))
+    {
+        if (fCursor)
+            entry = (CURSORICONDIRENTRY *)CURSORICON_FindBestCursor( dir,
+                                                               width, height );
+        else
+            entry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon( dir,
+                                                       width, height, colors );
+        if (entry) *dirEntry = *entry;
+    }
+    FreeResource32( hMem );
+    return (entry != NULL);
+}
+
+
+/**********************************************************************
+ *	    CURSORICON_CreateFromResource
+ *
+ * Create a cursor or icon from in-memory resource template. 
+ *
+ * FIXME: Adjust icon size when width and height are nonzero (stretchblt).
+ *        Convert to mono when cFlag is LR_MONOCHROME. Do something
+ *        with cbSize parameter as well.
+ */
+static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE32 hInstance, HGLOBAL16 hObj, LPBYTE bits,
+	 					UINT32 cbSize, BOOL32 bIcon, DWORD dwVersion, 
+						INT32 width, INT32 height, UINT32 cFlag )
+{
     int sizeAnd, sizeXor;
     HBITMAP32 hAndBits = 0, hXorBits = 0; /* error condition for later */
     BITMAPOBJ *bmpXor, *bmpAnd;
     POINT16 hotspot = { 0 ,0 };
-    CURSORICONINFO *info;
     BITMAPINFO *bmi;
     HDC32 hdc;
 
-    if (fCursor)  /* If cursor, get the hotspot */
+    dprintf_cursor(stddeb,"CreateFromResource: %08x (%u bytes), ver %08x, %ix%i %s %s\n",
+                        (unsigned)bits, cbSize, (unsigned)dwVersion, width, height,
+                                  bIcon ? "icon" : "cursor", cFlag ? "mono" : "" );
+    if (dwVersion == 0x00020000)
     {
-        POINT16 *pt = (POINT16 *)LockResource16( handle );
+	fprintf(stdnimp,"\t2.xx resources are not supported\n");
+	return 0;
+    }
+
+    if (bIcon)
+	bmi = (BITMAPINFO *)bits;
+    else /* get the hotspot */
+    {
+        POINT16 *pt = (POINT16 *)bits;
         hotspot = *pt;
         bmi = (BITMAPINFO *)(pt + 1);
     }
-    else bmi = (BITMAPINFO *)LockResource16( handle );
 
     /* Check bitmap header */
 
@@ -262,7 +313,7 @@
 	 (bmi->bmiHeader.biSize != sizeof(BITMAPINFOHEADER)  ||
 	  bmi->bmiHeader.biCompression != BI_RGB) )
     {
-          fprintf(stderr,"%s: invalid bitmap header.\n", __loadhandlerStr);
+          fprintf(stderr,"\tinvalid resource bitmap header.\n");
           return 0;
     }
 
@@ -329,7 +380,7 @@
 
     if( !hXorBits || !hAndBits ) 
     {
-	fprintf(stderr,"%s: unable to create a bitmap.\n", __loadhandlerStr );
+	fprintf(stderr,"\tunable to create an icon bitmap.\n");
 	return 0;
     }
 
@@ -340,46 +391,77 @@
     sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
     sizeAnd = bmpAnd->bitmap.bmHeight * bmpAnd->bitmap.bmWidthBytes;
 
-    if (!(handle = GlobalAlloc16( GMEM_MOVEABLE,
-                                  sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
+    if (hObj) hObj = GlobalReAlloc16( hObj, 
+		     sizeof(CURSORICONINFO) + sizeXor + sizeAnd, GMEM_MOVEABLE );
+    if (!hObj) hObj = GlobalAlloc16( GMEM_MOVEABLE, 
+		     sizeof(CURSORICONINFO) + sizeXor + sizeAnd );
+    if (hObj)
     {
-        DeleteObject32( hXorBits );
-        DeleteObject32( hAndBits );
-        return 0;
+	CURSORICONINFO *info;
+
+	/* Make it owned by the module */
+	if (hInstance) FarSetOwner( hObj, MODULE_HANDLEtoHMODULE16(hInstance));
+
+	info = (CURSORICONINFO *)GlobalLock16( hObj );
+	info->ptHotSpot.x   = hotspot.x;
+	info->ptHotSpot.y   = hotspot.y;
+	info->nWidth        = bmpXor->bitmap.bmWidth;
+	info->nHeight       = bmpXor->bitmap.bmHeight;
+	info->nWidthBytes   = bmpXor->bitmap.bmWidthBytes;
+	info->bPlanes       = bmpXor->bitmap.bmPlanes;
+	info->bBitsPerPixel = bmpXor->bitmap.bmBitsPixel;
+
+	/* Transfer the bitmap bits to the CURSORICONINFO structure */
+
+	GetBitmapBits32( hAndBits, sizeAnd, (char *)(info + 1) );
+	GetBitmapBits32( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
+	GlobalUnlock16( hObj );
     }
 
-    /* Make it owned by the module */
-    if (hInstance) FarSetOwner( handle, GetExePtr(hInstance) );
-
-    info = (CURSORICONINFO *)GlobalLock16( handle );
-    info->ptHotSpot.x   = hotspot.x;
-    info->ptHotSpot.y   = hotspot.y;
-    info->nWidth        = bmpXor->bitmap.bmWidth;
-    info->nHeight       = bmpXor->bitmap.bmHeight;
-    info->nWidthBytes   = bmpXor->bitmap.bmWidthBytes;
-    info->bPlanes       = bmpXor->bitmap.bmPlanes;
-    info->bBitsPerPixel = bmpXor->bitmap.bmBitsPixel;
-
-    /* Transfer the bitmap bits to the CURSORICONINFO structure */
-
-    GetBitmapBits32( hAndBits, sizeAnd, (char *)(info + 1) );
-    GetBitmapBits32( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
     DeleteObject32( hXorBits );
     DeleteObject32( hAndBits );
-    GlobalUnlock16( handle );
-    return handle;
+    return hObj;
 }
 
+
 /**********************************************************************
- *	    CURSORICON_Load
+ *          CreateIconFromResourceEx16          (USER.450)
  *
- * Load a cursor or icon.
+ * FIXME: not sure about exact parameter types
  */
-static HGLOBAL16 CURSORICON_Load( HINSTANCE16 hInstance, SEGPTR name,
-                                  INT32 width, INT32 height, INT32 colors,
-                                  BOOL32 fCursor )
+HICON16 WINAPI CreateIconFromResourceEx16( LPBYTE bits, UINT16 cbSize, BOOL16 bIcon,
+                                    DWORD dwVersion, INT16 width, INT16 height, UINT16 cFlag )
 {
-    HGLOBAL16 handle, hRet;
+    TDB* pTask = (TDB*)GlobalLock16( GetCurrentTask() );
+    if( pTask )
+	return CURSORICON_CreateFromResource( pTask->hInstance, 0, bits, cbSize, bIcon, dwVersion,
+					      width, height, cFlag );
+    return 0;
+}
+
+
+/**********************************************************************
+ *          CreateIconFromResourceEx32          (USER32.76)
+ */
+HICON32 WINAPI CreateIconFromResourceEx32( LPBYTE bits, UINT32 cbSize,
+                                           BOOL32 bIcon, DWORD dwVersion,
+                                           INT32 width, INT32 height,
+                                           UINT32 cFlag )
+{
+    return CreateIconFromResourceEx16( bits, cbSize, bIcon, dwVersion, width, height, cFlag );
+}
+
+
+/**********************************************************************
+ *	    CURSORICON_Load16
+ *
+ * Load a cursor or icon from a 16-bit resource.
+ */
+static HGLOBAL16 CURSORICON_Load16( HINSTANCE16 hInstance, SEGPTR name,
+                                    INT32 width, INT32 height, INT32 colors,
+                                    BOOL32 fCursor )
+{
+    HGLOBAL16 handle;
     HRSRC16 hRsrc;
     CURSORICONDIRENTRY dirEntry;
 
@@ -396,19 +478,89 @@
 
     /* Find the best entry in the directory */
 
-    if (!CURSORICON_LoadDirEntry( hInstance, name, width, height,
-                                  colors, fCursor, &dirEntry )) return 0;
-
+    if ( !CURSORICON_LoadDirEntry16( hInstance, name, width, height,
+                                    colors, fCursor, &dirEntry ) )  return 0;
     /* Load the resource */
 
-    if (!(hRsrc = FindResource16( hInstance,
+    if ( (hRsrc = FindResource16( hInstance,
                                 MAKEINTRESOURCE( dirEntry.icon.wResId ),
-                                fCursor ? RT_CURSOR : RT_ICON ))) return 0;
-    if (!(handle = LoadResource16( hInstance, hRsrc ))) return 0;
+                                fCursor ? RT_CURSOR : RT_ICON )) )
+    {
+	/* 16-bit icon or cursor resources are processed
+	 * transparently by the LoadResource16() via custom
+	 * resource handlers set by SetResourceHandler().
+	 */
 
-    hRet = CURSORICON_LoadHandler( handle, hInstance, fCursor );
-    FreeResource16(handle);
-    return hRet;
+	if ( (handle = LoadResource16( hInstance, hRsrc )) )
+	    return handle;
+    }
+    return 0;
+}
+
+/**********************************************************************
+ *          CURSORICON_Load32
+ *
+ * Load a cursor or icon from a 32-bit resource.
+ */
+static HGLOBAL32 CURSORICON_Load32( HINSTANCE32 hInstance, LPCWSTR name,
+                                    int width, int height, int colors,
+                                    BOOL32 fCursor )
+{
+    HANDLE32 handle;
+    HANDLE32 hRsrc;
+    CURSORICONDIRENTRY dirEntry;
+
+    if(!hInstance)  /* OEM cursor/icon */
+    {
+	WORD resid;
+	if(HIWORD(name))
+	{
+            LPSTR ansi = HEAP_strdupWtoA(GetProcessHeap(),0,name);
+            if( ansi[0]=='#')        /*Check for '#xxx' name */
+            {
+                resid = atoi(ansi+1);
+                HeapFree( GetProcessHeap(), 0, ansi );
+            }
+            else
+            {
+                HeapFree( GetProcessHeap(), 0, ansi );
+                return 0;
+            }
+        }
+        else resid = LOWORD(name);
+        return OBM_LoadCursorIcon(resid, fCursor);
+    }
+
+    /* Find the best entry in the directory */
+ 
+    if ( !CURSORICON_LoadDirEntry32( hInstance, name, width, height,
+				    colors, fCursor, &dirEntry ) )  return 0;
+    /* Load the resource */
+
+    if ( (hRsrc = FindResource32W( hInstance,
+                      (LPWSTR) (DWORD) dirEntry.icon.wResId,
+                      (LPWSTR) (fCursor ? RT_CURSOR : RT_ICON ))) )
+    {
+	HANDLE32 h = 0;
+	if ( (handle = LoadResource32( hInstance, hRsrc )) )
+	{
+	    /* Hack to keep LoadCursor/Icon32() from spawning multiple
+	     * copies of the same object.
+	     */
+#define pRsrcEntry ((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)
+	    if( !pRsrcEntry->ResourceHandle ) 
+	    {
+		LPBYTE bits = (LPBYTE)LockResource32( handle );
+		h = CURSORICON_CreateFromResource( hInstance, 0, bits, dirEntry.icon.dwBytesInRes, 
+					!fCursor, 0x00030000, width, height, LR_DEFAULTCOLOR );
+		pRsrcEntry->ResourceHandle = h;
+	    }
+	    else h = pRsrcEntry->ResourceHandle;
+#undef  pRsrcEntry
+	}
+	return h;
+    }
+    return 0;
 }
 
 
@@ -438,80 +590,86 @@
 /***********************************************************************
  *           CURSORICON_IconToCursor
  *
- * Converts bitmap to mono and truncates if icon is too large
+ * Converts bitmap to mono and truncates if icon is too large (should
+ * probably do StretchBlt() instead).
  */
 HCURSOR16 CURSORICON_IconToCursor(HICON16 hIcon, BOOL32 bSemiTransparent)
 {
  HCURSOR16       hRet = 0;
- CURSORICONINFO *ptr = NULL;
+ CURSORICONINFO *pIcon = NULL;
  HTASK16 	 hTask = GetCurrentTask();
  TDB*  		 pTask = (TDB *)GlobalLock16(hTask);
 
  if(hIcon && pTask)
-    if (!(ptr = (CURSORICONINFO*)GlobalLock16( hIcon ))) return FALSE;
-       if (ptr->bPlanes * ptr->bBitsPerPixel == 1)
+    if (!(pIcon = (CURSORICONINFO*)GlobalLock16( hIcon ))) return FALSE;
+       if (pIcon->bPlanes * pIcon->bBitsPerPixel == 1)
            hRet = CURSORICON_Copy( pTask->hInstance, hIcon );
        else
        {
            BYTE  pAndBits[128];
            BYTE  pXorBits[128];
-	   int   x, y, ix, iy, shift; 
-	   int   bpp = (ptr->bBitsPerPixel>=24)?32:ptr->bBitsPerPixel; /* this sucks */
-           BYTE* psPtr = (BYTE *)(ptr + 1) +
-                            ptr->nHeight * BITMAP_WIDTH_BYTES(ptr->nWidth,1);
-           BYTE* pxbPtr = pXorBits;
-           unsigned *psc = NULL, val = 0;
-           unsigned val_base = 0xffffffff >> (32 - bpp);
+	   int   maxx, maxy, ix, iy, bpp = pIcon->bBitsPerPixel;
+           BYTE* psPtr, *pxbPtr = pXorBits;
+           unsigned xor_width, and_width, val_base = 0xffffffff >> (32 - bpp);
            BYTE* pbc = NULL;
 
            COLORREF       col;
            CURSORICONINFO cI;
 
+	   dprintf_icon(stddeb, "IconToCursor:[%04x] %ix%i %ibpp (bogus %ibps)\n", 
+		hIcon, pIcon->nWidth, pIcon->nHeight, pIcon->bBitsPerPixel, pIcon->nWidthBytes );
+
+	   xor_width = BITMAP_GetBitsWidth( pIcon->nWidth, bpp );
+	   and_width =  BITMAP_GetBitsWidth( pIcon->nWidth, 1 );
+	   psPtr = (BYTE *)(pIcon + 1) + pIcon->nHeight * and_width;
+
            memset(pXorBits, 0, 128);
            cI.bBitsPerPixel = 1; cI.bPlanes = 1;
            cI.ptHotSpot.x = cI.ptHotSpot.y = 15;
            cI.nWidth = 32; cI.nHeight = 32;
-           cI.nWidthBytes = 4;	/* 1bpp */
+           cI.nWidthBytes = 4;	/* 32x1bpp */
 
-           x = (ptr->nWidth > 32) ? 32 : ptr->nWidth;
-           y = (ptr->nHeight > 32) ? 32 : ptr->nHeight;
+           maxx = (pIcon->nWidth > 32) ? 32 : pIcon->nWidth;
+           maxy = (pIcon->nHeight > 32) ? 32 : pIcon->nHeight;
 
-           for( iy = 0; iy < y; iy++ )
+           for( iy = 0; iy < maxy; iy++ )
            {
-              val = BITMAP_WIDTH_BYTES( ptr->nWidth, 1 );
-              memcpy( pAndBits + iy * 4,
-                     (BYTE *)(ptr + 1) + iy * val, (val>4) ? 4 : val);
-              shift = iy % 2;
+	      unsigned shift = iy % 2; 
 
-              for( ix = 0; ix < x; ix++ )
+              memcpy( pAndBits + iy * 4, (BYTE *)(pIcon + 1) + iy * and_width, 
+					 (and_width > 4) ? 4 : and_width );
+              for( ix = 0; ix < maxx; ix++ )
               {
                 if( bSemiTransparent && ((ix+shift)%2) )
                 {
+		    /* set AND bit, XOR bit stays 0 */
+
                     pbc = pAndBits + iy * 4 + ix/8;
                    *pbc |= 0x80 >> (ix%8);
                 }
                 else
                 {
-                  psc = (unsigned*)(psPtr + (ix * bpp)/8);
-                  val = ((*psc) >> (ix * bpp)%8) & val_base;
+		    /* keep AND bit, set XOR bit */
+
+		  unsigned *psc = (unsigned*)(psPtr + (ix * bpp)/8);
+                  unsigned  val = ((*psc) >> (ix * bpp)%8) & val_base;
                   col = COLOR_ToLogical(val);
-                  if( GetRValue(col) > 0xa0 ||
-                      GetGValue(col) > 0x80 ||
-                      GetBValue(col) > 0xa0 )
+		  if( (GetRValue(col) + GetGValue(col) + GetBValue(col)) > 0x180 )
                   {
                     pbc = pxbPtr + ix/8;
                    *pbc |= 0x80 >> (ix%8);
                   }
                 }
               }
-              psPtr += ptr->nWidthBytes;
+              psPtr += xor_width;
               pxbPtr += 4;
            }
+
            hRet = CreateCursorIconIndirect( pTask->hInstance , &cI, pAndBits, pXorBits);
 
            if( !hRet ) /* fall back on default drag cursor */
                 hRet = CURSORICON_Copy( pTask->hInstance ,
-                              CURSORICON_Load(0,MAKEINTRESOURCE(OCR_DRAGOBJECT),
+                              CURSORICON_Load16(0,MAKEINTRESOURCE(OCR_DRAGOBJECT),
                                          SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE) );
        }
 
@@ -531,8 +689,8 @@
         dprintf_cursor( stddeb, "LoadCursor16: %04x %04x\n",
                         hInstance, LOWORD(name) );
 
-    return CURSORICON_Load( hInstance, name,
-                            SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE);
+    return CURSORICON_Load16( hInstance, name,
+                              SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE);
 }
 
 
@@ -548,9 +706,9 @@
         dprintf_icon( stddeb, "LoadIcon: %04x %04x\n",
                       hInstance, LOWORD(name) );
 
-    return CURSORICON_Load( hInstance, name,
-                            SYSMETRICS_CXICON, SYSMETRICS_CYICON,
-                            MIN( 16, COLOR_GetSystemPaletteSize() ), FALSE );
+    return CURSORICON_Load16( hInstance, name,
+                              SYSMETRICS_CXICON, SYSMETRICS_CYICON,
+                              MIN( 16, COLOR_GetSystemPaletteSize() ), FALSE );
 }
 
 
@@ -691,7 +849,7 @@
 {
     dprintf_icon( stddeb, "DestroyIcon: %04x\n", hIcon );
     /* FIXME: should check for OEM icon here */
-    return (GlobalFree16( hIcon ) == 0);
+    return (FreeResource16( hIcon ) == 0);
 }
 
 
@@ -711,7 +869,7 @@
 {
     dprintf_cursor( stddeb, "DestroyCursor: %04x\n", hCursor );
     /* FIXME: should check for OEM cursor here */
-    return (GlobalFree16( hCursor ) != 0);
+    return (FreeResource16( hCursor ) != 0);
 }
 
 
@@ -1093,6 +1251,53 @@
     if (rect) CopyRect32( rect, &CURSOR_ClipRect );
 }
 
+/**********************************************************************
+ *          LookupIconIdFromDirectoryEx16	(USER.364)
+ *
+ * FIXME: exact parameter sizes
+ */
+UINT16 WINAPI LookupIconIdFromDirectoryEx16( CURSORICONDIR *dir, BOOL16 bIcon,
+	     INT16 width, INT16 height, UINT16 cFlag )
+{
+    UINT16 retVal = 0;
+    if( dir && !dir->idReserved && (dir->idType & 3) )
+    {
+	int colors = (cFlag == LR_MONOCHROME) ? 2 : COLOR_GetSystemPaletteSize();
+	if( bIcon )
+	{
+	    ICONDIRENTRY* entry;
+	    entry = CURSORICON_FindBestIcon( dir, width, height, colors );
+	    if( entry ) retVal = entry->wResId;
+	}
+	else
+	{
+	    CURSORDIRENTRY* entry;
+	    entry = CURSORICON_FindBestCursor( dir, width, height );
+	    if( entry ) retVal = entry->wResId;
+	}
+    }
+    else dprintf_cursor(stddeb,"IconId: invalid resource directory\n");
+    return retVal;
+}
+
+/**********************************************************************
+ *          LookupIconIdFromDirectoryEx32       (USER32.379)
+ */
+INT32 WINAPI LookupIconIdFromDirectoryEx32( CURSORICONDIR *dir, BOOL32 bIcon,
+             INT32 width, INT32 height, UINT32 cFlag )
+{
+    return LookupIconIdFromDirectoryEx16( dir, bIcon, width, height, cFlag );
+}
+
+/**********************************************************************
+ *          LookupIconIdFromDirectory		(USER32.378)
+ */
+INT32 WINAPI LookupIconIdFromDirectory( CURSORICONDIR *dir, BOOL32 bIcon )
+{
+    return LookupIconIdFromDirectoryEx16( dir, bIcon, 
+	   bIcon ? SYSMETRICS_CXICON : SYSMETRICS_CXCURSOR,
+	   bIcon ? SYSMETRICS_CYICON : SYSMETRICS_CYCURSOR, bIcon ? 0 : LR_MONOCHROME );
+}
 
 /**********************************************************************
  *	    GetIconID    (USER.455)
@@ -1100,52 +1305,143 @@
 WORD WINAPI GetIconID( HGLOBAL16 hResource, DWORD resType )
 {
     CURSORICONDIR *lpDir = (CURSORICONDIR *)GlobalLock16(hResource);
-/* LockResource16(hResource); */
-
-    if (!lpDir || lpDir->idReserved ||
-        ((lpDir->idType != 1) && (lpDir->idType != 2)))
-    {
-        dprintf_cursor(stddeb,"GetIconID: invalid resource directory\n");
-        return 0;
-    }
 
     dprintf_cursor( stddeb, "GetIconID: hRes=%04x, entries=%i\n",
-                    hResource, lpDir->idCount );
+                    hResource, lpDir ? lpDir->idCount : 0);
 
     switch(resType)
     {
-    case 1:  /* cursor */
-        {
-            CURSORDIRENTRY *entry = CURSORICON_FindBestCursor( lpDir,
-                                    SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR );
-            return entry ? entry->wResId : 0;
-        }
-    case 3:  /* icon */
-        {
-            ICONDIRENTRY * entry =  CURSORICON_FindBestIcon( lpDir,
-                                    SYSMETRICS_CXICON, SYSMETRICS_CYICON,
-                                    MIN( 16, COLOR_GetSystemPaletteSize() ) );
-            return entry ? entry->wResId : 0;
-        }
+	case RT_CURSOR:
+	     return (WORD)LookupIconIdFromDirectoryEx16( lpDir, FALSE, 
+			  SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, LR_MONOCHROME );
+	case RT_ICON:
+	     return (WORD)LookupIconIdFromDirectoryEx16( lpDir, TRUE,
+			  SYSMETRICS_CXICON, SYSMETRICS_CYICON, 0 );
+	default:
+	     fprintf( stderr, "GetIconID: invalid res type %ld\n", resType );
     }
-    fprintf( stderr, "GetIconID: invalid res type %ld\n", resType );
     return 0;
 }
 
+/**********************************************************************
+ *          LoadCursorIconHandler    (USER.336)
+ *
+ * Supposed to load resources of Windows 2.x applications.
+ */
+HGLOBAL16 WINAPI LoadCursorIconHandler( HGLOBAL16 hResource, HMODULE16 hModule, HRSRC16 hRsrc )
+{
+    fprintf(stderr,"hModule[%04x]: old 2.x resources are not supported!\n", hModule);
+    return (HGLOBAL16)0;
+}
+
+/**********************************************************************
+ *          LoadDIBIconHandler    (USER.357)
+ * 
+ * RT_ICON resource loader, installed by USER_SignalProc when module
+ * is initialized.
+ */
+HGLOBAL16 WINAPI LoadDIBIconHandler( HGLOBAL16 hMemObj, HMODULE16 hModule, HRSRC16 hRsrc )
+{
+    /* If hResource is zero we must allocate a new memory block, if it's
+     * non-zero but GlobalLock() returns NULL then it was discarded and
+     * we have to recommit some memory, otherwise we just need to check 
+     * the block size. See LoadProc() in 16-bit SDK for more.
+     */
+
+     hMemObj = USER_CallDefaultRsrcHandler( hMemObj, hModule, hRsrc );
+     if( hMemObj )
+     {
+	 LPBYTE bits = (LPBYTE)GlobalLock16( hMemObj );
+	 hMemObj = CURSORICON_CreateFromResource( hModule, hMemObj, bits, 
+		   SizeofResource16(hModule, hRsrc), TRUE, 0x00030000, 
+		   SYSMETRICS_CXICON, SYSMETRICS_CYICON, LR_DEFAULTCOLOR );
+     }
+     return hMemObj;
+}
+
+/**********************************************************************
+ *          LoadDIBCursorHandler    (USER.356)
+ *
+ * RT_CURSOR resource loader. Same as above.
+ */
+HGLOBAL16 WINAPI LoadDIBCursorHandler( HGLOBAL16 hMemObj, HMODULE16 hModule, HRSRC16 hRsrc )
+{
+    hMemObj = USER_CallDefaultRsrcHandler( hMemObj, hModule, hRsrc );
+    if( hMemObj )
+    {
+	LPBYTE bits = (LPBYTE)GlobalLock16( hMemObj );
+	hMemObj = CURSORICON_CreateFromResource( hModule, hMemObj, bits,
+		  SizeofResource16(hModule, hRsrc), FALSE, 0x00030000,
+		  SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, LR_MONOCHROME );
+    }
+    return hMemObj;
+}
 
 /**********************************************************************
  *	    LoadIconHandler    (USER.456)
  */
 HICON16 WINAPI LoadIconHandler( HGLOBAL16 hResource, BOOL16 bNew )
 {
+    LPBYTE bits = (LPBYTE)LockResource16( hResource );
+
     dprintf_cursor(stddeb,"LoadIconHandler: hRes=%04x\n",hResource);
 
-    if( !bNew )
-      {
-	fprintf(stdnimp,"LoadIconHandler: 2.xx resources are not supported\n");
-        return 0;
-      }
-    return CURSORICON_LoadHandler( hResource, 0, FALSE);
+    return CURSORICON_CreateFromResource( 0, 0, bits, 0, TRUE, 
+		      bNew ? 0x00030000 : 0x00020000, 0, 0, LR_DEFAULTCOLOR );
+}
+
+/***********************************************************************
+ *           LoadCursorW                (USER32.361)
+ */
+HCURSOR32 WINAPI LoadCursor32W(HINSTANCE32 hInstance, LPCWSTR name)
+{
+    return CURSORICON_Load32( hInstance, name,
+                              SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE);
+}
+
+/***********************************************************************
+ *           LoadCursorA                (USER32.358)
+ */
+HCURSOR32 WINAPI LoadCursor32A(HINSTANCE32 hInstance, LPCSTR name)
+{
+        HCURSOR32 res=0;
+        if(!HIWORD(name))
+                return LoadCursor32W(hInstance,(LPCWSTR)name);
+        else
+        {
+            LPWSTR uni = HEAP_strdupAtoW( GetProcessHeap(), 0, name );
+            res = LoadCursor32W(hInstance, uni);
+            HeapFree( GetProcessHeap(), 0, uni);
+        }
+        return res;
+}
+
+/***********************************************************************
+ *           LoadIconW          (USER32.363)
+ */
+HICON32 WINAPI LoadIcon32W(HINSTANCE32 hInstance, LPCWSTR name)
+{
+    return CURSORICON_Load32( hInstance, name,
+                              SYSMETRICS_CXICON, SYSMETRICS_CYICON,
+                              MIN( 16, COLOR_GetSystemPaletteSize() ), FALSE );
+}
+
+/***********************************************************************
+ *           LoadIconA          (USER32.362)
+ */
+HICON32 WINAPI LoadIcon32A(HINSTANCE32 hInstance, LPCSTR name)
+{
+    HICON32 res=0;
+
+    if( !HIWORD(name) )
+	return LoadIcon32W(hInstance, (LPCWSTR)name);
+    else
+    {
+	LPWSTR uni = HEAP_strdupAtoW( GetProcessHeap(), 0, name );
+	res = LoadIcon32W( hInstance, uni );
+	HeapFree( GetProcessHeap(), 0, uni );
+    }
+    return res;
 }
 
 /**********************************************************************
diff --git a/objects/dc.c b/objects/dc.c
index 77d3996..ed3b3fd 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -232,6 +232,16 @@
     if (dc->w.flags & DC_DIRTY) CLIPPING_UpdateGCRegion(dc);
 
     val.function = DC_XROPfunction[dc->w.ROPmode-1];
+    /*
+    ** Let's replace GXinvert by GXxor with (black xor white)
+    ** This solves the selection color and leak problems in excel
+    ** FIXME : Let's do that only if we work with X-pixels, not with Win-pixels
+    */
+    if (val.function == GXinvert)
+	{
+	val.foreground = BlackPixelOfScreen(screen) ^ WhitePixelOfScreen(screen);
+	val.function = GXxor;
+	}
     val.fill_style = dc->u.x.brush.fillStyle;
     switch(val.fill_style)
     {
@@ -338,7 +348,7 @@
     }
     else val.line_style = LineSolid;
     val.line_width = dc->u.x.pen.width;
-    val.cap_style  = CapRound;
+    val.cap_style  = (val.line_width <= 1) ? CapNotLast : CapRound;
     val.join_style = JoinMiter;
     XChangeGC( display, dc->u.x.gc, 
 	       GCFunction | GCForeground | GCBackground | GCLineWidth |
diff --git a/objects/dib.c b/objects/dib.c
index 9746225..5035ec34 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -299,13 +299,13 @@
 
     while (lines--)
     {
-	for (i = srcwidth/2, x = 0; i > 0; i--)
+	for (i = dstwidth/2, x = 0; i > 0; i--)
 	{
 	    BYTE pix = *bits++;
 	    XPutPixel( bmpImage, x++, lines, colors[pix >> 4] );
 	    XPutPixel( bmpImage, x++, lines, colors[pix & 0x0f] );
 	}
-        if (srcwidth & 1) XPutPixel( bmpImage, x, lines, colors[*bits >> 4] );
+        if (dstwidth & 1) XPutPixel( bmpImage, x, lines, colors[*bits >> 4] );
         srcbits += linebytes;
         bits	 = srcbits;
     }
@@ -1125,3 +1125,15 @@
         SetDIBits32( hdc, handle, 0, height, bits, data, coloruse );
     return handle;
 }
+
+HBITMAP32 CreateDIBSection(
+	HDC32 hdc,BITMAPINFO *bmi,UINT32 usage, LPVOID **bits,HANDLE32 section,
+	DWORD offset
+) {
+	fprintf(stderr,"CreateDIBSection(%d,[w=%ld,h=%ld],%d,%p,0x%08x,%ld),stub\n",
+		hdc,bmi->bmiHeader.biWidth,bmi->bmiHeader.biHeight,usage,bits,section,offset
+	);
+	*bits = 0xCafeBabe;
+	return 0;
+}
+
diff --git a/objects/font.c b/objects/font.c
index 216962f..941881a 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -804,11 +804,12 @@
     }
 
     if (!dc->funcs->pGetTextMetrics ||
-        !dc->funcs->pGetTextMetrics( dc,metrics ))
+        !dc->funcs->pGetTextMetrics( dc, metrics ))
         return FALSE;
-    /* map them from device to logic coordinatesystem before returning.
-     * FIXME: should this be in the device driver?
-     */
+
+    /* device layer returns values in device units
+     * therefore we have to convert them to logical */
+
 #define WDPTOLP(x) ((x<0)?					\
 		(-abs((x)*dc->wndExtX/dc->vportExtX)):		\
 		(abs((x)*dc->wndExtX/dc->vportExtX)))
diff --git a/objects/metafile.c b/objects/metafile.c
index ad8622a..ba27f44 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -727,16 +727,16 @@
     case META_CREATEREGION:
 	 {
 	    int i;
-	    HRGN32 h1,h2,hrgn=CreateRectRgn32(mr->rdParam[7],mr->rdParam[8],
-					      mr->rdParam[9],mr->rdParam[10]);
-	    for (i=0,h1=CreateRectRgn32(0,0,0,0);i<mr->rdParam[5];i++)
+	    HRGN32 h2,hrgn=CreateRectRgn32(mr->rdParam[7],mr->rdParam[8],
+                                           mr->rdParam[9],mr->rdParam[10]);
+	    for (i = 0; i < mr->rdParam[5]; i++)
 	    {
 	     if (mr->rdParam[11+i*6]==2)
 	     { 
 	       h2=CreateRectRgn32(mr->rdParam[14+i*6],mr->rdParam[12+i*6],
 				  mr->rdParam[15+i*6],mr->rdParam[13+i*6]);
-	       CombineRgn32(hrgn,h1,h2,mr->rdParam[16+i*6]);	/* e.g. RGN_OR */
-	       h1=hrgn;
+	       CombineRgn32(hrgn,hrgn,h2,mr->rdParam[16+i*6]);	/* e.g. RGN_OR */
+               DeleteObject32( h2 );
 	     }
 	    }
 	    MF_AddHandle(ht, nHandles,hrgn);
diff --git a/objects/text.c b/objects/text.c
index 1b46830..7e66e56 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -254,7 +254,7 @@
                 HPEN32 hpen = CreatePen32( PS_SOLID, 1, GetTextColor32(hdc) );
                 HPEN32 oldPen = SelectObject32( hdc, hpen );
                 MoveTo(hdc, x + prefix_x, y + tm.tmAscent + 1 );
-                LineTo32(hdc, x + prefix_end, y + tm.tmAscent + 1 );
+                LineTo32(hdc, x + prefix_end + 1, y + tm.tmAscent + 1 );
                 SelectObject32( hdc, oldPen );
                 DeleteObject32( hpen );
             }
@@ -312,6 +312,31 @@
     return ret;
 }
 
+/***********************************************************************
+ *           DrawTextEx32A    (USER32.164)
+ */
+INT32 DrawTextEx32A( HDC32 hdc, LPCSTR str, INT32 count,
+                     LPRECT32 rect, UINT32 flags, LPDRAWTEXTPARAMS dtp )
+{
+    fprintf(stderr,"DrawTextEx32A(%d,'%s',%d,%p,0x%08x,%p)\n",
+    	hdc,str,count,rect,flags,dtp
+    );
+    /*FIXME: ignores extended functionality ... */
+    return DrawText32A(hdc,str,count,rect,flags);
+}
+
+/***********************************************************************
+ *           DrawTextEx32W    (USER32.165)
+ */
+INT32 DrawTextEx32W( HDC32 hdc, LPCWSTR str, INT32 count,
+                     LPRECT32 rect, UINT32 flags, LPDRAWTEXTPARAMS dtp )
+{
+    fprintf(stderr,"DrawTextEx32A(%d,%p,%d,%p,0x%08x,%p)\n",
+    	hdc,str,count,rect,flags,dtp
+    );
+    /*FIXME: ignores extended functionality ... */
+    return DrawText32W(hdc,str,count,rect,flags);
+}
 
 /***********************************************************************
  *           ExtTextOut16    (GDI.351)
diff --git a/scheduler/process.c b/scheduler/process.c
index 2819562..25087fa 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -22,7 +22,7 @@
 #define HTABLE_SIZE  0x30  /* Handle table initial size */
 #define HTABLE_INC   0x10  /* Handle table increment */
 
-#define BOOT_HTABLE_SIZE  5
+#define BOOT_HTABLE_SIZE  10
 
 static HANDLE_ENTRY boot_handles[BOOT_HTABLE_SIZE];
 
@@ -146,6 +146,7 @@
     if ((h < pCurrentProcess->handle_table->count) ||
         PROCESS_GrowHandleTable( pCurrentProcess ))
     {
+        entry = &pCurrentProcess->handle_table->entries[h];
         entry->flags = flags;
         entry->ptr   = ptr;
         LeaveCriticalSection( &pCurrentProcess->crit_section );
@@ -251,7 +252,7 @@
 /***********************************************************************
  *           PROCESS_FillEnvDB
  */
-static BOOL32 PROCESS_FillEnvDB( PDB32 *pdb, TDB *pTask )
+static BOOL32 PROCESS_FillEnvDB( PDB32 *pdb, TDB *pTask, LPCSTR cmd_line )
 {
     LPSTR p, env;
     INT32 count = 0;
@@ -278,9 +279,15 @@
     HeapFree( pdb->heap, 0, array );
     array = NULL;
 
+    /* Copy the command line */
+
+    if (!(pdb->env_db->cmd_line = HEAP_strdupA( pdb->heap, 0, cmd_line )))
+        goto error;
+
     return TRUE;
 
 error:
+    if (pdb->env_db->cmd_line) HeapFree( pdb->heap, 0, pdb->env_db->cmd_line );
     if (array) HeapFree( pdb->heap, 0, array );
     if (pdb->env_db->environ) HeapFree( pdb->heap, 0, pdb->env_db->environ );
     return FALSE;
@@ -290,7 +297,7 @@
 /***********************************************************************
  *           PROCESS_Create
  */
-PDB32 *PROCESS_Create( TDB *pTask )
+PDB32 *PROCESS_Create( TDB *pTask, LPCSTR cmd_line )
 {
     PDB32 *pdb = HeapAlloc( SystemHeap, HEAP_ZERO_MEMORY, sizeof(PDB32) );
     if (!pdb) return NULL;
@@ -310,7 +317,7 @@
     if (!(pdb->env_db = HeapAlloc(pdb->heap, HEAP_ZERO_MEMORY, sizeof(ENVDB))))
         goto error;
     if (!(pdb->handle_table = PROCESS_AllocHandleTable( pdb ))) goto error;
-    if (!PROCESS_FillEnvDB( pdb, pTask )) goto error;
+    if (!PROCESS_FillEnvDB( pdb, pTask, cmd_line )) goto error;
     return pdb;
 
 error:
@@ -352,6 +359,7 @@
  */
 void WINAPI ExitProcess( DWORD status )
 {
+    __RESTORE_ES;  /* Necessary for Pietrek's showseh example program */
     TASK_KillCurrentTask( status );
 }
 
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 7d1bbe2..c350aee 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -16,6 +16,7 @@
 #include "stddebug.h"
 
 THDB *pCurrentThread = NULL;
+static K32OBJ_LIST THREAD_List;
 
 /***********************************************************************
  *           THREAD_GetPtr
@@ -29,7 +30,7 @@
 
     if (handle == 0xfffffffe)  /* Self-thread handle */
     {
-        thread = (THDB *)GetCurrentThreadId();
+        thread = THREAD_Current();
         K32OBJ_IncCount( &thread->header );
     }
     else thread = (THDB *)PROCESS_GetObjPtr( handle, K32OBJ_THREAD );
@@ -38,6 +39,19 @@
 
 
 /***********************************************************************
+ *           THREAD_Current
+ *
+ * Return the current thread THDB pointer.
+ */
+THDB *THREAD_Current(void)
+{
+    /* FIXME: should probably use %fs register here */
+    assert( pCurrentThread );
+    return pCurrentThread;
+}
+
+
+/***********************************************************************
  *           THREAD_Create
  */
 THDB *THREAD_Create( PDB32 *pdb, DWORD stack_size,
@@ -88,6 +102,10 @@
     thdb->context.Eip     = (DWORD)start_addr;
     thdb->context.Esp     = (DWORD)thdb->teb.stack_top;
 
+    /* Add the thread to the linked list */
+
+    K32OBJ_AddTail( &THREAD_List, &thdb->header );
+
     return thdb;
 
 error:
@@ -104,10 +122,42 @@
 void THREAD_Destroy( K32OBJ *ptr )
 {
     THDB *thdb = (THDB *)ptr;
+
     assert( ptr->type == K32OBJ_THREAD );
     ptr->type = K32OBJ_UNKNOWN;
+
+    /* Note: when we get here, the thread has already been removed */
+    /* from the thread list */
+
+    /* Free the associated memory */
+
     SELECTOR_FreeBlock( thdb->teb_sel, 1 );
     HeapFree( SystemHeap, 0, thdb );
+
+}
+
+
+/***********************************************************************
+ *           THREAD_SwitchThread
+ *
+ * Return the thread we want to switch to, and switch the contexts.
+ */
+THDB *THREAD_SwitchThread( CONTEXT *context )
+{
+    K32OBJ *cur;
+    THDB *next;
+    if (!pCurrentThread) return NULL;
+    cur = K32OBJ_RemoveHead( &THREAD_List );
+    K32OBJ_AddTail( &THREAD_List, cur );
+    K32OBJ_DecCount( cur );
+    next = (THDB *)THREAD_List.head;
+    if (next != pCurrentThread)
+    {
+        pCurrentThread->context = *context;
+        pCurrentThread = next;
+        *context = pCurrentThread->context;
+    }
+    return pCurrentThread;
 }
 
 
@@ -150,9 +200,7 @@
  */
 DWORD WINAPI GetCurrentThreadId(void)
 {
-    /* FIXME: should probably use %fs register here */
-    assert( pCurrentThread );
-    return (DWORD)pCurrentThread;
+    return (DWORD)THREAD_Current();
 }
 
 
@@ -161,7 +209,7 @@
  */
 DWORD WINAPI GetLastError(void)
 {
-    THDB *thread = (THDB *)GetCurrentThreadId();
+    THDB *thread = THREAD_Current();
     return thread->last_error;
 }
 
@@ -173,7 +221,7 @@
 {
     THDB *thread;
     if (!pCurrentThread) return;  /* FIXME */
-    thread = (THDB *)GetCurrentThreadId();
+    thread = THREAD_Current();
     thread->last_error = error;
 }
 
@@ -194,7 +242,7 @@
 DWORD WINAPI TlsAlloc(void)
 {
     DWORD i, mask, ret = 0;
-    THDB *thread = (THDB *)GetCurrentThreadId();
+    THDB *thread = THREAD_Current();
     DWORD *bits = thread->process->tls_bits;
     EnterCriticalSection( &thread->process->crit_section );
     if (*bits == 0xffffffff)
@@ -221,7 +269,7 @@
 BOOL32 WINAPI TlsFree( DWORD index )
 {
     DWORD mask;
-    THDB *thread = (THDB *)GetCurrentThreadId();
+    THDB *thread = THREAD_Current();
     DWORD *bits = thread->process->tls_bits;
     if (index >= 64)
     {
@@ -250,7 +298,7 @@
  */
 LPVOID WINAPI TlsGetValue( DWORD index )
 {
-    THDB *thread = (THDB *)GetCurrentThreadId();
+    THDB *thread = THREAD_Current();
     if (index >= 64)
     {
         SetLastError( ERROR_INVALID_PARAMETER );
@@ -266,7 +314,7 @@
  */
 BOOL32 WINAPI TlsSetValue( DWORD index, LPVOID value )
 {
-    THDB *thread = (THDB *)GetCurrentThreadId();
+    THDB *thread = THREAD_Current();
     if (index >= 64)
     {
         SetLastError( ERROR_INVALID_PARAMETER );
@@ -335,3 +383,26 @@
     fprintf(stdnimp,"TerminateThread(0x%08lx,%ld), STUB!\n",threadid,exitcode);
     return TRUE;
 }
+
+/**********************************************************************
+ *           GetExitCodeThread   (KERNEL32)
+ */
+BOOL32 WINAPI GetExitCodeThread(HANDLE32 hthread,LPDWORD exitcode)
+{
+    THDB *thread;
+    
+    if (!(thread = THREAD_GetPtr( hthread ))) return FALSE;
+    if (exitcode) *exitcode = thread->exit_code;
+    K32OBJ_DecCount( &thread->header );
+    return TRUE;
+}
+
+/**********************************************************************
+ *           ResumeThread   (KERNEL32)
+ */
+BOOL32 WINAPI ResumeThread(DWORD threadid)
+{
+    fprintf(stdnimp,"ResumeThread(0x%08lx), STUB!\n",threadid);
+    return TRUE;
+}
+
diff --git a/tools/build-spec.txt b/tools/build-spec.txt
index 8d73148..cf79621 100644
--- a/tools/build-spec.txt
+++ b/tools/build-spec.txt
@@ -61,16 +61,14 @@
 - "register" for a function using CPU register to pass arguments
 - "stdcall" for a normal Win32 function
 - "cdecl" for a Win32 function using the C calling convention
+- "varargs" for a Win32 function taking a variable number of arguments
 
 "ARGTYPE" should be one of:
-- "byte"
 - "word"
 - "long"
 - "ptr" (linear pointer)
 - "str" (linear pointer to a null-terminated string)
-- "s_byte" (signed byte)
 - "s_word" (signed word)
-- "s_long" (signed long)
 - "segptr" (segmented pointer).
 - "segstr" (segmented pointer to a null-terminated string)
 
@@ -91,11 +89,11 @@
 
 	100 pascal GetFocus() WIN_GetFocus()
 
-To declare a function using a variable number of arguments, specify
-the function as taking no arguments. In this special case, in Win32
-the called function will be passed a pointer to the first arg; in
-Win16, the args are available with CURRENT_STACK16->args. See the
-wsprintf* functions in user.spec and user32.spec for an example.
+To declare a function using a variable number of arguments in Win16,
+specify the function as taking no arguments. The arguments are then
+available with CURRENT_STACK16->args. In Win32, specify the function
+as 'varargs' and declare it with a '...' parameter in the C file.  See
+the wsprintf* functions in user.spec and user32.spec for an example.
 
 Stub ordinals:
 ==============
diff --git a/tools/build.c b/tools/build.c
index 327a8e8..1803272 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -43,6 +43,7 @@
     TYPE_STUB,         /* unimplemented stub */
     TYPE_STDCALL,      /* stdcall function (Win32) */
     TYPE_CDECL,        /* cdecl function (Win32) */
+    TYPE_VARARGS,      /* varargs function (Win32) */
     TYPE_EXTERN,       /* external symbol (Win32) */
     TYPE_NBTYPES
 } ORD_TYPE;
@@ -61,6 +62,7 @@
     "stub",         /* TYPE_STUB */
     "stdcall",      /* TYPE_STDCALL */
     "cdecl",        /* TYPE_CDECL */
+    "varargs",      /* TYPE_VARARGS */
     "extern"        /* TYPE_EXTERN */
 };
 
@@ -104,6 +106,11 @@
 typedef struct
 {
     char link_name[80];
+} ORD_VARARGS;
+
+typedef struct
+{
+    char link_name[80];
 } ORD_EXTERN;
 
 typedef struct
@@ -118,6 +125,7 @@
         ORD_FUNCTION   func;
         ORD_RETURN     ret;
         ORD_ABS        abs;
+        ORD_VARARGS    vargs;
         ORD_EXTERN     ext;
     } u;
 } ORDDEF;
@@ -128,8 +136,9 @@
 static char DLLName[80];
 static char DLLFileName[80];
 int Limit = 0;
-int Base = 0;
+int Base = MAX_ORDINALS;
 int DLLHeapSize = 0;
+char *SpecName;
 FILE *SpecFp;
 
 char *ParseBuffer = NULL;
@@ -231,9 +240,9 @@
     {
 	ParseBuffer = xmalloc(512);
 	ParseNext = ParseBuffer;
-	Line++;
 	while (1)
 	{
+            Line++;
 	    if (fgets(ParseBuffer, 511, SpecFp) == NULL)
 		return NULL;
 	    if (ParseBuffer[0] != '#')
@@ -244,9 +253,9 @@
     while ((token = GetTokenInLine()) == NULL)
     {
 	ParseNext = ParseBuffer;
-	Line++;
 	while (1)
 	{
+            Line++;
 	    if (fgets(ParseBuffer, 511, SpecFp) == NULL)
 		return NULL;
 	    if (ParseBuffer[0] != '#')
@@ -273,7 +282,8 @@
     char *token = GetToken();
     if (*token != '(')
     {
-	fprintf(stderr, "%d: Expected '(' got '%s'\n", Line, token);
+	fprintf(stderr, "%s:%d: Expected '(' got '%s'\n",
+                SpecName, Line, token);
 	return -1;
     }
 
@@ -296,15 +306,16 @@
 	
 	if (endptr == NULL || *endptr != '\0')
 	{
-	    fprintf(stderr, "%d: Expected number value, got '%s'\n", Line,
-		    token);
+	    fprintf(stderr, "%s:%d: Expected number value, got '%s'\n",
+                    SpecName, Line, token);
 	    return -1;
 	}
     }
     
     if (token == NULL)
     {
-	fprintf(stderr, "%d: End of file in variable declaration\n", Line);
+	fprintf(stderr, "%s:%d: End of file in variable declaration\n",
+                SpecName, Line);
 	return -1;
     }
 
@@ -330,19 +341,22 @@
     case SPEC_WIN16:
         if (odp->type == TYPE_STDCALL)
         {
-            fprintf( stderr, "%d: 'stdcall' not supported for Win16\n", Line );
+            fprintf( stderr, "%s:%d: 'stdcall' not supported for Win16\n",
+                     SpecName, Line );
             return -1;
         }
         if (odp->type == TYPE_CDECL)
         {
-            fprintf( stderr, "%d: 'cdecl' not supported for Win16\n", Line );
+            fprintf( stderr, "%s:%d: 'cdecl' not supported for Win16\n",
+                     SpecName, Line );
             return -1;
         }
         break;
     case SPEC_WIN32:
         if ((odp->type == TYPE_PASCAL) || (odp->type == TYPE_PASCAL_16))
         {
-            fprintf( stderr, "%d: 'pascal' not supported for Win32\n", Line );
+            fprintf( stderr, "%s:%d: 'pascal' not supported for Win32\n",
+                     SpecName, Line );
             return -1;
         }
         break;
@@ -353,7 +367,8 @@
     token = GetToken();
     if (*token != '(')
     {
-	fprintf(stderr, "%d: Expected '(' got '%s'\n", Line, token);
+	fprintf(stderr, "%s:%d: Expected '(' got '%s'\n",
+                SpecName, Line, token);
 	return -1;
     }
 
@@ -363,9 +378,9 @@
 	if (*token == ')')
 	    break;
 
-        if (!strcmp(token, "byte") || !strcmp(token, "word"))
+        if (!strcmp(token, "word"))
             odp->u.func.arg_types[i] = 'w';
-        else if (!strcmp(token, "s_byte") || !strcmp(token, "s_word"))
+        else if (!strcmp(token, "s_word"))
             odp->u.func.arg_types[i] = 's';
         else if (!strcmp(token, "long") || !strcmp(token, "segptr"))
             odp->u.func.arg_types[i] = 'l';
@@ -375,24 +390,32 @@
 	    odp->u.func.arg_types[i] = 't';
 	else if (!strcmp(token, "segstr"))
 	    odp->u.func.arg_types[i] = 'T';
+        else if (!strcmp(token, "double"))
+        {
+            odp->u.func.arg_types[i++] = 'l';
+            odp->u.func.arg_types[i] = 'l';
+        }
         else
         {
-            fprintf(stderr, "%d: Unknown variable type '%s'\n", Line, token);
+            fprintf(stderr, "%s:%d: Unknown variable type '%s'\n",
+                    SpecName, Line, token);
             return -1;
         }
         if (SpecType == SPEC_WIN32)
         {
-            if (strcmp(token, "long") && strcmp(token, "ptr"))
+            if (strcmp(token, "long") &&
+                strcmp(token, "ptr") &&
+                strcmp(token, "double"))
             {
-                fprintf( stderr, "%d: Type '%s' not supported for Win32\n",
-                         Line, token );
+                fprintf( stderr, "%s:%d: Type '%s' not supported for Win32\n",
+                         SpecName, Line, token );
                 return -1;
             }
         }
     }
-    if (*token != ')')
+    if ((*token != ')') || (i >= sizeof(odp->u.func.arg_types)))
     {
-        fprintf( stderr, "%d: Too many arguments\n", Line );
+        fprintf( stderr, "%s:%d: Too many arguments\n", SpecName, Line );
         return -1;
     }
     odp->u.func.arg_types[i] = '\0';
@@ -416,8 +439,8 @@
     int value = strtol(token, &endptr, 0);
     if (endptr == NULL || *endptr != '\0')
     {
-	fprintf(stderr, "%d: Expected number value, got '%s'\n", Line,
-		token);
+	fprintf(stderr, "%s:%d: Expected number value, got '%s'\n",
+                SpecName, Line, token);
 	return -1;
     }
 
@@ -440,8 +463,8 @@
     odp->u.ret.arg_size = strtol(token, &endptr, 0);
     if (endptr == NULL || *endptr != '\0')
     {
-	fprintf(stderr, "%d: Expected number value, got '%s'\n", Line,
-		token);
+	fprintf(stderr, "%s:%d: Expected number value, got '%s'\n",
+                SpecName, Line, token);
 	return -1;
     }
 
@@ -449,8 +472,8 @@
     odp->u.ret.ret_value = strtol(token, &endptr, 0);
     if (endptr == NULL || *endptr != '\0')
     {
-	fprintf(stderr, "%d: Expected number value, got '%s'\n", Line,
-		token);
+	fprintf(stderr, "%s:%d: Expected number value, got '%s'\n",
+                SpecName, Line, token);
 	return -1;
     }
 
@@ -472,6 +495,42 @@
 
 
 /*******************************************************************
+ *         ParseVarargs
+ *
+ * Parse an 'varargs' definition.
+ */
+static int ParseVarargs( ORDDEF *odp )
+{
+    char *token;
+
+    if (SpecType == SPEC_WIN16)
+    {
+        fprintf( stderr, "%s:%d: 'varargs' not supported for Win16\n",
+                 SpecName, Line );
+        return -1;
+    }
+
+    token = GetToken();
+    if (*token != '(')
+    {
+	fprintf(stderr, "%s:%d: Expected '(' got '%s'\n",
+                SpecName, Line, token);
+	return -1;
+    }
+    token = GetToken();
+    if (*token != ')')
+    {
+	fprintf(stderr, "%s:%d: Expected ')' got '%s'\n",
+                SpecName, Line, token);
+	return -1;
+    }
+
+    strcpy( odp->u.vargs.link_name, GetToken() );
+    return 0;
+}
+
+
+/*******************************************************************
  *         ParseExtern
  *
  * Parse an 'extern' definition.
@@ -480,7 +539,8 @@
 {
     if (SpecType == SPEC_WIN16)
     {
-        fprintf( stderr, "%d: 'extern' not supported for Win16\n", Line );
+        fprintf( stderr, "%s:%d: 'extern' not supported for Win16\n",
+                 SpecName, Line );
         return -1;
     }
     strcpy( odp->u.ext.link_name, GetToken() );
@@ -500,15 +560,16 @@
 
     if (ordinal >= MAX_ORDINALS)
     {
-	fprintf(stderr, "%d: Ordinal number too large\n", Line);
+	fprintf(stderr, "%s:%d: Ordinal number too large\n", SpecName, Line );
 	return -1;
     }
     if (ordinal > Limit) Limit = ordinal;
+    if (ordinal < Base) Base = ordinal;
 
     odp = &OrdinalDefinitions[ordinal];
     if (!(token = GetToken()))
     {
-	fprintf(stderr, "%d: Expected type after ordinal\n", Line);
+	fprintf(stderr, "%s:%d: Expected type after ordinal\n", SpecName, Line);
 	return -1;
     }
 
@@ -519,14 +580,14 @@
     if (odp->type >= TYPE_NBTYPES)
     {
         fprintf( stderr,
-                 "%d: Expected type after ordinal, found '%s' instead\n",
-                 Line, token );
+                 "%s:%d: Expected type after ordinal, found '%s' instead\n",
+                 SpecName, Line, token );
         return -1;
     }
 
     if (!(token = GetToken()))
     {
-        fprintf( stderr, "%d: Expected name after type\n", Line );
+        fprintf( stderr, "%s:%d: Expected name after type\n", SpecName, Line );
         return -1;
     }
     strcpy( odp->name, token );
@@ -550,6 +611,8 @@
 	return ParseReturn( odp );
     case TYPE_STUB:
 	return ParseStub( odp );
+    case TYPE_VARARGS:
+	return ParseVarargs( odp );
     case TYPE_EXTERN:
 	return ParseExtern( odp );
     default:
@@ -588,26 +651,18 @@
             else if (!strcmp(token, "win32" )) SpecType = SPEC_WIN32;
             else
             {
-                fprintf(stderr, "%d: Type must be 'win16' or 'win32'\n", Line);
+                fprintf(stderr, "%s:%d: Type must be 'win16' or 'win32'\n",
+                        SpecName, Line);
                 return -1;
             }
         }
-	else if (strcmp(token, "base") == 0)
-	{
-            token = GetToken();
-            if (!IsNumberString(token))
-            {
-		fprintf(stderr, "%d: Expected number after base\n", Line);
-		return -1;
-            }
-            Base = atoi(token);
-	}
 	else if (strcmp(token, "heap") == 0)
 	{
             token = GetToken();
             if (!IsNumberString(token))
             {
-		fprintf(stderr, "%d: Expected number after heap\n", Line);
+		fprintf(stderr, "%s:%d: Expected number after heap\n",
+                        SpecName, Line);
 		return -1;
             }
             DLLHeapSize = atoi(token);
@@ -624,7 +679,8 @@
 	else
 	{
 	    fprintf(stderr, 
-		    "%d: Expected name, id, length or ordinal\n", Line);
+		    "%s:%d: Expected name, id, length or ordinal\n",
+                    SpecName, Line);
 	    return -1;
 	}
     }
@@ -1009,8 +1065,7 @@
     fprintf( outfile, "\t.align 4\n" );
     fprintf( outfile, "Code_Start:\n\n" );
 
-    odp = OrdinalDefinitions;
-    for (i = 0; i <= Limit; i++, odp++)
+    for (i = Base, odp = OrdinalDefinitions + Base; i <= Limit; i++, odp++)
     {
         switch (odp->type)
         {
@@ -1091,6 +1146,7 @@
             fprintf( outfile, "\t.text\n" );
             break;
 
+        case TYPE_VARARGS:
         case TYPE_EXTERN:
             break;
 
@@ -1103,19 +1159,49 @@
 
     module_size = BuildModule32( outfile );
 
-    /* Output the DLL functions table */
+    /* Output the DLL functions table for no debugging code */
 
     fprintf( outfile, "\t.text\n" );
     fprintf( outfile, "\t.align 4\n" );
-    fprintf( outfile, "Functions:\n" );
-    odp = OrdinalDefinitions;
-    for (i = 0; i <= Limit; i++, odp++)
+    fprintf( outfile, "NoDbg_Functions:\n" );
+    for (i = Base, odp = OrdinalDefinitions + Base; i <= Limit; i++, odp++)
     {
         switch(odp->type)
         {
         case TYPE_INVALID:
             fprintf( outfile, "\t.long 0\n" );
             break;
+        case TYPE_VARARGS:
+            fprintf( outfile, "\t.long " PREFIX "%s\n",odp->u.vargs.link_name);
+            break;
+        case TYPE_EXTERN:
+            fprintf( outfile, "\t.long " PREFIX "%s\n", odp->u.ext.link_name );
+            break;
+        case TYPE_STDCALL:
+        case TYPE_CDECL:
+            fprintf( outfile, "\t.long " PREFIX "%s\n", odp->u.func.link_name);
+            break;
+        default:
+            fprintf( outfile, "\t.long %s_%d\n", DLLName, i );
+            break;
+        }
+    }
+
+    /* Output the DLL functions table for debugging code */
+
+    fprintf( outfile, "\t.text\n" );
+    fprintf( outfile, "\t.align 4\n" );
+    fprintf( outfile, "Functions:\n" );
+    for (i = Base, odp = OrdinalDefinitions + Base; i <= Limit; i++, odp++)
+    {
+        switch(odp->type)
+        {
+        case TYPE_INVALID:
+            fprintf( outfile, "\t.long 0\n" );
+            break;
+        case TYPE_VARARGS:
+            fprintf( outfile, "\t.long " PREFIX "%s\n",odp->u.vargs.link_name);
+            break;
         case TYPE_EXTERN:
             fprintf( outfile, "\t.long " PREFIX "%s\n", odp->u.ext.link_name );
             break;
@@ -1128,8 +1214,7 @@
     /* Output the DLL names table */
 
     fprintf( outfile, "FuncNames:\n" );
-    odp = OrdinalDefinitions;
-    for (i = 0; i <= Limit; i++, odp++)
+    for (i = Base, odp = OrdinalDefinitions + Base; i <= Limit; i++, odp++)
     {
         if (odp->type == TYPE_INVALID) fprintf( outfile, "\t.long 0\n" );
         else fprintf( outfile, "\t.long Name_%d\n", i );
@@ -1137,7 +1222,7 @@
 
     /* Output the DLL names */
 
-    for (i = 0, odp = OrdinalDefinitions; i <= Limit; i++, odp++)
+    for (i = Base, odp = OrdinalDefinitions + Base; i <= Limit; i++, odp++)
     {
         if (odp->type != TYPE_INVALID)
             fprintf( outfile, "Name_%d:\t.ascii \"%s\\0\"\n", i, odp->name );
@@ -1153,9 +1238,10 @@
     fprintf( outfile, "\t.long Module_Start\n" );     /* Module start */
     fprintf( outfile, "\t.long %d\n", module_size );  /* Module size */
     fprintf( outfile, "\t.long %d\n", Base );         /* Base */
-    fprintf( outfile, "\t.long %d\n", Limit+1 );      /* Size */
+    fprintf( outfile, "\t.long %d\n", Limit+1-Base ); /* Size */
     fprintf( outfile, "\t.long Code_Start\n" );       /* Code start */
     fprintf( outfile, "\t.long Functions\n" );        /* Functions */
+    fprintf( outfile, "\t.long NoDbg_Functions\n" );  /* Funcs without debug*/
     fprintf( outfile, "\t.long FuncNames\n" );        /* Function names */
 #ifdef USE_STABS
     fprintf( outfile, "\t.text\n");
@@ -1297,6 +1383,7 @@
  */
 static int BuildSpecFile( FILE *outfile, char *specname )
 {
+    SpecName = specname;
     SpecFp = fopen( specname, "r");
     if (SpecFp == NULL)
     {
@@ -1672,7 +1759,7 @@
 
     /* Setup %ebp to point to the previous stack frame (built by CallTo16) */
 
-    fprintf( outfile, "\taddl $24,%%ebp\n" );
+    fprintf( outfile, "\taddl $32,%%ebp\n" );
 
     /* Print the debug information before the call */
 
@@ -1695,6 +1782,14 @@
 
     if (debugging)
     {
+        if (reg_func)
+        {
+            /* Push again the address of the context struct in case */
+            /* it has been removed by an stdcall function */
+            fprintf( outfile, "\tleal -%d(%%ebp),%%esp\n",
+                     sizeof(CONTEXT) + 32 );
+            fprintf( outfile, "\tpushl %%esp\n" );
+        }
         fprintf( outfile, "\tpushl %%eax\n" );
         fprintf( outfile, "\tpushl $%d\n", reg_func ? 2 : (short_ret ? 1 : 0));
         fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallFrom16Ret\n" );
@@ -1702,6 +1797,13 @@
         fprintf( outfile, "\tpopl %%eax\n" );
     }
 
+#if 0
+    /* Restore the value of the saved 32-bit stack pointer */
+
+    fprintf( outfile, "\tleal -32(%%ebp),%%edx\n" );
+    fprintf( outfile, "movl %%edx," PREFIX "IF1632_Saved32_esp\n" );
+#endif
+
     /* Restore the 16-bit stack */
 
 #ifdef __svr4__
@@ -1785,26 +1887,28 @@
  *
  * Stack frame of the callback function:
  *  ...      ...
- * (ebp+20) arg2
- * (ebp+16) arg1
- * (ebp+12) func to call
- * (ebp+8)  code selector
+ * (ebp+16) arg2
+ * (ebp+12) arg1
+ * (ebp+8)  func to call
  * (ebp+4)  return address
  * (ebp)    previous ebp
  *
  * Prototypes for the CallTo16 functions:
- *   extern WORD CallTo16_word_xxx( FARPROC16 func, args... );
- *   extern LONG CallTo16_long_xxx( FARPROC16 func, args... );
- *   extern void CallTo16_regs_( const CONTEXT *context );
+ *   extern WINAPI WORD CallTo16_word_xxx( FARPROC16 func, args... );
+ *   extern WINAPI LONG CallTo16_long_xxx( FARPROC16 func, args... );
+ *   extern WINAPI LONG CallTo16_wndp_xxx( FARPROC16 func, args... );
+ *   extern WINAPI void CallTo16_regs_( const CONTEXT *context );
  */
 static void BuildCallTo16Func( FILE *outfile, char *profile )
 {
+    int window_proc = 0;
     int short_ret = 0;
     int reg_func = 0;
     char *args = profile + 5;
 
     if (!strncmp( "word_", profile, 5 )) short_ret = 1;
     else if (!strncmp( "regs_", profile, 5 )) reg_func = short_ret = 1;
+    else if (!strncmp( "wndp_", profile, 5 )) window_proc = 1;
     else if (strncmp( "long_", profile, 5 ))
     {
         fprintf( stderr, "Invalid function name '%s', ignored\n", profile );
@@ -1821,19 +1925,33 @@
     fprintf( outfile, "\t.globl " PREFIX "CallTo16_%s\n", profile );
     fprintf( outfile, PREFIX "CallTo16_%s:\n", profile );
 
-    /* Push code selector before return address to simulate a lcall */
-
-    fprintf( outfile, "\tpopl %%eax\n" );
-    fprintf( outfile, "\tpushl $0x%04x\n", WINE_CODE_SELECTOR );
-    fprintf( outfile, "\tpushl %%eax\n" );
-
     /* Entry code */
 
     fprintf( outfile, "\tpushl %%ebp\n" );
     fprintf( outfile, "\tmovl %%esp,%%ebp\n" );
 
+    /* Call the actual CallTo16 routine (simulate a lcall) */
+
+    fprintf( outfile, "\tpushw $0\n" );
+    fprintf( outfile, "\tpushw %%cs\n" );
+    fprintf( outfile, "\tcall do_callto16_%s\n", profile );
+
+    /* Exit code */
+
+    /* FIXME: this is a hack because of task.c */
+    if (!strcmp( profile, "word_" ))
+    {
+        fprintf( outfile, ".globl " PREFIX "CALLTO16_Restore\n" );
+        fprintf( outfile, PREFIX "CALLTO16_Restore:\n" );
+    }
+    fprintf( outfile, "\tpopl %%ebp\n" );
+    fprintf( outfile, "\tret $%d\n", strlen(args) + 1 );
+
+    /* Start of the actual CallTo16 routine */
+
     /* Save the 32-bit registers */
 
+    fprintf( outfile, "do_callto16_%s:\n", profile );
     fprintf( outfile, "\tpushl %%ebx\n" );
     fprintf( outfile, "\tpushl %%ecx\n" );
     fprintf( outfile, "\tpushl %%edx\n" );
@@ -1851,7 +1969,7 @@
     if (debugging)
     {
         /* Push the address of the first argument */
-        fprintf( outfile, "\tleal 12(%%ebx),%%eax\n" );
+        fprintf( outfile, "\tleal 8(%%ebx),%%eax\n" );
         fprintf( outfile, "\tpushl $%d\n", reg_func ? -1 : strlen(args) );
         fprintf( outfile, "\tpushl %%eax\n" );
         fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallTo16\n" );
@@ -1872,7 +1990,7 @@
     if (reg_func)
     {
         /* Get the registers. ebx is handled later on. */
-        fprintf( outfile, "\tmovl 12(%%ebx),%%ebx\n" );
+        fprintf( outfile, "\tmovl 8(%%ebx),%%ebx\n" );
         fprintf( outfile, "\tmovl %d(%%ebx),%%eax\n", CONTEXTOFFSET(SegEs) );
         fprintf( outfile, "\tmovw %%ax,%%es\n" );
         fprintf( outfile, "\tmovl %d(%%ebx),%%ebp\n", CONTEXTOFFSET(Ebp) );
@@ -1884,7 +2002,7 @@
     }
     else  /* not a register function */
     {
-        int pos = 16;  /* first argument position */
+        int pos = 12;  /* first argument position */
 
         /* Make %bp point to the previous stackframe (built by CallFrom16) */
         fprintf( outfile, "\tmovzwl %%sp,%%ebp\n" );
@@ -1931,15 +2049,17 @@
     {
         /* Push the called routine address */
 
-        fprintf( outfile, "\tpushl 12(%%ebx)\n" );
+        fprintf( outfile, "\tpushl 8(%%ebx)\n" );
 
-        /* Get previous ds from the 16-bit stack and */
-        /* set ax equal to ds for window procedures. */
-        fprintf( outfile, "\tmovw -10(%%ebp),%%ax\n" );
-#ifdef __svr4__
-        fprintf( outfile, "\tdata16\n");
-#endif
-        fprintf( outfile, "\tmovw %%ax,%%ds\n" );
+	if( window_proc )
+	{
+	    /* set ax to hInstance and initialize es and ds to ss */
+
+	    fprintf( outfile, "\tmovw -10(%%ebp),%%ax\n" );
+	    fprintf( outfile, "\tmovw %%ss, %%cx\n" );
+	    fprintf( outfile, "\tmovw %%cx, %%ds\n" );
+	    fprintf( outfile, "\tmovw %%cx, %%es\n" );
+	}
     }
 
     /* Jump to the called routine */
@@ -1962,9 +2082,9 @@
     /* Put return value into eax */
 
     fprintf( outfile, PREFIX "CALLTO16_Ret_long:\n" );
-    fprintf( outfile, "\tpushw %%dx\n" );
-    fprintf( outfile, "\tpushw %%ax\n" );
-    fprintf( outfile, "\tpopl %%eax\n" );
+    fprintf( outfile, "\tshll $16,%%edx\n" );
+    fprintf( outfile, "\tmovw %%ax,%%dx\n" );
+    fprintf( outfile, "\tmovl %%edx,%%eax\n" );
     fprintf( outfile, PREFIX "CALLTO16_Ret_word:\n" );
 
     /* Restore 32-bit segment registers */
@@ -1998,7 +2118,7 @@
 
     /* Return to caller */
 
-    fprintf( outfile, "\tpopl %%ebp\n" );
+/*    fprintf( outfile, "\tpopl %%ebp\n" );*/
     fprintf( outfile, "\tlret\n" );
 
     /* Declare the return address variables */
@@ -2170,19 +2290,6 @@
     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" );
@@ -2205,10 +2312,12 @@
         fprintf( outfile, "\tpushl %%eax\n" );
     }
 
+#if 0
     /* Set %es = %ds */
 
     fprintf( outfile, "\tmovw %%ds,%%ax\n" );
     fprintf( outfile, "\tmovw %%ax,%%es\n" );
+#endif
 
     /* Print the debugging info */
 
@@ -2311,7 +2420,8 @@
 
     fprintf( outfile, "\tmovl %%ebp,%%esp\n" );
     fprintf( outfile, "\tpopl %%ebp\n" );
-    fprintf( outfile, "\tret\n" );
+    if (args) fprintf( outfile, "\tret $%d\n", args );
+    else fprintf( outfile, "\tret\n" );
 }
 
 
diff --git a/win32/Makefile.in b/win32/Makefile.in
index 834ad62..b83223c 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -9,7 +9,6 @@
 	advapi.c \
 	code_page.c \
 	console.c \
-	cursoricon32.c \
 	environment.c \
 	error.c \
 	except.c \
diff --git a/win32/cursoricon32.c b/win32/cursoricon32.c
deleted file mode 100644
index b551663..0000000
--- a/win32/cursoricon32.c
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * Cursor and icon support
- *
- * Copyright 1995 Alexandre Julliard
- * Copyright 1996 Martin von Loewis
- */
-
-/*
- * Theory:
- *
- * Cursors and icons are stored in a global heap block, with the
- * following layout:
- *
- * CURSORICONINFO info;
- * BYTE[]         ANDbits;
- * BYTE[]         XORbits;
- *
- * The bits structures are in the format of a device-dependent bitmap.
- *
- * This layout is very sub-optimal, as the bitmap bits are stored in
- * the X client instead of in the server like other bitmaps; however,
- * some programs (notably Paint Brush) expect to be able to manipulate
- * the bits directly :-(
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include "windows.h"
-#include "callback.h"
-#include "cursoricon.h"
-#include "sysmetrics.h"
-#include "win.h"
-#include "bitmap.h"
-#include "struct32.h"
-#include "heap.h"
-#include "task.h"
-#include "stddebug.h"
-#include "debug.h"
-#include "xmalloc.h"
-
-/* This dictionary could might eventually become a macro for better reuse */
-struct MAP_DWORD_DWORD
-{
-    DWORD key;
-    HANDLE32 value;
-};
-
-struct MAP_DWORD_DWORD *CURSORICON_map;
-int CURSORICON_count;
-
-BOOL32 CURSORICON_lookup(DWORD key,HANDLE32 *value)
-{
-	int i;
-	for(i=0;i<CURSORICON_count;i++)
-	{
-		if(key==CURSORICON_map[i].key)
-		{
-			*value=CURSORICON_map[i].value;
-			return TRUE;
-		}
-	}
-	return FALSE;
-}
-
-void CURSORICON_insert(DWORD key,DWORD value)
-{
-	if(!CURSORICON_count)
-	{
-		CURSORICON_count=1;
-		CURSORICON_map=malloc(sizeof(struct MAP_DWORD_DWORD));
-	}else{
-		CURSORICON_count++;
-		CURSORICON_map=realloc(CURSORICON_map,
-			sizeof(struct MAP_DWORD_DWORD)*CURSORICON_count);
-	}
-	CURSORICON_map[CURSORICON_count-1].key=key;
-	CURSORICON_map[CURSORICON_count-1].value=value;
-}
-
-/**********************************************************************
- *	    CURSORICON32_FindBestIcon
- *
- * Find the icon closest to the requested size and number of colors.
- */
-static ICONDIRENTRY32 *CURSORICON32_FindBestIcon( CURSORICONDIR32 *dir, 
-	int width, int height, int colors )
-{
-    int i, maxcolors, maxwidth, maxheight;
-    ICONDIRENTRY32 *entry, *bestEntry = NULL;
-
-    if (dir->idCount < 1)
-    {
-        fprintf( stderr, "Icon: empty directory!\n" );
-        return NULL;
-    }
-    if (dir->idCount == 1) return &dir->idEntries[0].icon;  /* No choice... */
-
-    /* First find the exact size with less colors */
-
-    maxcolors = 0;
-    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
-        if ((entry->bWidth == width) && (entry->bHeight == height) &&
-            (entry->bColorCount <= colors) && (entry->bColorCount > maxcolors))
-        {
-            bestEntry = entry;
-            maxcolors = entry->bColorCount;
-        }
-    if (bestEntry) return bestEntry;
-
-    /* First find the exact size with more colors */
-
-    maxcolors = 255;
-    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
-        if ((entry->bWidth == width) && (entry->bHeight == height) &&
-            (entry->bColorCount > colors) && (entry->bColorCount <= maxcolors))
-        {
-            bestEntry = entry;
-            maxcolors = entry->bColorCount;
-        }
-    if (bestEntry) return bestEntry;
-
-    /* Now find a smaller one with less colors */
-
-    maxcolors = maxwidth = maxheight = 0;
-    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
-        if ((entry->bWidth <= width) && (entry->bHeight <= height) &&
-            (entry->bWidth >= maxwidth) && (entry->bHeight >= maxheight) &&
-            (entry->bColorCount <= colors) && (entry->bColorCount > maxcolors))
-        {
-            bestEntry = entry;
-            maxwidth  = entry->bWidth;
-            maxheight = entry->bHeight;
-            maxcolors = entry->bColorCount;
-        }
-    if (bestEntry) return bestEntry;
-
-    /* Now find a smaller one with more colors */
-
-    maxcolors = 255;
-    maxwidth = maxheight = 0;
-    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
-        if ((entry->bWidth <= width) && (entry->bHeight <= height) &&
-            (entry->bWidth >= maxwidth) && (entry->bHeight >= maxheight) &&
-            (entry->bColorCount > colors) && (entry->bColorCount <= maxcolors))
-        {
-            bestEntry = entry;
-            maxwidth  = entry->bWidth;
-            maxheight = entry->bHeight;
-            maxcolors = entry->bColorCount;
-        }
-    if (bestEntry) return bestEntry;
-
-    /* Now find a larger one with less colors */
-
-    maxcolors = 0;
-    maxwidth = maxheight = 255;
-    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
-        if ((entry->bWidth <= maxwidth) && (entry->bHeight <= maxheight) &&
-            (entry->bColorCount <= colors) && (entry->bColorCount > maxcolors))
-        {
-            bestEntry = entry;
-            maxwidth  = entry->bWidth;
-            maxheight = entry->bHeight;
-            maxcolors = entry->bColorCount;
-        }
-    if (bestEntry) return bestEntry;
-
-    /* Now find a larger one with more colors */
-
-    maxcolors = maxwidth = maxheight = 255;
-    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
-        if ((entry->bWidth <= maxwidth) && (entry->bHeight <= maxheight) &&
-            (entry->bColorCount > colors) && (entry->bColorCount <= maxcolors))
-        {
-            bestEntry = entry;
-            maxwidth  = entry->bWidth;
-            maxheight = entry->bHeight;
-            maxcolors = entry->bColorCount;
-        }
-
-    return bestEntry;
-}
-
-
-/**********************************************************************
- *	    CURSORICON32_FindBestCursor
- *
- * Find the cursor closest to the requested size.
- */
-static CURSORDIRENTRY32 *CURSORICON32_FindBestCursor( CURSORICONDIR32 *dir,
-                                                  int width, int height )
-{
-    int i, maxwidth, maxheight;
-    CURSORDIRENTRY32 *entry, *bestEntry = NULL;
-
-    if (dir->idCount < 1)
-    {
-        fprintf( stderr, "Cursor: empty directory!\n" );
-        return NULL;
-    }
-    if (dir->idCount == 1) return &dir->idEntries[0].cursor; /* No choice... */
-
-    /* First find the largest one smaller than or equal to the requested size*/
-
-    maxwidth = maxheight = 0;
-    for(i = 0,entry = &dir->idEntries[0].cursor; i < dir->idCount; i++,entry++)
-        if ((entry->wWidth <= width) && (entry->wHeight <= height) &&
-            (entry->wWidth > maxwidth) && (entry->wHeight > maxheight))
-        {
-            bestEntry = entry;
-            maxwidth  = entry->wWidth;
-            maxheight = entry->wHeight;
-        }
-    if (bestEntry) return bestEntry;
-
-    /* Now find the smallest one larger than the requested size */
-
-    maxwidth = maxheight = 255;
-    for(i = 0,entry = &dir->idEntries[0].cursor; i < dir->idCount; i++,entry++)
-        if ((entry->wWidth < maxwidth) && (entry->wHeight < maxheight))
-        {
-            bestEntry = entry;
-            maxwidth  = entry->wWidth;
-            maxheight = entry->wHeight;
-        }
-
-    return bestEntry;
-}
-
-
-/**********************************************************************
- *	    CURSORICON32_LoadDirEntry
- *
- * Load the icon/cursor directory for a given resource name and find the
- * best matching entry.
- */
-static BOOL32 CURSORICON32_LoadDirEntry(HINSTANCE32 hInstance, LPCWSTR name,
-                                    int width, int height, int colors,
-                                    BOOL32 fCursor, CURSORICONDIRENTRY32 *dirEntry)
-{
-    HANDLE32 hRsrc;
-    HANDLE32 hMem;
-    CURSORICONDIR32 *dir;
-    CURSORICONDIRENTRY32 *entry = NULL;
-
-    if (!(hRsrc = FindResource32W( hInstance, name,
-                (LPCWSTR)(fCursor ? RT_GROUP_CURSOR : RT_GROUP_ICON) )))
-        return FALSE;
-    if (!(hMem = LoadResource32( hInstance, hRsrc ))) return FALSE;
-    if ((dir = (CURSORICONDIR32 *)LockResource32( hMem )))
-    {
-        if (fCursor)
-            entry = (CURSORICONDIRENTRY32 *)CURSORICON32_FindBestCursor( dir,
-                                                               width, height );
-        else
-            entry = (CURSORICONDIRENTRY32 *)CURSORICON32_FindBestIcon( dir,
-                                                       width, height, colors );
-        if (entry) *dirEntry = *entry;
-    }
-    FreeResource32( hMem );
-    return (entry != NULL);
-}
-
-
-/**********************************************************************
- *	    CURSORICON32_LoadHandler 
- *
- * Create a cursor or icon from a resource.
- */
-static HGLOBAL32 CURSORICON32_LoadHandler( HANDLE32 handle,
-                                           HINSTANCE32 hInstance,
-                                           BOOL32 fCursor )
-{
-    HBITMAP32 hAndBits, hXorBits;
-    HGLOBAL32 hRes;
-    HDC32 hdc;
-    int size, sizeAnd, sizeXor;
-    POINT16 hotspot = { 0 ,0 };
-    BITMAPOBJ *bmpXor, *bmpAnd;
-    BITMAPINFO *bmi, *pInfo;
-    CURSORICONINFO *info;
-    char *bits;
-
-	hRes=0;
-    if (fCursor)  /* If cursor, get the hotspot */
-    {
-        POINT16 *pt = (POINT16 *)LockResource32( handle );
-        hotspot = *pt;
-        bmi = (BITMAPINFO *)(pt + 1);
-    }
-    else bmi = (BITMAPINFO *)LockResource32( handle );
-
-    /* Create a copy of the bitmap header */
-
-    size = DIB_BitmapInfoSize( bmi, DIB_RGB_COLORS );
-    /* Make sure we have room for the monochrome bitmap later on */
-    size = MAX( size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD) );
-    pInfo = (BITMAPINFO *)xmalloc( size );
-    memcpy( pInfo, bmi, size );
-
-    if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
-    {
-        if (pInfo->bmiHeader.biCompression != BI_RGB)
-        {
-            fprintf(stderr,"Unknown size for compressed icon bitmap.\n");
-            free( pInfo );
-            return 0;
-        }
-        pInfo->bmiHeader.biHeight /= 2;
-    }
-    else if (pInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
-    {
-        BITMAPCOREHEADER *core = (BITMAPCOREHEADER *)pInfo;
-        core->bcHeight /= 2;
-    }
-    else
-    {
-        fprintf( stderr, "CURSORICON32_Load: Unknown bitmap length %ld!\n",
-                 pInfo->bmiHeader.biSize );
-        free( pInfo );
-        return 0;
-    }
-
-    /* Create the XOR bitmap */
-
-    if (!(hdc = GetDC32( 0 )))
-    {
-        free( pInfo );
-        return 0;
-    }
-
-    hXorBits = CreateDIBitmap32( hdc, &pInfo->bmiHeader, CBM_INIT,
-                                 (char*)bmi + size, pInfo, DIB_RGB_COLORS );
-
-    /* Fix the bitmap header to load the monochrome mask */
-
-    if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
-    {
-        BITMAPINFOHEADER *bih = &pInfo->bmiHeader;
-        RGBQUAD *rgb = pInfo->bmiColors;
-        bits = (char *)bmi + size +
-            DIB_GetDIBWidthBytes(bih->biWidth,bih->biBitCount)*bih->biHeight;
-        bih->biBitCount = 1;
-        bih->biClrUsed = bih->biClrImportant = 2;
-        rgb[0].rgbBlue = rgb[0].rgbGreen = rgb[0].rgbRed = 0x00;
-        rgb[1].rgbBlue = rgb[1].rgbGreen = rgb[1].rgbRed = 0xff;
-        rgb[0].rgbReserved = rgb[1].rgbReserved = 0;
-    }
-    else
-    {
-        BITMAPCOREHEADER *bch = (BITMAPCOREHEADER *)pInfo;
-        RGBTRIPLE *rgb = (RGBTRIPLE *)(bch + 1);
-        bits = (char *)bmi + size +
-            DIB_GetDIBWidthBytes(bch->bcWidth,bch->bcBitCount)*bch->bcHeight;
-        bch->bcBitCount = 1;
-        rgb[0].rgbtBlue = rgb[0].rgbtGreen = rgb[0].rgbtRed = 0x00;
-        rgb[1].rgbtBlue = rgb[1].rgbtGreen = rgb[1].rgbtRed = 0xff;
-    }
-
-    /* Create the AND bitmap */
-
-    hAndBits = CreateDIBitmap32( hdc, &pInfo->bmiHeader, CBM_INIT,
-                                 bits, pInfo, DIB_RGB_COLORS );
-    ReleaseDC32( 0, hdc );
-
-    /* Now create the CURSORICONINFO structure */
-
-    bmpXor = (BITMAPOBJ *) GDI_GetObjPtr( hXorBits, BITMAP_MAGIC );
-    bmpAnd = (BITMAPOBJ *) GDI_GetObjPtr( hAndBits, BITMAP_MAGIC );
-    sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
-    sizeAnd = bmpAnd->bitmap.bmHeight * bmpAnd->bitmap.bmWidthBytes;
-
-    if (!(hRes = GlobalAlloc16( GMEM_MOVEABLE,
-                                sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
-    {
-        DeleteObject32( hXorBits );
-        DeleteObject32( hAndBits );
-        return 0;
-    }
-
-    /* Make it owned by the module */
-    if (hInstance) FarSetOwner( hRes, (WORD)(DWORD)GetExePtr(hInstance) );
-
-    info = (CURSORICONINFO *)GlobalLock16( hRes );
-    info->ptHotSpot.x   = hotspot.x;
-    info->ptHotSpot.y   = hotspot.y;
-    info->nWidth        = bmpXor->bitmap.bmWidth;
-    info->nHeight       = bmpXor->bitmap.bmHeight;
-    info->nWidthBytes   = bmpXor->bitmap.bmWidthBytes;
-    info->bPlanes       = bmpXor->bitmap.bmPlanes;
-    info->bBitsPerPixel = bmpXor->bitmap.bmBitsPixel;
-
-    /* Transfer the bitmap bits to the CURSORICONINFO structure */
-
-    GetBitmapBits32( hAndBits, sizeAnd, (char *)(info + 1) );
-    GetBitmapBits32( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
-    DeleteObject32( hXorBits );
-    DeleteObject32( hAndBits );
-    GlobalUnlock16( hRes );
-    return hRes;
-}
-
-/**********************************************************************
- *	    CURSORICON32_Load
- *
- * Load a cursor or icon.
- */
-static HGLOBAL32 CURSORICON32_Load( HINSTANCE32 hInstance, LPCWSTR name,
-                                    int width, int height, int colors,
-                                    BOOL32 fCursor )
-{
-    HANDLE32 handle;
-    HANDLE32 hRet;
-    HANDLE32 hRsrc;
-    CURSORICONDIRENTRY32 dirEntry;
-
-	if(!hInstance)	/* OEM cursor/icon */
-	{
-		WORD resid;
-		if(HIWORD(name))
-		{
-			LPSTR ansi = HEAP_strdupWtoA(GetProcessHeap(),0,name);
-			if(ansi[0]=='#')	/*Check for '#xxx' name */
-			{
-                            resid = atoi(ansi+1);
-                            HeapFree( GetProcessHeap(), 0, ansi );
-			}
-                        else
-                        {
-                            HeapFree( GetProcessHeap(), 0, ansi );
-                            return 0;
-			}
-		}
-		else resid = LOWORD(name);
-		return OBM_LoadCursorIcon(resid, fCursor);
-	}
-
-    /* Find the best entry in the directory */
-
-    if (!CURSORICON32_LoadDirEntry( hInstance, name, width, height,
-                                  colors, fCursor, &dirEntry )) return 0;
-
-    /* Load the resource */
-
-    if (!(hRsrc = FindResource32W( hInstance,
-                      (LPWSTR) (DWORD) dirEntry.icon.wResId,
-                      (LPWSTR) (fCursor ? RT_CURSOR : RT_ICON )))) return 0;
-    if (!(handle = LoadResource32( hInstance, hRsrc ))) return 0;
-
-	/* Use the resource handle as key to detect multiple loading */
-	if(CURSORICON_lookup(handle,&hRet))
-		return hRet;
-
-    hRet = CURSORICON32_LoadHandler( handle, hInstance, fCursor );
-    /* Obsolete - FreeResource32(handle);*/
-	CURSORICON_insert(handle,hRet);
-    return hRet;
-}
-
-
-/***********************************************************************
- *           LoadCursorW		(USER32.361)
- */
-HCURSOR32 WINAPI LoadCursor32W(HINSTANCE32 hInstance,LPCWSTR name)
-{
-    return CURSORICON32_Load( hInstance, name,
-                            SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE);
-}
-
-/***********************************************************************
- *           LoadCursorA		(USER32.358)
- */
-HCURSOR32 WINAPI LoadCursor32A(HINSTANCE32 hInstance,LPCSTR name)
-{
-	HCURSOR32 res=0;
-	if(!HIWORD(name))
-		return LoadCursor32W(hInstance,(LPCWSTR)name);
-	else
-        {
-            LPWSTR uni = HEAP_strdupAtoW( GetProcessHeap(), 0, name );
-            res = LoadCursor32W(hInstance, uni);
-            HeapFree( GetProcessHeap(), 0, uni);
-	}
-	return res;
-}
-
-
-/***********************************************************************
- *           LoadIconW		(USER32.363)
- */
-HICON32 WINAPI LoadIcon32W(HINSTANCE32 hInstance,LPCWSTR name)
-{
-    return CURSORICON32_Load( hInstance, name,
-                            SYSMETRICS_CXICON, SYSMETRICS_CYICON,
-                            MIN( 16, 1 << screenDepth ), FALSE );
-}
-
-/***********************************************************************
- *           LoadIconA		(USER32.362)
- */
-HICON32 WINAPI LoadIcon32A(HINSTANCE32 hInstance,LPCSTR name)
-{
-	HICON32 res=0;
-	if(!HIWORD(name))
-		return LoadIcon32W(hInstance, (LPCWSTR)name);
-	else
-        {
-            LPWSTR uni = HEAP_strdupAtoW( GetProcessHeap(), 0, name );
-            res = LoadIcon32W( hInstance, uni );
-            HeapFree( GetProcessHeap(), 0, uni );
-	}
-	return res;
-}
-
diff --git a/win32/environment.c b/win32/environment.c
index cbe6259..1d676f8 100644
--- a/win32/environment.c
+++ b/win32/environment.c
@@ -24,7 +24,8 @@
     char *cp;
     PDB *pdb = (PDB *)GlobalLock16( GetCurrentPDB() );
 
-    lstrcpyn32A( buffer, MODULE_GetModuleName( GetExePtr(GetCurrentTask()) ),
+    /* FIXME: should use pCurrentProcess->env_db->cmd_line here */
+    lstrcpyn32A( buffer, MODULE_GetModuleName(GetCurrentTask()),
                  sizeof(buffer) - 1 );
     cp = buffer + strlen(buffer);
     if (pdb->cmdLine[0])
diff --git a/win32/file.c b/win32/file.c
index 79b75c6..23cfecc 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -239,7 +239,7 @@
  */
 VOID WINAPI SetFileApisToOEM(void)
 {
-    fprintf(stdnimp,"SetFileApisToOEM(),stub!\n");
+    /*fprintf(stdnimp,"SetFileApisToOEM(),stub!\n");*/
 }
 
 
@@ -248,7 +248,7 @@
  */
 VOID WINAPI SetFileApisToANSI(void)
 {
-    fprintf(stdnimp,"SetFileApisToANSI(),stub!\n");
+    /*fprintf(stdnimp,"SetFileApisToANSI(),stub!\n");*/
 }
 
 
diff --git a/win32/init.c b/win32/init.c
index 80a8191..ed836ed 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -19,35 +19,6 @@
 #include "xmalloc.h"
   
 /***********************************************************************
- *              GetModuleHandle         (KERNEL32.237)
- */
-HMODULE32 WINAPI WIN32_GetModuleHandleA(char *module)
-{
-    HMODULE32 hModule;
-
-    dprintf_win32(stddeb, "GetModuleHandleA: %s\n", module ? module : "NULL");
-/* Freecell uses the result of GetModuleHandleA(0) as the hInstance in
-all calls to e.g. CreateWindowEx. */
-    if (module == NULL) {
-	TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
-	hModule = pTask->hInstance;
-    } else
-	hModule = GetModuleHandle16(module);
-    dprintf_win32(stddeb, "GetModuleHandleA: returning %d\n", hModule );
-    return hModule;
-}
-
-HMODULE32 WINAPI WIN32_GetModuleHandleW(LPCWSTR module)
-{
-    HMODULE32 hModule;
-    LPSTR modulea = HEAP_strdupWtoA( GetProcessHeap(), 0, module );
-    hModule = WIN32_GetModuleHandleA( modulea );
-    HeapFree( GetProcessHeap(), 0, modulea );
-    return hModule;
-}
-
-
-/***********************************************************************
  *              GetStartupInfoA         (KERNEL32.273)
  */
 VOID WINAPI GetStartupInfo32A(LPSTARTUPINFO32A lpStartupInfo)
diff --git a/win32/k32obj.c b/win32/k32obj.c
index 944ecd7..9eb1b8c 100644
--- a/win32/k32obj.c
+++ b/win32/k32obj.c
@@ -90,6 +90,80 @@
 
 
 /***********************************************************************
+ *           K32OBJ_AddHead
+ *
+ * Add an object at the head of the list and increment its ref count.
+ */
+void K32OBJ_AddHead( K32OBJ_LIST *list, K32OBJ *ptr )
+{
+    K32OBJ_ENTRY *entry = HeapAlloc( SystemHeap, 0, sizeof(*entry) );
+    assert(entry);
+    K32OBJ_IncCount( ptr );
+    entry->obj = ptr;
+    if ((entry->next = list->head) != NULL) entry->next->prev = entry;
+    else list->tail = entry;
+    entry->prev = NULL;
+    list->head = entry;
+}
+
+
+/***********************************************************************
+ *           K32OBJ_AddTail
+ *
+ * Add an object at the tail of the list and increment its ref count.
+ */
+void K32OBJ_AddTail( K32OBJ_LIST *list, K32OBJ *ptr )
+{
+    K32OBJ_ENTRY *entry = HeapAlloc( SystemHeap, 0, sizeof(*entry) );
+    assert(entry);
+    K32OBJ_IncCount( ptr );
+    entry->obj = ptr;
+    if ((entry->prev = list->tail) != NULL) entry->prev->next = entry;
+    else list->head = entry;
+    entry->next = NULL;
+    list->tail = entry;
+}
+
+
+/***********************************************************************
+ *           K32OBJ_Remove
+ *
+ * Remove an object from the list and decrement its ref count.
+ */
+void K32OBJ_Remove( K32OBJ_LIST *list, K32OBJ *ptr )
+{
+    K32OBJ_ENTRY *entry = list->head;
+    while ((entry && (entry->obj != ptr))) entry = entry->next;
+    assert(entry);
+    if (entry->next) entry->next->prev = entry->prev;
+    else list->tail = entry->prev;
+    if (entry->prev) entry->prev->next = entry->next;
+    else list->head = entry->next;
+    HeapFree( SystemHeap, 0, entry );
+    K32OBJ_DecCount( ptr );
+}
+
+
+/***********************************************************************
+ *           K32OBJ_RemoveHead
+ *
+ * Remove the head of the list; its ref count is NOT decremented.
+ */
+K32OBJ *K32OBJ_RemoveHead( K32OBJ_LIST *list )
+{
+    K32OBJ *ptr;
+    K32OBJ_ENTRY *entry = list->head;
+    assert(entry);
+    assert(!entry->prev);
+    if ((list->head = entry->next) != NULL) entry->next->prev = NULL;
+    else list->tail = NULL;
+    ptr = entry->obj;
+    HeapFree( SystemHeap, 0, entry );
+    return ptr;
+}
+
+
+/***********************************************************************
  *           K32OBJ_AddName
  *
  * Add a name entry for an object. We don't check for duplicates here.
diff --git a/win32/newfns.c b/win32/newfns.c
index f8477fc..7954e72 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -14,6 +14,30 @@
 #include "debug.h"
 
 /****************************************************************************
+ *		UTRegister (KERNEL32.697)
+ */
+BOOL32 WINAPI UTRegister(HMODULE32 hModule,
+                      LPSTR lpsz16BITDLL,
+                      LPSTR lpszInitName,
+                      LPSTR lpszProcName,
+                      /*UT32PROC*/ LPVOID *ppfn32Thunk,
+                      /*FARPROC*/ LPVOID pfnUT32CallBack,
+                      LPVOID lpBuff)
+{
+    fprintf(stdnimp, "UTRegister Stub called!\n");
+    return TRUE;
+}
+
+/****************************************************************************
+ *		UTUnRegister (KERNEL32.698)
+ */
+BOOL32 WINAPI UTUnRegister(HMODULE32 hModule)
+{
+    fprintf(stdnimp, "UTUnRegister Stub called!\n");
+    return TRUE;
+}
+
+/****************************************************************************
  *		QueryPerformanceCounter (KERNEL32.415)
  */
 BOOL32 WINAPI QueryPerformanceCounter(LPLARGE_INTEGER counter)
@@ -23,14 +47,3 @@
 	counter->HighPart	= 0;
 	return TRUE;
 }
-
-/****************************************************************************
- *		DisableThreadLibraryCalls (KERNEL32.74)
- * Don't call DllEntryPoint for DLL_THREAD_{ATTACH,DETACH} if set.
- */
-BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32 hModule)
-{
-    fprintf(stdnimp, "DisableThreadLibraryCalls Stub called!\n");
-    return TRUE;
-}
-
diff --git a/win32/process.c b/win32/process.c
index ff4f2c5..6820269 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -364,56 +364,6 @@
 	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 WINAPI LoadLibrary32A(LPCSTR libname)
-{
-	HINSTANCE32 handle;
-	dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
-	handle = LoadModule16( libname, (LPVOID)-1 );
-	if (handle == (HINSTANCE32) -1)
-	{
-		char buffer[256];
-		strcpy( buffer, libname );
-		strcat( buffer, ".dll" );
-		handle = LoadModule16( buffer, (LPVOID)-1 );
-	}
-	/* Obtain module handle and call initialization function */
-#ifndef WINELIB
-	if (handle >= (HINSTANCE32)32) PE_InitializeDLLs( GetExePtr(handle), DLL_PROCESS_ATTACH, NULL);
-#endif
-	return handle;
-}
-
-/***********************************************************************
- *           LoadLibrary32W         (KERNEL32.368)
- */
-HINSTANCE32 WINAPI LoadLibrary32W(LPCWSTR libnameW)
-{
-    LPSTR libnameA = HEAP_strdupWtoA( GetProcessHeap(), 0, libnameW );
-    HINSTANCE32 ret = LoadLibrary32A( libnameA );
-    HeapFree( GetProcessHeap(), 0, libnameA );
-    return ret;
-}
-
-/***********************************************************************
- *           FreeLibrary
- */
-BOOL32 WINAPI FreeLibrary32(HINSTANCE32 hLibModule)
-{
-	fprintf(stderr,"FreeLibrary: empty stub\n");
-	return TRUE;
-}
-
 /**********************************************************************
  *          GetProcessAffinityMask
  */
@@ -462,7 +412,9 @@
 		appname,cmdline,processattributes,threadattributes,
 		inherithandles,creationflags,env,curdir,startupinfo,processinfo
 	);
-	return TRUE;
+	/* make from lcc uses system as fallback if CreateProcess returns
+	   FALSE, so return false */
+	return FALSE;
 }
 
 BOOL32 WINAPI ContinueDebugEvent(DWORD pid,DWORD tid,DWORD contstatus) {
diff --git a/windows/class.c b/windows/class.c
index e6422e9..ca349f0 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -210,14 +210,13 @@
  *           CLASS_FindClassByAtom
  *
  * Return a pointer to the class.
+ * hinstance has been normalized by the caller.
  */
-CLASS *CLASS_FindClassByAtom( ATOM atom, HINSTANCE16 hinstance )
+CLASS *CLASS_FindClassByAtom( ATOM atom, HINSTANCE32 hinstance )
 {
     CLASS * class;
 
-    if (hinstance != 0xffff) hinstance = GetExePtr(hinstance);
-
-      /* First search task-specific classes */
+    /* First search task-specific classes */
 
     for (class = firstClass; (class); class = class->next)
     {
@@ -308,8 +307,7 @@
 {
     ATOM atom;
     CLASS *classPtr;
-
-    HINSTANCE32 hInstance = (HINSTANCE32)GetExePtr( wc->hInstance );
+    HINSTANCE16 hInstance=GetExePtr(wc->hInstance);
 
     if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
     if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
@@ -347,11 +345,8 @@
     ATOM atom;
     CLASS *classPtr;
 
-    /* FIXME: this should not be necessary for Win32 */
-    HINSTANCE32 hInstance = (HINSTANCE32)GetExePtr( wc->hInstance );
-
     if (!(atom = GlobalAddAtom32A( wc->lpszClassName ))) return 0;
-    if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
+    if (!(classPtr = CLASS_RegisterClass( atom, wc->hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
                                           (WNDPROC16)wc->lpfnWndProc,
                                           WIN_PROC_32A )))
@@ -362,7 +357,7 @@
 
     dprintf_class( stddeb, "RegisterClass32A: atom=%04x wndproc=%08lx
 hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p name='%s'\n",
-                   atom, (DWORD)wc->lpfnWndProc, hInstance,
+                   atom, (DWORD)wc->lpfnWndProc, wc->hInstance,
                    wc->hbrBackground, wc->style, wc->cbClsExtra,
                    wc->cbWndExtra, classPtr,
                    HIWORD(wc->lpszClassName) ? wc->lpszClassName : "" );
@@ -384,11 +379,8 @@
     ATOM atom;
     CLASS *classPtr;
 
-    /* FIXME: this should not be necessary for Win32 */
-    HINSTANCE32 hInstance = (HINSTANCE32)GetExePtr( wc->hInstance );
-
     if (!(atom = GlobalAddAtom32W( wc->lpszClassName ))) return 0;
-    if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
+    if (!(classPtr = CLASS_RegisterClass( atom, wc->hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
                                           (WNDPROC16)wc->lpfnWndProc,
                                           WIN_PROC_32W )))
@@ -398,7 +390,7 @@
     }
 
     dprintf_class( stddeb, "RegisterClass32W: atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
-                   atom, (DWORD)wc->lpfnWndProc, hInstance,
+                   atom, (DWORD)wc->lpfnWndProc, wc->hInstance,
                    wc->hbrBackground, wc->style, wc->cbClsExtra,
                    wc->cbWndExtra, classPtr );
     
@@ -418,8 +410,7 @@
 {
     ATOM atom;
     CLASS *classPtr;
-
-    HINSTANCE32 hInstance = (HINSTANCE32)GetExePtr( wc->hInstance );
+    HINSTANCE16 hInstance = GetExePtr( wc->hInstance );
 
     if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
     if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
@@ -454,11 +445,8 @@
     ATOM atom;
     CLASS *classPtr;
 
-    /* FIXME: this should not be necessary for Win32 */
-    HINSTANCE32 hInstance = (HINSTANCE32)GetExePtr( wc->hInstance );
-
     if (!(atom = GlobalAddAtom32A( wc->lpszClassName ))) return 0;
-    if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
+    if (!(classPtr = CLASS_RegisterClass( atom, wc->hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
                                           (WNDPROC16)wc->lpfnWndProc,
                                           WIN_PROC_32A )))
@@ -468,7 +456,7 @@
     }
 
     dprintf_class( stddeb, "RegisterClassEx32A: atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
-                   atom, (DWORD)wc->lpfnWndProc, hInstance,
+                   atom, (DWORD)wc->lpfnWndProc, wc->hInstance,
                    wc->hbrBackground, wc->style, wc->cbClsExtra,
                    wc->cbWndExtra, classPtr );
     
@@ -489,11 +477,8 @@
     ATOM atom;
     CLASS *classPtr;
 
-    /* FIXME: this should not be necessary for Win32 */
-    HINSTANCE32 hInstance = (HINSTANCE32)GetExePtr( wc->hInstance );
-
     if (!(atom = GlobalAddAtom32W( wc->lpszClassName ))) return 0;
-    if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
+    if (!(classPtr = CLASS_RegisterClass( atom, wc->hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
                                           (WNDPROC16)wc->lpfnWndProc,
                                           WIN_PROC_32W )))
@@ -503,7 +488,7 @@
     }
 
     dprintf_class( stddeb, "RegisterClassEx32W: atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
-                   atom, (DWORD)wc->lpfnWndProc, hInstance,
+                   atom, (DWORD)wc->lpfnWndProc, wc->hInstance,
                    wc->hbrBackground, wc->style, wc->cbClsExtra,
                    wc->cbWndExtra, classPtr );
     
@@ -540,7 +525,6 @@
     CLASS *classPtr;
     ATOM atom;
 
-    hInstance = GetExePtr( hInstance );  /* FIXME: not needed in Win32 */
     if (!(atom = GlobalFindAtom32A( className ))) return FALSE;
     if (!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (classPtr->hInstance != hInstance)) return FALSE;
@@ -556,7 +540,6 @@
     CLASS *classPtr;
     ATOM atom;
 
-    hInstance = GetExePtr( hInstance );  /* FIXME: not needed in Win32 */
     if (!(atom = GlobalFindAtom32W( className ))) return FALSE;
     if (!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (classPtr->hInstance != hInstance)) return FALSE;
@@ -910,7 +893,6 @@
     ATOM atom;
     CLASS *classPtr;
 
-    hInstance = GetExePtr( hInstance );  /* FIXME: not needed in Win32 */
     if (!(atom = GlobalFindAtom32A( name )) ||
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
 	(classPtr->hInstance && (hInstance != classPtr->hInstance)))
@@ -940,7 +922,6 @@
     ATOM atom;
     CLASS *classPtr;
 
-    hInstance = GetExePtr( hInstance );  /* FIXME: not needed in Win32 */
     if (!(atom = GlobalFindAtom32W( name )) ||
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
 	(classPtr->hInstance && (hInstance != classPtr->hInstance)))
@@ -1003,7 +984,6 @@
     ATOM atom;
     CLASS *classPtr;
 
-    hInstance = GetExePtr( hInstance );  /* FIXME: not needed in Win32 */
     if (!(atom = GlobalFindAtom32A( name )) ||
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (hInstance != classPtr->hInstance)) return FALSE;
@@ -1032,7 +1012,6 @@
     ATOM atom;
     CLASS *classPtr;
 
-    hInstance = GetExePtr( hInstance );  /* FIXME: not needed in Win32 */
     if (!(atom = GlobalFindAtom32W( name )) ||
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (hInstance != classPtr->hInstance)) return FALSE;
diff --git a/windows/defwnd.c b/windows/defwnd.c
index a5b5af4..8a2a7b3 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -418,7 +418,7 @@
         break;
     }
 
-    SPY_ExitMessage( SPY_RESULT_OK16, hwnd, msg, result );
+    SPY_ExitMessage( SPY_RESULT_DEFWND16, hwnd, msg, result );
     return result;
 }
 
@@ -479,7 +479,7 @@
         break;
     }
 
-    SPY_ExitMessage( SPY_RESULT_OK32, hwnd, msg, result );
+    SPY_ExitMessage( SPY_RESULT_DEFWND32, hwnd, msg, result );
     return result;
 }
 
diff --git a/windows/dialog.c b/windows/dialog.c
index 21ef5b0..31cd880 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -486,11 +486,14 @@
 
       /* Load menu */
 
-    if (template.menuName)
-    {
-        LPSTR str = SEGPTR_STRDUP( template.menuName );  /* FIXME: win32 */
-        hMenu = LoadMenu16( hInst, SEGPTR_GET(str) );
-        SEGPTR_FREE( str );
+    if (template.menuName) {
+	if (!HIWORD(hInst)) /* win32 modules always have hiword set */
+        {
+            LPSTR str = SEGPTR_STRDUP( template.menuName );
+	    hMenu = LoadMenu16( hInst, SEGPTR_GET(str) );
+            SEGPTR_FREE( str );
+	} else /* win32 modules always have hiword set */
+	    hMenu = LoadMenu32A( hInst, template.menuName );
     }
 
       /* Create custom font if needed */
@@ -566,7 +569,7 @@
                                  rect.left, rect.top, rect.right, rect.bottom,
                                  owner, hMenu, hInst, NULL );
     else
-        hwnd = CreateWindowEx16(template.exStyle, template.className,
+        hwnd = CreateWindowEx32A(template.exStyle, template.className,
                                 template.caption, template.style & ~WS_VISIBLE,
                                 rect.left, rect.top, rect.right, rect.bottom,
                                 owner, hMenu, hInst, NULL );
@@ -602,12 +605,17 @@
     {
        /* Send initialisation messages and set focus */
 
-       dlgInfo->hwndFocus = GetNextDlgTabItem32( hwnd, 0, FALSE );
-       if (SendMessage32A( hwnd, WM_INITDIALOG,
-                           (WPARAM32)dlgInfo->hwndFocus, param ))
-           SetFocus32( dlgInfo->hwndFocus );
-       if (template.style & WS_VISIBLE) ShowWindow32( hwnd, SW_SHOW );
-       return hwnd;
+	dlgInfo->hwndFocus = GetNextDlgTabItem32( hwnd, 0, FALSE );
+
+	if (SendMessage32A( hwnd, WM_INITDIALOG, (WPARAM32)dlgInfo->hwndFocus, param ))
+            SetFocus32( dlgInfo->hwndFocus );
+
+	if (template.style & WS_VISIBLE && !(wndPtr->dwStyle & WS_VISIBLE)) 
+	{
+	   ShowWindow32( hwnd, SW_SHOWNORMAL );	/* SW_SHOW doesn't always work */
+	   UpdateWindow32( hwnd );
+	}
+	return hwnd;
     }
 
     if( IsWindow32(hwnd) ) DestroyWindow32( hwnd );
diff --git a/windows/event.c b/windows/event.c
index 541bd46..c843ec9 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -290,6 +290,25 @@
    while( XCheckWindowEvent(display, pWnd->window, NoEventMask, &xe) );
 }
 
+
+/***********************************************************************
+ *           IsUserIdle		(USER.333)
+ *
+ * Check if we have pending X events.
+ */
+BOOL16 WINAPI IsUserIdle(void)
+{
+    struct timeval timeout = {0, 0};
+    fd_set check_set;
+
+    FD_ZERO(&check_set);
+    FD_SET(__event_x_connection, &check_set);
+    if( select(__event_x_connection + 1, &check_set, NULL, NULL, &timeout) > 0 )
+	return TRUE;
+    return FALSE;
+}
+
+
 /***********************************************************************
  *           EVENT_WaitNetEvent
  *
diff --git a/windows/hook.c b/windows/hook.c
index 7166bad..55e5785 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -88,16 +88,18 @@
 
 	case WH_CALLWNDPROC:
 	{
-	    INT32	(*localMap)(UINT16, WPARAM16, UINT32*, WPARAM32*, LPARAM*)
-			  = (bA) ? WINPROC_MapMsg16To32A : WINPROC_MapMsg16To32W;
 	    LPCWPSTRUCT16   lpcwp16 = PTR_SEG_TO_LIN(*plParam);
 	    LPCWPSTRUCT32   lpcwp32 = HeapAlloc( SystemHeap, 0, sizeof(*lpcwp32) );
 	    
 	    lpcwp32->hwnd = lpcwp16->hwnd;
 	    lpcwp32->lParam = lpcwp16->lParam;
 	    
-	    (*localMap)(lpcwp16->message, lpcwp16->wParam, 
-		       &lpcwp32->message, &lpcwp32->wParam, &lpcwp32->lParam );
+            if (bA) WINPROC_MapMsg16To32A( lpcwp16->message, lpcwp16->wParam, 
+                                           &lpcwp32->message, &lpcwp32->wParam,
+                                           &lpcwp32->lParam );
+            else WINPROC_MapMsg16To32W( lpcwp16->message, lpcwp16->wParam, 
+                                        &lpcwp32->message, &lpcwp32->wParam,
+                                        &lpcwp32->lParam );
 	    break;
 	}
 
@@ -264,11 +266,11 @@
 
 	case WH_CALLWNDPROC:
 	{
-            void          (*localUnMap)(UINT32, WPARAM32, LPARAM)
-                            = (bA) ? WINPROC_UnmapMsg16To32A : WINPROC_UnmapMsg16To32W;
             LPCWPSTRUCT32   lpcwp32 = (LPCWPSTRUCT32)lParam;
-
-            (*localUnMap)(lpcwp32->message, lpcwp32->wParam, lpcwp32->lParam );
+            if (bA) WINPROC_UnmapMsg16To32A( lpcwp32->message, lpcwp32->wParam,
+                                             lpcwp32->lParam );
+            else WINPROC_UnmapMsg16To32W( lpcwp32->message, lpcwp32->wParam,
+                                          lpcwp32->lParam );
 	    HeapFree( SystemHeap, 0, lpcwp32 );
             break;
 	}
@@ -392,16 +394,18 @@
 
       case WH_CALLWNDPROC:
       {
-          INT32       (*localMap)(UINT32, WPARAM32, UINT16*, WPARAM16*, LPARAM*)
-                          = (bA) ? WINPROC_MapMsg32ATo16 : WINPROC_MapMsg32WTo16;
           LPCWPSTRUCT32   lpcwp32 = (LPCWPSTRUCT32)*plParam;
 	  LPCWPSTRUCT16   lpcwp16 = SEGPTR_NEW( CWPSTRUCT16 );
 
           lpcwp16->hwnd = lpcwp32->hwnd;
           lpcwp16->lParam = lpcwp32->lParam;
 
-         (*localMap)(lpcwp32->message, lpcwp32->wParam,
-                    &lpcwp16->message, &lpcwp16->wParam, &lpcwp16->lParam );
+          if (bA) WINPROC_MapMsg32ATo16( lpcwp32->message, lpcwp32->wParam,
+                                         &lpcwp16->message, &lpcwp16->wParam,
+                                         &lpcwp16->lParam );
+          else WINPROC_MapMsg32WTo16( lpcwp32->message, lpcwp32->wParam,
+                                      &lpcwp16->message, &lpcwp16->wParam,
+                                      &lpcwp16->lParam );
 	  *plParam = (LPARAM)SEGPTR_GET( lpcwp16 );
           break;
       }
@@ -575,13 +579,14 @@
 
       case WH_CALLWNDPROC:
       {
-          void          (*localUnMap)(UINT32, WPARAM32, LPARAM, MSGPARAM16* )
-                          = (bA) ? WINPROC_UnmapMsg32ATo16 : WINPROC_UnmapMsg32WTo16;
           LPCWPSTRUCT16   lpcwp16 = (LPCWPSTRUCT16)PTR_SEG_TO_LIN(lParam);
 	  LPCWPSTRUCT32   lpcwp32 = (LPCWPSTRUCT32)lParamOrig;
 	  MSGPARAM16	  mp16 = { lpcwp16->wParam, lpcwp16->lParam, 0 };
 
-          (*localUnMap)(lpcwp32->message, lpcwp32->wParam, lpcwp32->lParam, &mp16 );
+          if (bA) WINPROC_UnmapMsg32ATo16( lpcwp32->message, lpcwp32->wParam,
+                                           lpcwp32->lParam, &mp16 );
+          else WINPROC_UnmapMsg32WTo16( lpcwp32->message, lpcwp32->wParam,
+                                        lpcwp32->lParam, &mp16 );
 	  SEGPTR_FREE( PTR_SEG_TO_LIN(lParam) );
           break;
       }
@@ -691,6 +696,7 @@
 	}
 	else
 	  lpcbtcwW->lpcs->lpszClass = (LPCWSTR)lpcbtcwA->lpcs->lpszClass;
+	*plParam = lpcbtcwW;
     }
     return;
 }
@@ -744,6 +750,7 @@
                                                    lpcbtcwW->lpcs->lpszClass );
 	else
 	  lpcbtcwA->lpcs->lpszClass = (LPSTR)lpcbtcwW->lpcs->lpszClass;
+	*plParam = lpcbtcwA;
     }
     return;
 }
@@ -840,11 +847,13 @@
     HQUEUE16 hQueue = 0;
 
     if ((id < WH_MINHOOK) || (id > WH_MAXHOOK)) return 0;
-    if (!(hInst = GetExePtr( hInst ))) return 0;
 
     dprintf_hook( stddeb, "Setting hook %d: %08x %04x %04x\n",
                   id, (UINT32)proc, hInst, hTask );
 
+    if (!hInst && (type!=HOOK_WIN16))
+    	hInst = GetModuleHandle32A(NULL);/*FIXME: correct? probably not */
+
     if (id == WH_JOURNALPLAYBACK) EnableHardwareInput(FALSE);
 
     if (hTask)  /* Task-specific hook */
@@ -1176,7 +1185,7 @@
 	return 0;
     }
 
-    handle = HOOK_SetHook( id, proc, HOOK_WIN16, hInst, hTask );
+    handle = HOOK_SetHook( id, proc, HOOK_WIN16, GetExePtr(hInst), hTask );
     return (handle) ? (FARPROC16)MAKELONG( handle, HOOK_MAGIC ) : NULL;
 }
 
@@ -1221,7 +1230,7 @@
 HHOOK WINAPI SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
                                  HTASK16 hTask )
 {
-    HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN16, hInst, hTask );
+    HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN16, GetExePtr(hInst), hTask );
     return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : (HHOOK)NULL;
 }
 
diff --git a/windows/keyboard.c b/windows/keyboard.c
index be31d59..9421737 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -1184,9 +1184,21 @@
 /***********************************************************************
  *           GetKeyboardLayout			(USER32.249)
  */
-/*HKL*/ HANDLE32 WINAPI GetKeyboardLayout(DWORD dwLayout)
+HKL32 WINAPI GetKeyboardLayout(DWORD dwLayout)
 {
 	fprintf(stderr,"GetKeyboardLayout(%ld),STUB!\n",dwLayout);
-	return 0;
+	return (0xcafe<<16)|GetSystemDefaultLCID(); /* FIXME */
+}
+
+/***********************************************************************
+ *           GetKeyboardLayoutList		(USER32.250)
+ * FIXME
+ */
+INT32 WINAPI GetKeyboardLayoutList(INT32 nBuff,HKL32 *layouts)
+{
+	fprintf(stderr,"GetKeyboardLayoutList(%d,%p),STUB!\n",nBuff,layouts);
+	if (layouts)
+		layouts[0] = GetKeyboardLayout(0);
+	return 1;
 }
 
diff --git a/windows/mdi.c b/windows/mdi.c
index fe881b9..3fd4b95 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -32,7 +32,6 @@
 
 #define MDIF_NEEDUPDATE		0x0001
 
-
 static HBITMAP16 hBmpClose   = 0;
 static HBITMAP16 hBmpRestore = 0;
 
@@ -59,12 +58,12 @@
 
 static void MDI_PostUpdate(HWND16 hwnd, MDICLIENTINFO* ci, WORD recalc)
 {
- if( !(ci->mdiFlags & MDIF_NEEDUPDATE) )
-   {
-      ci->mdiFlags |= MDIF_NEEDUPDATE;
-      PostMessage16( hwnd, WM_MDICALCCHILDSCROLL, 0, 0);
-   }
- ci->sbRecalc = recalc;
+    if( !(ci->mdiFlags & MDIF_NEEDUPDATE) )
+    {
+	ci->mdiFlags |= MDIF_NEEDUPDATE;
+	PostMessage16( hwnd, WM_MDICALCCHILDSCROLL, 0, 0);
+    }
+    ci->sbRecalc = recalc;
 }
 
 /**********************************************************************
@@ -92,22 +91,22 @@
  */
 static BOOL32 MDI_MenuModifyItem(WND* clientWnd, HWND16 hWndChild )
 {
- char            buffer[128];
- MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
- WND            *wndPtr     = WIN_FindWndPtr(hWndChild);
- UINT32		 n          = sprintf(buffer, "%d ",
-                              wndPtr->wIDmenu - clientInfo->idFirstChild + 1);
- BOOL32		 bRet	    = 0;
+    char            buffer[128];
+    MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
+    WND            *wndPtr     = WIN_FindWndPtr(hWndChild);
+    UINT32	    n          = sprintf(buffer, "%d ",
+				 wndPtr->wIDmenu - clientInfo->idFirstChild + 1);
+    BOOL32	    bRet	    = 0;
 
- if( !clientInfo->hWindowMenu ) return 0;
+    if( !clientInfo->hWindowMenu ) return 0;
 
- if (wndPtr->text) lstrcpyn32A(buffer + n, wndPtr->text, sizeof(buffer) - n );
+    if (wndPtr->text) lstrcpyn32A(buffer + n, wndPtr->text, sizeof(buffer) - n );
 
- n    = GetMenuState32(clientInfo->hWindowMenu,wndPtr->wIDmenu ,MF_BYCOMMAND); 
- bRet = ModifyMenu32A(clientInfo->hWindowMenu , wndPtr->wIDmenu, 
+    n    = GetMenuState32(clientInfo->hWindowMenu,wndPtr->wIDmenu ,MF_BYCOMMAND); 
+    bRet = ModifyMenu32A(clientInfo->hWindowMenu , wndPtr->wIDmenu, 
                       MF_BYCOMMAND | MF_STRING, wndPtr->wIDmenu, buffer );
- CheckMenuItem32(clientInfo->hWindowMenu ,wndPtr->wIDmenu , n & MF_CHECKED);
- return bRet;
+    CheckMenuItem32(clientInfo->hWindowMenu ,wndPtr->wIDmenu , n & MF_CHECKED);
+    return bRet;
 }
 
 /**********************************************************************
@@ -115,29 +114,29 @@
  */
 static BOOL32 MDI_MenuDeleteItem(WND* clientWnd, HWND16 hWndChild )
 {
- char    	 buffer[128];
- MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
- WND    	*wndPtr     = WIN_FindWndPtr(hWndChild);
- UINT32		 index      = 0,id,n;
+    char    	 buffer[128];
+    MDICLIENTINFO *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
+    WND    	*wndPtr     = WIN_FindWndPtr(hWndChild);
+    UINT32	 index      = 0,id,n;
 
- if( !clientInfo->nActiveChildren ||
-     !clientInfo->hWindowMenu ) return 0;
+    if( !clientInfo->nActiveChildren ||
+	!clientInfo->hWindowMenu ) return 0;
 
- id = wndPtr->wIDmenu;
- DeleteMenu32(clientInfo->hWindowMenu,id,MF_BYCOMMAND);
+    id = wndPtr->wIDmenu;
+    DeleteMenu32(clientInfo->hWindowMenu,id,MF_BYCOMMAND);
 
  /* walk the rest of MDI children to prevent gaps in the id 
   * sequence and in the menu child list */
 
- for( index = id+1; index <= clientInfo->nActiveChildren + 
-                             clientInfo->idFirstChild; index++ )
+    for( index = id+1; index <= clientInfo->nActiveChildren + 
+				clientInfo->idFirstChild; index++ )
     {
 	wndPtr = WIN_FindWndPtr(MDI_GetChildByID(clientWnd,index));
 	if( !wndPtr )
-	     {
+	{
 	      dprintf_mdi(stddeb,"MDIMenuDeleteItem: no window for id=%i\n",index);
 	      continue;
-    }
+	}
     
 	/* set correct id */
 	wndPtr->wIDmenu--;
@@ -150,40 +149,34 @@
 	ModifyMenu32A(clientInfo->hWindowMenu ,index ,MF_BYCOMMAND | MF_STRING,
                       index - 1 , buffer ); 
     }
- return 1;
+    return 1;
 }
 
 /**********************************************************************
  * 			MDI_GetWindow
  *
- * returns "activateable" child  or zero
+ * returns "activateable" child different from the current or zero
  */
-static HWND16 MDI_GetWindow(WND  *clientWnd, HWND16 hWnd, WORD wTo )
+static HWND16 MDI_GetWindow(WND *clientWnd, HWND16 hWnd, BOOL16 bNext, DWORD dwStyleMask )
 {
     MDICLIENTINFO *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
-    WND *wndPtr, *pWnd, *pWndLast;
+    WND *wndPtr, *pWnd, *pWndLast = NULL;
     
+    dwStyleMask |= WS_DISABLED | WS_VISIBLE;
     if( !hWnd ) hWnd = clientInfo->hwndActiveChild;
 
     if( !(wndPtr = WIN_FindWndPtr(hWnd)) ) return 0;
 
-    pWnd = wndPtr;
-    pWndLast = NULL;
-    for (;;)
+    for ( pWnd = wndPtr->next; ; pWnd = pWnd->next )
     {
-        pWnd = pWnd->next;
-        if (!pWnd) pWnd = wndPtr->parent->child;
-        if (pWnd == wndPtr)  /* not found */
-        {
-            if (!wTo || !pWndLast) return 0;
-            break;
-        }
+        if (!pWnd ) pWnd = wndPtr->parent->child;
 
-        if ( !pWnd->owner && (pWnd->dwStyle & 
-			     (WS_VISIBLE | WS_DISABLED)) == WS_VISIBLE )
+        if ( pWnd == wndPtr ) break; /* went full circle */
+
+        if (!pWnd->owner && (pWnd->dwStyle & dwStyleMask) == WS_VISIBLE )
         {
-            pWndLast = pWnd;
-            if (!wTo) break;
+	    pWndLast = pWnd;
+	    if ( bNext ) break;
         }
     }
     return pWndLast ? pWndLast->hwndSelf : 0;
@@ -192,23 +185,23 @@
 /**********************************************************************
  *			MDI_CalcDefaultChildPos
  *
- *  It seems that default height is 2/3 of client rect
+ *  It seems that the default height is about 2/3 of the client rect
  */
 static void MDI_CalcDefaultChildPos( WND* w, WORD n, LPPOINT16 lpPos,
                                      INT32 delta)
 {
- RECT32 rect = w->rectClient;
- INT32  spacing = GetSystemMetrics32(SM_CYCAPTION) +
-                  GetSystemMetrics32(SM_CYFRAME) - 1; 
- INT32  nstagger;
+    INT32  nstagger;
+    RECT32 rect = w->rectClient;
+    INT32  spacing = GetSystemMetrics32(SM_CYCAPTION) +
+		     GetSystemMetrics32(SM_CYFRAME) - 1; 
 
- if( rect.bottom - rect.top - delta >= spacing ) 
-     rect.bottom -= delta;
+    if( rect.bottom - rect.top - delta >= spacing ) 
+	rect.bottom -= delta;
 
- nstagger = (rect.bottom - rect.top)/(3*spacing);
- lpPos[1].x = (rect.right - rect.left - nstagger*spacing);
- lpPos[1].y = (rect.bottom - rect.top - nstagger*spacing);
- lpPos[0].x = lpPos[0].y = spacing*(n%(nstagger+1));
+    nstagger = (rect.bottom - rect.top)/(3 * spacing);
+    lpPos[1].x = (rect.right - rect.left - nstagger * spacing);
+    lpPos[1].y = (rect.bottom - rect.top - nstagger * spacing);
+    lpPos[0].x = lpPos[0].y = spacing * (n%(nstagger+1));
 }
 
 /**********************************************************************
@@ -226,7 +219,7 @@
     ci = (MDICLIENTINFO *) w->wExtra;
 
     if (!fRefresh) 
-       {
+    {
 	HWND16 hwndFrame = GetParent16(hwnd);
 	HMENU32 oldFrameMenu = GetMenu32(hwndFrame);
         
@@ -234,7 +227,7 @@
 	    MDI_RestoreFrameMenu(w->parent, ci->hwndChildMaximized );
 
 	if( hmenuWindow && hmenuWindow!=ci->hWindowMenu )
-	  {
+	{
 	    /* delete menu items from ci->hWindowMenu 
 	     * and add them to hmenuWindow */
 
@@ -244,13 +237,13 @@
             AppendMenu32A( hmenuWindow, MF_SEPARATOR, 0, NULL);
 
 	    if( ci->nActiveChildren )
-	      {
+	    {
 	        INT32 j = i - ci->nActiveChildren + 1;
 		char buffer[100];
 		UINT32 id,state;
 
 		for( ; i >= j ; i-- )
-		   {
+		{
 		     id = GetMenuItemID32(ci->hWindowMenu,i );
 		     state = GetMenuState32(ci->hWindowMenu,i,MF_BYPOSITION); 
 
@@ -260,24 +253,24 @@
 		     InsertMenu32A(hmenuWindow, pos, MF_BYPOSITION | MF_STRING,
 					     id, buffer);
 		     CheckMenuItem32(hmenuWindow ,pos , MF_BYPOSITION | (state & MF_CHECKED));
-		   }
-	      }
+		}
+	    }
 
 	    /* remove separator */
 	    DeleteMenu32(ci->hWindowMenu, i, MF_BYPOSITION); 
 
 	    ci->hWindowMenu = hmenuWindow;
-	  } 
+	} 
 
 	if( hmenuFrame && hmenuFrame!=oldFrameMenu)
-	  {
+	{
 	    SetMenu32(hwndFrame, hmenuFrame);
 	    if( ci->hwndChildMaximized )
 	        MDI_AugmentFrameMenu(ci, w->parent, ci->hwndChildMaximized );
 	    return oldFrameMenu;
-	  }
+	}
 
-       }
+    }
     return 0;
 }
 
@@ -319,21 +312,21 @@
         cs->cy = pos[1].y;
 
     if( cs->x == CW_USEDEFAULT16 )
-      {
+    {
  	cs->x = pos[0].x;
 	cs->y = pos[0].y;
-      }
+    }
 
     /* restore current maximized child */
     if( style & WS_VISIBLE && ci->hwndChildMaximized )
-      {
+    {
 	if( style & WS_MAXIMIZE )
-	  SendMessage16(w->hwndSelf, WM_SETREDRAW, FALSE, 0L );
+	    SendMessage16(w->hwndSelf, WM_SETREDRAW, FALSE, 0L );
 	hwndMax = ci->hwndChildMaximized;
 	ShowWindow16( hwndMax, SW_SHOWNOACTIVATE );
 	if( style & WS_MAXIMIZE )
-	  SendMessage16(w->hwndSelf, WM_SETREDRAW, TRUE, 0L );
-      }
+	    SendMessage16(w->hwndSelf, WM_SETREDRAW, TRUE, 0L );
+    }
 
     /* this menu is needed to set a check mark in MDI_ChildActivate */
     AppendMenu32A(ci->hWindowMenu ,MF_STRING ,wIDmenu, lpstrDef );
@@ -342,11 +335,11 @@
 
     /* fix window style */
     if( !(w->dwStyle & MDIS_ALLCHILDSTYLES) )
-      {
+    {
         style &= (WS_CHILD | WS_CLIPSIBLINGS | WS_MINIMIZE | WS_MAXIMIZE |
                   WS_CLIPCHILDREN | WS_DISABLED | WS_VSCROLL | WS_HSCROLL );
         style |= (WS_VISIBLE | WS_OVERLAPPEDWINDOW);
-      }
+    }
 
     hwnd = CreateWindow16( (LPCSTR)PTR_SEG_TO_LIN(cs->szClass),
                            (LPCSTR)PTR_SEG_TO_LIN(cs->szTitle), style, 
@@ -364,20 +357,20 @@
 	if( wnd->dwStyle & WS_MINIMIZE && ci->hwndActiveChild )
 	    ShowWindow16( hwnd, SW_SHOWMINNOACTIVE );
 	else
-	  {
+	{
 	    SetWindowPos32( hwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );
 
 	    /* Set maximized state here in case hwnd didn't receive WM_SIZE
 	     * during CreateWindow - bad!
 	     */
 
-            if( wnd->dwStyle & WS_MAXIMIZE && !ci->hwndChildMaximized )
-              {
+            if((wnd->dwStyle & WS_MAXIMIZE) && !ci->hwndChildMaximized )
+            {
                 ci->hwndChildMaximized = wnd->hwndSelf;
                 MDI_AugmentFrameMenu( ci, w->parent, hwnd );
                 MDI_UpdateFrameText( w->parent, ci->self, MDI_REPAINTFRAME, NULL ); 
-	      }
-	  }
+	    }
+	}
         dprintf_mdi(stddeb, "MDICreateChild: created child - %04x\n",hwnd);
     }
     else
@@ -393,77 +386,73 @@
 
 /**********************************************************************
  *			MDI_ChildGetMinMaxInfo
+ *
+ * Note: The rule here is that client rect of the maximized MDI child 
+ *	 is equal to the client rect of the MDI client window.
  */
 static void MDI_ChildGetMinMaxInfo( WND* clientWnd, HWND16 hwnd,
                                     MINMAXINFO16* lpMinMax )
 {
- WND*	childWnd = WIN_FindWndPtr(hwnd);
- RECT32	rect 	 = clientWnd->rectClient;
+    WND*	childWnd = WIN_FindWndPtr(hwnd);
+    RECT32	rect 	 = clientWnd->rectClient;
 
- MapWindowPoints32(clientWnd->parent->hwndSelf, 
-                   ((MDICLIENTINFO*)clientWnd->wExtra)->self,
-                   (LPPOINT32)&rect, 2);
- AdjustWindowRectEx32( &rect, childWnd->dwStyle, 0, childWnd->dwExStyle );
+    MapWindowPoints32( clientWnd->parent->hwndSelf, 
+		     ((MDICLIENTINFO*)clientWnd->wExtra)->self, (LPPOINT32)&rect, 2);
+    AdjustWindowRectEx32( &rect, childWnd->dwStyle, 0, childWnd->dwExStyle );
 
- lpMinMax->ptMaxSize.x = rect.right -= rect.left;
- lpMinMax->ptMaxSize.y = rect.bottom -= rect.top;
+    lpMinMax->ptMaxSize.x = rect.right -= rect.left;
+    lpMinMax->ptMaxSize.y = rect.bottom -= rect.top;
 
- lpMinMax->ptMaxPosition.x = rect.left;
- lpMinMax->ptMaxPosition.y = rect.top; 
+    lpMinMax->ptMaxPosition.x = rect.left;
+    lpMinMax->ptMaxPosition.y = rect.top; 
 
- dprintf_mdi(stddeb,"\tChildMinMaxInfo: max rect (%i,%i - %i, %i)\n", 
+    dprintf_mdi(stddeb,"\tChildMinMaxInfo: max rect (%i,%i - %i, %i)\n", 
                         rect.left,rect.top,rect.right,rect.bottom);
-
 }
 
 /**********************************************************************
  *			MDI_SwitchActiveChild
  * 
- * Notes: SetWindowPos sends WM_CHILDACTIVATE to the child window that is
- *        being activated 
- *
- *	  wTo is basically lParam of WM_MDINEXT message or explicit 
- *        window handle
+ * Note: SetWindowPos sends WM_CHILDACTIVATE to the child window that is
+ *       being activated 
  */
 static void MDI_SwitchActiveChild( HWND16 clientHwnd, HWND16 childHwnd,
-                                   BOOL32 wTo )
+                                   BOOL32 bNextWindow )
 {
     WND		  *w	     = WIN_FindWndPtr(clientHwnd);
     HWND16	   hwndTo    = 0;
     HWND16	   hwndPrev  = 0;
     MDICLIENTINFO *ci;
 
-    hwndTo = MDI_GetWindow(w,childHwnd,(WORD)wTo);
+    hwndTo = MDI_GetWindow(w, childHwnd, bNextWindow, 0);
  
     ci = (MDICLIENTINFO *) w->wExtra;
 
     dprintf_mdi(stddeb, "MDI_SwitchActiveChild: from %04x, to %04x\n",childHwnd,hwndTo);
 
-    if ( !hwndTo ) return; 
+    if ( !hwndTo ) return; /* no window to switch to */
 
     hwndPrev = ci->hwndActiveChild;
 
     if ( hwndTo != hwndPrev )
+    {
+	BOOL32 bOptimize = 0;
+
+	if( ci->hwndChildMaximized )
 	{
-	  BOOL32 bOptimize = 0;
-
-	  if( ci->hwndChildMaximized )
-	    {
-	      bOptimize = 1; 
-	      w->dwStyle &= ~WS_VISIBLE;
-	    }
-
-	  SetWindowPos32( hwndTo, HWND_TOP, 0, 0, 0, 0, 
-			SWP_NOMOVE | SWP_NOSIZE );
-	  if( !wTo && hwndPrev )
-	    {
-	       SetWindowPos32( hwndPrev, HWND_BOTTOM, 0, 0, 0, 0, 
-		  	     SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
-	    }
-
-	  if( bOptimize )
-	       ShowWindow16( clientHwnd, SW_SHOW );
+	    bOptimize = 1; 
+	    w->dwStyle &= ~WS_VISIBLE;
 	}
+
+	SetWindowPos32( hwndTo, HWND_TOP, 0, 0, 0, 0, 
+			SWP_NOMOVE | SWP_NOSIZE );
+
+	if( bNextWindow && hwndPrev )
+	    SetWindowPos32( hwndPrev, HWND_BOTTOM, 0, 0, 0, 0, 
+		  	    SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE );
+	if( bOptimize )
+	    ShowWindow16( clientHwnd, SW_SHOW );
+    }
 }
 
 	    
@@ -478,21 +467,21 @@
     if( childPtr )
     {
         if( child == ci->hwndActiveChild )
-          {
-	    MDI_SwitchActiveChild(parent,child,0);
+        {
+	    MDI_SwitchActiveChild(parent, child, TRUE);
 
 	    if( child == ci->hwndActiveChild )
-	      {
+	    {
 		ShowWindow16( child, SW_HIDE);
 		if( child == ci->hwndChildMaximized )
-		  {
+		{
 		    MDI_RestoreFrameMenu(w_parent->parent, child);
 		    ci->hwndChildMaximized = 0;
 		    MDI_UpdateFrameText(w_parent->parent,parent,TRUE,NULL);
-		  }
+		}
 
-                MDI_ChildActivate(w_parent,0);
-	      }
+                MDI_ChildActivate(w_parent, 0);
+	    }
 	    MDI_MenuDeleteItem(w_parent, child);
 	}
 	
@@ -501,10 +490,10 @@
         dprintf_mdi(stddeb,"MDIDestroyChild: child destroyed - %04x\n",child);
 
         if (flagDestroy)
-	   {
+	{
 	    MDI_PostUpdate(GetParent16(child), ci, SB_BOTH+1);
             DestroyWindow32(child);
-	   }
+	}
     }
 
     return 0;
@@ -552,16 +541,16 @@
        	if( clientInfo->hWindowMenu )
        	        CheckMenuItem32( clientInfo->hWindowMenu,
                                  wndPrev->wIDmenu, 0);
-      }
+    }
 
     /* set appearance */
     if( clientInfo->hwndChildMaximized )
       if( clientInfo->hwndChildMaximized != hWndChild )
         if( hWndChild )
-	        {
+	{
 		  clientInfo->hwndActiveChild = hWndChild;
 		  ShowWindow16( hWndChild, SW_SHOWMAXIMIZED);
-	        }
+	}
 	else
 		ShowWindow16( clientInfo->hwndActiveChild, 
 			    SW_SHOWNORMAL );
@@ -570,11 +559,11 @@
 
     /* check if we have any children left */
     if( !hWndChild )
-	{
-	    if( isActiveFrameWnd )
-		SetFocus32( clientInfo->self );
-	    return 0;
-	}
+    {
+	if( isActiveFrameWnd )
+	    SetFocus32( clientInfo->self );
+	return 0;
+    }
 	
     /* check menu item */
     if( clientInfo->hWindowMenu )
@@ -585,7 +574,7 @@
     SetWindowPos32( hWndChild, 0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
 
     if( isActiveFrameWnd )
-	  {
+    {
 	    SendMessage16( hWndChild, WM_NCACTIVATE, TRUE, 0L);
 	    if( GetFocus32() == clientInfo->self )
 		SendMessage16( clientInfo->self, WM_SETFOCUS, 
@@ -767,39 +756,42 @@
 static BOOL32 MDI_AugmentFrameMenu( MDICLIENTINFO* ci, WND *frame,
                                     HWND16 hChild )
 {
- WND*		child = WIN_FindWndPtr(hChild);
- HMENU16  	hSysPopup = 0;
+    WND*	child = WIN_FindWndPtr(hChild);
+    HMENU16  	hSysPopup = 0;
 
- dprintf_mdi(stddeb,"MDI_AugmentFrameMenu: frame %p,child %04x\n",frame,hChild);
+    dprintf_mdi(stddeb,"MDI_AugmentFrameMenu: frame %p,child %04x\n",frame,hChild);
 
- if( !frame->wIDmenu || !child->hSysMenu ) return 0; 
+    if( !frame->wIDmenu || !child->hSysMenu ) return 0; 
 
- /* create a copy of sysmenu popup and insert it into frame menu bar */
+    /* create a copy of sysmenu popup and insert it into frame menu bar */
 
- if (!(hSysPopup = LoadMenuIndirect32A(SYSRES_GetResPtr(SYSRES_MENU_SYSMENU))))
-     return 0;
+    if (!(hSysPopup = LoadMenuIndirect32A(SYSRES_GetResPtr(SYSRES_MENU_SYSMENU))))
+	return 0;
  
- dprintf_mdi(stddeb,"\t\tgot popup %04x\n in sysmenu %04x",hSysPopup,child->hSysMenu);
+    dprintf_mdi(stddeb,"\t\tgot popup %04x\n in sysmenu %04x",hSysPopup,child->hSysMenu);
  
- if( !InsertMenu32A(frame->wIDmenu,0,MF_BYPOSITION | MF_BITMAP | MF_POPUP,
+    if( !InsertMenu32A(frame->wIDmenu,0,MF_BYPOSITION | MF_BITMAP | MF_POPUP,
                     hSysPopup, (LPSTR)(DWORD)hBmpClose ))
-   {  DestroyMenu32(hSysPopup); return 0; }
+    {  
+	DestroyMenu32(hSysPopup); 
+	return 0; 
+    }
 
- if( !AppendMenu32A(frame->wIDmenu,MF_HELP | MF_BITMAP,
+    if( !AppendMenu32A(frame->wIDmenu,MF_HELP | MF_BITMAP,
                     SC_RESTORE, (LPSTR)(DWORD)hBmpRestore ))
-   {
-      RemoveMenu32(frame->wIDmenu,0,MF_BYPOSITION);
-      return 0;
-   }
+    {
+	RemoveMenu32(frame->wIDmenu,0,MF_BYPOSITION);
+	return 0;
+    }
 
- EnableMenuItem32(hSysPopup, SC_SIZE, MF_BYCOMMAND | MF_GRAYED);
- EnableMenuItem32(hSysPopup, SC_MOVE, MF_BYCOMMAND | MF_GRAYED);
- EnableMenuItem32(hSysPopup, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED);
+    EnableMenuItem32(hSysPopup, SC_SIZE, MF_BYCOMMAND | MF_GRAYED);
+    EnableMenuItem32(hSysPopup, SC_MOVE, MF_BYCOMMAND | MF_GRAYED);
+    EnableMenuItem32(hSysPopup, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED);
 
- /* redraw menu */
- DrawMenuBar32(frame->hwndSelf);
+    /* redraw menu */
+    DrawMenuBar32(frame->hwndSelf);
 
- return 1;
+    return 1;
 }
 
 /**********************************************************************
@@ -807,20 +799,19 @@
  */
 static BOOL32 MDI_RestoreFrameMenu( WND *frameWnd, HWND16 hChild )
 {
- INT32 nItems = GetMenuItemCount32(frameWnd->wIDmenu) - 1;
+    INT32 nItems = GetMenuItemCount32(frameWnd->wIDmenu) - 1;
 
- dprintf_mdi(stddeb,"MDI_RestoreFrameMenu: for child %04x\n",hChild);
+    dprintf_mdi(stddeb,"MDI_RestoreFrameMenu: for child %04x\n",hChild);
 
- if( GetMenuItemID32(frameWnd->wIDmenu,nItems) != SC_RESTORE )
-     return 0; 
+    if( GetMenuItemID32(frameWnd->wIDmenu,nItems) != SC_RESTORE )
+	return 0; 
 
+    RemoveMenu32(frameWnd->wIDmenu,0,MF_BYPOSITION);
+    DeleteMenu32(frameWnd->wIDmenu,nItems-1,MF_BYPOSITION);
 
- RemoveMenu32(frameWnd->wIDmenu,0,MF_BYPOSITION);
- DeleteMenu32(frameWnd->wIDmenu,nItems-1,MF_BYPOSITION);
+    DrawMenuBar32(frameWnd->hwndSelf);
 
- DrawMenuBar32(frameWnd->hwndSelf);
-
- return 1;
+    return 1;
 }
 
 /**********************************************************************
@@ -833,65 +824,63 @@
 static void MDI_UpdateFrameText( WND *frameWnd, HWND16 hClient,
                                  BOOL32 repaint, LPCSTR lpTitle )
 {
- char   lpBuffer[MDI_MAXTITLELENGTH+1];
- WND* 	clientWnd = WIN_FindWndPtr(hClient);
+    char   lpBuffer[MDI_MAXTITLELENGTH+1];
+    WND*   clientWnd = WIN_FindWndPtr(hClient);
+    MDICLIENTINFO *ci = (MDICLIENTINFO *) clientWnd->wExtra;
 
- MDICLIENTINFO *ci = (MDICLIENTINFO *) clientWnd->wExtra;
+    dprintf_mdi(stddeb, "MDI: repaint %i, frameText %s\n", repaint, (lpTitle)?lpTitle:"NULL");
 
- dprintf_mdi(stddeb, "MDI: repaint %i, frameText %s\n", repaint, (lpTitle)?lpTitle:"NULL");
+    /* store new "default" title if lpTitle is not NULL */
+    if (lpTitle) 
+    {
+	if (ci->frameTitle) HeapFree( SystemHeap, 0, ci->frameTitle );
+	ci->frameTitle = HEAP_strdupA( SystemHeap, 0, lpTitle );
+    }
 
- /* store new "default" title if lpTitle is not NULL */
- if (lpTitle) 
- {
-     if (ci->frameTitle) HeapFree( SystemHeap, 0, ci->frameTitle );
-     ci->frameTitle = HEAP_strdupA( SystemHeap, 0, lpTitle );
- }
+    if (ci->frameTitle)
+    {
+	WND* childWnd = WIN_FindWndPtr( ci->hwndChildMaximized );     
 
- if (ci->frameTitle)
-   {
-     WND* childWnd = WIN_FindWndPtr( ci->hwndChildMaximized );     
+	if( childWnd && childWnd->text )
+	{
+	    /* combine frame title and child title if possible */
 
-     if( childWnd && childWnd->text )
-       {
-	 /* combine frame title and child title if possible */
+	    LPCSTR lpBracket  = " - [";
+	    int	i_frame_text_length = strlen(ci->frameTitle);
+	    int	i_child_text_length = strlen(childWnd->text);
 
-	 LPCSTR lpBracket  = " - [";
-	 int	i_frame_text_length = strlen(ci->frameTitle);
-	 int    i_child_text_length = strlen(childWnd->text);
+	    lstrcpyn32A( lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH);
 
-	 lstrcpyn32A( lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH);
+	    if( i_frame_text_length + 6 < MDI_MAXTITLELENGTH )
+            {
+		strcat( lpBuffer, lpBracket );
 
-	 if( i_frame_text_length + 6 < MDI_MAXTITLELENGTH )
-         {
-	     strcat( lpBuffer, lpBracket );
-
-	     if( i_frame_text_length + i_child_text_length + 6 < MDI_MAXTITLELENGTH )
-             {
-                 strcat( lpBuffer, childWnd->text );
-                 strcat( lpBuffer, "]" );
-             }
-	     else
-             {
-                 lstrcpyn32A( lpBuffer + i_frame_text_length + 4, 
-                              childWnd->text,
-                              MDI_MAXTITLELENGTH - i_frame_text_length - 5 );
-                 strcat( lpBuffer, "]" );
+		if( i_frame_text_length + i_child_text_length + 6 < MDI_MAXTITLELENGTH )
+		{
+		    strcat( lpBuffer, childWnd->text );
+		    strcat( lpBuffer, "]" );
 		}
-	   }
-       }
-     else
-       {
-         strncpy(lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH );
-	 lpBuffer[MDI_MAXTITLELENGTH]='\0';
-       }
-   }
- else
-   lpBuffer[0] = '\0';
+		else
+		{
+		    lstrcpyn32A( lpBuffer + i_frame_text_length + 4, 
+				 childWnd->text, MDI_MAXTITLELENGTH - i_frame_text_length - 5 );
+		    strcat( lpBuffer, "]" );
+		}
+	    }
+	}
+	else
+	{
+            strncpy(lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH );
+	    lpBuffer[MDI_MAXTITLELENGTH]='\0';
+	}
+    }
+    else
+	lpBuffer[0] = '\0';
 
- DEFWND_SetText( frameWnd, lpBuffer );
- if( repaint == MDI_REPAINTFRAME)
-     SetWindowPos32(frameWnd->hwndSelf, 0,0,0,0,0, SWP_FRAMECHANGED |
-                    SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER );
+    DEFWND_SetText( frameWnd, lpBuffer );
+    if( repaint == MDI_REPAINTFRAME)
+	SetWindowPos32( frameWnd->hwndSelf, 0,0,0,0,0, SWP_FRAMECHANGED |
+			SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER );
 }
 
 
@@ -901,7 +890,7 @@
 /**********************************************************************
  *					MDIClientWndProc
  *
- * This function is the handler for all MDI requests.
+ * This function handles all MDI requests.
  */
 LRESULT WINAPI MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam,
                                 LPARAM lParam)
@@ -960,13 +949,15 @@
 	NC_HandleNCCalcSize( w, &rect );
 	w->rectClient = rect;
 
-	dprintf_mdi(stddeb,"MDI: Client created - hwnd = %04x, idFirst = %u\n",hwnd,ci->idFirstChild);
+	dprintf_mdi(stddeb,"MDI: Client created - hwnd = %04x, idFirst = %u\n",
+			   hwnd, ci->idFirstChild );
 
 	return 0;
       
       case WM_DESTROY:
 	if( ci->hwndChildMaximized ) MDI_RestoreFrameMenu(w, frameWnd->hwndSelf);
-	if((nItems = GetMenuItemCount32(ci->hWindowMenu)) > 0) {
+	if((nItems = GetMenuItemCount32(ci->hWindowMenu)) > 0) 
+	{
     	    ci->idFirstChild = nItems - 1;
 	    ci->nActiveChildren++; 		/* to delete a separator */
 	    while( ci->nActiveChildren-- )
@@ -1001,15 +992,15 @@
 	ci->mdiFlags |= MDIF_NEEDUPDATE;
 	MDIIconArrange(hwnd);
 	ci->sbRecalc = SB_BOTH+1;
-	SendMessage16(hwnd,WM_MDICALCCHILDSCROLL,0,0L);
+	SendMessage16(hwnd, WM_MDICALCCHILDSCROLL, 0, 0L);
 	return 0;
 	
       case WM_MDIMAXIMIZE:
 	ShowWindow16((HWND16)wParam, SW_MAXIMIZE);
 	return 0;
 
-      case WM_MDINEXT:
-	MDI_SwitchActiveChild(hwnd, (HWND16)wParam, (lParam)?1:0);
+      case WM_MDINEXT: /* lParam != 0 means previous window */
+	MDI_SwitchActiveChild(hwnd, (HWND16)wParam, (lParam)? FALSE : TRUE );
 	break;
 	
       case WM_MDIRESTORE:
@@ -1026,24 +1017,24 @@
       case WM_MDITILE:
 	ci->mdiFlags |= MDIF_NEEDUPDATE;
 	ShowScrollBar32(hwnd,SB_BOTH,FALSE);
-	MDITile(w, ci,wParam);
+	MDITile(w, ci, wParam);
         ci->mdiFlags &= ~MDIF_NEEDUPDATE;
         return 0;
 
       case WM_VSCROLL:
       case WM_HSCROLL:
 	ci->mdiFlags |= MDIF_NEEDUPDATE;
-        ScrollChildren32(hwnd,message,wParam,lParam);
+        ScrollChildren32(hwnd, message, wParam, lParam);
 	ci->mdiFlags &= ~MDIF_NEEDUPDATE;
         return 0;
 
       case WM_SETFOCUS:
 	if( ci->hwndActiveChild )
-	  {
+	{
 	   w = WIN_FindWndPtr( ci->hwndActiveChild );
 	   if( !(w->dwStyle & WS_MINIMIZE) )
 	       SetFocus32( ci->hwndActiveChild );
-	  } 
+	} 
 	return 0;
 	
       case WM_NCACTIVATE:
@@ -1076,7 +1067,7 @@
 			 rect.right - rect.left, rect.bottom - rect.top, 1);
 	}
 	else
-	  MDI_PostUpdate(hwnd, ci, SB_BOTH+1);
+	    MDI_PostUpdate(hwnd, ci, SB_BOTH+1);
 
 	break;
 
@@ -1251,7 +1242,8 @@
 	    SendMessage32W(hwndMDIClient, message, wParam, lParam);
 	    break;
 
-	  case WM_SETTEXT: {
+	  case WM_SETTEXT: 
+	  {
 	      LPSTR txt = HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR)lParam);
 	      LRESULT ret = DefFrameProc32A( hwnd, hwndMDIClient, message,
                                      wParam, (DWORD)txt );
@@ -1311,7 +1303,7 @@
 
       case WM_SYSCOMMAND:
 	switch( wParam )
-	  {
+	{
 		case SC_MOVE:
 		     if( ci->hwndChildMaximized == hwnd) return 0;
 		     break;
@@ -1331,7 +1323,7 @@
 		case SC_PREVWINDOW:
 		     SendMessage16( ci->self, WM_MDINEXT, 0, 1);
 		     return 0;
-	  }
+	}
 	break;
 	
       case WM_GETMINMAXINFO:
@@ -1348,29 +1340,29 @@
 	/* do not change */
 
 	if( ci->hwndActiveChild == hwnd && wParam != SIZE_MAXIMIZED )
-	  {
+	{
   	    ci->hwndChildMaximized = 0;
 	    
 	    MDI_RestoreFrameMenu( clientWnd->parent, hwnd);
             MDI_UpdateFrameText( clientWnd->parent, ci->self,
                                  MDI_REPAINTFRAME, NULL );
-	  }
+	}
 
 	if( wParam == SIZE_MAXIMIZED )
-	  {
+	{
 	    HWND16 hMaxChild = ci->hwndChildMaximized;
 
 	    if( hMaxChild == hwnd ) break;
 
 	    if( hMaxChild)
-	      {	    
-	       SendMessage16( hMaxChild, WM_SETREDRAW, FALSE, 0L );
+	    {	    
+	        SendMessage16( hMaxChild, WM_SETREDRAW, FALSE, 0L );
 
-	       MDI_RestoreFrameMenu( clientWnd->parent, hMaxChild);
-	       ShowWindow16( hMaxChild, SW_SHOWNOACTIVATE);
+	        MDI_RestoreFrameMenu( clientWnd->parent, hMaxChild);
+	        ShowWindow16( hMaxChild, SW_SHOWNOACTIVATE);
 
-	       SendMessage16( hMaxChild, WM_SETREDRAW, TRUE, 0L );
-	      }
+	        SendMessage16( hMaxChild, WM_SETREDRAW, TRUE, 0L );
+	    }
 
 	    dprintf_mdi(stddeb,"\tMDI: maximizing child %04x\n", hwnd );
 
@@ -1379,16 +1371,16 @@
 	    MDI_AugmentFrameMenu( ci, clientWnd->parent, hwnd);
 	    MDI_UpdateFrameText( clientWnd->parent, ci->self,
 				 MDI_REPAINTFRAME, NULL ); 
-	  }
+	}
 
 	if( wParam == SIZE_MINIMIZED )
-	  {
-	    HWND16 switchTo = MDI_GetWindow(clientWnd, hwnd, 0);
+	{
+	    HWND16 switchTo = MDI_GetWindow(clientWnd, hwnd, TRUE, WS_MINIMIZE);
 
 	    if( switchTo )
 	        SendMessage16( switchTo, WM_CHILDACTIVATE, 0, 0L);
-	  }
-	  
+	}
+	 
 	MDI_PostUpdate(clientWnd->hwndSelf, ci, SB_BOTH+1);
 	break;
 
diff --git a/windows/message.c b/windows/message.c
index 6d4aa84..9470710 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -55,6 +55,32 @@
 }
 
 /***********************************************************************
+ *           MSG_SendParentNotify
+ *
+ * Send a WM_PARENTNOTIFY to all ancestors of the given window, unless
+ * the window has the WS_EX_NOPARENTNOTIFY style.
+ */
+static void MSG_SendParentNotify(WND* wndPtr, WORD event, WORD idChild, LPARAM lValue)
+{
+#define lppt ((LPPOINT16)&lValue)
+
+    /* pt has to be in the client coordinates of the parent window */
+
+    MapWindowPoints16( 0, wndPtr->hwndSelf, lppt, 1 );
+    while (wndPtr)
+    {
+	if (!(wndPtr->dwStyle & WS_CHILD) || (wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY)) break;
+	lppt->x += wndPtr->rectClient.left;
+	lppt->y += wndPtr->rectClient.top;
+	wndPtr = wndPtr->parent;
+	SendMessage32A( wndPtr->hwndSelf, WM_PARENTNOTIFY,
+			MAKEWPARAM( event, idChild ), lValue );
+    }
+#undef lppt
+}
+
+
+/***********************************************************************
  *           MSG_TranslateMouseMsg
  *
  * Translate an mouse hardware event into a real mouse message.
@@ -192,8 +218,7 @@
 	     * notification message is still WM_L/M/RBUTTONDOWN.
 	     */
 
-            WIN_SendParentNotify( hWnd, msg->message, 0,
-                              MAKELPARAM( screen_pt.x, screen_pt.y ) );
+            MSG_SendParentNotify( pWnd, msg->message, 0, MAKELPARAM(screen_pt.x, screen_pt.y) );
 
             /* Activate the window if needed */
 
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 03f6091..fa30a1e 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -709,23 +709,23 @@
 
 	lpt[4].x = lpt[0].x = rect->left;
 	lpt[5].x = lpt[1].x = rect->left + width;
-	lpt[6].x = lpt[2].x = rect->right - width - 1;
-	lpt[7].x = lpt[3].x = rect->right - 1;
+	lpt[6].x = lpt[2].x = rect->right - 1;
+	lpt[7].x = lpt[3].x = rect->right - width - 1;
 
 	lpt[0].y = lpt[1].y = lpt[2].y = lpt[3].y = 
 		  rect->top + SYSMETRICS_CYFRAME + SYSMETRICS_CYSIZE;
 	lpt[4].y = lpt[5].y = lpt[6].y = lpt[7].y =
-		  rect->bottom - 1 - SYSMETRICS_CYFRAME - SYSMETRICS_CYSIZE;
+		  rect->bottom - SYSMETRICS_CYFRAME - SYSMETRICS_CYSIZE;
 
         lpt[8].x = lpt[9].x = lpt[10].x = lpt[11].x =
 		  rect->left + SYSMETRICS_CXFRAME + SYSMETRICS_CXSIZE;
 	lpt[12].x = lpt[13].x = lpt[14].x = lpt[15].x = 
-		  rect->right - 1 - SYSMETRICS_CXFRAME - SYSMETRICS_CYSIZE;
+		  rect->right - SYSMETRICS_CXFRAME - SYSMETRICS_CYSIZE;
 
 	lpt[12].y = lpt[8].y = rect->top; 
 	lpt[13].y = lpt[9].y = rect->top + height;
-	lpt[14].y = lpt[10].y = rect->bottom - height - 1; 
-	lpt[15].y = lpt[11].y = rect->bottom - 1;
+	lpt[14].y = lpt[10].y = rect->bottom - 1;
+	lpt[15].y = lpt[11].y = rect->bottom - height - 1;
 
 	GRAPH_DrawLines( hdc, lpt, 8, (HPEN32)0 );	/* 8 is the maximum */
 	InflateRect32( rect, -width - 1, -height - 1 );
@@ -868,7 +868,7 @@
     }
 
     MoveTo( hdc, r.left, r.bottom );
-    LineTo32( hdc, r.right-1, r.bottom );
+    LineTo32( hdc, r.right, r.bottom );
 
     if (style & WS_SYSMENU)
     {
diff --git a/windows/queue.c b/windows/queue.c
index a0f50c4..f9534cd 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -85,7 +85,7 @@
         }
         fprintf( stderr, "%04x %5d %4d %04x %s\n",
                  hQueue, queue->msgSize, queue->msgCount, queue->hTask,
-                 MODULE_GetModuleName( GetExePtr(queue->hTask) ) );
+                 MODULE_GetModuleName( queue->hTask ) );
         hQueue = queue->next;
     }
     fprintf( stderr, "\n" );
@@ -761,7 +761,7 @@
        HOOK_ResetQueueHooks( hNewQueue );
        if( WIN_GetDesktop()->hmemTaskQ == hQueue )
 	   WIN_GetDesktop()->hmemTaskQ = hNewQueue;
-       WIN_ResetQueueWindows( WIN_GetDesktop()->child, hQueue, hNewQueue );
+       WIN_ResetQueueWindows( WIN_GetDesktop(), hQueue, hNewQueue );
        QUEUE_DeleteMsgQueue( hQueue );
     }
 
diff --git a/windows/syscolor.c b/windows/syscolor.c
index 9f86835..e722daa 100644
--- a/windows/syscolor.c
+++ b/windows/syscolor.c
@@ -39,7 +39,11 @@
     "GrayText", "192 192 192",       /* COLOR_GRAYTEXT            */
     "ButtonText", "0 0 0",           /* COLOR_BTNTEXT             */
     "InactiveTitleText", "0 0 0",    /* COLOR_INACTIVECAPTIONTEXT */
-    "ButtonHilight", "255 255 255"   /* COLOR_BTNHIGHLIGHT        */
+    "ButtonHilight", "255 255 255",  /* COLOR_BTNHIGHLIGHT        */
+    "3DDarkShadow", "32 32 32",      /* COLOR_3DDKSHADOW          */
+    "3DLight", "192 192 192",        /* COLOR_3DLIGHT             */
+    "InfoText", "0 0 0",             /* COLOR_INFOTEXT            */
+    "InfoBackground", "255 255 192"  /* COLOR_INFOBK              */
 };
 
 static const char * const DefSysColors95[] =
@@ -64,11 +68,15 @@
     "GrayText", "192 192 192",       /* COLOR_GRAYTEXT            */
     "ButtonText", "0 0 0",           /* COLOR_BTNTEXT             */
     "InactiveTitleText", "0 0 0",    /* COLOR_INACTIVECAPTIONTEXT */
-    "ButtonHilight", "255 255 255"   /* COLOR_BTNHIGHLIGHT        */
+    "ButtonHilight", "255 255 255",  /* COLOR_BTNHIGHLIGHT        */
+    "3DDarkShadow", "32 32 32",      /* COLOR_3DDKSHADOW          */
+    "3DLight", "192 192 192",        /* COLOR_3DLIGHT             */
+    "InfoText", "0 0 0",             /* COLOR_INFOTEXT            */
+    "InfoBackground", "255 255 192"  /* COLOR_INFOBK              */
 };
 
 
-#define NUM_SYS_COLORS     (COLOR_BTNHIGHLIGHT+1)
+#define NUM_SYS_COLORS     (COLOR_INFOBK+1)
 
 static COLORREF SysColors[NUM_SYS_COLORS];
 
@@ -80,6 +88,7 @@
  */
 static void SYSCOLOR_SetColor( int index, COLORREF color )
 {
+    if (index < 0 || index >= NUM_SYS_COLORS) return;
     SysColors[index] = color;
     switch(index)
     {
@@ -149,6 +158,11 @@
 	DeleteObject32( sysColorObjects.hbrushBtnHighlight );
 	sysColorObjects.hbrushBtnHighlight = CreateSolidBrush32( color );
 	break;
+    case COLOR_3DDKSHADOW:
+    case COLOR_3DLIGHT:
+    case COLOR_INFOTEXT:
+    case COLOR_INFOBK:
+	break;
     }
 }
 
@@ -166,7 +180,7 @@
 	 i < NUM_SYS_COLORS; i++, p += 2)
     {
 	GetProfileString32A( "colors", p[0], p[1], buffer, 100 );
-	if (!sscanf( buffer, " %d %d %d", &r, &g, &b )) r = g = b = 0;
+	if (sscanf( buffer, " %d %d %d", &r, &g, &b ) != 3) r = g = b = 0;
 	SYSCOLOR_SetColor( i, RGB(r,g,b) );
     }
 }
@@ -177,7 +191,7 @@
  */
 COLORREF WINAPI GetSysColor16( INT16 nIndex )
 {
-    return SysColors[nIndex];
+    return GetSysColor32 (nIndex);
 }
 
 
@@ -186,15 +200,19 @@
  */
 COLORREF WINAPI GetSysColor32( INT32 nIndex )
 {
-    return SysColors[nIndex];
+    if (nIndex >= 0 && nIndex < NUM_SYS_COLORS)
+	return SysColors[nIndex];
+    else
+	return 0;
 }
 
 
 /*************************************************************************
  *             SetSysColors16   (USER.181)
  */
+/* FIXME -- check return type and insert comment if correct.  */
 VOID WINAPI SetSysColors16( INT16 nChanges, const INT16 *lpSysColor,
-                            const COLORREF *lpColorValues )
+			    const COLORREF *lpColorValues )
 {
     int i;
 
diff --git a/windows/user.c b/windows/user.c
index 8c7c9a5..90e7567 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -8,6 +8,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include "windows.h"
+#include "resource.h"
 #include "heap.h"
 #include "gdi.h"
 #include "user.h"
@@ -22,6 +23,8 @@
 
 WORD USER_HeapSel = 0;
 
+extern HGLOBAL16 LoadDIBCursorHandler( HGLOBAL16, HINSTANCE16, HRSRC16 );
+extern HGLOBAL16 LoadDIBIconHandler( HGLOBAL16, HINSTANCE16, HRSRC16 );
 extern BOOL32 MENU_PatchResidentPopup( HQUEUE16, WND* );
 extern void QUEUE_FlushMessages(HQUEUE16);
 
@@ -93,6 +96,35 @@
     return TRUE;
 }
 
+static RESOURCEHANDLER16 __r16loader = NULL;
+
+/**********************************************************************
+ *           USER_CallDefaultRsrcHandler
+ *
+ * Called by the LoadDIBIcon/CursorHandler().
+ */
+HGLOBAL16 USER_CallDefaultRsrcHandler( HGLOBAL16 hMemObj, HMODULE16 hModule, HRSRC16 hRsrc )
+{
+    return __r16loader( hMemObj, hModule, hRsrc );
+}
+
+/**********************************************************************
+ *           USER_InstallRsrcHandler
+ */
+static void USER_InstallRsrcHandler( HINSTANCE16 hInstance )
+{
+    FARPROC16 proc;
+
+    /* SetResourceHandler() returns previous function which is set
+     * when a module's resource table is loaded. */
+
+    proc = SetResourceHandler( hInstance, RT_ICON, (FARPROC32)LoadDIBIconHandler );
+    if(!__r16loader ) 
+	__r16loader = (RESOURCEHANDLER16)proc;
+    proc = SetResourceHandler( hInstance, RT_CURSOR, (FARPROC32)LoadDIBCursorHandler );
+    if(!__r16loader )
+	__r16loader = (RESOURCEHANDLER16)proc;
+}
 
 /**********************************************************************
  *           InitApp   (USER.5)
@@ -101,6 +133,15 @@
 {
     int queueSize;
 
+      /* InitTask() calls LibMain()'s of implicitly loaded DLLs 
+       * prior to InitApp() so there is no clean way to do
+       * SetTaskSignalHandler() in time. So, broken Windows bypasses 
+       * a pTask->userhandler on startup and simply calls a global 
+       * function pointer to the default USER signal handler.
+       */
+
+    USER_InstallRsrcHandler( hInstance );
+
       /* Create task message queue */
     queueSize = GetProfileInt32A( "windows", "DefaultQueueSize", 8 );
     if (!SetMessageQueue32( queueSize )) return 0;
@@ -109,9 +150,18 @@
 }
 
 /**********************************************************************
+ *           USER_ModuleUnload
+ */
+static void USER_ModuleUnload( HMODULE16 hModule )
+{
+    HOOK_FreeModuleHooks( hModule );
+    CLASS_FreeModuleClasses( hModule );
+}
+
+/**********************************************************************
  *           USER_AppExit
  */
-void USER_AppExit( HTASK16 hTask, HINSTANCE16 hInstance, HQUEUE16 hQueue )
+static void USER_AppExit( HTASK16 hTask, HINSTANCE16 hInstance, HQUEUE16 hQueue )
 {
     /* FIXME: empty clipboard if needed, maybe destroy menus (Windows
      *	      only complains about them but does nothing);
@@ -132,12 +182,18 @@
     HOOK_FreeQueueHooks( hQueue );
 
     QUEUE_SetExitingQueue( hQueue );
-    WIN_ResetQueueWindows( desktop->child, hQueue, (HQUEUE16)0);
+    WIN_ResetQueueWindows( desktop, hQueue, (HQUEUE16)0);
     QUEUE_SetExitingQueue( 0 );
 
     /* Free the message queue */
 
     QUEUE_DeleteMsgQueue( hQueue );
+
+    /* ModuleUnload() in "Internals" */
+
+    hInstance = GetExePtr( hInstance );
+    if( GetModuleUsage( hInstance ) <= 1 ) 
+	USER_ModuleUnload( hInstance );
 }
 
 
@@ -160,6 +216,34 @@
 
 
 /***********************************************************************
+ *           USER_SignalProc (USER.314)
+ */
+void WINAPI USER_SignalProc( HANDLE16 hTaskOrModule, UINT16 uCode,
+                             UINT16 uExitFn, HINSTANCE16 hInstance,
+                             HQUEUE16 hQueue )
+{
+    switch( uCode )
+    {
+	case USIG_GPF:
+	case USIG_TERMINATION:
+	     USER_AppExit( hTaskOrModule, hInstance, hQueue ); /* task */
+	     break;
+
+	case USIG_DLL_LOAD:
+	     USER_InstallRsrcHandler( hTaskOrModule ); /* module */
+	     break;
+
+	case USIG_DLL_UNLOAD:
+	     USER_ModuleUnload( hTaskOrModule ); /* module */
+	     break;
+
+	default:
+	     fprintf(stderr,"Unimplemented USER signal: %i\n", (int)uCode );
+    }
+}
+
+
+/***********************************************************************
  *           ExitWindows16   (USER.7)
  */
 BOOL16 WINAPI ExitWindows16( DWORD dwReturnCode, UINT16 wReserved )
diff --git a/windows/win.c b/windows/win.c
index 9f4375b..22d8eaf 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -270,41 +270,6 @@
 
 
 /***********************************************************************
- *           WIN_SendParentNotify
- *
- * Send a WM_PARENTNOTIFY to all ancestors of the given window, unless
- * the window has the WS_EX_NOPARENTNOTIFY style.
- */
-void WIN_SendParentNotify(HWND32 hwnd, WORD event, WORD idChild, LPARAM lValue)
-{
-    LPPOINT16 lppt = (LPPOINT16)&lValue;
-    WND     *wndPtr = WIN_FindWndPtr( hwnd );
-    BOOL32 bMouse = ((event <= WM_MOUSELAST) && (event >= WM_MOUSEFIRST));
-
-    /* if lValue contains cursor coordinates they have to be
-     * mapped to the client area of parent window */
-
-    if (bMouse) MapWindowPoints16( 0, hwnd, lppt, 1 );
-
-    while (wndPtr)
-    {
-        if ((wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) ||
-	   !(wndPtr->dwStyle & WS_CHILD)) break;
-
-        if (bMouse)
-        {
-	    lppt->x += wndPtr->rectClient.left;
-	    lppt->y += wndPtr->rectClient.top;
-        }
-
-        wndPtr = wndPtr->parent;
-	SendMessage32A( wndPtr->hwndSelf, WM_PARENTNOTIFY, 
-                        MAKEWPARAM( event, idChild ), lValue );
-    }
-}
-
-
-/***********************************************************************
  *           WIN_DestroyWindow
  *
  * Destroy storage associated to a window. "Internals" p.358
@@ -377,20 +342,50 @@
 
 /***********************************************************************
  *           WIN_ResetQueueWindows
+ *
+ * Reset the queue of all the children of a given window.
+ * Return TRUE if something was done.
  */
-void WIN_ResetQueueWindows( WND* wnd, HQUEUE16 hQueue, HQUEUE16 hNew )
+BOOL32 WIN_ResetQueueWindows( WND* wnd, HQUEUE16 hQueue, HQUEUE16 hNew )
 {
-    WND* next;
+    BOOL32 ret = FALSE;
 
-    while (wnd)
+    if (hNew)  /* Set a new queue */
     {
-        next = wnd->next;
-        if (wnd->hmemTaskQ == hQueue)
-	   if( hNew ) wnd->hmemTaskQ = hNew;
-	   else DestroyWindow32( wnd->hwndSelf );
-        else WIN_ResetQueueWindows( wnd->child, hQueue, hNew );
-        wnd = next;
+        for (wnd = wnd->child; (wnd); wnd = wnd->next)
+        {
+            if (wnd->hmemTaskQ == hQueue)
+            {
+                wnd->hmemTaskQ = hNew;
+                ret = TRUE;
+            }
+            if (wnd->child)
+                ret |= WIN_ResetQueueWindows( wnd->child, hQueue, hNew );
+        }
     }
+    else  /* Queue is being destroyed */
+    {
+        while (wnd->child)
+        {
+            WND *tmp = wnd->child;
+            ret = FALSE;
+            while (tmp)
+            {
+                if (tmp->hmemTaskQ == hQueue)
+                {
+                    DestroyWindow32( tmp->hwndSelf );
+                    ret = TRUE;
+                    break;
+                }
+                if (tmp->child && WIN_ResetQueueWindows(tmp->child,hQueue,0))
+                    ret = TRUE;
+                else
+                    tmp = tmp->next;
+            }
+            if (!ret) break;
+        }
+    }
+    return ret;
 }
 
 /***********************************************************************
@@ -465,7 +460,7 @@
     WND *wndPtr;
     HWND16 hwnd, hwndLinkAfter;
     POINT32 maxSize, maxPos, minTrack, maxTrack;
-    LRESULT (*localSend32)(HWND32, UINT32, WPARAM32, LPARAM);
+    LRESULT (WINAPI *localSend32)(HWND32, UINT32, WPARAM32, LPARAM);
 
     dprintf_win( stddeb, "CreateWindowEx: " );
     if (HIWORD(cs->lpszName)) dprintf_win( stddeb, "'%s' ", cs->lpszName );
@@ -495,9 +490,7 @@
     }
 
     /* Find the window class */
-
-    if (!(classPtr = CLASS_FindClassByAtom( classAtom,
-                                            GetExePtr(cs->hInstance) )))
+    if (!(classPtr = CLASS_FindClassByAtom( classAtom, win32?cs->hInstance:GetExePtr(cs->hInstance) )))
     {
         char buffer[256];
         GlobalGetAtomName32A( classAtom, buffer, sizeof(buffer) );
@@ -703,8 +696,11 @@
                        LoadMenu(cs->hInstance,SEGPTR_GET(classPtr->menuNameA)):
                        LoadMenu(cs->hInstance,(SEGPTR)classPtr->menuNameA);
 #else
-            SEGPTR menuName = (SEGPTR)GetClassLong16( hwnd, GCL_MENUNAME );
-            if (menuName) cs->hMenu = LoadMenu16( cs->hInstance, menuName );
+	    SEGPTR menuName = (SEGPTR)GetClassLong16( hwnd, GCL_MENUNAME );
+	    if (HIWORD(cs->hInstance))
+	    	cs->hMenu = LoadMenu32A(cs->hInstance,PTR_SEG_TO_LIN(menuName));
+	    else
+	    	cs->hMenu = LoadMenu16(cs->hInstance,menuName);
 #endif
         }
         if (cs->hMenu) SetMenu32( hwnd, cs->hMenu );
@@ -732,6 +728,7 @@
             if (!(wndPtr->flags & WIN_NEED_SIZE))
             {
                 /* send it anyway */
+
                 SendMessage32A( hwnd, WM_SIZE, SIZE_RESTORED,
                                 MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
                                          wndPtr->rectClient.bottom-wndPtr->rectClient.top));
@@ -740,27 +737,27 @@
                                           wndPtr->rectClient.top ) );
             }
 
-            WIN_SendParentNotify( hwnd, WM_CREATE, wndPtr->wIDmenu, (LPARAM)hwnd );
-            if (!IsWindow32(hwnd)) return 0;
-
             /* Show the window, maximizing or minimizing if needed */
 
-            if (wndPtr->dwStyle & WS_MINIMIZE)
+            if (wndPtr->dwStyle & (WS_MINIMIZE | WS_MAXIMIZE))
             {
 		RECT16 newPos;
+		UINT16 swFlag = (wndPtr->dwStyle & WS_MINIMIZE) ? SW_MINIMIZE : SW_MAXIMIZE;
                 wndPtr->dwStyle &= ~(WS_MAXIMIZE | WS_MINIMIZE);
-		WINPOS_MinMaximize( wndPtr, SW_MINIMIZE, &newPos );
-                SetWindowPos32( hwnd, 0, newPos.left, newPos.top, newPos.right, newPos.bottom,
-                                SWP_FRAMECHANGED | ((GetActiveWindow32())? SWP_NOACTIVATE : 0));
+		WINPOS_MinMaximize( wndPtr, swFlag, &newPos );
+		swFlag = ((wndPtr->dwStyle & WS_CHILD) || GetActiveWindow32()) ? SWP_NOACTIVATE : 0;
+                SetWindowPos32( hwnd, 0, newPos.left, newPos.top, 
+					 newPos.right, newPos.bottom, SWP_FRAMECHANGED | swFlag );
             }
-            else if (wndPtr->dwStyle & WS_MAXIMIZE)
-            {
-		RECT16 newPos;
-		wndPtr->dwStyle &= ~(WS_MAXIMIZE | WS_MINIMIZE);
-		WINPOS_MinMaximize( wndPtr, SW_MAXIMIZE, &newPos );
-                SetWindowPos32( hwnd, 0, newPos.left, newPos.top, newPos.right, newPos.bottom,
-                    ((GetActiveWindow32())? SWP_NOACTIVATE : 0) | SWP_FRAMECHANGED );
-            }
+
+	    if( wndPtr->dwStyle & WS_CHILD && !(wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) )
+	    {
+		/* Notify the parent window only */
+
+		SendMessage32A( wndPtr->parent->hwndSelf, WM_PARENTNOTIFY,
+				MAKEWPARAM(WM_CREATE, wndPtr->wIDmenu), (LPARAM)hwnd );
+		if( !IsWindow32(hwnd) ) return 0;
+	    }
 
             if (cs->style & WS_VISIBLE) ShowWindow32( hwnd, SW_SHOW );
 
@@ -1000,8 +997,13 @@
     }
 
     if( !QUEUE_IsExitingQueue(wndPtr->hmemTaskQ) )
-	 WIN_SendParentNotify( hwnd, WM_DESTROY, wndPtr->wIDmenu, (LPARAM)hwnd );
-    if (!IsWindow32(hwnd)) return TRUE;
+	if( wndPtr->dwStyle & WS_CHILD && !(wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) )
+	{
+	    /* Notify the parent window only */
+	    SendMessage32A( wndPtr->parent->hwndSelf, WM_PARENTNOTIFY,
+			    MAKEWPARAM(WM_DESTROY, wndPtr->wIDmenu), (LPARAM)hwnd );
+	    if( !IsWindow32(hwnd) ) return TRUE;
+	}
 
     if( wndPtr->window ) CLIPBOARD_DisOwn( wndPtr ); /* before window is unmapped */
 
@@ -1020,7 +1022,7 @@
     if( !(wndPtr->dwStyle & WS_CHILD) )
     {
       /* make sure top menu popup doesn't get destroyed */
-      MENU_PatchResidentPopup( TRUE, wndPtr );
+      MENU_PatchResidentPopup( (HQUEUE16)0xFFFF, wndPtr );
 
       for (;;)
       {
@@ -1214,7 +1216,7 @@
         /* with this name exists either. */
         if (!(atom = GlobalFindAtom32A( className ))) return 0;
     }
-    return WIN_FindWindow( 0, 0, atom, title );
+    return WIN_FindWindow( parent, child, atom, title );
 }
 
 
@@ -1235,7 +1237,7 @@
         if (!(atom = GlobalFindAtom32W( className ))) return 0;
     }
     buffer = HEAP_strdupWtoA( GetProcessHeap(), 0, title );
-    hwnd = WIN_FindWindow( 0, 0, atom, buffer );
+    hwnd = WIN_FindWindow( parent, child, atom, buffer );
     HeapFree( GetProcessHeap(), 0, buffer );
     return hwnd;
 }
@@ -1388,9 +1390,15 @@
     }
     switch(offset)
     {
-    case GWW_ID:         return (WORD)wndPtr->wIDmenu;
+    case GWW_ID:         
+    	if (HIWORD(wndPtr->wIDmenu))
+    		fprintf(stderr,"GetWindowWord32(GWW_ID) discards high bits of 0x%08x!\n",wndPtr->wIDmenu);
+    	return (WORD)wndPtr->wIDmenu;
     case GWW_HWNDPARENT: return wndPtr->parent ? wndPtr->parent->hwndSelf : 0;
-    case GWW_HINSTANCE:  return (WORD)wndPtr->hInstance;
+    case GWW_HINSTANCE:  
+    	if (HIWORD(wndPtr->hInstance))
+    		fprintf(stderr,"GetWindowWord32(GWW_HINSTANCE) discards high bits of 0x%08x!\n",wndPtr->hInstance);
+   	return (WORD)wndPtr->hInstance;
     default:
         fprintf( stderr, "GetWindowWord: invalid offset %d\n", offset );
         return 0;
@@ -1401,10 +1409,10 @@
 /**********************************************************************
  *	     WIN_GetWindowInstance
  */
-HINSTANCE16 WIN_GetWindowInstance( HWND32 hwnd )
+HINSTANCE32 WIN_GetWindowInstance( HWND32 hwnd )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return (HINSTANCE16)0;
+    if (!wndPtr) return (HINSTANCE32)0;
     return wndPtr->hInstance;
 }
 
@@ -1483,7 +1491,7 @@
                                                            type );
         case GWL_HWNDPARENT: return wndPtr->parent ?
                                         (HWND32)wndPtr->parent->hwndSelf : 0;
-        case GWL_HINSTANCE:  return (HINSTANCE32)wndPtr->hInstance;
+        case GWL_HINSTANCE:  return wndPtr->hInstance;
         default:
             fprintf( stderr, "GetWindowLong: unknown offset %d\n", offset );
     }
@@ -1501,6 +1509,7 @@
 {
     LONG *ptr, retval;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
+
     if (!wndPtr) return 0;
     if (offset >= 0)
     {
@@ -1522,8 +1531,10 @@
     else switch(offset)
     {
         case GWL_ID:
+	    ptr = (DWORD*)&wndPtr->wIDmenu;
+	    break;
         case GWL_HINSTANCE:
-            return SetWindowWord32( hwnd, offset, (WORD)newval );
+            return SetWindowWord32( hwnd, offset, newval );
 	case GWL_WNDPROC:
             retval = (LONG)WINPROC_GetProc( wndPtr->winproc, type );
             WINPROC_SetProc( &wndPtr->winproc, (WNDPROC16)newval, 
diff --git a/windows/winhelp.c b/windows/winhelp.c
index 856d2d5..89be98b 100644
--- a/windows/winhelp.c
+++ b/windows/winhelp.c
@@ -52,11 +52,12 @@
 	switch(wCommand)
 	{
 		case HELP_CONTEXT:
-		case HELP_CONTENTS:
 		case HELP_SETCONTENTS:
+		case HELP_CONTENTS:
 		case HELP_CONTEXTPOPUP:
 		case HELP_FORCEFILE:
 		case HELP_HELPONHELP:
+		case HELP_FINDER:
 		case HELP_QUIT:
 			dsize=0;
 			break;
diff --git a/windows/winpos.c b/windows/winpos.c
index e418e7e..b7cadcb 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -274,10 +274,9 @@
 /*******************************************************************
  *         ClientToScreen16   (USER.28)
  */
-BOOL16 WINAPI ClientToScreen16( HWND16 hwnd, LPPOINT16 lppnt )
+void WINAPI ClientToScreen16( HWND16 hwnd, LPPOINT16 lppnt )
 {
     MapWindowPoints16( hwnd, 0, lppnt, 1 );
-    return TRUE;
 }
 
 
@@ -1566,14 +1565,19 @@
  */
 LONG WINPOS_HandleWindowPosChanging16( WND *wndPtr, WINDOWPOS16 *winpos )
 {
-    POINT32 maxSize;
+    POINT32 maxSize, minTrack;
     if (winpos->flags & SWP_NOSIZE) return 0;
     if ((wndPtr->dwStyle & WS_THICKFRAME) ||
 	((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) == 0))
     {
-	WINPOS_GetMinMaxInfo( wndPtr, &maxSize, NULL, NULL, NULL );
-	winpos->cx = MIN( winpos->cx, maxSize.x );
-	winpos->cy = MIN( winpos->cy, maxSize.y );
+	WINPOS_GetMinMaxInfo( wndPtr, &maxSize, NULL, &minTrack, NULL );
+	if (maxSize.x < winpos->cx) winpos->cx = maxSize.x;
+	if (maxSize.y < winpos->cy) winpos->cy = maxSize.y;
+	if (!(wndPtr->dwStyle & WS_MINIMIZE))
+	{
+	    if (winpos->cx < minTrack.x ) winpos->cx = minTrack.x;
+	    if (winpos->cy < minTrack.y ) winpos->cy = minTrack.y;
+	}
     }
     return 0;
 }
@@ -2380,14 +2384,19 @@
     int i;
     HDWP32 newhdwp = hdwp;
     HWND32 parent;
+    WND *pWnd;
 
     pDWP = (DWP *) USER_HEAP_LIN_ADDR( hdwp );
     if (!pDWP) return 0;
     if (hwnd == GetDesktopWindow32()) return 0;
 
-      /* All the windows of a DeferWindowPos() must have the same parent */
-
-    parent = WIN_FindWndPtr( hwnd )->parent->hwndSelf;
+    /* All the windows of a DeferWindowPos() must have the same parent */
+    if (!(pWnd=WIN_FindWndPtr( hwnd ))) {
+        USER_HEAP_FREE( hdwp );
+        return 0;
+    }
+    	
+    parent = pWnd->parent->hwndSelf;
     if (pDWP->actualCount == 0) pDWP->hwndParent = parent;
     else if (parent != pDWP->hwndParent)
     {
diff --git a/windows/winproc.c b/windows/winproc.c
index b2a9207..267029e 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -42,11 +42,6 @@
     BYTE       pushl_func;           /* pushl $proc */
     WNDPROC16  proc WINE_PACKED;
     BYTE       pushl_eax;            /* pushl %eax */
-    BYTE       pushl_ebp;            /* pushl %ebp */
-    BYTE       pushl_name;           /* pushl $name */
-    LPCSTR     name WINE_PACKED;
-    BYTE       pushl_thunk;          /* pushl $thunkfrom32 */
-    void     (*thunk32)() WINE_PACKED;
     BYTE       jmp;                  /* jmp   relay (relative jump)*/
     void     (*relay)() WINE_PACKED; /* WINPROC_CallProc32ATo16() */
 } WINPROC_THUNK_FROM32;
@@ -87,15 +82,14 @@
 LRESULT WINPROC_CallProc16To32W( HWND16 hwnd, UINT16 msg,
                                  WPARAM16 wParam, LPARAM lParam,
                                  WNDPROC32 func );
-static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND32 hwnd,
-                                        UINT32 msg, WPARAM32 wParam,
-                                        LPARAM lParam );
-static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND32 hwnd,
-                                        UINT32 msg, WPARAM32 wParam,
-                                        LPARAM lParam );
+static LRESULT WINAPI WINPROC_CallProc32ATo16( WNDPROC16 func, HWND32 hwnd,
+                                               UINT32 msg, WPARAM32 wParam,
+                                               LPARAM lParam );
+static LRESULT WINAPI WINPROC_CallProc32WTo16( WNDPROC16 func, HWND32 hwnd,
+                                               UINT32 msg, WPARAM32 wParam,
+                                               LPARAM lParam );
 
 extern void CallFrom16_long_wwwll(void);
-extern void CallFrom32_stdcall_5(void);
 
 static HANDLE32 WinProcHeap;
 
@@ -105,7 +99,6 @@
                                       WPARAM32 wParam, LPARAM lParam );
 
 static WINPROC_CALLWNDPROC16 WINPROC_CallWndProc16Ptr = WINPROC_CallWndProc16;
-static WINPROC_CALLWNDPROC32 WINPROC_CallWndProc32Ptr = WINPROC_CallWndProc32;
 
 
 /**********************************************************************
@@ -143,8 +136,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 ); */
+    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 );
 }
 
@@ -159,15 +152,6 @@
 
 
 /**********************************************************************
- *	     WINPROC_SetCallWndProc32
- */
-void WINPROC_SetCallWndProc32( WINPROC_CALLWNDPROC32 proc )
-{
-    WINPROC_CallWndProc32Ptr = proc;
-}
-
-
-/**********************************************************************
  *	     WINPROC_GetPtr
  *
  * Return a pointer to the win proc.
@@ -238,14 +222,9 @@
             proc->thunk.t_from32.pushl_func  = 0x68;   /* pushl $proc */
             proc->thunk.t_from32.proc        = func;
             proc->thunk.t_from32.pushl_eax   = 0x50;   /* pushl %eax */
-            proc->thunk.t_from32.pushl_ebp   = 0x55;   /* pushl %ebp */
-            proc->thunk.t_from32.pushl_name  = 0x68;   /* pushl $name */
-            proc->thunk.t_from32.name        = "WINPROC_CallProc32ATo16";
-            proc->thunk.t_from32.pushl_thunk = 0x68;   /* pushl $thunkfrom32 */
-            proc->thunk.t_from32.thunk32     = (void(*)())WINPROC_CallProc32ATo16;
             proc->thunk.t_from32.jmp         = 0xe9;   /* jmp   relay*/
             proc->thunk.t_from32.relay =  /* relative jump */
-                (void (*)())((DWORD)CallFrom32_stdcall_5 -
+                (void(*)())((DWORD)WINPROC_CallProc32ATo16 -
                                      (DWORD)(&proc->thunk.t_from32.relay + 1));
             break;
         case WIN_PROC_32A:
@@ -1723,7 +1702,7 @@
     LRESULT result;
 
     if (WINPROC_MapMsg32ATo32W( msg, wParam, &lParam ) == -1) return 0;
-    result = WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
+    result = WINPROC_CallWndProc32( func, hwnd, msg, wParam, lParam );
     WINPROC_UnmapMsg32ATo32W( msg, wParam, lParam );
     return result;
 }
@@ -1741,7 +1720,7 @@
     LRESULT result;
 
     if (WINPROC_MapMsg32WTo32A( msg, wParam, &lParam ) == -1) return 0;
-    result = WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
+    result = WINPROC_CallWndProc32( func, hwnd, msg, wParam, lParam );
     WINPROC_UnmapMsg32WTo32A( msg, wParam, lParam );
     return result;
 }
@@ -1762,7 +1741,7 @@
 
     if (WINPROC_MapMsg16To32A( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
         return 0;
-    result = WINPROC_CallWndProc32Ptr( func, hwnd, msg32, wParam32, lParam );
+    result = WINPROC_CallWndProc32( func, hwnd, msg32, wParam32, lParam );
     WINPROC_UnmapMsg16To32A( msg32, wParam32, lParam );
     return result;
 }
@@ -1783,7 +1762,7 @@
 
     if (WINPROC_MapMsg16To32W( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
         return 0;
-    result = WINPROC_CallWndProc32Ptr( func, hwnd, msg32, wParam32, lParam );
+    result = WINPROC_CallWndProc32( func, hwnd, msg32, wParam32, lParam );
     WINPROC_UnmapMsg16To32W( msg32, wParam32, lParam );
     return result;
 }
@@ -1794,9 +1773,9 @@
  *
  * Call a 16-bit window procedure, translating the 32-bit args.
  */
-static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND32 hwnd,
-                                        UINT32 msg, WPARAM32 wParam,
-                                        LPARAM lParam )
+static LRESULT WINAPI WINPROC_CallProc32ATo16( WNDPROC16 func, HWND32 hwnd,
+                                               UINT32 msg, WPARAM32 wParam,
+                                               LPARAM lParam )
 {
     UINT16 msg16;
     MSGPARAM16 mp16;
@@ -1821,9 +1800,9 @@
  *
  * Call a 16-bit window procedure, translating the 32-bit args.
  */
-static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND32 hwnd,
-                                        UINT32 msg, WPARAM32 wParam,
-                                        LPARAM lParam )
+static LRESULT WINAPI WINPROC_CallProc32WTo16( WNDPROC16 func, HWND32 hwnd,
+                                               UINT32 msg, WPARAM32 wParam,
+                                               LPARAM lParam )
 {
     UINT16 msg16;
     MSGPARAM16 mp16;
@@ -1906,12 +1885,11 @@
 {
     WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
 
-    if (!proc) return WINPROC_CallWndProc32Ptr( func, hwnd, msg,
-                                                wParam, lParam );
+    if (!proc) return WINPROC_CallWndProc32( func, hwnd, msg, wParam, lParam );
 
 #if testing
     func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32A );
-    return WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
+    return WINPROC_CallWndProc32( func, hwnd, msg, wParam, lParam );
 #endif
 
     switch(proc->type)
@@ -1922,8 +1900,8 @@
                                         hwnd, msg, wParam, lParam );
     case WIN_PROC_32A:
         if (!proc->thunk.t_from16.proc) return 0;
-        return WINPROC_CallWndProc32Ptr( proc->thunk.t_from16.proc,
-                                         hwnd, msg, wParam, lParam );
+        return WINPROC_CallWndProc32( proc->thunk.t_from16.proc,
+                                      hwnd, msg, wParam, lParam );
     case WIN_PROC_32W:
         if (!proc->thunk.t_from16.proc) return 0;
         return WINPROC_CallProc32ATo32W( proc->thunk.t_from16.proc,
@@ -1943,12 +1921,11 @@
 {
     WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
 
-    if (!proc) return WINPROC_CallWndProc32Ptr( func, hwnd, msg,
-                                                wParam, lParam );
+    if (!proc) return WINPROC_CallWndProc32( func, hwnd, msg, wParam, lParam );
 
 #if testing
     func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32W );
-    return WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
+    return WINPROC_CallWndProc32( func, hwnd, msg, wParam, lParam );
 #endif
 
     switch(proc->type)
@@ -1963,8 +1940,8 @@
                                          hwnd, msg, wParam, lParam );
     case WIN_PROC_32W:
         if (!proc->thunk.t_from16.proc) return 0;
-        return WINPROC_CallWndProc32Ptr( proc->thunk.t_from16.proc,
-                                         hwnd, msg, wParam, lParam );
+        return WINPROC_CallWndProc32( proc->thunk.t_from16.proc,
+                                      hwnd, msg, wParam, lParam );
     default:
         fprintf( stderr, "CallWindowProc32W: invalid proc %p\n", proc );
         return 0;